花了大半天排查一个配置问题,最后发现核心原因只有一句话就能讲清楚。但这个过程本身,比答案更有价值。

背景

我用 OpenClaw 搭了一个 AI 助手,挂在 Discord 上当日常工具用。之前一直跑的是 Google Gemini 3 Pro,稳得一批。最近想切到 Claude Opus 4.6 试试,选了 AWS Bedrock 做中间层——毕竟公司有现成的 AWS 账号,IAM 权限也配好了,觉得改个 JSON 就完事了。

然后就开始了长达数小时的排错之旅。

坑一:模型 ID 不是你以为的那个模型 ID

改完配置,重启 gateway,Discord bot 直接回复了一句冰冷的:

The provided model identifier is invalid.

我最初配的是:

{
  "id": "anthropic.claude-opus-4-6-v1",
  "name": "claude-opus-4-6"
}

看起来没毛病对吧?这就是 Bedrock 控制台里基础模型(Foundation Model)的 ID。

但 Bedrock 现在不让你直接用基础模型 ID 调用了。 较新的模型必须通过 Inference Profile 调用。这是 AWS 在 2025 年底开始强制推的机制,用来做跨区域路由和流量管理。

用 AWS CLI 一查就明白了:

aws bedrock list-inference-profiles --region us-east-1 | grep -i "opus"

出来的 ID 是 us.anthropic.claude-opus-4-6-v1,注意前面多了个 us. 前缀。

用基础模型 ID 调用,AWS 返回 The provided model identifier is invalid。用 inference profile ID 调用,通了。一个前缀的差距。

这个坑的恶心之处在于:Bedrock 控制台的模型列表页展示的就是基础模型 ID,inference profile 藏在另一个页面。你如果不知道这个机制,会以为自己抄的 ID 是对的。

坑二:OpenClaw 的 name 和 id,你以为改了就行?

改了 id 字段,重启,还是报 invalid

这时候日志给了一个关键线索:每次请求只用了 2 秒就完成了。Claude Opus 4.6 的正常响应时间怎么着也得 20-40 秒。2 秒,说明根本没有真正调用模型,API 直接返回错误了。

问题出在 OpenClaw 内部。它有两个字段:idname。我改了 id,但 name 还是 claude-opus-4-6。OpenClaw 在某些路径下会用 name 而不是 id 去拼 Bedrock 的 API 请求。

修复方法很暴力:把 name 也改成 inference profile ID,同时把 agents 配置里所有引用这个模型的地方都对齐。

改之前:

"models": [{
  "id": "us.anthropic.claude-opus-4-6-v1",
  "name": "claude-opus-4-6"
}],
"agents": {
  "defaults": {
    "model": { "primary": "bedrock:us-east-1/claude-opus-4-6" }
  }
}

改之后:

"models": [{
  "id": "us.anthropic.claude-opus-4-6-v1",
  "name": "us.anthropic.claude-opus-4-6-v1"
}],
"agents": {
  "defaults": {
    "model": { "primary": "bedrock:us-east-1/us.anthropic.claude-opus-4-6-v1" }
  }
}

改完重启,日志里的请求时间从 2 秒变成了 33 秒。这才是真正在调模型的表现。

坑三:Gemini 的 1M 上下文 vs Claude 的 200K 上下文

模型调通了,webchat 完美运行。但 Discord bot 还是不行,这次报了个新错:

Context overflow: prompt too large for the model.

原因很简单:Gemini 3 Pro 的上下文窗口是 1M tokens,Claude Opus 4.6 只有 200K

OpenClaw 的 Discord 会话是按 channel 绑定的,同一个 channel 共用一个 session,所有历史消息都在里面累积。之前用 Gemini 的时候,1M 的窗口随便塞。切到 Claude 后,旧会话的历史直接把 200K 撑爆了。

解决方法:删掉旧的会话文件,让 Discord channel 创建一个新的 session。

# 找到会话文件
find ~/.openclaw -name "*.json" -path "*/sessions/*"
# 删掉对应的 Discord 会话
rm <对应的会话文件>
# 重启 gateway
openclaw gateway restart

这个问题本身不复杂,但它暴露了一个容易被忽略的事实:切换模型不只是换个 ID,上下文窗口、token 限制、compaction 策略都要跟着调。Gemini 和 Claude 的上下文差了 5 倍,这不是一个可以无视的差异。

排查过程中的一些经验

1. 看响应时间比看错误日志更有效。

OpenClaw 会把 Bedrock 返回的错误信息当成正常回复发出去,日志里看不到 error。但响应时间会暴露一切:2 秒完成 = API 直接报错返回了;33 秒完成 = 模型真的在思考。

2. 用 AWS CLI 先验证,再改配置。

别在 OpenClaw 的配置上反复试错。先用 aws bedrock-runtime converse 命令确认模型 ID 能通,再回去改 JSON。OpenClaw 中间多了一层抽象,出了问题不知道是 AWS 的锅还是 OpenClaw 的锅。

aws bedrock-runtime converse \
  --model-id "us.anthropic.claude-opus-4-6-v1" \
  --region "us-east-1" \
  --messages '[{"role":"user","content":[{"text":"hi"}]}]'

3. Inference Profile 是 Bedrock 的新常态。

如果你以前用过 Bedrock 的老模型(比如 Claude 3),可能没遇到这个问题,因为老模型还支持直接调用。但从 Opus 4.5 开始,AWS 强制要求走 inference profile。以后配任何 Bedrock 模型,第一步就该 list-inference-profiles

4. 切模型要做 checklist,不能只改一行。

我整理了一个最小 checklist:

检查项 Gemini 3 Pro Claude Opus 4.6
模型 ID 格式 直接用模型名 需要 inference profile ID
上下文窗口 1,000,000 tokens 200,000 tokens
maxTokens 8192 16384
会话历史 可以很长 需要及时 compaction
认证方式 API Key AWS SDK (IAM)

最终可用的配置

给后来人留个参考,这是验证过能跑通的完整 Bedrock 配置片段:

{
  "models": {
    "providers": {
      "bedrock:us-east-1": {
        "baseUrl": "us-east-1",
        "api": "bedrock-converse-stream",
        "auth": "aws-sdk",
        "models": [{
          "id": "us.anthropic.claude-opus-4-6-v1",
          "name": "us.anthropic.claude-opus-4-6-v1",
          "input": ["text", "image"],
          "contextWindow": 200000,
          "maxTokens": 16384
        }]
      }
    }
  },
  "agents": {
    "defaults": {
      "model": {
        "primary": "bedrock:us-east-1/us.anthropic.claude-opus-4-6-v1"
      },
      "models": {
        "bedrock:us-east-1/us.anthropic.claude-opus-4-6-v1": {
          "alias": "claude"
        }
      },
      "compaction": {
        "mode": "safeguard"
      }
    }
  }
}

前提条件:

  • 本地已配置 AWS CLI(aws configureaws sso login
  • IAM 权限包含 bedrock:InvokeModelbedrock:InvokeModelWithResponseStream
  • 你所在的区域已开通 Claude Opus 4.6 的模型访问权限

写在最后

这篇文章的技术含量其实不高。三个坑加起来,核心知识点也就是:inference profile、name/id 对齐、上下文窗口差异。

但我想记录的不是答案本身,而是排查问题的思路。在 AI Agent 这个领域,你面对的不是一个系统,而是一条链路:你的配置 → OpenClaw 的抽象层 → AWS Bedrock 的 API → Claude 模型本身。链路上的每一环都可能出问题,而且错误信息经常被中间层吞掉或者包装成你看不懂的样子。

学会沿着链路一步步验证——先确认 AWS 凭证,再确认模型 ID,再确认 OpenClaw 配置,最后确认会话状态——这个方法论比任何一个具体的修复方案都更有价值。

毕竟 AI Agent 的玩法每天都在变,但排查问题的逻辑是通用的。