一个具体的工程场景
你正在开发一个客服 agent,需要让模型输出结构化的 JSON 响应,包含意图、实体和回复文案。你调用了 POST /v1/chat/completions,但返回的数据里总是混着换行、缩进和多余的 key,你需要写一堆正则去清洗。更糟的是,当你想在用户持续对话中加入外部搜索工具时,模型输出和工具返回的数据挤在一起,你分不清哪一段是模型生成的、哪一段是工具返回的。
这个问题的本质是:AI 模型的输出没有一个标准化的、机器可读的容器。而 Responses API 正是为了解决这个问题而出现的。
Responses API 到底指什么
Responses API 是一套约定:它定义了模型输出应该被包装成一个结构化的 Response 对象,包含明确的元数据(如 token 用量、完成原因、工具调用记录)和按类型区分的内容块(如文本块、工具调用块、图片块)。它不是一个具体的 HTTP 端点,而是一种设计模式,目前主要由 OpenAI 在 Assistants API 和 Chat Completions API 的进化版本中推动,兼容 Anthropic 的 Message API 和 Cohere 的 Chat API 也部分遵循这一模式。
在代码层面,一个典型的 Responses API 返回结构如下:

{
"id": "resp_abc123",
"object": "response",
"created": 1712345678,
"model": "gpt-4-turbo",
"choices": [
{
"index": 0,
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": [
{"type": "text", "text": "您好,请问有什么可以帮您?"},
{"type": "function_call", "name": "search_knowledge_base", "arguments": "{\"query\": \"退款流程\"}"}
]
}
}
],
"usage": {
"prompt_tokens": 100,
"completion_tokens": 50,
"total_tokens": 150
}
}
注意这里的 content 是一个数组,每种类型(文本、工具调用、图片等)都独立成块。这种设计使得你不再需要猜测模型输出里哪部分是自然语言、哪部分是工具触发器。
为什么 Responses API 突然成为热词
有三个推动力:
- 多模态输出的需求爆发。单一文本输出已经不够用了。模型同时返回文本和图片、文本和表格、文本和函数调用变得越来越常见。Responses API 通过 content 数组自然容纳了多种输出类型。
- Agent 工作流的标准化压力。当模型需要调用外部工具时,如何区分“模型自己的思考过程”和“工具返回的结果”成了痛点。Responses API 明确分离了模型消息和工具消息,使得 agent 循环更容易实现(例如 OpenAI 的
submit_tool_outputs)。 - 成本透明度要求。企业用户对 token 用量的精确核算需求强烈。Responses API 在每个响应里都包含准确的
usage数据,无需额外计算。
如果你在 2023 年用 Chat Completions API 写过一个简单的聊天机器人,你可能没有注意到输出结构的变化——因为那时模型只返回文本。但今天,几乎所有生产级 AI 应用都在用多内容块响应。

最容易被误解或做错的地方
误区一:Responses API = Streaming API
这是最常见的混淆。Streaming API(如 SSE)是传输方式,Responses API 是数据格式定义。Streaming 可以在 Responses API 之上实现,例如逐块返回 content blocks。但很多开发者在启用 streaming 后,试图手动拼接 response 对象,结果弄丢了 token 统计或工具调用 ID。正确做法:使用 SDK 内置的 streaming 解析,不要自己处理 chunk 边界。
误区二:所有模型厂商的 Responses API 是兼容的
事实是,各厂商在 content block 的类型命名和元数据字段上存在差异。例如 OpenAI 用 function_call,Anthropic 用 tool_use,Cohere 用 tool_calls。迁移时需要适配层。一个常见的失败场景是:把 OpenAI 的响应直接传给 Anthropic 的 agent 框架,导致工具调用解析失败。
误区三:Responses API 能解决所有输出解析问题
并不能。Responses API 只保证数据结构的约定,并不保证模型输出完全符合你的 schema。比如你要求 JSON 格式,模型还是可能返回非法字符。这时你仍然需要额外的验证层(如 Pydantic 或 Zod 解析+纠错)。
实际踩坑案例
某团队在迁移到 Responses API 后,发现函数的 arguments 字段总是被截断。排查后发现是 HTTP 客户端默认对 JSON 做了 2MB 大小的限制,而模型返回的 tool call 参数(包含图片 base64)超过了这个阈值。解决方案是调整客户端的 max_payload_size 配置,并启用响应压缩。
如果你现在要开始实践,第一步应该怎么做
- 确认你使用的模型版本支持 Responses API。OpenAI 的 gpt-4-turbo-preview 及以上版本、Anthropic 的 claude-3 系列、Cohere 的 command-r 系列都支持类似结构。使用最新 SDK 版本。
- 启用 experiments 标志(如果需要)。某些平台(如 Azure OpenAI)需要传递
api-version参数才能启用 content blocks。 - 改写你的解析逻辑。如果你之前直接取
choices[0].message.content字符串,现在需要遍历content数组,按type分支处理。 - 增加 content block 类型的校验。在代码中定义枚举类型(TextBlock, ToolCallBlock 等),不要假设返回类型。
- 添加 unit test。模拟不同 types 的响应,确保解析器正确处理边界情况(如空数组、未知 type)。
学完基础后下一步该往哪条工程路径深入
既然你已经理解了 Responses API 如何规范化模型输出,下一个自然的问题是:如何基于它构建完整的 agent 工作流?具体包括:
- 工具编排(Tool Orchestration):如何将函数定义转换为模型可识别的 function/tool 描述,并正确处理多次工具调用的循环。
- 上下文管理与记忆:Responses API 的
messages数组如何扩展为持久化会话,避免 token 溢出。 - Evals 与测试:如何编写针对多内容块响应的 Assertion,验证工具调用是否按预期触发。
- 成本追踪:基于
usage数据构建计量系统,支持按用户或会话级别的计费。
如果你发现这些方向正是你工作中遇到的瓶颈,那么你已经准备好从“调用 API”过渡到“设计 AI 系统”了。

暂无评论,快来发表你的见解吧