LangChain ChatOpenAI 怎么接第三方 API?消息输入与返回结果验收
LangChain 的 ChatOpenAI 可以配置第三方地址,但还要匹配协议、模型和响应字段。普通 invoke(messages) 返回 AIMessage,应分别读取文本、工具调用与用量,不能照搬原始 SDK 的 choices[0]。本文核对 Python langchain-openai 1.7.2 与 langchain-core 1.6.10 的相关源码,资料日期为 2026-10-25;未安装运行 LangChain,也未调用云岚API。
先固定包版本和本次接口
在自己的项目环境用 python -m pip show langchain-openai langchain-core openai 记录实际版本。本文讨论 from langchain_openai import ChatOpenAI,不是 JavaScript 同名类,也不是完整 Agent。依赖版本以项目锁文件为准,不要为了照抄示例直接升级生产环境。1.7.2 依赖声明
官方说明 ChatOpenAI 面向 OpenAI 标准;第三方自行扩展的推理等字段不保证被提取或保留,需要这类字段时应查对应厂商集成。模型能普通聊天,不等于其工具、结构化输出和 Responses 都支持。兼容范围
把消息列表交给 invoke
先用一条有明确要求的短文本。下面是待配置的非流式示例:环境变量需由你在本地提供,运行会发起真实请求;本文未运行它。模型 ID 必须来自当前服务说明,不能填写展示名。
import os
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model=os.environ["APP_MODEL_ID"],
api_key=os.environ["APP_API_KEY"],
base_url="https://v2.cloudmist.cloud/v1",
use_responses_api=False,
max_retries=0,
timeout=30,
)
messages = [
{"role": "system", "content": "把通知改写得礼貌,只输出一句话。"},
{"role": "user", "content": "下午三点开会"},
]
reply = llm.invoke(messages)
print(reply.text)
这里明确选择 Chat Completions,关闭本例 SDK 层的自动重试,便于核对单次调用;不保证网关内部没有重试。地址来自本站协议与 base URL 说明,并非该组合已通过测试。角色与正文直接构造为 Python 对象,让库序列化,不要手拼含用户输入的 JSON 字符串。消息输入格式
再次调用同一个 llm 也不会凭空获得前文。需要多轮时,按历史与状态教程明确保存、追加和隔离消息;本页先验收单轮。
AIMessage 里哪些字段分别处理?
| 字段 | 用途与检查 |
|---|---|
reply.text |
获取显示文本;不是整份响应,也不代表任务已完成 |
reply.content / content_blocks |
原始内容或标准化内容块;正文可能不是单一字符串 |
reply.tool_calls |
待处理调用的名称、参数和 ID;不是执行结果 |
reply.invalid_tool_calls |
有解析错误的调用,先保留错误,不交执行器 |
reply.usage_metadata |
可用时的标准化 token 数;缺失不等于零 |
reply.response_metadata |
响应相关元信息;按实际协议核对结束信息 |
当前 .text 会提取文本,其他类型内容仍须从原消息核对。不要先把整条消息压成字符串,再发现工具参数或用量已经丢失。文本属性源码、AIMessage 字段
接收顺序可以是:先查异常、拒绝和未完成状态,再查无效调用及待执行工具,最后验收最终文本。bind_tools 只是绑定声明,不替应用完成本地函数;工具分支继续看执行与回传流程。未知状态先留待核,不能只因有字就入库。
为什么加了参数后开始请求 Responses?
在核对版本中,use_responses_api 未明确设置时,部分模型或参数会触发 Responses 路由,例如 use_previous_response_id=True、reasoning 或内置工具。output_version="responses/v1" 也参与路由判断,不能只当显示格式开关。本文示例的 False 只选择路线,不能让不支持的功能变得兼容。路由实现
需要 Responses 时,先核对服务、模型、参数,再单独设置和验收。保存配置值与实际观察到的请求路径;观察不到就留空。不要将接口切换后的问题统一归因于 Key,也不要直接套用 Chat Completions 的结束字段。官方集成说明
怎样留下可以复查的结果?
下载 LangChain 返回结果核对包,包含静态清单、人工场景和空白 CSV。按同一配置记录包版本、接口、输入角色、内容形状、工具分支、结束信息、文本任务结论及服务端关联记录。缺项填待核,不写成通过。
验收“一句礼貌通知”时,除了取得完整正文,还应核对是否满足原要求。用量有值也只是记录,实际费用另按用量与账单对照;一次成功不能证明全部模型功能。资源不调用接口,不导入 LangChain,也不含真实用量。
常见问题
content 为空,是不是接口坏了?
不一定。先看工具调用、解析错误、拒绝及完成状态。工具请求可能没有最终文本;没有这些证据时也不能直接判成功,应保留脱敏响应查原因。
usage_metadata 没有值,就没有扣费吗?
不能这样判断。字段缺失只能记作未知,需要按请求时间和可用标识查服务记录与账单,不能自行补零。
为什么我的 invoke 返回字典或其他对象?
先看调用对象是否已套了结构化输出、解析器或其他链。本文讲直接调用聊天模型;结构化包装的结果要按它自己的约定处理,并继续做JSON 结构与事实验收。
换成云岚API只改 base_url 就够了吗?
还要确认 Key 所属站点、精确模型 ID、协议和参数。先完成本文的短文本分支,再逐项加入实际需要的能力;官方 OpenAI 集成能力表不能直接当作本站渠道支持表。
