Skip to content

[BUG][P1] 独立 ReAct 应执行成功模型轮次实际披露的工具绑定 #269

Closed

Description

@Aias00

已确认问题

独立 ReAct 在进入拦截器链前解析 availableTools。拦截器可以通过 ModelRequest.toolRegistry(...) 替换调用级工具,模型请求使用替换后的声明,但返回 ToolCall 后的执行仍使用链前的 availableTools。相同名称可以因此对应不同实现,实际执行偏离已披露的绑定。

代码:https://github.com/agentic-ai-java/argi/blob/b34835354b27f1f320ea8438edf2e9d170e69c84/argi-agent/argi-agent-core/src/main/java/io/github/agentic/ai/agent/react/ReActAgent.java#L319;https://github.com/agentic-ai-java/argi/blob/b34835354b27f1f320ea8438edf2e9d170e69c84/argi-agent/argi-agent-core/src/main/java/io/github/agentic/ai/agent/react/ReActAgent.java#L333;https://github.com/agentic-ai-java/argi/blob/b34835354b27f1f320ea8438edf2e9d170e69c84/argi-agent/argi-agent-core/src/main/java/io/github/agentic/ai/agent/react/ReActAgent.java#L379。

最小复现场景与证据

  1. 注册原始 lookup 工具 A,执行时递增 original。
  2. 拦截器用只包含同名工具 B 的 ToolRegistry 替换 ModelRequest,B 执行时递增 replacement。
  3. 假模型第一轮返回 lookup 调用,第二轮返回最终回答。

实际:original=1, replacement=0;期望:original=0, replacement=1。此场景无需真实模型或外部工具。

交付与验收

  • 为成功模型轮次保留最终有效的可执行绑定,工具声明、参数校验、执行与上下文补丁使用同一份绑定。
  • retry/fallback 修改注册表时,以实际成功的请求对应绑定为准,不复用失败尝试或其他调用的工具。
  • 同名替换执行 B;新增动态名称能执行;被移除名称不能回退执行 A。
  • 覆盖同名但不同 schema/实现、顺序多轮、并发运行、冷流多次订阅和流式工具调用。
  • 保留当前可信上下文授权检查;修复不能通过放宽授权或用全局可变注册表实现。

关联与范围

关联 #196、#191。工具筛选/动态披露另行跟踪;本单聚焦“模型实际看到的声明”和“运行时实际执行的实现”一致,不要求引入 Graph 的配置或节点绑定机制。

验证基线与变更约束

审阅基线:Core b34835354b27f1f320ea8438edf2e9d170e69c84 / Extensions cb2635ab2fc338e8aade28a132a15f48b4e655fc。以下为离线 stub、独立 Java 探针或候选工件编译验证的结果,不代表真实模型、外部服务或生产环境验收。

修复保持独立 ReAct/Workflow 不依赖 Graph/Loop,不向 Core 引入供应商 SDK。优先修正现有契约的执行行为;确需改变公开 API、配置或定义格式时,说明较小替代方案、收益、消费者影响、目标版本与迁移方式。不得以跳过测试或删除能力换取通过。

配套缺陷

#268

Activity

  1. konlue commented on Nov 1, 2026

    @konlue
    Contributor

    您好,我想认领 #269。

    现状分析(#333 已合并,main cfe40bd):#333 的生效工具集回传通道已覆盖本票的主场景——拦截器经 ModelRequest.toolRegistry(...) 换入的 registry 会进入 effectiveToolSet 的计算结果并回传执行侧,issue repro 的同名替换(original=1/replacement=0)在当前 main 上已不可复现;跨 turn 无残留(每 turn 重建局部引用)。

    残余缺口:issue 验收条件要求的六个行为测试场景(同名替换执行 B / 新增动态名可执行 / 被移除名不回退执行 A / 多轮次序 / 流式工具调用 / 并发无泄漏)在 ReActAgentTest 中一个都不存在——正确行为没有被测试锁定;retry/fallback 多 attempt 下「实际成功轮次的绑定」语义也未证明。

    方案(单 PR):补齐 AC 测试套件(ScriptedClient 离线模式,含 issue repro 的 original/replacement 双计数用例与 fallback 多 attempt 的绑定归属用例);若测试暴露残余缺口(如多 attempt 回写时序),在测试红的基础上修复。重名策略沿用 #333 的静态优先遮蔽,授权检查与未知工具错误路径不动。

  2. added a commit that references this issue on Nov 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions