跳转到内容

协议不匹配详解

「客户端能连上、密钥也没错,但就是报 404 / 400」——绝大多数情况是协议不匹配。 这一页讲清三种协议的差别,以及为什么它们不能互换。

维度 OpenAI Chat Completions OpenAI Responses Anthropic Messages
ZiAI 端点 https://api.ziai.lol/v1/chat/completions https://api.ziai.lol/v1/responses https://api.ziai.lol/v1/messages
鉴权头 Authorization: Bearer Authorization: Bearer x-api-keyAuthorization: Bearer
必需额外头 anthropic-version: 2023-06-01
对话字段 messages input(也接受 messages messages
max_tokens 可选 max_output_tokens,且最小 16 必填
系统提示 messages 里的 system / developer 角色 同左,或 instructions 顶层独立 system 字段
工具调用 tools + tool_calls tools + function_call tools + tool_use / tool_result 内容块
思考控制 顶层 reasoning_effort reasoning.effort(含 encrypted_content thinking: { type, budget_tokens }
响应结构 choices[].message.content output[] + status content[] 块数组 + stop_reason
用量字段 usage.prompt_tokens / completion_tokens usage.input_tokens / output_tokens usage.input_tokens / output_tokens
本站使用它的客户端 ChatBox、CherryStudio、WorkBuddy、ZCode Codex Claude Code、ZCode、CherryStudio

结论:请求体结构、必需字段、响应结构、流式事件全都不一样。把一个协议的地址填给另一个协议的客户端,必然失败。

同样的「你好」,三种协议的请求体长这样:

终端窗口
curl https://api.ziai-demo.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-xxxx" \
-d '{
"model": "模型ID",
"messages": [{"role": "user", "content": "你好"}]
}'

响应(节选):

{
"id": "chatcmpl-xxxx",
"object": "chat.completion",
"choices": [{
"index": 0,
"message": { "role": "assistant", "content": "你好!" },
"finish_reason": "stop"
}],
"usage": { "prompt_tokens": 9, "completion_tokens": 3, "total_tokens": 12 }
}
协议 流式事件形态
Chat Completions data: {"choices":[{"delta":{"content":"你"}}]} 逐块拼接
Anthropic Messages 带类型的生命周期事件:message_startcontent_block_startcontent_block_deltamessage_stop
Responses 带类型的语义事件:response.output_text.deltaresponse.completed

所以「客户端能连上但输出乱掉 / 只出一个字 / 一直转圈」也可能是协议或转换层的问题,而不只是网络问题。

同样是「填地址」,各客户端的规则并不一致 —— 这是 404 的另一个来源:

客户端 你填的 客户端实际请求
ChatBox 主机 https://域名 + 路径默认 /v1/chat/completions https://域名/v1/chat/completions
CherryStudio(自定义 OpenAI 兼容) https://域名/v1 自动补 /chat/completions;也可用 # 结尾填完整地址
WorkBuddy(自定义协议关闭) https://域名/v1 https://域名/v1/chat/completions
ZCode OpenAI 地址 https://域名/v1;Anthropic 地址 https://域名 分别拼 /chat/completions/v1/messages
Codex base_url = "https://域名/v1" https://域名/v1/responses
Claude Code ANTHROPIC_BASE_URL=https://域名 https://域名/v1/messages
CC-Switch(代理接管时) base_url = "https://域名"(前缀) 代理拼 /v1/chat/completions

ZiAI 网关支持多种聊天格式互转:OpenAI Chat、OpenAI Responses、Anthropic Messages 等格式之间可以转换。

这意味着两件好事:

  1. 非 Claude 模型也能通过 /v1/messages 调用 —— 客户端说 Anthropic 协议,后端是 OpenAI 格式渠道时,ZiAI 会转换;
  2. 非 GPT 模型也能通过 /v1/responses 调用 —— 前提是 ZiAI 侧为该渠道开启了对应能力。
  • 我知道我的客户端要求哪种协议(查配置速查表
  • 我用 curl 直接打过那个协议的端点,确认能通
  • 地址的 /v1 层级符合该客户端的拼接规则
  • 模型 ID 是从 /v1/models 或操练场逐字复制
  • 鉴权头正确(Claude Code 用 ANTHROPIC_AUTH_TOKEN
  • Anthropic 协议请求带了 anthropic-versionmax_tokens

全部勾选后仍有问题 → 常见报错速查