文档/ 深入

协议与转换边界

网关能在协议之间转换,但不是万能翻译器。这一页说明边界在哪,以及遇到不支持的组合时会怎样。

四种协议§

GPT-Load 接受四种客户端协议。它们是并列关系, 一把访问密钥可以同时允许多个:

  • OpenAI Chat Completions——最通用, 绝大多数兼容客户端和第三方服务都走这条
  • OpenAI Responses——较新的接口形态, 支持有状态的多轮接续
  • Anthropic Messages——Claude 系客户端的原生入口
  • Gemini——Gemini 系客户端的原生入口
OpenAI 是两个协议

Chat Completions 和 Responses 是两个独立协议,不是一个的新旧版本。 管理台里选「OpenAI」预设时会同时勾上这两个,但它们各自有独立的入口和能力。

接口入口§

客户端按各自协议的习惯访问,不需要在路径里带分组名:

协议主要入口
OpenAI Chat Completions/v1/chat/completions
OpenAI Responses/v1/responses 及其资源路径
Anthropic Messages/v1/messages
Gemini/v1beta/models/…

除对话外,还提供这些接口(可用性取决于上游渠道):

  • 模型列表——/v1/models /v1beta/models
  • 向量嵌入——/v1/embeddings
  • 图片生成与编辑——/v1/images/generations/v1/images/edits
  • token 计数——/v1/messages/count_tokens 及 Gemini 的 countTokens

转换是怎么发生的§

客户端用的协议,和上游渠道支持的协议不一定相同。 比如你用 Claude Code(Anthropic 协议)请求一个 OpenAI 渠道的模型—— 网关会把请求转成 OpenAI 格式发出去,再把响应转回 Anthropic 格式。

这个转换对客户端是透明的。请求日志里能看到转换过程, 排查响应格式异常时先看这里,见 监控与排障

协议相同时不发生转换,请求基本原样透传—— 这也是延迟最低、兼容性最好的路径。

不能转换的情况§

它不是万能翻译器

每个渠道声明自己能执行哪些协议与能力。网关只在这些声明的能力之间转换, 不会尝试把任意协议、任意 JSON 强行翻译成另一种。

常见的转换失败场景:

  • 目标渠道不支持该能力—— 比如向一个纯文本模型请求图片生成
  • 协议特有的参数没有对应物—— 某些参数只存在于一种协议里,转换时会被丢弃或报错
  • 模型本身不支持—— 比如对不支持视觉的模型发送图片输入

遇到这类问题,最直接的解法是让客户端协议和渠道协议对齐: 用 Claude 客户端就配 Anthropic 渠道,减少中间转换。

有状态请求§

OpenAI Responses 支持靠 previous_response_idconversation 或已有资源 ID 接续上下文。 这类请求有个前提:

有状态请求依赖同一个凭据

上下文存在上游那一侧,且通常绑定在创建它的那个凭据上。 换一个凭据请求,上游会找不到之前的会话。
当前会话亲和依据提示词前缀,不读取 previous_response_idconversation 或其他资源 ID,因此不能提供强一致路由保证。 可靠使用有状态资源时,请确保该分组只有一个凭据, 或确认上游允许不同凭据共享同一资源。

另一个选择是不用有状态接口—— 每次把完整上下文发过去。这样任何凭据都能处理, 调度也更均衡,代价是每次请求的输入 token 更多。

该用哪个协议§

没有绝对的优劣,按情况选:

  • 客户端已经定了——用它原生的那个,转换最少。 Claude Code 就用 Anthropic,Gemini CLI 就用 Gemini
  • 自己写代码——Chat Completions 兼容性最广, 换上游最省事
  • 需要有状态接续——Responses, 但记得开会话亲和

访问密钥里可以同时勾选多个协议, 不确定就都勾上,用不到的协议不会有副作用。 配置见 访问密钥

协议与转换边界 - GPT-Load