跳转到内容

API 参考

协议转换兼容性

一个模型能用哪些接口、NoviaHub 如何在 OpenAI / Anthropic / Gemini 协议之间自动转换,以及转换时会丢失哪些信息。

不同厂商的模型原本说的是不同的「语言」:Claude 用 Anthropic Messages 协议,Gemini 用 Gemini 协议,其他很多模型用 OpenAI 协议。NoviaHub 会在中间做翻译:你用哪种协议发请求,它就把请求转成模型能理解的格式,再把回复转回你用的格式。

这样你可以用同一套代码调用不同厂商的模型。但翻译不是万能的,下面说明哪些组合能用、哪些信息会在转换中丢失。

在模型&价格页面打开一个模型,可以看到它的端点标签。标签表示「这个模型可以用哪些接口调用」:

标签 对应接口
Chat POST /v1/chat/completions
Response POST /v1/responses
openai-response-compact POST /v1/responses/compact
openai-alpha-search POST /v1/alpha/search
Anthropic POST /v1/messages
Gemini POST /v1beta/models/{model}:generateContent
图片 POST /v1/images/generations

同样的信息也能从 GET /v1/models 返回的 supported_endpoint_types 字段里查到。

规则很简单:只用标签里列出的接口。 标签是按模型背后的服务类型固定生成的,列出的每一种都有对应的实现。标签以外的组合,有的也能用(例如本地测试中,用 /v1/responses 调用只标了 Anthropic、Chat 的 Claude 模型可以成功),但我们不保证,也可能随时变化。

下表是在本地测试环境中,用与线上相同版本的 NoviaHub、配合模拟的上游服务实测的结果,全部返回 200,且响应格式与你调用的接口一致:

你调用的接口 模型类型 结果
Chat(/v1/chat/completions) Claude 模型 成功,返回 Chat 格式
Chat Gemini 模型 成功,返回 Chat 格式
Anthropic(/v1/messages) OpenAI 协议的模型(如 deepseek-v4-flash) 成功,返回 Anthropic 格式,流式也可以
Anthropic Gemini 模型 成功,返回 Anthropic 格式
Gemini(/v1beta/...:generateContent) OpenAI 协议的模型 成功,返回 Gemini 格式
Response(/v1/responses) Claude 模型 成功,返回 Responses 格式(见上文,不在标签内)

经过转换的响应,usage 里除了该协议的标准字段,还可能多出 billing_usage、usage_semantic、usage_source、claude_cache_creation_5_m_tokens 等字段。这些是网关内部记账用的,可以直接忽略。

  • 用 Chat 接口调用 Claude 模型时,模型的思考内容会放在 reasoning_content 里返回,但 Claude 思考块自带的签名(signature)不会保留。
  • 反过来,用 /v1/messages 调用非 Claude 模型时,返回的 thinking 块没有签名。

如果你的程序需要把带签名的思考块原样传回给 Claude(例如同时使用扩展思考和工具调用的多轮对话),请直接用 /v1/messages 调用 Claude 模型。

  • system 如果写成数组(多个文本块),会被合并成一段文字,块上的 cache_control 会丢失。
  • 所有工具都会按函数工具(function)处理。
  • 图片请用 base64 方式传入(source.type 为 base64)。
  • Anthropic 协议要求必须有 max_tokens。你没传时,网关会自动补一个默认值(程序默认 8192,平台可调整)。想控制输出长度,请自己传 max_tokens 或 max_completion_tokens。
  • stop 会转成 stop_sequences,developer 角色的消息会并入 system,web_search_options 会转成 Claude 的网页搜索工具。

用 /v1/messages 流式调用非 Claude 模型时,开头 message_start 事件里的 input_tokens 是网关的估算值,以结尾 message_delta 事件里的 usage 为准。

  • 写新代码时,优先用模型标签里排在前面的那种协议,一般就是模型厂商自己的协议,能用到的功能最全。
  • 需要用一套代码调多家模型时,用 Chat 接口最省事,几乎所有模型都标了 Chat。
  • 用到思考、缓存、工具调用等高级功能时,先在小请求上确认效果,再正式使用。