openai与claude响应格式

Claude 的 Messages API 与 OpenAI 的 Responses API

前者是无状态(Stateless),每次对话会将历史记录传回服务端,利用promptcaching技术(大模型服务器의网关会计算你这段历史文本的哈希值(Hash),当发现前面的字符和之前一致时,会从内存的 KV Cache读取,而不是重新计算)。

前者第二个特点是结构上的,核心差别就是claude选择使用数组存储,称之为 (Content Blocks),里面按时间顺序并列存放不同的“块”(如思维链块、文本块、工具调用块)。这里可以和传统的openaiCompletions api进行对比思考,传统的Completions是将对话存入一个”message”对象的字段下,”message”对象内包含”content””reasoning_content””role”等字段。

但核心问题就是,JSON 语法绝对不允许出现重复的键(Key),如果单次对话出现多次工具调用或思考,Completions很难正确表示这个过程。

我的分析是,旧的Completions还停留在与模型对话一问一答的形式,而现在agent通常一次对话包含多次工具调用或模型思考,因此Completions不再适用,从而claude选择使用数组存储多个json对象,每个json使用type区分块的功能

后者结构上沿用和Claude相同的设计,使用json数组实现对对话内容的存储,每次请求和响应只会包含最新的一轮对话,而不像claude完整的历史记录,每个Response都会包含一个id,从而支持随时回滚;而item的id可以类比claude的type,说明单次的功能。

Plaintext

1
2
3
4
5
6
7
[第 1 轮对话]
Response (最顶层对象) ──>【你的本地数据库存它!】id: "**resp_A1B2C3...**"

└── output (内部数组)
├── Item 1 (思考块) ──> id: "**item_thinking_001**"
├── Item 2 (工具调用) ──> id: "**item_tool_002**"
└── Item 3 (最终回复) ──> id: "**item_text_003**"

后者最大的特点是在服务端是有状态(Stateful)工具调用和上下文历史管理完全托管在云端服务器

这样的好处有:

  1. 发新请求时,不用反复传完整的聊天记录,只要带上上一次回复的 previous_response_id,服务端会自动在后台回溯、拼接历史,甚至自动触发上下文压缩(Compaction)
  2. 云厂商将网络搜索、代码解释器等工具直接托管在云端。在单次 API 请求的生命周期内,模型如果发现需要联网或跑代码,会在云端沙盒里自己反复调用并纠错,跑完整个智能体循环后,直接把最终成果包吐给客户端,客户端只负责“解析最终数据”。
  3. 模型方面,openai可以因此保护模型的隐藏推理链(Reasoning Traces),OpenAI 就可以把所有的推理中间态完美地封锁在自己的云端服务器里,客户端只能拿到剥离后的干净结果。
  4. 数据方面,一旦完全托管在服务端,由于数据是由 OpenAI 的数据库统一规范存储的,服务器在计算 KV Cache 的持久化和重用时,可以做到对齐和命中

但这样也有坏处:

由于是云端调用工具,除了 Token 费,调用内置的联网搜索、代码沙箱通常需要额外支付固定通道费或容器会话费

image-20260527180345112

prompt caching

kvcache的原理不多赘述,简单来说,就是大模型会把kv矩阵计算的值存储起来,再次遇到历史字符时就不用计算了,只计算新字符的矩阵,最后拼接起来。

对于Completions API和Anthropic 官方的 Messages API,他们每次请求与详细都会传输完整的上下文,因此为了节省token的消耗,prompt caching便是关键

这里可以参考提示缓存 |OpenAI API

模型提示通常包含重复内容,如系统提示和通用指令。OpenAI 将 API 请求路由到最近处理过相同提示的服务器,这使得它比从零开始处理提示更便宜、更快。提示缓存可将延迟降低高达80%,输入令牌成本降低高达90%。提示缓存会自动处理你所有的 API 请求(无需修改代码),且没有额外费用。

缓存命中只能针对提示内的精确前缀匹配。

image-20260527185035144

工作流程

缓存功能对于1024个token及以上的提示会自动启用。当您发送API请求时,会执行以下步骤:

1.根据提示词初始前缀计算哈希值,去内存的 KV Cache 索引表里检索。

2.如果找到匹配的前缀,系统会使用缓存结果。

kv的存储

它最初在 GPU 显存(VRAM)里,但为了存更久,会被“吐”到 GPU 本地的 NVMe SSD 硬盘或内存中。

大模型的显存(VRAM)是极其昂贵且稀缺的资源。如果把所有用户的 KV 缓存都永久塞在 GPU 显存里,GPU 瞬间就会爆显存(OOM)。因此,厂商引入了分层存储架构:

  • 热缓存(In-Memory 状态):当模型刚处理完你的请求时,生成的 KV 张量确实老老实实呆在 GPU 显存(VRAM) 或该服务器节点的 系统内存(RAM) 中。因为读写速度最快,随时准备应对你几分钟内的下一轮对话。

  • 冷缓存(Extended 状态):当缓存需要保存几小时甚至 24 小时时,服务器会把这些 KV 张量进行加密,然后从珍贵的显存中释放出来,转储到 GPU 本地服务器的高速 NVMe SSD 硬盘 上。

    当你下一次请求命中缓存时,服务器会以极快的速度把加密的 KV 张量从本地硬盘重新加载(Load)回 GPU 显存中。虽然比纯显存慢一点点,但比起让大模型重新推理一遍几万字的输入,速度依然快了 80% 以上。

openai Completions API和Responses API区别

1. 响应数据结构(JSON)对比

两者的最直观区别在于返回的 JSON 报文层级和字段设计。

传统的 Completions API (以 Chat Completions 为例)

在传统规范中,模型生成的内容被深度嵌套在 choices 数组中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"id": "chatcmpl-123",
"object": "chat.completion",
"created": 1716584520,
"model": "qwen-plus",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "你好!请问有什么我可以帮你的?"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 9,
"completion_tokens": 12,
"total_tokens": 21
}
}
  • 代码提取路径response.choices[0].message.content
  • 痛点:层级过深;由于早期的设计允许返回多个结果(通过 n 参数控制 choices 的数量),导致普通的单次对话也必须套一层数组。

全新的 Responses API

为了简化代码并原生支持更复杂的 AI 行为,新规范将结构打平,引入了 output 概念:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"id": "resp_123",
"object": "response",
"model": "qwen3.5-122b",
"output": [
{
"type": "message",
"reasoning": "用户询问两者的区别,我需要用表格和对比清晰展现...",
"message": {
"role": "assistant",
"content": "两者的主要区别在于..."
}
}
],
"usage": {
"prompt_tokens": 15,
"completion_tokens": 45,
"total_tokens": 60
}
}
  • 代码提取路径:在新版 SDK 中,通常可以直接通过 response.output_text 拿到最终文本。
  • 亮点原生支持深度思考(Reasoning)。当使用具备类 o1/Qwen3.5 等带有思维链(CoT)功能的推理模型时,其思考过程会直接作为平级的 reasoning 字段输出,无需再像以前那样通过特殊的 content 拼接或不透明的魔改字段来传输。

2. 核心维度深度对比

维度 Completions API (传统) Responses API (新一代)
设计定位 纯文本生成 / 简单对话交互 彻底面向智能体 (Agentic Loop) 和新型推理模型设计
结构复杂度 较高。嵌套在 choices[0].message 较低。外层通常直接暴露 output 或扁平化字段
思维链支持 (Reasoning) 较弱。通常需要占用 content 空间或使用魔改字段透传 原生支持。拥有独立的 reasoning 字段,与最终回答完美分离
多步骤工具调用 (Tool Call) 复杂。多轮 Tool 调用需要开发者在代码里频繁手动拼装、维护上下文历史 原生自动化。支持单次请求内模型自主进行多步工具调用(如网络搜索、执行代码)并直接返回最终 Response
存储与状态保持 默认无状态(Stateless),每次交互需全量上传历史记录 部分环境支持原生上下文状态保持(Stateful),降低长对话的 Token 传输成本

Anthropic 官方的 Messages API 规范

样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"id": "msg_01A4zFr95E9A3daS7kL28xWq",
"type": "message",
"role": "assistant",
"model": "claude-3-7-sonnet-20250219",
"content": [
{
"type": "text",
"text": "没问题,我正在为您查询数据库中状态为活跃的前5个用户。"
},
{
"type": "tool_use",
"id": "toolu_01827391aBcDeFgHiJk",
"name": "query_database",
"input": {
"sql": "SELECT user_id, username FROM users WHERE status = 'active' LIMIT 5;"
}
}
],
"stop_reason": "tool_use",
"stop_sequence": null,
"usage": {
"input_tokens": 420,
"cache_creation_input_tokens": 350,
"cache_read_input_tokens": 0,
"output_tokens": 85
}
}

核心对比矩阵

维度 Claude 响应格式 (Messages API) OpenAI Responses API
设计核心 富内容块 (Rich Content Blocks) 驱动 智能体循环 (Agentic Loop) 与托管工具驱动
基础数据对象 消息 (messages) 与 内容块 (content) 项 (items) 与 响应对象 (response)
多轮状态管理 无状态 (Stateless):需由客户端每次回传完整上下文(配合 Prompt Caching 优化成本) 有状态 (Stateful):支持通过 previous_response_id 在服务端自动链式追踪状态
工具调用机制 客户端编排:模型返回 tool_use,开发者在本地执行后用 tool_result 回传 服务端托管:一次请求内,服务端自动运行多轮内置工具(Web 搜索、代码执行、MCP等)
结构化输出 支持 JSON Schema / 借助 SDK 的 messages.parse 确保强一致性 原生支持强类型的 Structured Outputs 和自动修复

核心差异深度解析

1. 返回数据结构:Content Blocks vs Output Items

  • Claude 的响应格式(块结构)

    Claude 的核心创新在于将响应内容拆解为一个个并列的 Content Block(内容块)。一条响应的 content 是一个数组,里面可以同时包含思维链(thinking)、文本、工具调用等多种类型。

    JSON

    1
    2
    3
    4
    5
    "content": [
    { "type": "thinking", "thinking": "用户需要计算..." },
    { "type": "text", "text": "好的,我为你算一下。" },
    { "type": "tool_use", "id": "toolu_123", "name": "calculator", "input": {...} }
    ]

    这种设计的优势在于透明度高、扩展性极强,完美融合了文本、多媒体(PDF/图片)和原生推理。

  • OpenAI Responses API(对象与项结构)

    Responses API 彻底抛弃了早期 Chat Completions 繁琐的 choices[0].message 嵌套,返回一个具有独立 idresponse 对象,其内部核心是 output 数组,由各种类型的 Item(项) 组成。

    1
    2
    3
    "output": [
    { "id": "item_abc", "type": "message", "message": { "role": "assistant", "content": [...] } }
    ]

    它在顶层解耦了 instructions(系统指令)和 input(用户输入),语义更加符合现代 Agent 架构。

2. 状态与多轮对话管理

  • Claude:客户端保留 + 提示词缓存 (Prompt Caching)

    Claude API 本身是无状态的。这意味着做多轮对话时,你必须把之前的聊天历史全部打包传回去。

    巧妙的优化: 尽管每次都要重传历史,但 Claude 提供了极其强大的 Prompt Caching(瞬时缓存)。只要历史对话没有变,重复传入的部分会直接命中缓存,不仅响应速度极快,还能帮你省下高达 90% 的输入 Token 费用。

  • OpenAI Responses API:服务端自动追踪 + 引用 ID

    Responses API 引入了真正的“有状态”模式。你不需要在客户端维护一个长长的数组,你只需要传入当前最新的用户输入,并附带上一次的 previous_response_id

    Python

    1
    2
    3
    4
    5
    response2 = client.responses.create(
    model="gpt-5",
    previous_response_id=response1.id,
    input="那它的常住人口是多少?"
    )

    OpenAI 的服务器会自动在后台保留和拼接历史,甚至在上下文过长时自动触发服务端压缩 (Compaction),免去了开发者手动管理长上下文的痛苦。

3. 工具调用与智能体编排 (Tool Use & Agentic Loop)

  • Claude:协作式编排

    当你给 Claude 绑定自定义工具时,交互是“回合制”的:客户端发请求 $\rightarrow$ Claude 返回 tool_use 块并中断请求 $\rightarrow$ 你的代码在本地执行该工具 $\rightarrow$ 你的代码把 tool_result 发回给 Claude $\rightarrow$ Claude 给出最终文本。这种模式下,控制权完全在开发者手里,你可以非常安全地在本地读取数据库或执行敏感操作。

  • OpenAI Responses API:全面托管的自动循环

    Responses API 的最大杀手锏是它的 Agentic by default(默认智能体化)。它把工具调用的控制权收归到了云端。

    它内建了诸如 Web Search(网络搜索)、File Search(文件搜索)、Code Interpreter(代码解释器)以及远程 MCP(模型上下文协议)服务器。当你发出一个请求时,模型可以在一次 API 调用的生命周期内,自己在云端反复调用多次工具,直到得出完美答案。开发者不需要写任何多轮编排的代码。

参考资料

Data controls in the OpenAI platform

Prompt caching | OpenAI API