API Reference · 附录
Anthropic Messages API · Schema 完整参考
POST /v1/messages 的完整 schema 参考——本页标题中的 Messages 是 Anthropic(Claude 模型的出品公司)调用其模型 API(Application Programming Interface,应用程序接口)的对话协议名称。以下内容从 docs.anthropic.com/en/api/messages 浓缩,每个字段都给出类型、是否必填、默认值、用途说明。 Anthropic 协议与 OpenAI 系的三个核心差异:① system 是顶层参数(不进 messages)② max_tokens 必填③ tool_result 嵌在 user 消息里(不是独立 role)。 工具入参 input 已经是对象(不是 JSON(JavaScript Object Notation,人类可读的文本数据格式)字符串)——跨协议时记得 json.loads。
概览
1
HTTP 端点
~15
请求字段
2
role 类型
6
流式事件
| 项目 | 说明 |
|---|---|
| 本卡定位 | 附录页 · 字段全、说明全,适合查阅 |
| 覆盖范围 | Anthropic Messages API(2023-06 起) |
| 权威来源 | docs.anthropic.com/en/api/messages |
| 与 OpenAI 的关系 | Claude 生态标准。Agent-oriented 但保持无状态 |
| 教学版 | llm-api-schema-reference.html 第三篇 |
关键差异速览:① system 是顶层参数(不进 messages)② max_tokens 必填(Anthropic 严格度分水岭)③ tool_choice 是结构化对象({type:"auto"} 等),不是字符串枚举 ④ 工具入参 input 已是对象(不是 JSON 字符串)⑤ tool_result 嵌在 user 消息的 content 数组里,不是独立 role。写跨厂商代码时这五处最容易踩坑。
1. 端点与认证
HTTP 调用
POST https://api.anthropic.com/v1/messages x-api-key: <ANTHROPIC_API_KEY> anthropic-version: 2023-06-01 // ★ 必填!显式版本头 content-type: application/json
与 OpenAI 的端点差异
| 项目 | OpenAI Chat Completions | Anthropic Messages |
|---|---|---|
| URL | /v1/chat/completions | /v1/messages |
| 认证头 | Authorization: Bearer | x-api-key(自定义头,不用 Bearer) |
| 版本头 | 无 | anthropic-version: 2023-06-01 必填 |
| Content-Type | application/json | 相同 |
跨厂商注意:x-api-key + anthropic-version 是 Anthropic 专属。代码要参数化认证头和版本头,不要硬编码 OpenAI 的 Authorization: Bearer。
2. 请求对象 MessagesRequest
完整 TypeScript 类型
type MessagesRequest = {
// —— 必填 ——
model: string, // "claude-sonnet-4-5" / "claude-opus-4-1" / "claude-haiku-4-5" ...
messages: MessageParam[], // 对话历史
max_tokens: number, // ★ 必填!强制显式声明资源上限
// —— 系统指令(顶层,不进 messages)——
system?: string
| { type: "text", text: string, cache_control?: CacheControl }[],
// —— 采样 ——
temperature?: number, // [0, 1]
top_p?: number,
top_k?: number,
stop_sequences?: string[],
// —— 流式 ——
stream?: boolean,
// —— 工具 ——
tools?: ToolDefinition[],
tool_choice?: { type: "auto" }
| { type: "any" }
| { type: "tool", name: string }, // 注意:结构化对象
// —— 元信息 ——
metadata?: { user_id?: string }
}
type CacheControl = { type: "ephemeral" } // ★ 显式缓存断点(schema 级缓存建模)
请求字段表
| 字段 | 必填 | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
| model | ★ | string | — | 模型 ID。"claude-sonnet-4-5" / "claude-opus-4-1" / "claude-haiku-4-5" 等 |
| messages | ★ | MessageParam[] | — | 对话历史。只有 user / assistant 两种 role(无 system / tool / developer) |
| max_tokens | ★ | number | — | 必填!最大生成 token 数。不传会 400。OpenAI 侧全可选——跨厂商代码要兜底 |
| system | — | string | Block[] | null | 系统指令。顶层参数,不进 messages。可以是字符串或 text block 数组(后者支持 cache_control) |
| temperature | — | number [0, 1] | 1.0 | 采样温度。范围 [0, 1](OpenAI 是 [0, 2])——跨厂商代码要钳制范围 |
| top_p | — | number | — | nucleus 采样 |
| top_k | — | number | — | 仅从前 K 个 token 采样。OpenAI 无此字段 |
| stop_sequences | — | string[] | null | 停止序列。命名是 stop_sequences(OpenAI 是 stop) |
| stream | — | boolean | false | 是否流式(SSE) |
| tools | — | ToolDefinition[] | null | 工具定义。扁平(无包装层) |
| tool_choice | — | object | {type:"auto"} | 结构化对象,不是字符串枚举: · {type:"auto"} 模型自决 · {type:"any"} 必须调某个工具 · {type:"tool",name:"X"} 强制调指定工具 |
| metadata | — | object | null | 元信息,目前只支持 user_id(用于滥用检测) |
3. 消息与内容块(判别联合)
Anthropic 的消息和内容块都是判别联合。只有 user 和 assistant 两种 role,系统指令在 system 顶层参数里,工具结果嵌在 user 消息的 content 数组里。
MessageParam 类型定义
type MessageParam = {
role: "user" | "assistant", // ★ 只有两种 role
content: string | ContentBlock[] // 空字符串不允许;块可为空数组占位
}
输入侧 ContentBlock(请求中可出现)
| type | 字段 | 说明 |
|---|---|---|
| text | { type, text, cache_control? } | 纯文本块。cache_control: {type:"ephemeral"} 可设缓存断点 |
| image | { type, source: { type:"base64", media_type, data } | { type:"url", url } } | 图片。media_type:image/jpeg / image/png / image/gif / image/webp |
| tool_result | { type, tool_use_id, content?, is_error?, cache_control? } | ★ 工具结果:嵌在 user 消息里(不是独立 role) |
| document | { type, source: {...} } | PDF 文档(Claude Sonnet 4+ 支持) |
tool_result 字段表(关键)
| 字段 | 必填 | 类型 | 说明 |
|---|---|---|---|
| type | ★ | "tool_result" | 固定 |
| tool_use_id | ★ | string | 与 tool_use.id 严格配对。配错就 400(同 Chat 的 tool_call_id / Responses 的 call_id) |
| content | — | string | ContentBlock[] | 工具返回内容。可以是字符串或内容块数组(支持图片等) |
| is_error | — | boolean | ★ schema 原生错误标记。OpenAI 没有这个字段,工具报错只能靠文本约定 |
| cache_control | — | CacheControl | 缓存断点({type:"ephemeral"}) |
输出侧 ContentBlock(响应中出现)
| type | 字段 | 说明 |
|---|---|---|
| text | { type, text } | 输出文本 |
| tool_use | { type, id, name, input } | 工具调用。id 是 "toolu_...";input 已是对象,不是 JSON 字符串 |
| thinking | { type, thinking, signature } | 思维链内容 + 防篡改 signature。回填多轮时必须原样保留 |
| redacted_thinking | { type, data } | 加密的思维链(敏感信息不回显但保留推理效果) |
tool_use 字段表
| 字段 | 必填 | 类型 | 说明 |
|---|---|---|---|
| type | ★ | "tool_use" | 固定 |
| id | ★ | string | "toolu_..." 工具调用配对键 |
| name | ★ | string | 工具名(与 tools[].name 对应) |
| input | ★ | object | 已是对象!Chat 是 arguments(JSON 字符串),Anthropic 是 input(对象)。跨协议转换时记得 json.loads / json.dumps |
thinking 字段表
| 字段 | 必填 | 类型 | 说明 |
|---|---|---|---|
| type | ★ | "thinking" | 固定 |
| thinking | ★ | string | 思维链内容(模型推理过程) |
| signature | ★ | string | 防篡改签名。回填到下一轮时必须原样保留——服务端会校验,篡改就拒绝 |
与 OpenAI 的关键差异:① role 只有 2 种(不是 5 种)② 系统指令在顶层 system(不是 role:"system" 消息)③ 工具结果嵌在 user 消息的 content 数组里(不是独立 role:"tool")④ tool_use.input 已是对象(不是 JSON 字符串)⑤ is_error schema 原生错误标记 ⑥ thinking 块 + signature 跨轮保留。
4. 工具定义 ToolDefinition
完整类型定义
type ToolDefinition = {
name: string, // ^[a-zA-Z0-9_-]{1,128}
description?: string, // 工具描述
input_schema: JSONSchema, // ★ 命名直白:"输入的 schema"
cache_control?: CacheControl // 工具定义也可打缓存断点
}
字段表
| 字段 | 必填 | 类型 | 说明 |
|---|---|---|---|
| name | ★ | string | 工具名。正则约束 ^[a-zA-Z0-9_-]{1,128}(最多 128 字符,比 OpenAI 的 64 宽松) |
| description | — | string | 工具描述 |
| input_schema | ★ | JSONSchema | 参数 schema。命名直白(OpenAI 是 parameters) |
| cache_control | — | CacheControl | 缓存断点。工具定义也可打——大工具列表的省钱利器 |
完整示例
{
"name": "get_weather",
"description": "查指定城市的当前天气。返回温度、天气状况、湿度。",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名,如 '北京' / '上海'"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度单位"
}
},
"required": ["city"]
}
}
与 OpenAI 的对比:① 命名 input_schema(OpenAI 是 parameters)② 命名约束 128 字符(OpenAI 是 64)③ 无 type 包装层(OpenAI 有 type:"function" 包装)④ 无 strict 字段 ⑤ 支持 cache_control 显式缓存断点。
5. 响应对象 Message
完整类型定义
type Message = {
id: string, // "msg_..."
type: "message",
role: "assistant",
model: string,
content: OutputBlock[], // ★ 必为数组(text + tool_use 可同轮并存)
stop_reason: "end_turn" | "max_tokens" | "stop_sequence"
| "tool_use" | "refusal" | "pause_turn",
stop_sequence: string | null,
usage: {
input_tokens: number,
output_tokens: number,
cache_creation_input_tokens?: number, // ★ 缓存计费一级公民
cache_read_input_tokens?: number
}
}
字段表
| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | "msg_..." 响应 ID |
| type | "message" | 对象类型 |
| role | "assistant" | 固定 |
| model | string | 实际使用的模型 |
| content | OutputBlock[] | ★ 必为数组(text + tool_use 可同轮并存) |
| stop_reason | enum | 循环分支依据。6 个值(见下表) |
| stop_sequence | string | null | 实际触发的停止序列(stop_reason: "stop_sequence" 时有值) |
| usage.input_tokens | number | 输入 token 数 |
| usage.output_tokens | number | 输出 token 数 |
| usage.cache_creation_input_tokens | number | 本次创建的缓存 token 数(cache_control 写入时) |
| usage.cache_read_input_tokens | number | 本次读取缓存的 token 数(命中缓存时) |
stop_reason 6 个值详解
| 值 | 含义 | Agent 主循环如何处理 |
|---|---|---|
| "end_turn" | 自然结束(模型认为任务完成) | 收尾、提交答案、退出循环 |
| "max_tokens" | 撞 max_tokens 被截断 | 扩预算或续写,不要盲目重试 |
| "stop_sequence" | 遇到 stop_sequences 里的字符串 | 收尾退出(stop_sequence 字段有触发的字符串) |
| "tool_use" | 模型要调工具 | 执行工具 → tool_result 嵌回 user 消息 → 再次请求(核心循环) |
| "refusal" | 模型拒绝(触发安全策略) | 降级 / 改写 / 上报 |
| "pause_turn" | 服务端主动暂停(pause_turn 端点模式,长任务可见) | 轮询或等回调 |
stop_reason 命名映射(与 OpenAI 对比):"end_turn" ↔ "stop"、"tool_use" ↔ "tool_calls"、"max_tokens" ↔ "length"、"refusal" ↔ "content_filter"。跨协议时记得映射。
6. 流式事件(显式状态机)
Anthropic 的流式是显式状态机——每个事件带 type,事件有明确生命周期,且内建 ping 心跳。
完整事件类型
type StreamEvent =
| { type: "message_start", message: Message } // 整体骨架先到
| { type: "content_block_start", index: number,
content_block: OutputBlock } // 块开始(含 index)
| { type: "content_block_delta", index: number,
delta: { type: "text_delta", text: string }
| { type: "input_json_delta",
partial_json: string } // 工具入参分片
| { type: "thinking_delta", thinking: string }
| { type: "signature_delta", signature: string } }
| { type: "content_block_stop", index: number } // 块边界明确!
| { type: "message_delta",
delta: { stop_reason, stop_sequence }, usage } // 收尾语义 + 最终 usage
| { type: "message_stop" } // 终止
| { type: "ping" } // 保活心跳(协议内建)
事件表(按生命周期排序)
| 事件 type | 触发时机 | 主要字段 |
|---|---|---|
| message_start | 响应开始(id / model / usage.input_tokens 等骨架信息先到) | message |
| content_block_start | 每个内容块(text / tool_use / thinking)开始 | index, content_block |
| content_block_delta | 内容块增量 | index, delta(4 种 type) |
| content_block_stop | 内容块结束(明确边界!) | index |
| message_delta | 响应级增量(stop_reason + usage.output_tokens) | delta (含 stop_reason), usage |
| message_stop | 响应结束 | — |
| ping | 心跳(保活,连接空闲时服务端发) | — |
stateDiagram-v2
[*] --> message_start
message_start --> content_block_start
content_block_start --> content_block_delta
content_block_delta --> content_block_delta : delta 可多个
content_block_delta --> content_block_stop : 块结束
content_block_stop --> content_block_start : 多个 block 循环
content_block_stop --> message_delta : 全部块完成
message_delta --> message_stop : stop_reason + usage
message_stop --> [*]
note right of content_block_delta
ping 心跳可在任意阶段插入(协议内建保活)
end note
delta 4 种 type
| delta.type | 字段 | 用途 |
|---|---|---|
| text_delta | text | 文本流式增量 |
| input_json_delta | partial_json | 工具入参分片(需 content_block_start/stop 框定边界后拼接) |
| thinking_delta | thinking | 思维链增量(extended thinking 模型) |
| signature_delta | signature | 思维链签名增量(保证完整性) |
与 OpenAI Chat 流式的关键差异:① 有 content_block_start / stop 边界事件——解析器无需靠 index 猜"这个 tool_use 到哪结束"② 内建 ping 心跳——连接活性判断不用自己造 ③ 工具入参分片用 input_json_delta 字段 ④ message_delta 事件携带 usage(output_tokens)——OpenAI 流式要 include_usage:true 才有 usage。
7. 完整往返示例(工具调用最小环)
① 请求:max_tokens 必填 + system 顶层 + 扁平工具定义
{
"model": "claude-sonnet-4-5",
"max_tokens": 1024, // ★ 必填
"system": "你是测试助手", // 顶层,不进 messages
"messages": [
{"role": "user", "content": "跑一下测试"}
],
"tools": [
{
"name": "run_tests",
"description": "运行测试",
"input_schema": {
"type": "object",
"properties": {"suite": {"type": "string"}}
}
}
]
}
② 响应:stop_reason = "tool_use";input 已是对象
{
"id": "msg_001",
"type": "message",
"role": "assistant",
"model": "claude-sonnet-4-5-20250514",
"content": [
{"type": "text", "text": "我先运行测试"},
{"type": "tool_use", "id": "toolu_xyz",
"name": "run_tests", "input": {"suite": "all"}} // ★ input 是对象!
],
"stop_reason": "tool_use",
"stop_sequence": null,
"usage": {
"input_tokens": 95,
"output_tokens": 15,
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 0
}
}
③ 回填请求:assistant 原样 + user 内嵌 tool_result
{
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "跑一下测试"},
{"role": "assistant", "content": [ // assistant 原样回放
{"type": "text", "text": "我先运行测试"},
{"type": "tool_use", "id": "toolu_xyz",
"name": "run_tests", "input": {"suite": "all"}}
]},
{"role": "user", "content": [ // ★ tool_result 嵌在 user 里
{"type": "tool_result", "tool_use_id": "toolu_xyz", // 与 tool_use.id 严格配对
"content": "42 passed"}
]}
]
}
④ 进阶:thinking 块必须原样回填
// 如果 ② 步模型还输出了 thinking 块(extended thinking 模式):
{
"id": "msg_001",
"content": [
{"type": "thinking", "thinking": "我需要先看看测试...", "signature": "sig_abc..."},
{"type": "tool_use", "id": "toolu_xyz", "name": "run_tests", "input": {"suite": "all"}}
]
}
// 回填时,thinking 块(含 signature)必须原样保留:
{
"messages": [
{"role": "user", "content": "跑一下测试"},
{"role": "assistant", "content": [
{"type": "thinking", "thinking": "我需要先看看测试...", "signature": "sig_abc..."}, // ★ 原样保留
{"type": "tool_use", "id": "toolu_xyz", "name": "run_tests", "input": {"suite": "all"}}
]},
{"role": "user", "content": [
{"type": "tool_result", "tool_use_id": "toolu_xyz", "content": "42 passed"}
]}
]
}
8. 错误与异常
HTTP 错误(4xx / 5xx)
| 状态码 | 含义 | 常见原因 |
|---|---|---|
| 400 | 请求格式错误 | JSON 解析失败 / max_tokens 缺失 / 字段类型错 |
| 401 | 认证失败 | x-api-key 错 / 过期 |
| 403 | 权限不足 | API key 没权访问该模型 |
| 404 | 端点不存在 | URL 拼错 / 模型 ID 不存在 |
| 413 | 请求过大 | request too large,图片/文档超 100MB |
| 429 | 速率限制 | TPM / RPM 超限。读 Retry-After 头 |
| 500 | 服务端错误 | Anthropic 内部问题。指数退避重试 |
| 529 | API 过载 | overloaded_error,稍后重试 |
错误响应体结构
{
"type": "error",
"error": {
"type": "invalid_request_error", // 错误类型
"message": "messages: required field" // 错误消息
}
}
协议层错误(HTTP 200 + stop_reason 表示)
| stop_reason | 含义 | Agent 主循环如何处理 |
|---|---|---|
| "refusal" | 触发安全策略,模型拒绝 | 降级 / 改写 / 上报 |
| "max_tokens" | 撞 max_tokens 被截断 | 扩 max_tokens 续写,不要盲重试 |
| "pause_turn" | 服务端主动暂停(pause_turn 端点模式) | 轮询或等回调 |
与 OpenAI 错误处理的差异:① 错误响应体结构不同(OpenAI 是 {error: {message, type, code, param}},Anthropic 是 {type:"error", error: {type, message}})② 状态码 529 是 Anthropic 专属(OpenAI 不会返回)③ 缺 max_tokens 会被 400(OpenAI 允许)④ 错误信息措辞不同(Anthropic 错误消息更简洁)。
9. 字段速查表(按字母序)
| 字段 | 位置 | 一句话 |
|---|---|---|
| cache_control | system block / content block / 工具定义 | 显式缓存断点 {type:"ephemeral"} |
| cache_creation_input_tokens | usage | 本次创建的缓存 token 数 |
| cache_read_input_tokens | usage | 本次读取缓存的 token 数 |
| content | message | 消息内容(user 是 string 或 block[],assistant 必为 block[]) |
| content_block | 流式 content_block_start | 块内容(text / tool_use / thinking) |
| data | redacted_thinking block / image.source | base64 数据 / 加密思维链 |
| delta | 流式 content_block_delta / message_delta | 增量内容 |
| description | tools[].description | 工具描述 |
| id | 响应顶层 / tool_use block | 响应 ID / 工具调用配对键 |
| index | 流式 content_block_* | 块索引(聚合用) |
| input | tool_use block | 工具入参(对象,不是 JSON 字符串) |
| input_json_delta | 流式 content_block_delta | 工具入参分片(partial_json 字符串) |
| input_schema | tools[] | 工具参数 schema(命名直白) |
| input_tokens | usage | 输入 token 数 |
| is_error | tool_result block | schema 原生错误标记(OpenAI 无) |
| max_tokens | 请求顶层 | 必填!最大生成 token 数 |
| media_type | image.source | image/jpeg / image/png / image/gif / image/webp |
| message | 流式 message_start / message_delta | 消息对象 |
| message_start | 流式事件 type | 响应开始 |
| message_stop | 流式事件 type | 响应结束 |
| message_delta | 流式事件 type | 响应级增量(stop_reason + usage) |
| messages | 请求顶层 | 对话历史(只有 user / assistant 两种 role) |
| metadata | 请求顶层 | 元信息,目前只支持 user_id |
| model | 请求 / 响应顶层 | 模型 ID |
| name | 工具定义 / tool_use | 工具名 |
| output_tokens | usage | 输出 token 数 |
| partial_json | 流式 input_json_delta | 工具入参分片 JSON |
| ping | 流式事件 type | 心跳(协议内建) |
| redacted_thinking | block type | 加密思维链 |
| role | message | "user" / "assistant" |
| signature | thinking block | 防篡改签名(回填必须原样保留) |
| signature_delta | 流式 content_block_delta | 思维链签名增量 |
| source | image / document block | base64 / url / text / content |
| stop_reason | 响应顶层 | 循环分支依据(6 个值) |
| stop_sequence | 请求 / 响应顶层 | 停止序列(请求是 stop_sequences[],响应是触发的单个) |
| stop_sequences | 请求顶层 | 停止序列数组(最多 4 个) |
| stream | 请求顶层 | 是否流式 |
| system | 请求顶层 | 系统指令(顶层参数,不进 messages) |
| temperature | 请求顶层 | 采样温度 [0, 1] |
| text | 多种位置 | 文本内容(text block / text_delta / system 顶层字符串) |
| text_delta | 流式 content_block_delta | 文本流式增量 |
| thinking | thinking block | 思维链内容(extended thinking 模型) |
| thinking_delta | 流式 content_block_delta | 思维链增量 |
| tool_choice | 请求顶层 | 工具选择(结构化对象,不是字符串枚举) |
| tool_result | block type | 工具结果(嵌在 user 消息) |
| tool_use | block type | 工具调用(id + name + input 对象) |
| tool_use_id | tool_result block | 与 tool_use.id 严格配对 |
| tools | 请求顶层 | 工具定义数组 |
| top_k | 请求顶层 | 仅从前 K 个 token 采样(OpenAI 无) |
| top_p | 请求顶层 | nucleus 采样 |
| type | 响应顶层 / block type / 错误响应 | 对象 / block / 错误类型 |
| url | image.source | 图片 URL(type:"url" 时) |
| usage | 响应顶层 / 流式 message_delta | token 使用情况(含 2 项缓存计费) |
| user_id | metadata | 终端用户 ID(滥用检测) |
10. 引用与配套资料
| 来源 | 链接 / 路径 | 说明 |
|---|---|---|
| Anthropic Messages API 文档(权威) | docs.anthropic.com/en/api/messages | 官方权威源 |
| Anthropic Tool Use Overview | docs.anthropic.com/en/docs/agents-and-tools/tool-use/overview | 工具调用最佳实践 |
| Anthropic Streaming Events | docs.anthropic.com/en/api/streaming | 流式事件完整参考 |
| Anthropic Extended Thinking | docs.anthropic.com/en/docs/build-with-claude/extended-thinking | 思维链 + signature 机制 |
| Anthropic Prompt Caching | docs.anthropic.com/en/docs/build-with-claude/prompt-caching | cache_control 显式缓存断点 |
| 教学讲义(卡片化讲解) | llm-api-schema-reference.html | 第三篇 · Anthropic Messages |
| 协议讲义(怎么用) | llm-chat-protocol-guide.html | 7 篇协议讲义 |
| 姊妹:OpenAI Chat Completions | openai-chat-completions-schema.html | OpenAI 老协议 |
| 姊妹:OpenAI Responses | openai-responses-schema.html | OpenAI 新协议 |
| 三协议翻译表 | llm-api-schema-reference.html#part-mapping | 跨协议字段名对照 |
| 兼容方言陷阱(姊妹 case study) | ollama-tool-call-substitute.html | 本地模型实际行为差异 |