当你用 Kimi CLI 写代码时, 有没有想过: 如果有一个专门的 Agent 负责写代码, 另一个专门负责审查, 还有一个专门写测试, 它们之间如何协作? 本文将带你走进 Kimi CLI 的多 Agent 世界.
假设你要开发一个新功能. 理想的工作流可能是这样:
Kimi CLI 把子 Agent 看作"劳动力", 主 Agent 是"雇主". 所有可用的子 Agent 都注册在一个叫做 LaborMarket 的地方:
class LaborMarket:
def __init__(self):
# 预定义的固定子 Agent
self.fixed_subagents: dict[str, Agent] = {}
# 运行时创建的动态子 Agent
self.dynamic_subagents: dict[str, Agent] = {}
这个命名很有意思 -- 它暗示了 Agent 之间的关系: 雇佣与被雇佣.
定义方式: 在 agent.yaml 中预定义
agent:
name: "main"
system_prompt_path: "prompt.md"
tools: ["shell", "file", "task"]
subagents:
code_reviewer:
path: "agents/reviewer/agent.yaml"
description: "专门审查代码质量和风格, 擅长发现潜在 bug"
test_writer:
path: "agents/tester/agent.yaml"
description: "编写全面的单元测试和集成测试"
doc_writer:
path: "agents/doc/agent.yaml"
description: "编写技术文档和注释"
特点:
创建方式: 运行时通过代码动态添加
# 主 Agent 可以在执行过程中创建临时子 Agent
runtime.labor_market.add_dynamic_subagent(
name="temp_analyzer",
agent=Agent(...)
)
特点:
主 Agent 通过 Task 工具"雇佣"子 Agent:
class Task(CallableTool2[Params]):
# Task 工具: 委派任务给子 Agent
class Params(BaseModel):
description: str # 任务简短描述 (3-5 词)
subagent_name: str # 子 Agent 名称
prompt: str # 详细任务描述
使用示例:
用户: "帮我实现一个用户登录功能"
主 Agent 思考后决定:
1. 先让 code_writer 写核心代码
2. 再让 code_reviewer 审查
3. 最后让 test_writer 写测试
于是它调用:
- Task(description="编写登录代码", subagent_name="code_writer", prompt="...")
- Task(description="审查代码", subagent_name="code_reviewer", prompt="...")
- Task(description="编写测试", subagent_name="test_writer", prompt="...")
关键设计: 每个子 Agent 有完全独立的上下文.
async def _run_subagent(self, agent: Agent, prompt: str):
# 1. 创建独立的上下文文件
subagent_context_file = await self._get_subagent_context_file()
# 结果: ~/.kimi/sessions/xxx_sub_1.jsonl
context = Context(file_backend=subagent_context_file)
# 2. 创建独立的 Soul
soul = KimiSoul(agent, context=context)
# 3. 运行 (完全隔离)
await run_soul(soul, prompt, ...)
这意味着:
prompt 参数传递所有必要信息虽然上下文隔离, 但子 Agent 的事件可以透传到主 Agent 的 UI:
def _super_wire_send(msg: WireMessage) -> None:
if isinstance(msg, ApprovalRequest | ApprovalResponse | ToolCallRequest):
# 审批请求直接发送到主 Wire
super_wire.soul_side.send(msg)
return
# 其他事件包装成 SubagentEvent
event = SubagentEvent(
task_tool_call_id=current_tool_call_id,
event=msg,
)
super_wire.soul_side.send(event)
效果: 你可以在主界面看到子 Agent 的执行过程, 就像在看一场"直播".
假设有这样的 Agent 配置:
# main/agent.yaml
agent:
name: "project_manager"
system_prompt_path: "pm_prompt.md"
tools: ["shell", "file", "task", "todo"]
subagents:
backend_dev:
path: "backend/agent.yaml"
description: "后端开发专家, 擅长 Python/FastAPI"
frontend_dev:
path: "frontend/agent.yaml"
description: "前端开发专家, 擅长 React/TypeScript"
qa_engineer:
path: "qa/agent.yaml"
description: "QA 工程师, 擅长测试用例设计"
工作流:
用户: "开发一个 Todo 应用"
project_manager:
1. 分析需求, 拆解任务
2. 创建 Todo 列表
3. 调用 Task(subagent_name="backend_dev", prompt="设计 API 接口...")
4. 调用 Task(subagent_name="frontend_dev", prompt="设计 UI 组件...")
5. 调用 Task(subagent_name="qa_engineer", prompt="设计测试用例...")
6. 整合结果, 向用户汇报
当前实现: 所有 Agent 共享同一个 LLM 实例.
# Runtime 复制时
llm=self.llm, # 同一个对象
这意味着:
当前实现: Task 工具是顺序执行的.
# 伪代码
result1 = await task(subagent1, prompt1) # 等待完成
result2 = await task(subagent2, prompt2) # 再执行
不能同时调用多个子 Agent.
子 Agent 之间无法直接通信, 必须通过主 Agent 中转:
subagent_A -> main_agent -> subagent_B
| 特性 | Kimi CLI | OpenClaw |
|---|---|---|
| **设计理念** | 层级分工 (主-子) | 会话隔离 (独立 sessions) |
| **子 Agent 创建** | 配置预定义 / 动态添加 | sessions_spawn |
| **上下文隔离** | 文件级隔离 | Session 级隔离 |
| **LLM 配置** | 共享 LLM | 每个 session 独立配置 |
| **并行执行** | 顺序执行 | 支持并行 spawn |
| **通信方式** | Task 工具 + Wire 透传 | sessions_send |
| **适用场景** | 专业化分工 | 多模型对比、并行任务 |
简单比喻:
subagents:
linter:
description: "检查代码风格和格式"
security_scanner:
description: "扫描安全漏洞"
performance_analyzer:
description: "分析性能瓶颈"
subagents:
rust_expert:
description: "Rust 核心模块开发"
python_expert:
description: "Python 绑定和脚本"
js_expert:
description: "前端 JavaScript 部分"
subagents:
researcher:
description: "研究技术方案和最佳实践"
architect:
description: "设计系统架构"
implementer:
description: "具体实现代码"
Kimi Code CLI 的多 Agent 架构是一个精心设计的分工协作系统:
核心设计:
src/kimi_cli/soul/agent.py (LaborMarket, Runtime)src/kimi_cli/tools/multiagent/task.py (Task 工具)src/kimi_cli/agentspec.py (Agent 配置)src/kimi_cli/agents/default/agent.yaml"一个人走得快, 一群人走得远." -- 在 AI 编程的世界里, 这句话同样适用.
还没有人回复