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

3.8 KiB
Raw Blame History

Phase 3Agent 集成

日期2026-04-04 状态:待实施

依赖Phase 1 + Phase 2 完成


1. 本阶段目的

将代码指挥官接入 LangGraph

  • Graph 节点
  • 边路由
  • 任务模型

2. 详细任务

2.1 Graph 节点

文件: backend/app/agents/graph.py

# 新增 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

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

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 被正确调用
  • 高低风险任务路由到正确的执行器
  • CodeTaskCodeExecutionResult 模型正确

5. 依赖关系

Phase 1 + Phase 2
       ↓
本阶段 → Phase 4流式交互
       → Phase 5前端集成