1. 从李宏毅的小龙虾说起:OpenClaw 到底在干什么
李宏毅老师那期课我反复看了两遍,他用「小龙虾」做类比特别形象:一只小龙虾看起来只会挥钳子,但它能感知环境、能抓东西、能记住哪里有食物、能一直待在水里不休息。AI Agent 也是这个逻辑——模型本身只是「脑子」,真正让它变成能干活的东西,是外面那层壳:工具调用、任务执行、记忆存储、上下文管理、持续运行。
OpenClaw 就是这样一个壳。它把大模型从「你问我答」升级成「你给目标,我自己拆步骤、调工具、记结果、接着干」。核心不在模型多聪明,而在 Context Engineering——你怎么把 system prompt、工具描述、历史记忆、当前任务塞进有限的上下文窗口里,让模型每一步都知道自己是谁、要干什么、干到哪了。
这套东西听起来玄,落到工程上其实就三件事:一个能持续跑的进程、一份描述工具和角色的配置、一个稳定的模型 API 通道。前两件 OpenClaw 自己管,第三件就是很多人卡住的地方——你要么直连官方 API 被额度和网络折腾,要么自己搭转发层维护成本高。我实测下来,用 TaoToken 这类统一 Key/API 通道接进去,配置量最小,切换模型也方便。
这篇就按「原理拆解 → 配置骨架 → 验证调用 → 报错排查」走一遍,目标是你照着能跑起来一个最小可用的 OpenClaw Agent。适合谁:想搞懂 Agent 运作原理的开发者、手里有 OpenClaw 想接统一通道的人、以及被 401 和 proxy 报错折磨过的同学。
2. TaoToken 前置准备:Key、Base URL 与模型 ID 三件套
在动 OpenClaw 配置之前,先把「三件套」备齐,后面所有配置文件都围绕它们展开。所谓三件套就是 Base URL、API Key、Model ID,缺一个都跑不起来。
Base URL 用https://taotoken.net/api,注意这里不带任何查询参数,就是纯 API 根路径。API Key 去控制台生成,路径是 API Keys 页面,生成后复制出来,形如sk-开头的一串。Model ID 取决于你想让 Agent 用哪个模型,比如做长任务规划可以用推理能力强的,做快速工具调用可以用响应快的,具体可用列表在模型对话页能看到。
注意:Key 只显示一次,生成后立刻存到本地环境变量或密码管理器,别直接写进会提交到 Git 的配置文件里。
我一般把 Key 放进 shell 环境变量,这样配置文件里只引用变量名,泄露风险小:
export TAOTOKEN_API_KEY="sk-你的key" export TAOTOKEN_BASE_URL="https://taotoken.net/api"验证环境变量生效:
echo $TAOTOKEN_BASE_URL # 期望输出:https://taotoken.net/api如果你习惯用.env文件,记得加进.gitignore。OpenClaw 读取配置时支持从环境变量插值,所以配置文件里写${TAOTOKEN_API_KEY}这种占位就行。
这里插一句为什么用统一通道而不是直连:Agent 跑长任务时会频繁调用模型,上下文压缩、sub-agent、heartbeat 这些机制都会产生额外请求,额度消耗比聊天大得多。统一通道的好处是 Key 管理集中、模型切换只改一个 Model ID、计费口径统一,排查问题时也只需要盯一个入口。
准备好三件套后,先别急着配 OpenClaw,用一条 curl 确认通道本身是通的:
curl -s https://taotoken.net/api/v1/models \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ | head -c 500能返回模型列表 JSON,说明 Key 和 Base URL 没问题,接下来所有报错就都能定位到 OpenClaw 配置层,而不是通道层。这一步能省掉后面一半的排查时间。
3. 可复制配置:settings.json 与 config.toml 骨架
OpenClaw 的配置分两块:一块是应用级 settings.json,管模型通道和全局行为;一块是 Agent 级 config.toml,管这个 Agent 的角色、工具、记忆和运行参数。两块都要改,只改一块会出现「能连上但 Agent 不干活」的情况。
先看 settings.json,路径通常在~/.openclaw/settings.json(不同版本可能略有差异,以你本地实际为准):
{ "model": { "provider": "openai-compatible", "base_url": "https://taotoken.net/api", "api_key": "${TAOTOKEN_API_KEY}", "model_id": "your-model-id", "timeout_seconds": 120, "max_retries": 3 }, "runtime": { "heartbeat_interval_seconds": 30, "context_compress_threshold": 0.75, "log_level": "info" } }几个参数说明:provider选openai-compatible是因为 TaoToken 走 OpenAI 兼容协议;timeout_seconds给到 120 是因为 Agent 长任务单次调用可能较久;context_compress_threshold设 0.75 表示上下文用到 75% 就触发压缩,避免爆窗口。
再看 config.toml,路径一般在项目目录下的agent/config.toml:
[agent] name = "openclaw-demo" system_prompt = """ 你是一个能调用工具的 AI Agent。 每一步先说明你要做什么,再调用对应工具。 任务完成后输出最终结果,不要重复调用已成功的工具。 """ [agent.memory] enabled = true store_path = "./memory" retrieval_top_k = 5 [agent.tools] enabled = ["shell", "http_request", "file_read", "file_write"] [agent.sub_agent] enabled = true max_parallel = 2 [model] base_url = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" model_id = "your-model-id"system_prompt就是李宏毅说的「让模型知道自己是谁」;memory对应跨会话延续;tools是「动手做事」的能力清单;sub_agent对应复杂任务拆分。这几块配齐,Agent 的骨架就立起来了。
如果你用 CC Switch 管理多套配置,切换步骤是:打开 CC Switch → 新增一个 profile → 把上面 settings.json 的内容粘进去 → Base URL 填https://taotoken.net/api、Key 填你的、Model ID 填目标模型 → 保存并激活。切换后重启 OpenClaw 进程让配置生效。
提示:CC Switch 里如果同时存在多个 profile,确认当前激活的是你要用的那个,否则会出现「改了配置没生效」的假象。
配置写完先做一次语法校验,JSON 用python -m json.tool,TOML 用python -c "import tomllib;tomllib.load(open('agent/config.toml','rb'))",语法错了后面全是白搭。
4. 验证请求:跑一次可复现的 Agent 调用动作
配置就绪后,用一个最小任务验证整条链路。任务设计成「必须调用工具才能完成」,这样能同时验证模型通道和工具调用两条路径。
启动 OpenClaw:
openclaw run --config ./agent/config.toml --log-level debug然后在交互界面输入任务:
请读取当前目录下的 README.md,统计其中有多少行,并把结果写入 result.txt。一个正常工作的 Agent 应该输出类似这样的过程:
[step 1] 我需要先读取 README.md [tool] file_read(path="./README.md") -> ok, 128 lines [step 2] 统计行数:128 [tool] file_write(path="./result.txt", content="128") -> ok [step 3] 任务完成,README.md 共 128 行,已写入 result.txt看到[tool]开头的行,说明工具调用通了;看到[step]递进,说明上下文管理在工作;最后result.txt里确实有内容,说明整条链路闭环。
再验证一次记忆延续:重启 OpenClaw,问它「刚才那个任务统计的是哪个文件」。如果 memory 配置生效,它能从./memory里检索到上一轮的任务记录并回答README.md。这一步验证的是跨会话延续能力,也是 Agent 和普通聊天机器人的分水岭。
如果想让 Agent 跑更长的任务,比如「监控某个目录,有新文件就总结内容」,那就依赖 heartbeat 机制。把heartbeat_interval_seconds设小一点(比如 10),观察日志里是否周期性出现心跳记录。心跳正常,说明 Agent 能持续运行而不是一问一答就退出。
验证阶段建议开 debug 日志,所有请求和响应都会打出来,出问题时能直接看到是哪一步断了。日志里重点看三类行:发往https://taotoken.net/api的请求、工具调用返回、上下文压缩触发记录。
5. 常见报错排查:401、proxy failed 与 reading choices
这一节按真实报错对照排查,都是我在接 OpenClaw 时踩过的。
401 Unauthorized:最常见。先确认TAOTOKEN_API_KEY环境变量在当前 shell 里真的存在(echo一下),再确认配置文件里引用的是${TAOTOKEN_API_KEY}而不是写死的旧 Key。如果 Key 是从控制台复制的,注意别把首尾空格带进去。还有一种情况是 Key 被撤销了,去 API Keys 页面确认状态。
local proxy failed / connection refused:这类报错通常不是通道问题,而是本地网络或代理配置干扰。检查HTTP_PROXY、HTTPS_PROXY环境变量是否指向了一个已经关掉的本地代理,有就 unset 掉。OpenClaw 默认走系统网络栈,如果系统层有残留代理设置,请求会先发给一个不存在的本地端口,直接 refused。
Error reading choices / choices 字段为空:这个报错说明请求发出去了、也返回了,但响应结构里没有choices。常见原因是 Model ID 填错,通道返回了一个错误 JSON 而不是标准补全结构。去模型对话页确认可用 Model ID,逐字核对配置文件里的model_id。另一种可能是请求体格式不对,比如provider没设成openai-compatible。
OAuth / token expired:如果你之前用过 OAuth 方式的客户端,本地可能残留了旧的 token 缓存,OpenClaw 优先读了它。清掉对应缓存目录(通常在~/.openclaw/auth或系统凭据管理器里),强制走 API Key 方式。
Agent 不调用工具,只输出文字:这不是报错但很常见。检查 config.toml 里tools.enabled是否包含你需要的工具,以及 system_prompt 里有没有明确要求「先调用工具再回答」。模型不会主动猜你想让它用工具,得在提示里说清楚。
上下文压缩后任务丢失:如果context_compress_threshold设得太低(比如 0.3),压缩过于频繁,早期任务信息会被压掉。调到 0.7 到 0.8 之间比较稳,同时确保 memory 开启,压缩掉的内容还能从记忆里检索回来。
排查顺序建议固定成:先 curl 测通道 → 再查环境变量 → 再看配置文件语法 → 最后看日志里具体哪一步断。按这个顺序走,90% 的问题能在五分钟内定位。
6. 把 Agent 跑起来之后:通道与配置的长期维护
骨架搭起来只是开始。Agent 真正跑长任务时,你会遇到模型切换、额度监控、多 Agent 并行这些事。这时候统一通道的价值就体现出来了——换模型只改model_id一个字段,不用动 OpenClaw 的任何逻辑;额度在控制台统一看,不用在多个平台之间对账。
如果你打算长期跑编码类或 Agent 类任务,Coding Plan 比按量付费更划算,适合高频调用的场景。日常调试和验证模型行为,用模型对话页快速试 prompt 就行,不用每次都起 OpenClaw 进程。接入过程中遇到配置细节问题,接入文档里有各客户端的完整示例,比对着改最快。
最后留一个实用习惯:每次改完配置,先跑那条 curl 确认通道,再起 OpenClaw。通道层和配置层分开验证,出问题时你能立刻知道该往哪看。这个习惯帮我省掉了大量「到底是网络还是配置」的纠结时间。