## 已确认问题 `ModelRequest.getChatClient()` 明确用于拦截器的可选客户端覆盖,包括 fallback。独立 ReAct 的非流式调用直接使用构建时 `chatClient.call(...)`,流式入口同样使用固定客户端,忽略了请求内选定的客户端。模型路由或 fallback 不能可靠切换目标。 代码: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#L384;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#L400。 ## 最小复现场景与证据 1. 为客户端 A/B 分别记录调用次数,两者均可返回正常假响应。 2. 使用 A 构建 ReAct,在拦截器中将请求改为 `ModelRequest.builder(request).chatClient(B).build()` 后交给 next。 3. 调用 Agent。 实际 `primary=1, selected=0`;期望 `primary=0, selected=1`。这证明客户端覆盖本身失效,不依赖远端故障或流式切换时机。 ## 交付与验收 - [ ] 存在显式覆盖时使用请求中的客户端,否则使用 Agent 默认客户端。 - [ ] 非流式和流式遵循相同选择规则,取消必须绑定实际选中客户端的在途操作。 - [ ] 覆盖默认、显式路由、A 失败后 B 成功、所有候选失败、并发调用和流式调用。 - [ ] 保留选中请求的消息、工具、选项和用量归集;已有请求能力预检适用时针对实际客户端执行。 ## 关联与范围 关联 #196、#209、#210。本单修复请求级客户端选择;不重复 #210 的“流式首事件前后能否安全 fallback”设计,不新增路由控制平面。 ## 验证基线与变更约束 审阅基线:Core `b34835354b27f1f320ea8438edf2e9d170e69c84` / Extensions `cb2635ab2fc338e8aade28a132a15f48b4e655fc`。以下为离线 stub、独立 Java 探针或候选工件编译验证的结果,不代表真实模型、外部服务或生产环境验收。 修复保持独立 ReAct/Workflow 不依赖 Graph/Loop,不向 Core 引入供应商 SDK。优先修正现有契约的执行行为;确需改变公开 API、配置或定义格式时,说明较小替代方案、收益、消费者影响、目标版本与迁移方式。不得以跳过测试或删除能力换取通过。
Activity
hengyuss commentedon Nov 3, 2026
我想尝试解决这个问题~