1. OpenClaw 从聊天到干活的真实卡点
OpenClaw 是一个开源本地优先的 AI Agent 框架,它能读取文件、控制浏览器、执行代码、发邮件,把大模型的“建议”变成“执行”。适合谁?适合已经在本地跑起 OpenClaw、想让聊天机器人真正调用工具干活的开发者。但很多人第一次配完 OpenClaw 会发现一个尴尬现象:对话正常,一问一答很流畅,可一旦让它“帮我整理桌面文件”或“打开浏览器搜一下”,它就开始装傻,要么回复“我无法直接操作”,要么干脆把工具调用请求丢掉。
问题不在 OpenClaw 本身,而在模型通道。OpenClaw 的 Agent 能力依赖模型返回结构化的 tool_calls 字段,而不少接入方式只转发了纯文本对话,工具调用协议在中间被吞掉了。另一个常见坑是 Key 分散:对话用一个 Key,工具调用用另一个,配置里字段对不上,Agent 就退化成普通聊天。我试过把对话和工具调用统一到同一条 API 通道后,OpenClaw 才真正开始“干活”。
这篇要解决的就是这件事:用 TaoToken 作为统一 Key/API 通道,把 OpenClaw 从对话式 AI 升级成可执行任务的 Agent。下面给出可复制的 config.toml 骨架、settings.json 关键字段,以及验证工具调用是否生效的具体动作。全程本地操作,不需要额外网络工具。
2. TaoToken 前置:统一 Key 与 API 通道
TaoToken 在这里的角色是统一模型接入层。OpenClaw 需要的是一个能稳定返回 tool_calls 的 OpenAI 兼容接口,TaoToken 的 API 地址是https://taotoken.net/api,兼容 OpenAI 的/v1/chat/completions协议,Agent 工具调用所需的 function calling 字段能完整透传。这意味着你不需要为对话和工具调用分别维护两套 Key,一个 Key 走通全部链路。
先拿到 Key。访问 API Keys 管理页:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite,创建一个新 Key,复制保存。注意 Key 只在创建时完整显示一次,丢了就重建。
如果你还没决定用哪个模型,可以先在模型对话页试一下工具调用是否正常:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite。在对话里发一条带函数定义的请求,看返回里有没有 tool_calls 结构。这一步能提前排除模型侧不支持 function calling 的情况。
长期跑 Agent 任务的话,token 消耗会比纯聊天高不少,因为每次工具调用都要带上完整上下文。Coding Plan 更适合这种持续编码和 Agent 场景:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite。接入文档在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite,字段有疑问时对照查。
注意:Key 不要写进会提交到 Git 的文件。用环境变量或本地
.env,并在.gitignore里排除。
3. 可复制配置:config.toml 骨架与 settings.json 字段
OpenClaw 的配置分两层:config.toml管模型通道和 Agent 行为,settings.json管运行时参数和工具开关。下面这份骨架可以直接改。
先看config.toml:
# OpenClaw 模型通道配置 [model] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" model = "gpt-4o-mini" timeout_seconds = 60 max_retries = 2 [agent] enable_tool_calls = true tool_choice = "auto" max_tool_rounds = 8 parallel_tool_calls = false [tools] enabled = ["file_read", "file_write", "shell_exec", "browser_open"] require_confirmation = ["shell_exec", "file_write"] [memory] backend = "local" embedding_provider = "openai-compatible" embedding_base_url = "https://taotoken.net/api" embedding_api_key_env = "TAOTOKEN_API_KEY"关键字段说明。base_url指向 TaoToken 的 API 根路径,OpenClaw 会自动拼/v1/chat/completions。api_key_env表示从环境变量读 Key,不硬编码。enable_tool_calls = true是 Agent 化的开关,关掉它就退回纯聊天。tool_choice = "auto"让模型自己决定何时调工具,改成具体函数名则强制调用。max_tool_rounds控制一次任务里最多几轮工具调用,太小会导致复杂任务中途断掉,8 是比较稳的值。require_confirmation里的工具执行前会等你确认,防止误删文件。
再看settings.json:
{ "runtime": { "workspace": "./workspace", "log_level": "info", "stream": true }, "agent": { "system_prompt_file": "./prompts/agent.md", "tool_result_max_chars": 4000, "context_window": 128000 }, "tools": { "shell_exec": { "allowed_commands": ["ls", "cat", "grep", "find", "python3"], "deny_patterns": ["rm -rf", "sudo", "curl | sh"] }, "file_write": { "allowed_paths": ["./workspace"] }, "browser_open": { "headless": true, "timeout_ms": 15000 } } }tool_result_max_chars很关键。工具返回内容太长会撑爆上下文,导致后续轮次失败,4000 字符是个平衡点。allowed_commands和deny_patterns是安全边界,别图省事全放开。allowed_paths限制写文件的范围,避免 Agent 跑到系统目录乱写。
环境变量这样设:
export TAOTOKEN_API_KEY="你的Key"Windows PowerShell 用$env:TAOTOKEN_API_KEY="你的Key"。设完重启 OpenClaw 进程,配置才会重新加载。
4. 验证请求:确认 Agent 工具调用真的生效
配置写完不代表生效,必须验证。分三步。
第一步,验证通道连通。用 curl 直接打 TaoToken 的接口,确认 Key 和地址没问题:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "回复 ok"}] }'返回里有choices[0].message.content就说明通道通了。如果返回 401,检查 Key;返回 404,检查base_url有没有多写或少写/v1。
第二步,验证工具调用协议。发一个带函数定义的请求,看返回里有没有tool_calls:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "列出当前目录文件"}], "tools": [{ "type": "function", "function": { "name": "shell_exec", "description": "执行 shell 命令", "parameters": { "type": "object", "properties": {"command": {"type": "string"}}, "required": ["command"] } } }], "tool_choice": "auto" }'正常返回的message里会有tool_calls数组,function.name是shell_exec,arguments里带命令。如果只有纯文本没有tool_calls,说明当前模型不支持 function calling,换一个支持工具调用的模型。
第三步,在 OpenClaw 里跑真实任务。启动 OpenClaw 后,在对话入口发一条明确需要工具的任务,比如“在 workspace 目录下创建一个 hello.txt,写入 hello agent”。观察日志:
tail -f ./logs/openclaw.log | grep -E "tool_call|tool_result"成功的话你会看到类似输出:
[agent] tool_call: file_write {"path":"./workspace/hello.txt","content":"hello agent"} [agent] tool_result: file_write success [agent] final: 已创建 hello.txt然后检查文件是否真的存在:
cat ./workspace/hello.txt输出hello agent就说明 Agent 工具调用链路完整生效了。这一步是整个配置的验收标准,文件没生成就是没通。
5. 本篇常见错排查
报错一:tool_calls字段为空,Agent 只回复文字。最常见原因是模型不支持 function calling,或者enable_tool_calls没开。先确认config.toml里enable_tool_calls = true,再换一个明确支持工具调用的模型重试。另一个隐藏原因是tool_choice被设成了"none",检查一下。
报错二:context length exceeded,任务跑到一半断掉。工具返回内容太长撑爆上下文。把settings.json里的tool_result_max_chars调小,比如从 4000 降到 2000。同时检查max_tool_rounds,轮次太多也会累积上下文,适当降低。
报错三:401 Unauthorized。Key 没读到或失效。确认环境变量名和api_key_env一致,export之后要重启进程。Key 如果泄露或误删,去 API Keys 页重建:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite。
报错四:shell_exec被拒绝执行。命令不在allowed_commands白名单里,或命中了deny_patterns。按需加白名单,但别把rm、sudo这类危险命令放进去。Agent 权限给太大,出问题时后果比聊天机器人严重得多。
报错五:文件写到了预期外的目录。allowed_paths没限制住,或者 Agent 用了绝对路径。把allowed_paths收紧到./workspace,并在 system prompt 里明确要求使用相对路径。
报错六:流式输出下工具调用解析失败。某些模型在stream: true时 tool_calls 分片返回,OpenClaw 版本旧可能解析不全。先把settings.json里stream设为false验证,确认是流式解析问题后再升级 OpenClaw 或换模型。
6. 接入文档与后续动作
配置跑通后,建议把 system prompt 单独维护在./prompts/agent.md,把工具使用规则、路径约束、确认策略写清楚,比塞在代码里好改。字段含义有疑问时对照接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite。
如果你要长期跑编码类 Agent 任务,token 消耗会明显上升,Coding Plan 的额度模型更适合这种持续调用场景:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite。想先验证某个模型对工具调用的支持程度,直接在模型对话页发带函数定义的请求最快:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite。
最后提醒一句:Agent 拿到 shell 和文件写权限后,能力边界和风险边界是同一件事。require_confirmation别嫌麻烦关掉,deny_patterns别图省事清空。先把 workspace 隔离好,再逐步放开工具范围,这样 OpenClaw 才是帮你干活的助手,而不是需要你收拾的麻烦。