Files
claude-code-mirror/claude-code-中文Wiki/10-多智能体协作.md
2026-04-03 13:01:19 +08:00

438 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 多智能体协作
Claude Code 的多智能体系统允许创建和协调多个 AI 代理协同工作。本文档详细介绍 AgentTool 和相关协作机制。
## 1. AgentTool 概述
### 1.1 核心文件
**位置:** `/src/tools/AgentTool/`
**主要文件:**
- `runAgent.ts` - Agent 运行核心逻辑
- `builtInAgents.ts` - 内置 Agent 定义
- `loadAgentsDir.ts` - Agent 目录加载
- `agentMemory.ts` - Agent 内存管理
- `built-in/` - 内置 Agent 实现
### 1.2 Agent 定义结构
```typescript
export type AgentDefinition = {
agentType: string // Agent 类型标识
whenToUse?: string // 使用建议
disallowedTools?: string[] // 禁用工具列表
tools?: string[] | '*' // 允许的工具
source?: string // 来源
baseDir?: string // 基础目录
model?: string // 模型设置
permissionMode?: PermissionMode // 权限模式
maxTurns?: number // 最大轮次
getSystemPrompt?: () => string // 系统提示
hooks?: HooksSettings // 钩子设置
skills?: string[] // 预加载技能
mcpServers?: MCPServerSpec[] // MCP 服务器
omitClaudeMd?: boolean // 是否省略 CLAUDE.md
effort?: EffortValue // 努力值
callback?: () => void // 完成回调
}
```
## 2. 子智能体生成
### 2.1 runAgent 函数
**位置:** `/src/tools/AgentTool/runAgent.ts`
`runAgent` 是创建和运行子智能体的核心函数:
```typescript
export async function* runAgent({
agentDefinition, // Agent 定义
promptMessages, // 提示消息
toolUseContext, // 工具使用上下文
canUseTool, // 工具使用权限检查
isAsync, // 是否异步执行
querySource, // 查询来源
model, // 模型覆盖
maxTurns, // 最大轮次
allowedTools, // 允许的工具列表
// ...
}): AsyncGenerator<Message, void>
```
### 2.2 消息过滤
```typescript
// 过滤不完整的工具调用
export function filterIncompleteToolCalls(messages: Message[]): Message[] {
// 移除有工具调用但没有结果的助手消息
}
```
### 2.3 上下文隔离
```typescript
// 为子智能体创建隔离的上下文
const agentToolUseContext = createSubagentContext(toolUseContext, {
options: agentOptions,
agentId,
agentType: agentDefinition.agentType,
messages: initialMessages,
readFileState: agentReadFileState,
abortController: agentAbortController,
getAppState: agentGetAppState,
shareSetAppState: !isAsync, // 同步 Agent 共享状态
})
```
## 3. 智能体生命周期管理
### 3.1 生命周期阶段
1. **初始化阶段**
- 创建 Agent ID
- 设置上下文
- 初始化 MCP 服务器
- 注册 Hooks
2. **执行阶段**
- 运行查询循环
- 处理工具调用
- 管理会话
3. **清理阶段**
- 清理 MCP 服务器
- 清除会话 Hooks
- 释放内存
- 杀死后台任务
### 3.2 生命周期钩子
```typescript
// SubagentStart 钩子
for await (const hookResult of executeSubagentStartHooks(
agentId,
agentDefinition.agentType,
agentAbortController.signal,
)) {
// 收集额外上下文
}
// SubagentStop 钩子
if (agentDefinition.hooks) {
clearSessionHooks(rootSetAppState, agentId)
}
```
## 4. 内置智能体 (built-in/)
### 4.1 generalPurposeAgent
**位置:** `/src/tools/AgentTool/built-in/generalPurposeAgent.ts`
通用目的 Agent适用于复杂研究和多步骤任务执行
```typescript
export const GENERAL_PURPOSE_AGENT: BuiltInAgentDefinition = {
agentType: 'general-purpose',
whenToUse: 'General-purpose agent for researching complex questions...',
tools: ['*'], // 允许所有工具
source: 'built-in',
getSystemPrompt: getGeneralPurposeSystemPrompt,
}
```
### 4.2 planAgent
**位置:** `/src/tools/AgentTool/built-in/planAgent.ts`
软件架构师 Agent用于设计实现计划
**关键特性:**
- **只读模式**:禁止任何文件修改操作
- 严格禁用工具:`Edit`, `Write`, `NotebookEdit`, `Agent`
- 允许工具:`Read`, `Glob`, `Grep`, `Bash`(仅限只读操作)
**系统提示片段:**
```
=== CRITICAL: READ-ONLY MODE - NO FILE MODIFICATIONS ===
This is a READ-ONLY planning task. You are STRICTLY PROHIBITED from:
- Creating new files (no Write, touch, or file creation of any kind)
- Modifying existing files (no Edit operations)
- Deleting files (no rm or deletion)
...
```
### 4.3 verificationAgent
验证 Agent用于验证任务完成情况
```typescript
// 在 TaskUpdateTool 中引用
const VERIFICATION_AGENT_TYPE = 'verification'
// 当满足条件时提示验证
if (allTasks.length >= 3 && !allTasks.some(t => /verif/i.test(t.subject))) {
verificationNudgeNeeded = true
}
```
### 4.4 exploreAgent
探索 Agent用于代码库探索和搜索
**特性:**
- 只读操作
- 使用 `find`/`grep``Glob`/`Grep` 进行搜索
- 不加载 CLAUDE.md节省 token
### 4.5 statuslineSetup
状态栏设置 Agent用于配置状态行显示。
### 4.6 claudeCodeGuideAgent
Claude Code 指南 Agent帮助用户学习使用 Claude Code。
## 5. Agent 内存管理
### 5.1 Agent 内存结构
**位置:** `/src/tools/AgentTool/agentMemory.ts`
```typescript
export type AgentMemory = {
sessionId: string
agentId: string
messages: Message[]
toolUseResults: Map<string, ToolResult>
fileState: FileStateCache
}
```
### 5.2 文件状态缓存
```typescript
// 克隆文件状态缓存
const agentReadFileState = forkContextMessages !== undefined
? cloneFileStateCache(toolUseContext.readFileState)
: createFileStateCacheWithSizeLimit(READ_FILE_STATE_CACHE_SIZE)
// 清理时释放
agentToolUseContext.readFileState.clear()
```
### 5.3 转录记录
```typescript
// 记录初始消息
await recordSidechainTranscript(initialMessages, agentId)
// 记录新消息
await recordSidechainTranscript([message], agentId, lastRecordedUuid)
```
## 6. 团队协调器 (coordinator/)
### 6.1 协调器模式
**位置:** `/src/coordinator/coordinatorMode.ts`
协调器模式允许多个 Agent 在团队中协作。
### 6.2 协调器 Agent
```typescript
// 获取协调器 Agent
function getCoordinatorAgents(): AgentDefinition[]
```
## 7. 团队管理工具
### 7.1 TeamCreateTool
**位置:** `/src/tools/TeamCreateTool/TeamCreateTool.ts`
创建团队,管理团队配置。
### 7.2 TeamDeleteTool
**位置:** `/src/tools/TeamDeleteTool/TeamDeleteTool.ts`
删除团队,清理团队资源。
### 7.3 团队文件结构
**位置:** `/src/utils/swarm/teamHelpers.ts`
```typescript
export type TeamFile = {
name: string
description?: string
createdAt: number
leadAgentId: string
leadSessionId?: string
hiddenPaneIds?: string[]
teamAllowedPaths?: TeamAllowedPath[]
members: Array<{
agentId: string
name: string
agentType?: string
model?: string
prompt?: string
color?: string
planModeRequired?: boolean
joinedAt: number
tmuxPaneId: string
cwd: string
worktreePath?: string
sessionId?: string
subscriptions: string[]
backendType?: BackendType
isActive?: boolean
mode?: PermissionMode
}>
}
```
## 8. Agent 与技能的集成
### 8.1 技能预加载
Agent 可以预加载技能:
```typescript
const skillsToPreload = agentDefinition.skills ?? []
if (skillsToPreload.length > 0) {
const allSkills = await getSkillToolCommands(getProjectRoot())
// 加载并注入技能内容
}
```
### 8.2 技能名称解析
```typescript
function resolveSkillName(
skillName: string,
allSkills: Command[],
agentDefinition: AgentDefinition
): string | null {
// 1. 精确匹配
if (hasCommand(skillName, allSkills)) return skillName
// 2. 前缀匹配 (e.g., "my-skill" → "my-plugin:my-skill")
const qualifiedName = `${pluginPrefix}:${skillName}`
if (hasCommand(qualifiedName, allSkills)) return qualifiedName
// 3. 后缀匹配 (e.g., ":my-skill")
// ...
}
```
## 9. MCP 服务器集成
### 9.1 Agent 专用 MCP 服务器
Agent 可以定义自己的 MCP 服务器:
```typescript
async function initializeAgentMcpServers(
agentDefinition: AgentDefinition,
parentClients: MCPServerConnection[]
): Promise<{
clients: MCPServerConnection[]
tools: Tools
cleanup: () => Promise<void>
}>
```
### 9.2 服务器合并
```typescript
// 合并父级和 Agent 专用的 MCP 客户端
const allTools = uniqBy([...resolvedTools, ...agentMcpTools], 'name')
```
## 10. 权限与隔离
### 10.1 权限模式
```typescript
const agentPermissionMode = agentDefinition.permissionMode
if (agentPermissionMode &&
state.toolPermissionContext.mode !== 'bypassPermissions' &&
state.toolPermissionContext.mode !== 'acceptEdits') {
toolPermissionContext = {
...toolPermissionContext,
mode: agentPermissionMode
}
}
```
### 10.2 工具过滤
```typescript
const resolvedTools = resolveAgentTools(
agentDefinition,
availableTools,
isAsync
).resolvedTools
```
## 11. 性能优化
### 11.1 CLAUDE.md 省略
```typescript
const shouldOmitClaudeMd = agentDefinition.omitClaudeMd &&
!override?.userContext &&
getFeatureValue_CACHED_MAY_BE_STALE('tengu_slim_subagent_claudemd', true)
```
### 11.2 Git 状态省略
```typescript
const resolvedSystemContext =
agentDefinition.agentType === 'Explore' ||
agentDefinition.agentType === 'Plan'
? systemContextNoGit // 省略 gitStatus
: baseSystemContext
```
### 11.3 推理配置
```typescript
thinkingConfig: useExactTools
? toolUseContext.options.thinkingConfig // 继承父级
: { type: 'disabled' as const } // 禁用
```
## 12. Telemetry 与追踪
### 12.1 Perfetto 追踪
```typescript
if (isPerfettoTracingEnabled()) {
registerPerfettoAgent(agentId, agentDefinition.agentType, parentId)
}
// 清理时注销
unregisterPerfettoAgent(agentId)
```
### 12.2 转录存储
```typescript
// 边链转录
await recordSidechainTranscript(initialMessages, agentId)
// Agent 元数据
await writeAgentMetadata(agentId, {
agentType: agentDefinition.agentType,
worktreePath,
description
})
```