Chat Completions 和 Messages API 区别

最后更新: 2026-07-16

OpenAI 的 chat completions 和 Anthropic 的 Messages 是两种独立的请求协议,状态处理方式一样(都不留服务端状态),但必填参数、system 字段位置、工具调用结构、流式事件格式这些实打实影响代码的细节不一样。kkaiapi 的 /v1/chat/completions 和 /v1/messages 都能打全部目录模型,一个 Key 两条协议都能用。

先说结论:一个事实标准,一个独立方言

Chat completions(POST /v1/chat/completions)是几乎所有工具都在说的协议:一个无状态的 messages 数组进去,一个 choices 数组出来。OpenAI 2023 年发布了它,后来成了行业的通用语,几乎每一家厂商、每一个中转网关都实现了它,这也是"OpenAI 兼容"这个说法在实践里的真实含义。 Messages(POST /v1/messages)是 Anthropic 自己的原生协议:精神上和 chat completions 相似,但一些承重的细节不一样——max_tokens 是必填项,system 是顶层字段而不是一个角色,内容是类型化的 block,还有自己的一套流式事件词汇。Claude 原生的工具链说的是这套协议。 OpenAI 另外还有一个更新的 Responses API(POST /v1/responses),定位是 chat completions 的后继者,加了服务端会话状态和内置工具。这不是本页要展开对比的重点:kkaiapi 目前提供的是 /v1/chat/completions 和 /v1/messages 这两种无状态协议,Responses 不在当前文档记录的接口范围内,需要这个协议的工具应当继续对着 OpenAI 官方,或者留意 kkaiapi 文档后续是否加上支持。

两种协议逐项对照

下表压缩了真正会改动代码的差异,以 2026 年 7 月两家厂商现行文档为准核实。

以两家厂商 2026 年 7 月现行文档为准;经翻译的网关可能放宽厂商特有细节,如鉴权头形式
维度Chat CompletionsMessages(Anthropic)
端点POST /v1/chat/completionsPOST /v1/messages
状态无状态;客户端每次重发历史无状态;客户端每次重发历史
输入messages 数组,带 rolemessages 数组;system 是顶层字段
输出choices[].messagecontent 数组,类型化 block
必填参数model、messagesmodel、messages、max_tokens
system 提示词一条 role 为 system 的消息顶层 system 字段
工具经 tools[] 的函数调用tool_use block 出,tool_result block 入
结束信号finish_reasonstop_reason(end_turn、tool_use、max_tokens)
用量字段prompt_tokens、completion_tokensinput_tokens、output_tokens
流式SSE 分块,choices[].delta带名字的 SSE 事件(message_start、content_block_delta……)
鉴权头Authorization: Bearerx-api-key 加 anthropic-version

差异落到代码里意味着什么

这两种无状态协议看起来相似,真正移植的时候才发现不一样。Anthropic 在每次请求上要求 max_tokens,OpenAI 这边有默认值。Anthropic 把 system 提示词从 messages 数组里拎出来,放进一个顶层字段,还强制 user/assistant 严格交替。工具调用流程在结构上也不一样:chat completions 在 assistant 消息上返回 tool_calls,结果作为 role 为 tool 的消息传回去;Messages 把 tool_use block 嵌进 assistant 的 content,结果作为 tool_result block 放进下一条 user 消息里。流式解析器在两者之间也不能复用:一个吐 delta 分块,另一个吐一套带名字的事件。

# 1) Chat completions:无状态,可移植
client.chat.completions.create(
    model="gpt-5.5",
    messages=[{"role": "system", "content": "回答要简洁。"},
              {"role": "user", "content": "总结这份文件。"}])

# 2) Messages:Anthropic 方言
anthropic_client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,                # 必填
    system="回答要简洁。",           # 顶层字段,不是一个角色
    messages=[{"role": "user", "content": "总结这份文件。"}])

kk 这边:两种协议都能打全部目录模型

kkaiapi 是把两种协议都实现了的中转:/v1/chat/completions 接受 OpenAI 形状的请求,对目录里任意模型都能用;/v1/messages 接受 Anthropic 形状的请求,同样对目录里任意模型都能用。这不只是理论上的双协议支持——Claude Code 说的就是 Messages 协议,而 kkaiapi 后端对 DeepSeek、智谱 GLM、月之暗面 Kimi、MiniMax、通义 Qwen 这些国产渠道都实现了协议转换层:收到 Messages 格式的请求后翻译给对应上游,拿到响应再翻译回 Messages 格式,这一点在 Claude Code 换国产模型跑法那篇里已经核实过,是网关 Go 后端的真实能力,不是理论描述。 换句话说,选哪种协议不再等同于选哪家厂商。一个 Claude 原生的 Agent 工具经 /v1/messages 打过来,能路由到 GLM 或 DeepSeek;一个 OpenAI SDK 经 /v1/chat/completions 打过来,也能路由到 Claude。协议是接口形状,模型字段才是真正决定谁来推理的那个值。

# chat completions 形状
curl -s https://api.kkaiapi.com/v1/chat/completions \
  -H "Authorization: Bearer $KKAIAPI_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"claude-sonnet-4-6","max_tokens":8,
       "messages":[{"role":"user","content":"回复 ok"}]}'

# messages 形状
curl -s https://api.kkaiapi.com/v1/messages \
  -H "x-api-key: $KKAIAPI_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{"model":"claude-sonnet-4-6","max_tokens":8,
       "messages":[{"role":"user","content":"回复 ok"}]}'

2026 年新写代码该选哪种协议

默认选 chat completions。这是能被普遍提供的协议,每一个网关、代理、自部署运行时都接受,也是能让模型选择保持为一个配置值的写法。把集成结构设计成 base_url 和模型 ID 都来自配置,同一份代码就能按字符串寻址 GPT、Claude、DeepSeek 或 Gemini 家族的模型。 工具本身就是 Claude 原生的时候选 Messages,经一个实现了这套协议的端点路由,能拿到网关的经济性而不用重写代码。kkaiapi 的 /v1/messages 就是为这个场景准备的:Anthropic SDK 只改一个 base_url,行为不用改。 如果自己在维护一个别人会拿去接自己端点的工具:优先说 chat completions,把其它协议做成可选项,这正是多数成熟多协议网关遵循的模式。

常见问题

Chat Completions 和 Messages API 最核心的区别是什么?

同样都是无状态协议,但承重细节不同:Messages 要求 max_tokens 必填,system 提示词是顶层字段而不是一条消息,角色必须严格交替,工具调用走类型化的 content block(tool_use 出、tool_result 入),流式用带名字的 SSE 事件,stop_reason 代替 finish_reason。

kkaiapi 支持 Messages 协议吗?

支持,/v1/messages 是网关文档记录的接口,和 /v1/chat/completions 一样能打全部目录模型。这不只是协议转换的理论能力——Claude Code 换国产模型那篇文章已经核实,后端对 GLM、DeepSeek、Kimi、MiniMax、Qwen 等国产渠道都做了 Messages 协议的双向翻译。

能用 Chat Completions 的写法调用 Claude 吗?

能,经一个做协议翻译的网关。kkaiapi 接受对 Claude ID 的 chat-completions 请求,在网关内部转换成 Anthropic 的协议格式再转发,工具调用和流式都覆盖。反过来也成立:Anthropic SDK 指向网关,同样能经 /v1/messages 打到非 Anthropic 的模型。

国产模型也能走 /v1/messages 吗?

能。kkaiapi 的协议转换层不区分模型厂商,GLM、DeepSeek、Kimi、MiniMax、Qwen 收到 Messages 格式的请求后,由网关翻译成对应上游认得的格式,响应再翻译回 Messages 格式返回,调用方全程只看到标准的 Messages 协议往返。

什么情况下必须用 OpenAI 的 Responses API?

需要服务端会话状态、内置工具(网页搜索、代码解释器等)或者工具本身强制要求这个协议(比如 Codex CLI)的场景。kkaiapi 目前不提供 /v1/responses,这类工具应当继续对着 OpenAI 官方,或者关注网关文档后续的接口范围变化。

两种协议下,模型的实际输出会不一样吗?

协议只决定请求和响应的形状,不改变模型本身的行为。同一个模型 ID,经 chat completions 或经 Messages 调用,推理逻辑是同一个上游在做,差异只在参数怎么传、返回怎么解析。