第 7 章

Messages API 全参数解析:27个参数的作用、默认值与最佳实践

第七章:Messages API 完全参考:参数、版本与兼容性

7.1 Messages API 概览

POST https://api.anthropic.com/v1/messages 是 Claude 的核心 API 端点。理解其每个参数的精确语义,是构建可靠生产系统的基础。本章系统梳理所有参数的作用、默认值、限制和注意事项。

请求结构总览

{
  "model": "claude-sonnet-4-6",
  "max_tokens": 1024,
  "messages": [...],
  "system": "...",
  "temperature": 1.0,
  "top_p": null,
  "top_k": null,
  "stop_sequences": [],
  "stream": false,
  "tools": [],
  "tool_choice": {"type": "auto"},
  "thinking": null,
  "metadata": {},
  "betas": []
}

响应结构总览

{
  "id": "msg_01XFDUDYJgAACzvnptvVoYEL",
  "type": "message",
  "role": "assistant",
  "content": [
    {"type": "text", "text": "..."},
    {"type": "tool_use", "id": "toolu_...", "name": "...", "input": {}}
  ],
  "model": "claude-sonnet-4-6",
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 100,
    "output_tokens": 200,
    "cache_creation_input_tokens": 0,
    "cache_read_input_tokens": 0
  }
}

7.2 必需参数

model(必需)

指定要使用的模型 ID。

# 当前主要模型 ID(2025年)
MODELS = {
    # 最强推理能力
    "claude-opus-4-6": {
        "context": 200_000,
        "thinking": True,
        "vision": True,
        "input_price": 15.0,   # $/M tokens
        "output_price": 75.0,
    },
    # 生产推荐默认值
    "claude-sonnet-4-6": {
        "context": 200_000,
        "thinking": True,
        "vision": True,
        "input_price": 3.0,
        "output_price": 15.0,
    },
    # 高速低成本
    "claude-haiku-4-5-20251001": {
        "context": 200_000,
        "thinking": False,
        "vision": True,
        "input_price": 0.25,
        "output_price": 1.25,
    },
}

重要细节

max_tokens(必需)

控制模型在这次响应中最多可生成的 token 数。

# 不同模型的 max_tokens 上限
MAX_TOKENS_LIMITS = {
    "claude-opus-4-6": 32_000,     # 普通模式
    # 开启 extended thinking 时最多 32K,思考 tokens 不计入此限制
    "claude-sonnet-4-6": 64_000,
    "claude-haiku-4-5-20251001": 8_192,
}

# 注意:max_tokens 是上限,不是目标值
# 模型会在内容完成时提前停止(stop_reason = "end_turn")
# 只有在达到上限时才会截断(stop_reason = "max_tokens")

常见错误:设置过低的 max_tokens 导致响应被截断:

import anthropic

client = anthropic.Anthropic()

# 危险:如果实际响应需要 2000 tokens,这会截断输出
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=100,  # ← 过低
    messages=[{"role": "user", "content": "详细解释量子计算的工作原理"}]
)

# 检查是否被截断
if response.stop_reason == "max_tokens":
    print("警告:响应被截断!考虑增加 max_tokens")

messages(必需)

对话历史数组。每条消息是一个包含 rolecontent 的对象。

role 枚举值

content 的两种形式

# 形式一:字符串(简单文本)
{"role": "user", "content": "你好"}

# 形式二:内容块数组(支持多模态)
{
  "role": "user",
  "content": [
    {"type": "text", "text": "描述这张图片"},
    {
      "type": "image",
      "source": {
        "type": "base64",
        "media_type": "image/jpeg",
        "data": "/9j/4AAQ..."  # base64 编码的图片
      }
    }
  ]
}

# 图片也可以通过 URL 引用(需要公开可访问)
{
  "type": "image",
  "source": {
    "type": "url",
    "url": "https://example.com/image.jpg"
  }
}

消息顺序规则

# 有效的消息序列
messages = [
    {"role": "user", "content": "你好"},
    {"role": "assistant", "content": "你好!有什么我能帮你的吗?"},
    {"role": "user", "content": "解释 REST API"}
]

# 无效:连续的 user 消息(会报 400 错误)
messages_invalid = [
    {"role": "user", "content": "你好"},
    {"role": "user", "content": "你在吗"}  # ← 错误!
]

# 修复:合并连续的用户消息
messages_fixed = [
    {"role": "user", "content": "你好,你在吗?"}
]

7.3 可选参数:采样控制

temperature

控制输出的随机性/创意性。范围 0.0-1.0(扩展思考模式强制为 1.0)。

temperature 的直观含义:

0.0 → 最确定性(每次相同输入输出最可能的结果)
0.5 → 平衡
1.0 → 最随机/创意(Claude 的默认值)

实用参考值:
  代码生成/数学:0.0-0.2(需要精确,不想随机)
  事实问答:0.0-0.3
  摘要/提取:0.0-0.5
  对话聊天:0.5-0.8
  创意写作:0.7-1.0
  头脑风暴:0.9-1.0
# 代码生成:低 temperature 确保可重复性
code_response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    temperature=0.1,  # 接近确定性
    messages=[{"role": "user", "content": "写一个二分查找的 Python 实现"}]
)

# 创意写作:高 temperature 增加多样性
story_response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    temperature=0.9,
    messages=[{"role": "user", "content": "写一个关于时间旅行者的短故事开头"}]
)

注意temperature 不等于"质量控制"。低 temperature 不能修复有缺陷的 prompt,高 temperature 不会让好 prompt 更差(只是更有创意)。

top_ptop_k

核采样参数,通常不需要同时使用多个采样参数:

# top_p (nucleus sampling):只从累计概率达到 top_p 的 token 中采样
# 默认值:不设置(即使用 1.0)
# 当 top_p=0.9 时,只考虑累计概率前 90% 的 token

# top_k:只从概率最高的 k 个 token 中采样
# 默认值:不设置
# 当 top_k=50 时,只考虑概率最高的 50 个 token

# Anthropic 的建议:只调整其中之一,不要同时修改多个采样参数
# 对于大多数用例,只调 temperature 就足够了

stop_sequences

指定一个字符串列表。当模型输出中出现任意一个字符串时,立即停止生成。

# 常见用途:强制单行输出
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=100,
    stop_sequences=["\n"],  # 在第一个换行符处停止
    messages=[{"role": "user", "content": "用一句话描述 Python 语言"}]
)

# 用途二:强制停在特定标记处
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    stop_sequences=["</answer>"],  # 在结束标签处停止,避免生成多余内容
    messages=[{
        "role": "user",
        "content": "回答以下问题,将答案放在 <answer> 标签中。问题:什么是哈希表?"
    }],
)

# 检查是否因 stop_sequence 停止
if response.stop_reason == "stop_sequence":
    print(f"停止于:{response.stop_sequence!r}")

最多可指定 4 个停止序列,每个最长 256 字符。

7.4 系统提示(system

系统提示支持两种形式:

# 形式一:字符串
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    system="你是一个有帮助的助手。",
    messages=[...]
)

# 形式二:内容块数组(支持缓存控制)
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": "你是一个有帮助的助手。\n\n" + large_reference_doc,
            "cache_control": {"type": "ephemeral"}  # 启用缓存
        }
    ],
    messages=[...]
)

系统提示的内容类型限制:只允许文本块,不允许图片或工具结果。

7.5 工具相关参数

tools

定义模型可以调用的工具列表。每个工具包含:

tools = [
    {
        "name": "get_weather",           # 工具名称(字母数字下划线)
        "description": "获取指定城市的当前天气",  # 工具功能描述
        "input_schema": {               # 参数的 JSON schema
            "type": "object",
            "required": ["city"],
            "properties": {
                "city": {
                    "type": "string",
                    "description": "城市名称,如 '北京'、'上海'"
                },
                "units": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"],
                    "description": "温度单位,默认 celsius"
                }
            }
        }
    }
]

tool_choice

控制模型是否/如何使用工具:

# 自动决定(默认):模型根据对话内容决定是否调用工具
tool_choice = {"type": "auto"}

# 强制使用任意一个工具
tool_choice = {"type": "any"}

# 强制使用特定工具
tool_choice = {"type": "tool", "name": "get_weather"}

# 禁止使用工具(即使定义了工具)
tool_choice = {"type": "none"}

完整的工具调用流程

import anthropic
import json

client = anthropic.Anthropic()

def get_weather(city: str, units: str = "celsius") -> dict:
    """模拟天气 API"""
    return {
        "city": city,
        "temperature": 22 if units == "celsius" else 72,
        "condition": "晴天",
        "humidity": 65
    }

def chat_with_tools(user_message: str) -> str:
    tools = [{
        "name": "get_weather",
        "description": "获取城市的当前天气信息",
        "input_schema": {
            "type": "object",
            "required": ["city"],
            "properties": {
                "city": {"type": "string"},
                "units": {"type": "string", "enum": ["celsius", "fahrenheit"]}
            }
        }
    }]
    
    messages = [{"role": "user", "content": user_message}]
    
    # 第一轮:模型决定是否调用工具
    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        tools=tools,
        messages=messages
    )
    
    # 处理工具调用
    while response.stop_reason == "tool_use":
        # 将 assistant 响应加入历史
        messages.append({"role": "assistant", "content": response.content})
        
        # 处理所有工具调用
        tool_results = []
        for block in response.content:
            if block.type == "tool_use":
                # 执行工具
                if block.name == "get_weather":
                    result = get_weather(**block.input)
                else:
                    result = {"error": f"未知工具: {block.name}"}
                
                tool_results.append({
                    "type": "tool_result",
                    "tool_use_id": block.id,
                    "content": json.dumps(result, ensure_ascii=False)
                })
        
        # 将工具结果加入历史
        messages.append({"role": "user", "content": tool_results})
        
        # 下一轮:模型根据工具结果生成响应
        response = client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=1024,
            tools=tools,
            messages=messages
        )
    
    # 返回最终文本响应
    return next(
        (block.text for block in response.content if block.type == "text"),
        ""
    )

print(chat_with_tools("北京今天天气怎么样?"))

7.6 Extended Thinking 参数

thinking

为支持的模型(Opus 和 Sonnet)开启扩展思考:

response = client.messages.create(
    model="claude-opus-4-6",
    max_tokens=16_000,
    thinking={
        "type": "enabled",
        "budget_tokens": 10_000  # 分配给思考过程的最大 token 数
    },
    messages=[{"role": "user", "content": "证明勾股定理有多少种方法?请列举至少 5 种。"}]
)

# 响应包含两种类型的内容块
for block in response.content:
    if block.type == "thinking":
        print(f"[思考过程]\n{block.thinking[:500]}...\n")
    elif block.type == "text":
        print(f"[最终答案]\n{block.text}")

# 使用注意事项:
# 1. budget_tokens 必须 >= 1024
# 2. max_tokens 必须 > budget_tokens
# 3. 思考 tokens 按输出价格计费
# 4. 开启思考时 temperature 强制为 1.0
# 5. 思考模式下不支持 top_p 和 top_k

思考块的 API 处理

在多轮对话中,思考块可以传回 API(不必须,但有助于保持推理连续性):

def multi_turn_with_thinking(questions: list[str]) -> list[str]:
    """多轮对话中保留思考历史"""
    messages = []
    answers = []
    
    for question in questions:
        messages.append({"role": "user", "content": question})
        
        response = client.messages.create(
            model="claude-opus-4-6",
            max_tokens=8000,
            thinking={"type": "enabled", "budget_tokens": 4000},
            messages=messages
        )
        
        # 将完整的 assistant 响应(包含思考块)加入历史
        messages.append({
            "role": "assistant",
            "content": response.content  # 包含 thinking 和 text 块
        })
        
        # 提取文本答案
        text = next((b.text for b in response.content if b.type == "text"), "")
        answers.append(text)
    
    return answers

7.7 请求元数据

metadata

向请求附加任意元数据,用于日志追踪和审计:

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    metadata={
        "user_id": "usr_12345",          # 可选的最终用户 ID
        "session_id": "sess_abc",
        "request_source": "mobile_app",
        "feature_flag": "new_prompt_v2"
    },
    messages=[{"role": "user", "content": "..."}]
)

user_id 字段有特殊意义:Anthropic 可能用它来检测滥用行为,并在发现问题时更精准地限制特定用户而非整个 API key。

API 版本头

每个请求都需要 anthropic-version 头(SDK 自动添加):

# SDK 自动添加正确的版本头
# 当前版本:2023-06-01
# 直接使用 HTTP 时需要手动指定:
# -H "anthropic-version: 2023-06-01"

betas(Beta 功能)

某些实验性功能需要显式开启 Beta 标志:

# 示例:开启某个 beta 功能(具体名称以官方文档为准)
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    betas=["feature-name-2024-01"],  # beta 功能标识符
    messages=[...]
)

7.8 版本兼容性与迁移

API 版本策略

Anthropic 的 API 版本策略:

版本格式:YYYY-MM-DD(如 2023-06-01)

版本兼容性保证:
- 已发布的版本不会破坏性变更
- 新功能在现有版本中添加(向后兼容)
- 废弃通知提前至少 6 个月

目前只有一个稳定版本:2023-06-01

模型版本迁移指南

当 Anthropic 发布新模型版本时,迁移注意事项:

# 版本迁移安全检查清单
def validate_model_migration(old_model: str, new_model: str, test_cases: list) -> dict:
    """
    在切换模型版本前,验证新版本与旧版本的行为一致性
    """
    results = {"passed": 0, "failed": 0, "regressions": []}
    
    for case in test_cases:
        old_response = client.messages.create(
            model=old_model,
            max_tokens=1024,
            messages=[{"role": "user", "content": case["prompt"]}]
        )
        
        new_response = client.messages.create(
            model=new_model,
            max_tokens=1024,
            messages=[{"role": "user", "content": case["prompt"]}]
        )
        
        old_text = old_response.content[0].text
        new_text = new_response.content[0].text
        
        # 基础检查:格式是否保持(如果期望结构化输出)
        if "expected_format" in case:
            try:
                import json
                json.loads(new_text)
                results["passed"] += 1
            except json.JSONDecodeError:
                results["failed"] += 1
                results["regressions"].append({
                    "prompt": case["prompt"][:100],
                    "issue": "新模型输出不是有效 JSON"
                })
    
    return results

7.9 错误码完全参考

HTTP 状态码    错误类型                     含义
────────────   ─────────────────────        ─────────────────────
400            invalid_request_error        请求格式错误(参数无效)
401            authentication_error         API Key 无效或缺失
403            permission_error             权限不足(通常是内容策略)
404            not_found_error              模型 ID 不存在
413            request_too_large            请求体超过大小限制
422            unprocessable_entity_error   内容违反使用政策
429            rate_limit_error             超过速率限制
500            api_error                    Anthropic 服务端错误
529            overloaded_error             服务过载(临时)

解读常见 400 错误

# 导致 400 错误的常见原因:

# 1. max_tokens 超过模型上限
client.messages.create(
    model="claude-haiku-4-5-20251001",
    max_tokens=100_000,  # Haiku 上限 8192!
    messages=[...]
)

# 2. messages 格式违反交替规则
client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "问题一"},
        {"role": "user", "content": "问题二"},  # 连续 user 消息 → 400
    ]
)

# 3. 总输入超过模型上下文窗口
# system(50K) + messages(180K) > 200K → 400

# 4. thinking + stop_sequences 同时使用(不支持)
client.messages.create(
    model="claude-opus-4-6",
    max_tokens=5000,
    thinking={"type": "enabled", "budget_tokens": 2000},
    stop_sequences=["END"],  # 思考模式不支持 stop_sequences → 400
    messages=[...]
)

小结

Messages API 的参数设计反映了 Anthropic 在灵活性和安全性之间的取舍:

必需参数(model + max_tokens + messages)构成最小有效请求。

采样参数(temperature/top_p/top_k/stop_sequences)控制输出的随机性和终止条件。对于大多数应用,只需要调整 temperature。

系统提示(system)是定义模型行为的核心工具,支持缓存控制来优化高频请求的成本。

工具调用(tools + tool_choice)是实现 agentic 工作流的基础,完整的调用循环需要处理 stop_reason == "tool_use" 的状态。

扩展思考(thinking)为复杂推理任务提供额外的推理 token 预算,仅 Opus 和 Sonnet 支持。

下一章将专注于多轮对话的管理:如何在保持上下文质量的同时控制历史长度,以及会话持久化的最佳实践。

本章评分
4.6  / 5  (74 评分)

💬 留言讨论