1. 从一条消息到一串动作:OpenClaw 的 Agent Loop 到底在循环什么
OpenClaw 的 Agent Loop,说白了就是“一条用户消息进来,龙虾怎么把它变成一串可执行动作,再把结果写回记忆”的闭环。它不是一个 while(true) 死循环,而是一条有明确阶段的主干路径:Intention 识别 → plan 拆解 → 工具执行 → memory 回写。你如果只把 OpenClaw 当成一个会调工具的聊天壳子,那调试起来会非常痛苦,因为出问题时你根本不知道是意图识别错了、plan 拆错了,还是 memory 污染了上下文。
我先把这条链路用一句话讲清楚:用户消息先被压成一个 intent_packet(意图包),意图包决定 planner_mode,planner 再产出 plan(步骤图),执行器按 step 依赖顺序调工具,最后把结果和关键实体写回 memory,供下一轮 Loop 复用。适合谁看?适合已经在用 OpenClaw 跑自动化、但被“它为什么突然不按我想的做”折磨过的开发者;也适合想把 Agent Loop 拆开自己实现一套的工程师。
这里有个容易被忽略的点:Intention 和 plan 是两层东西。Intention 回答“用户到底要什么”,plan 回答“怎么一步步做到”。很多教程把这两层混在一起讲,导致你调 prompt 时不知道该改意图识别还是改规划器。OpenClaw 把它们拆成 intent_packet 和 plan 两个独立结构,好处是你可以单独替换 planner,而不动意图层。
再往下,memory 回写不是简单存聊天记录。它存的是实体(entities)、约束(constraints)和成功判据(success_criteria)。下一轮 Loop 进来时,这些结构化字段会参与意图消歧。比如你上一轮说“每天早上9点执行”,memory 里存了 timezone=Asia/Hong_Kong,下一轮你说“改成10点”,意图层就能直接补全时区,不用再问一遍。
理解这条链路之后,你调试 OpenClaw 的方式会变:不再盯着最终输出猜,而是按阶段看中间产物。下面我按“前置准备 → 可复制配置 → 验证回放 → 排错”的顺序,把每个阶段拆到能直接抄的程度。中间会用到 TaoToken 作为统一的 Key/API 通道,这样你不用在多个模型供应商之间来回切配置。
2. 用 TaoToken 统一 Key 与 API 通道,给 OpenClaw 的 Loop 调试铺路
OpenClaw 的 Agent Loop 在调试阶段最烦的事情之一,是意图识别、plan 生成、总结回写可能走不同模型。如果你每个模型都单独配一套 Key 和 Base URL,改一次配置要动好几个文件,排错时根本分不清是模型问题还是 Loop 逻辑问题。我的做法是用 TaoToken 做统一入口,一个 Key、一个 Base URL,模型 ID 在请求里区分。
TaoToken 在这里的角色是“统一通道”,不是替代 OpenClaw 本身。OpenClaw 负责 Loop 编排,TaoToken 负责把模型请求收敛到一个出口。这样你在看日志时,所有模型调用都长一个样,只有 model 字段不同,排查“是意图层错了还是规划层错了”会快很多。
前置准备分三步。第一步,拿到 Key。访问 API Keys 页面创建:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。创建后复制保存,后面配置里会用到。第二步,确认 Base URL 用 https://taotoken.net/api ,注意这个地址不带任何查询参数,配置里不要自己拼 UTM。第三步,确认你要用的模型 ID,意图识别建议用响应快的小模型,plan 生成和总结用能力强的模型,具体 ID 以你账号下可用列表为准。
这里要提醒一句:不要把 TaoToken 理解成某种“绕过限制”的东西,它就是一个正常的 API 聚合入口,你该遵守的模型使用规范一样要遵守。配置时只填 Base URL 和 Key,不要在里面塞任何代理相关的东西,OpenClaw 的请求直接走标准 HTTPS 就行。
配好之后,OpenClaw 的模型调用层应该只认两个环境变量:一个存 Key,一个存 Base URL。模型 ID 写在 Loop 配置里,按阶段区分。这样你换模型只改一个字段,不用动 Key。下面一节我给一份可以直接复制的配置片段,包含意图层、规划层、总结层三个模型槽位,以及 memory 回写的开关。
3. 可复制的 Loop 配置:intent、plan、memory 三段式 settings 片段
这一节是全文最该抄的部分。OpenClaw 的 Loop 配置我建议拆成三段:intent 段管意图识别,plan 段管规划器,memory 段管回写策略。下面这份是 JSON 格式的 settings 片段,路径按 OpenClaw 默认工作区约定放在.openclaw/settings/agent-loop.json,你可以按自己实际路径调整,但字段名保持一致,否则 Loop 加载时会静默忽略。
{ "agent_loop": { "version": "1.0", "intent": { "enabled": true, "model_id": "your-fast-model-id", "base_url": "https://taotoken.net/api", "api_key_env": "TAOTOKEN_API_KEY", "confidence_threshold": 0.85, "clarify_below_threshold": true, "output_schema": "intent_packet_v1" }, "plan": { "enabled": true, "model_id": "your-strong-model-id", "base_url": "https://taotoken.net/api", "api_key_env": "TAOTOKEN_API_KEY", "planner_mode_map": { "single": "direct_execution", "compound": "multi_step_workflow" }, "max_steps": 12, "require_success_criteria": true }, "memory": { "enabled": true, "write_back": true, "persist_entities": true, "persist_constraints": true, "persist_success_criteria": true, "session_scope": "workspace", "max_entity_age_turns": 20 }, "execution": { "tool_timeout_ms": 30000, "on_step_failure": "halt_and_report", "expose_step_id_to_user": false } } }几个字段值得单独说。confidence_threshold设 0.85,低于这个值且clarify_below_threshold为 true 时,意图层会先反问而不是硬猜,这能挡掉大量“它自作主张”的问题。planner_mode_map把意图类型映射到规划模式,single 走 direct_execution,compound 走 multi_step_workflow,和 OpenClaw 源码里 intent_packet 的 planner_mode 字段是对应的。require_success_criteria为 true 时,plan 里没有 success_criteria 会直接判失败,逼着规划器把验收标准写清楚。
memory 段的persist_entities和persist_constraints建议都开。max_entity_age_turns控制实体在多少轮之后过期,设 20 是防止旧实体污染新任务。session_scope设 workspace 表示记忆按工作区隔离,不同项目不会串。
如果你用的是 TOML 风格配置,等价片段如下,字段含义一致:
[agent_loop.intent] enabled = true model_id = "your-fast-model-id" base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" confidence_threshold = 0.85 [agent_loop.plan] enabled = true model_id = "your-strong-model-id" base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" max_steps = 12 [agent_loop.memory] enabled = true write_back = true persist_entities = true persist_constraints = true配好之后,Key 通过环境变量注入,不要写进配置文件。Linux/macOS 下可以这样:
export TAOTOKEN_API_KEY="你的Key"Windows PowerShell:
$env:TAOTOKEN_API_KEY="你的Key"注意 Base URL 统一写https://taotoken.net/api,不要加尾斜杠,也不要在后面拼任何参数。模型 ID 按你账号下实际可用的填,意图层和规划层可以用不同模型,这样成本和速度能平衡。
4. 一次完整任务回放:从“读 USER.md”到 memory 回写验证
配置就绪后,用一条最简单的单一意图任务验证整条 Loop。任务消息是“帮我看看 USER.md 里写了啥”。这条消息在 OpenClaw 里会走 direct_execution 模式,适合第一次验证,因为步骤少、依赖清晰。
第一步,意图层产出 intent_packet。你可以打开调试日志,找到 intent 阶段的输出,应该能看到类似结构:intent_type 为 single,primary_intent 为 read_and_summarize_file,planner_mode 为 direct_execution,entities 里 target_path 为 USER.md,constraints 里 read_only 为 true。如果 confidence 低于 0.85,说明意图层没把握,会触发反问,这时候你要检查消息是不是太模糊。
第二步,规划层产出 plan。plan_type 应该是 direct_execution,steps 里第一步是 tool_call 类型的 read,args 里 file_path 指向工作区下的 USER.md,on_success 指向第二步 summarize,on_failure 为 fail。第二步是 summarize 类型,input 引用第一步的 content,focus 里包含姓名、称呼偏好、时区等字段。如果 plan 里缺少 success_criteria,说明require_success_criteria没生效,回去检查配置。
第三步,执行器按依赖顺序调工具。read 工具返回文件内容后,summarize 步骤拿到 content 生成摘要。这一步的验证点是:最终输出是摘要而不是全文转发,且没有暴露 step_id。如果它把全文贴出来了,说明 summarize 的 focus 没起作用,或者规划器把这一步降级成了透传。
第四步,memory 回写。这是最容易被跳过的一步。任务完成后,检查 memory 存储,应该能看到本轮写入的实体:target_path=USER.md、output_format=summary,以及约束 read_only=true。下一轮你再发“把刚才那个文件里的时区改成 UTC”,意图层应该能直接从 memory 里取到 target_path,不用你再指定文件名。如果取不到,说明persist_entities没开,或者max_entity_age_turns设得太小。
验证请求本身可以用 curl 直接打 TaoToken 的接口,确认通道是通的:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "your-fast-model-id", "messages": [{"role": "user", "content": "ping"}] }'返回里有 choices 字段就说明 Key 和 Base URL 没问题。这一步单独做,是为了把“通道问题”和“Loop 逻辑问题”分开。通道通了再去看 Loop 日志,排查范围会小很多。
复合意图的回放稍微复杂。用“写一个检查磁盘占用的脚本,并且每天早上9点执行,异常时通知我”这条消息,意图层会产出 compound 类型,planner_mode 为 multi_step_workflow,sub_intents 里包含 create_script、schedule_script、configure_notification 三个子意图,且 schedule_script 依赖 create_script。规划层会生成 dependency_chain 形状的 plan,expected_substep_count 为 5。执行时你要重点看依赖顺序:脚本没创建成功,调度注册就不该执行。如果它跳过了依赖直接注册调度,说明 plan 的 depends_on 没被正确解析。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth 逐条对照
调试 Agent Loop 时,报错分两类:通道类和逻辑类。通道类报错通常长得像 HTTP 错误,逻辑类报错藏在日志的中间产物里。下面按真实会遇到的报错逐条说。
401 Unauthorized。这个基本是 Key 问题。先确认环境变量TAOTOKEN_API_KEY在当前 shell 里真的存在,用echo $TAOTOKEN_API_KEY看有没有值。如果值对但还报 401,检查配置文件里api_key_env写的变量名和实际导出的名字是否一致,大小写敏感。还有一种情况是 Key 复制时带了空格或换行,重新复制一次。
local proxy failed。看到这个报错,先检查你的 Base URL 是不是被改成了带本地代理的地址。正确配置里 Base URL 就是https://taotoken.net/api,不应该出现任何 localhost 或 127.0.0.1 的代理地址。如果你之前配过代理相关的东西,全部清掉,OpenClaw 直接走标准 HTTPS 请求。这个报错和 Loop 逻辑无关,纯粹是请求出口配错了。
reading choices 相关报错。典型表现是日志里出现 “cannot read property choices of undefined” 或类似。这说明模型返回体里没有 choices 字段,通常是请求根本没成功,或者返回的是错误结构。先单独用上面那条 curl 验证通道,如果 curl 正常但 OpenClaw 报这个错,检查 OpenClaw 的模型调用层是不是把 Base URL 拼错了,比如拼成了https://taotoken.net/api/v1/v1/chat/completions这种重复路径。Base URL 只写到/api,具体路径由调用层补。
OAuth 相关报错。如果你在配置里看到 OAuth 字样,说明你误用了需要 OAuth 的接入方式。OpenClaw 走 TaoToken 只需要 API Key,不需要 OAuth 流程。检查配置文件里有没有多余的 auth_type 或 oauth 字段,删掉。Key 通过api_key_env注入就够了。
除了通道报错,逻辑类问题更隐蔽。比如意图层 confidence 一直很低,任务总是被反问。这时候看 intent_packet 的 source_message 是不是被截断了,或者消息里混了太多无关上下文。再比如 plan 生成的步骤数超过max_steps,会被截断,导致任务做一半。把max_steps调大,或者把复合意图拆成多轮单一意图。
memory 回写失败的表现是:下一轮任务里,上一轮的实体取不到。检查write_back是否为 true,session_scope是否和当前工作区匹配。如果工作区路径变了,记忆会按新工作区隔离,旧实体自然取不到。这时候要么固定工作区路径,要么把session_scope改成更宽的 scope。
还有一个坑是模型 ID 填错。意图层和规划层用了同一个模型 ID,但那个模型不支持结构化输出,导致 intent_packet 解析失败。表现是意图层输出一堆自然语言而不是 JSON。换一个支持结构化输出的模型,或者在意图层 prompt 里强制 JSON 格式。
6. 把 Loop 调试固定成习惯:统一通道 + 分段验证
调 OpenClaw 的 Agent Loop,最有效的方法不是盯着最终输出改 prompt,而是把每个阶段的中间产物打出来看。意图层看 intent_packet,规划层看 plan,执行层看 step 依赖,记忆层看回写实体。这四段任何一段出问题,最终表现都是“它不按我想的做”,但原因完全不同。
统一通道这件事值得单独强调。用 TaoToken 把模型请求收敛到一个 Base URL 和一个 Key 之后,你的日志里所有模型调用结构一致,排查时只需要关注 model 字段和返回内容,不用再区分“这个请求走的是哪个供应商”。配置里 Base URL 固定https://taotoken.net/api,Key 走环境变量,模型 ID 按阶段填。这样你换模型、加阶段、做对比实验,都只动配置不动代码。
如果你要长期跑编码类或 Agent 类任务,可以了解下 Coding Plan: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 ,模型对话调试入口在 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite 。先把单一意图任务跑通,再上复合意图,最后接 memory 回写,这个顺序能帮你少踩很多坑。