Replies: 2 comments
|
UI 里切模型不会回写已有子 agent,也不会改父 agent 的创建快照。 先能用的绕法:切完模型后 新开一条会话 再 spawn / fork;这条旧会话里已经失败的子 agent 不要重试。禁用 |
|
这里有一个已经端到端验证的立即可用方案,针对的正是“Web/TUI 已切换当前模型,但新子代理仍读父 Agent 创建时快照”这条链。它是 Pi 插件子代理路线,不是对 DSH 原生 subagent 的源码修复: dsh plugin --profile <你的-profile> add pi2dsh
dsh plugin --profile <你的-profile> add @tintinweb/pi-subagents新子代理未显式指定模型时,pi2dsh 读取父会话持久日志最后一条真实 stock TUI + 真模型 E2E 已验证:父会话从官方线切到 |
Uh oh!
There was an error while loading. Please reload this page.
现象
在 Web UI 中切换模型后,父 agent 派生的 in-process 子 agent 并没有使用当前选中的模型,而是使用父 agent 创建时记录的模型。我这次 7 个子 agent 全部因此启动失败,报
UNKNOWN_MODEL,并且它们用的 provider/model 甚至是我 settings 里从未配置过的kimi-k3。复现
一次 Web 会话,期间在 UI 里切换过 3 次模型。session 日志中父 agent 的
request/header:在最后这个 turn 里,父 agent 通过
tool-subagent(provider: spawn)派生了 7 个子 agent。每个子 agent 的subagent/descriptor都记录:所有 7 个子 agent 的
turn/end均为:两点异常:
deepseek-official,子 agent 仍走packyai。kimi-k3在本部署的 settings 里从未配置过,像是某处残留的 stale default。根因(源码定位)
packages/host/apiproxy/src/api-proxy.ts:1081— 顶层 agent 创建时的agentOptions()读defaults.defaultModelSelection(),该值成为parent.options的创建期快照。packages/host/apiproxy/src/api-proxy.ts:2247-2261— UI 切模型只更新会话级ModelSelectionRef并尝试持久化 default;持久化失败被logger.warn吞掉,不 throw,parent.options也不更新。packages/subagent/subagent/src/continuation.ts:413-414— 子 agent descriptor 构造:当
tool-subagentrow 未显式配agentOptions时,回退到parent.options—— 即那份创建期快照,不跟随 UI 切换。若中途
saveDefaultModelSelection失败,后续agents.create拿到的 default 甚至可能是当前 settings 里根本不存在的值(如本例kimi-k3),现象就是"stamped 了一个 settings 从未出现过的模型"。影响
session.jsonl才能看到 descriptor 里错位的 provider/model。修复
continuation.ts构造 descriptor 时,先读父 agent 的当前 selection(通过ctx.agentDefaultModel.currentSelection()或安装在parent.ctx上的ModelSelectionRef),再回退到parent.options。parent.options(或改成 live ref),消除"创建期快照"这个概念。saveDefaultModelSelection失败不宜仅作 warn 吞掉 —— 它是后续agents.create拿 default 的唯一来源,失败会直接产生"stamped 了 settings 里没有的模型"这种诡异状态。All reactions