366 lines
18 KiB
Markdown
366 lines
18 KiB
Markdown
---
|
||
date: 2026-06-24
|
||
plan_id: 2026-06-24-003
|
||
type: feat
|
||
title: "feat: 专家团项目经理模式协同"
|
||
status: active
|
||
origin: docs/brainstorms/2026-06-24-expert-team-project-manager-collaboration-requirements.md
|
||
---
|
||
|
||
# 专家团项目经理模式协同 — 实现计划
|
||
|
||
## Summary
|
||
|
||
将专家团 Lead 从"甩手掌柜"升级为"项目经理"——制定计划时定义协作契约,执行过程中监控进展,阶段完成后验收成果(不合格可返工),冲突时协调。专家间通过协作契约实现"可见+可协助"。前端以协作关系图可视化专家间互动。基于 U1-U6 辩论机制基础增量构建。
|
||
|
||
## Problem Frame
|
||
|
||
当前专家团执行模式(`src/agentkit/experts/orchestrator.py`):Lead 分解任务 → 拓扑排序 → 专家孤立执行(仅看到 dependency_outputs)→ Lead 汇总。Lead 是甩手掌柜,专家间无直接通信(`team.py` 注释明确写了"No inter-agent communication")。
|
||
|
||
U1-U6 引入了辩论机制(DEBATE phase + 分歧检测 + 用户干预),但辩论是异常处理,不是常态协作。用户的核心痛点是:**当前体现不出多 agent 协同工作**——无论是执行效果还是 UI/UE。
|
||
|
||
需求文档(`docs/brainstorms/2026-06-24-expert-team-project-manager-collaboration-requirements.md`)定义了项目经理模式:Lead 全程主导(制定计划、安排任务、冲突协调、成果验收),专家间通过协作契约实现可见+可协助。
|
||
|
||
## Requirements
|
||
|
||
本计划覆盖需求文档中的 R1-R17,按以下映射组织:
|
||
|
||
| 需求 ID | 描述 | 实现单元 |
|
||
|---------|------|---------|
|
||
| R1, R2 | Lead 项目经理角色 + 协作契约定义 | U1 |
|
||
| R3, R6, R7 | Lead 监控 + 专家可见 + 主动通知 | U2 |
|
||
| R4 | 冲突协调(复用 U1-U6 辩论) | 已有基础 |
|
||
| R5, R10, R11 | 验收 + 返工 + 上限 | U3 |
|
||
| R8, R9 | 风险标记 + 请求协助 | U4 |
|
||
| R12, R13, R14 | 前端协作关系图 + 验收状态 + 实时互动 | U5 |
|
||
| R15, R16 | 与私董会区分 | 架构固有 |
|
||
| R17 | CLI 协同事件渲染 | U6 |
|
||
|
||
## Key Technical Decisions
|
||
|
||
**KTD1: 协作契约嵌入 PlanPhase 而非独立实体。** 协作契约是阶段的属性,不是独立的生命周期对象。每个 PlanPhase 携带 `collaboration_contracts: list[CollaborationContract]`,定义该阶段中哪些专家需要协作、协作内容是什么。理由:契约与阶段强绑定,独立实体增加不必要的复杂度。
|
||
|
||
**KTD2: 专家可见范围限定在协作契约内。** 打破 KTD3 的完全上下文隔离,但不是完全开放——专家只能看到协作契约中指定的相关专家输出,而非所有专家的所有工作。理由:平衡"可见"需求与信息过载风险。
|
||
|
||
**KTD3: 验收作为阶段完成的门控。** 在 `_execute_execution_phase` 完成后、标记 COMPLETED 前,插入 `_review_phase_output` 步骤。Lead 用 LLM 判断输出是否满足要求。理由:验收是项目经理的核心职责,也是质量保证的关键环节。
|
||
|
||
**KTD4: 返工通过阶段状态回退实现。** 验收不合格时,将阶段状态从 RUNNING 回退到 PENDING,附带 Lead 的修改要求,重新执行。返工次数上限 MAX_REWORKS=2,超过则标记 FAILED。理由:复用现有执行流程,不引入新的执行路径。
|
||
|
||
**KTD5: 风险标记通过 WS 事件 + Lead 决策实现。** 专家在执行过程中可通过输出中的特殊标记(如 `[RISK: ...]`)标记风险。Orchestrator 解析标记,发出 `risk_flagged` 事件,Lead 决定是否调整计划。理由:不改变专家的执行流程,通过输出解析实现风险标记。
|
||
|
||
**KTD6: 前端协作关系图用 SVG 实现。** 节点=专家(圆形+头像),边=协作关系(实线=契约,虚线=数据流向),验收状态用颜色标记。理由:SVG 足够表达这种关系图,无需引入 Canvas/WebGL 的复杂度。
|
||
|
||
## High-Level Technical Design
|
||
|
||
### 项目经理模式执行流程
|
||
|
||
```
|
||
用户发送 @team <task>
|
||
│
|
||
▼
|
||
Lead 制定计划(含协作契约) ◄── U1
|
||
│ ── collaboration_contract_defined 事件
|
||
▼
|
||
拓扑排序 → 层执行
|
||
│
|
||
▼
|
||
专家执行阶段 ◄── U2
|
||
│ ├── 按协作契约读取相关专家输出(可见)
|
||
│ ├── 执行任务
|
||
│ ├── 完成后按协作契约通知相关专家(可协助)
|
||
│ │ ── collaboration_notice 事件
|
||
│ └── 可标记风险 ◄── U4
|
||
│ ── risk_flagged 事件 → Lead 决策
|
||
▼
|
||
Lead 验收 ◄── U3
|
||
│ ├── 合格 → 标记 COMPLETED,进入下一阶段
|
||
│ │ ── review_result 事件(passed)
|
||
│ └── 不合格 → 返工(回退到 PENDING,附修改要求)
|
||
│ ── review_result 事件(failed + feedback)
|
||
│ 返工次数 > MAX_REWORKS → 标记 FAILED
|
||
▼
|
||
分歧检测(复用 U3 辩论机制)
|
||
│ └── 检测到分歧 → 插入 DEBATE phase
|
||
▼
|
||
所有阶段完成 → Lead 汇总 → 团队解散
|
||
```
|
||
|
||
### 协作契约数据流
|
||
|
||
```
|
||
Lead 分解任务
|
||
│
|
||
├── Phase A (后端): collaboration_contracts = [
|
||
│ {to_expert: "前端", content: "API 定义", status: "pending"}
|
||
│ ]
|
||
│
|
||
└── Phase B (前端): collaboration_contracts = [
|
||
{from_expert: "后端", content: "API 定义", status: "pending"}
|
||
]
|
||
|
||
Phase A 执行完成
|
||
│
|
||
├── 后端输出写入 SharedWorkspace
|
||
├── 后端按契约通知前端 ── collaboration_notice 事件
|
||
│
|
||
▼
|
||
Phase B 执行时
|
||
│
|
||
└── 前端按契约从 SharedWorkspace 读取后端输出(可见)
|
||
```
|
||
|
||
## Implementation Units
|
||
|
||
### U1. 协作契约数据模型 + Lead 生成契约
|
||
|
||
**Goal:** 在 PlanPhase 中添加协作契约字段,修改 Lead 分解任务的 prompt 和解析逻辑,使 Lead 在制定计划时定义专家间的协作关系。
|
||
|
||
**Requirements:** R1, R2
|
||
|
||
**Dependencies:** 无(基于 U1-U6 辩论基础)
|
||
|
||
**Files:**
|
||
- `src/agentkit/experts/plan.py` — 添加 CollaborationContract dataclass,PlanPhase 添加 collaboration_contracts 字段
|
||
- `src/agentkit/experts/orchestrator.py` — 修改 `_decompose_task` prompt,修改 `_parse_phases` 解析契约
|
||
- `tests/unit/experts/test_plan.py` — 协作契约数据模型测试
|
||
- `tests/unit/experts/test_pm_collaboration.py` — Lead 生成契约测试
|
||
|
||
**Approach:**
|
||
1. 定义 `CollaborationContract` dataclass:`from_expert: str`, `to_expert: str`, `content_description: str`, `status: str`(pending/delivered/received)
|
||
2. PlanPhase 添加 `collaboration_contracts: list[CollaborationContract]` 字段,更新 to_dict/from_dict
|
||
3. 修改 `_decompose_task` 的 prompt,要求 Lead 在分解任务时为每个阶段定义协作契约
|
||
4. 修改 `_parse_phases` 解析 LLM 返回的协作契约信息
|
||
5. 在 plan_update 事件中包含协作契约信息
|
||
|
||
**Patterns to follow:** PhaseType + debate_config 的添加模式(U1 辩论基础)
|
||
|
||
**Test scenarios:**
|
||
- **Happy path:** CollaborationContract 序列化/反序列化正确
|
||
- **Happy path:** PlanPhase 携带 collaboration_contracts 序列化/反序列化正确
|
||
- **Happy path:** Lead 分解任务时生成的 phases 包含协作契约
|
||
- **Edge case:** 协作契约为空列表时正常工作
|
||
- **Edge case:** LLM 返回的协作契约格式不正确时优雅降级(空契约列表)
|
||
- **Integration:** plan_update 事件包含协作契约信息
|
||
|
||
**Verification:** Lead 分解任务后,每个 PlanPhase 携带协作契约;前端能从 plan_update 事件中获取协作契约信息。
|
||
|
||
---
|
||
|
||
### U2. 协作契约执行 — 专家可见 + 主动通知
|
||
|
||
**Goal:** 专家执行时按协作契约读取相关专家的输出(可见),完成后按契约主动通知相关专家(可协助)。
|
||
|
||
**Requirements:** R3, R6, R7
|
||
|
||
**Dependencies:** U1
|
||
|
||
**Files:**
|
||
- `src/agentkit/experts/orchestrator.py` — 修改 `_execute_execution_phase`,添加 `_notify_collaborators` 方法
|
||
- `tests/unit/experts/test_pm_collaboration.py` — 协作契约执行测试
|
||
|
||
**Approach:**
|
||
1. 修改 `_execute_execution_phase`:除了 dependency_outputs,还按协作契约中的 `from_expert` 读取相关专家的输出,注入到专家的 context 中
|
||
2. 专家完成后,调用 `_notify_collaborators`:遍历当前阶段的 collaboration_contracts,对每个 `to_expert` 发出 `collaboration_notice` 事件
|
||
3. 更新契约状态为 delivered
|
||
4. `collaboration_notice` 事件包含:from_expert, to_expert, content_description, phase_id, output_key
|
||
|
||
**Patterns to follow:** `_execute_execution_phase` 中 dependency_outputs 的读取模式
|
||
|
||
**Test scenarios:**
|
||
- **Happy path:** 专家执行时能读到协作契约中 from_expert 的输出
|
||
- **Happy path:** 专家完成后,协作契约中的 to_expert 收到 collaboration_notice 事件
|
||
- **Happy path:** 契约状态从 pending 更新为 delivered
|
||
- **Edge case:** 协作契约中 from_expert 的输出不存在时,专家仍能正常执行(无额外 context)
|
||
- **Edge case:** 协作契约为空时,行为与当前一致(向后兼容)
|
||
- **Integration:** collaboration_notice 事件被正确广播
|
||
|
||
**Verification:** 专家执行时能看到协作契约中相关专家的输出;完成后相关专家收到通知。
|
||
|
||
---
|
||
|
||
### U3. Lead 验收环节 + 返工机制
|
||
|
||
**Goal:** 每个阶段完成后,Lead 验收输出质量。合格则进入下一阶段,不合格则要求返工,返工有次数上限。
|
||
|
||
**Requirements:** R5, R10, R11
|
||
|
||
**Dependencies:** U1
|
||
|
||
**Files:**
|
||
- `src/agentkit/experts/orchestrator.py` — 添加 `_review_phase_output` 方法,修改 `_execute_execution_phase` 插入验收步骤
|
||
- `tests/unit/experts/test_pm_collaboration.py` — 验收与返工测试
|
||
|
||
**Approach:**
|
||
1. 添加 `MAX_REWORKS = 2` 类常量
|
||
2. 在 PlanPhase 中添加 `rework_count: int = 0` 字段和 `review_feedback: str | None = None` 字段
|
||
3. 添加 `_review_phase_output(phase, result) -> tuple[bool, str]` 方法:Lead 用 LLM 判断输出是否满足阶段要求,返回 (passed, feedback)
|
||
4. 在 `_execute_execution_phase` 中,专家执行完成后、标记 COMPLETED 前,调用 `_review_phase_output`
|
||
5. 验收合格 → 标记 COMPLETED,发出 `review_result` 事件(passed)
|
||
6. 验收不合格 → rework_count += 1,若未超上限则回退状态到 PENDING,附 feedback,重新执行;若超上限则标记 FAILED
|
||
7. 发出 `review_result` 事件(passed/failed + feedback)
|
||
|
||
**Patterns to follow:** `_detect_divergence` 的 LLM 判断模式(U3 辩论基础)
|
||
|
||
**Test scenarios:**
|
||
- **Happy path:** 验收合格时,阶段标记 COMPLETED,发出 review_result(passed)事件
|
||
- **Happy path:** 验收不合格时,阶段回退到 PENDING,附 feedback,重新执行
|
||
- **Edge case:** 返工次数达到 MAX_REWORKS 仍不合格,标记 FAILED
|
||
- **Edge case:** Lead LLM 不可用时,跳过验收直接标记 COMPLETED(优雅降级)
|
||
- **Integration:** review_result 事件被正确广播,包含 feedback
|
||
|
||
**Verification:** 阶段完成后 Lead 验收;不合格可返工;返工超限标记失败。
|
||
|
||
---
|
||
|
||
### U4. 专家风险标记 + Lead 调整
|
||
|
||
**Goal:** 专家执行时可标记风险,Lead 收到风险标记后决定是否调整计划(插入辩论、要求返工、或接受风险继续)。
|
||
|
||
**Requirements:** R8, R9
|
||
|
||
**Dependencies:** U1
|
||
|
||
**Files:**
|
||
- `src/agentkit/experts/orchestrator.py` — 添加 `_parse_risk_flags` 方法,修改 `_execute_execution_phase` 解析风险标记
|
||
- `tests/unit/experts/test_pm_collaboration.py` — 风险标记测试
|
||
|
||
**Approach:**
|
||
1. 定义风险标记格式:专家输出中包含 `[RISK: <风险描述>]` 标记
|
||
2. 添加 `_parse_risk_flags(content) -> list[str]` 方法:从专家输出中解析风险标记
|
||
3. 在 `_execute_execution_phase` 中,专家执行完成后,解析输出中的风险标记
|
||
4. 若有风险标记,发出 `risk_flagged` 事件(expert, risk_description, phase_id)
|
||
5. Lead 收到风险标记后,用 LLM 决策:接受风险继续 / 插入辩论协调 / 要求返工
|
||
6. 风险标记不影响阶段状态(仍可 COMPLETED),但 Lead 的决策可能触发后续动作
|
||
|
||
**Patterns to follow:** `_detect_divergence` 的 LLM 判断模式
|
||
|
||
**Test scenarios:**
|
||
- **Happy path:** 专家输出包含 `[RISK: ...]` 标记时,risk_flagged 事件被发出
|
||
- **Happy path:** 专家输出不包含风险标记时,无 risk_flagged 事件
|
||
- **Edge case:** 多个风险标记都被解析
|
||
- **Edge case:** 风险标记格式不正确时被忽略
|
||
- **Integration:** risk_flagged 事件包含专家名称和风险描述
|
||
|
||
**Verification:** 专家可标记风险;Lead 收到风险标记后做出决策。
|
||
|
||
---
|
||
|
||
### U5. 前端协作关系图
|
||
|
||
**Goal:** 前端以协作关系图可视化专家间互动——节点为专家,边为协作关系和数据流向,验收状态用颜色标记。
|
||
|
||
**Requirements:** R12, R13, R14
|
||
|
||
**Dependencies:** U1, U2, U3, U4
|
||
|
||
**Files:**
|
||
- `src/agentkit/server/frontend/src/api/types.ts` — 新增 WS 事件类型和数据接口
|
||
- `src/agentkit/server/frontend/src/stores/chat.ts` — 新增 collaborationState ref,处理新事件
|
||
- `src/agentkit/server/frontend/src/components/chat/messages/CollaborationGraphCard.vue` — 新建协作关系图组件
|
||
- `src/agentkit/server/frontend/src/components/chat/messages/ReviewResultCard.vue` — 新建验收结果卡片
|
||
- `src/agentkit/server/frontend/src/components/chat/messages/RiskFlagCard.vue` — 新建风险标记卡片
|
||
- `src/agentkit/server/frontend/src/components/chat/messages/index.ts` — 新增导出
|
||
- `src/agentkit/server/frontend/src/components/chat/helpers/useMessageRenderer.ts` — 新增视图类型
|
||
|
||
**Approach:**
|
||
1. 在 `types.ts` 中新增 WS 事件类型:`collaboration_contract_defined`, `collaboration_notice`, `review_result`, `risk_flagged`
|
||
2. 新增数据接口:`ICollaborationContract`, `ICollaborationNotice`, `IReviewResult`, `IRiskFlag`
|
||
3. 在 `chat.ts` 中新增 `collaborationState` ref,存储协作契约、通知、验收结果、风险标记
|
||
4. 新增 switch case 处理 4 种新事件
|
||
5. `CollaborationGraphCard.vue`:SVG 绘制节点(专家圆形+头像)和边(实线=契约,虚线=数据流向),验收状态用颜色标记(绿=通过,黄=待验收,红=返工/失败)
|
||
6. `ReviewResultCard.vue`:展示验收结果(passed/failed + feedback)
|
||
7. `RiskFlagCard.vue`:展示风险标记(专家 + 风险描述)
|
||
8. 在 `useMessageRenderer.ts` 中新增视图类型和渲染规格
|
||
|
||
**Patterns to follow:** U5 辩论可视化的 BoardState 模式(debateState ref + 事件 switch case + 专用卡片组件)
|
||
|
||
**Test scenarios:**
|
||
- **Happy path:** collaboration_contract_defined 事件触发协作关系图渲染
|
||
- **Happy path:** collaboration_notice 事件在图上显示数据流向(虚线动画)
|
||
- **Happy path:** review_result 事件更新节点颜色(绿=通过,红=返工)
|
||
- **Happy path:** risk_flagged 事件显示风险标记卡片
|
||
- **Edge case:** 无协作契约时,协作关系图显示空状态
|
||
- **Edge case:** 多个协作契约同时存在时,图正确渲染所有边
|
||
|
||
**Verification:** 前端能渲染协作关系图;验收状态和风险标记实时可见。
|
||
|
||
---
|
||
|
||
### U6. CLI 协同事件渲染
|
||
|
||
**Goal:** CLI 支持项目经理模式的协同事件渲染,延续 U6 辩论 Rich 渲染模式。
|
||
|
||
**Requirements:** R17
|
||
|
||
**Dependencies:** U1, U2, U3, U4
|
||
|
||
**Files:**
|
||
- `src/agentkit/cli/chat.py` — 在 `_execute_team_cli` 中添加协同事件渲染
|
||
- `tests/unit/cli/test_chat_multiagent.py` — 扩展测试
|
||
|
||
**Approach:**
|
||
1. 在 `_execute_team_cli` 的事件处理循环中,新增 4 种事件的处理:
|
||
- `collaboration_contract_defined`:用 Panel 展示协作契约列表
|
||
- `collaboration_notice`:用带颜色的文本展示"专家A → 专家B: 内容描述"
|
||
- `review_result`:用绿色(passed)或红色(failed)Panel 展示验收结果和 feedback
|
||
- `risk_flagged`:用黄色 Panel 展示风险标记
|
||
2. 更新 `_print_help` 帮助文本,说明项目经理模式的协同特性
|
||
|
||
**Patterns to follow:** U6 辩论事件的 Rich 渲染模式(Panel/Markdown/colored text)
|
||
|
||
**Test scenarios:**
|
||
- **Happy path:** collaboration_contract_defined 事件正确渲染为 Panel
|
||
- **Happy path:** collaboration_notice 事件正确渲染为带颜色的文本
|
||
- **Happy path:** review_result 事件正确渲染(passed=绿色,failed=红色)
|
||
- **Happy path:** risk_flagged 事件正确渲染为黄色 Panel
|
||
- **Edge case:** 事件数据缺失时优雅降级
|
||
- **Integration:** _print_help 包含项目经理模式说明
|
||
|
||
**Verification:** CLI 能渲染 4 种协同事件;帮助文本包含项目经理模式说明。
|
||
|
||
---
|
||
|
||
## Scope Boundaries
|
||
|
||
### In Scope
|
||
|
||
- 协作契约数据模型 + Lead 生成契约(U1)
|
||
- 专家按契约可见 + 主动通知(U2)
|
||
- Lead 验收 + 返工机制(U3)
|
||
- 专家风险标记 + Lead 调整(U4)
|
||
- 前端协作关系图(U5)
|
||
- CLI 协同事件渲染(U6)
|
||
|
||
### Deferred to Follow-Up Work
|
||
|
||
- 实时协作面板(Figma/Google Docs 式)——协作关系图已满足当前需求
|
||
- 专家完全自主互动(无固定协议)——当前保持协作契约的结构化协作
|
||
- 协作关系图的拖拽交互——当前只做可视化展示
|
||
- 专家请求协助的主动通信——当前只做风险标记,请求协助作为后续迭代
|
||
|
||
### Outside this Product's Identity
|
||
|
||
- 私董会模式融合——专家团和私董会是两种根本不同的协同方式
|
||
- 去中心化协作(共享黑板模式)——与私董会界限模糊
|
||
|
||
## Risks & Dependencies
|
||
|
||
**依赖 U1-U6 辩论机制:** 冲突协调复用 DEBATE phase 机制,不重新建设。U1-U6 的分歧检测、用户干预通道等基础设施可直接复用。
|
||
|
||
**LLM 调用次数显著增加:** Lead 不只分解+汇总,还要定义协作契约、验收成果、决策风险。每个阶段至少多 1-2 次 LLM 调用(验收 + 风险决策)。需评估成本影响,必要时可配置开关。
|
||
|
||
**上下文隔离被打破:** 专家需看到协作契约中相关专家的工作,KTD3 的完全隔离不再成立。通过限定可见范围(仅协作契约内的专家)控制信息过载。
|
||
|
||
**协作契约质量依赖 Lead 能力:** 如果 Lead 定义的协作契约不好,协同会退化回当前的孤立执行。可通过 prompt engineering 优化,但本质依赖 LLM 能力。
|
||
|
||
**返工循环风险:** 验收不合格可能触发返工循环。MAX_REWORKS=2 上限防止无限循环,但极端情况下仍可能导致执行时间过长。
|
||
|
||
## Open Questions
|
||
|
||
### Deferred to Implementation
|
||
|
||
- 协作契约的 LLM prompt 具体措辞——需在实现时调试
|
||
- 验收 LLM 判断的准确率——需在实现时验证
|
||
- 风险标记的解析规则是否需要更灵活——当前用 `[RISK: ...]` 格式,实现时可能需要调整
|
||
- 前端协作关系图的布局算法——当前用简单的圆形布局,实现时可能需要力导向布局
|