【建议】子代理没有继承当前对话模型配置,错误调用其它模型产生意外扣费 #1358
问题现象我配置了两组 API Key:
在对话会话里,我手动选定使用 OpenCode‑Go 渠道的 deepseek‑v4‑flash,调用子代理进行代码审查。 使用场景同一个模型,对接多个不同服务商/中转渠道,希望子代理完全继承当前对话所使用的后端、密钥、模型参数,而不是回退到默认的官方配置。 期望行为子代理启动时,完整继承父对话的:
而不是回退使用全局默认或者第一个配置的密钥。 |
Replies: 1 comment
|
这个现象可以确认是当前子代理继承路径的问题,不是同名模型导致的正常路由选择。\n\n当前实现中,in-process driver 创建子代理时会调用 |
这个现象可以确认是当前子代理继承路径的问题,不是同名模型导致的正常路由选择。\n\n当前实现中,in-process driver 创建子代理时会调用
resolveChildAgentOptions(parent, request.agentOptions);该函数默认复制的是parent.options.provider、parent.options.model和parent.options.maxTokens:\n\n-resolveChildAgentOptions\n- in-process driver 的调用位置\n\n问题在于parent.options是父代理创建时的配置快照。Web UI 后续切换当前会话的 provider/model 时,实际请求可以已经走 OpenCode-Go,但创建时的快照仍可能是deepseek-official / deepseek-v4-flash。子代理继续读取这个旧快照,就会选中 DeepSeek 官方 route,并使用该 route 对应的 Key。即使两个渠道的模型名相同,provider不同也足以产生你看到的扣费。\n\n这与 #1581 报告的是同一根因;该讨论也已有 current master 上的复现和测试补丁。正确修复方向应是:创建子代理时优先继承父会话最近一次有效request/header中的 provider/model,创建快照只作为父会话尚未发出请求时的 fallback;显式的 child override 再保持最高优先级。\n\n在官方修复进入发行版之前,建议先这…