Messages(Anthropic 兼容)
POST /v1/messages — Anthropic Messages API,按场景给出完整示例
兼容 Anthropic Messages API。底层与 Chat Completions 是同一条路由管线,只是请求/响应格式适配为 Anthropic 风格。
本页按「场景」组织:先看场景总览,再到对应小节看请求、响应和注意事项。每个示例都标注了证据:已实测表示用线上测试账号真实调用过(2026-10-19),响应字段取自真实返回,id、思考文本等取值替换为占位;依官方文档(未实测)表示按 Anthropic 官方文档写成,我们没有真实调用验证。
鉴权差异(重要):平台 /messages 用 Authorization: Bearer $MODELSITE_API_KEY,不是官方 Anthropic 的 x-api-key。用官方 anthropic SDK 时传 auth_token(走 Bearer),不要传 api_key(会走 x-api-key → 401)。官方 SDK 会自动带 anthropic-version 头;平台不强制校验它,也不会把它转给上游,手写请求时建议仍带上以保持兼容。anthropic-beta 头会被透传。
场景总览
场景划分参照 Anthropic 官方的 Messages、Streaming、Tool use、Vision、Extended thinking、Prompt caching、Structured outputs 等文档。
| 场景 | 官方是否提供 | 我们的情况 | 示例入口 |
|---|---|---|---|
基础对话(单轮、system) | 是 | 支持 | 基础对话 |
| 多轮对话(自己带历史) | 是 | 支持 | 多轮对话 |
| 流式输出 | 是 | 支持 | 流式输出 |
工具调用(tool_use / tool_result、tool_choice) | 是 | 支持:auto / any / tool / none 都可用;disable_parallel_tool_use: true 转成 parallel_tool_calls: false | 工具调用 |
扩展思考(thinking) | 是 | 支持(思考块没有 signature) | 思考 |
图像输入(image 块) | 是 | 部分支持:需视觉模型;base64 已实测,url 来源未实测,不支持 file_id | 图像输入 |
文档输入(document 块,PDF) | 是 | 部分支持:仅 base64 来源,转成 file;未实测 | 文档输入 |
| 提示缓存 | 是(cache_control) | 部分支持:上游自动缓存的命中量会回报;显式 cache_control 只对部分模型保留 | 提示缓存 |
Token 计数(/v1/messages/count_tokens) | 是 | 支持 | Token 计数 |
结构化输出(output_config.format) | 是 | 部分支持:output_config.format 为 {"type":"json_schema","schema":{...}} 时转成 response_format(json_schema);其余取值不转换。也可直接用 Chat Completions 的 response_format | — |
服务端工具(web_search、web_fetch、code_execution、tool_search) | 是 | 不支持:不转换,原样转发,OpenAI 兼容上游不认识 | — |
客户端内置工具(bash、text_editor、computer、memory) | 是 | 不支持:不转换为函数工具 | — |
引用与搜索结果(citations、search_result 块) | 是 | 不支持:不转换 | — |
Files API、Message Batches、MCP connector、Skills、container | 是 | 未接入:平台没有对应接口 | — |
基础对话
何时用:一问一答,或用顶层 system 设定角色和语气(Messages 的 system 不放进 messages)。
证据:已实测(线上测试账号,2026-10-19)。
请求
curl https://api.modelsite.ai/v1/messages \
-H "Authorization: Bearer $MODELSITE_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "glm-5.3-flash",
"max_tokens": 1500,
"system": "用中文回答,简洁",
"messages": [{"role": "user", "content": "用一句话解释量子纠缠"}]
}'max_tokens 必填且必须大于 0。思考模型的思考也算在 max_tokens 里,设得太小会在思考阶段被截断。
响应
取回复文本:content[] 里 type 为 text 的块的 text;结束原因 stop_reason;用量 usage。思考模型会在文本块前多一个 thinking 块,按 type 取,不要写死下标。
{
"id": "msg_xxxx",
"type": "message",
"role": "assistant",
"content": [
{ "type": "thinking", "thinking": "The user asks in Chinese to explain quantum entanglement in one sentence… (已省略)" },
{ "type": "text", "text": "量子纠缠是指两个或多个粒子形成一种关联状态后,无论相距多远,对其中一个粒子的测量会瞬间决定另一个粒子的状态,这种超越经典物理的关联性被爱因斯坦称为“幽灵般的超距作用”。" }
],
"model": "glm-5.3-flash",
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 23,
"output_tokens": 80,
"reasoning_tokens": 28
}
}注意事项
stop_reason在 OpenAI 兼容上游上只会是end_turn/max_tokens/tool_use;命中stop_sequences也是end_turn,stop_sequence为null,拿不到具体命中的序列。只有 Anthropic 原生上游才可能出现stop_sequence/pause_turn/refusal。usage.reasoning_tokens是平台扩展(官方用output_tokens_details.thinking_tokens,平台不输出)。- 下面的接口卡片由 OpenAPI 规范自动渲染(鉴权、Request body 参数表、Response schema)。
Authorization
BearerAuth Authorization: Bearer $MODELSITE_API_KEY(与 OpenAI 格式共享同一 Key)
In: header
Header Parameters
Anthropic API 版本(平台不强制校验,官方 SDK 自动携带)。
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/messages" \ -H "anthropic-version: 2023-06-01" \ -H "Content-Type: application/json" \ -d '{ "model": "string", "messages": [ {} ], "max_tokens": 1 }'取回复:content[] 里 type 为 text 的块。思考模型会多一个 thinking 块(无 signature)。取自线上真实响应(glm-5.3-flash,2026-10-19),取值为占位。
{ "id": "msg_xxxx", "type": "message", "role": "assistant", "content": [ { "type": "thinking", "thinking": "The user asks in Chinese to explain quantum entanglement in one sentence. I should respond in Chinese, concisely, as requested." }, { "type": "text", "text": "量子纠缠是指两个或多个粒子形成一种关联状态后,无论相距多远,对其中一个粒子的测量会瞬间决定另一个粒子的状态,这种超越经典物理的关联性被爱因斯坦称为“幽灵般的超距作用”。" } ], "model": "glm-5.3-flash", "stop_reason": "end_turn", "stop_sequence": null, "usage": { "input_tokens": 23, "output_tokens": 80, "reasoning_tokens": 28 }}多轮对话
何时用:需要上下文的连续对话。平台不保存对话,每次请求把完整历史放进 messages,角色交替为 user / assistant。
证据:依官方文档(未实测)。带工具的多轮已实测,见工具调用。
请求
curl https://api.modelsite.ai/v1/messages \
-H "Authorization: Bearer $MODELSITE_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "glm-5.3-flash",
"max_tokens": 1500,
"messages": [
{"role": "user", "content": "什么是量子纠缠?"},
{"role": "assistant", "content": "两个粒子的状态相互关联,与距离无关。"},
{"role": "user", "content": "它能用来超光速通信吗?"}
]
}'响应:与基础对话相同的结构。
注意事项
- 第一条消息的
role必须是user或assistant,否则 400。 - 以
assistant结尾的「预填充(prefill)」是否被模型接受取决于上游,未实测。 - 回传思考块的规则见思考。
流式输出
何时用:逐 token 展示、降低首字延迟。
证据:已实测(线上测试账号,2026-10-19)。
请求
curl -N https://api.modelsite.ai/v1/messages \
-H "Authorization: Bearer $MODELSITE_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "glm-5.3-flash",
"max_tokens": 600,
"stream": true,
"reasoning_effort": "low",
"messages": [{"role": "user", "content": "只回复一个字:好"}]
}'响应
每个事件是 event: + data: 两行。拼接 text_delta.text 得到文本;没有 [DONE],以 message_stop 结束。
event: message_start
data: {"type":"message_start","message":{"id":"msg_xxxx","type":"message","role":"assistant","content":[],"model":"glm-5.3-flash","stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":0,"output_tokens":0}}}
event: ping
data: {"type":"ping"}
event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"thinking":"","type":"thinking"}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"thinking_delta","thinking":"Simple"}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"thinking_delta","thinking":": reply \"好\"."}}
event: content_block_stop
data: {"type":"content_block_stop","index":0}
event: content_block_start
data: {"type":"content_block_start","index":1,"content_block":{"text":"","type":"text"}}
event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"text_delta","text":"好"}}
event: content_block_stop
data: {"index":1,"type":"content_block_stop"}
event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":18,"output_tokens":9,"reasoning_tokens":6}}
event: message_stop
data: {"type":"message_stop"}注意事项
message_start里的usage此时尚无真实用量(均为 0);以message_delta.usage为准。- 事件序列是
message_start→content_block_start→content_block_delta(多次)→content_block_stop→message_delta→message_stop。 - 本例思考块的增量里没有
signature_delta;只有上游给出签名时才有。 - 流内错误会发出
event: error,见下方「错误」。
工具调用
何时用:让模型决定调用你定义的工具。流程:声明 tools → 模型返回 tool_use 块 → 你执行 → 回填 tool_result → 模型给出最终回答。
证据:已实测(线上测试账号,2026-10-19):单个调用、回填结果。tool_choice 的 any / tool 依官方文档(未实测);tool_choice: none 与 disable_parallel_tool_use 的转换由单元测试覆盖(未线上实测)。
请求(第一轮)
curl https://api.modelsite.ai/v1/messages \
-H "Authorization: Bearer $MODELSITE_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "glm-5.3-flash",
"max_tokens": 1500,
"tools": [{
"name": "get_weather",
"description": "Get the current weather for a city",
"input_schema": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"]
}
}],
"messages": [{"role": "user", "content": "杭州明天天气怎么样?"}]
}'响应(第一轮)
stop_reason 为 tool_use,工具参数是已解析的对象 input(不是字符串)。
{
"id": "msg_xxxx",
"type": "message",
"role": "assistant",
"content": [
{ "type": "thinking", "thinking": "The user is asking about tomorrow's weather in Hangzhou… (已省略)" },
{
"type": "tool_use",
"id": "chatcmpl-tool-xxxxxxxx",
"name": "get_weather",
"input": { "city": "杭州" }
}
],
"model": "glm-5.3-flash",
"stop_reason": "tool_use",
"stop_sequence": null,
"usage": { "input_tokens": 160, "output_tokens": 86, "reasoning_tokens": 74 }
}回填工具结果(第二轮)
把 assistant 消息的 content 原样加回,再发一条 user 消息,内含 tool_result 块并用 tool_use_id 对应;tool_result 块要放在该消息内容的最前面。
curl https://api.modelsite.ai/v1/messages \
-H "Authorization: Bearer $MODELSITE_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "glm-5.3-flash",
"max_tokens": 1500,
"tools": [ ... 同第一轮 ... ],
"messages": [
{"role": "user", "content": "杭州明天天气怎么样?"},
{"role": "assistant", "content": [
{"type": "tool_use", "id": "chatcmpl-tool-xxxxxxxx", "name": "get_weather", "input": {"city": "杭州"}}
]},
{"role": "user", "content": [
{"type": "tool_result", "tool_use_id": "chatcmpl-tool-xxxxxxxx", "content": "多云 7~13°C"}
]}
]
}'第二轮响应是普通的成功响应(已实测,本次请求带了 reasoning_effort: "low",所以没有思考块):
{
"id": "msg_xxxx",
"type": "message",
"role": "assistant",
"content": [
{ "type": "text", "text": "杭州明天天气为**多云**,气温在 **7~13°C** 之间。早晚偏凉,建议适当添加衣物保暖。" }
],
"model": "glm-5.3-flash",
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": { "input_tokens": 182, "output_tokens": 31 }
}流式下,tool_use 块在 content_block_start 里给出 id 与 name(input 为空对象),参数以 input_json_delta.partial_json 片段到达,拼接后解析(依官方文档,未实测):
event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"tool_use","id":"toolu_xxxx","name":"get_weather","input":{}}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"input_json_delta","partial_json":"{\"city\":"}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"input_json_delta","partial_json":"\"Hangzhou\"}"}}
event: content_block_stop
data: {"type":"content_block_stop","index":0}注意事项
tool_choice:auto→auto,any→required,tool→ 指定函数。none→none;disable_parallel_tool_use: true→parallel_tool_calls: false。tool_use.id的格式取决于上游(本例是chatcmpl-tool-前缀),原样回填即可。tool_result的is_error不会传给 OpenAI 兼容上游。- 只转换自定义工具(
name+input_schema);服务端工具与内置工具不转换,见场景总览。
思考(thinking)
何时用:需要模型先推理再回答。
证据:已实测(线上测试账号,2026-10-19):glm-5.3-flash 默认返回 thinking 块,reasoning_effort: "low" 时思考几乎为空。thinking: {"type":"enabled","budget_tokens":N} 的效果依上游,未实测。
请求:思考是否开启、强度如何控制,取决于模型。GLM 系列强制思考,用顶层 reasoning_effort 控制强度(Python SDK 放 extra_body,平台原样转发);其他模型的取值见各厂商页。
curl https://api.modelsite.ai/v1/messages \
-H "Authorization: Bearer $MODELSITE_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "glm-5.3-flash",
"max_tokens": 1500,
"reasoning_effort": "low",
"messages": [{"role": "user", "content": "用一句话解释量子纠缠"}]
}'响应:思考过程是 content[] 里 type 为 thinking 的块,排在 text / tool_use 之前,真实响应见基础对话;流式下思考是 thinking_delta,先于正文,真实事件见流式输出。
注意事项
- 平台不会默认开启或关闭思考。你传了
thinking,就原样转发(GPT 系列除外,见下);不传,则由上游默认决定。 thinking: {"type": "adaptive"}是 Anthropic 专用取值:对 MiniMax 原样转发,对其他 OpenAI 兼容模型会被丢弃,上游走自己的默认;同时带output_config.effort时,平台把它转成reasoning_effort(MiniMax 除外)。budget_tokens不会被换算成reasoning_effort(GPT / o 系列例外,会按预算分档为low/medium/high)。想控制强度,在请求体里直接加上游支持的顶层字段,如reasoning_effort。- 思考块没有
signature:实测 OpenAI 兼容上游返回的thinking块不带signature。Anthropic 原生上游才会带签名,此时多轮对话需把thinking块(含signature)原样放回历史。 - 思考内容回传:历史 assistant 消息里的
thinking内容块,会被转成reasoning_content发给需要回传的模型(DeepSeek、GLM、Qwen、MiniMax);其他模型会丢弃它们。客户端仍须在多轮(尤其工具调用)里把上一轮的思考内容完整放回历史。(这几条的转换逻辑依赖尚未发布的代码。) - 各模型的取值与限制见 DeepSeek、GLM、Qwen、MiniMax。
图像输入
何时用:让视觉模型看图回答。需选支持图像输入的模型(如 qwen3-vl-plus)。
证据:base64 来源已实测(线上测试账号,2026-10-19,qwen3-vl-plus);url 来源依官方文档(未实测)。
请求
curl https://api.modelsite.ai/v1/messages \
-H "Authorization: Bearer $MODELSITE_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3-vl-plus",
"max_tokens": 300,
"messages": [{
"role": "user",
"content": [
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": "iVBORw0KGgo..."}},
{"type": "text", "text": "这张图里有什么?一句话回答。"}
]
}]
}'响应
{
"id": "msg_xxxx",
"type": "message",
"role": "assistant",
"content": [
{ "type": "text", "text": "一个红色的实心圆。" }
],
"model": "qwen3-vl-plus",
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": { "input_tokens": 16, "output_tokens": 8 }
}注意事项
- 本端点返回的
usage.input_tokens只含文本部分,不含图像 token:同一张图在 Chat Completions 里prompt_tokens为 82(其中image_tokens66),这里input_tokens只有 16。需要完整的输入用量请用 Chat Completions,或以账单为准。 source.type为url时要求上游能访问该地址;不确定时用base64。不支持file_id(Files API)。
文档输入(PDF)
何时用:把 PDF 等文档作为输入块交给模型。
证据:依官方文档(未实测)。
请求
curl https://api.modelsite.ai/v1/messages \
-H "Authorization: Bearer $MODELSITE_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3-vl-plus",
"max_tokens": 600,
"messages": [{
"role": "user",
"content": [
{"type": "document", "source": {"type": "base64", "media_type": "application/pdf", "data": "JVBERi0xLjQK..."}},
{"type": "text", "text": "总结这份文档"}
]
}]
}'响应:与基础对话相同的结构。
注意事项
- 只有
base64来源的document会被转成file内容部件;url、text、content来源和file_id来源不转换,原样转发,上游通常不认识。 - 上游是否支持读取 PDF、对页数和大小有什么限制,因模型而异,未验证。
提示缓存
何时用:多次请求共享很长的前缀(系统提示、文档、工具定义)时降低成本和延迟。
证据:已实测(线上测试账号,2026-10-19,deepseek-v4.1-flash):在 system 文本块上带 cache_control,同一个约 2900 token 的前缀已有缓存时,cache_read_input_tokens 为 2816。
请求
curl https://api.modelsite.ai/v1/messages \
-H "Authorization: Bearer $MODELSITE_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4.1-flash",
"max_tokens": 300,
"reasoning_effort": "low",
"system": [{
"type": "text",
"text": "你是客服助手。参考以下条款回答问题:\n(此处是约 2900 token 的长文本)",
"cache_control": {"type": "ephemeral"}
}],
"messages": [{"role": "user", "content": "第3条说了什么?一句话。"}]
}'响应
{
"id": "msg_xxxx",
"type": "message",
"role": "assistant",
"content": [
{ "type": "thinking", "thinking": "我们需要回答用户中文问题… (已省略)" },
{ "type": "text", "text": "第3条规定:平台对所有请求按实际用量计费,调用方应当在客户端保存请求编号以便对账。" }
],
"model": "deepseek-v4.1-flash",
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 87,
"output_tokens": 91,
"cache_read_input_tokens": 2816,
"reasoning_tokens": 66
}
}注意事项
- Anthropic 口径下
input_tokens不含缓存部分:本例 87 + 2816 = 2903,等于总输入。 - 缓存由上游决定。这个模型的缓存是上游自动完成的,请求里的
cache_control对它没有作用(会被删除),没带标记同样会命中。 - 显式
cache_control:claude / gemini 前缀的模型保留;Qwen 保留但规整为{"type":"ephemeral"}(ttl去掉);其他模型删除。顶层cache_control不转换。Qwen 一条依赖尚未发布的代码。 - 有缓存写入的上游,用量里还会出现
cache_creation_input_tokens与按 TTL 拆分的cache_creation。 - 官方的
max_tokens: 0(只预热缓存)不支持。
Token 计数
何时用:发请求前估算输入 token 数。
证据:已实测(线上测试账号,2026-10-19):对 glm-5.3-flash 发 Hi,返回 {"input_tokens": 8}。计数口径与该模型实际计费的 input_tokens 是否一致,未验证。
请求
curl https://api.modelsite.ai/v1/messages/count_tokens \
-H "Authorization: Bearer $MODELSITE_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "glm-5.3-flash",
"messages": [{"role": "user", "content": "Hi"}]
}'响应
{ "input_tokens": 8 }错误
401 密钥无效或缺失
{"type":"error","error":{"type":"authentication_error","message":"invalid API key"}}缺少 Authorization 头时 message 为 missing or invalid authorization header。
402 余额不足
{"type":"error","error":{"type":"billing_error","message":"insufficient balance"}}429 触发限流
{"type":"error","error":{"type":"rate_limit_error","message":"too many requests"}}响应头带 Retry-After(秒),按它退避重试。
400 模型不存在
{"type":"error","error":{"type":"invalid_request_error","message":"unknown model: not-a-model"}}model 填错或未上线时是 400(不是 404)。
400 参数错误(Anthropic 格式)
{"type":"error","error":{"type":"invalid_request_error","message":"max_tokens is required and must be > 0"}}平台自己校验的 400 包括:max_tokens 缺失或不大于 0;第一条消息的 role 不是 user / assistant;tool_choice.type 为 tool 却没给 name。
403 无权调用该模型
{"type":"error","error":{"type":"permission_error","message":"model 'glm-5.3-flash' is not allowed for this API key"}}503 网关容量已满
{"type":"error","error":{"type":"overloaded_error","message":"gateway at capacity, retry later"}}同样带 Retry-After: 5。
上游暂不可用(502 / 503):上游临时不可用时返回 502(error.type 为 server_error),所有上游都处于临时冷却时返回 503(error.code 为 no_upstream_available)。这两类在 Chat Completions 上已实测遇到,稍后重试即可。
注意:本端点(含 /v1/messages/count_tokens)上,网关产生的错误(401 / 402 / 403 / 429 / 模型不存在 / 503 容量满)与路由层产生的错误(参数、上游失败等)都使用 Anthropic 风格外壳,type 取官方名称,余额不足为 billing_error。
流式请求在已经开始输出后失败,HTTP 状态码已是 200,错误会作为流内事件发出:event: error,数据为 {"type":"error","error":{"type":"<类型>","message":"<信息>"}}。完整错误码与处理建议见 错误码。
选哪种格式?
| 现有代码 | 推荐入口 |
|---|---|
| OpenAI / LangChain(OpenAI) / 大多数框架 | /chat/completions |
| Anthropic SDK | /messages(本页) |
两个入口调到的是同一批模型。
不支持或有差异的参数
请求先被转换成 Chat Completions 形态再转给上游。平台不会按「参数清单」丢弃参数,也不会钳制取值:除下表列出的、代码里写死的转换外,官方参数不做转换,按未知顶层字段原样转发给上游,上游是否认识、忽略还是报错(4xx)由它决定。
| 参数 | 行为 | 说明 |
|---|---|---|
max_tokens | 必填,必须大于 0 | 缺失或 0 返回 400。官方允许的 0(只预热缓存)不支持。 |
messages | 部分支持 | 第一条的 role 必须是 user 或 assistant。内容块只转换 text、image(base64 / url 来源)、tool_use、tool_result、thinking、audio(base64)、document(仅 base64 来源,转成 file);document 的 url / text / content 来源、file_id 来源、search_result 等其他块不转换,原样转发。tool_result 的 is_error 不会传给 OpenAI 兼容上游 |
system | 改写 | 字符串或文本块数组,转成开头的 system 消息,每个文本块一条;非文本块被忽略 |
stop_sequences | 改写 | 转成 stop。OpenAI 兼容上游命中停止序列时,响应的 stop_reason 是 end_turn,stop_sequence 为 null,拿不到具体命中的序列 |
temperature top_p top_k | 透传 | 转发给上游,取值范围由上游决定,越界时上游可能报错 |
tool_choice | 部分支持 | auto → auto、any → required、tool → 指定函数。none → none;disable_parallel_tool_use: true → parallel_tool_calls: false |
tools | 部分支持 | 自定义工具(name + input_schema)转成函数工具。服务端工具(如 web_search_20250305、code_execution_*、text_editor_*、bash_*、computer_*)不转换,原样转发,OpenAI 兼容上游通常不认识 |
thinking | 改写 | enabled / disabled 原样转发;adaptive 只对 MiniMax 保留,对其他 OpenAI 兼容模型被丢弃。GPT / o 系列把 thinking 换算成 reasoning_effort。详见上方「思考」(依赖尚未发布的代码) |
output_config.effort | 改写 | 仅在 thinking.type = "adaptive" 且没有顶层 reasoning_effort 时转成 reasoning_effort(MiniMax 除外) |
output_config.format(结构化输出) | 改写 | {"type":"json_schema","schema":{...}} 转成 response_format(json_schema,名称固定);output_config 本身不会转发给上游,顶层 cache_control 也不转发 |
metadata | 部分支持 | 只用 metadata.user_id,转成 user |
service_tier | 不换算取值 | 原样放进 service_tier;Anthropic 的 auto / standard_only 与 OpenAI 系取值不同,上游可能拒绝或忽略 |
cache_control(顶层) | 不转换 | 作为未知字段原样转发,OpenAI 兼容上游通常忽略 |
container mcp_servers speed inference_geo diagnostics | 不转换 | 作为未知字段原样转发;container 与 mcp_servers 对 OpenAI 兼容上游没有意义 |
内容块与系统块上的 cache_control | 去除或改写 | claude / gemini 前缀的模型保留;Qwen 保留但规整为 {"type":"ephemeral"}(ttl 被去掉);其他模型全部删除(Qwen 一条依赖尚未发布的代码) |
历史 thinking 块 | 按模型处理 | DeepSeek、GLM、Qwen、MiniMax 转成 reasoning_content 回传;claude / gemini 前缀的模型保留;其他模型删除。redacted_thinking 同样删除(claude / gemini 前缀的模型除外)(依赖尚未发布的代码) |
响应里的 stop_details、usage.output_tokens_details、usage.service_tier、usage.inference_geo | 不返回 | 官方新增的响应字段平台没有输出;思考 token 数见平台扩展的 usage.reasoning_tokens |
平台扩展
下面是平台自己定义、Anthropic 官方没有的内容。
鉴权与请求头
- 鉴权用
Authorization: Bearer,不用官方的x-api-key(见页首说明)。 - 网关只放行这些请求头,其余一律丢弃:
Authorization、Content-Type、Accept、Accept-Encoding、Origin、User-Agent、Anthropic-Beta、OpenAI-Beta。Anthropic-Beta会透传给上游;anthropic-version不校验也不转发。 X-Request-ID:你带的值会被沿用并回显在响应头,没带则平台生成。
请求参数
| 参数 | 说明 |
|---|---|
顶层 reasoning_effort 等厂商字段 | 想控制思考强度,直接在请求体加上游支持的顶层字段,原样转发 |
/v1/messages/count_tokens | 可用 |
响应头
| 响应头 | 说明 |
|---|---|
X-Request-ID | 请求 ID,排查问题时提供给我们 |
Retry-After | 429 给出建议退避秒数;网关容量满返回 503 并带 Retry-After: 5 |
Content-Type: text/event-stream、Cache-Control: no-cache、X-Accel-Buffering: no | 流式响应;流空闲时网关每 15 秒发一个 : heartbeat 注释帧保活,SSE 客户端会自动忽略 |
平台不返回 X-RateLimit-* 或 anthropic-ratelimit-* 一类的限流额度头。
响应字段
| 字段 | 说明 |
|---|---|
usage.reasoning_tokens | 思考部分的 token 数(官方用 output_tokens_details.thinking_tokens,平台不输出该字段) |
usage.cache_read_input_tokens、cache_creation_input_tokens、cache_creation | 缓存用量,有值时才出现 |
usage.cost、usage.cost_details | 本端点不返回费用字段;需要费用请用 Chat Completions 或 Responses |
自动行为
- 流式请求内部自动开启
include_usage,用量在message_delta.usage里。 - 上游失败时的自动重试、换上游规则与 Chat Completions 相同:只在你收到任何响应内容之前发生,参数错误与内容安全拦截不重试。
- 余额在流式输出途中耗尽时流会被切断,随后收到一个
data: {"error":{"type":"insufficient_quota","message":"balance exhausted"}}帧和data: [DONE],这一帧是 OpenAI 风格而不是 Anthropic 的event: error。