全部课程
亲手写一个 Agent/ Provider · 一套代码接多家模型,差异都被一层适配吸收/ 同一句话,Anthropic 和 OpenAI 发出去完全不同 源码
Provider · 一套代码接多家模型,差异都被一层适配吸收

同一句话,Anthropic 和 OpenAI 发出去完全不同

你的 agent 到现在只跟一个模型说过话。可市面上有 Anthropic、OpenAI、Google……换一家,请求的形状差得像两种语言。这一章讲:怎么让 agent 一套代码接所有家,换引擎不改代码。

你的 agent 现在能存、能转、能装、能动手了。但它一直只跟一个模型说话。

真实世界里模型不止一家:Anthropic 的 Claude、OpenAI 的 GPT、Google 的 Gemini……你多半想让 agent 能随时换一家——这家贵了换那家、这个任务用强模型那个用便宜的。问题是:这些家的 API,形状差得像两种语言。

这一章就解决这件事:怎么让 agent 一套代码接所有家,换引擎、代码一行不改。 先看看差异到底有多大。

各说各话——三座窗口形制各不相同(拱形、方形、圆月),阿澄捧着同一份请求,对着三种不同的开口犯难。


同一个请求,两家的样子

你想发的东西是同一个:一句系统提示、一条用户消息、一个 read 工具。但 Anthropic 和 OpenAI 收的格式,长这样(示意,抓形状不抠字段):

Anthropic(messages)
system: "你是 agent…" messages: [ { role: "user", content: [{type:"text",…}] } ] tools: [ { name: "read", input_schema: {…} } ]
OpenAI(chat completions)
messages: [ { role: "system", content:"你是…" }, { role: "user", content: "…" } ] tools: [ { type:"function", function: { name:"read", parameters: {…} } } ]

同一个意思,三处就不一样:

  • 系统提示:Anthropic 有个独立的 system 字段;OpenAI 把它塞进 messages 里当一条 role:"system"。
  • 消息内容:Anthropic 爱用”内容块数组”;OpenAI 常用纯字符串。
  • 工具:Anthropic 叫 input_schema;OpenAI 要套一层 type:"function"、参数叫 parameters。

再加上 Google、Bedrock、Mistral……每家一套方言。


天真的做法,和它的下场

带走这一句

模型不止一家,每家 API 是一套方言(系统提示放哪、工具怎么套、内容什么格式都不同)。要让 agent 能随时换家,绝不能把某一家的格式假设混进主循环——否则换家就是牵一发动全身。

下一课

答案是加一层适配(adapter):主循环只对着一个统一接口说话,每家配一个 adapter 负责翻译成它的方言。下一课看这层适配长什么样——你其实早就见过它的入口了。