很多人第一次看 AI Agent 的流程時,都會不自覺把它想成一條線。
收到任務
-> 做事
-> 完成
-> 回覆
看起來很乾淨,也很合理。
問題是,真實世界幾乎沒有這麼乖。
任務一進來,常常馬上變成:
所以第 14 天我想講的是:
流程不是直線,OpenClaw 的工作流思維是怎麼形成的?
這一篇我想把它寫成一個很工程的結論:
OpenClaw 不是用「一個長流程」理解任務,而是用「一組會流動、會分岔、會回收的工作流節點」去理解任務。
lane 和 queue 在工作流裡扮演什麼角色?如果把 OpenClaw 的工作方式畫成圖,它不是單線,而比較像一張網。
網的節點包括:
這些不是附帶功能,而是同一條工作流的不同切面。
OpenClaw 的核心思路很像這樣:
所以你如果只盯著「這一輪回答了什麼」,很容易看不懂 OpenClaw。
你得把它看成一個持續流動的系統。
先看 lane 的概念。這裡很直接,工作進入序列化 lane 的時候,系統會打診斷事件。
📄 原始碼:
src/logging/diagnostic-runtime.ts:35-51
function logLaneEnqueue(lane, queueSize) {
if (!areDiagnosticsEnabledForProcess()) return;
diag.debug(`lane enqueue: lane=${lane} queueSize=${queueSize}`);
emitInternalDiagnosticEvent({
type: "queue.lane.enqueue",
lane,
queueSize
});
markDiagnosticActivity();
}
function logLaneDequeue(lane, waitMs, queueSize) {
if (!areDiagnosticsEnabledForProcess()) return;
diag.debug(`lane dequeue: lane=${lane} waitMs=${waitMs} queueSize=${queueSize}`);
emitInternalDiagnosticEvent({
type: "queue.lane.dequeue",
lane,
queueSize,
waitMs
});
markDiagnosticActivity();
}
這段看起來像純 logging,但它透露的訊息很重要:
換句話說,OpenClaw 不把流程看成「直接處理」,而是看成「先排隊,再流動」。
再看 session reset。
📄 原始碼:
src/gateway/session-lifecycle-state.ts(本機版本行號已變動,僅標到檔案)
function isStaleLifecycleEventForSession(params) {
return Boolean(params.owningSessionId && params.currentSessionId && params.owningSessionId !== params.currentSessionId);
}
這句很短,但意思很清楚:
sessionId
這代表 reset 不是旁支,而是工作流切斷與換檔的正式機制。
接著看 session management 文件怎麼說 reset。
📄 文件:
docs/concepts/session.md:69-69
Sessions are reused until they expire under `session.reset`:
- **Daily reset** - new session at a configured local hour
- **Idle reset** - new session after inactivity
- **Manual reset** - type `/new` or `/reset` in chat
Heartbeat, cron, exec, and other system-event turns may write session metadata, but those writes do not extend daily or idle reset freshness.
這裡的重點不是「會 reset」,而是:
再看 pruning。
Session pruning trims old tool results to keep context lean and caching efficient.
Pruning is in-memory only -- it does not modify the on-disk session transcript.
| Pruning | Trims tool results |
| Compaction | Summarizes conversation |
這裡其實是在講兩個不同層次的 workflow 變形。
它們不是單純優化效能,而是直接改變任務在模型眼中的形狀。
最後看子代理和收尾怎麼接回主流程。
📄 原始碼:
src/agents/openclaw-tools.ts(本機版本行號已變動,僅標到檔案)
const SUBAGENT_SPAWN_ACCEPTED_NOTE = "Auto-announce is push-based. After spawning children, do NOT call sessions_list, sessions_history, exec sleep, or any polling tool. Track expected child session keys. Continue any independent work. If your final answer depends on child output, wait for runtime completion events to arrive as user messages and only answer after completion events for ALL required children arrive. If a child completion event arrives AFTER your final answer, reply ONLY with NO_REPLY.";
這一段其實就是 workflow 思維的縮影:
所以 OpenClaw 的流程不是直線,而是「分流 + 等待 + 回流 + 再整合」。
如果只是「查一個值」或「回一句話」,直線流程很漂亮。
但只要任務開始包含這些元素:
你就會發現直線不夠用。
因為任務不再是一個點,而是一條會彎、會岔、會回來的路。
OpenClaw 不是不想要簡單,而是它知道真實工作本來就不簡單。
所以它把簡單抽象成多個可控節點,而不是硬把現實塞回一條線。
lane 是「先後順序」,queue 是「等待秩序」這兩個概念很容易混在一起。
你可以把 queue 想成門口排隊的人,lane 想成被安排進去的工作通道。
OpenClaw 為什麼要這樣分?
因為有些工作可以先排著,有些工作一旦進 lane 之後就必須被序列化,不能亂穿插。
這就是它工作流不是直線、而是有通道的原因。
很多系統把 reset 當成例外。
OpenClaw 不是。
它直接把 daily reset、idle reset、manual reset 變成 session lifecycle 的正式邏輯。
也就是說,流程設計時就要承認:
如果不把這些狀況當成 workflow 的一部分,後面就只會一直出現「怎麼突然斷了」的錯覺。
一個長流程如果不呼吸,最後就會爆掉。
OpenClaw 的 pruning 和 compaction 就像呼吸:
這樣 workflow 才能繼續往前,不會被舊輸出壓死。
更重要的是,這不是在破壞流程,而是在讓流程可以活得更久。
前面幾天已經看到子代理不是單純的「多一個 AI」。
放到 workflow 的角度,它其實是在把一條流程變成一棵樹:
這跟傳統 pipeline 最大的差別是:
這也是它為什麼看起來像工作流引擎,而不是單純聊天機器人。
OpenClaw 真正關心的不是「某個工作有沒有做完」,而是:
所以 workflow 的終點不是 task done,而是 task done + delivered + integrated。
這一點很像真實工作。
你把報告寫完不算完成,
主管收到、看懂、整合進最後版本,才算完成。
如果換成傳統聊天程式,設計會簡單很多。
但那樣一旦進到真實工作:
OpenClaw 的選擇就是:一開始就承認流程不是直線,然後把這件事做成能力。
queue 管等待秩序,lane 管序列化執行reset 是 workflow 的正式分岔,不是意外故障pruning 和 compaction 讓長流程可以維持呼吸,不被上下文撐爆第 15 天我想接著看一個很現實的問題:
失敗不是結束,Agent 怎麼處理錯誤?
因為工作流一旦變成網狀,失敗就不再是單點中斷,而是會沿著流程傳開。這時候系統怎麼擋、怎麼記、怎麼補,就很重要了。