|
6 | 6 | 通过 fresh `messages=[]` 启动 child agent(子智能体)。 |
7 | 7 | 子智能体在独立上下文中工作、共享同一文件系统,最后只把摘要返回给父智能体。 |
8 | 8 |
|
9 | | - Parent agent Subagent |
| 9 | + 父智能体(Parent agent) 子智能体(Subagent) |
10 | 10 | +------------------+ +------------------+ |
11 | | - | messages=[...] | | messages=[] | <-- fresh |
12 | | - | | dispatch | | |
13 | | - | tool: task | ---------->| while tool_use: | |
14 | | - | prompt="..." | | call tools | |
15 | | - | description="" | | append results | |
16 | | - | | summary | | |
17 | | - | result = "..." | <--------- | return last text | |
| 11 | + | messages=[...] | | messages=[] | <-- fresh(新上下文) |
| 12 | + | | dispatch(派发)| | |
| 13 | + | 工具: task | ---------->| while tool_use(工具调用): | |
| 14 | + | prompt="..." | | call tools(调用工具) | |
| 15 | + | description="" | | append results(追加结果) | |
| 16 | + | | summary(汇总) | | |
| 17 | + | result = "..." | <--------- | return last text(返回摘要) | |
18 | 18 | +------------------+ +------------------+ |
19 | 19 | | |
20 | | - 父上下文保持干净。 |
21 | | - 子上下文在任务完成后丢弃。 |
| 20 | + 父上下文保持干净,子上下文任务结束后丢弃。 |
22 | 21 |
|
23 | 22 | 关键洞察: |
24 | 23 | "fresh messages=[] 就是上下文隔离,父上下文不会被污染。" |
|
28 | 27 | 但拥有新的消息数组和隔离的工具上下文,这与本教学实现一致。 |
29 | 28 |
|
30 | 29 | 与真实 Claude Code 的对比: |
31 | | - +-------------------+------------------+----------------------------------+ |
32 | | - | Aspect | This demo | Real Claude Code | |
33 | | - +-------------------+------------------+----------------------------------+ |
34 | | - | Backend | in-process only | 5 backends: in-process, tmux, | |
35 | | - | | | iTerm2, fork, remote | |
36 | | - | Context isolation | fresh messages=[]| createSubagentContext() isolates | |
37 | | - | | | ~20 fields (tools, permissions, | |
38 | | - | | | cwd, env, hooks, etc.) | |
39 | | - | Tool filtering | manually curated | resolveAgentTools() filters from | |
40 | | - | | | parent pool; allowedTools | |
41 | | - | | | replaces all allow rules | |
42 | | - | Agent definition | hardcoded system | .claude/agents/*.md with YAML | |
43 | | - | | prompt | frontmatter (AgentTemplate) | |
44 | | - +-------------------+------------------+----------------------------------+ |
| 30 | + +-------------------+----------------------+---------------------------------------------+ |
| 31 | + | 维度(Aspect) | 教学实现(This demo) | 真实 Claude Code(Real Claude Code) | |
| 32 | + +-------------------+----------------------+---------------------------------------------+ |
| 33 | + | 后端(Backend) | 仅 in-process | 5 种后端:in-process、tmux、iTerm2、fork、remote | |
| 34 | + | 上下文隔离 | fresh messages=[] | createSubagentContext() 隔离约 20 个字段(tools、 | |
| 35 | + | (Context isolation)| | permissions、cwd、env、hooks 等) | |
| 36 | + | 工具过滤 | 手工挑选 | resolveAgentTools() 从父工具池过滤;allowedTools | |
| 37 | + | (Tool filtering) | | 可替代所有 allow 规则 | |
| 38 | + | 智能体定义 | 代码内硬编码 prompt | `.claude/agents/*.md` + YAML frontmatter | |
| 39 | + | (Agent definition)| | (模板 AgentTemplate) | |
| 40 | + +-------------------+----------------------+---------------------------------------------+ |
45 | 41 | """ |
46 | 42 |
|
47 | 43 | import os |
@@ -78,8 +74,9 @@ class AgentTemplate: |
78 | 74 |
|
79 | 75 | 真实 Claude Code 会从 `.claude/agents/*.md` 读取 agent 定义。 |
80 | 76 | frontmatter 字段包括:name、tools、disallowedTools、skills、hooks、 |
81 | | - model、effort、permissionMode、maxTurns、memory、isolation、color、 |
82 | | - background、initialPrompt、mcpServers。 |
| 77 | + model(模型)、effort(推理力度)、permissionMode(权限模式)、maxTurns(轮次上限)、 |
| 78 | + memory(记忆)、isolation(隔离)、color(颜色)、background(后台)、 |
| 79 | + initialPrompt(初始提示)、mcpServers(MCP 服务配置)。 |
83 | 80 | 来源通常有三类:built-in、custom(`.claude/agents/`)、plugin-provided。 |
84 | 81 | """ |
85 | 82 | def __init__(self, path): |
@@ -113,7 +110,7 @@ def safe_path(p: str) -> Path: |
113 | 110 | def run_bash(command: str) -> str: |
114 | 111 | dangerous = ["rm -rf /", "sudo", "shutdown", "reboot", "> /dev/"] |
115 | 112 | if any(d in command for d in dangerous): |
116 | | - return "Error: ???????" |
| 113 | + return "Error: 危险命令已拦截" |
117 | 114 | try: |
118 | 115 | r = subprocess.run(command, shell=True, cwd=WORKDIR, |
119 | 116 | capture_output=True, text=True, timeout=120) |
|
0 commit comments