断了重跑一遍,你会为同一件事付两次钱:agent 断点续跑的正确性陷阱
我那条 AI 日报流水线,每天早上要在几十个源里翻一遍。10 月中旬有一天它跑到一半,卡在一个源上超时退出了。我没多想,把脚本又跑了一遍。半小时后它交出一份完整的稿子,看着挺顺——直到我对账的时候发现,检索接口的调用次数比前一天多了将近一倍。
断点续跑做错的时候,系统不会报错,它只会把做过的事再做一遍,然后照常告诉你成功了。
重跑不是续跑,它默认会把做过的事再做一遍
10 月 16 日,图编排框架 langgraph 发了 1.2.16。这是个不起眼的小版本,但它的四个修复全部落在「恢复」这条路径上:resume 值非法时让其他任务照常结束、resumed 的更新只应用一次、resumed 的待写入只存一次,还有一条写得很直白——恢复时子图会把已经完成的任务再跑一遍。
一个编排框架的一次小版本里,四个修复全部落在恢复路径上,这不是巧合,是那一层最难写对。
难在哪?难在它的失败形态不是崩溃。任务确实跑完了,日志干净,CI 是绿的,输出也齐全,只是其中一段被做了两次。这类错误没有任何一层会去拦它:类型检查不管,测试不覆盖,监控只看到「成功」。
我做了二十年架构,处理过不少这类事。早期做分布式的时候,我们给每个可重放的动作配一个幂等键,理由不是怕它出错,是怕它出错的时候看起来一切正常。后来我把变电站远程智能巡检系统从 HTTP 互调重构成四层架构,第一件事也是定边界:业务层里不许出现框架的上下文对象。当时定的不是「什么能做」,是「什么不能进这一层」。断点续跑缺的正是这条线:哪些动作允许被重放,哪些不允许。这条线不划清楚,重跑就只是一个没有边界的默认动作。
有意思的是,10 月 15 日开源的 Perplexity 沙箱 SPACE 里,生命周期有 paused 和 suspended 两个状态,官方特意分成两个词:paused 只把内存留在 worker 上、不落持久快照,suspended 才把内存、运行时状态和根文件系统写进快照。
暂停不等于可恢复,这两个词在语义上必须分开,否则用户会以为停下来的地方还能接上。
成本也在同一处被咬了一口。同一周 Claude Code 的 v2.1.302 里,有两个修复都跟压缩相关:一个是在会话正在压缩时停止会报「提示词过长」,另一个是会话中途新增的工具在压缩后被重新加载,会触发提示词缓存失效。缓存命中率本来只跟提示词怎么写有关,现在还跟状态的恢复顺序有关。
每多一次检索,账单上就多一行没人单独计的账
10 月 17 日,DeepSeek 把自家的 Search 和 Fetch 接口开放给所有开发者,两个端点各 0.75 美元一千次成功调用。失败、空结果、超时都不算钱。检索以前是摊在 token 里的成本,现在它自己站出来成了一列。
这条定价里有三个细节值得单独记。
第一,检索第一次有了可以直接算的单次单价。以前它是摊在 token 里的,现在它自己站出来成一列。好处是缓存这件事终于可以算账了:一次命中省七毛五,要不要做缓存,从拍脑袋变成了算数。
缓存检索结果第一次有了明确的 ROI 数字:一次命中,省七毛五。
第二,每秒五次请求是并发天花板,不是性能参数。这个数字对 fan-out 型 agent 是硬约束,一条提问发散成二十个子查询,不装闸就是一片 429。我的日报流水线就是这个结构,所以我是在自己身上发现的这件事:那天多出来的调用次数,不是它变勤快了,是它把同一批源抓了两遍。
第三,最反直觉的一条:请求 50 条和请求 1 条同价,且只按成功计费。这意味着返回条数应该拉满,跟「少取少付」的通行直觉正好相反。
我算成本总账有个习惯,公式是单价乘输出量乘重试次数。现在这一列得再乘一项:被调用的次数。而且这一项最阴,它不是模型多想了几步产生的,是流程本身重复了一圈产生的,你在模型侧怎么调都调不掉。
最贵的从来不是跑一次,是同一件事跑了两次你还以为只跑了一次。
接下来可以做的三件事
给每个能被重跑的动作配一个幂等键(这一步不花预算)。不用改架构,只要在动作入口接一个「我做过这件事」的标记。做了这一步,重复执行会变成空操作,而不是第二笔账单。
把「暂停」和「可恢复」在命名上分开。留内存的和落快照的,在系统里必须是两个词、两个保证级别。这一条不写代码也能做,先把文档和状态字段里的话说清楚。
在检索入口前面装一道并发闸,后面垫一层缓存(这一步不花预算)。闸是为了不失控,不是为了提速;有了闸,缓存才敢按「命中就省七毛五」去算收益。
窗口内其他信号速览
- 10-17 OpenCode 的 Console 遭攻破,托管在服务端的 OpenAI、Anthropic、Google 密钥外泄,波及约 1.4% 用户,从最早暴露到发出通知间隔约 22 小时,有用户被扣了 400 美元。
- 10-15 Perplexity 开源沙箱 SPACE,随附红队报告:虚拟机逃逸 0/108,而部分联网策略在修复前 11/54 被绕过,手法是 DNS 欺骗加共用 CDN IP(厂商自报,未独立复现)。
- 10-16 NIST、NSA 与 CISA 联合发布十项实践,把 agent 越权行动正式定义为一类事故,并明确要求「恢复前先验证遏制措施仍然有效」。
- 10-16 Claude Code v2.1.302 给读取工具加了 128MB 上限,被命名得像图片的管道和设备文件也不再被当成图片整个读进内存。
- 10-19 GitHub Trending 上,Anthropic、Cursor、Android 三家的官方技能与插件目录同一天在榜,目录被厂商收编了,规范还没互通。

浙公网安备 33010602011771号