完整安装(包含客户端和服务器):

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 的智能链或代理,并想让它被其他应用程序(比如一个网站、一个移动应用或另一个微服务)调用,您需要自己:

  1. 用 Web 框架(如 FastAPI、Flask)编写一个服务器。
  2. 定义 API 路由(比如 /invoke/stream)。
  3. 处理请求解析、响应格式化、错误处理等。
  4. 考虑如何实现流式输出(对于 LLM 应用非常重要)。

LangServe 自动化了所有这些步骤,让开发者可以专注于链的逻辑本身,而不是底层的 Web 服务器搭建。

1.主要特性

  1. 自动生成 API:只需几行代码,就能将任何 LangChain 链(Runnable)转换为一个完整的 API。它会自动为你创建诸如 POST /invokePOST /batchPOST /stream 等端点。
  2. 内置流式传输:原生支持 Server-Sent Events(SSE),可以轻松地将 LLM 生成的令牌实时地流式传输到客户端,实现打字机效果。
  3. Playground:自动为你的链生成一个交互式的 Web UI(Playground),你可以在浏览器中直接测试你的链,调整参数,而无需编写任何前端代码。这对于调试和演示非常有用。
  4. 类型安全:基于 Pydantic 模型,自动验证输入和输出的类型。
  5. 客户端 SDKlangserve[client] 提供了一个配套的客户端库,让从 Python 应用程序调用部署的链变得非常简单,就像调用本地函数一样。
  6. 与 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 应用、定义路由、处理序列化
  • LangServeadd_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 的传统方式:
  1. 手动创建项目目录结构
  2. 手动安装 FastAPI、LangServe、uvicorn 等依赖
  3. 手动编写服务器配置代码
  4. 手动设置 Dockerfile
  5. 手动配置 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)
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐