【大模型】-LangServe
LangServe是一个专为LangChain应用程序设计的REST API部署库,可快速将链、代理等模型部署为Web服务。它提供三种安装方式:完整版、仅客户端或仅服务器。主要特性包括自动生成API端点、内置流式传输、交互式Playground界面、类型安全和LangSmith集成。通过类比Spring Boot框架,LangServe简化了LangChain应用的API化过程,只需几行代码即可创
文章目录
完整安装(包含客户端和服务器):
bash(安装这个)
pip install --upgrade "langserve[all]"
仅安装客户端:
bash
pip install "langserve[client]"
仅安装服务器:
bash
pip install "langserve[server]"
LangServe 是一个专门用于将 LangChain 应用程序(如链、代理等)快速部署为 REST API 的库。
您可以把它理解为 LangChain 世界的 Flask 或 FastAPI。它的核心目标是简化 LangChain 模型的部署和集成过程。
在没有 LangServe 之前,如果您开发了一个基于 LangChain 的智能链或代理,并想让它被其他应用程序(比如一个网站、一个移动应用或另一个微服务)调用,您需要自己:
- 用 Web 框架(如 FastAPI、Flask)编写一个服务器。
- 定义 API 路由(比如
/invoke,/stream)。 - 处理请求解析、响应格式化、错误处理等。
- 考虑如何实现流式输出(对于 LLM 应用非常重要)。
LangServe 自动化了所有这些步骤,让开发者可以专注于链的逻辑本身,而不是底层的 Web 服务器搭建。
1.主要特性
- 自动生成 API:只需几行代码,就能将任何 LangChain 链(
Runnable)转换为一个完整的 API。它会自动为你创建诸如POST /invoke,POST /batch,POST /stream等端点。 - 内置流式传输:原生支持 Server-Sent Events(SSE),可以轻松地将 LLM 生成的令牌实时地流式传输到客户端,实现打字机效果。
- Playground:自动为你的链生成一个交互式的 Web UI(Playground),你可以在浏览器中直接测试你的链,调整参数,而无需编写任何前端代码。这对于调试和演示非常有用。
- 类型安全:基于 Pydantic 模型,自动验证输入和输出的类型。
- 客户端 SDK:
langserve[client]提供了一个配套的客户端库,让从 Python 应用程序调用部署的链变得非常简单,就像调用本地函数一样。 - 与 LangSmith 集成:可以无缝集成 LangChain 的调试和监控平台 LangSmith,方便你追踪每一次 API 调用的性能、成本和细节。
2.一个简单的例子
假设你有一个非常简单的链:
python
# 1. 定义你的链
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("请用一句话介绍一下 {topic}")
model = ChatOpenAI()
chain = prompt | model
使用 LangServe 部署它:
python
# 2. 使用 LangServe 创建 API
from fastapi import FastAPI
from langserve import add_routes
app = FastAPI(title="我的AI API")
# 关键的一步:将链添加到路由中
# 这会自动创建 /invoke, /stream, /batch 等端点
add_routes(
app,
chain,
path="/my_chain"
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="localhost", port=8000)
运行这个脚本,你就有了一个运行在 http://localhost:8000 的 API 服务器。
- 调用 API:你可以向
http://localhost:8000/my_chain/invoke发送一个 JSON 请求{"input": {"topic": "太阳系"}}。 - 访问 Playground:在浏览器中打开
http://localhost:8000/my_chain/playground/,就可以在图形界面中直接测试。
3.类似java中的springboot框架
核心相似之处
| 维度 | Spring Boot (Java Web 领域) | LangServe (LLM 应用领域) |
|---|---|---|
| 核心目标 | 简化 Spring 应用的初始搭建和开发 | 简化 LangChain 应用的部署和 API 化 |
| 传统方式 | 需要手动配置 Spring MVC、Tomcat、XML 等 | 需要手动用 FastAPI/Flask 包装 LangChain 链 |
| 自动化能力 | 自动配置、内嵌服务器、starter 依赖 | 自动生成 API 端点、Playground、文档 |
| 开发效率 | 快速创建生产就绪的 Web 服务 | 快速创建生产就绪的 LLM API 服务 |
| 约定大于配置 | 默认配置满足大部分场景 | 自动创建标准端点(/invoke, /stream 等) |
具体类比
1. 就像 Spring Boot 对 Spring 的简化:
- 传统 Spring:需要配置 DispatcherServlet、ViewResolver、XML 文件等
- Spring Boot:
@SpringBootApplication一个注解搞定所有配置 - 传统 LangChain 部署:需要手动创建 FastAPI 应用、定义路由、处理序列化
- LangServe:
add_routes(app, chain)一行代码搞定所有 API
2. 都提供内嵌服务器和开箱即用的体验:
- Spring Boot:内嵌 Tomcat/Jetty,直接运行
main方法即可启动 - LangServe:基于 FastAPI 和 Uvicorn,直接运行 Python 脚本即可启动
3. 都有强大的生态集成:
- Spring Boot Starters:数据库、安全、消息队列等开箱即用
- LangServe:与 LangSmith(监控)、LangChain(组件)无缝集成
主要区别
当然,由于解决的问题领域不同,也有一些重要区别:
| Spring Boot | LangServe |
|---|---|
| 通用 Web 应用框架 | 专用 LLM 部署框架 |
| 解决企业级应用的全栈问题 | 专注于 AI/LLM 链的 API 化 |
| 处理 CRUD、事务、安全等 | 专门处理 LLM 的流式输出、异步调用 |
| 面向传统软件工程领域 | 面向 AI 应用工程领域 |
更精确的类比
如果要在技术栈中找一个更精确的对应关系:
- LangChain ≈ Spring Framework(核心编程模型和组件)
- LangServe ≈ Spring Boot(快速启动和部署工具)
- LangSmith ≈ Spring Actuator + Micrometer(监控和可观测性)
4.LangChain CLI 工具(看 实际工作流程示例)
LangChain CLI 是一个命令行工具,可以理解为 LangChain 项目的 “脚手架生成器"和"项目管理器”。
继续用 Spring Boot 的类比:
- LangServe ≈ Spring Boot(部署框架)
- LangChain CLI ≈ Spring Initializr(项目生成工具)
安装 CLI 工具:
bash
pip install -U langchain-cli
安装好后可以用这个命令查看
4.1核心功能
1. 快速创建项目模板(核心功能)
这是最主要的作用。只需一个命令,就能创建一个完整的、预配置好的 LangServe 项目结构:
bash
langchain app new jh-langserve-app
这个命令会生成一个包含以下结构的项目:
text
my-langserve-app/
├── app/
│ ├── server.py # 主要的 FastAPI 应用文件
│ └── [...]
├── packages/ # 你的自定义链/组件
├── pyproject.toml # 依赖管理(使用 poetry)
├── Dockerfile # 容器化配置
└── README.md

2. 预配置的开发环境
- FastAPI + LangServe 环境
- Poetry 依赖管理(按顺序控制台依次执行下述命令,每个命令执行成功需要验证下)
pipx 是一个专门用于安装和运行 Python 应用的工具
它能为每个应用创建独立的虚拟环境
ensurepath 确保 pipx 安装的命令可以在终端中直接使用
##安装 pipx
pip install pipx
pipx ensurepath
Poetry 是现代 Python 项目的依赖管理工具(类似 npm、Maven)
使用 pipx 安装可以确保 Poetry 在独立的干净环境中运行
##使用 pipx 安装 Poetry
pipx install poetry
这些是开发 LangChain 应用常用的包:
langchain - 核心框架
langchain-openai - OpenAI 模型集成
其他可能用到的:langchain-anthropic(Claude)、langchain-mistral(Mistral AI)等
##使用 Poetry 添加依赖(注意python版本,可以在# 在 pyproject.toml 中找到这一行并修改[tool.poetry.dependencies] python = "^3.10" # 从 ^3.11 改为 ^3.10)
poetry add langchain
poetry add langchain-openai
设置环境变量(自己使用对应的apikey)
这里应该是要设置 API 密钥等敏感信息,例如:
# 设置 OpenAI API 密钥
export OPENAI_API_KEY="your-api-key-here"
# 或者设置 Anthropic API 密钥
export ANTHROPIC_API_KEY="your-anthropic-key"
- Docker 配置
- 基本的 API 路由和示例
- 开发服务器配置
3. 添加预制组件
CLI 可以帮你快速添加社区共享的链或组件:
bash
langchain app add some-prebuilt-component
4.2为什么要用 LangChain CLI?
没有 CLI 的传统方式:
- 手动创建项目目录结构
- 手动安装 FastAPI、LangServe、uvicorn 等依赖
- 手动编写服务器配置代码
- 手动设置 Dockerfile
- 手动配置 poetry/pipenv
4.3 总结
LangChain CLI 是什么?
- 它是 LangChain 项目的快速启动工具
- 主要功能是 生成预配置的项目模板
- 解决了 “从零开始配置环境很麻烦” 的问题
- 让开发者能够 专注于业务逻辑,而不是项目搭建
您最初提供的文本中提到的 langchain app new 命令,正是这个工具最核心的功能——一键创建新的 LangServe 应用程序。
5. 实际工作流程示例(安装坑)
要到项目所在的目录控制台下,控制台执行命令如下,但是遇到很多坑
# 1. 安装 CLI
pip install -U langchain-cli
# 2. 创建新项目
langchain app new jh-langserve-app
# 3. 进入项目并安装依赖
pipx 是一个专门用于安装和运行 Python 应用的工具
它能为每个应用创建独立的虚拟环境
ensurepath 确保 pipx 安装的命令可以在终端中直接使用
##安装 pipx
pip install pipx
pipx ensurepath
Poetry 是现代 Python 项目的依赖管理工具(类似 npm、Maven)
使用 pipx 安装可以确保 Poetry 在独立的干净环境中运行
##使用 pipx 安装 Poetry
pipx install poetry
这些是开发 LangChain 应用常用的包:
langchain - 核心框架
langchain-openai - OpenAI 模型集成
其他可能用到的:langchain-anthropic(Claude)、langchain-mistral(Mistral AI)等
##使用 Poetry 添加依赖(注意python版本,可以在# 在 pyproject.toml 中找到这一行并修改[tool.poetry.dependencies] python = "^3.10" # 从 ^3.11 改为 ^3.10)
poetry add langchain
poetry add langchain-openai
# 如果没有权限,可以替换国内的通义等,安装阿里云通义千问的 LangChain 集成
poetry add langchain-community
# 4. 添加自定义链(在 packages/ 目录中开发)
# 5. 启动开发服务器
poetry run langchain serve
5.1 pipx install poetry安装报错
pipx 创建的虚拟环境中缺少 pip 模块。这是一个已知的 pipx 在 Windows 上的兼容性问题。
# 直接使用 pip 安装,跳过 pipx
pip install poetry
# 验证安装
poetry --version
5.2 poetry add langchain安装报错
The currently activated Python version 3.10.9 is not supported by the project (^3.11).
Trying to find and use a compatible version.
项目依赖文件pyproject.toml直接替换python版本,^3.10
[tool.poetry.dependencies]
python = "^3.10"
uvicorn = "^0.23.2"
langserve = {extras = ["server"], version = ">=0.0.30"}
pydantic = ">=2.7.4,<3.0.0"
langchain = "^1.1.0"
langchain-community = "^0.4.1"
配置完后,控制台重新执行,也可以直接升级版本安装 Python 3.11+
poetry install
5.3 pydantic 版本与 langchain 要求的版本不兼容
PS D:\jhproject\python_project\LLM\jh-langserve-app> poetry add langchain
Using version ^1.1.0 for langchain
Updating dependencies
Resolving dependencies... (0.2s)
Because no versions of langchain match >1.1.0,<2.0.0
and langchain (1.1.0) depends on pydantic (>=2.7.4,<3.0.0), langchain (>=1.1.0,<2.0.0) requires pydantic (>=2.7.4,<3.0.0).
So, because jh-langserve-app depends on both pydantic (<2) and langchain (^1.1.0), version solving failed.
同样修改pyproject.toml,
pydantic = ">=2.7.4,<3.0.0"
5.4 poetry add langchain-openai 没有openai权限可以安装国内模型
# 如果没有权限,可以替换国内的通义等,安装阿里云通义千问的 LangChain 集成
poetry add langchain-community
5.5 poetry run langchain serve报错
环境变量,配置通义的apiKey
创建 .env 文件(在项目根目录):
DASHSCOPE_API_KEY=sk-your-tongyi-api-key-here
或者在终端中设置:
# Windows PowerShell
$env:DASHSCOPE_API_KEY="sk-your-tongyi-api-key-here"
# Windows CMD
set DASHSCOPE_API_KEY=sk-your-tongyi-api-key-here
server.py 文件 报错
错误是因为 add_routes 函数的第二个参数需要是一个 Runnable 实例,但你传入了 NotImplemented。根据错误信息,你需要创建一个 Runnable 实例而不是使用 NotImplemented。
1htOnoS-py3.10\lib\site-packages\langserve\server.py", line 392, in add_routes
raise TypeError(
TypeError: Expected a Runnable, got <class 'NotImplementedType'>. The second argument to add_routes should be a Runnable instance.add_route(app, runnable, ...) is the correct usage.Please make sure that you are using a runnable which is an instance of langchain_core.runnables.Runnable.
server.py 文件
# 创建一个简单的 Runnable
def echo_function(input_data):
return {"result": f"Received: {input_data}"}
# 创建 Runnable 实例
runnable = RunnableLambda(echo_function)
# 替换原来的 NotImplemented
add_routes(app, runnable, path="/echo")
5.6 控制台执行 poetry run langchain serve

现在你就有了一个运行在 http://localhost:8000 的完整 API 服务,包含:
- API 端点
- 自动生成的文档
- Playground 测试界面
- 所有 LangServe 功能

将通义模型嵌入server.py 文件
add_routes(app,
ChatTongyi(model="qwen-plus",dashscope_api_key="sk-秘钥"),
path="/tongyi")


6.与相关工具的关系
为了更好地理解,让我们看看完整的工具链:
| 工具 | 角色 | 类比 |
|---|---|---|
| LangChain | LLM 应用开发框架 | Spring Framework |
| LangServe | 部署框架 | Spring Boot |
| LangChain CLI | 项目脚手架工具 | Spring Initializr |
| LangSmith | 监控调试平台 | Spring Actuator + APM |
7.前后端使用模型
8.LangSmith监控
8.1 环境变量配置(Windows)
# 配置 LangSmith 监控开关,true开启,false关闭
setx LANGCHAIN_TRACING_V2 "true"
# 配置 LangSmith API Key(从 https://smith.langchain.com/ 获取)
setx LANGCHAIN_API_KEY "ls_xxxxxx"
# 配置 Tavily API Key(从 https://tavily.com/ 获取)
setx TAVILY_API_KEY "tvly_xxxxxx"
# 配置项目名称(可选,用于在 LangSmith 中组织跟踪)
setx LANGCHAIN_PROJECT "my-langchain-project"

8.2. 在 Python 代码中使用
主文件,运行的文件,这里都用了新的监控包,旧的过时
from langchain_classic.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from langchain_community.chat_models import ChatTongyi
from langchain_tavily import TavilySearch
from dotenv import load_dotenv
load_dotenv() ##加载.env文件
llm = ChatTongyi(model="qwen-plus") ##模型
tools = [TavilySearch(max_results=1)] ##搜索工具,配置最多搜索数量,防止key超了
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个助手,请使用中文回答问题。"),
("human", "请使用中文回答问题。"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}") # 添加这一行
])
agent = create_tool_calling_agent(llm, tools,prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)
response = agent_executor.invoke(
{"input": "谁拍摄了志愿军的电影。"}
)
print(response)
#输出
{'input': '谁拍摄了志愿军的电影。', 'output': '电影《志愿军:雄兵出击》是由著名导演陈凯歌执导的。这是“志愿军”系列三部曲的第一部,影片讲述了中国人民志愿军入朝作战,并打响第一、第二次战役的故事。'}
.env文件
DASHSCOPE_API_KEY=sk-秘钥 ##模型的apikey
TAVILY_API_KEY=tvly-秘钥 # 配置 Tavily API Key(从 https://tavily.com/ 获取)
LANGCHAIN_API_KEY=ls秘钥 # 配置 LangSmith API Key(从 https://smith.langchain.com/ 获取)
LANGCHAIN_TRACING_V2=true # 配置 LangSmith 监控开关,true开启,false关闭
LANGCHAIN_PROJECT=jh-langserve-app # 配置项目名称(可选,用于在 LangSmith 中组织跟踪)


9.LangChain消息管理与聊天历史存储
9.1日志打印
from langchain_core.globals import set_verbose, set_debug
set_verbose(True) ##打印精简日志
set_debug(True) ##打印详细日志
9.2 历史存储(内存中)
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
会话id相同则是同一对话,不同则是不同对话
from langchain_classic.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.globals import set_verbose, set_debug
from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, MessagesPlaceholder
from langchain_community.chat_models import ChatTongyi
from langchain_tavily import TavilySearch
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
from dotenv import load_dotenv
load_dotenv()
llm = ChatTongyi(model="qwen-plus")
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个助手,请使用中文回答问题。"),
#历史消息占位符
MessagesPlaceholder(variable_name="history"),
("human", "{input}"),
])
runnable = prompt | llm
#set_verbose(True) ##打印精简日志
#set_debug(True) ##打印详细日志
##存储会话历史记录
store = {}
def get_history(session_id: str) -> BaseChatMessageHistory:
if session_id not in store:
store[session_id] = ChatMessageHistory()
return store[session_id]
with_message_history = RunnableWithMessageHistory(
runnable,
get_history,
input_messages_key="input",
history_messages_key="history",
)
##调用带会话历史记录的模型
response = with_message_history.invoke(
{"input": "谁拍摄了志愿军的电影。"},
config={"configurable":{"session_id":"2342"}},
)
print(response)
response = with_message_history.invoke(
{"input": "什么?"},
config={"configurable":{"session_id":"2342"}},
)
print(f"还记得上面的历史记录session_id一样:{response}",response)
##新的session_id,是一个新的对话了
response = with_message_history.invoke(
{"input": "什么?"},
config={"configurable":{"session_id":"546456"}},
)
print(f"不记得上面的历史记录,session_id不一样:{response}",response)
##输出结果
content='电影《志愿军》是由中国著名导演陈凯歌执导的。该片是为纪念中国人民志愿军抗美援朝出国作战而拍摄的系列影片,旨在展现志愿军战士的英勇事迹和爱国主义精神。该系列电影包括多部作品,首部《志愿军:雄兵出击》于2023年上映。' additional_kwargs={} re
还记得上面的历史记录session_id一样:content='对不起,我刚才的回答可能让你感到困惑。让我澄清一下:\n\n截至目前(2024年),并没有一部统一叫做《志愿军》的单一电影被广泛认知为“志愿军电影”的唯一代表。但近年来,中国拍摄了多部以抗美援朝战争中中国人民志愿军为主
不记得上面的历史记录,session_id不一样:content='您好!看起来您可能有点困惑。我是一个AI助手,可以帮您解答各种问题、提供信息或协助处理任务。您想了解什么呢?请随时告诉我您的需求 😊' additional_kwargs={} response_metadata=

会话id+用户id,唯一确认
from langchain_classic.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.globals import set_verbose, set_debug
from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, MessagesPlaceholder
from langchain_community.chat_models import ChatTongyi
from langchain_tavily import TavilySearch
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
from dotenv import load_dotenv
from langchain_core.runnables import ConfigurableFieldSpec
load_dotenv()
llm = ChatTongyi(model="qwen-plus")
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个助手,请使用中文回答问题。"),
#历史消息占位符
MessagesPlaceholder(variable_name="history"),
("human", "{input}"),
])
runnable = prompt | llm
#set_verbose(True) ##打印精简日志
#set_debug(True) ##打印详细日志
##存储会话历史记录
store = {}
def get_history(user_id: str,session_id: str) -> BaseChatMessageHistory:
if (user_id,session_id) not in store:
store[(user_id,session_id)] = ChatMessageHistory()
return store[(user_id,session_id)]
with_message_history = RunnableWithMessageHistory(
runnable,
get_history,
input_messages_key="input",
history_messages_key="history",
history_factory_config=[
ConfigurableFieldSpec(
id = "user_id",
annotation=str,
name="用户 id",
description="用户 id唯一标识符",
default= "",
is_shared= True,
),
ConfigurableFieldSpec(
id = "session_id",
annotation=str,
name="会话 id",
description="会话 id唯一标识符",
default= "",
is_shared= True,
),
],
)
##调用带会话历史记录的模型
response = with_message_history.invoke(
{"input": "迪迦奥特曼的父母是谁"},
config={"configurable":{"user_id":"123","session_id":"2342"}},
)
print(response)
response = with_message_history.invoke(
{"input": "什么?"},
config={"configurable":{"user_id":"123","session_id":"2342"}},
)
print(f"还记得上面的历史记录session_id一样:{response}",response)
##新的session_id,是一个新的对话了
response = with_message_history.invoke(
{"input": "什么?"},
config={"configurable":{"user_id":"67","session_id":"546456"}},
)
print(f"不记得上面的历史记录,session_id不一样:{response}",response)
##输出
content='迪迦奥特曼并没有明确的“父母”设定。他是《迪迦奥特曼》(1996年圆谷公司制作的特摄剧)中的主角,属于“光之巨人”一族,但剧中并未提及他的亲生父母是谁。\n\n在剧情设定
还记得上面的历史记录session_id一样:content='你可能是对“迪迦没有父母”这个设定感到惊讶,这很正常!毕竟我们习惯了很多角色都有爸爸妈妈,但迪迦奥特曼的情况确实有点特别。\
不记得上面的历史记录,session_id不一样:content='您好!看起来您可能有点困惑。我是一个AI助手,可以帮您解答各种问题、提供信息或协助处理任务。您能具体说说您想了解什么吗?
9.3 消息持久化(永久存储,redis)
区别就是
def get_history(session_id: str) -> RedisChatMessageHistory:
return RedisChatMessageHistory(session_id,url= “redis://127.0.0.1:6379/0”)
from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, MessagesPlaceholder
from langchain_community.chat_models import ChatTongyi
from langchain_community.chat_message_histories import ChatMessageHistory, RedisChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
from dotenv import load_dotenv
load_dotenv()
llm = ChatTongyi(model="qwen-plus")
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个助手,请使用中文回答问题。"),
#历史消息占位符
MessagesPlaceholder(variable_name="history"),
("human", "{input}"),
])
runnable = prompt | llm
def get_history(session_id: str) -> RedisChatMessageHistory:
return RedisChatMessageHistory(session_id,url= "redis://127.0.0.1:6379/0")
with_message_history = RunnableWithMessageHistory(
runnable,
get_history,
input_messages_key="input",
history_messages_key="history",
)
##调用带会话历史记录的模型
response = with_message_history.invoke(
{"input": "谁拍摄了志愿军的电影。"},
config={"configurable":{"session_id":"2342"}},
)
print(response)
response = with_message_history.invoke(
{"input": "什么?"},
config={"configurable":{"session_id":"2342"}},
)
print(f"还记得上面的历史记录session_id一样:{response}",response)
##新的session_id,是一个新的对话了
response = with_message_history.invoke(
{"input": "什么?"},
config={"configurable":{"session_id":"546456"}},
)
print(f"不记得上面的历史记录,session_id不一样:{response}",response)
更多推荐


所有评论(0)