37 KiB
| title | type | status | created | completed | origin | requirements | ||
|---|---|---|---|---|---|---|---|---|
| feat: @team 流水线模式集成与基线修复 | feat | completed | 2026-06-17 | 2026-06-18 | docs/brainstorms/2026-06-17-expert-team-evolution-roadmap-requirements.md |
|
feat: @team 流水线模式集成与基线修复
Summary
将 @team 任务分解模式从死代码状态集成到 WebSocket 流程,并修复基线问题。工作分两个阶段:R0 基线修复(修复 ExpertTeamRouter 模板引用 bug、损坏的集成测试、过时的 AGENTS.md 文档),R1 流水线集成(重写 TeamPlan 支持阶段依赖图、重写 TeamOrchestrator 为流水线模式、新增 _execute_team_collab 到 chat.py、新增 5 个编程专家模板、适配前端)。
完成后用户可通过 @team 开发用户登录功能 触发流水线执行(规划 → 前端 → 后端 → QA → 评审),与 @board 群聊讨论模式形成"决策→执行"互补闭环。
Problem Frame
当前状态
@team 路由的 ExpertTeamRouter、TeamOrchestrator、ExpertTeam 代码完整但从未被调用(死代码)。chat.py 中 TEAM_COLLAB 执行模式仅记录 warning 并回退到 REACT。此外存在多个基线问题:
- ExpertTeamRouter 模板引用 bug —
resolve_expert_configs中template.config是引用(非 deepcopy),is_lead赋值会污染共享模板(与 BoardRouter 修复前的 P1 bug 相同) - 集成测试损坏 —
tests/integration/test_expert_team.py导入 6 个已移除的类(CollaborationPlan, MergeStrategy, ParallelType, PhaseStatus, PlanPhase),会 ImportError - 前后端数据模型不一致 — 后端
TeamPlan.subtasks(扁平)vs 前端team.ts的plan_phases(阶段概念) - AGENTS.md 文档过时 — 描述的"CostAwareRouter 三层路由"、"serial/parallel/competitive + merge"已与代码不符
- TeamOrchestrator 仅 hub-and-spoke — 并行子任务无依赖,不支持流水线串行阶段
- 硬编码 model="default" — 两处 LLM 调用不读取
ExpertConfig.llm
核心问题
@team 代码完整但不可用,且现有 hub-and-spoke 编排不支持用户选择的流水线模式(对标 Qoder 的 Team Lead + 阶段依赖)。需要重写编排引擎和计划模型,然后集成到 WebSocket。
Requirements Traceability
| 需求 ID | 描述 | 实现单元 |
|---|---|---|
| R0 | 修复死代码与前后端不一致 | U1, U2, U3 |
| R1.1 | 流水线编排引擎(阶段依赖图) | U4, U5 |
| R1.2 | 上下文隔离 | U5(内嵌) |
| R1.3 | WebSocket 集成 | U6 |
| R1.4 | 路由支持(@team / @team:experts / @team:dev_team) | U6, U7 |
| R2(部分) | 5 个核心编程专家模板 | U7 |
Origin 文档:docs/brainstorms/2026-06-17-expert-team-evolution-roadmap-requirements.md(R0 和 R1 章节)
Key Technical Decisions
KTD1: 恢复阶段依赖图(PlanPhase),与前端 plan_phases 对齐
决策:后端恢复 PlanPhase 和 PhaseStatus 类,支持阶段依赖图(depends_on),与前端 team.ts 的 plan_phases 概念自然对齐。
理由:
- 前端已有
plan_phases和ITeamPlanPhase类型,恢复后端阶段概念可避免前端大改 - 流水线模式天然需要"阶段"概念(规划→前端→后端→QA→评审)
- 恢复
PlanPhase比扩展现有SubTask语义更清晰
约束:
- 不恢复 VOTE/FUSION 合并策略(仅保留 BEST)
- 不恢复
ParallelType枚举(阶段内并行通过asyncio.gather隐式实现) PlanPhase包含:id,name,assigned_expert,task_description,depends_on: list[str],status,result
KTD2: 流水线编排逻辑 — Lead 分解为阶段而非子任务
决策:TeamOrchestrator._decompose_task 改为让 Lead Expert 分解任务为阶段(phases),每个阶段有 assigned_expert 和 depends_on。执行时按依赖拓扑排序,无依赖的阶段并行,有依赖的串行。
理由:
- 对标 Qoder 的 Team Lead + 流水线协作
- Lead Expert 用 LLM 生成阶段 JSON(包含
name,assigned_expert,task_description,depends_on) - 阶段间数据通过
SharedWorkspace传递({task_id}/phase/{phase_id}/output)
流程:
- Lead 分解任务为阶段(LLM 生成 JSON)
- 拓扑排序阶段(按
depends_on) - 按拓扑序执行:同层无依赖阶段并行(
asyncio.gather),层间串行 - 每个阶段完成后,输出写入
SharedWorkspace - Lead 汇总所有阶段结果(BEST 策略)
KTD3: 上下文隔离 — 独立 ConfigDrivenAgent 实例
决策:每个阶段执行时创建独立的 ConfigDrivenAgent 实例(通过 AgentPool.create_agent),不共享对话历史。阶段间通过 SharedWorkspace 传递中间产物。
理由:
- 对标 Trae Solo 的独立上下文环境和 Claude Code Subagent 的上下文隔离
ExpertTeam中每个Expert包装一个ConfigDrivenAgent,但多个阶段可能分配给同一专家类型- 为每个阶段创建新实例确保上下文完全隔离
- 阶段输出通过
SharedWorkspace约定 key 传递:{task_id}/phase/{phase_id}/output
KTD4: WebSocket 事件流扩展
决策:在现有 6 个 team 事件基础上新增 3 个阶段事件。
事件流:
team_formed → plan_update(阶段计划)
→ phase_started → expert_step → expert_result → phase_completed
→ phase_started → expert_step → expert_result → phase_completed
→ ...(按拓扑序)
→ team_synthesis → team_dissolved
新增事件:
phase_started:{phase_id, phase_name, assigned_expert, depends_on}phase_completed:{phase_id, phase_name, result_summary}phase_failed:{phase_id, phase_name, error}
KTD5: ExpertTeamRouter 模板引用修复 — deepcopy
决策:resolve_expert_configs 中使用 copy.deepcopy(template.config) 替代 template.config,与 BoardRouter 的 P1 修复保持一致。
理由:ExpertConfig 是普通 Python 类(非 Pydantic),model_copy() 不可用,使用 copy.deepcopy()。
KTD6: TeamStatus 新增 PLANNING 状态(深化审查发现)
决策:后端 TeamStatus 枚举新增 PLANNING = "planning",在 Lead Expert 分解任务阶段设置。
理由:
- 前端
IExpertTeamState.status已包含'planning'(types.ts:141),但后端TeamStatus(team.py:31-38)缺少此状态 - 流水线模式下,Lead 分解任务为阶段是一个明确的生命周期阶段(FORMING → PLANNING → EXECUTING → SYNTHESIZING → COMPLETED)
- 现有 hub-and-spoke 模式直接从 FORMING 跳到 EXECUTING,流水线模式需要 PLANNING 中间态
约束:
ExpertTeam.create_team()后设置PLANNINGTeamOrchestrator._decompose_task完成后、开始执行阶段前设置EXECUTING
Deepening Review Findings(深化审查发现)
已确认的差距(需更新实现单元)
| # | 发现 | 位置 | 影响单元 | 处理方式 |
|---|---|---|---|---|
| F1 | ITeamPlanPhase 缺少 depends_on、task_description、result 字段;parallel_type 和 milestone 应改为可选 |
types.ts:129-136 |
U8 | 显式更新前端类型定义 |
| F2 | WsServerMessage 联合类型缺少 phase_started/phase_completed/phase_failed 事件 |
types.ts:103-108 |
U8 | 新增 3 个事件类型到联合类型 |
| F3 | 前端 chat.ts 的 WebSocket 事件 handler 缺少 phase 事件处理(case 'phase_started' 等) |
chat.ts:570-665 |
U8 | 新增 3 个 case 分支,更新 teamStore 中对应 phase 的 status |
| F4 | 后端 TeamStatus 枚举缺少 PLANNING 状态,与前端 IExpertTeamState.status 不一致 |
team.py:31-38 vs types.ts:141 |
U5 | 新增 PLANNING 枚举值(KTD6) |
已确认无需修改(验证通过)
| # | 验证项 | 位置 | 结论 |
|---|---|---|---|
| V1 | _VALID_TEAM_EVENT_TYPES 是否包含 phase 事件 |
chat.py:100-120 |
✅ 已包含 phase_started/phase_completed/phase_failed(line 109-111),U6 只需调用 emit_team_event 使用它们 |
| V2 | ExpertTeam.create_team() 签名 |
team.py:119-123 |
✅ 确认为 create_team(lead_config, member_configs),U6 需拆分 configs:首个为 lead,其余为 members |
| V3 | ExpertTeam.workspace 和 handoff_transport 可见性 |
team.py:88-109 |
✅ 均为 public property,U5 可直接使用 team.workspace 和 team.handoff_transport |
| V4 | ExpertConfig.llm 字段结构 |
config.py |
✅ 为 `dict[str, Any] |
新增测试场景(补充到 U5、U9)
- LLM 分解失败容错:LLM 返回无效 JSON → fallback 到单阶段(
[PlanPhase(task=原任务, assigned_expert=lead)]) - 循环依赖检测:A→B→A 的循环依赖 →
topological_sort()抛出ValueError - 无效专家引用:阶段
assigned_expert引用不存在的专家 → fallback 到 lead 专家 TeamStatus.PLANNING状态流转:create_team后为PLANNING,分解完成后为EXECUTING
High-Level Technical Design
流水线编排架构
用户输入: @team 开发用户登录功能
│
▼
ExpertTeamRouter.resolve() → 解析专家列表 + 任务
│
▼
ExpertTeam 创建 → 注册 handoff handler
│
▼
TeamOrchestrator.execute(task)
│
├─ 1. 广播 team_formed
│
├─ 2. Lead Expert 分解任务为阶段(LLM)
│ 输出: [
│ {name: "规划", assigned_expert: "tech_lead", depends_on: []},
│ {name: "前端", assigned_expert: "frontend_engineer", depends_on: ["规划"]},
│ {name: "后端", assigned_expert: "backend_engineer", depends_on: ["规划"]},
│ {name: "QA", assigned_expert: "qa_engineer", depends_on: ["前端", "后端"]},
│ {name: "评审", assigned_expert: "code_reviewer", depends_on: ["QA"]},
│ ]
│
├─ 3. 广播 plan_update(阶段计划)
│
├─ 4. 拓扑排序执行:
│ Layer 0: [规划] (并行)
│ Layer 1: [前端, 后端] (并行)
│ Layer 2: [QA]
│ Layer 3: [评审]
│
│ 每个阶段:
│ → phase_started 事件
│ → 创建独立 ConfigDrivenAgent 实例(上下文隔离)
│ → 读取前置阶段输出 from SharedWorkspace
│ → expert_step 事件
│ → 执行阶段任务
│ → 写入阶段输出 to SharedWorkspace
│ → expert_result 事件
│ → phase_completed 事件
│
├─ 5. Lead Expert 汇总(BEST 策略)
│
├─ 6. 广播 team_synthesis
│
└─ 7. 广播 team_dissolved
阶段依赖图数据模型
TeamPlan
├── id: str
├── task: str
├── lead_expert: str
├── status: PlanStatus
└── phases: list[PlanPhase]
├── id: str
├── name: str
├── assigned_expert: str
├── task_description: str
├── depends_on: list[str] # 前置阶段 ID
├── status: PhaseStatus
└── result: dict | None
Implementation Units
U1. 修复 ExpertTeamRouter 模板引用 bug
Goal: 修复 resolve_expert_configs 中 template.config 引用导致的模板污染问题,与 BoardRouter 的 P1 修复保持一致。
Requirements: R0
Dependencies: 无
Files:
src/agentkit/experts/router.py— 修改resolve_expert_configs方法
Approach:
- 在
router.py顶部新增import copy resolve_expert_configs中将configs.append(template.config)改为config = copy.deepcopy(template.config)然后configs.append(config)- 确保
is_lead赋值不会污染共享模板
Patterns to follow: src/agentkit/experts/board_router.py 的 resolve_expert_configs(已修复相同 bug)
Test scenarios:
- 模板不污染: 连续两次调用
resolve_expert_configs(["a", "b"])和resolve_expert_configs(["b", "a"]),第一次的is_lead不被第二次修改 - 动态生成不受影响: 不存在的专家名仍创建动态
ExpertConfig - Lead 正确设置: 首个专家
is_lead=True,其余False
Verification: pytest tests/unit/experts/ -k "router" 通过,无模板污染
U2. 临时修复集成测试导入
Goal: 修复 tests/integration/test_expert_team.py 的 ImportError,使其能导入并运行(测试内容会在 U9 重写为流水线模式)。
Requirements: R0
Dependencies: U1
Files:
tests/integration/test_expert_team.py— 修复导入和引用已移除类的测试
Approach:
- 移除对
CollaborationPlan, MergeStrategy, ParallelType, PhaseStatus, PlanPhase的导入 - 改为导入
TeamPlan, SubTask, SubTaskStatus, PlanStatus - 将使用
CollaborationPlan的测试(test_manual_team_subtask_parallel,test_auto_team_competitive_parallel,test_plan_modification_by_user,test_vote_strategy_with_tie_break,test_fusion_strategy,test_plan_failure_triggers_retry,test_fallback_after_retry_failure)改为使用TeamPlan或标记为pytest.mark.skip(U9 会重写) - 保留不依赖已移除类的测试(
TestManualTeamFormation.test_manual_team_with_templates,TestDecentralizedCollaboration,TestUserIntervention.test_user_intervention_broadcast,TestTeamDissolution,TestDynamicExpertManagement)
Test scenarios:
- 导入成功:
from agentkit.experts.plan import TeamPlan, SubTask, SubTaskStatus, PlanStatus不报错 - 保留测试通过: 不依赖已移除类的测试仍通过
- 跳过测试标记: 依赖已移除类的测试标记为
skip并注明"U9 将重写为流水线模式"
Verification: pytest tests/integration/test_expert_team.py 不再 ImportError,保留测试通过
U3. 更新 AGENTS.md 文档
Goal: 更新 AGENTS.md 中与代码不符的描述,确保文档与实际状态一致。
Requirements: R0
Dependencies: 无
Files:
AGENTS.md— 更新过时描述
Approach:
- "CostAwareRouter 三层路由" → "RequestPreprocessor(@skill 前缀 + 正则快路径 + REACT)"
- "serial/parallel/competitive + merge" → "hub-and-spoke(即将升级为流水线模式)"
- "CollaborationPlan: phases with dependencies, parallel types, merge strategies" → "TeamPlan: phases with dependencies(R1 恢复)"
- "TEAM_COLLAB" 状态更新为"R1 集成后可用"
Test expectation: none — 文档更新无行为变化
Verification: AGENTS.md 中无与代码矛盾的描述
U4. 重写 plan.py 恢复阶段依赖图
Goal: 重写 plan.py,恢复 PlanPhase 和 PhaseStatus 类,支持阶段依赖图(depends_on),与前端 plan_phases 概念对齐。
Requirements: R1.1
Dependencies: U2(测试已临时修复)
Files:
src/agentkit/experts/plan.py— 重写tests/unit/experts/test_plan.py— 新增单元测试
Approach:
- 保留现有
MergeStrategy.BEST、PlanStatus、SubTaskStatus、SubTask - 新增
PhaseStatus枚举:PENDING,RUNNING,COMPLETED,FAILED - 新增
PlanPhasedataclass:id,name,assigned_expert,task_description,depends_on: list[str],status,resultto_dict()/from_dict()序列化
- 重写
TeamPlan:- 新增
phases: list[PlanPhase]字段(保留subtasks用于向后兼容,但新代码用phases) - 新增
topological_sort()方法:返回按依赖排序的执行层list[list[PlanPhase]] - 新增
get_ready_phases()方法:返回当前可执行的阶段(依赖已完成) - 新增
update_phase_status()方法 - 新增
completed_phases/failed_phases属性
- 新增
Patterns to follow: 现有 SubTask dataclass 的序列化模式
Test scenarios:
- 阶段创建:
PlanPhase(name="前端", assigned_expert="frontend", depends_on=["规划"])正确创建 - 拓扑排序: 3 层依赖(规划→前端+后端→QA)正确排序为
[[规划], [前端, 后端], [QA]] - 就绪阶段: 初始时只有
规划就绪;规划完成后前端和后端就绪 - 序列化:
TeamPlan.to_dict()/from_dict()往返一致 - 循环依赖检测: A→B→A 的循环依赖抛出
ValueError
Verification: pytest tests/unit/experts/test_plan.py 通过
U5. 重写 TeamOrchestrator 为流水线模式
Goal: 重写 TeamOrchestrator,从 hub-and-spoke(并行无依赖)升级为流水线模式(阶段依赖 + 拓扑排序 + 上下文隔离)。
Requirements: R1.1, R1.2
Dependencies: U4(PlanPhase 已实现)
Files:
src/agentkit/experts/team.py— 新增TeamStatus.PLANNING枚举值(KTD6, F4)src/agentkit/experts/orchestrator.py— 重写tests/unit/experts/test_orchestrator.py— 新增单元测试
Approach:
team.py 修改(KTD6):
TeamStatus枚举新增PLANNING = "planning"create_team()完成后设置PLANNING(而非直接EXECUTING)- 现有 hub-and-spoke 模式不受影响(PLANNING 状态短暂存在)
_decompose_task 改为分解阶段:
- Lead Expert 用 LLM 生成阶段 JSON(
name,assigned_expert,task_description,depends_on) - 解析为
list[PlanPhase] - 阶段数上限
MAX_PHASES = 10 - LLM 失败/返回无效 JSON 时 fallback 到单阶段(
[PlanPhase(task=原任务, assigned_expert=lead)])
execute 改为流水线驱动:
- 广播
team_formed - 设置
TeamStatus.PLANNING,Lead 分解任务为阶段 - 广播
plan_update(含阶段列表) - 设置
TeamStatus.EXECUTING,拓扑排序,按层执行:- 同层阶段并行(
asyncio.gather) - 层间串行(等待上一层完成)
- 每个阶段:广播
phase_started→ 创建独立 Agent 实例 → 读取前置输出 → 执行 → 写入输出 → 广播expert_step/expert_result/phase_completed
- 同层阶段并行(
- Lead 汇总(BEST 策略)
- 广播
team_synthesis和team_dissolved
上下文隔离实现:
_execute_phase中通过AgentPool.create_agent创建独立ConfigDrivenAgent- 上下文仅包含:任务描述 + 专家 persona + 前置阶段输出(从
SharedWorkspace读取) - 阶段完成后写入
SharedWorkspace:{task_id}/phase/{phase_id}/output - 使用
team.workspace和team.handoff_transport(均为 public property,V3 验证通过)
移除硬编码 model="default":
_get_model(expert)方法:读取expert.config.llm(V4 验证为dict[str, Any] | None)- 逻辑:
expert.config.llm.get("model", "default") if expert.config.llm else "default"
新增事件广播(V1 验证:_VALID_TEAM_EVENT_TYPES 已包含这些事件类型,无需修改 chat.py 的 frozenset):
phase_started:{phase_id, phase_name, assigned_expert, depends_on}phase_completed:{phase_id, phase_name, result_summary}phase_failed:{phase_id, phase_name, error}
Fallback 保留:
- 所有阶段失败时 fallback 到单 Agent(现有
_fallback_to_single_agent逻辑)
Patterns to follow: 现有 TeamOrchestrator._execute_subtask 的事件广播模式
Test scenarios:
- 流水线执行: 3 阶段(A→B→C)按序执行,B 在 A 完成后启动
- 并行阶段: 2 个无依赖阶段并行执行(
asyncio.gather) - 上下文隔离: 阶段 B 的 Agent 实例不包含阶段 A 的对话历史
- SharedWorkspace 传递: 阶段 A 的输出写入 workspace,阶段 B 能读取
- 阶段失败: 阶段 B 失败时,依赖 B 的阶段 C 标记为
FAILED - 全失败 fallback: 所有阶段失败时 fallback 到单 Agent
- 事件广播:
phase_started/phase_completed事件正确发送 - 模型路由:
expert.config.llm配置的模型被使用(非"default") - LLM 分解失败容错: LLM 返回无效 JSON → fallback 到单阶段(深化审查新增)
- 循环依赖检测: A→B→A 的循环依赖 →
topological_sort()抛出ValueError(深化审查新增) - 无效专家引用: 阶段
assigned_expert引用不存在的专家 → fallback 到 lead 专家(深化审查新增) TeamStatus.PLANNING状态流转:create_team后为PLANNING,分解完成后为EXECUTING(深化审查新增)
Verification: pytest tests/unit/experts/test_orchestrator.py 通过
U6. 新增 _execute_team_collab 到 chat.py
Goal: 在 chat.py 中新增 _execute_team_collab 函数,将 @team 路由集成到 WebSocket 流程,参照 _execute_board_meeting 的集成模式。
Requirements: R1.3, R1.4
Dependencies: U5(TeamOrchestrator 已重写), U7(编程专家模板已创建)
Files:
src/agentkit/server/routes/chat.py— 新增_execute_team_collab函数 + 集成到 WebSocket handlertests/unit/server/routes/test_chat_team.py— 新增单元测试
Approach:
_execute_team_collab 函数(参照 _execute_board_meeting 模式):
- 从
app.state获取ExpertTemplateRegistry - 创建
ExpertTeamRouter,调用resolve(content) - 若
not routing_result.matched:返回False(继续正常管线) - 若
not routing_result.task_content:发送错误"团队任务需要一个描述" - 调用
resolve_expert_configs解析专家配置 - 若无专家配置:发送错误"无法解析团队成员"
- 创建
ExpertTeam(使用app.state.agent_pool) - 拆分专家配置(V2 验证):首个为
lead_config,其余为member_configs,调用team.create_team(lead_config=..., member_configs=...) - 注册 handoff handler 中继事件到 WebSocket(
_relay_team_event)— 使用emit_team_event(V1 验证:_VALID_TEAM_EVENT_TYPES已包含 phase 事件,无需修改 frozenset) - 追加用户消息到会话历史
- 执行
TeamOrchestrator.execute(task) - 发送
final_answer - 持久化最终结果到会话历史
- 清理团队
WebSocket handler 集成:
- 在 WebSocket message handler 中,
@board检查之后、@skill:检查之前,新增@team检查 if await _execute_team_collab(websocket, session_id, content, sm): return
TEAM_COLLAB 执行模式:
- 移除
chat.py:752-758的 fallback 到 REACT 逻辑 TEAM_COLLAB现在由_execute_team_collab处理
Patterns to follow: src/agentkit/server/routes/chat.py 的 _execute_board_meeting(line 155-307)
Test scenarios:
- @team 触发:
@team 开发登录功能调用_execute_team_collab,返回True - 非 @team 输入: 普通消息不触发,返回
False - 无任务描述:
@team无任务内容时发送错误 - 无专家配置: 所有专家名无效时发送错误
- 事件中继:
team_formed/phase_started/expert_step等事件正确转发到 WebSocket - final_answer 发送: 执行完成后发送
final_answer事件 - 会话持久化: 用户消息和最终结果持久化到会话历史
- 团队清理: 执行后
team.dissolve()被调用 - 与 @board 互不干扰:
@board和@team各自独立路由
Verification: pytest tests/unit/server/routes/test_chat_team.py 通过;@team 开发登录功能 在 WebSocket 中端到端可用
U7. 新增 5 个核心编程专家模板
Goal: 新增 5 个编程领域专家模板 + 1 个 dev_team.yaml 组合模板,为 @team 流水线提供默认编程团队。
Requirements: R1.4, R2(部分)
Dependencies: 无(可与 U4-U6 并行)
Files:
configs/experts/tech_lead.yaml— 技术负责人configs/experts/frontend_engineer.yaml— 前端工程师configs/experts/backend_engineer.yaml— 后端工程师configs/experts/qa_engineer.yaml— QA 工程师configs/experts/code_reviewer.yaml— 代码审查员configs/experts/dev_team.yaml— 默认编程团队组合模板
Approach:
- 每个专家 YAML 包含:
name,persona,thinking_style,speaking_style,bound_skills,avatar,color tech_lead: 第一性原理思维,架构决策,任务分解,is_lead: truefrontend_engineer: 组件化思维,UI/UX 敏感,前端测试backend_engineer: 系统思维,API 设计,数据库操作qa_engineer: 边界思维,测试用例设计,缺陷验证code_reviewer: 批判性思维,代码规范,安全漏洞dev_team.yaml: 包含 5 个成员列表(tech_lead, frontend_engineer, backend_engineer, qa_engineer, code_reviewer)
Patterns to follow: configs/experts/elon_musk.yaml 的字段结构
Test scenarios:
- 模板加载: 5 个 YAML 文件能被
ExpertTemplateRegistry.load_from_directory加载 - 专家配置正确: 每个
ExpertConfig的persona/thinking_style/bound_skills非空 - dev_team 组合:
dev_team.yaml包含 5 个成员名 - @team:dev_team 路由:
@team:dev_team 开发功能能解析为 5 个专家
Verification: agentkit skill list 显示新增专家;@team:dev_team 任务 能调用默认团队
U8. 适配前端 ExpertTeamView.vue 和 team.ts
Goal: 适配前端组件和 store,确保与后端流水线模式的数据模型一致,正确显示阶段计划、当前阶段、专家步骤。
Requirements: R1.3
Dependencies: U4(PlanPhase 已实现), U6(WebSocket 事件已定义)
Files:
src/agentkit/server/frontend/src/api/types.ts— 更新ITeamPlanPhase和WsServerMessage类型(F1, F2)src/agentkit/server/frontend/src/stores/chat.ts— 新增 phase 事件 handler(F3)src/agentkit/server/frontend/src/stores/team.ts— 适配数据模型(新增 phase 状态更新方法)src/agentkit/server/frontend/src/components/chat/ExpertTeamView.vue— 适配阶段展示
Approach:
types.ts 修改(F1, F2 — 深化审查发现):
ITeamPlanPhase 更新(F1):
export interface ITeamPlanPhase {
id: string
name: string
assigned_expert: string
task_description?: string // 新增
depends_on: string[] // 新增(核心字段,支持流水线依赖图)
status: 'pending' | 'in_progress' | 'completed' | 'failed'
result?: string // 新增(阶段执行结果摘要)
parallel_type?: 'serial' | 'subtask_parallel' | 'competitive_parallel' // 改为可选(KTD1 不恢复 ParallelType 枚举)
milestone?: string // 改为可选
}
WsServerMessage 新增 3 个事件类型(F2):
| { type: 'phase_started'; data: { phase_id: string; phase_name: string; assigned_expert: string; depends_on: string[] } }
| { type: 'phase_completed'; data: { phase_id: string; phase_name: string; result_summary: string } }
| { type: 'phase_failed'; data: { phase_id: string; phase_name: string; error: string } }
chat.ts 修改(F3 — 深化审查发现):
在 team_dissolved case 之前(约 line 655),新增 3 个 case 分支:
case 'phase_started': {
const teamStore = _getTeamStore()
if (teamStore?.teamState) {
teamStore.updatePhaseStatus(payload.phase_id, 'in_progress')
}
break
}
case 'phase_completed': {
const teamStore = _getTeamStore()
if (teamStore?.teamState) {
teamStore.updatePhaseStatus(payload.phase_id, 'completed', payload.result_summary)
}
break
}
case 'phase_failed': {
const teamStore = _getTeamStore()
if (teamStore?.teamState) {
teamStore.updatePhaseStatus(payload.phase_id, 'failed', payload.error)
}
break
}
team.ts 修改:
- 新增
updatePhaseStatus(phaseId: string, status: ITeamPlanPhase['status'], result?: string)方法 currentPhase和completedPhases逻辑保持不变(已用plan_phases)- 现有
updatePhases(phases)保持不变(用于plan_update事件)
ExpertTeamView.vue 修改:
- 新增阶段状态展示:
- 当前阶段(
status === 'in_progress')高亮 - 已完成阶段(
status === 'completed')标记 - 失败阶段(
status === 'failed')红色标记 - 阶段间依赖关系可视化(简单的箭头或缩进,基于
depends_on)
- 当前阶段(
- 确认
plan_update事件正确更新plan_phases
Patterns to follow: src/agentkit/server/frontend/src/components/chat/BoardStatusView.vue 的状态展示模式
Test scenarios:
- 阶段计划展示:
plan_update事件后,前端显示所有阶段 - 当前阶段高亮:
phase_started事件后,对应阶段高亮 - 阶段完成标记:
phase_completed事件后,对应阶段标记为完成 - 阶段失败标记:
phase_failed事件后,对应阶段标记为失败 - 专家步骤展示:
expert_step/expert_result事件正确关联到阶段 - 类型检查通过:
npm run typecheck无错误(F1, F2 类型更新后)
Verification: npm run typecheck 通过;前端正确展示流水线阶段
U9. 重写集成测试覆盖流水线模式
Goal: 重写 tests/integration/test_expert_team.py,覆盖流水线模式的完整功能,替换 U2 中临时跳过的测试。
Requirements: R0, R1
Dependencies: U4(PlanPhase), U5(TeamOrchestrator), U6(chat.py 集成), U7(专家模板)
Files:
tests/integration/test_expert_team.py— 重写
Approach:
- 移除 U2 中的
pytest.mark.skip标记 - 重写测试为流水线模式:
test_pipeline_execution: 3 阶段(A→B→C)按序执行test_parallel_phases: 2 个无依赖阶段并行test_phase_dependency: 阶段 B 依赖 A,A 失败时 B 标记为 FAILEDtest_shared_workspace_passing: 阶段 A 输出通过 SharedWorkspace 传递给 Btest_context_isolation: 阶段 B 的 Agent 不包含 A 的对话历史test_fallback_on_all_failure: 所有阶段失败时 fallback 到单 Agenttest_dev_team_template:@team:dev_team 任务调用 5 个编程专家test_explicit_experts:@team:frontend_engineer,backend_engineer 任务调用指定专家test_event_sequence: 事件顺序正确(team_formed → plan_update → phase_started → ... → team_synthesis → team_dissolved)test_llm_decomposition_failure: LLM 返回无效 JSON → fallback 到单阶段(深化审查新增)test_circular_dependency: A→B→A 循环依赖 →topological_sort()抛出ValueError(深化审查新增)test_invalid_expert_reference: 阶段引用不存在的专家 → fallback 到 lead(深化审查新增)test_team_status_planning:create_team后状态为PLANNING,分解完成后为EXECUTING(深化审查新增)
- 保留不依赖已移除类的现有测试
Test scenarios:
- 流水线端到端:
@team 开发登录功能触发完整流水线 - 阶段依赖: 依赖阶段在前置完成后才执行
- 并行阶段: 无依赖阶段并行执行
- 上下文隔离: 子任务上下文不污染
- Fallback: 全失败时降级
- 事件序列: 事件顺序正确
Verification: pytest tests/integration/test_expert_team.py 全部通过
U10. 端到端验证与文档更新
Goal: 端到端验证 @team 流水线模式可用,更新相关文档。
Requirements: R1
Dependencies: U1-U9 全部完成
Files:
docs/plans/2026-06-17-003-feat-team-pipeline-integration-plan.md— 更新 statusAGENTS.md— 更新@team状态为"可用"
Approach:
- 启动
agentkit gui --port 8002 - WebSocket 连接,发送
@team 开发用户登录功能 - 验证:
team_formed→plan_update→phase_started/phase_completed序列 →team_synthesis→team_dissolved - 验证:
@board仍正常工作 - 验证:
@team:dev_team 任务调用默认团队 - 验证:
@team:frontend_engineer,backend_engineer 任务调用指定专家 - 运行
ruff check src/ && ruff format src/ - 运行
pytest -m "not integration"确保单元测试通过 - 运行
pytest tests/integration/test_expert_team.py确保集成测试通过 - 运行
npm run typecheck确保前端类型正确
Test expectation: none — 验证单元
Verification: @team 端到端可用;@board 不受影响;所有测试通过;ruff 清洁
Scope Boundaries
本次范围内
- R0: 修复 ExpertTeamRouter 模板引用 bug、集成测试导入、AGENTS.md 文档
- R1: 重写 TeamPlan/TeamOrchestrator 为流水线模式、WebSocket 集成、5 个编程专家模板、前端适配
- 上下文隔离(独立 ConfigDrivenAgent 实例 + SharedWorkspace 传递)
延后到后续工作
- R2 完整版: 额外 3 个可选专家(devops, security, database)
- R3 完整版: 上下文隔离的配置化(
agentkit.yaml中isolation: context|none) - R4: 多模型智能路由(消费
ExpertConfig.llm)— 本次仅移除硬编码,完整路由逻辑延后 - R5: 仓库级代码理解
- R6: VS Code 扩展
- git worktree 隔离: v2 路线图已决定延后
- VOTE/FUSION 合并策略: 不恢复,仅保留 BEST
不在产品身份内
- 纯代码补全
- 模型训练/微调
- 100+ 专家模板
Risks & Dependencies
风险
-
TeamOrchestrator 重写复杂度高 — 从 hub-and-spoke 到流水线是架构级变更
- 缓解:U4 先建立数据模型,U5 基于模型重写,分步验证
-
上下文隔离可能影响 AgentPool — 每个阶段创建新 Agent 实例可能增加资源消耗
- 缓解:阶段完成后立即销毁 Agent 实例;
MAX_PHASES = 10限制
- 缓解:阶段完成后立即销毁 Agent 实例;
-
前端数据模型可能仍有不一致 —ITeamPlanPhase类型需确认与后端PlanPhase.to_dict()完全对齐- 已解决(深化审查 F1-F3):明确
ITeamPlanPhase需新增depends_on/task_description/result,WsServerMessage需新增 3 个 phase 事件,chat.ts需新增 3 个 case 分支。U8 已显式列出所有前端修改。
- 已解决(深化审查 F1-F3):明确
-
Lead Expert 分解质量依赖 LLM — 阶段划分可能不合理
- 缓解:
_parse_phases中验证depends_on引用的阶段存在;无效时 fallback 到单阶段(U5 新增 LLM 分解失败容错测试)
- 缓解:
依赖
ExpertTeamRouter代码已完整(仅需 U1 修复 bug)ExpertTeam代码已完整(无需修改)SharedWorkspace代码已完整(仅需约定 key)HandoffTransport代码已完整(无需修改)_execute_board_meeting提供集成模式参考
Open Questions
计划时已解决
- 阶段依赖图设计: 恢复
PlanPhase(KTD1) - 编排逻辑: Lead 分解为阶段,拓扑排序执行(KTD2)
- 上下文隔离: 独立
ConfigDrivenAgent实例(KTD3) - 前后端数据模型: 后端恢复
phases,与前端plan_phases对齐(KTD1) TeamStatus.PLANNING状态: 新增枚举值,对齐前端(KTD6, 深化审查 F4)
深化审查已解决
_VALID_TEAM_EVENT_TYPES是否包含 phase 事件: 已包含,U6 无需修改 frozenset(V1)ExpertTeam.create_team()签名: 确认为(lead_config, member_configs),U6 需拆分 configs(V2)ExpertTeam.workspace/handoff_transport可见性: 均为 public property,U5 可直接使用(V3)ExpertConfig.llm字段结构: 为dict[str, Any] | None,U5 的_get_model逻辑已明确(V4)ITeamPlanPhase缺少depends_on: U8 显式新增字段(F1)WsServerMessage缺少 phase 事件: U8 显式新增 3 个事件类型(F2)- 前端
chat.ts缺少 phase 事件 handler: U8 显式新增 3 个 case 分支(F3)
延后到实现时
PlanPhase的精确字段名和类型(U4 实现时确定)_parse_phases的 JSON 解析容错策略(U5 实现时确定)AgentPool.create_agent的资源清理时机(U5 实现时确定)ExpertTeamView.vue的依赖关系可视化样式(U8 实现时确定)
System-Wide Impact
受影响组件
| 组件 | 影响 | 说明 |
|---|---|---|
src/agentkit/experts/router.py |
修改 | U1 修复模板引用 bug |
src/agentkit/experts/plan.py |
重写 | U4 恢复阶段依赖图 |
src/agentkit/experts/team.py |
修改 | U5 新增 TeamStatus.PLANNING 枚举值(KTD6, F4) |
src/agentkit/experts/orchestrator.py |
重写 | U5 流水线模式 |
src/agentkit/server/routes/chat.py |
修改 | U6 新增 _execute_team_collab |
configs/experts/ |
新增 | U7 新增 5 个编程专家模板 |
src/agentkit/server/frontend/src/api/types.ts |
修改 | U8 更新 ITeamPlanPhase 和 WsServerMessage(F1, F2) |
src/agentkit/server/frontend/src/stores/chat.ts |
修改 | U8 新增 phase 事件 handler(F3) |
src/agentkit/server/frontend/src/stores/team.ts |
修改 | U8 新增 updatePhaseStatus 方法 |
src/agentkit/server/frontend/src/components/chat/ExpertTeamView.vue |
修改 | U8 阶段展示 |
tests/integration/test_expert_team.py |
重写 | U9 流水线测试 |
tests/unit/experts/test_plan.py |
新增 | U4 单元测试 |
tests/unit/experts/test_orchestrator.py |
新增 | U5 单元测试 |
tests/unit/server/routes/test_chat_team.py |
新增 | U6 单元测试 |
AGENTS.md |
修改 | U3 文档更新 |
不受影响
@board群聊讨论模式(完全独立)@skill:路由(独立)BoardOrchestrator/BoardTeam/BoardRouter(不修改)RequestPreprocessor(不修改)- LLM Gateway(不修改)
- 记忆系统(不修改)
- 自进化系统(不修改)