Wink Pings

always-on agent 大部分时间在睡觉。叫醒它之后的事,指南没写完

Anthropic 给 always-on agent 拆了五个模块:事件收件箱、定时器、精简记忆、无人值守权限、发件箱。架构很干净,但评论区里半夜那次连不上,才是这类东西真正要面对的部分。

Anthropic 发了篇技术指南,讲怎么搭 always-on agent。何笠同学把要点整理了一遍,最值得先记住的一句是:always-on agent 不是 24 小时不停跑。它一天里几乎都在休眠,醒过来干一小轮活,把状态存好,接着再睡。

指南里把它拆成五块积木。

一、Event Inbox(事件收件箱)

webhook 和 agent 之间加一张数据库表。所有事件先写进表里,worker 从表里取。别让事件源直接调 agent,两个事件同时到会起两个 run 互相撞,worker 崩了事件也丢了。

事件收件箱

几个实操细节:handler 收到事件要尽快回确认,深度校验留到 run 里做;inbox 是唯一事实来源,worker 被叫醒先拉表里最新状态;同一个 inbox 同一时刻只开一个 worker;短时间里连续进来的事件合并成一个 run。有网友补充,连发两条 webhook 时,去重键落在消息 id 上比较稳。

二、Timers(定时器)

定时器单独一张表,不跟 inbox 混。分两类:单次跟进,agent 给自己定的截止时间;周期安排,用户定的重复任务。后台有个 scheduler 轮询,到期就往 inbox 塞事件。

定时器

三、Lean Memory + Dreaming

记忆只留没法重新查回来的东西:用户指令、用户笔记、过往消息、任务进展。如果在别处能查到,就存个指针,别复制。

记忆目录示例

每次醒来先读一份短索引,需要细节再翻具体文件。跑久了还会做 dreaming,清掉过时内容,找跨多次 run 才显现的模式。评论区网友副驾本人分享了自己的做法:index 就一个文件,每条笔记占一行,带日期和来源文件,开工时自动检查过期。Dominik 提到,只读短索引而不是把所有文件塞进来,能省很多 context。

context window 随时间变化

四、Unattended Permissions(无人值守权限)

原始 API key 别直接放进 agent 沙箱,外面套一个 proxy,发请求时注入凭证。遇到高风险动作,用 Deferred Tool Calls 停住等人批准,run 结束、session 存好,用户答复作为新事件回来接着跑,worker 不用干等着。

五、Outbox(发件箱)

回复先排进队列,由 dispatcher 按节奏投递。让 agent 自己掌握推送快慢,别凌晨三点把人刷爆。

五个模块怎么拼起来

架构图很干净。但评论区已经有人遇上了文档没写的那一段。

网友云之子说,半夜零点那轮醒了,服务拒绝连接,连试三次。存下来的还是四天前的成功记录,错误是空的。早上看板只显示还没确认。

这段比指南里任何一张图都接近日常。五个模块描述的是跑通之后的样子,真正磨人的是没跑通的那一刻:状态有没有落盘、失败有没有留下痕迹、重试会不会重复干活。Kevin Lin 说得直接,状态保存才是关键,中断后能不能接着做、失败消息能不能找到,比表面上一直在线更影响日常体验。

老王实验室补了另一个角度:会睡觉只是省钱,醒来知道这件事还用不用做,才像个助手。半小时前排队的提醒,用户可能自己已经办完了,照旧执行反而添乱。Inbox 除了接任务,最好也能接住取消和改主意。

这一周 GitHub 涨星榜里也有几个项目在处理同一类问题。herdr 把断线重连做成了卖点,长任务真正麻烦的是重新连上之后分不清还在跑还是得重来。claude-mem 把对话记忆带到下一次。排第一的 security-audit-skill 让独立的 agent 交叉核实查找结果,找问题的 agent 和验证问题的 agent 不是同一个。

它们各自补的,是模型之外的那层东西。always-on agent 难的地方,不是让它醒着,是让它醒来之后知道发生了什么,还有什么没发生。

发布时间: 2026-11-15 08:36