Skip to content

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

@wynxing

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions