Skip to content

从 Completions 到 Responses:大模型 API 协议演进

随着大模型应用从“聊天机器人”发展到“AI Agent”,模型调用协议也经历了一次重要演进。从最早的文本补全 API,到 ChatGPT 时代的 Chat Completions,再到 Agent 时代的 Responses API,背后反映的是大模型应用形态的变化。

但在实际工程中,一个常见的困惑是:既然 DeepSeek、Qwen 这些模型都宣称“兼容 OpenAI API”,为什么 Codex 不能直接换上 DeepSeek?为什么 Claude Code 反而更容易适配多种模型?这其实都和三代 API 协议的差异有关。

本文总结 /v1/completions/v1/chat/completions/v1/responses 的区别,以及为什么 Claude Code、Codex、DeepSeek 在 API 兼容方面表现不同。

一、大模型 API 的三代演进

整体演进路径是这样的:

text
/v1/completions

/v1/chat/completions

/v1/responses

这不是简单的版本升级,而是模型使用方式的变化:

text
文本生成

聊天交互

智能 Agent

每一代解决的是上一代在新的应用形态下暴露出来的不足。下面分别看这三代 API。

二、第一代:/v1/completions

1. 核心思想

给模型一段文本,让模型继续补全。早期 GPT API 类似高级自动补全。

请求:

text
POST /v1/completions

示例:

json
{
  "model": "text-davinci-003",
  "prompt": "写一个快速排序算法:"
}

模型:

text
输入:
写一个快速排序算法:

输出:
def quick_sort(arr):
    ...

抽象:

text
prompt

模型

completion text

2. 缺点

这个阶段模型并不知道:

  • 谁是用户
  • 什么是系统规则
  • 什么是历史消息

开发者只能手动拼 prompt:

text
你是代码助手

用户:
写一个函数

助手:

维护困难。这一代 API 适合“单次补全”,不适合“持续对话”。

三、第二代:/v1/chat/completions

ChatGPT 时代出现。

1. 核心思想

模型不是补全文本,而是在理解一段对话。

请求:

text
POST /v1/chat/completions

格式:

json
{
  "messages": [
    {
      "role": "system",
      "content": "你是代码助手"
    },
    {
      "role": "user",
      "content": "写一个排序算法"
    }
  ]
}

消息有角色:

text
system
user
assistant

模型知道:

  • 系统要求
  • 用户输入
  • 历史上下文

2. 优势

多轮对话

以前需要自己拼:

text
用户: 你好
助手: 你好
用户: 继续

现在直接用消息数组表达:

text
messages: [
  user,
  assistant,
  user
]

Tool Calling

后来 Chat Completions 增加了对工具调用的支持:

text
用户

模型

调用函数

返回结果

继续回答

例如模型可以返回:

json
{
  "tool_calls": [
    {
      "name": "search"
    }
  ]
}

可以调用:

  • 搜索
  • 数据库
  • API
  • 文件系统

3. 影响

由于简单、生态成熟,大量模型兼容它:

text
DeepSeek
Qwen
Mistral
Groq
Ollama

形成事实标准:

text
OpenAI-compatible API = chat/completions

也就是说,今天说“兼容 OpenAI API”,绝大多数情况下指的就是 /v1/chat/completions 这一代。

四、第三代:/v1/responses

随着 AI Agent 出现,Chat Completions 不够用了。

因为 Agent 不只是回答问题。例如“帮我修复项目”,真实流程是这样的:

text
读取文件

分析代码

修改文件

运行测试

发现错误

继续修复

返回结果

这已经不是简单聊天。于是 OpenAI 推出:

text
POST /v1/responses

请求:

json
{
  "model": "gpt-5",
  "input": "修复我的项目",
  "tools": [
    {
      "type": "computer"
    }
  ]
}

返回:

json
{
  "output": [
    {
      "type": "tool_call"
    },
    {
      "type": "message"
    }
  ]
}

核心变化在于抽象层级。Chat Completions 的流程是:

text
messages

answer

而 Responses 的流程是:

text
input

reasoning

tool_call

tool_result

message

它更像一个任务执行流,而不再是“一问一答”。

五、为什么 Codex 不能直接换 DeepSeek

很多人认为:

text
DeepSeek 兼容 OpenAI API,所以应该可以替换 Codex。

实际上不完全。原因在于协议层。

DeepSeek 主要兼容:

text
/v1/chat/completions

而 Codex 使用:

text
/v1/responses

两者协议不同。例如 Codex 发送:

json
{
  "input": ["..."],
  "tools": ["..."]
}

但是 DeepSeek 期待:

json
{
  "messages": ["..."]
}

字段不匹配。

更重要的是,Codex 不只是调用模型。它依赖一整套 Agent 能力:

text
Responses API
+ Tool Calling
+ Agent Loop
+ 代码执行环境
+ 状态管理

所以这里有一个关键结论:

text
API 兼容 ≠ Agent 兼容

一个模型能在 /v1/chat/completions 上跑通,不代表它能直接支撑一个依赖 /v1/responses 的 Agent 运行时。

六、为什么 Claude Code 可以适配更多模型

这里容易误解:Claude Code 原生不是 /chat/completions。Anthropic 使用的是自己的协议:

text
/v1/messages

但是它更容易通过 Adapter 转换。例如:

text
Claude Code

协议转换层

DeepSeek / OpenAI

转换主要是字段映射:

text
Anthropic:
{
  "messages": []
}

OpenAI:
{
  "messages": []
}

结构接近,转换成本较低。

而 Codex 依赖的 Responses API 是一种新的 Agent 抽象:

text
response items
tool calls
reasoning
state

要把这些映射回老的 /v1/chat/completions,转换成本要高得多。这也是为什么 Claude Code 比 Codex 更容易适配多种模型。

七、CC Switch 做了什么

CC Switch 本质是:在客户端和模型之间增加一个代理层。

架构:

text
Claude Code
Codex
Cursor

CC Switch

-----------------
|       |       |
GPT   Claude  DeepSeek

它主要做三件事。

1. 配置切换

修改:

text
API Key
Base URL
Model
Provider

让客户端无需改动,就能切换到不同模型供应商。

2. 协议转换

例如 Claude 原生走的是:

text
/v1/messages

代理层把它转换成:

text
/v1/chat/completions

流程:

text
请求

解析 JSON

字段转换

调用目标模型

转换返回

返回客户端

3. Tool Calling 映射

不同协议对工具调用的表达不一样,代理层负责转换。例如:

text
Anthropic:
{
  "type": "tool_use"
}

OpenAI:
{
  "type": "tool_calls"
}

代理层就是处理这类字段差异。

八、/v1 为什么一直没有 v2

很多人误解:

text
/v1/chat/completions
/v1/responses

认为 responses 是 v2。不是。

这里的 v1 表示 API 版本。下面的:

text
chat/completions
responses
embeddings
images

是不同功能接口。类似:

text
/api/v1/users
/api/v1/orders

它们不是版本不同,而是同一个 v1 版本下不同的资源接口。/v1/responses/v1/chat/completions 同理,是并存的接口,不是新旧版本关系。

九、总结

三代接口的对应关系如下:

接口时代抽象适合
/v1/completionsGPT 早期文本补全生成文本
/v1/chat/completionsChatGPT 时代消息对话聊天助手
/v1/responsesAgent 时代任务执行流AI Agent

核心变化用一句话概括:

text
Completion      = 帮我写一句话
Chat Completion = 和我聊天
Responses       = 帮我完成一个任务

未来 AI 编程工具的发展方向,也会越来越从 Chatbot 转向 Agent。因此 API 协议也会从“文本生成协议”逐渐演进为“任务执行协议”。

这也是为什么 Codex、Claude Code、Cursor、DeepSeek 在 API 兼容策略上会出现不同路线:它们各自处在三代协议的不同位置,转换的代价天然就不一样。

Last updated: