文档/ 深入

协议与转换边界

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

四种对话协议§

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;Gemini 原生使用 /v1beta/models/…:embedContent 或 :batchEmbedContents
  • 图片生成与编辑——/v1/images/generations、/v1/images/edits
  • token 计数——/v1/messages/count_tokens 及 Gemini 的 countTokens
  • 纯文本重排序:POST /v1/rerank,独立使用 rerank 协议,不支持流式或协议互转。
  • JEV 决策:POST /v1/decisions,由 Jev 或 OpenRouter 渠道原生执行,独立使用 decisions 协议。
  • Codex 实时语音:独立使用 codex-live 协议,不是 Responses WebSocket 的另一种文本模式。

Gemini、New API 与 GPT-Load 支持原生 gemini-embeddings;Gemini 渠道还可将 OpenAI Embeddings 的文本请求转成 Gemini 原生批量嵌入,支持 dimensions 及 float/base64 输出,不支持 token ID 输入。

Codex 实时语音接入指南 →

GET /v1/models 携带非空 anthropic-version 请求头时返回 Anthropic 模型列表;否则返回 OpenAI Chat Completions 格式。直接调接口时按客户端协议带上对应请求头。

查看逐渠道协议与 Operation →

原生搜索入口为 POST /v1/alpha/search,使用 openai-responses 协议,支持 CLIProxyAPI、New API 与 GPT-Load 渠道。它不是聊天协议转换,也不意味着任意上游账号都能搜索。

转换是怎么发生的§

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

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

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

不能转换的情况§

它不是万能翻译器

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

常见的转换失败场景:

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

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

有状态请求§

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

响应续接使用原凭据

对支持上游存储的原生 HTTP/SSE Responses,网关记录返回的响应 ID。使用同一访问密钥携带 previous_response_id 时,只使用当前仍允许的原凭据,不受软亲和开关影响,也不会因失败换号。

转换或无状态响应、明确 store:false 的新响应不会登记;未知、过期或淘汰的 ID 会在本地拒绝,包括网关外或升级前创建的 ID。仅正常停机成功保存后可恢复绑定,不保证崩溃恢复。

conversation 和其他资源操作仍不保证回到原凭据;请使用单凭据分组,或确认上游支持跨凭据共享。中转渠道只保证回到原下一跳。

GET /v1/responses 支持原生 WebSocket,当前适用于 OpenAI、Codex、xAI、GPT-Load、CLIProxyAPI、Sub2API。连接固定上游 Session,Codex 仅支持原连接内续接;不提供 WS→HTTP 转换,也不保证重连恢复上下文。开关见运行时设置。

Codex WebSocket 支持在生成期间发送 response.interrupt,携带同一连接中当前响应的 response_id;网关在原上游连接立即转发,中断确认后可用 previous_response_id 续接。已结束响应的迟到或重复中断会被忽略,不会影响下一轮。若上游以 response.incomplete 返回中断且没有输出、output_tokens 为 0,连接仍会关闭,不能续接。

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

CLIProxyAPI 与 New API 的 Responses 扩展透传不包含响应资源的查询、删除、取消、输入项或 Input Tokens。普通 previous_response_id 续接仍依赖上游存储;需要未声明资源能力的输入会在本地拒绝,不会先发给上游试探。

该用哪个协议§

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

  • 客户端已经定了——用它原生的那个,转换最少。 Claude Code 就用 Anthropic,Gemini CLI 就用 Gemini
  • 自己写代码——Chat Completions 兼容性最广, 换上游最省事
  • 需要有状态接续——Responses; 注意响应 ID 续接与其他资源引用的不同边界

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

协议与转换边界 - GPT-Load