Haiku 5.5 API 报错排查:400、thinking 与响应解析

按 HTTP 状态、请求参数与响应块定位 Haiku 5.5 API 问题,提供完整修复示例。

35 分钟阅读
Haiku 5.5 API 报错排查:400、thinking 与响应解析

把 model 改成 claude-haiku-5-5 后出现 400,先检查旧请求有没有手动 thinking 预算、采样参数和最后一条 assistant 预填消息。如果 HTTP 请求已经成功,但程序显示空答案,则要检查 content 的类型与 stop_reason。这两种情况需要修复不同的代码。

本文针对 Anthropic Messages API 的请求与解析;不同云平台、网关的型号、鉴权和功能支持可能不同。资料核验于 2026 年 10 月 10 日。示例未经付费调用,下面的现象是排查分支,不是本站实际错误日志。

先用状态码缩小范围

保留 HTTP 状态、错误类型、错误消息和请求 ID,同时记录使用的地址、模型 ID 与客户端版本。分享记录前删除密钥和业务内容。不要只保留客户端改写后的“请求失败”。

现象优先检查下一步
400,提示请求参数无效thinking、采样参数、assistant prefill、旧工具定义用下方最小请求逐项恢复参数
401,密钥无效密钥与服务商是否匹配、完整性、鉴权字段按该服务商文档设置鉴权
404 或模型不存在请求路径、精确模型 ID、渠道权限分开核对路由地址和可用型号
429速率、并发、账户额度及错误正文按实际限额处理;遵循服务返回的重试指示
HTTP 成功,文本为空内容块类型、停止原因、工具调用先解析原始响应,再检查输出预算

这些是排查方向,不能只凭一个状态码断言原因。网关可能使用自己的错误格式,模型权限问题也可能以其他状态返回。

使用支持多模型的 API 中转服务时,核对协议比反复换 Key 更有帮助。例如 AICodeWith API 概览将 Claude 的 Anthropic 根地址与 OpenAI /v1 入口分开;不要把 Chat Completions 的 choices 解析逻辑用于 Messages 响应。

400:把手动 thinking 预算改为 adaptive

Haiku 4.5 的旧请求可能包含:

text
{
  "thinking": {"type": "enabled", "budget_tokens": 8000}
}

下载此示例源文件(TXT,保留换行与缩进)

Haiku 5.5 拒绝这一配置。改为 thinking: {"type": "adaptive"},通过 output_config.effort 调整投入。省略 thinking 也会使用默认 adaptive 行为,不能据此假设响应一定从文本开始。官方 thinking 迁移说明

将下面的 Python 示例保存为 haiku_check.py。它使用标准库,根据你设置的凭证选择请求头:官方直连使用 ANTHROPIC_API_KEY,AICodeWith 按接入文档使用 ANTHROPIC_AUTH_TOKEN。两者不要同时设置。

在 Bash/Zsh 中使用官方直连:

text
export ANTHROPIC_BASE_URL="https://api.anthropic.com"
export ANTHROPIC_API_KEY="YOUR_ANTHROPIC_API_KEY"
unset ANTHROPIC_AUTH_TOKEN
python3 haiku_check.py

下载此示例源文件(TXT,保留换行与缩进)

在 Bash/Zsh 中使用 AICodeWith:

text
export ANTHROPIC_BASE_URL="https://api.aicodewith.ai"
export ANTHROPIC_AUTH_TOKEN="YOUR_AICODEWITH_API_KEY"
unset ANTHROPIC_API_KEY
python3 haiku_check.py

下载此示例源文件(TXT,保留换行与缩进)

Windows PowerShell 的 AICodeWith 示例:

text
$env:ANTHROPIC_BASE_URL = "https://api.aicodewith.ai"
$env:ANTHROPIC_AUTH_TOKEN = "YOUR_AICODEWITH_API_KEY"
Remove-Item Env:ANTHROPIC_API_KEY -ErrorAction SilentlyContinue
py haiku_check.py

下载此示例源文件(TXT,保留换行与缩进)

这些命令需要已安装 Python 3,并在保存脚本的目录执行。Windows 如果没有 py 启动器,使用能够运行 Python 3 的 python 命令。把占位符换成目标服务商的完整密钥;不要把真实密钥提交到仓库。

Claude Code 的 settings.json 只影响相应客户端进程,不会自动把凭证传给单独启动的 Python。即使 Claude Code 已能正常使用,也需要在运行脚本的终端设置上述变量。其他网关根据其文档选择相应请求头,不能仅凭密钥名称判断。

text
import json
import os
import urllib.error
import urllib.request

base_url = os.getenv("ANTHROPIC_BASE_URL", "https://api.anthropic.com").rstrip("/")
api_key = os.getenv("ANTHROPIC_API_KEY", "").strip()
auth_token = os.getenv("ANTHROPIC_AUTH_TOKEN", "").strip()
if api_key and auth_token:
    raise SystemExit("同时设置了 API_KEY 和 AUTH_TOKEN,请按目标服务商文档只保留一种。")
if not api_key and not auth_token:
    raise SystemExit("请先在当前终端设置 ANTHROPIC_API_KEY 或 ANTHROPIC_AUTH_TOKEN。")
headers = {
    "anthropic-version": "2023-06-01",
    "content-type": "application/json; charset=utf-8",
}
if auth_token:
    headers["Authorization"] = "Bearer " + auth_token
else:
    headers["x-api-key"] = api_key
body = {
    "model": "claude-haiku-5-5",
    "max_tokens": 4096,
    "thinking": {"type": "adaptive"},
    "output_config": {"effort": "medium"},
    "messages": [{"role": "user", "content": "用一句话说明 HTTP 400 的含义。"}],
}
request = urllib.request.Request(
    base_url + "/v1/messages",
    data=json.dumps(body, ensure_ascii=False).encode("utf-8"),
    headers=headers,
    method="POST",
)
try:
    with urllib.request.urlopen(request, timeout=60) as response:
        result = json.load(response)
except urllib.error.HTTPError as error:
    print("HTTP", error.code)
    print(error.read().decode("utf-8", errors="replace"))
    raise SystemExit(1)
except urllib.error.URLError as error:
    raise SystemExit("连接失败:" + str(error.reason))

print("model:", result.get("model"))
print("stop_reason:", result.get("stop_reason"))
print("usage:", result.get("usage"))
text = "".join(
    block.get("text", "")
    for block in result.get("content", [])
    if block.get("type") == "text"
)
print("text:", text)

下载此示例源文件(TXT,保留换行与缩进)

这份示例只完成单轮、非流式、无工具请求;不会执行工具调用或自动继续截断输出。成功时检查 HTTP 状态、返回的型号和非空文本,不把代码示例当作已调用成功的证据。

如果它成功而原应用失败,比较两者最终发送的 JSON。SDK 默认值、框架配置或中间层可能在你没有显式设置时添加参数。每次只恢复一组参数,找到引发错误的最小差异。

400:删掉旧采样参数,尤其是 top_p: 1

最简单的兼容修复是省略 temperature、top_p 和 top_k。官方规则比“所有采样字段都不支持”更具体:

  • 显式提供 temperature 时只能为 1。
  • 显式提供 top_p 时只能为 0.99;旧代码常用的 1 会失败。
  • 任何 top_k 都会失败。
  • 同时传 temperature 和 top_p 也会失败,即使各自数值符合要求。

检查实际网络请求,而不是只搜索业务代码里的配置。旧 SDK、代理或框架若把默认采样值补上,删除上层字段后仍可能产生错误。采样参数规则

400:用 user 消息结束,替换 assistant prefill

旧应用有时在 messages 末尾放一条 assistant 消息,例如以 { 开头,让模型继续生成 JSON。Haiku 5.5 会拒绝这种 prefill,即使关闭 thinking 也一样。

如果目的是约束格式,使用目标平台支持的 structured outputs 或工具约束;如果只是想直接回答,把要求写入 system 或 user。如果目的是续写,把上次结尾作为资料放进 user 消息,并说明需要继续的位置。请求仍以 user 回合结束。

注意平台差异:官方迁移文档说明 Haiku 5.5 在 Amazon Bedrock 上不提供 structured outputs。不能把官方 Claude API 的格式功能直接写成所有渠道的能力;在缺少格式约束的渠道,需要在应用内验证 JSON 和字段。

请求成功却显示空文本:按类型解析 content

Haiku 5.5 默认使用 adaptive thinking,前面的内容块可能不是文本。下面这类固定取第一个块的写法容易漏掉回答:

text
answer = result["content"][0]["text"]

下载此示例源文件(TXT,保留换行与缩进)

单轮文本场景可以使用前面示例里的按 type == "text" 收集方式。完整 Agent 则要分别处理 text、thinking、tool_use 等内容;不能把筛出的文本重新当成完整 assistant 历史。工具结果回传时,应保留需要回传的原始块和关联字段。

默认 thinking 块可能只有签名,thinking 字段为空;这也不等于请求失败。需要摘要展示时,官方支持 thinking: {"type": "adaptive", "display": "summarized"}。这个设置用于展示,不替代最终文本解析。

再检查 stop_reason:

停止原因解释和处理
end_turn模型结束当前回合,再检查文本和业务字段
tool_use需要进入工具执行与结果回传流程,不能当作最终答案
max_tokens输出预算耗尽;可能在生成 thinking 后、文本前停止
refusal拒绝请求;按业务规则展示或转交处理,不能当作普通空答案重试

Thinking 也占用 max_tokens。截断时可增加合理上限或降低 effort,再检查任务复杂度;不要把减小输出上限当作通用省钱办法。Haiku 5.5 使用新版 tokenizer,旧模型的 Token 预算也需要重新估算。响应与预算变化

单轮成功、多轮失败:检查历史前缀和账户

如果最小请求正常,加入会话历史后出错,检查是否修改了已返回 thinking block 之前的 system、tools 或旧消息。Haiku 5.5 的前缀绑定会检查历史一致性;保持原前缀,并把新消息追加到末尾。官方对 2026 年 8 月 31 日之前创建的账户还列出了不同的生效条件,排查时不要忽略账户与相关设置。

Thinking blocks 还与生成它们的账户或关联账户绑定。另一个账户重放时,API 可能丢弃这些块并成功处理请求,因此“没有报错”也不能证明原推理完整保留。多账户网关的历史路由规则需要向提供商核对。

同一模型的历史与跨型号历史也不同。对跨型号重放,按官方的 thinking 兼容规则处理,不能假设所有 Claude 都读取彼此的块。历史重放与前缀绑定

使用 computer use 的应用还要独立检查工具版本和 Agent 循环;旧 computer_20250124 不是 Haiku 5.5 的可复用定义。具体替换路径按平台查阅同一份迁移指南。

完成修复后,用原来失败的任务重新验证:请求参数能被接受,停止原因被正确处理,文本或工具结果满足业务要求。保存脱敏后的请求、响应和版本记录,下一次升级时就能比较到底改变了哪一层。

相关资料

升级前需要核对容量和用途,可参考 Haiku 5.5 的规格与迁移概览;修复后若发现账单增加,继续检查 长上下文、缓存与渠道费用,不要仅按旧模型的 Token 数估算。