---
date: 2026-06-15
status: active
origin: docs/brainstorms/2026-06-15-autonomous-task-execution-requirements.md
---

## Summary

打通 PlanExecEngine 和 TeamOrchestrator 的执行层，将模拟代码替换为真实的 Agent/ReActEngine 调用，集成 SharedWorkspace 实现步骤间状态传递，并添加 WebSocket 进度事件。用多步研究任务端到端验证闭环。

## Problem Frame

AgentKit 的任务规划框架骨架完整（四种推理引擎 + TeamOrchestrator + PipelineEngine），但执行层未跑通：`_execute_phase` 返回模拟字符串，`_LLMStepAgent` 只做单次 LLM 调用不支持工具，SharedWorkspace 未集成到执行层。用户提出复杂需求后 Agent 无法真正拆解执行。本计划将已有框架跑通，而非新建能力。

---

## Key Technical Decisions

**KTD-1. _LLMStepAgent 替换为 ReActStepExecutor。** 现有 `_LLMStepAgent` 只做单次 `llm_gateway.chat()` 调用，不支持工具。新建 `ReActStepExecutor` 类，内部创建 `ReActEngine` 实例执行步骤，支持工具调用和多步推理。保留 `_LLMStepAgent` 作为无工具场景的轻量回退。

**KTD-2. SharedWorkspace 直接复用。** 现有 `SharedWorkspace`（`core/shared_workspace.py`）是通用 key-value 存储，支持版本控制和分布式锁。PlanExecEngine 直接注入 SharedWorkspace 实例，步骤结果写入 `plan:{plan_id}:step:{step_id}:result`，无需新建状态管理。

**KTD-3. TeamOrchestrator 通过 Expert.agent.execute() 执行。** `Expert.agent` 是 `ConfigDrivenAgent` 实例，其 `execute(TaskMessage)` 是 final 方法，内部根据 execution_mode 选择 ReAct/PlanExec/ReWOO/Reflexion 引擎。直接调用即可，无需手动创建 ReActEngine。

**KTD-4. 进度事件通过 HandoffTransport -> WebSocket 桥接。** TeamOrchestrator 已通过 `_broadcast_event` 向 HandoffTransport 发送事件。在 Chat WebSocket handler 中注册 HandoffTransport handler，将 team 事件转发为 WebSocket 消息。PlanExecEngine 的步骤事件通过回调函数注入。

---

## Requirements Trace

| R-ID | Implementation Units |
|------|---------------------|
| R1 | U1, U2 |
| R2 | U3 |
| R3 | U4 |
| R4 | U5 |
| R5 | U4 |
| R6 | U6 |
| R7 | U2 |
| R8 | U7 |
| R9 | U8 |

---

## High-Level Technical Design

```mermaid
flowchart TB
    subgraph User Request
        A[用户输入复杂任务] --> B[CostAwareRouter]
    end

    subgraph Routing
        B -->|complexity > 0.7| C[TEAM_COLLAB]
        B -->|0.3-0.7| D[SKILL_REACT / REACT]
    end

    subgraph PlanExecEngine Path
        D --> E[GoalPlanner]
        E --> F[ExecutionPlan]
        F --> G[ReActStepExecutor]
        G -->|per step| H[ReActEngine.execute]
        H --> I[Tool Calls]
        I --> J[SharedWorkspace.write]
        J -->|next step| G
    end

    subgraph TeamOrchestrator Path
        C --> K[ExpertTeam.form]
        K --> L[CollaborationPlan]
        L --> M[_execute_phase]
        M -->|real call| N[Expert.agent.execute]
        N --> O[TaskResult]
        O --> P[_merge_results]
    end

    subgraph Events
        H --> Q[StepEvent callback]
        M --> R[HandoffTransport broadcast]
        Q --> S[WebSocket emit]
        R --> S
    end
```

---

## Implementation Units

### U1. TeamOrchestrator._execute_phase 真实执行

**Goal:** 将 `_execute_phase` 从模拟代码改为调用 `Expert.agent.execute(TaskMessage)` 执行真实任务

**Requirements:** R1

**Dependencies:** None

**Files:**
- `src/agentkit/experts/orchestrator.py` — 修改 `_execute_phase` 和 `_run_competitor`
- `tests/unit/experts/test_orchestrator.py` — 新增/更新测试

**Approach:**
1. 在 `_execute_phase` 中，获取 `expert = self._team._experts.get(phase.assigned_expert)`
2. 构建 `TaskMessage`：`task_id=phase.phase_id`, `agent_name=expert.config.name`, `task_type="team_phase"`, `input_data={"phase_name": phase.name, "phase_description": phase.description, "team_id": self.team_id}`
3. 从 SharedWorkspace 读取前置阶段结果，注入 `input_data["dependency_results"]`
4. 调用 `result = await expert.agent.execute(task_msg)`
5. 处理 `TaskResult`：成功则写入 SharedWorkspace 并广播 `phase_completed`，失败则广播 `phase_failed`
6. 同样修改 `_run_competitor`，调用 `expert.agent.execute()` 替代模拟返回

**Patterns to follow:** `BaseAgent.execute()` 的 final 方法模式（`core/base.py`），`TaskMessage`/`TaskResult` 协议（`core/protocol.py`）

**Test scenarios:**
- Happy path: _execute_phase 调用 expert.agent.execute() 并返回 TaskResult
- Expert not found: assigned_expert 不在 _experts 中时回退到 lead_expert
- Execution failure: agent.execute() 返回 FAILED 状态时广播 phase_failed
- Covers AE3: 两个 Expert 竞争执行，各自调用 agent.execute()

**Verification:** 单元测试通过，mock Agent 返回 TaskResult，验证 _execute_phase 正确处理成功/失败

---

### U2. TeamOrchestrator 合并策略从真实结果选择

**Goal:** COMPETITIVE_PARALLEL 模式下，合并策略（BEST/VOTE/FUSION）从真实 TaskResult 中选择/融合

**Requirements:** R1, R7

**Dependencies:** U1

**Files:**
- `src/agentkit/experts/orchestrator.py` — 修改 `_merge_results`
- `tests/unit/experts/test_orchestrator.py`

**Approach:**
1. `_merge_results` 当前接收 `list[dict]`，改为接收 `list[tuple[Expert, TaskResult]]`
2. BEST 策略：Lead Expert 的 LLM 评估各 TaskResult.output_data，选择最佳
3. VOTE 策略：每个 Expert 的 LLM 对其他结果评分，最高分胜出
4. FUSION 策略：Lead Expert 的 LLM 融合所有 output_data
5. 无 LLM Gateway 时回退到当前简化逻辑（选择第一个结果）

**Patterns to follow:** `PipelineReflector` 的 LLM 调用模式（`orchestrator/reflection.py`）

**Test scenarios:**
- BEST: 3 个 Expert 结果，Lead Expert 选择最佳
- VOTE: 3 个 Expert 结果，投票选择
- FUSION: 3 个 Expert 结果，Lead Expert 融合
- No LLM Gateway: 回退到选择第一个结果

**Verification:** 单元测试验证三种合并策略从真实 TaskResult 中选择

---

### U3. ReActStepExecutor 替代 _LLMStepAgent

**Goal:** 新建 ReActStepExecutor，内部使用 ReActEngine 执行步骤，支持工具调用和多步推理

**Requirements:** R2

**Dependencies:** None

**Files:**
- `src/agentkit/core/plan_exec_engine.py` — 新增 `ReActStepExecutor` 类，修改 `PlanExecutor` 使用新执行器
- `tests/unit/core/test_plan_exec_engine.py` — 新增测试

**Approach:**
1. 新建 `ReActStepExecutor` 类，构造函数接收 `llm_gateway`, `tools`, `max_steps=5`, `model="default"`, `system_prompt=None`
2. `execute(task_msg: TaskMessage) -> TaskResult` 方法：
   - 从 `task_msg.input_data` 提取 `step_name`, `step_description`, `dependency_results`
   - 构建 messages：`[{"role": "user", "content": step_description}]`
   - 如有 `dependency_results`，追加到 content
   - 创建 `ReActEngine(llm_gateway, max_steps=max_steps)`
   - 调用 `react_engine.execute(messages, tools, model, system_prompt)`
   - 将 `ReActResult.output` 包装为 `TaskResult(output_data={"content": result.output, "steps": result.total_steps, "tokens": result.total_tokens})`
3. `PlanExecutor` 新增 `step_executor_type` 参数：`"react"`（默认）或 `"llm"`（回退到 _LLMStepAgent）
4. `PlanExecutor._execute_step` 根据 `step_executor_type` 选择执行器

**Patterns to follow:** `ReActEngine.execute()` 的签名和返回值（`core/react.py`），`_LLMStepAgent` 的接口（`plan_exec_engine.py`）

**Test scenarios:**
- Happy path: ReActStepExecutor 调用 ReActEngine，返回包含工具调用结果的 TaskResult
- No tools: 无工具时回退到纯 LLM 调用
- Multi-step: ReActEngine 执行 3 步 think-act-observe 循环
- Tool failure: 工具调用异常时 ReActEngine 返回 partial status

**Verification:** 单元测试 mock ReActEngine，验证 ReActStepExecutor 正确调用和包装结果

---

### U4. SharedWorkspace 集成到执行层

**Goal:** PlanExecEngine 和 TeamOrchestrator 通过 SharedWorkspace 传递步骤间状态

**Requirements:** R3, R5

**Dependencies:** U1, U3

**Files:**
- `src/agentkit/core/plan_exec_engine.py` — 注入 SharedWorkspace，步骤结果写入/读取
- `src/agentkit/experts/orchestrator.py` — 阶段结果写入/读取 SharedWorkspace
- `tests/unit/core/test_plan_exec_engine.py`
- `tests/unit/experts/test_orchestrator.py`

**Approach:**
1. `PlanExecutor` 构造函数新增 `workspace: SharedWorkspace | None = None` 参数
2. 步骤完成后：`workspace.write(f"plan:{plan_id}:step:{step_id}:result", result_data, agent_id=step_id)`
3. 步骤执行前：从 workspace 读取依赖步骤结果，注入 `input_data["dependency_results"]`
4. `TeamOrchestrator` 构造函数新增 `workspace: SharedWorkspace | None = None`，默认使用 `team._workspace`
5. 阶段完成后写入 `workspace.write(f"team:{team_id}:phase:{phase_id}:result", ...)`
6. 阶段执行前读取前置阶段结果

**Patterns to follow:** `ExpertTeam._workspace` 的使用模式（`experts/team.py`），`SharedWorkspace.write/read` API（`core/shared_workspace.py`）

**Test scenarios:**
- PlanExecEngine: 步骤 A 完成后结果写入 workspace，步骤 B 执行前从 workspace 读取
- TeamOrchestrator: 阶段 A 结果写入 workspace，阶段 B 读取
- No workspace: workspace=None 时回退到原有 dependency_results 机制
- Concurrent write: 两个并行步骤同时写入 workspace，版本号递增

**Verification:** 单元测试验证 workspace 读写和依赖传递

---

### U5. GoalPlanner prompt 调优

**Goal:** 提升 GoalPlanner 的任务分解质量，确保子任务可执行、依赖关系正确

**Requirements:** R4

**Dependencies:** None

**Files:**
- `src/agentkit/core/goal_planner.py` — 优化 LLM prompt 和规则分解逻辑
- `tests/unit/core/test_goal_planner.py`

**Approach:**
1. 优化 `_llm_decompose` 的 prompt：明确要求输出 JSON 格式，包含 step_id/name/description/dependencies/required_tools 字段
2. 添加 few-shot 示例：展示"分析竞品并生成报告"的标准分解（搜索→分析→生成）
3. 规则分解增强：识别"搜索/查找/分析/生成/报告/对比"等常见任务动词，映射到标准步骤模板
4. 添加分解质量自检：LLM 分解后，用第二次 LLM 调用验证步骤是否完整、依赖是否合理
5. 添加 `required_tools` 字段到 PlanStep，指定步骤需要的工具（如搜索步骤需要 web_search）

**Patterns to follow:** 现有 `_rule_based_decompose` 和 `_llm_decompose` 模式

**Test scenarios:**
- "分析竞品并生成报告" → 3 步分解（搜索→分析→生成），依赖关系正确
- "搜索最新AI论文" → 1 步分解，required_tools=["web_search"]
- "对比A和B的优缺点" → 2 步分解（分别搜索→对比分析）
- LLM 分解失败 → 回退到规则分解

**Verification:** 单元测试验证分解质量和依赖关系

---

### U6. PlanExecEngine 失败重规划集成

**Goal:** 步骤执行失败时，集成 PipelineReflector/PipelineReplanner 触发自动重规划

**Requirements:** R6

**Dependencies:** U3

**Files:**
- `src/agentkit/core/plan_exec_engine.py` — 修改 `_execute_plan` 失败处理逻辑
- `tests/unit/core/test_plan_exec_engine.py`

**Approach:**
1. `PlanExecutor` 已有 `_plan_to_pipeline` / `_pipeline_to_plan` 桥接方法（plan_exec_engine.py 第549-664行）
2. 在 `_execute_plan` 的步骤失败分支中：
   - 调用 `reflector.reflect(pipeline, pipeline_result, replan_count)` 获取 ReflectionReport
   - 调用 `replanner.replan(pipeline, pipeline_result, reflection_report)` 获取修正后的 Pipeline
   - 将修正后的 Pipeline 转回 ExecutionPlan
   - 用 `_merge_completed_results` 保留已完成步骤的结果
   - 继续执行修正后的计划
3. 添加 `max_replan_attempts` 参数（默认 2），超过后回退到单 Agent 模式
4. 广播 `replanning` 事件，包含失败原因和修正计划

**Patterns to follow:** `PipelineEngine` 的反思-重规划闭环（`orchestrator/pipeline_engine.py`），现有 `_plan_to_pipeline` 桥接

**Test scenarios:**
- Covers AE2: 搜索步骤失败 → Reflector 分析原因 → Replanner 生成修正计划 → 重新执行成功
- Max replan exceeded: 连续 2 次重规划仍失败 → 回退到单 Agent
- Partial completion: 3 步中第 2 步失败，重规划后保留第 1 步结果

**Verification:** 单元测试 mock Reflector/Replanner，验证重规划流程

---

### U7. 多步研究任务端到端验证

**Goal:** 用"分析竞品并生成报告"场景验证完整闭环

**Requirements:** R8

**Dependencies:** U1, U3, U4, U5, U6

**Files:**
- `tests/integration/test_autonomous_research_task.py` — 新增集成测试
- `src/agentkit/core/plan_exec_engine.py` — 确保 ReActStepExecutor 与搜索工具集成
- `configs/skills/research.yaml` — 新增研究任务 Skill 配置

**Approach:**
1. 创建 `research` Skill 配置，绑定 `web_search` + `web_crawl` + `ask_human` 工具
2. 集成测试：mock LLM Gateway 返回预设响应，mock 搜索工具返回预设结果
3. 验证流程：用户输入 → GoalPlanner 分解 → PlanExecEngine 执行 → SharedWorkspace 状态传递 → 最终报告
4. 验证步骤间依赖：搜索步骤结果被分析步骤读取
5. 验证失败重规划：搜索工具返回空结果时触发重规划

**Test scenarios:**
- Covers AE1: "分析飞书和钉钉的竞品对比" → 搜索→分析→生成完整报告
- Tool integration: ReActStepExecutor 调用 web_search 工具
- Dependency chain: 搜索结果传递到分析步骤
- Failure recovery: 搜索失败 → 重规划 → 换关键词重新搜索

**Verification:** 集成测试通过，端到端输出包含搜索结果和分析报告

---

### U8. WebSocket 进度事件

**Goal:** 执行过程通过 WebSocket 实时推送进度事件

**Requirements:** R9

**Dependencies:** U1, U3

**Files:**
- `src/agentkit/server/routes/chat.py` — 注册 HandoffTransport handler，转发 team 事件
- `src/agentkit/core/plan_exec_engine.py` — 添加 step_event_callback 参数
- `src/agentkit/server/routes/portal.py` — 添加 plan/step 事件类型
- `tests/unit/server/test_chat_ws_events.py` — 新增测试

**Approach:**
1. PlanExecEngine 新增 `step_event_callback: Callable[[str, dict], Awaitable[None]] | None` 参数
2. 步骤状态变更时调用 callback：`plan_created`, `step_started`, `step_completed`, `step_failed`, `plan_completed`, `replanning`
3. Chat WebSocket handler 中，当 ExpertTeam 模式激活时，注册 HandoffTransport handler 将 team 事件转发为 WebSocket 消息
4. Portal WebSocket 添加新事件类型：`plan_step`（步骤进度）和 `plan_update`（计划变更）
5. 前端 `WsServerMessage` 类型添加 `plan_step` 和 `plan_update` 事件支持

**Patterns to follow:** 现有 `emit_team_event` 模式（`server/routes/chat.py`），Portal WebSocket 事件格式

**Test scenarios:**
- PlanExecEngine: 步骤开始/完成时 callback 被调用，事件类型正确
- TeamOrchestrator: HandoffTransport 事件转发到 WebSocket
- Portal: plan_step 事件包含 step_id, step_name, status
- No callback: callback=None 时不影响执行

**Verification:** 单元测试验证事件回调被正确调用

---

## Scope Boundaries

**In scope:**
- 打通 PlanExecEngine 和 TeamOrchestrator 执行层
- SharedWorkspace 集成
- GoalPlanner prompt 调优
- 失败重规划集成
- WebSocket 进度事件
- 多步研究任务验证

**Deferred to follow-up work:**
- 执行持久化与断点恢复
- 自适应执行监控（token 预算、耗时趋势）
- 人机协作规划 UI
- 计划模板库
- 前端进度可视化组件

**Outside this scope:**
- 动态工具发现与运行时组合
- 跨任务长期记忆
- 多层级嵌套计划

---

## Risks & Mitigations

| Risk | Impact | Mitigation |
|------|--------|-----------|
| ReActEngine 步骤级执行 token 消耗高 | 每步骤可能消耗大量 token | ReActStepExecutor 默认 max_steps=5，限制循环次数 |
| GoalPlanner 分解质量不稳定 | 复杂任务可能分解不合理 | 添加分解质量自检 + few-shot 示例 |
| SharedWorkspace 并发写入冲突 | 并行步骤同时写入可能冲突 | SharedWorkspace 内置版本控制和分布式锁 |
| HandoffTransport -> WebSocket 桥接延迟 | 事件转发可能增加延迟 | InProcess 模式下延迟极低（asyncio.Queue） |

---

## Open Questions

- **Deferred to implementation:** ReActStepExecutor 的 system_prompt 是否需要根据步骤类型动态生成（如搜索步骤 vs 分析步骤）
- **Deferred to implementation:** 前端 WsServerMessage 类型更新是否需要同步修改 chat store 的事件处理逻辑

---

## Sources & Research

- `src/agentkit/core/react.py` — ReActEngine 完整实现
- `src/agentkit/core/plan_exec_engine.py` — PlanExecEngine 和 _LLMStepAgent
- `src/agentkit/experts/orchestrator.py` — TeamOrchestrator mock 实现
- `src/agentkit/experts/team.py` — ExpertTeam 和 SharedWorkspace
- `src/agentkit/core/shared_workspace.py` — SharedWorkspace API
- `src/agentkit/orchestrator/reflection.py` — PipelineReflector / PipelineReplanner
- `src/agentkit/core/goal_planner.py` — GoalPlanner
- `src/agentkit/core/protocol.py` — TaskMessage / TaskResult 协议
- `src/agentkit/server/routes/chat.py` — Chat WebSocket 和 emit_team_event
