协议
通过 OpenAI、Anthropic 或 Gemini 协议调用任意对话模型,以及每种协议返回什么。
任何对话模型都可以通过四种对话协议中的任意一种调用。所以用 OpenAI SDK 调 Claude、用 Google Gen AI SDK 调 GPT,都只需改模型 ID。你的 SDK 或工具已经在用哪种协议,就选哪种:
| 你在用 | 调用 | 页面 |
|---|---|---|
| OpenAI SDK、Vercel AI SDK、LangChain、opencode、Cursor | POST /v1/chat/completions | Chat Completions |
Codex、OpenAI SDK 的 client.responses | POST /v1/responses | Responses |
| Anthropic SDK、Claude Code | POST /v1/messages | Messages |
| Google Gen AI SDK | POST /v1/models/{model}:generateContent | Gemini |
同一个模型,两种协议:
curl https://api.ohmygpt.com/v1/chat/completions \
-H "Authorization: Bearer $OHMYGPT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "anthropic/claude-haiku-4-5", "max_tokens": 256,
"messages": [{"role": "user", "content": "Explain QUIC in two sentences."}]}'
curl https://api.ohmygpt.com/v1/messages \
-H "x-api-key: $OHMYGPT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "anthropic/claude-haiku-4-5", "max_tokens": 256,
"messages": [{"role": "user", "content": "Explain QUIC in two sentences."}]}'第一个请求返回 chat.completion 对象,第二个返回 Anthropic 的 message。
原生协议
每个模型都有一种原生协议:Claude 是 Messages,Gemini 模型是 Gemini,GPT、DeepSeek、Qwen 和其他大多数模型是 Chat Completions。GET /v1/models 用 "native": true 标出原生协议:
curl -s https://api.ohmygpt.com/v1/models \
| jq -r '.data[] | select(.id == "anthropic/claude-haiku-4-5") | .protocols[] | [.path, (.native // false)] | @tsv'/v1/chat/completions false
/v1/responses false
/v1/messages true
/v1/models/{id}:generateContent false在原生协议上,模型收到的请求体与你发送的完全一致,所以厂商特有字段和 beta 功能都按厂商文档的说明生效。OhMyGPT 只处理以下字段:
| 字段 | OhMyGPT 的处理 |
|---|---|
model | 把你的模型 ID 解析为厂商的模型 ID |
stream | 保持你的设置 |
stream_options | Chat Completions 的流总会以一个用量数据块结尾 |
provider | 在 Chat Completions 和 Responses 中读取你的路由偏好 |
safetySettings | 不带此字段的 Gemini 请求,四个可调类别会设为 OFF;见 Gemini |
anthropic-version | 在 Messages 中,如果没有发送,则设为 2023-06-01;其他 anthropic-* 请求头(例如 anthropic-beta)原样透传 |
其他协议
在其他协议上,OhMyGPT 会把你的请求转换成模型的原生协议,再把回答转换回来。消息、系统提示词、图片、工具、工具选择、token 上限、结构化输出和推理控制都会完整保留;模型有对应项的采样与输出参数也一样。响应按你所用协议的格式返回,结束原因也用该协议的取值。
模型没有对应项的采样或输出参数(例如发给 Claude 的 seed 或 logprobs)不会发送,模型按自己的默认行为作答。各模型系列支持哪些参数,见参数。Chat Completions 的 enable_thinking 和 thinking_budget(请改用推理控制),以及 Responses 的 max_tool_calls、truncation、top_logprobs 也一样。
有少数字段携带只有模型原生协议才能送达的输入,例如上游保存的上下文、服务端工具或提示词模板。请在原生协议上发送:
| 协议 | 需在原生协议上发送的字段 |
|---|---|
| Chat Completions | functions 和 function_call(或改用 tools 和 tool_choice,所有模型都支持) |
| Responses | background、conversation、prompt |
| Messages | container、mcp_servers,以及 web_search_20250305 等服务端工具 |
| Gemini | cachedContent |
如果这些字段通过其他协议发给模型,请求会在到达模型之前返回 400,因此不会产生费用,你也不会拿到一个悄悄漏掉了部分输入的回答:
{
"error": {
"type": "invalid_request_error",
"code": "unsupported_parameter",
"param": "background",
"message": "The model `mock` does not support the `background` parameter."
}
}值为 null、false、""、[] 或 {} 的字段视为未设置,所以 SDK 的默认值不会触发这个错误。
错误
错误按你调用的协议格式返回,所以 SDK 的错误类型无需任何改动即可使用。
{
"error": {
"type": "invalid_request_error",
"code": "unsupported_endpoint",
"param": "model",
"message": "The model `ohmygpt/mock` does not support this endpoint. `GET /v1/models` lists the endpoints each model supports."
}
}OpenAI 格式的错误中,code 是稳定的取值,可以据此做分支判断。错误列出了所有 code,以及每种状态码的处理方法。