Github 原文:shareAI-lab/learn-claude-code
问题
还记得之前说过的异步和同步任务吗?当时我们类比过,你用洗衣机,把衣服扔进去,按下启动,然后去干别的——做饭、回消息、看论文。30 分钟后洗衣机”滴滴滴”提醒你:好了。你不会站在洗衣机前面干等 30 分钟;又或者我们现在让 AI 帮我们干活的时候要等待很长时间,这时候我们可以刷刷手机:)
Agent 的 bash 工具也一样。pip install torch 要 10 分钟,npm run build 要 3 分钟。这些命令一跑,Agent 就在等 bash 工具返回,没法利用这段时间处理别的任务。Agent 等 10 分钟什么都不做,而 LLM 按 token 计费,空转就是浪费。
解决方案
这个图其实是简化了一些之前的那个流程,我们就当做有他没画出来就好。可以看到其实就是新增了一个判断,会判断任务执行是 fast 还是 slow,如果是 fast 就继续保持同步执行,如果是slow 就在后台执行做异步。
其实和我们现在很多有偿任务的产品都会做的任务中心模块一样,比如上传、下载等等。
| 同步 (s12) | 后台 (s13) | |
|---|---|---|
| 慢操作 | Agent 干等 | 后台线程执行 |
| Agent 空闲 | 是 | 否,继续处理 |
| 结果 | 立即返回 | 下轮注入通知 |
| 判断标准 | — | run_in_background 参数(模型显式请求),启发式兜底 |
工作原理
显式启动优先
模型通过 bash 工具的 run_in_background 参数显式请求后台执行。CC 并不是采用简单的关键词启发兜底的,而是给了一个 boolean 参数,让 AI 自己决定哪些命令丢给后台任务中心去跑,也就是说这一步CC 是上了 AI 的,不是简单的一个关键词匹配什么的。
再次进入循环
既然已经到了后台执行,那么执行完了怎么通知 AI 呢?这就需要利用一个通知系统,告诉 AI 后台的这个任务执行完了,就像任务中心一样。
然后当完成后,会新建一条 tooluse 的记录,然后在循环中将通知和结果合并后插入到循环中。