OpenClaw 里想用 amazon-bedrock,得手写 openclaw.json 的 providers,还得在本机长期留一份 AWS 密钥。这条思路可以换:用 TaoToken 的统一接入,先去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建一把 API Key,然后照着 amazon-bedrock 的 provider 格式,在同一个 providers 列表里补一个 TaoToken 条目,baseUrl 填 https://taotoken.net/api,模型 id 用模型广场上当前可用的那个。最后把 agents.defaults.model.primary 指过去,执行一次 openclaw gateway restart,模型请求就能从这条兼容通道走。
之所以盯着 amazon-bedrock 那份配置改,是因为它把 OpenClaw 里「一个 provider 到底该怎么写」示范得很完整:baseUrl、auth、api、models 四件套,一个不少。把这四个字段吃透,换成别的统一 API 通道,手感其实是同一套。下面按原文的四步顺序走一遍,每一步都对应地说明改哪儿、为什么改。
1. openclaw.json 的 providers 里为什么没有 amazon-bedrock
1.1 默认 provider 列表覆盖不到 AWS 这一路
OpenClaw 出厂自带的 provider 大多冲着标准的 OpenAI 风格接口去,而 amazon-bedrock 走的是 AWS SDK 加 Converse 流式接口,认证方式也不是一个 Authorization 头能解决的,所以在选模型的界面里翻不到它,属于正常现象。打开 ~/.openclaw/openclaw.json,会看到 providers 是一个数组,里面每个元素代表一家模型服务的接入方式,这就是官方留出来的扩展位。
换句话说,缺的不是功能,缺的是一段没人替你写好的配置。
1.2 原文的手工路径:.env 加 providers 两条腿
原始那篇的做法是把这件事拆成四步。第一步在 ~/.openclaw/ 下新建一个 .env,写入 AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_REGION 三个键,键名区分大小写,作用是让 openclaw gateway 在初始化阶段读到这组访问令牌。第二步回到 openclaw.json,在 providers 列表里追加一个 amazon-bedrock 对象,baseUrl 指向 bedrock-runtime 的区域端点,auth 写 aws-sdk,api 写 bedrock-converse-stream,models 数组里逐个列出要用的模型。第三步把 agents.defaults.model.primary 写成「provider 名/模型 id」。第四步重启网关。
四步拆开看,真正跟 AWS 绑死的只有第一步、第二步里的 baseUrl,以及 auth、api 那两个取值。模型 id 本来就该按实际开通情况来填,跟通道本身没有强绑定关系。
1.3 换成 TaoToken 之后,要动的其实只有两处
想清楚这一点,替换就变得很简单。令牌那一层,不再往 .env 里塞 AWS 三件套,改成放一把 Key;provider 那一层,baseUrl 换成 https://taotoken.net/api ,auth 和 api 换成你本地 OpenClaw 版本里对应「OpenAI 兼容通道」的那两个取值。agents 段和重启动作,基本照抄原文就行。
2. .env 里那三行 AWS 令牌,换成一个 Key
2.1 先去把 Key 创建出来
浏览器打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end ,注册登录后进控制台,在 API Keys 页面新建一把 Key。复制出来的那串就是后面要写进配置的东西,本文统一用 YOUR_API_KEY 代替,别把真 Key 贴到会公开的地方。
顺手做一件事:在模型广场里确认一下你打算用的模型 id 到底是什么写法。带版本后缀、带日期后缀的,一律以页面上显示的为准,不要凭记忆手编一个看起来差不多的。
2.2 ~/.openclaw/.env 只留一行
回到终端,把原来的 AWS 三行注掉或者删掉,换成一行:
# ~/.openclaw/.env TAOTOKEN_API_KEY=YOUR_API_KEY键名的书写习惯跟原文保持一致,全大写加下划线。写完之后不用手动 export,openclaw gateway 启动时会读这个文件。如果你更习惯用系统级环境变量,export 一份同名的也行,两种方式选一种,别两边都写还写得不一样。
2.3 这一步和原文的差异在哪
原文那三行是为了让 AWS SDK 自己完成签名,所以必须给到 AK、SK 和区域。这边认证靠一把 Key 解决,本机不需要再存一份云厂商的长效凭证,环境变量这一层从三个缩到一个。
顺带提一句,Key 尽量别写进会提交到仓库的文件里。.env 本身通常在忽略列表内,但如果你把它挪到了别处,记得顺手加一条忽略规则。
3. 在 providers 列表里补一个 taotoken 条目
3.1 先把 amazon-bedrock 那四个字段拆开看
原文那份配置里,真正决定「怎么连」的是这四个字段:
| 字段 | amazon-bedrock 的写法 | 作用 |
|---|---|---|
| baseUrl | https://bedrock-runtime.us-east-1.amazonaws.com | 请求打到哪个端点 |
| auth | aws-sdk | 用什么方式做认证 |
| api | bedrock-converse-stream | 用哪套协议说话 |
| models | 一组模型对象 | 这家服务下有哪些模型可用 |
baseUrl、auth、api 三个字段必须严格按 OpenClaw 支持的取值写,写错一个,网关要么起不来,要么起来了也连不通。models 是你要自己决定的,id 按实际能访问到的模型填。
3.2 照着这个格式写 provider
打开 ~/.openclaw/openclaw.json,找到 providers 这个数组,在末尾追加下面这段。baseUrl 写 https://taotoken.net/api ,注意末尾不要加 /v1,路径由客户端自己拼。
{ "taotoken": { "baseUrl": "https://taotoken.net/api", "auth": "api-key", "api": "openai-chat-completions", "models": [ { "id": "以模型广场当时列表为准", "name": "兼容通道模型", "reasoning": false, "input": ["text"], "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 0, "maxTokens": 0 } ] } }几点说明。第一,auth 和 api 的取值请对齐你本地 OpenClaw 版本支持的枚举,不同版本叫法可能有差别,别直接照抄 bedrock-converse-stream,那是 AWS 专用的协议标识。第二,cost、contextWindow、maxTokens 这几个数字以模型广场页面当时标注的为准,页面上没标的就先别塞具体数字,宁可留空也别编。第三,id 是整份配置里最关键的一格,下一节专门讲。
3.3 模型 id 从模型广场拿,别手编
很多人在这里栽跟头,是因为随手写了个看着眼熟的名字。可用的模型列表在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 的模型广场里,页面显示什么就写什么,一个字符都别改。带冒号、带短横线的长 id 要整段复制,手敲几乎必错。
如果你打算配多个模型,就在 models 数组里多加几个对象,每个对象 id 各不相同。primary 只会用到其中一个,其余的先放着,哪天想切再改那一行就行。这样做的好处是切换成本很低,不用每次都回来重写整段 provider。
4. agents.defaults.model.primary 指到新通道
4.1 primary 和 fallbacks 怎么摆
provider 加好还不算完,得告诉 agent 默认用谁。在 openclaw.json 里找到 agents.defaults.model,把 primary 写成「provider 名 / 模型 id」的形式:
"agents": { "defaults": { "model": { "primary": "taotoken/YOUR_MODEL_ID", "fallbacks": [] } } }斜杠前面是你在上一步起的 provider 名,必须一字不差;斜杠后面是 models 数组里那个 id。原文里写的是 amazon-bedrock/us.amazon.nova-2-lite-v1:0,同一个套路,只是把前缀换掉、把 id 换成模型广场上的那一个。
fallbacks 是备选队列。如果你本地还挂着别的 provider,可以按优先级往下排,主通道抽风时能兜住。只配一个通道的话,留空数组就行,不用硬凑。
4.2 models 段里的 alias 配套
原文在 agents.defaults.models 里给每个模型配了个 alias,把长长的模型 id 缩成一个短名字。这个不是必须的,但配了之后在会话里切模型会舒服很多:
"models": { "taotoken/YOUR_MODEL_ID": { "alias": "tt" } }键名同样是「provider 名 / 模型 id」,和 primary 保持完全一致,差一个字符就认不出来。alias 本身随意起,只要别跟已有的重名。
5. openclaw gateway restart 之后怎么确认真的通了
5.1 起网关,先看日志
配置保存之后执行:
openclaw gateway restart盯一下启动输出。正常起来的话,日志里会列出加载到的 provider 数量和默认模型。如果 provider 总数没变,多半是 JSON 少了个逗号或者括号没闭合,找个 JSON 校验器过一遍最快;如果起来了但一调用就报认证相关,先去检查 .env 里的键名有没有拼错。
5.2 用同一把 Key 发一条测试消息
网关起来不等于通。稳妥的做法是拿同一把 Key,在 模型对话 里发一条最简单的消息,看模型 id 和通道是不是都能正常回应。
这一步的意义在于把问题范围缩到一半:模型对话里能回,说明 Key 和模型 id 没问题,剩下的锅在 OpenClaw 的配置里;模型对话里也报错,那就先把 Key 或模型 id 处理掉,别在 openclaw.json 里绕圈子。
5.3 回控制台对一下这次调用
再回到 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 的控制台,翻一下用量记录,刚才那条测试消息应该能对上号。如果折腾了半天一条记录都没有,说明请求根本没打出去,回头看看 baseUrl 有没有被某个工具自作主张补成别的地址。
看到记录的那一刻,整条链路就算闭环了。
6. 排障:几个最常见的不生效
6.1 网关读不到 .env 里的 Key
症状是启动正常,一调用就报认证失败。常见原因有三个:文件不在 ~/.openclaw/ 下、文件名不是 .env、键名大小写和引用处对不上。另外注意别在 .env 的值两侧加引号,不少解析器会把引号也当成值的一部分,结果 Key 多出两个字符。
6.2 baseUrl 尾巴上多写了 /v1
这是最容易出的一个错,很多人凭肌肉记忆就把 /v1 加上去了。填进 OpenClaw 的 baseUrl 就是 https://taotoken.net/api ,末尾到此为止。多写一段的结果通常是 404 而不是 401,看报错码能很快区分是路径问题还是认证问题。
6.3 primary 前缀和 provider 名对不上
比如 provider 起名叫 taotoken,primary 里却拼成了别的写法,或者模型 id 中间少了一个字符。这类问题的表现是网关起来了,但一提问就说找不到模型。把 primary 的值从 models 数组里复制粘贴一遍,比手敲靠谱得多。
6.4 配完这一次之后
OpenClaw 的 provider 机制说白了就是一个标准插槽,amazon-bedrock 那份配置刚好把插槽的四个针脚标清楚了。把它抄成模子之后,以后再换通道,无非就是改 baseUrl 和模型 id 两处。
真要动手的话,建议先把模型广场页面开着,边填边对照,比来回切标签页省事。要是之后还打算在别的工具里复用同一把 Key,可以顺手看一眼 Coding Plan,以及 控制台 API Keys 里那把 Key 的余量,心里有个数,后面调起来不慌。