← 返回博客文章

硅基斥候S01

OpenAI有两套API,很多人用了半年都不知道

硅基斥候S01

梳理 OpenAI 两套 API 的差异与使用边界,帮助开发者避免接口选择和迁移误区。

OpenAI有两套API,很多人用了半年都不知道
OpenAI有两套API,很多人用了半年都不知道

/v1/chat/completions这个端点,但凡接触过大模型API的人应该都用过。

不管你是调DeepSeek、通义千问、智谱、Kimi、MiniMax,几乎走的都是这个格式。“接口兼容OpenAI格式”已经是整个行业的事实标准。几乎所有模型厂商都兼容了这个接口,几乎所有教程和示例代码都在用它。

但很多人不知道的是,OpenAI在2025年3月又推出了一套新接口:/v1/responses

(虽然已经推出一年了,但真的还有很多人不知道...)

官方明确说了,这是未来所有新项目的推荐接口,老接口会逐步退出。

问题是,大部分中转站、教程、甚至一些Agent框架,到现在还在用老接口。你可能一直在用一种"过时"的方式调模型,自己却不知道。

老格式:Chat Completions

completions这一套是2023年随GPT-3.5一起出来的,但今天它已经不属于OpenAI独有了——它是整个大模型行业的公共语言。

它的设计思路很直白:你把聊天记录打包成一个数组发过去,模型回你一条消息。

POST /v1/chat/completions
{
  "model": "gpt-4o",
  "messages": [
    {"role": "system", "content": "你是一个助手"},
    {"role": "user", "content": "1+1等于几"},
    {"role": "assistant", "content": "等于2"},
    {"role": "user", "content": "为什么"},
  ]
}

你看到了吗?第二轮对话的时候,你得把第一轮的问答也一起发过去。因为服务器是无状态的——它不记得你之前聊了什么,每次请求都是一张白纸。

这个接口是OpenAI内部一周赶出来的,员工自己都说是"先跑起来再说"的产物。但架不住它简单好用,所以成了行业事实标准,各家都兼容。

侧方位证明世界是个草台班子...

新格式:Responses

2025年3月,OpenAI推出了/v1/responses

从调用方式上看,变化不大:

POST /v1/responses
{
  "model": "gpt-4o",
  "input": "1+1等于几"
}

messages换成了input,看起来只是换个名字。但底层改了三件大事。

第一,服务器记住了你的对话。

老接口每次请求都要把整段聊天历史重新发一遍。聊到第十轮,你就要把前九轮全部打包,每次都在为已经付过费的token重复付费

新接口用一个previous_response_id参数解决问题:

POST /v1/responses
{
  "model": "gpt-4o",
  "input": "为什么",
  "previous_response_id": "resp_abc123"
}

告诉服务器"接着上次那个ID继续",你只需要发新的一句话。服务器端保存了完整的上下文和推理状态,不用每次都从头来。

这意味着什么?省token。实测下来,多轮对话场景的缓存命中率能到90%以上,而老接口只有不到5%。差18倍,直接反映在你的账单上。

第二,返回结果不只是"一条消息"了。

老接口返回的就是一段文本,choices[0].message.content,完事。

新接口返回的是一组有序的Items,可能是推理过程(reasoning)、可能是消息(message)、可能是工具调用(function_call)、可能是搜索结果。你可以清楚地看到模型"想了什么"和"做了什么",而不是只看到最终结论。

第三,内置工具调用。

老接口的function calling,本质上是模型输出一段JSON说"我想调用这个函数",你自己去执行,再把结果扔回来。每次工具调用都是一次完整的请求往返。

新接口支持内置工具——联网搜索、代码解释器、文件检索,引擎在服务端自动执行,不需要你当中间人。一次请求里模型可以连续调用多个工具,最后给你一个结果。

OpenAI有两套API,很多人用了半年都不知道配图 1

那些还在用老接口的人

说了这么多新接口的好处,现实是,大部分中文开发者还在用老接口。

因为生态还没跟上,国产大模型厂商对Responses API的支持还处于早期——通义千问是2026年1月才支持的。

用中转站的要注意了

笔者自己踩过一个坑。

之前用的一个中转站,一直好好的,突然开始各种报错。折腾了半天才发现,那个中转站只支持completions,不支持responses。而我当时用的工具已经默认走新接口了。

这让我意识到一件事:中转站接的是哪一套接口,好多人可能从来没注意过。

现在很多中转站的做法是:对外提供老格式接口,后端做一层转换,把你的请求翻译成新格式发给OpenAI。

这听起来没问题,但转换质量参差不齐。有些中转站只是把字段名映射了一下,Responses API的精髓——有状态上下文、结构化返回、内置工具——全部丢失了。你以为自己在用新接口,其实还是老接口换了个壳。

更直接的影响是缓存。新接口靠previous_response_id实现服务端缓存,如果中转站在转换过程中没有正确传递这个参数,每次请求对OpenAI来说都是全新的。(我猜测这就是为啥中转站有一些是“无缓存模型”)

OpenAI有两套API,很多人用了半年都不知道配图 2

以此判别纯血模型

这个方法不太严谨,也不保真:看你的中转站或者工具文档里,有没有提到/v1/responses这个端点。如果只提到了/v1/chat/completions,那它走的大概率是老接口。

或者:发一个多轮对话请求,看返回结果里有没有response_id字段。如果有,说明它真正接上了新接口;如果返回的还是老格式的choices[0].message.content,那就是套了个壳。

当然,这只能作为一个侧面参考。一个中转站好不好用,还要看稳定性、延迟、价格、客服响应等很多因素。

但至少,知道自己在用什么,比稀里糊涂地用要好。

最后

OpenAI从Chat Completions转向Responses,是整个交互范式的换代。老接口是为"聊天"设计的,新接口是为"Agent"设计的。

你不需要现在就去迁移——老接口短期内不会消失,国产模型的支持也需要时间。但至少知道有这么回事,下次遇到奇怪的报错、或者觉得中转站费用莫名变高的时候,多一个排查方向。