LangChain 调用 OpenAI 兼容接口:先验证端点,再配置 ChatOpenAI
简答:LangChain 调用 OpenAI 兼容接口,先确认 API Key、Base URL、模型 ID 三个字段,再用非流式 Chat Completions 请求验证端点。验证通过后,用 Python 的 base_url 或 JavaScript 的 configuration.baseURL 初始化 ChatOpenAI;RunAPI 的公开页面没有提供可直接核对的完整 LangChain 固定配置,因此端点和模型名应以当前账户文档为准。
定义:OpenAI 兼容接口是采用部分 OpenAI 请求与响应格式的服务端点,但“兼容”不等于完整支持 Chat Completions、Responses API、工具调用、结构化输出和流式用量等全部能力。
先看三步速查:不要一开始就怀疑 LangChain
- 确认 API Key:确认密钥存在、未被截断,并使用服务端要求的认证方式。
- 确认 Base URL:从当前接口文档复制服务端要求的根地址;是否包含
/v1,不能凭经验判断。 - 确认模型 ID:使用账户或接口文档中实际可调用的模型标识,不要把展示名称当作模型 ID。
推荐先发一次非流式 Chat Completions 请求。如果这一步已经返回 401、404 或模型错误,先修正接口层配置,再接入 LangChain。LangChain 官方 Python 文档说明,ChatOpenAI 可以通过显式 base_url 或环境变量设置自定义端点;JavaScript 文档则使用 configuration.baseURL。可分别查看LangChain Python ChatOpenAI 文档和LangChain JavaScript ChatOpenAI 文档。
| 场景 | 优先做法 | 不要默认推断 |
|---|---|---|
| 标准 OpenAI 接口 | 按 ChatOpenAI 官方示例配置 Key、模型和接口地址 | 不要把其他平台的模型 ID 混用 |
| OpenAI 兼容网关 | 先用网关文档验证 Chat Completions,再填写 Base URL | 不要默认支持 Responses、工具调用或所有扩展字段 |
| 扩展型提供商接口 | 优先查找该提供商的 LangChain 专用集成 | 不要假设非标准 reasoning 字段会自动保留 |
RunAPI 配置:能核对的字段与不能直接复制的内容
本文不是 RunAPI 官方页面。检索到的 RunAPI 公开文档页面显示,页面存在域名启用提示,并在公告中列出部分分组可使用 v1/chat/completions、v1/responses 和 v1/messages 格式;但该公开页面没有提供本文可以逐字核验的“LangChain Base URL、账户模型 ID、密钥创建路径”完整配置闭环。相关信息应以RunAPI 当前公开文档页面和登录后账户文档为准。
因此,本文不写入固定的 RunAPI 域名、模型名或可复制的供应商配置,避免读者把旧地址、展示名称或其他账户的模型 ID 直接用于项目。你可以按下面的字段级清单核对:
- 接口端点:复制文档中的 API 请求地址,并确认它是 Base URL、版本路径还是完整资源路径。
- 路径后缀:确认文档示例最终请求的是
/chat/completions、/responses还是其他资源;不要自行追加。 - 模型 ID:从当前账户可用模型列表或请求示例复制,不能根据模型显示名猜测。
- 认证方式:确认是否使用
Authorization: Bearer,以及 Key 是否绑定特定分组、权限或额度。
如果文档没有明确写出某个字段,本文将其视为未核实,不建议把站内旧文章、搜索摘要或他人配置当作固定答案。
Python:用 ChatOpenAI 完成最小 invoke
安装 LangChain 的 OpenAI 集成包:
python -m pip install -U langchain-openai
先在当前终端设置临时环境变量。下面三个值是占位符,必须替换为当前服务文档或账户控制台给出的值:
export OPENAI_API_KEY='替换为你的 API Key'
export OPENAI_BASE_URL='替换为当前文档给出的 Base URL'
export MODEL_ID='替换为服务端实际支持的模型 ID'
最小 Python 示例:
import os
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model=os.environ["MODEL_ID"],
api_key=os.environ["OPENAI_API_KEY"],
base_url=os.environ["OPENAI_BASE_URL"],
temperature=0,
timeout=60,
max_retries=0,
)
response = llm.invoke("用一句话解释什么是 API")
print(response.content)
LangChain 官方文档列出 base_url、api_key、timeout 和 max_retries 等初始化参数,并说明自定义 Base URL 可以通过显式参数或环境变量传入。环境变量优先级和默认行为可能随当前 langchain-openai 版本变化,升级依赖后应重新查看官方 Python 文档。
这段代码只验证普通非流式文本调用,不代表工具调用、结构化输出、推理字段或 Responses API 一定可用。
JavaScript/TypeScript:用 configuration.baseURL 接入
安装 JavaScript 集成包:
npm install @langchain/openai @langchain/core
设置环境变量后,使用 configuration.baseURL 传入自定义端点:
import { ChatOpenAI } from "@langchain/openai";
for (const name of ["OPENAI_API_KEY", "OPENAI_BASE_URL", "MODEL_ID"]) {
if (!process.env[name]) throw new Error(`缺少环境变量: ${name}`);
}
const llm = new ChatOpenAI({
model: process.env.MODEL_ID,
apiKey: process.env.OPENAI_API_KEY,
temperature: 0,
timeout: 60000,
maxRetries: 0,
streamUsage: false,
configuration: {
baseURL: process.env.OPENAI_BASE_URL,
},
});
const response = await llm.invoke("用一句话解释什么是 API");
console.log(response.content);
LangChain JavaScript 官方文档明确给出了 configuration.baseURL 的自定义地址写法,也说明某些代理或第三方服务不支持用于流式用量的 stream_options,此时可以将 streamUsage 设为 false。这项设置只针对流式用量参数,不会修复错误的 Base URL、模型 ID 或 API Key。参数名称和版本行为应以当前 JavaScript 文档为准。
先用 curl 验证:最终 URL 必须以服务文档为准
重要:下面的命令只适用于“Base URL 不包含完整资源路径,且服务端公开支持 OpenAI Chat Completions 格式”的情况。它会主动拼接 /chat/completions;如果服务文档给出的 Base URL 已经包含版本或资源路径,请按文档改写,不能机械复制。
curl "$OPENAI_BASE_URL/chat/completions" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"'"$MODEL_ID"'","messages":[{"role":"user","content":"ping"}],"stream":false}'
自查时只记录最终请求 URL、HTTP 状态码和错误类型,不要把完整 Key 写入终端录屏、日志、Git 或 CI 输出。若 curl 成功而 LangChain 失败,应对比两次请求的最终 URL、模型字段、请求格式和是否启用了 Responses API。
- 401:检查当前终端是否读取到了正确 Key,认证头是否为服务端要求的格式。
- 403:检查账户权限、模型分组、来源限制或额度状态;公开资料没有明确的规则时,以账户文档为准。
- 404:检查 Base URL 是否重复包含版本路径、是否误填完整资源路径,以及模型 ID 是否存在。
- 429:检查服务端返回的限速、并发或额度提示;降低请求频率只能作为自查步骤,不能据此推断具体限额。
- 超时:先使用非流式最小请求,并设置当前版本支持的 timeout,再确认接口是否能返回最小响应。
Base URL、Responses API 和高级能力怎么判断
Base URL 不是一个可以脱离服务文档固定回答的字符串。LangChain 的 SDK 会根据适配器和当前版本组织请求路径;官方 Python 示例把 base_url 作为自定义服务地址传入,JavaScript 示例则通过 configuration.baseURL 传入。因此,应以服务端请求示例和当前 SDK 实际生成的最终 URL 为准,而不是一律添加或删除 /v1。
普通对话建议先使用 Chat Completions 风格的 invoke。LangChain 官方 Python 文档说明,设置 use_responses_api=True 或使用某些 Responses 专属能力后,请求会转向 Responses API;如果兼容服务只实现 Chat Completions,可能出现路径不存在、参数不支持或响应解析错误。只有服务端文档明确支持 Responses API,并且 LangChain 版本与字段匹配时,才进行下一步验证。
流式输出、工具调用、结构化输出、推理字段和多模态输入都要单独确认。LangChain 官方文档还指出,第三方服务的非标准响应字段不一定会被 ChatOpenAI 提取或保留;如果服务扩展了 OpenAI 格式,应考虑其专用 LangChain 集成。
| 现象 | 先查什么 | 暂时不要做什么 |
|---|---|---|
| 普通文本也失败 | Key、Base URL、模型 ID、最终请求路径 | 不要先改工具调用或提示词 |
| curl 成功,LangChain 失败 | SDK 版本、自动拼接路径、请求模式 | 不要直接更换模型猜原因 |
| 普通调用成功,流式失败 | streamUsage、stream_options 和服务端流式格式 | 不要把流式用量错误当成 Key 失效 |
| 文本成功,高级能力失败 | 工具、结构化输出、Responses 和非标准字段支持情况 | 不要把“兼容接口”理解为功能完全等价 |
密钥建议放在环境变量或专用密钥管理系统中。临时变量通常只影响当前终端;持久化变量更方便,但要额外检查 shell 历史、调试日志、CI 输出和代码仓库是否泄露。
参考资料与版本边界
本文以检索到的公开文档为依据:LangChain Python 文档用于核对 ChatOpenAI、base_url、环境变量、stream_usage 和 Responses API;LangChain JavaScript 文档用于核对 configuration.baseURL 与 streamUsage;RunAPI 公开页面仅用于说明其页面公告和接口格式提示,不作为固定 Base URL、模型 ID 或账户权限的来源。
由于 LangChain、OpenAI 兼容网关和账户模型目录都会变化,安装或升级依赖后应重新核对当前文档。公开资料未明确的端点、模型、权限和限速信息,本文不作推断。
常见问题
LangChain 的 Base URL 应该写域名、/v1,还是 /chat/completions?
没有适用于所有服务的固定答案。应复制服务端文档中的 Base URL,并确认 SDK 会把请求发送到哪个最终路径。通常不要把完整的 /chat/completions 资源路径当作 Base URL;/v1 是否保留也不能凭经验判断。
为什么 curl 能调用,LangChain 却返回 404?
先打印或核对两次请求的最终 URL、模型 ID 和请求模式。重点检查 SDK 是否重复拼接版本路径、curl 是否调用 Chat Completions 而 LangChain 使用了 Responses API,以及模型字段是否完全一致。
RunAPI 是否有可以直接复制的 LangChain Base URL?
本文检索到的 RunAPI 公开文档页面没有提供可完整核验的 LangChain Base URL、模型 ID 和账户配置闭环,因此本文不写固定地址。请从当前账户文档复制端点,并先用与文档一致的最小请求验证。
第三方兼容接口需要设置 streamUsage 或 stream_usage 为 false 吗?
不一定。只有服务端不支持流式用量相关的 stream_options,或流式请求因此报参数错误时,才考虑关闭。关闭该选项不会修复错误的 API Key、Base URL 或模型 ID。
ChatOpenAI 能否直接调用所有 OpenAI 兼容模型?
不能保证。ChatOpenAI 主要针对 OpenAI 规范;第三方服务可能只实现部分 Chat Completions,或返回非标准 reasoning、工具调用和结构化输出字段。先验证普通文本,再逐项确认高级能力。
什么时候应该使用 LangChain 的 Responses API?
只有在服务端明确支持 Responses API,并且当前 LangChain 版本的参数与响应格式匹配时再使用。普通兼容网关排错时,先保持非流式 Chat Completions 请求更容易定位问题。
相关阅读
参考资料
- LangChain 官方 Python ChatOpenAI 集成文档(docs.langchain.com)
- RunAPI 公开文档页面
