多 agent 协作
在 agent 之间交接工作,把结果拿回来,看清谁派了什么。
两个 agent 各在一个 Workspace 上,不互相说话也已经很有用了。这一页讲的是下一步:一个 agent 把一块工作交给另一个,再把结果拿回来,不用你来回传话。你用平常的话提要求,传递的事交给 agent。
在句子里提到一个 agent
打 @,列表里除了文件还有 agent:先是这个目录上的其他 agent,然后是其他目录上的,目录用灰字标出。
提到不等于发给它。消息仍然发给你正在对话的这个 agent。你点名某人,是为了能谈论它:
@Hopper 在做 auth 分支。让它把缺的测试补上,跑完告诉我结论。
做不做由你正在对话的这个 agent 决定。它要是做了,消息会带着 Kumo 自己写的前缀出现在另一场对话里:
[from Curie · feat/auth · agent_id=…] Add the tests for the token refresh path
这个前缀伪造不了:发送方的身份来自环境变量,而不是命令行参数。而且它是有意让你看见的。agent 之间说的话都摆在你面前,就在对话里,原本写 YOU 的地方标着 FROM Curie · feat/auth。
@ 后面还可以跟一个 Workspace 或 project,用来说清在哪:「在 @workspace:web/main 上开个 Codex 在那修」「在 @project:web 里新建一个叫 billing 的 Workspace」。同样,由你正在对话的 agent 去做。
交给它一个新 agent
想让 agent 用你指定的配置开一个帮手,就在 @ 列表 AGENTS 那组末尾选 New agent…,或者直接打 @new:Hopper。一张卡片会让你选名字、agent、模型、强度和模式,默认 agent 和它上次的配置已经选好。你的草稿里会多一枚芯片:
让 @new:Hopper 写测试,@new:Curie 来 review。两个都做完了告诉我。
发送后,你正在对话的 agent 会用这些配置开出 Hopper 和 Curie。发送前点进芯片里可以改它的配置。
把结果拿回来
正确的委派方式是:带 --notify 发出去,然后结束这一轮。带了 --notify,Kumo 会记下发送方在等。另一个 agent 停下来时(完成、失败,或者在提问),Kumo 会把它最后一段回复投进发送方自己的队列:
[from Hopper · feat/auth · agent_id=…] stopped: done … Last reply:
Added six tests around refresh expiry; two were already failing on main.
在对话里,它显示为一个标着 FROM Hopper · feat/auth · done 的气泡,只有回复本身。这是一条走正常队列的真 prompt,所以发送方睡着了也会被叫醒,并且必须读它。想原地等着的 agent,只能看它自己那套运行环境的脸色:有的能挂起再恢复,有的就卡住不动,有的嘴上说在监听其实什么也没起。
kumo wait 是另一半,它是轮询而不是推送:查的就是你在 AGENTS 列表里看到的那个状态。适合看一眼进度,不是收结果的正路。
Related agents
一个 agent 把活派出去之后,它的输入框上会多一颗胶囊,2 out,带着最要紧那个的状态。点它,或者点右侧栏的 Related agents,就能看到列表:
- SPAWNED:这个 agent 开出来的。
- WAITING ON:它用
--notify派了活、正在等的。
点一个,就在面板里直接读它的对话,只读,不用离开当前的 agent。预览里的权限卡和问题卡照样能点,所以卡在问题上的帮手可以在这里放行。要回话就按 Open tab,它会在当前格旁边打开。
对话里,agent 每操作一次工作台,你看到的是一条台账行,而不是一行折叠的工具调用:Spawned Hopper、Sent to Curie · delivered、Filed #97,下面附着它交出去的那段话。点台账行上的 agent 名字,会在 Related agents 里打开它。
kumo 命令
agent 通过 app 里自带的一个小命令行工具,加上一份教它怎么用的 skill 来操作工作台。两者都随 app 一起装好,不用从 npm 再装什么。离开 Kumo,这个工具就不在了,skill 也会自己停用。这些命令不用你来敲,是你提出上面那些要求时 agent 自己去用的。
kumo ls | 所有 Workspace 和 agent:名字、摘要、agent、目录、状态、task |
kumo projects / kumo backends | 有哪些 project,装了哪些 agent CLI |
kumo read <agent> | 另一场对话最近的消息 |
kumo send <agent> <msg> | 往另一个 agent 的队列里投一条消息。带 --notify 把回复拿回来 |
kumo spawn | 开一个新 agent:--name、--backend、--workspace、--model、--effort、--mode、--prompt、--notify |
kumo worktree new <label> | 新建一个 Workspace 并打印路径 |
kumo wait <agent…> | 阻塞到这些 agent 停下 |
kumo task … | 列出、查看、新建、编辑、开始、完成 Task |
kumo term … | 使用它自己 Workspace 的终端 tab |
kumo emit / kumo flow / kumo run | 事件、agentflow 定义、它所在的那次 run |
kumo spawn 不带 --backend 时用你的默认 agent。于是「方案你自己出,实现交给 Codex」就是一句话的事。
agent 建出来的东西落在哪
和你自己建的落在同一个地方,只是不打扰你:
- 新 agent 的 tab 加到焦点格里并标为未读,不会抢焦点。
- 如果它属于另一个目录,就放进那块 board 的布局里,等你切过去时就在。
- 新 Workspace 出现在树上,不会被选中。
- 不发通知,因为 tab 就在眼前。之后它需要你或者跑完了,照常通知。
关 tab 仍然等于关 agent。你把 Hopper 的 tab 关了,下一次往它 kumo send 就会失败并说明原因,这是对的:明确的失败,好过对着一个幽灵发消息。
不给 agent 的
没有破坏性操作。agent 不能删除 Workspace、关掉别的 agent、打断别人的这一轮、改别的 agent 的模型或模式,也不能替它 commit 和 push。一个 agent 能开多少个 agent 也没有上限,这是有意先看看会怎样,不是疏忽。
可见范围也不设围栏:agent 能看到所有 project 里的 agent。这些进程本来就能读你整块磁盘,在这里设围栏只是摆设。