Skip to content

【实现】 Agent Loop 重构 Phase 2:提取统一 AgentLoop 执行内核 #724

Description

@wynxing

关联 RFC / 架构

目标问题

主 Agent 的 Service.RunruntimeSubAgentEngine 各自实现 provider 调用、工具回灌、消息窗口和终止逻辑。两套循环造成预算、compact、usage、stream、权限和错误语义不一致,也使后续 Workflow 节点无法复用同一执行内核。

实现设计(How)

  • 提取 AgentLoop.RunNode(ctx, NodeExecutionInput),只负责单个节点内的 ReAct 闭环。
  • NodeExecutionInput 明确 Workflow snapshot、NodeSpec、PromptBundle、模型选择、能力、预算和可选 ResumeState。
  • NodeExecutionResult 返回结构化输出、Artifact drafts、usage、tool receipts、transcript revision 和终止分类;不直接推进 DAG。
  • 收敛 Context build、tool spec、request freeze、estimate、budget、Generate、stream accumulation、tool execution、result 回灌、compact 和 repeat-cycle。
  • 主 Run 先通过兼容 adapter 调用 AgentLoop;子 Agent Worker 改为同一 AgentLoop,不保留第二套 provider/tool loop。
  • 所有工具继续通过 Tool Manager;节点能力由调用方注入,AgentLoop 不自行扩大权限。
  • 保留现有 Provider 类型和厂商错误映射,不把节点概念泄漏进 adapter。

影响模块:internal/runtime、现有 subagent engine、streaming、budget/compact adapter 和测试夹具。

边界与非目标:本阶段不实现 Workflow Scheduler、Router/Planner、Artifact 持久化提交或 Event v5;目标是行为等价地收敛执行内核。

任务拆解

  • 定义 AgentLoop、NodeExecutionInput/Result、NodeCapability、NodeBudget 和终止分类。
  • 抽取单次 provider attempt 与 stream 累积适配。
  • 抽取发送前 estimate、budget、proactive/reactive compact 闭环。
  • 抽取工具批次执行、权限等待、tool result 回灌和 receipt 生成。
  • 接入主 Run adapter,并通过现有 runtime 测试验证行为等价。
  • 接入子 Agent Worker,删除其重复 provider/tool loop。
  • 统一取消、max turns、repeat cycle、usage reconcile 和错误包装。
  • 为测试提供 fake Provider、fake Tool Manager、fake Context 与 deterministic transcript fixture。
  • 更新 Runtime Provider Event Flow 和 compact 文档。

测试与验证(Done)

  • 正常路径:纯文本完成、单工具、多工具、多轮工具回灌、stream usage 和结构化节点输出。
  • 边界条件:空 assistant、usage 缺失、工具列表为空、最大轮数、重复签名和输出契约修正。
  • 异常分支:estimate、provider、stream、tool、permission、save、compact 和 context cancellation 错误。
  • Budget:proactive compact、reactive compact、gateable stop、advisory allow 与重试上限保持现有语义。
  • 主/子一致性:同一 fixture 经主 adapter 与子 Worker 产生相同 tool/usage/termination 结果。
  • 安全性:只读能力下写工具不可见或被拒绝,CapabilityToken 不能被子节点扩大。
  • 【实现】 Agent Loop 重构 Phase 0:建立任务质量评测基线与迁移护栏 #722 评测基线无不可解释回归,go test ./... 通过且新增修改逻辑达到 100% 覆盖目标。

风险与回滚

  • 风险:抽取过程中改变消息持久化或事件时序。先通过 adapter 保留现有外部时序,并逐分支迁移。
  • 风险:统一接口被设计成新的大对象。接口只携带节点执行必要事实,编排状态留在 Orchestrator。
  • 回滚:主 Run adapter 可切回旧内部函数;子 Agent 分支可独立回退。完成行为等价验收前不删除旧实现。

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions