--- title: Multi-Agent Crew 编排系统 created: 2026-04-14 updated: 2026-04-14 type: entity tags: [agent, architecture, websocket, runtime] sources: [packages/backend/src/modules/netaclaw/service/crew_orchestrator.ts, packages/backend/src/modules/netaclaw/entity/crew.ts, packages/frontend/src/modules/agent/views/crew-editor.vue] --- # Multi-Agent Crew 编排系统 多智能体协作框架,支持主 Agent 通过委派、并行执行、升级等机制协调多个子 Agent 完成复杂任务。分为后端编排引擎和前端可视化画布编辑器两部分。 ## 核心概念 - **Crew(集群)**:一组 Agent 的编排单元,包含一个主 Agent 和多个成员 Agent - **主 Agent**:负责任务分解和委派决策,拥有 delegate_task / delegate_parallel / escalate 三个编排工具 - **子 Agent**:接收委派任务并独立执行,拥有内置工具和 Skill 工具(不含委派工具) - **升级(Escalate)**:主 Agent 遇到无法自主解决的问题时暂停执行,请求人工介入 ## 数据模型(4个表) | 表名 | Entity | 用途 | |------|--------|------| | `netaclaw_crew` | `entity/crew.ts` | 集群定义(画布、触发配置、委派提示) | | `netaclaw_crew_agent` | `entity/crew_agent.ts` | 集群-Agent 关联(角色、画布位置、分组) | | `netaclaw_crew_run` | `entity/crew_run.ts` | 运行记录(状态、token、暂停状态) | | `netaclaw_crew_task` | `entity/crew_task.ts` | 子任务记录(支持嵌套 parentTaskId) | ### 关键字段 **netaclaw_crew**: `name`(唯一) | `label` | `masterAgentId` | `canvasData`(JSON) | `triggerConfig`(JSON) | `delegateHints`(文本) | `status`(0草稿/1发布) | `maxConcurrent`(默认3) | `taskTimeout`(默认300秒) | `retryPolicy`(JSON) **netaclaw_crew_run**: `crewId` | `triggerType`(manual/cron/webhook/api) | `status`(pending/running/paused/completed/failed/stopped) | `masterSessionId` | `pausedState`(JSON,升级暂停时的对话) | `tokenUsage`(JSON) ## 后端关键文件 | 文件 | 职责 | |------|------| | `service/crew_orchestrator.ts` | 核心编排器:启动、运行、暂停、恢复 | | `service/crew_delegate.ts` | 委派执行器:串行和并行子 Agent 执行 | | `service/crew_scheduler.ts` | Cron 定时调度(Singleton,启动时恢复) | | `service/crew.ts` | 集群 CRUD、画布保存、成员同步、发布校验 | | `service/crew_types.ts` | 类型定义(DelegateResult, CrewCallbacks, CrewRunContext) | | `gateway/crew_server.ts` | WebSocket `/crew` 命名空间 | | `controller/admin/crew.ts` | 集群 API(CRUD + saveCanvas/publish) | | `controller/admin/crew_trigger.ts` | 触发 API(start/stop/resume) | | `controller/admin/crew_run.ts` | 运行记录查询 API | ## 编排执行流程 ``` 触发运行(手动/定时/Webhook/API) → CrewOrchestratorService.start() ├─ 加载集群、主Agent、成员Agent ├─ 创建 crew_run 记录 └─ 异步执行(立即返回 runId) → runOrchestration() ├─ 构建增强系统提示词(原始 + 团队成员 + 委派提示 + 工具说明) ├─ 构建工具集(内置 + 委派 + Skill) └─ 执行主Agent的 ReAct 循环 ├─ delegate_task → executeSubAgent()(串行) ├─ delegate_parallel → executeParallel()(按 maxConcurrent 分批) └─ escalate → 暂停,等待人工介入 → 运行完成,更新状态和 token 统计 ``` ## 升级恢复机制 ``` 主Agent 调用 escalate → 持久化 pausedState → 推送 escalation 事件 → 前端显示升级提示 → 用户输入处理意见 → POST /crew_trigger/resume → resolver(userMessage) → Promise resolve → 主Agent 继续 ReAct 循环 ``` 关键实现:`escalateResolvers` Map 存储 resolve 回调,escalate 工具返回不 resolve 的 Promise。 ## 前端画布编辑器 | 文件 | 职责 | |------|------| | `views/crew-editor.vue` | 编辑器主页面(VueFlow 画布 + 侧栏 + 属性面板) | | `views/crew-monitor.vue` | 运行监控页面(运行列表 + 详情 + 日志) | | `hooks/crew-canvas.ts` | 画布操作(节点增删、主Agent设置、序列化) | | `hooks/crew-monitor.ts` | WebSocket 监控(连接 `/crew` 命名空间) | | `hooks/crew-orchestration.ts` | 连线转委派提示词(串行/并行建议) | | `store/crew.ts` | Pinia Store(集群列表、详情、成员) | | `components/crew/*.vue` | 10个子组件(节点、侧栏、属性面板、日志等) | ## WebSocket 协议(`/crew` 命名空间) | 事件 | 方向 | 说明 | |------|------|------| | `crew:trigger` | 客户端→服务端 | 触发集群运行 | | `crew:control` | 客户端→服务端 | 控制运行(stop/resume/pause/retry) | | `crew:run:status` | 服务端→客户端 | 运行状态变化 | | `crew:task:status` | 服务端→客户端 | 任务状态变化 | | `crew:log` | 服务端→客户端 | 日志消息 | | `crew:escalation` | 服务端→客户端 | 升级事件 | ## 相关页面 - [[netaclaw-module]] — 所属模块 - [[agent-runtime]] — 子 Agent 执行复用 runAgent() - [[tool-system]] — delegate_task / delegate_parallel / escalate 工具 - [[websocket-gateway]] — `/crew` 命名空间 - [[skill-system]] — 主/子 Agent 均可加载 Skill