事件驱动异步

一个根本矛盾贯穿始终:LLM 的训练范式假设同步——发出工具调用后,下一条消息必须是工具结果;而真实部署要求异步——用户随时可能打断,多个任务可能并发,外部事件可能在工具尚未返回时就抵达。事件驱动架构就是为容纳这一矛盾而生。

前面几节的感知、执行、协作工具都由 agent 主动调用。本节转向另一个挑战:agent 如何管理耗时任务、响应随时可能到达的外部事件?这需要事件驱动的异步架构——五类工具里的事件触发工具用户沟通工具正是依托它发挥作用的。

为什么需要异步

同步意味着“做完一件事才能做下一件”,异步意味着“多件事可以同时进行”。真实助理场景需要三项能力:异步执行是常态(长任务不应阻塞交互)、事件优先级的动态判断(取消当前/加入队列/并行处理)、中断和恢复的流畅性。而异步落地到当前 LLM 遭遇一个根本矛盾:LLM 的训练范式假设同步——发出工具调用后下一条消息必须是工具结果;而真实部署要求异步——用户随时可能打断,外部事件可能在工具尚未返回时抵达。这一“训练同步 / 部署异步”的矛盾贯穿本节所有工程取舍。为此需要把所有输入、输出、思考与外部交互统一建模为事件流,在新事件到达时自动触发处理,而不是低效轮询。

世界要能主动通知 Agent

OpenClaw 的 Cron/Heartbeat 是时间驱动的(定时轮询),对内置渠道之外的第三方事件(新邮件、API 回调、紧急通知)缺乏即时接入通道,只能等下一个周期才察觉。Pine AI 的 PineClaw 案例说明代价:Pine 代打真实电话,通话中随时需用户介入,靠 5 分钟一次的 Heartbeat 轮询会导致客服等验证码时挂断。解法是 Channel 机制——建立实时事件通道,关键事件即时推送,延迟从分钟级降到秒级。核心价值:真正的“主动服务”不仅需要 agent 能定时检查世界,更需要世界能主动通知 agent

事件触发工具与用户沟通工具

事件触发工具是外部事件驱动 agent 的入口,常见三类:定时器set_timer,处理依赖物理时间的事件,也对不支持推送的服务定时查询)、后台任务监控monitor_shell,监控长命令的新增输出或关键词)、外部事件通道connect_channel)。用户沟通工具则在 session 对用户透明、双方随时互发消息的范式下,让 agent “说话”成为显式的工具调用(可带附件、按紧急度附推送);它同时是用户召回机制(按紧急度、用户状态综合选 IM/短信/邮件/电话/推送渠道)。

虚拟身份与隔离执行环境

要实现能独立、常驻、随时代表用户行动的 agent,面临一个架构选择:直接管理用户的个人账号,一旦出错或被攻破用户全部数字身份暴露;更稳妥的是给 agent 一套独立虚拟身份——独立通讯账号、存储、计算环境。它落地在隔离执行环境上:虚拟电脑(VM/容器)和虚拟手机(Android 模拟器)提供 OS 级隔离,agent 有自己的账号、家目录、凭证,操作可追溯可审计。两个现实挑战:反自动化(数据中心 IP 易被拦截,需住宅代理)、访问用户真实账号(用 VNC/RDP 的 HITL 认证,令牌有效期内复用)。

事件处理机制:安全点与三种策略

一个 agent 实例可能同时面对多个事件。骨架是并发编程的事件循环:每轮从队列取事件、追加轨迹、调一次 LLM、执行工具、回到开头等下一批——与 Go 的 for { select {} } 同构。关键性质:事件只在每轮循环的边界被消费。LLM 推理或工具执行时,新事件不会凭空插入打乱当前步,而是在队列等待,到达一个安全点(一段推理结束、一次工具返回)再统一处理;取消也在安全点检查(对应 Go 的 ctx.Done())。三种处理策略的区别只在如何对待安全点:取消式(紧急事件,提前制造安全点:停当前操作、清空队列、追加、立即重调 LLM)、队列式(常规事件,放队尾、等安全点批量追加)、并行式(独立轻量查询,另起推理会话独立执行)。前提是把每个输入建模为结构化事件(来源/渠道/内容/上下文),紧急度判定建议用轻量分类 LLM 作事件路由器

工程实现:同步格式容纳异步打断

回到“训练同步 / 部署异步”的矛盾:工具尚未返回时用户突然打断,同步格式(“发出工具调用后下一条必须是工具结果”)该如何容纳?业界的工程权宜之计是:常态下让 LLM 看到标准的同步轨迹,只在打断发生时才插入占位符来修复格式——正常流程零改动,异步打断时给未完成的工具调用补一个合成的 tool 结果占位,让消息序列在协议层保持合法,再把打断事件追加到末尾。

深层矛盾与未来方向

前面的占位符、异步工具接口、状态栏标记,本质上都是用提示工程弥补同一个“训练同步 / 部署异步”的矛盾,是过渡期的权宜之计。真正的解法需要在模型训练层面发生范式转变。机器人领域的 VLA(Vision-Language-Action,视觉-语言-动作)模型已在面对类似挑战——感知与动作之间存在不可避免的延迟——它的成功为 agent 模型的进化指了方向:下一代模型需要通过异步环境中的强化学习获得三种能力:

  1. 理解轨迹中事件的异步穿插:最核心的缺陷。当前模型期望严格同步序列,但真实环境里 tool call 之后可能不是 tool result 而是新 user 消息,thinking 进行到一半可能被打断;模型需在这种“乱序”轨迹中保持清晰认知——哪些工具调用还在等结果、哪些思考是未完成片段。
  2. 恢复被打断的任务和思考:被打断去处理紧急事件后仍记得未完成的任务,尤其要避免误以为被打断的工具调用已完成的幻觉。
  3. 批量事件的综合处理:多个事件批量追加时不能只看最后一个,要综合所有未处理信息。

实现这种异步 RL 需要新基础设施:异步环境模拟器(生成工具延迟返回、用户随机打断等场景)与异步能力的专项奖励。

不过“持续思考”不必等到下一代模型:用一层约两百行的编排,就能让现成的文本思考模型当场变成持续思考的 agent(continuous-time),恰好接上“工程权宜”与“模型进化”两半。机制是前面占位符思路的升级——与其在被打断时丢弃半截思考,不如把整个交互建成一条不间断的思维流:随时合上模型正在写的 <think> 块,把新到达的观察(工具返回、用户打断、新识别结果)作为普通消息注入,再让模型接着解码。它利用了一个常被浪费的资源:模型每秒能生成上千 token,而一次工具调用、一段用户说话要花好几秒,这些“等待”都是白赚的算力。由此长出边等边想(不等工具返回就基于半截信息往下想,甚至提前把下一步工具调起来)和边做边想(一边输出一边继续思考、动作进行到一半能自我纠正)两种行为。但更关键的一半在训练:光有编排只让持续思考成为可能,用“LLM 当裁判”式奖励去训练,模型会学着把思考藏起来、用沉默换好评,客观指标反而更差;只有用可验证、能保住信息覆盖度的目标,持续思考才带来实打实的收益。一句话——编排让行为成为可能,训练让行为变好:异步能力终究要靠合适的训练来固化,而非永远靠提示工程打补丁。

工程实践

安全点与协作式取消是 Zapvol 落得最完整的一环。用户 Stop、超时、进程关停三种触发全部收敛到同一条 AbortSignalsession.abortController),下游不区分。它就是上面那两条判断的样子——只在安全点动手:LLM 生成由 SDK 在下一个 await 点取消,工具是协作式的(signal 只是通知,工具须主动响应才真停;不响应的要等到 stepMs 超时才被兜底掐断);协调式收卷而非即死terminatePendingToolParts(parts, "Cancelled") 把悬在 input-available 的孤儿工具 part 收成终态,让消息序列在协议层保持合法、前端不永久转圈——这就是“同步格式靠插占位符容纳异步打断”的生产形态。异步执行由 后台任务队列(BullMQ 六队列、双路径分发、幂等扣费)承载,长任务入队不阻塞交互;隔离执行由 沙箱 ISandboxcreateSandbox() 工厂分派,目前落地 Node、Daytona / E2B 占位;凭证经 KeyEncryption 隔离、不进沙箱)承载。

事件触发比 book 的最小集更全:draft_schedule(HITL——agent 提议一条循环计划、用户确认才持久化,如“每 30 分钟刷一遍订单”)对应 book 的循环定时器wait_and_resume(一次性延时自续——暂停当前任务、delaySeconds 后以新 user 消息唤醒,用于等 CI / 轮询 / 次日续办)对应一次性定时器NudgeScheduler(每会话去抖计时——“最后一条消息 N 分钟后触发 Nudge 分析,新消息到来即重置倒计时”)正是 book 所说 OpenClaw 的 Heartbeat;长期规则由 cron Scheduler 承载。运行中也能接受输入——task-serviceappendMessage 与对子 agent 的 steer 让用户 / 父级在任务执行途中注入消息,对应 book“观察不只来自 action”的异步入口。浏览器操作则由 BUA(browser 工具经 BrowserBridge)提供一部分 computer-use 能力。

book 还指明了几条 Zapvol 尚未走到的方向:

待优化 · 外部事件通道:Zapvol 的自我唤醒目前是时间驱动的(schedule / nudge 定时触发)——恰好停在 book 批评 OpenClaw 的那一档。缺的是“世界主动推送”:把新邮件、API 回调等外部事件即时唤醒 agent 的通用通道(book 的 connect_channel / PineClaw Channel),以及盯住后台命令新增输出的 monitor_shell

待优化 · 三策略分派与事件路由器:book 按紧急度分取消式 / 队列式 / 并行式三种策略,并用轻量分类 LLM 做事件路由。Zapvol 把取消式做到了生产级,但队列式批处理、并行式轻量查询、以及事件路由器这三块并不显式——mid-flight 追加更接近“到边界就并入”,缺按紧急度自动选择策略的分派层。

待优化 · 完整虚拟身份:Zapvol 有浏览器控制(BUA)与代码沙箱隔离,但 book 的完整“虚拟身份”——独立通讯账号、虚拟手机、住宅代理、VNC 可视化 HITL 认证——尚未落地。对 Pine 这类代打电话 / 操作账号的场景,这是一条明确的优化线。

相关阅读

这页有帮助吗?