fischer-agentkit/docs/plans/2026-06-24-003-feat-expert-...

366 lines
18 KiB
Markdown
Raw Permalink 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.

---
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 dataclassPlanPhase 添加 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_resultpassed事件
- **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或红色failedPanel 展示验收结果和 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: ...]` 格式,实现时可能需要调整
- 前端协作关系图的布局算法——当前用简单的圆形布局,实现时可能需要力导向布局