Files
JARVIS/development-doc/plan/code-update/phase-3-agent-integration.md

163 lines
3.8 KiB
Markdown
Raw 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.
# Phase 3Agent 集成
日期2026-04-04
状态:待实施
依赖Phase 1 + Phase 2 完成
---
## 1. 本阶段目的
将代码指挥官接入 LangGraph
- Graph 节点
- 边路由
- 任务模型
---
## 2. 详细任务
### 2.1 Graph 节点
**文件**: `backend/app/agents/graph.py`
```python
# 新增 code_commander_node
async def code_commander_node(state: AgentState) -> AgentState:
"""代码指挥官节点"""
# 1. 获取用户需求和选择的 AI 提供商
user_message = state.messages[-1].content
ai_provider = state.get("ai_provider", "claude")
# 2. 安全分级
classifier = SecurityClassifier()
risk_level = classifier.classify(user_message)
# 3. 根据风险等级选择执行器
adapter = get_adapter(ai_provider)
if risk_level == RiskLevel.LOW:
executor = DirectExecutor(adapter)
result = await executor.execute(user_message)
else:
sandbox = await SandboxEnvironment.create()
executor = SandboxExecutor(adapter)
result = await executor.execute(user_message, sandbox.session_id)
state["workspace_path"] = str(sandbox.workspace_path)
state["execution_session_id"] = sandbox.session_id
# 4. 更新状态
state.messages.append(AIMessage(content=str(result)))
state["next_step"] = None # 任务完成
return state
# 节点注册到 NODES
NODES: dict[str, NodeCallable] = {
# ... 现有节点 ...
"code_commander": code_commander_node,
}
```
### 2.2 边路由
**文件**: `backend/app/agents/graph.py`
```python
def _should_route_to_code_commander(state: AgentState) -> str:
"""判断是否路由到代码指挥官"""
if state.current_agent == "code_commander":
return "code_commander"
# ... 其他条件
return END
# 边注册
def _build_graph() -> CompiledGraph:
# ... 现有边 ...
# 新增代码指挥官相关边
graph.add_conditional_edges(
"master",
_should_route_to_code_commander,
{
"code_commander": "code_commander",
END: END,
}
)
graph.add_edge("code_commander", END)
return graph.compile()
```
### 2.3 任务模型
**文件**: `backend/app/agents/schemas/task.py`
```python
from pydantic import BaseModel, Field
from typing import Literal
class CodeProviderType(str, Enum):
CLAUDE = "claude"
GEMINI = "gemini"
CODEX = "codex"
OPENCODE = "opencode"
class RiskLevelType(str, Enum):
LOW = "low"
HIGH = "high"
class CodeTask(BaseModel):
"""代码任务"""
id: str = Field(default_factory=lambda: f"code_{uuid.uuid4().hex[:8]}")
provider: CodeProviderType
prompt: str
risk_level: RiskLevelType
sandbox_mode: bool
workspace_path: str | None = None
session_id: str | None = None
status: Literal["pending", "running", "completed", "failed"] = "pending"
created_at: datetime = Field(default_factory=datetime.now)
class CodeExecutionResult(BaseModel):
"""代码执行结果"""
task_id: str
success: bool
exit_code: int
stdout: str
stderr: str
files_created: list[str] = Field(default_factory=list)
workspace_path: str | None = None
completed_at: datetime = Field(default_factory=datetime.now)
```
---
## 3. 核心文件清单
| 文件 | 操作 | 说明 |
|------|------|------|
| `graph.py` | 修改 | 新增 `code_commander_node` 和边路由 |
| `schemas/task.py` | 修改 | 新增 `CodeTask`, `CodeExecutionResult` 等模型 |
---
## 4. 验收标准
- [ ] `code_commander_node` 正确处理任务
- [ ] `SecurityClassifier` 被正确调用
- [ ] 高低风险任务路由到正确的执行器
- [ ] `CodeTask``CodeExecutionResult` 模型正确
---
## 5. 依赖关系
```
Phase 1 + Phase 2
本阶段 → Phase 4流式交互
→ Phase 5前端集成
```