一、为什么现在要关注 Responses API

如果你的项目只是做单轮问答、简单客服、摘要生成或翻译功能,原有的 Chat Completions API 仍然可以继续运行,短期内没有必要为了“接口更新”而立刻重构。但如果是新项目,或者项目已经开始涉及多轮对话、工具调用、结构化输出、多模态输入、Agent 工作流,那么直接从 Responses API 开始会更稳妥。

OpenAI 官方迁移方向已经很明确:Responses API 正在成为新一代统一接口。GitHub 上也已经出现面向 Completions / Chat Completions 到 Responses API 的迁移工具包,这说明接口演进并不是简单换个名字,而是为了适配更复杂的 AI 应用开发模式。

在模型选择上,示例可以继续使用 gpt-5.5 作为主力模型。复杂任务则需要结合 reasoning 配置、上下文预算、工具调用方式来调优。如果企业同时接入 Claude Opus 4.8、Gemini 或其他模型,也应该提前考虑多模型切换和调用层抽象,而不是把模型名称写死在业务代码里。

二、旧写法:Chat Completions API

很多历史项目仍然采用下面这种写法:

from openai import OpenAI

client = OpenAI(api_key="YOUR_API_KEY")

completion = client.chat.completions.create(
    model="gpt-5.5",
    messages=[
        {"role": "system", "content": "你是一个严谨的技术助手。"},
        {"role": "user", "content": "解释一下 Responses API 和 Chat Completions 的区别。"}
    ],
)

print(completion.choices[0].message.content)

这套接口的优点是简单直观:开发者传入 messages,再从 choices[0].message.content 里取出模型返回文本。对于普通聊天机器人来说,这种结构非常容易理解。

但问题也很明显。随着 AI 应用从“聊天框”变成“任务执行系统”,模型返回结果不再只有一段文本。它可能包含工具调用、结构化 JSON、多模态结果、文件检索结果、推理摘要,甚至是多步骤 Agent 执行状态。继续在 Chat Completions 上叠字段,会让代码越来越难维护。

三、新写法:Responses API

迁移到 Responses API 后,最小调用方式可以改成下面这样:

from openai import OpenAI

client = OpenAI(api_key="YOUR_API_KEY")

response = client.responses.create(
    model="gpt-5.5",
    input=[
        {
            "role": "developer",
            "content": "你是一个严谨的技术助手。"
        },
        {
            "role": "user",
            "content": "解释一下 Responses API 和 Chat Completions 的区别。"
        }
    ],
)

print(response.output_text)

最小迁移路径可以总结为五步:

  1. client.chat.completions.create 改成 client.responses.create
  2. messages 改成 input
  3. system 指令迁移到 developer 或更适合项目的指令位置;
  4. choices[0].message.content 改成 output_text
  5. 暂时不要一次性重构 stream、tool call、structured output,先保证文本链路跑通。

真正稳妥的迁移方式,不是把所有代码一次性推倒重来,而是先完成“单轮输入—文本输出—错误处理—日志记录”的最小闭环。等基础链路稳定后,再逐步迁移流式输出、工具调用和结构化输出。

四、返回结构最容易踩坑

Chat Completions 的返回路径比较固定,很多项目会在业务代码里到处写:

completion.choices[0].message.content

迁移到 Responses API 后,不建议继续让业务层直接依赖具体返回结构。更好的方式是封装一个统一解析函数:

def get_model_text(resp):
    if hasattr(resp, "output_text") and resp.output_text:
        return resp.output_text

    texts = []
    for item in getattr(resp, "output", []):
        for content in getattr(item, "content", []):
            if getattr(content, "type", "") == "output_text":
                texts.append(content.text)

    return "\n".join(texts)

这样做的好处是后续更容易兼容不同模型、不同返回类型和不同接入层。尤其是当项目后期要支持 GPT-5.5、Claude Opus 4.8、Gemini 或国产模型时,业务代码不需要到处修改,只需要调整模型调用层。

五、多轮上下文不要简单全量塞回去

在 Chat Completions 时代,常见做法是自己维护一个完整的 messages 数组,每次请求都把历史对话全部塞回模型。这个方案虽然可控,但缺点是上下文会越来越长,token 成本也会越来越高。

Responses API 支持更适合新式对话和 Agent 流程的上下文管理方式。企业项目可以分成两层处理:

第一层是业务会话历史,仍然保存在自己的数据库里,例如 MySQL、PostgreSQL、MongoDB 或向量库。

第二层是模型调用上下文,只传当前任务真正需要的信息,而不是把全部历史记录无脑塞给模型。

例如,一个 CRM 客服系统不应该把客户三年的聊天记录全部传给 GPT-5.5。更合理的做法是先通过业务规则、摘要或检索系统筛选出当前问题相关内容,再作为上下文交给模型。长上下文不是免费能力,调用量上来以后,token 成本会比代码重构更值得警惕。

六、工具调用和结构化输出要单独测试

如果旧项目已经使用 function calling,迁移时需要重点检查四类问题:

工具定义字段是否能平滑迁移;工具调用结果是否需要回填到下一轮输入;结构化输出迁移到 Responses API 后,JSON schema 是否稳定;流式输出时,前端是否依赖旧事件名。

很多旧项目真正麻烦的地方,不是 API 改名,而是把“模型返回文本”“工具调用中间态”“业务渲染逻辑”混在同一个函数里。迁移前建议先拆分三层:

模型调用层负责请求模型;工具执行层负责处理函数调用、数据库查询、外部 API;业务渲染层负责把最终结果展示给用户。

拆清楚之后,后续接入多模型、灰度切换、失败重试和成本统计都会更方便。

七、国内团队接入 API 的现实问题

国内团队直接接 OpenAI 官方 API,通常遇到的困难不是 SDK 不会写,而是接入条件复杂。比如账号注册、访问环境、海外支付、企业账单、发票、额度审批、网络稳定性等问题,都可能影响项目上线。

尤其是流式输出和 Agent 工具调用,对网络链路稳定性要求更高。一旦链路不稳定,用户看到的不是慢一点,而是中断、卡顿、重复输出或工具调用失败。

因此,生产环境不建议随便找一个不明来源的“便宜中转站”。便宜并不等于成本低,特别是当用户问题、内部文档、代码仓库或企业数据都要经过第三方链路时,数据安全、模型替换、密钥滥用和合规风险都需要提前评估。

八、TreeRouter更适合放在哪一层

如果团队已经有 OpenAI SDK 代码,比较务实的方式不是大改业务代码,而是在配置层调整 base_url,把请求接到 OpenAI 兼容接口。

TreeRouter 这类大模型 API 聚合平台,更适合放在模型调用层和业务系统之间,作为统一的模型接入入口。它的价值主要体现在三个方面:

第一,降低迁移成本。项目从 Chat Completions 到 Responses API 的改造已经涉及接口、返回结构和上下文策略,不应该再让业务层承担额外改造压力。

第二,便于成本管理。企业项目往往需要关注人民币充值、调用统计、失败重试、成本预估和不同模型的价格差异,统一接入层可以让这些数据更容易被观察和比较。

第三,方便多模型切换。复杂任务可以使用 GPT-5.5,代码或长文本任务可以评估 Claude Opus 4.8,普通分类、摘要或低价值任务则可以走更低成本的模型。模型选择不应散落在业务代码里,而应集中在调用策略中管理。

不过,并不是所有项目一开始都需要模型聚合平台。个人实验、小脚本、低频调用,直接使用官方 SDK 就足够。只有当项目进入试点、生产或多模型阶段,统一 API 层的价值才会真正体现出来。

九、迁移检查清单

正式迁移前,建议先列出项目中的所有模型调用点:

哪些地方调用了 Chat Completions;哪些地方解析了 choices;哪些地方依赖 stream 事件;哪些地方用了 function calling;哪些地方强依赖 JSON 格式。

迁移时先改最小链路:

单轮文本输入、文本输出、错误处理、超时重试、日志脱敏。

迁移后再测试高级能力:

工具调用、结构化输出、多模态输入、上下文续接、流式输出、失败重试、成本统计。

最后一定要做成本压测。相同任务在 GPT-5.5、Claude Opus 4.8 或其他候选模型上的输入 token、输出 token、延迟、失败率都要记录下来。只有这样,项目上线后才不是“能跑就行”,而是能稳定、可控、可持续地运行。

十、总结

从 Chat Completions 到 Responses API 的迁移,本质上不是一次简单的接口替换,而是 AI 应用架构从“聊天生成”走向“任务执行”的一次升级。

最小改造路径并不复杂:替换调用方法、调整输入字段、迁移指令位置、修改返回解析,再逐步处理流式输出、工具调用和结构化输出。真正决定迁移质量的,是你有没有把模型调用层、工具执行层和业务逻辑层拆清楚。

对于简单项目,不必过度设计;对于企业级应用,则应提前考虑多模型接入、成本监控、上下文控制和稳定性保障。这样迁移到 Responses API 后,项目不仅能继续运行,还能为后续 Agent、多模态和复杂工具链能力打好基础。