1. 云主机上跑 Hermes Agent 与 OpenClaw,为什么最后都卡在 Token Plan 配置
如果你在云主机上装过 Hermes Agent 或者 OpenClaw,大概率经历过这个流程:镜像拉起来了,容器也跑起来了,WebUI 能打开,但一到填 API Key 那一步就开始报错。要么是401 Unauthorized,要么是local proxy failed,要么日志里直接甩一句reading choices相关的解析异常。折腾半天,最后发现不是 Agent 本身的问题,而是 Token Plan 的接入通道没配对。
Hermes Agent 是一个能自我进化的 AI 智能体框架,OpenClaw 则是本地优先、云端适配的 AI 自动化代理。两者在云主机上的部署方式不同,但有一个共同点:它们都需要一个稳定的模型调用通道。Token Plan 在这里扮演的角色,就是把这个通道统一起来——不管你后面切 GPT、Claude 还是国产模型,Key 和 Base URL 只维护一份。
这篇攻略面向的是已经在云主机上跑起 Hermes Agent 或 OpenClaw、但 Token Plan 还没配通的人。我会从环境准备讲到 settings 文件修改,给出可以直接复制的配置片段,再一步步验证调用是否生效。全程在云主机上操作,不涉及本地网络环境的任何特殊设置。
先说清楚一个前提:Token Plan 不是某个特定厂商的专属产品,它本质上是一套兼容主流 AI 工具调用协议的接入方案。你把它理解成一个“统一网关”就行——Agent 只管往这个网关发请求,网关负责路由到具体的模型。TaoToken 提供的正是这套通道能力,官网在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。
为什么强调“云主机”这个场景?因为云主机的网络环境相对干净,没有本地开发机那么多历史配置残留,反而更容易定位问题。但云主机也有自己的坑:安全组端口、容器内 DNS、systemd 服务重启后的环境变量丢失,这些都会让 Token Plan 配置看起来“明明填对了却不生效”。
我试过在一台 2 核 4G 的云主机上同时跑 Hermes Agent 和 OpenClaw,两个服务共用同一个 Token Plan 通道,结果 OpenClaw 正常、Hermes Agent 一直报local proxy failed。排查了半小时才发现是 Hermes Agent 的 settings 文件里 Base URL 多了一个斜杠。这种细节,下面会逐个拆开讲。
2. TaoToken 前置准备:云主机环境检查与 Key 获取
在改任何 settings 文件之前,先把云主机的基础环境确认一遍。这一步看起来简单,但后面 80% 的“配置不生效”都跟环境有关。
2.1 云主机最低配置与系统要求
Hermes Agent 和 OpenClaw 对云主机的资源要求不算高,但有几个硬性条件:
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 1 核 | 2 核及以上 |
| 内存 | 2 GB | 4 GB |
| 磁盘 | 20 GB | 40 GB 高效云盘 |
| 系统 | Ubuntu 22.04 LTS | Ubuntu 22.04 / Debian 12 |
| 网络 | 能出公网 | 能出公网 + 固定公网 IP |
内存低于 2 GB 的话,OpenClaw 的核心服务可能起不来,Hermes Agent 在加载技能插件时也容易 OOM。这个不是吓唬人,我在 1 GB 的实例上试过,容器刚跑起来就被系统 kill 了。
系统方面,Ubuntu 22.04 LTS 是最省心的选择。如果你用的是其他发行版,注意systemd的版本和curl是否支持--retry参数,后面验证请求时会用到。
2.2 确认云主机能正常访问外部 API
登录云主机后,先做一次连通性测试。这一步的目的是排除安全组或 DNS 层面的问题:
# 测试 DNS 解析 nslookup taotoken.net # 测试 HTTPS 连通性(-I 只取响应头,-s 静默模式,-o /dev/null 丢弃正文) curl -I -s -o /dev/null -w "%{http_code}\n" https://taotoken.net/api # 如果上面返回 000 或超时,检查安全组出方向规则 # 云主机默认出方向全放通,但有些自定义安全组会限制 443 端口如果curl返回000,先别急着改 Agent 配置,去云控制台的安全组里确认出方向 443 端口是放通的。入方向只需要放通你实际用到的端口,比如 OpenClaw 的 18789 和 Hermes Agent 的 8080。
2.3 获取 Token Plan 的 API Key
TaoToken 的 API Key 获取入口在控制台里。访问 https://taotoken.net/api-keys 这个 deep link,登录后创建一个新的 Key。创建时注意两点:
第一,Key 的名称建议带上用途,比如hermes-cloud-01或openclaw-prod,后面如果有多个 Agent 实例,方便区分。
第二,Key 只在创建时完整显示一次,复制后存到云主机的环境变量文件里,不要直接写在 settings 文件里明文保存。后面我会给出用systemd的EnvironmentFile来管理 Key 的做法。
创建完 Key 之后,顺手把 Base URL 记下来:https://taotoken.net/api。注意这里没有尾部斜杠,后面配置时如果多加了斜杠,某些 Agent 的 HTTP 客户端会拼出//v1/chat/completions这种路径,直接 404。
2.4 在云主机上安全存放 Key
不要用export临时设置,因为systemd服务重启后环境变量会丢。推荐的做法是创建一个专用的环境变量文件:
# 创建配置目录 sudo mkdir -p /etc/taotoken # 写入环境变量文件,权限设为 600 sudo tee /etc/taotoken/env <<'EOF' TAOTOKEN_API_KEY=sk-你的实际Key TAOTOKEN_BASE_URL=https://taotoken.net/api EOF sudo chmod 600 /etc/taotoken/env sudo chown root:root /etc/taotoken/env这样后面无论是 Hermes Agent 还是 OpenClaw,都可以通过EnvironmentFile=/etc/taotoken/env来读取,Key 不会散落在多个配置文件里。
3. 可复制配置:Hermes Agent 与 OpenClaw 的 settings 修改
这一节是核心。Hermes Agent 和 OpenClaw 的配置文件格式不同,但思路一致:把模型调用的 Base URL 指向 TaoToken 的 API 入口,把 Key 换成 Token Plan 的 Key,Model ID 按需选择。
3.1 Hermes Agent 的 settings.json 配置
Hermes Agent 默认读取~/.hermes/settings.json,如果你是用systemd管理的,路径可能是/etc/hermes/settings.json。先确认实际路径:
# 查找 Hermes Agent 的配置文件 sudo find / -name "settings.json" -path "*hermes*" 2>/dev/null # 如果是容器部署,进入容器查找 docker exec -it hermes-agent find / -name "settings.json" 2>/dev/null找到后,用下面的 JSON 片段替换或合并模型配置部分。注意 JSON 不支持注释,复制时不要带//说明:
{ "models": { "providers": { "taotoken": { "baseUrl": "https://taotoken.net/api", "apiKey": "${TAOTOKEN_API_KEY}", "models": [ { "id": "claude-sonnet-4-20250514", "name": "Claude Sonnet 4", "maxTokens": 8192, "temperature": 0.7 }, { "id": "gpt-4o", "name": "GPT-4o", "maxTokens": 4096, "temperature": 0.7 } ] } }, "defaultProvider": "taotoken", "defaultModel": "claude-sonnet-4-20250514" }, "agent": { "name": "hermes-cloud", "maxIterations": 20 } }这里有几个关键点。baseUrl必须是https://taotoken.net/api,不要加/v1,Hermes Agent 内部会自动拼接路径。apiKey用了${TAOTOKEN_API_KEY}这种环境变量引用语法,前提是 Hermes Agent 启动时能读到这个变量。如果你是用systemd启动的,在 service 文件里加一行EnvironmentFile=/etc/taotoken/env。
Model ID 的写法要跟 TaoToken 支持的模型列表一致。上面写的claude-sonnet-4-20250514和gpt-4o是示例,实际用哪个模型,去 https://taotoken.net/doc 查一下最新的模型 ID 列表。写错了会报model not found,这个错误在日志里不太明显,容易被忽略。
3.2 OpenClaw 的 config.toml 配置
OpenClaw 用的是 TOML 格式,默认路径通常是~/.openclaw/config.toml或/etc/openclaw/config.toml。同样先定位:
# 查找 OpenClaw 配置文件 sudo find / -name "config.toml" -path "*openclaw*" 2>/dev/null # 查看当前配置 cat ~/.openclaw/config.toml然后按下面的片段修改:
[models] default_provider = "taotoken" default_model = "claude-sonnet-4-20250514" [models.providers.taotoken] base_url = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" timeout = 120 [[models.providers.taotoken.models]] id = "claude-sonnet-4-20250514" name = "Claude Sonnet 4" max_tokens = 8192 temperature = 0.7 [[models.providers.taotoken.models]] id = "gpt-4o" name = "GPT-4o" max_tokens = 4096 temperature = 0.7 [gateway] port = 18789 host = "0.0.0.0" [cache] enable = true expire = 3600TOML 里base_url和api_key的写法跟 JSON 不同,注意下划线。timeout设成 120 秒,因为云主机到 API 网关的网络延迟可能比本地高,默认的 30 秒在某些模型上不够用。
OpenClaw 的gateway部分配置了监听端口,如果你改了端口,记得同步更新云主机安全组的入方向规则。
3.3 用 systemd 管理环境变量与服务重启
不管是 Hermes Agent 还是 OpenClaw,改完配置后都需要重启服务。如果你是用systemd管理的,创建一个 override 文件来注入环境变量:
# Hermes Agent 的 systemd override sudo mkdir -p /etc/systemd/system/hermes-agent.service.d sudo tee /etc/systemd/system/hermes-agent.service.d/override.conf <<'EOF' [Service] EnvironmentFile=/etc/taotoken/env EOF # OpenClaw 的 systemd override sudo mkdir -p /etc/systemd/system/openclaw.service.d sudo tee /etc/systemd/system/openclaw.service.d/override.conf <<'EOF' [Service] EnvironmentFile=/etc/taotoken/env EOF # 重载 systemd 配置 sudo systemctl daemon-reload # 重启服务 sudo systemctl restart hermes-agent sudo systemctl restart openclaw如果你是用 Docker 跑的,在docker run时加--env-file /etc/taotoken/env,或者在docker-compose.yml里用env_file指令。
3.4 验证环境变量是否被正确读取
重启后,先确认服务进程能读到环境变量:
# 查看 Hermes Agent 进程的环境变量 sudo cat /proc/$(pgrep -f hermes-agent | head -1)/environ | tr '\0' '\n' | grep TAOTOKEN # 查看 OpenClaw 进程的环境变量 sudo cat /proc/$(pgrep -f openclaw | head -1)/environ | tr '\0' '\n' | grep TAOTOKEN如果输出为空,说明EnvironmentFile没生效,检查文件路径和权限。/etc/taotoken/env的权限必须是600,且属主是root,否则systemd会拒绝读取。
4. 验证请求:确认 Token Plan 调用真正生效
配置改完不代表生效。这一节用三个层次的验证来确认调用链路是通的。
4.1 直接用 curl 测试 API 通道
先绕过 Agent,直接用curl打 TaoToken 的 API,确认 Key 和 Base URL 本身没问题:
# 从环境变量文件加载 Key source /etc/taotoken/env # 发送一个最小的 chat completions 请求 curl -s -X POST "${TAOTOKEN_BASE_URL}/v1/chat/completions" \ -H "Authorization: Bearer ${TAOTOKEN_API_KEY}" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "回复一个字:好"}], "max_tokens": 10 }' | head -c 500如果返回的 JSON 里有choices数组,且message.content是“好”,说明 API 通道完全正常。如果返回401,检查 Key 是否复制完整;如果返回404,检查 Base URL 是否多了斜杠;如果返回model not found,去文档页确认模型 ID。
4.2 通过 Hermes Agent 的 CLI 验证
Hermes Agent 通常带一个 CLI 工具,可以直接发一条测试消息:
# 进入 Hermes Agent 的交互模式 hermes chat --provider taotoken --model claude-sonnet-4-20250514 # 在交互界面输入 > 你好,请用一句话介绍你自己 # 预期输出:Agent 返回一段自我介绍,说明模型调用成功如果 CLI 报local proxy failed,大概率是baseUrl配置有问题。检查settings.json里的baseUrl是否跟curl测试时用的完全一致。
4.3 通过 OpenClaw 的 WebUI 验证
OpenClaw 启动后,访问http://你的云主机公网IP:18789,在对话窗口输入一条测试指令:
你好,请列出你能做的三件事如果返回了包含“邮件管理、文档处理、网页自动化”等内容的回复,说明 OpenClaw 的模型调用链路已经通了。如果页面一直转圈或报错,去看 OpenClaw 的日志:
# 查看 OpenClaw 最近 50 行日志 sudo journalctl -u openclaw -n 50 --no-pager # 如果是 Docker 部署 docker logs --tail 50 openclaw日志里如果出现reading choices相关的错误,通常是 API 返回的 JSON 结构跟 Agent 预期的格式不匹配。这种情况先确认base_url没有拼错,再确认模型 ID 是 TaoToken 支持的。
4.4 验证多模型切换是否正常
Token Plan 的一个核心优势是统一通道下可以切模型。在 Hermes Agent 的settings.json里配置了多个模型后,测试切换:
# 用 GPT-4o 发一条测试 hermes chat --provider taotoken --model gpt-4o > 用一句话说明你和上一个模型的区别如果两个模型都能正常返回,说明 Token Plan 的多模型路由是通的。这一步验证完,你的云主机上的 Agent 就已经具备了灵活切换模型的能力。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
这一节把配置过程中最容易遇到的四类报错拆开讲。每个报错都给出具体的日志特征和修复动作。
5.1 401 Unauthorized:Key 没传进去或传错了
日志特征:
HTTP 401 Unauthorized {"error":{"message":"Invalid API key","type":"invalid_request_error"}}排查顺序:
第一,确认环境变量文件里的 Key 没有多余空格或换行。用cat -A /etc/taotoken/env查看,行尾应该是$,不是^M$。
第二,确认 Agent 进程真的读到了环境变量。用第 3.4 节的/proc/.../environ方法检查。
第三,如果 settings 文件里直接写了 Key(不推荐),确认没有把sk-前缀漏掉。
第四,Key 是否被禁用或额度耗尽。去 https://taotoken.net/console 查看 Key 的状态和用量。
5.2 local proxy failed:Base URL 配置错误
日志特征:
local proxy failed: dial tcp: lookup taotoken.net: no such host或者:
local proxy failed: connection refused这个报错的关键词是local proxy,说明 Agent 在尝试连接你配置的baseUrl时失败了。排查:
第一,在云主机上直接curl -I https://taotoken.net/api,确认网络能通。
第二,检查baseUrl是否写成了https://taotoken.net/api/(多了尾部斜杠)。某些 HTTP 客户端会把/api/和/v1/chat/completions拼成/api//v1/chat/completions,导致 404 或连接异常。
第三,如果云主机用了自定义 DNS,确认taotoken.net能正确解析。用nslookup taotoken.net 8.8.8.8对比默认 DNS 的结果。
5.3 reading choices:响应格式解析失败
日志特征:
error reading choices: unexpected end of JSON input或者:
cannot unmarshal object into Go struct field Response.choices这个报错说明 Agent 收到了响应,但解析choices字段时失败了。常见原因:
第一,API 返回的是错误信息而不是正常的 chat completion 结构。先用curl手动发一次请求,看返回的 JSON 长什么样。
第二,模型 ID 写错了,API 返回了model not found的错误对象,但 Agent 仍然尝试按正常响应解析。
第三,baseUrl指向了一个返回 HTML 页面的地址(比如误填了官网首页),Agent 把 HTML 当 JSON 解析,自然报错。
修复方法:用curl确认 API 返回的是标准 JSON,然后核对settings.json或config.toml里的baseUrl和模型 ID。
5.4 OAuth 相关报错:认证方式不匹配
日志特征:
OAuth token exchange failed或者:
unsupported auth type: oauthHermes Agent 和 OpenClaw 在某些版本里默认使用 OAuth 流程,但 Token Plan 用的是 API Key 认证。如果你看到 OAuth 相关的报错,说明 Agent 的认证模式没切过来。
修复方法:在settings.json里显式指定认证类型:
{ "models": { "providers": { "taotoken": { "baseUrl": "https://taotoken.net/api", "apiKey": "${TAOTOKEN_API_KEY}", "authType": "api_key" } } } }OpenClaw 的config.toml里对应加一行:
[models.providers.taotoken] auth_type = "api_key"改完后重启服务,OAuth 报错应该消失。
5.5 配置检查清单
每次改完配置,按这个清单过一遍:
| 检查项 | 正确值 | 常见错误 |
|---|---|---|
| Base URL | https://taotoken.net/api | 多了/v1或尾部斜杠 |
| API Key | sk-开头完整字符串 | 复制时漏字符或有空格 |
| 模型 ID | 与文档一致 | 拼写错误或用了不支持的模型 |
| 认证类型 | api_key | 默认 OAuth 未切换 |
| 环境变量 | 进程能读到 | systemd 未加载 EnvironmentFile |
| 端口 | 安全组已放通 | 入方向未开放 |
6. 长期使用建议与接入入口
配置跑通之后,有几件事值得提前做,能省掉后面很多麻烦。
第一,把 Key 的轮换机制建起来。Token Plan 的 Key 如果泄露,最坏情况是被别人刷额度。建议每 90 天换一次 Key,换的时候只需要更新/etc/taotoken/env文件,然后systemctl restart两个服务,settings 文件不用动。
第二,给 Agent 的调用加一层日志。Hermes Agent 和 OpenClaw 都支持把请求日志写到文件里,方便排查问题。在settings.json里加:
{ "logging": { "level": "info", "file": "/var/log/hermes/agent.log", "maxSize": "100MB", "maxBackups": 5 } }OpenClaw 的config.toml对应:
[logging] level = "info" file = "/var/log/openclaw/agent.log" max_size = "100MB" max_backups = 5第三,如果你打算长期在云主机上跑编码类 Agent,比如让 Hermes Agent 帮你写代码、跑测试,可以考虑 Coding Plan 这种按次计费的模式。入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,适合调用频率高但单次 token 量不大的场景。
第四,模型对话的调试入口在 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,当你怀疑是模型本身的问题而不是配置问题时,可以先去这里发一条消息对比结果。
接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面会更新支持的模型 ID 列表和 API 变更记录。模型 ID 是会变的,隔一段时间去核对一次,比在 Agent 日志里猜要快得多。
最后说一个实际踩过的坑:云主机如果开了自动快照,恢复快照后/etc/taotoken/env可能会被回滚到旧版本,导致 Key 失效。恢复快照后记得检查一下这个文件的内容,或者把 Key 管理放到快照之外的配置中心里。