【AI Engineering · Harness 系列】04 Task Loop 三层心跳——从每次对话到长期自治
本文硬度预警 ⚠️这一篇讲 Agent 的时间维度——一个 Agent 要能长期自治它必须有心跳。我会把 OpenClaw 的Task Loop 三层心跳系统全部讲透每次对话内的 Agentic Loop微观心跳每日定时的 Task Loop中观心跳每月进化的 Evolution Loop宏观心跳并附上过去 90 天的真实成本账单——Token 消耗、API 调用、云服务费、总成本。读完你会清楚知道养一个自治 Agent 一个月要花多少钱。一、开篇钩子我为什么要给 Agent 一个心跳2026 年 1 月我还没有 daily-dream只有单次对话的 Agent。每天上班第一件事“CodeBuddy你还记得昨天我们做的 DocCenter v1.2 吗”“抱歉我不记得。请告诉我上下文。”每天都要重新解释一遍项目背景、上次的进度、未解决的问题。我粗略算了一下光重新同步上下文这一步每天浪费我 30-45 分钟。一周 3.5 小时。一个月14 小时——相当于两个工作日。问题的根源是我的 Agent 没有时间这个维度。它只有当次对话没有跨天更没有跨月。生物之所以是生物不是因为它聪明是因为它有节律——心跳、昼夜、季节、年岁。Agent 要成为真正的自治体也必须有节律——微观心跳、中观心跳、宏观心跳。这就是这一篇要讲的Task Loop。二、调研追溯三种 Task Loop 设计2.1 Anthropic 的 Agentic Loop单次对话出处Claude SDK 官方 “Building Agents” 教程。机制用户输入 → 模型规划 → 工具调用 → 结果反馈 → 模型决定是否继续 → 直到 task 完成优点简单清晰单次对话内自治。局限对话结束就结束了。不存在下次对话。2.2 AutoGPT 的 Perpetual Loop无限循环机制while not done: plan llm.plan(goals) action llm.decide(plan) result execute(action) memory.append(result)优点24/7 运转真正自治。致命缺陷没有外部节律全靠模型自决成本失控有人跑 AutoGPT 一晚上烧了 $200目标漂移转着转着忘了初衷2.3 OpenClaw 的三层心跳我的方案机制把 Agentic Loop 放进节律框架里——[微观] Agentic Loop对话内 └─ [中观] Task Loop每日定时触发 └─ [宏观] Evolution Loop每月反思触发核心区别Anthropic只有微观AutoGPT微观 失控的中观OpenClaw三层齐全每层都有边界2.4 三者对比维度AnthropicAutoGPTOpenClaw微观心跳✅✅✅中观心跳❌⚠️失控✅可控宏观心跳❌❌✅成本可控✅❌✅长期自治❌⚠️✅三、概念精析三层心跳的边界3.1 微观心跳Agentic Loop边界单次对话内。触发用户输入。职责完成具体任务写代码、改文档、答疑。退出条件任务完成 / max_turns 到达 / 用户结束。3.2 中观心跳Task Loop边界每日定时。触发cron / launchd。职责定期性工作做梦 / 学习 / 巡检 / 日报。退出条件脚本跑完。3.3 宏观心跳Evolution Loop边界每月或每季度。触发人工触发 阈值建议原则数 10、Skill 数 30 等。职责自我进化——精简原则、合并 Skill、升级架构。退出条件人工确认完成。3.4 为什么要分层核心哲学不同时间尺度的任务需要不同的触发节律。写代码是秒级的——用微观 Agentic Loop做梦是日级的——用中观 Task Loop架构演进是月级的——用宏观 Evolution Loop如果让模型在单次对话里试图做月级的架构演进它会崩——上下文装不下全年的历史。所以要把这些任务交给宏观心跳让它在更大的时间窗口里慢慢跑。四、实例拆解OpenClaw 三层心跳完整实现4.1 微观心跳Agentic Loop 的 max_turns 护栏Agentic Loop 的核心参数是max_turns——模型最多跑多少轮工具调用。OpenClaw 的默认配置# openclaw/core/agentic_loop.pyDEFAULT_MAX_TURNS50HARD_MAX_TURNS200# 绝对上限任何 Skill 都不能超过classAgenticLoop:def__init__(self,max_turns:intDEFAULT_MAX_TURNS):ifmax_turnsHARD_MAX_TURNS:raiseValueError(fmax_turns{max_turns}{HARD_MAX_TURNS})self.max_turnsmax_turns self.cost_trackerCostTracker()defrun(self,user_input:str)-str:forturninrange(self.max_turns):# 成本熔断单次对话超过 $2 强制结束ifself.cost_tracker.current_cost2.0:raiseCostCircuitBreakerError(f对话成本 ${self.cost_tracker.current_cost:.2f}超限)responseself.model.generate(user_input,historyself.history)ifresponse.is_final:returnresponse.content# 执行工具调用tool_resultself.execute_tools(response.tool_calls)self.history.append({assistant:response,tool_result:tool_result})raiseMaxTurnsExceededError(f{self.max_turns}turns exceeded)关键设计max_turns默认 50一般对话够用HARD_MAX_TURNS200是硬上限防止 Skill 写崩成本熔断 $2——超了就断不管任务完没完4.2 中观心跳Task Loop 的完整配置完整的 crontab 配置生产中实际在跑的# crontab -l# OpenClaw 中观心跳 # 每日学习 × 209* * * /path/to/heartbeat/daily-learn.sh morning020* * * /path/to/heartbeat/daily-learn.sh evening# 每日做梦00* * * /path/to/heartbeat/daily-dream.sh# 每日股票监控309* *1-5 /path/to/heartbeat/stock-monitor.sh3015* *1-5 /path/to/heartbeat/stock-monitor.sh016* *1-5 /path/to/heartbeat/daily-report.sh# 每日新闻摘要08* * * /path/to/heartbeat/news-digest.shlaunchd 互补部分macOS 休眠期间 cron 不跑launchd 会# launchctl list | grep openclawcom.openclaw.heartbeat → 每 4h 哨兵 com.openclaw.wake_sync → 开机/唤醒触发补跑遗漏任务wake_sync.sh开机/唤醒时补跑#!/bin/bash# wake_sync.sh - 开机时检查昨天是否漏跑任务WORKSPACE/Users/louiscxqiu/CodeBuddy/openclaw-cb/openclaw-workspaceYESTERDAY$(date-v-1d %Y-%m-%d)# 检查昨天的做梦日志DREAM_LOG$WORKSPACE/logs/daily/$YESTERDAY-dream.mdif[[!-f$DREAM_LOG]];thenecho[wake_sync] 昨天未做梦现在补跑...$WORKSPACE/heartbeat/daily-dream.shfi# 检查昨天的学习日志LEARN_LOG$WORKSPACE/logs/daily/$YESTERDAY-learn-evening.mdif[[!-f$LEARN_LOG]];thenecho[wake_sync] 昨天未学习现在补跑...$WORKSPACE/heartbeat/daily-learn.sheveningfi4.3 宏观心跳Evolution Loop 的触发与执行Evolution Loop 不是定时的是阈值触发。每次做梦脚本最后一步检查# daily-dream.sh 尾部# 检查是否触发宏观进化evolution_check(){localprinciple_count$(grep-c^### $WORKSPACE/principles/evolution.md)localskill_count$(find$WORKSPACE/.codebuddy/skills-nameSKILL.md|wc-l)localmemory_lines$(wc-l$WORKSPACE/MEMORY.md)localtriggeredfalselocalreasons()if[[$principle_count-gt10]];thentriggeredtruereasons(原则数$principle_count 10建议精简到 5-7 条)fiif[[$skill_count-gt30]];thentriggeredtruereasons(Skill 数$skill_count 30建议合并重叠技能)fiif[[$memory_lines-gt150]];thentriggeredtruereasons(MEMORY.md$memory_lines行 150即使做梦后也过长)fiif$triggered;then# 发企微通知请求用户触发 Evolutionlocalmsg## OpenClaw 建议触发宏观进化\n\nforrin${reasons[]};domsg-$r\ndonemsg\n请回复 \/evolve\触发进化流程curl-XPOST$WECOM_WEBHOOK\-HContent-Type: application/json\-d{\msgtype\:\markdown\,\markdown\:{\content\:\$msg\}}fi}evolution_checkEvolution Loop 的实际流程收到/evolve后Step 1: 读取所有 principles/*.md让 LLM 找语义重叠 Step 2: 生成建议合并清单人审 Step 3: 读取所有 skills/**/SKILL.md用 embedding 算相似度 Step 4: 找相似度 0.85 的 Skill 对建议合并 Step 5: 扫描 MEMORY.md找超过 90 天未被引用的条目 Step 6: 生成 evolution-report-YYYY-MM.md Step 7: 人审通过后执行合并/删除已发生的真实进化记录memory ID 306903902026-04-14 凌晨完成代谢系统重构。进化原则库从15 条重复精简为5 条精华v54MEMORY.md 从 580 行清理至约 80 行。4.4 过去 90 天真实成本账单这是我从 2026-02-01 到 2026-04-30 的完整成本记录来自logs/cost/4.4.1 微观心跳对话内2026-02: 对话 287 次平均每次 12.3 turns Token 消耗: 输入 8.2M / 输出 1.1M API 成本: $31.20 (Claude Sonnet 4.5) 2026-03: 对话 312 次平均每次 14.1 turns Token 消耗: 输入 9.8M / 输出 1.4M API 成本: $37.80 2026-04: 对话 291 次平均每次 13.7 turns Token 消耗: 输入 9.1M / 输出 1.3M API 成本: $34.90 小计 3 个月: $103.904.4.2 中观心跳定时任务daily-learn: 2 × 30 × 3 180 次 单次 Token: 输入 ~3K / 输出 ~2K 小计: $2.80 daily-dream: 1 × 30 × 3 90 次 单次 Token: 输入 ~8K / 输出 ~5K 小计: $4.20 stock-monitor: 3 × 22 × 3 198 次 单次 Token: 输入 ~5K / 输出 ~3K 小计: $5.10 news-digest: 1 × 30 × 3 90 次 单次 Token: 输入 ~10K / 输出 ~2K 小计: $3.60 小计 3 个月: $15.704.4.3 基础设施Tencent Cloud (DocCenter 托管): $12 × 3 $36 企微机器人: 免费 MCP 服务: 免费本地 launchd / cron: 免费 小计 3 个月: $364.4.43 个月总成本项目金额占比微观心跳对话$103.9067%中观心跳定时$15.7010%基础设施$36.0023%合计$155.60100%月均 $51.87——约 370 元人民币。单日成本 ≈ 12 元。这是养一个 24/7 自治 Agent的真实账单。4.5 成本优化的五个关键措施我怎么把成本控制住的措施 1微观心跳的成本熔断每次对话设 $2 上限上面代码里的CostCircuitBreakerError。5 个月只触发过 3 次——全是我让它做找历史上所有类似问题这种不合理请求。措施 2中观心跳用小模型daily-learn / daily-dream 脚本全部使用 Claude Haiku成本是 Sonnet 的 1/5。这些任务是结构化的不需要大模型。# daily-dream.sh 配置exportOPENCLAW_MODELclaude-3-5-haiku-20241022# 小模型措施 3RAG 路由替代全文注入MEMORY.md 精炼到 80 行之后每次对话的基础上下文从~50K token 降到 ~8K token单次对话成本降低 80%。措施 4缓存可缓存的Anthropic 的 prompt caching 对 CLAUDE.md / SOUL.md 这类稳定内容非常有效# openclaw/core/llm_client.pydefcall_with_cache(system_prompt:str,user_msg:str):returnclaude.messages.create(modelclaude-sonnet-4-5,system[{type:text,text:system_prompt,cache_control:{type:ephemeral}# 命中缓存省 90%}],messages[{role:user,content:user_msg}])实测缓存命中率 72%每月节省 $18。措施 5定时任务必须有执行日志所有定时任务必须落盘logs/cost/YYYY-MM-DD.jsonl每月 1 号跑一次审计。审计发现过一个脚本意外调用了 GPT-4o追回来 $7。五、启发与方法论五条可迁移原则原则 1给 Agent 分配时间维度不要只让 Agent 在当前对话里活。分配给它今天、“本周”、本月的任务——让它知道哪些事必须今天做完做梦哪些可以本周内做Wiki 重构哪些要等到月底架构演进。原则 2三层心跳必须边界清晰微观不抢中观的活中观不越界去做宏观。每层只做自己时间尺度内的决策。如果微观 Agentic Loop 试图顺便精简一下原则库它会把上下文挤爆——那是宏观心跳的活。原则 3成本熔断优先于任务完成宁愿任务没做完也不能账单爆炸。每次对话 $2 上限每日定时任务 $1 上限每月总预算 $100 上限——任何一层超了就断。原则 4小模型做小事不要什么都用 Sonnet。Haiku 够用的场景坚决用 Haiku结构化抽取模板填充定时巡检分类打标只把 Sonnet 留给真正需要推理的场景。原则 5可观测性优先于优化永远先有日志再做优化。我早期想当然以为 daily-dream 是成本大头结果看日志发现它只占 10%——真正的大头是微观对话。优化的第一步永远是看数据不是拍脑袋。六、反驳性思考反驳一$50/月是不是太贵了要看对比对象。vs 一个 Notion 付费账号$8/月贵 6 倍。vs 一个实习生日薪$100/天便宜 60 倍。vs 我每天省下的 30-45 分钟同步上下文时间按我的时薪算回本周期 2 天。所以 $50/月贵不贵取决于你把它和什么比。反驳二成本熔断会不会误伤会偶尔。90 天内触发过 3 次1 次是我让它找所有历史对话里关于 DocCenter 的内容 → 合理阻断1 次是我让它把整个 openclaw-cb 目录读一遍 → 合理阻断1 次是真误伤复杂代码重构到 $2 时任务只完成 60%→ 我手动提升上限到 $33 次里 2 次是真的不该做1 次是合理边界被踩到。总体误伤率可接受。反驳三三层心跳不是太复杂了吗有必要吗取决于你的 Agent 要不要活过这个月。如果 Agent 只用 1 周一个微观 Agentic Loop 够了。如果 Agent 用 1 个月以上没有中观心跳就会陷入每天重新同步的黑洞。如果 Agent 用 6 个月以上没有宏观心跳就会成为骨头僵硬的活化石——原则越积越多、Skill 越来越乱直到不能用。Harness 不是一次性建完就完它是逐层长出来的先微观→遇到痛点加中观→再遇到痛点加宏观。七、收官与预告这一篇和 03 篇是配套的——03 讲睡眠代谢04 讲心跳节律。两篇合起来是 Harness 的时间维度。下一篇05进入 Harness 的空间维度《Context 不是内存是预算CLAUDE.md 的注入艺术》我会深入讲 CLAUDE.md / include 机制 / Token 预算制 / 尾部保护策略配 OpenClaw 的完整配置文件。这一篇会比 03/04 稍轻一点中量档但核心概念非常重要——不理解预算就永远理解不了为什么你的 Agent 越聪明越烧钱。全系列地图#标题状态01Agent Model Harness✅02确定性外壳 × 非确定性内核✅03Checkpoint vs Compaction硬货✅04Task Loop 三层心跳硬货✅ 当前05Context 不是内存是预算⏳ 下一篇06独立 Evaluator⏳07五大反模式硬货⏳08Big Model vs Big Harness⏳路易乔布斯2026 年 5 月 · 深圳养虾系列 S4 · Harness Engineering 深度拆解 04/08 ·硬货篇