如果你经常折腾 Codex、Claude Code、Qwen Code、OpenCode、Cherry Studio、CC Switch 或各种中转 API,大概率见过这些错误:
401 Unauthorized404 Not Found400 Bad Request429 Too Many Requestsstream closedthinking block must be passed backmodel not found最让人困惑的是:同一个 Key 在 A 工具里能用,换到 B 工具就报错。
最近 NodeLoc 上有人整理了几十篇 AI 工具自定义 API 教程,LINUX DO 里也长期有人讨论 Codex、Claude Code、DeepSeek 与各种代理层的协议兼容问题。把这些案例放在一起看,会发现很多问题根本不是“模型挂了”,而是大家把“OpenAI 兼容”理解得太宽了。
这一篇整理一套我认为更通用的判断方法。
一、先记住:Base URL、Endpoint、Protocol 是三件事
很多配置界面只给你三个输入框:
Base URLAPI KeyModel于是很容易产生一种错觉:只要服务商说“OpenAI Compatible”,把地址填进去就一定能工作。
实际上真正请求至少包含三层:
Base URL + Endpoint + Request / Response Schema例如:
https://api.example.com+ /v1/chat/completions+ Chat Completions JSON和:
https://api.example.com+ /v1/responses+ Responses API JSON虽然都可能属于“OpenAI 风格 API”,但它们不是同一个接口。
二、Chat Completions 与 Responses 不是换一个路径就行
OpenAI 当前官方 Quickstart 已经以 Responses API 为主要示例:
const response = await client.responses.create({ model: "gpt-5", input: "Hello"});而传统 Chat Completions 通常是:
{ "model": "...", "messages": [ {"role": "user", "content": "Hello"} ]}关键区别不只是字段名。
Responses 体系还会涉及:
input/ output items;- 工具调用事件;
- reasoning item;
- streaming event 类型;
- response state;
- background / tool 等能力。
所以一个只实现 /v1/chat/completions 的第三方网关,即使能让普通聊天客户端工作,也不代表它能完整承载依赖 Responses API 的 Agent 客户端。
这类问题特别容易出现在 Coding Agent 上,因为 Agent 不只是“问一句、答一句”,还需要:
模型输出→ 工具调用→ 工具结果→ 再传回模型→ 继续推理只要代理层在其中一步丢字段,就可能失败。
三、Anthropic Messages 又是另一套协议
Claude Code 生态经常使用 Anthropic Messages 风格接口。
这意味着有些中转层会做:
Anthropic Messages ↓协议转换器 ↓OpenAI / DeepSeek / Qwen endpoint问题就出在“协议转换”不是简单改字段名。
例如 reasoning / thinking 数据如果需要在后续轮次原样带回,而代理层没有保留,就可能出现社区里常见的:
The content[].thinking ... must be passed back所以看到 400 时,不要第一反应就认为 Key 错了。
400 通常更像是:请求已经到服务端了,但请求体语义不符合它的预期。
四、我会怎么快速判断 401 / 404 / 400 / 429
401:先查认证
重点看:
- Key 是否过期;
- Header 是不是
Authorization: Bearer ...; - 有些服务是否要求
x-api-key; - Key 是否绑定来源 IP;
- 账号是否有该模型权限;
- 中转站是否把上游认证覆盖掉了。
最小测试:
curl -i https://your-api.example/v1/models \ -H "Authorization: Bearer $API_KEY"如果连最简单的模型列表都 401,就先别碰客户端配置。
404:优先查 URL 拼接
最常见的是 /v1 重复或缺失。
例如客户端内部已经会补:
/v1/chat/completions你却把 Base URL 写成:
https://example.com/v1/chat/completions最终可能变成:
https://example.com/v1/chat/completions/v1/chat/completions也有工具要求 Base URL 填到 /v1,另一些只要域名。
所以配置第三方 API 时,第一件事不是抄别人截图,而是确认:
这个客户端到底会自动拼什么路径?
400:查协议和字段
400 的常见原因:
- 客户端发 Responses,但服务只支持 Chat Completions;
- reasoning 字段格式不兼容;
- tool call 的字段不完整;
- thinking block 没有回传;
- 不支持某种 multimodal content;
- 模型名被错误映射。
此时最有效的方法是抓实际请求,而不是盲改 Base URL。
429:不一定只是“余额不足”
429 可能代表:
- RPM;
- TPM;
- 并发限制;
- 单模型限流;
- 免费渠道共享池拥堵;
- 上游 429 被中转原样转发;
- 代理层自己的防滥用策略。
所以看到 429 最好同时记录:
时间模型并发数输入 token输出 token请求间隔Response Headers否则你很难知道到底撞的是哪一层限制。
五、所谓 OpenAI-compatible,应该拆成兼容矩阵
Qwen 官方文档会明确说明可以通过 vLLM / SGLang 暴露 OpenAI-compatible API,这种“兼容”非常有价值,但依然需要看具体框架版本与功能。
我更建议把兼容性理解成一个矩阵:
| 能力 | 是否支持 |
|---|---|
/v1/models | ✅ / ❌ |
/v1/chat/completions | ✅ / ❌ |
/v1/responses | ✅ / ❌ |
| Streaming | ✅ / ❌ |
| Tool Calling | ✅ / ❌ |
| Reasoning | ✅ / ❌ |
| Vision | ✅ / ❌ |
| JSON Schema | ✅ / ❌ |
| MCP / Agent Loop 所需事件 | ✅ / ❌ |
这样就不会再用一句“支持 OpenAI API”概括所有能力。
六、最小可复现请求,比“换十个客户端试”更有效
遇到问题时,我建议按这个顺序测。
第一步:模型列表
curl https://api.example.com/v1/models \ -H "Authorization: Bearer $API_KEY"确认:
- DNS;
- TLS;
- Key;
- 基础路由。
第二步:最小 Chat Completions
curl https://api.example.com/v1/chat/completions \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model":"your-model", "messages":[{"role":"user","content":"reply ok"}], "stream":false }'第三步:再测 Streaming
如果非流式能用,流式不能用,问题范围立刻缩小很多。
第四步:再测 Tool Calling
Agent 客户端最依赖的通常就是这里。
第五步:最后才接 Codex / Claude Code / GUI 客户端
因为一旦进入完整客户端,会多出:
- 本地配置;
- 自己的默认参数;
- 模型映射;
- 插件;
- 代理;
- MCP;
- Session state。
变量太多,不适合做第一步排障。
七、建议给自己的 API 配置做一张“能力卡”
如果你经常切模型,我建议不要只记录:
地址 + Key + 模型名而是记录:
provider: examplebase_url: https://api.example.com/v1protocol: chat_completions: true responses: false anthropic_messages: truefeatures: streaming: true tools: true reasoning: partial vision: falselimits: rpm: unknown context: 262144verified_at: 2026-08-15这张小卡片会比收藏几十张“配置成功截图”有用得多。
尤其是免费 API、中转站和社区渠道变化非常快,最后核验时间一定要写。
八、社区教程最有价值的不是“照抄配置”,而是暴露真实故障
NodeLoc 那篇 AI 工具自定义 API 教程整理里提到 401、404、429、流式中断等常见问题;LINUX DO 的大量实战帖则会暴露一些文档里不容易碰到的组合问题,例如:
- Codex + 第三方代理;
- Claude Code + OpenAI 风格模型;
- DeepSeek reasoning;
- 路由器二次协议转换;
- CC Switch / CPA 多层代理。
我认为这些社区内容最适合拿来做问题样本库,而不是当永远正确的配置说明。
因为客户端版本、模型 API、代理层实现都在快速变化。
真正稳的做法应该是:
社区发现问题 ↓官方文档确认协议 ↓最小请求复现 ↓抓请求 / 响应 ↓定位是哪一层不兼容这套方法比“换一个神秘 Base URL 再试试”可靠得多。
参考资料
- NodeLoc:整理了一个 AI 工具自定义 API 中文教程仓库,已经补到 47 篇
https://www.nodeloc.com/t/topic/99597 - LINUX DO:Codex / DeepSeek 接入与协议转换相关社区讨论
https://linux.do/t/topic/2128715 - OpenAI API Quickstart(Responses API)
https://platform.openai.com/docs/quickstart/make-your-first-api-request - OpenAI API:Data controls / endpoint differences
https://platform.openai.com/docs/models/default-usage-policies-by-endpoint - Qwen 官方文档:OpenAI API Compatibility
https://qwen.readthedocs.io/zh-cn/latest/getting_started/quickstart.html - NodeLoc 帖子提到的教程仓库
https://github.com/18534516725/llm-api-setup-guides
本文从社区常见故障中提炼问题模型,再结合官方接口文档重新组织,不是对任意单篇社区教程的复制或同义改写。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时