Chat Completions → Responses
将 Messages、Choices 和 Chat 流式增量迁移到 Responses Input、Output Items 与事件。
Chat Completions 使用 messages 和 choices 组织对话;Responses 使用 input、Typed Items 和 output 表达输入、工具调用与结果。迁移时不仅要更换端点,还要调整输入结构、响应解析、工具循环和流式状态机。
先确认模型支持 Responses
目标模型对 Responses 字段、事件和工具的支持范围可能不同。迁移前请从模型广场确认模型,并先运行最小文本请求。
是否需要迁移
适合迁移到 Responses 的情况:
- 新项目希望使用统一的 Typed Input 和 Output Items;
- 需要
previous_response_id等多轮状态能力; - 需要 Responses 已支持的内置工具;
- 应用愿意按照 Item 类型处理文本、工具调用和其他输出。
可以继续使用 Chat Completions 的情况:
- 现有应用稳定依赖
messages、choices和 Chat Delta; - 目标模型或所需工具只支持 Chat Completions;
- 当前没有足够回归测试覆盖工具、多轮和 Streaming;
- 迁移收益不足以覆盖响应解析和状态管理的改造成本。
核心变化
| Chat Completions | Responses | 迁移动作 |
|---|---|---|
POST /v1/chat/completions | POST /v1/responses | 更换 Client 方法或请求路径 |
messages | input / Input Items | 保留角色和内容语义,改为 Responses 输入结构 |
| 系统或开发者消息 | instructions 或 Typed Input | 决定指令与对话历史的边界 |
max_completion_tokens | max_output_tokens | 更换字段名 |
response_format | text.format | 移动结构化输出配置 |
choices[].message | output[] Items | 按 Item 和 Content 类型遍历 |
tool_calls | function_call Item | 保留函数名、参数和调用 ID |
| Tool Message | function_call_output Item | 使用对应 call_id 回传结果 |
| Chat Delta | response.* 事件 | 重写流式事件分派 |
prompt_tokens / completion_tokens | input_tokens / output_tokens | 更新 Usage 读取逻辑 |
最小请求 Before / After
{
"model": "MODEL_ID",
"messages": [
{
"role": "system",
"content": "回答要简洁、准确。"
},
{
"role": "user",
"content": "请用一句话介绍 AGTCloud。"
}
]
}使用 OpenAI SDK 时,Client 的 Base URL 仍为 https://api.agtcloud.cn/v1。方法从 client.chat.completions.create(...) 改为 client.responses.create(...)。完整 Python 和 TypeScript 初始化方式请参阅 OpenAI SDK。
迁移响应读取
Chat Completions 通常从第一条 Choice 读取助手消息:
choices[0].message.contentResponses 返回有序的 output[]。其中可能同时包含消息、函数调用、搜索调用或其他 Item。SDK 的 output_text 可以用于读取聚合文本,但需要处理工具或其他输出时,应遍历完整 output。
response.output_text
response.output[]不要假设 output[0] 一定是文本
工具调用或其他 Item 可能出现在文本消息之前。请按照 type 分派,并为暂不识别的 Item 保留日志或兼容分支。
迁移多轮状态
| 方式 | 使用方法 | 注意事项 |
|---|---|---|
| 客户端回放 | 将历史 Input 和 Output Items 继续放入下一次 input | 应用自行控制保存、裁剪和隐私策略 |
| 响应关联 | 下一次请求传入 previous_response_id | 先确认目标模型和接口支持该能力 |
使用 previous_response_id 时,上一轮 instructions 不会自动继承。每一轮仍需要根据应用需要重新设置指令。
迁移后不要同时完整回放同一段历史并再次通过 previous_response_id 引用它,否则可能造成重复上下文。
迁移 Function Calling
工具定义
Chat Completions 将函数定义放在 tools[].function 中:
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询城市天气",
"parameters": {
"type": "object",
"properties": {
"city": { "type": "string" }
},
"required": ["city"]
}
}
}Responses 将函数信息直接放在 Function Tool 对象中:
{
"type": "function",
"name": "get_weather",
"description": "查询城市天气",
"parameters": {
"type": "object",
"properties": {
"city": { "type": "string" }
},
"required": ["city"]
}
}结果回传
- Chat:从
assistant.tool_calls[]读取调用,并追加带tool_call_id的 Tool Message。 - Responses:从
output[]读取function_call,再发送function_call_output,其中call_id必须与原调用一致。
无论使用哪种协议,函数都由你的应用执行。不要直接执行未经校验的参数,也不要把工具异常伪装成正常结果。
迁移 Streaming
Chat Completions 通过每个 Chunk 的 choices[].delta 返回增量,通常以 [DONE] 结束。
Responses 使用具名事件,例如:
response.created;response.output_item.added;response.content_part.added;response.output_text.delta;response.output_text.done;response.completed。
迁移时应将原来的“只拼接文本”逻辑改成事件分派器:先按事件类型处理,再根据 output_index、content_index、item_id 等标识更新对应状态。
断流不等于完成
只有收到完成事件并确认响应状态后,才应把本轮标记为成功。连接中断、失败事件和不完整状态需要独立处理。
迁移 Structured Outputs
Chat Completions 将输出格式配置放在 response_format;Responses 将对应配置放在 text.format。迁移时需要同步修改:
- 请求字段位置;
- JSON Schema 包装结构;
- SDK 的解析辅助方法;
- 拒绝、不完整响应和 Schema 校验失败的处理。
详细字段请分别查看 Chat Completions 和 OpenAI Responses。
迁移 Web Search
两种协议的搜索入口不同:
- Chat Completions 使用
web_search_options,并要求选择支持搜索的模型; - Responses 在
tools中启用支持的 Web Search Tool,并可能返回搜索调用 Item 和引用。
域名过滤、来源列表、用户位置和实时互联网访问等设置取决于所选协议与模型。完整示例请参阅 OpenAI Web Search。
Usage、错误与中断
迁移监控与计费读取逻辑时,至少调整:
| Chat Completions | Responses |
|---|---|
usage.prompt_tokens | usage.input_tokens |
usage.completion_tokens | usage.output_tokens |
usage.total_tokens | usage.total_tokens |
finish_reason | Response、Item 和内容的状态或错误信息 |
同时保留 HTTP 状态码、错误对象和 Request ID。不要只捕获 SDK 异常文本;应用日志应能区分鉴权失败、模型不可见、限流、服务错误和连接中断。
分阶段迁移
迁移最小文本链路
先完成请求创建和文本读取,不启用 Streaming、工具或多轮状态。
改造 Output Item 分派
支持消息与函数调用,并对未知 Item 保持兼容,不直接丢弃。
迁移状态与流式事件
分别验证客户端历史回放、previous_response_id、文本增量、工具参数增量和结束事件。
恢复进阶能力
按照结构化输出、Web Search 和多模态输入的顺序逐项启用,每项都保留独立回归用例。
回归与回退清单
- 普通文本、空输出、拒绝、不完整和失败状态;
- 单工具、多工具、工具失败和参数校验失败;
- 无状态历史回放与
previous_response_id; - Streaming 正常完成、断流和重复事件;
- Structured Outputs 校验失败;
- Usage、错误信息、Request ID、超时和限流;
- 目标模型不支持某项 Responses 能力时,能够切回 Chat Completions。
在生产切换前,为 Chat 与 Responses 保留独立配置和可控开关。确认业务指标、日志和错误处理稳定后,再清理旧解析路径。
下一步
- 使用 OpenAI SDK 配置 Python 或 TypeScript Client;
- 查看文本与对话理解 Responses 的日常调用流程;
- 在 OpenAI Responses 核对完整字段和响应;
- 遇到调用错误时查看 错误与排障。