门户首页
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。

生成时间:2026-09-02 19:35 · 版本 v0.2 · 生成 Agent:MiniMax Code (LLM: MiniMax-M3) · 载体:agentsoft-research-platform teaching-web-platform

概览

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 CompletionsAnthropic Messages
URL/v1/chat/completions/v1/messages
认证头Authorization: Bearerx-api-key(自定义头,不用 Bearer)
版本头无anthropic-version: 2023-06-01 必填
Content-Typeapplication/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—booleanfalse是否流式(SSE)
tools—ToolDefinition[]null工具定义。扁平(无包装层)
tool_choice—object{type:"auto"}结构化对象,不是字符串枚举:
· {type:"auto"} 模型自决
· {type:"any"} 必须调某个工具
· {type:"tool",name:"X"} 强制调指定工具
metadata—objectnull元信息,目前只支持 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
  }
}
字段表
字段类型说明
idstring"msg_..." 响应 ID
type"message"对象类型
role"assistant"固定
modelstring实际使用的模型
contentOutputBlock[]★ 必为数组(text + tool_use 可同轮并存)
stop_reasonenum循环分支依据。6 个值(见下表)
stop_sequencestring | null实际触发的停止序列(stop_reason: "stop_sequence" 时有值)
usage.input_tokensnumber输入 token 数
usage.output_tokensnumber输出 token 数
usage.cache_creation_input_tokensnumber本次创建的缓存 token 数(cache_control 写入时)
usage.cache_read_input_tokensnumber本次读取缓存的 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
图 1 · 流式事件显式状态机:message_start → block 循环(start → delta×N → stop)→ message_delta → message_stop
delta 4 种 type
delta.type字段用途
text_deltatext文本流式增量
input_json_deltapartial_json工具入参分片(需 content_block_start/stop 框定边界后拼接)
thinking_deltathinking思维链增量(extended thinking 模型)
signature_deltasignature思维链签名增量(保证完整性)
与 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 内部问题。指数退避重试
529API 过载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_controlsystem block / content block / 工具定义显式缓存断点 {type:"ephemeral"}
cache_creation_input_tokensusage本次创建的缓存 token 数
cache_read_input_tokensusage本次读取缓存的 token 数
contentmessage消息内容(user 是 string 或 block[],assistant 必为 block[])
content_block流式 content_block_start块内容(text / tool_use / thinking)
dataredacted_thinking block / image.sourcebase64 数据 / 加密思维链
delta流式 content_block_delta / message_delta增量内容
descriptiontools[].description工具描述
id响应顶层 / tool_use block响应 ID / 工具调用配对键
index流式 content_block_*块索引(聚合用)
inputtool_use block工具入参(对象,不是 JSON 字符串)
input_json_delta流式 content_block_delta工具入参分片(partial_json 字符串)
input_schematools[]工具参数 schema(命名直白)
input_tokensusage输入 token 数
is_errortool_result blockschema 原生错误标记(OpenAI 无)
max_tokens请求顶层必填!最大生成 token 数
media_typeimage.sourceimage/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_tokensusage输出 token 数
partial_json流式 input_json_delta工具入参分片 JSON
ping流式事件 type心跳(协议内建)
redacted_thinkingblock type加密思维链
rolemessage"user" / "assistant"
signaturethinking block防篡改签名(回填必须原样保留)
signature_delta流式 content_block_delta思维链签名增量
sourceimage / document blockbase64 / 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文本流式增量
thinkingthinking block思维链内容(extended thinking 模型)
thinking_delta流式 content_block_delta思维链增量
tool_choice请求顶层工具选择(结构化对象,不是字符串枚举)
tool_resultblock type工具结果(嵌在 user 消息)
tool_useblock type工具调用(id + name + input 对象)
tool_use_idtool_result block与 tool_use.id 严格配对
tools请求顶层工具定义数组
top_k请求顶层仅从前 K 个 token 采样(OpenAI 无)
top_p请求顶层nucleus 采样
type响应顶层 / block type / 错误响应对象 / block / 错误类型
urlimage.source图片 URL(type:"url" 时)
usage响应顶层 / 流式 message_deltatoken 使用情况(含 2 项缓存计费)
user_idmetadata终端用户 ID(滥用检测)

10. 引用与配套资料

来源链接 / 路径说明
Anthropic Messages API 文档(权威)docs.anthropic.com/en/api/messages官方权威源
Anthropic Tool Use Overviewdocs.anthropic.com/en/docs/agents-and-tools/tool-use/overview工具调用最佳实践
Anthropic Streaming Eventsdocs.anthropic.com/en/api/streaming流式事件完整参考
Anthropic Extended Thinkingdocs.anthropic.com/en/docs/build-with-claude/extended-thinking思维链 + signature 机制
Anthropic Prompt Cachingdocs.anthropic.com/en/docs/build-with-claude/prompt-cachingcache_control 显式缓存断点
教学讲义(卡片化讲解)llm-api-schema-reference.html第三篇 · Anthropic Messages
协议讲义(怎么用)llm-chat-protocol-guide.html7 篇协议讲义
姊妹:OpenAI Chat Completionsopenai-chat-completions-schema.htmlOpenAI 老协议
姊妹:OpenAI Responsesopenai-responses-schema.htmlOpenAI 新协议
三协议翻译表llm-api-schema-reference.html#part-mapping跨协议字段名对照
兼容方言陷阱(姊妹 case study)ollama-tool-call-substitute.html本地模型实际行为差异