Base URL 该不该带 /v1?OpenAI SDK 五种配置的路径实验

在 OpenAI JavaScript SDK 中调用 client.chat.completions.create() 时,如果服务端的接口路径是 /v1/chat/completions,baseURL 应填到 /v1。把完整的 /v1/chat/completions 填进去,会让请求再追加一次 /chat/completions。
这条结论来自一次可复现的本地实验。2026 年 10 月 18 日,我们用 OpenAI SDK 7.38.0 和 Node.js 26.0.0 测试了五种地址写法,记录 SDK 实际发出的 HTTP 路径,并核对了该版本的官方源码。实验只连接本机测试服务,没有使用真实密钥,也没有调用线上模型。文中的 200 和 404 都由测试服务按预设路由返回,不能用来证明任何平台的模型可用性或服务质量。
同一段调用,五种地址会发到哪里
测试服务只接受 POST /v1/chat/completions。请求到达这个路径时,它返回固定字符串 LOCAL_FIXTURE_OK;其他路径返回 LOCAL_FIXTURE_ROUTE_NOT_FOUND。所有配置都使用同一个模型占位值和消息正文,关闭 SDK 自动重试,让每种配置只产生一次请求。
下表省略了共同的本机地址 http://127.0.0.1:<端口>,保留输入和实际收到的路径。
|
baseURL 中的路径 |
服务端实际收到的路径 |
本地测试响应 |
|---|---|---|
|
不填路径 |
|
404,缺少 |
|
|
|
200,返回固定响应 |
|
|
|
200,返回固定响应 |
|
|
|
404,重复接口路径 |
|
|
|
404,重复版本路径 |
这五次请求分别说明了三件事。SDK 不会因为你漏写 /v1 就自动补上;这个版本能正确处理 baseURL 末尾的斜杠;把完整接口地址当作 baseURL 会重复追加资源路径。相同的模型字段在五次请求中没有变化,因此这次实验可以把路径错误与模型选择分开观察。
结果与版本化源码一致。SDK 的 Chat Completions 实现 使用 /chat/completions 作为资源路径,再由 客户端的 URL 构造逻辑 与 baseURL 组合。换用其他 SDK 或客户端时,应重新核对它的拼接规则,不能仅凭输入框叫“API 地址”就沿用同一种填写方式。
在自己的电脑上复现实验
准备 Node.js 26.0.0 与 Bun。实验依赖固定为 [email protected];安装依赖需要网络,执行探针时请求仅发往 127.0.0.1。本机端口由系统分配,不需要开放公网端口。
在空目录中安装依赖,再下载并阅读本文的探针代码。
mkdir base-url-probe
cd base-url-probe
bun add [email protected]
curl -fsS https://1zheai.com/blog-assets/base-url-20261018/probe.mjs -o probe.mjs确认代码监听本机地址、使用测试凭据后执行。
node probe.mjs输出包含实际 SDK 版本、运行时间以及五次请求的路径。第二行与第三行配置应返回 LOCAL_FIXTURE_OK,其余三种配置应得到本地 404。如果结果不同,先比较运行时版本、SDK 版本和探针代码,再判断是否发生了版本行为变化。
完整的探针脚本和本次原始结果随文章公开。原始记录保留了失败配置,没有只展示成功的一项。
把路径结论用于真实接入
如果你使用本文版本的 OpenAI SDK,目标服务也提供 /v1/chat/completions,客户端初始化的写法如下。下面是配置示例,本次没有执行这段线上请求。
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'https://1zheai.com/v1',
apiKey: process.env.ONEZHE_API_KEY,
});后续调用还需要两个独立条件。密钥必须来自你实际连接的平台;模型 ID 必须是该平台支持该接口的真实标识。本文的 fixture-only 仅供本地测试,不能复制到线上使用。1折AI 的当前模型入口在模型目录,具体客户端配置在接入文档。
更换模型名称不会自动切换协议。原生 Claude Messages 使用 /v1/messages,请求字段和版本头按其协议定义;可以对照 Claude 官方 Messages 接口。如果某个平台允许通过 OpenAI 兼容接口调用 Claude,那是该平台提供的兼容能力,仍需核对所选模型支持的接口。本文只验证了 OpenAI Chat Completions 的地址拼接,不覆盖 Responses、Messages、图像接口或工具调用。
看到 404,先把完整路径找出来
实际排查时,先记录客户端版本、请求方法和最终 URL 的路径部分。不要把带凭据的完整调试日志直接发给客服,也不要开启会输出 Authorization 头的日志后原样截图。
若路径是 /chat/completions,而服务端要求 /v1/chat/completions,就检查 baseURL 是否漏了 /v1。若路径出现 /chat/completions/chat/completions,应把 baseURL 改回接口前缀。若路径已正确,继续读取返回的错误正文;404 也可能来自不存在的模型、未开放的接口或其他服务端路由,本文实验不能替你排除这些原因。
401 则需要另外核对凭据是否为空、是否失效,以及凭据是否属于当前平台。不要用反复改 URL 来代替查看错误响应。向支持人员反馈时,提供脱敏错误正文、请求时间、客户端与 SDK 版本,以及服务端返回的请求 ID(如有),通常比只发一张“请求失败”截图更有帮助。
配置修正后,再用目标模型做一次你自己的最小请求,并确认实际响应。流式输出、工具调用和其他高级能力需要分别验证,不能由地址拼接实验推断。
编辑说明与修订记录
本文作者为 Joe,由 1折AI 发布。本站同时经营 API 服务。实验结果只用于说明指定 SDK 版本的请求路径行为,不构成对本站或其他平台性能的比较。
2026 年 10 月 18 日实质修订,加入固定版本实验、五组完整结果与复现脚本,替换原先的通用配置说明。原文地址和首次发布时间保留。若发现路径行为与本文不同,请通过关于页面列出的联系方式反馈,并附上版本与脱敏路径。
