初始化
This commit is contained in:
@@ -32,3 +32,6 @@ UPLOAD_DIR=./uploads
|
|||||||
|
|
||||||
# 缓存配置
|
# 缓存配置
|
||||||
CACHE_TTL_SECONDS=300
|
CACHE_TTL_SECONDS=300
|
||||||
|
|
||||||
|
# AI配置
|
||||||
|
DEEPSEEK_API_KEY=api_key
|
||||||
@@ -143,6 +143,17 @@ class Settings(BaseSettings):
|
|||||||
description="缓存过期时间(秒)"
|
description="缓存过期时间(秒)"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# ---------- AI配置 ----------
|
||||||
|
DEEPSEEK_API_KEY: str = Field(
|
||||||
|
default="sk-d3e11a4229744fd29a8468e7df072a4b",
|
||||||
|
description="deepseek模型api_key"
|
||||||
|
)
|
||||||
|
|
||||||
|
TAVILY_API_KEY: str = Field(
|
||||||
|
default="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",
|
||||||
|
description="tavily搜索接口api_key"
|
||||||
|
)
|
||||||
|
|
||||||
# ---------- 计算属性 ----------
|
# ---------- 计算属性 ----------
|
||||||
@property
|
@property
|
||||||
def mysql_url(self) -> str:
|
def mysql_url(self) -> str:
|
||||||
|
|||||||
0
lc/__init__.py
Normal file
0
lc/__init__.py
Normal file
71
lc/chef_agent.py
Normal file
71
lc/chef_agent.py
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
import os
|
||||||
|
import sqlite3
|
||||||
|
from typing import cast, Optional
|
||||||
|
|
||||||
|
from langchain.agents import create_agent, AgentState
|
||||||
|
from langchain.agents.middleware import SummarizationMiddleware
|
||||||
|
from langchain.agents.middleware.summarization import ContextMessages
|
||||||
|
from langchain.chat_models import init_chat_model
|
||||||
|
from langchain_core.language_models import BaseChatModel
|
||||||
|
from langchain_core.messages import HumanMessage
|
||||||
|
from langchain_core.runnables import RunnableConfig
|
||||||
|
from langgraph.checkpoint.sqlite import SqliteSaver # 需要安装langgraph-checkpoint-sqlite
|
||||||
|
from langchain_tavily import TavilySearch
|
||||||
|
|
||||||
|
from core.config.settings import settings
|
||||||
|
|
||||||
|
# 初始化模型 需要多模态大模型 deepseek已支持
|
||||||
|
llm_model = init_chat_model(
|
||||||
|
model="deepseek-v4-flash",
|
||||||
|
model_provider="deepseek",
|
||||||
|
api_key=settings.DEEPSEEK_API_KEY
|
||||||
|
)
|
||||||
|
|
||||||
|
# 定义工具 使用tavily搜索工具 langchain-tavily
|
||||||
|
search_tool = TavilySearch(
|
||||||
|
tavily_api_key=settings.TAVILY_API_KEY,
|
||||||
|
max_results=5, # 最大搜索结果条数
|
||||||
|
topic="general"
|
||||||
|
)
|
||||||
|
|
||||||
|
# 定义记忆策略 使用SummarizationMiddleware摘要策略中间件
|
||||||
|
summary = SummarizationMiddleware(
|
||||||
|
model=cast(BaseChatModel, llm_model), # 消息摘要的记忆管理策略的模型
|
||||||
|
trigger=cast(ContextMessages, ("messages", 10)), # 触发策略的条件
|
||||||
|
keep=cast(ContextMessages, ("messages", 5)) # 触发策略后保留的消息条数
|
||||||
|
)
|
||||||
|
|
||||||
|
# 创建数据库目录(如果不存在)
|
||||||
|
os.makedirs("sqlite", exist_ok=True)
|
||||||
|
# 创建 SQLite 数据库连接 check_same_thread=False 是为了确保在多线程环境下的安全性
|
||||||
|
conn = sqlite3.connect("sqlite/checkpoints.db", check_same_thread=False)
|
||||||
|
# 初始化 checkpointer
|
||||||
|
checkpointer = SqliteSaver(conn)
|
||||||
|
# 自动建表
|
||||||
|
checkpointer.setup()
|
||||||
|
|
||||||
|
# agent提示词
|
||||||
|
system_prompt = """
|
||||||
|
你是一名有名的国宴厨师。收到用户提供的食材照片或清单后,按照以下流程步骤操作:
|
||||||
|
1.识别和评估食材:若用户提供照片,首先辨别所有可见食材,基于食材的外观状态,评估其新鲜度和可用量,整理出一份“可用食材清单”。
|
||||||
|
2.智能食谱检索:优先调用search_tool工具,以“可用食材清单”为核心关键词,查找可行菜谱。
|
||||||
|
3.多维度评估与排序:从营养与烹饪难度这2个维度对检索到的候选食谱进行量化打分,并根据得分进行排序,制作简单且营养丰富的排名靠前。
|
||||||
|
4.结构化方案输出:把排序后的食谱整理成一份结构清晰的建议报告,要包括食谱信息、得分、推荐理由、食谱的参考图片,帮助用户快速做出决策。
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 定义thread_config 用于记忆存储分组
|
||||||
|
thread_config: RunnableConfig = {"configurable": {"thread_id": "2"}}
|
||||||
|
|
||||||
|
# 创建agent
|
||||||
|
agent = create_agent(
|
||||||
|
model=cast(BaseChatModel, llm_model), # 指定类型 避免idea报错
|
||||||
|
tools=[search_tool],
|
||||||
|
checkpointer=checkpointer,
|
||||||
|
middleware=[summary],
|
||||||
|
system_prompt=system_prompt
|
||||||
|
)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
question = input("> ")
|
||||||
|
res = agent.invoke({"messages": [HumanMessage(content=question)]}, thread_config)
|
||||||
|
print(res)
|
||||||
194
lc/deepseek.ipynb
Normal file
194
lc/deepseek.ipynb
Normal file
@@ -0,0 +1,194 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"ExecuteTime": {
|
||||||
|
"end_time": "2026-09-03T09:14:58.535236Z",
|
||||||
|
"start_time": "2026-09-03T09:14:57.335343800Z"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"from openai import OpenAI\n",
|
||||||
|
"from openai.types.chat import (\n",
|
||||||
|
" ChatCompletionSystemMessageParam,\n",
|
||||||
|
" ChatCompletionUserMessageParam,\n",
|
||||||
|
" ChatCompletionAssistantMessageParam\n",
|
||||||
|
")"
|
||||||
|
],
|
||||||
|
"id": "255e9b078be17a5f",
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"ExecuteTime": {
|
||||||
|
"end_time": "2026-09-03T09:19:09.642201600Z",
|
||||||
|
"start_time": "2026-09-03T09:19:09.628764300Z"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"client = OpenAI(\n",
|
||||||
|
" api_key='sk-4bdcdad5d4cd4856bc0c308c3f74eb22',\n",
|
||||||
|
" base_url='https://api.deepseek.com'\n",
|
||||||
|
")"
|
||||||
|
],
|
||||||
|
"id": "6f8aeb64ad6aca1f",
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": 6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"ExecuteTime": {
|
||||||
|
"end_time": "2026-09-03T09:17:52.034706300Z",
|
||||||
|
"start_time": "2026-09-03T09:17:52.023338600Z"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"messages: list[ChatCompletionSystemMessageParam | ChatCompletionUserMessageParam | ChatCompletionAssistantMessageParam] = [\n",
|
||||||
|
" ChatCompletionSystemMessageParam(role=\"system\", content=\"你是一个ai助手,所有回答使用中文\")\n",
|
||||||
|
"]"
|
||||||
|
],
|
||||||
|
"id": "4530b047d03a8ab3",
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {},
|
||||||
|
"cell_type": "code",
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": null,
|
||||||
|
"source": [
|
||||||
|
"# 第一轮对话\n",
|
||||||
|
"print(\"===========\")\n",
|
||||||
|
"messages.append(ChatCompletionUserMessageParam(role=\"user\", content=\"你好,我是大哥\"))\n",
|
||||||
|
"\n",
|
||||||
|
"response = client.chat.completions.create(\n",
|
||||||
|
" model='deepseek-v4-flash',\n",
|
||||||
|
" messages=messages,\n",
|
||||||
|
" stream=False\n",
|
||||||
|
")"
|
||||||
|
],
|
||||||
|
"id": "a42f7a8dbdfa3b8c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"ExecuteTime": {
|
||||||
|
"end_time": "2026-09-03T08:51:19.785432800Z",
|
||||||
|
"start_time": "2026-09-03T08:51:19.759474700Z"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# print(response.model_dump_json())\n",
|
||||||
|
"print(response.choices[0].message.content)"
|
||||||
|
],
|
||||||
|
"id": "fac34b2742f048e0",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"大哥你好!我是你的AI助手,随时听候差遣。今天有什么需要帮忙的吗?\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"execution_count": 12
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"ExecuteTime": {
|
||||||
|
"end_time": "2026-09-03T08:51:41.715208300Z",
|
||||||
|
"start_time": "2026-09-03T08:51:36.483133100Z"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# 第二轮对话\n",
|
||||||
|
"messages.append(ChatCompletionAssistantMessageParam(role=\"assistant\", content=response.choices[0].message.content))\n",
|
||||||
|
"messages.append(ChatCompletionUserMessageParam(role=\"user\", content=\"你还记得我吗\"))\n",
|
||||||
|
"response = client.chat.completions.create(\n",
|
||||||
|
" model='deepseek-v4-flash',\n",
|
||||||
|
" messages=messages,\n",
|
||||||
|
")\n",
|
||||||
|
"print(response.choices[0].message.content)"
|
||||||
|
],
|
||||||
|
"id": "3c9fa1f10b75c256",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"大哥,这个问题您刚刚才问过呢,我当然记得您!您就是“大哥”嘛,我怎么会忘?\n",
|
||||||
|
"\n",
|
||||||
|
"虽然我的记忆不能跨对话永久保存,但只要咱们在这个对话里,您说的每句话、问的每个问题,我都记得一清二楚——包括您刚才已经问过一次“还记得我吗”,我当时也解释过啦。\n",
|
||||||
|
"\n",
|
||||||
|
"您现在又问一遍,是在考验我,还是想看看我是不是“脸盲”呀?哈哈,放心吧!在这段对话期间,您永远是我的大哥,随叫随到,有事您吩咐!😄\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"execution_count": 14
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"ExecuteTime": {
|
||||||
|
"end_time": "2026-09-03T09:19:38.275536400Z",
|
||||||
|
"start_time": "2026-09-03T09:19:31.090446900Z"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"messages.append(ChatCompletionUserMessageParam(role=\"user\", content=\"你好,明天合肥天气怎么样\"))\n",
|
||||||
|
"\n",
|
||||||
|
"response = client.chat.completions.create(\n",
|
||||||
|
" model='deepseek-v4-flash',\n",
|
||||||
|
" messages=messages,\n",
|
||||||
|
" stream=False\n",
|
||||||
|
")\n",
|
||||||
|
"print(response.choices[0].message.content)"
|
||||||
|
],
|
||||||
|
"id": "ea34cc88d92b2832",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"你好!很抱歉,由于我无法实时联网获取最新的气象数据,所以不能直接为你提供明天合肥的准确天气预报。\n",
|
||||||
|
"\n",
|
||||||
|
"不过,你可以通过以下几种方式快速查到最准确的信息:\n",
|
||||||
|
"\n",
|
||||||
|
"1. 打开手机自带的“天气”应用,添加并定位到“合肥”。\n",
|
||||||
|
"2. 在搜索引擎(如百度)中直接搜索“**合肥明天天气**”,或其他(例如“墨迹天气”)\n",
|
||||||
|
"3. 访问“中国天气网”(www.weather.com.cn),输入“合肥”即可查询。\n",
|
||||||
|
"\n",
|
||||||
|
"另外,由于我无法预知你目前的实际日期,建议你在查询时留意一下,如果是明天出发,记得顺带看一眼**后天**的预报,以便更好地安排行程。祝生活愉快!\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"execution_count": 7
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython2",
|
||||||
|
"version": "2.7.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 5
|
||||||
|
}
|
||||||
167
lc/lc.ipynb
Normal file
167
lc/lc.ipynb
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"id": "initial_id",
|
||||||
|
"metadata": {
|
||||||
|
"collapsed": true,
|
||||||
|
"ExecuteTime": {
|
||||||
|
"end_time": "2026-09-05T01:34:44.550869800Z",
|
||||||
|
"start_time": "2026-09-05T01:34:44.535351500Z"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"source": [
|
||||||
|
"from typing import cast, Literal\n",
|
||||||
|
"\n",
|
||||||
|
"from langchain.agents.middleware.summarization import ContextMessages\n",
|
||||||
|
"from langchain.chat_models import init_chat_model\n",
|
||||||
|
"from langchain.agents import create_agent\n",
|
||||||
|
"from langchain_core.runnables import RunnableConfig\n",
|
||||||
|
"from langgraph.checkpoint.memory import InMemorySaver\n",
|
||||||
|
"from langchain.agents.middleware import SummarizationMiddleware\n",
|
||||||
|
"\n",
|
||||||
|
"from core.config.settings import settings\n",
|
||||||
|
"from langchain.tools import tool\n",
|
||||||
|
"from langchain.messages import HumanMessage\n",
|
||||||
|
"from langchain_core.language_models import BaseChatModel"
|
||||||
|
],
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": 15
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"ExecuteTime": {
|
||||||
|
"end_time": "2026-09-05T01:37:24.572533800Z",
|
||||||
|
"start_time": "2026-09-05T01:37:24.555523100Z"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# 初始化模型\n",
|
||||||
|
"my_model = init_chat_model(\n",
|
||||||
|
" model=\"deepseek-v4-flash\",\n",
|
||||||
|
" api_key=settings.DEEPSEEK_API_KEY,\n",
|
||||||
|
")\n",
|
||||||
|
"\n",
|
||||||
|
"# 初始化checkpointer 记忆管理的存储方式\n",
|
||||||
|
"checkpointer = InMemorySaver()\n",
|
||||||
|
"\n",
|
||||||
|
"# 初始化记忆策略中间件\n",
|
||||||
|
"middleware = SummarizationMiddleware(\n",
|
||||||
|
" model=cast(BaseChatModel, my_model), # 消息摘要的记忆管理策略的模型\n",
|
||||||
|
" trigger=cast(ContextMessages, (\"messages\", 3)), # 触发策略的条件\n",
|
||||||
|
" keep=cast(ContextMessages, (\"messages\", 1)) # 触发策略后保留的消息条数\n",
|
||||||
|
")"
|
||||||
|
],
|
||||||
|
"id": "b905be968f5c7761",
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": 22
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"ExecuteTime": {
|
||||||
|
"end_time": "2026-09-05T01:37:26.422888800Z",
|
||||||
|
"start_time": "2026-09-05T01:37:26.408643600Z"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# 初始化agent\n",
|
||||||
|
"agent = create_agent(\n",
|
||||||
|
" model=cast(BaseChatModel, my_model),\n",
|
||||||
|
" checkpointer=InMemorySaver(), # 短期记忆 通过thread_id进行记忆分组\n",
|
||||||
|
" middleware=[middleware]\n",
|
||||||
|
")"
|
||||||
|
],
|
||||||
|
"id": "cb5ae2fa4aeaf130",
|
||||||
|
"outputs": [],
|
||||||
|
"execution_count": 23
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"ExecuteTime": {
|
||||||
|
"end_time": "2026-09-05T01:37:59.930524700Z",
|
||||||
|
"start_time": "2026-09-05T01:37:27.968100300Z"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"config: RunnableConfig = {\"configurable\": {\"thread_id\": \"thread_1\"}}\n",
|
||||||
|
"agent.invoke({\"messages\": [HumanMessage(\"你好,我是胖哥\")]}, config)\n",
|
||||||
|
"agent.invoke({\"messages\": [HumanMessage(\"我喜欢吃美食\")]}, config)\n",
|
||||||
|
"agent.invoke({\"messages\": [HumanMessage(\"我喜欢运动\")]}, config)\n",
|
||||||
|
"\n",
|
||||||
|
"result = agent.invoke({\"messages\": [HumanMessage(\"你还记得我吗\")]}, config)\n",
|
||||||
|
"# print(result)\n",
|
||||||
|
"for message in result['messages']:\n",
|
||||||
|
" message.pretty_print()"
|
||||||
|
],
|
||||||
|
"id": "1ed1327c973d75cc",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"================================\u001B[1m Human Message \u001B[0m=================================\n",
|
||||||
|
"\n",
|
||||||
|
"Here is a summary of the conversation to date:\n",
|
||||||
|
"\n",
|
||||||
|
"## SESSION INTENT\n",
|
||||||
|
"\n",
|
||||||
|
"开放式、友好的中文闲聊会话,无具体交付物。用户自称“胖哥”,目前已透露两大爱好:美食与运动。整体目标是延续话题、维持轻松氛围,进一步了解他的偏好,从而围绕美食/运动展开聊天或提供推荐。\n",
|
||||||
|
"\n",
|
||||||
|
"## SUMMARY\n",
|
||||||
|
"\n",
|
||||||
|
"- 用户为“胖哥”,须以中文称呼;全会话均使用中文。\n",
|
||||||
|
"- 话题线索已在两条线上推进:\n",
|
||||||
|
" 1. **美食**:胖哥说“我喜欢吃美食”。助手此前已问他偏好哪些菜系(川菜/粤菜/湘菜)以及喜欢哪种类型(街边小吃、家常菜还是精致餐饮),并邀请他分享最近特别喜欢的一道菜。胖哥尚未回答此组问题。\n",
|
||||||
|
" 2. **运动(新增)**:胖哥随后说“我喜欢运动”。助手将美食与运动联系起来称赞(爱吃又会动、搭配健康),并追问:喜欢哪种运动——健身房撸铁、户外跑步骑行,还是打篮球羽毛球等对抗性项目;同时主动提出可以推荐运动后补充能量的美食搭配。\n",
|
||||||
|
"- 尚无任何结论、决定或策略形成;没有选项被否决。\n",
|
||||||
|
"- 需要注意的是,胖哥对“美食偏好”相关问题尚未作答,该线索仍处于待回应状态。\n",
|
||||||
|
"\n",
|
||||||
|
"## ARTIFACTS\n",
|
||||||
|
"\n",
|
||||||
|
"None.\n",
|
||||||
|
"\n",
|
||||||
|
"## NEXT STEPS\n",
|
||||||
|
"\n",
|
||||||
|
"- 等待胖哥回复:他喜欢哪种运动(健身房/户外/球类对抗等)。\n",
|
||||||
|
"- 得到答复后顺势深入聊天:讨论该运动,可结合他未答复的那组问题,推荐适合运动后的营养美食搭配,或顺带再把菜系/餐饮类型偏好问出来,延长话题。\n",
|
||||||
|
"- 不要重复寒暄,也不要重复之前已问过的两组问题(菜系类型与偏好风格、运动类型选择)。\n",
|
||||||
|
"- 保持中文、热情随意的口吻继续对话。\n",
|
||||||
|
"================================\u001B[1m Human Message \u001B[0m=================================\n",
|
||||||
|
"\n",
|
||||||
|
"你还记得我吗\n",
|
||||||
|
"==================================\u001B[1m Ai Message \u001B[0m==================================\n",
|
||||||
|
"\n",
|
||||||
|
"胖哥,这话说的——当然记得你呀!爱美食又爱运动,能吃会练,这反差感可太让人印象深刻了。咱俩这不正聊到运动嘛,我还等着听你细说呢。 \n",
|
||||||
|
"\n",
|
||||||
|
"不过不急,你先说说最近一次痛快出汗是啥时候?是去健身房撸铁,还是户外疯跑了一圈?反正不管哪种,你要是一会儿饿了,我脑子里的运动后美食搭配可已经在排队了😄\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"execution_count": 24
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython2",
|
||||||
|
"version": "2.7.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 5
|
||||||
|
}
|
||||||
@@ -1,11 +1,19 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "lotteryserver"
|
name = "lotteryserver"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
requires-python = ">=3.14"
|
requires-python = ">=3.13"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"apscheduler==3.11.3",
|
"apscheduler==3.11.3",
|
||||||
"fastapi>=0.141.1",
|
"fastapi>=0.141.1",
|
||||||
"ipykernel>=7.3.0",
|
"ipykernel>=7.3.0",
|
||||||
|
"langchain>=1.4.0",
|
||||||
|
"langchain-core==1.6.2",
|
||||||
|
"langchain-deepseek==1.1.0",
|
||||||
|
"langchain-tavily==0.2.18",
|
||||||
|
"langgraph>=1.2.11",
|
||||||
|
"langgraph-checkpoint-sqlite==3.1.1",
|
||||||
|
"notebook>=7.6.2",
|
||||||
|
"openai==3.8.0",
|
||||||
"pydantic==2.13.5",
|
"pydantic==2.13.5",
|
||||||
"pydantic-settings==2.15.0",
|
"pydantic-settings==2.15.0",
|
||||||
"pymysql==1.2.0",
|
"pymysql==1.2.0",
|
||||||
|
|||||||
Reference in New Issue
Block a user