Repository navigation
v2.6.0 — 子代理失败可兜底,也能自己选模型
model-failover-manager v2.6.0
本版修掉「子代理模型一失败就整轮中断」,并让子代理像普通会话一样能选模型、绑分组。
一、子代理失败后能兜底续跑
根因在宿主:sessionController.selectModel 对 origin: 'subagent' 的会话一律硬拒(session/agent-busy,owned by subagent routing)。插件原来的失败路径要换模型就得调它,于是 applyActiveModel 返回 false,失败处理不再返回 {kind: 'retry'},那一轮直接结束。
现在子代理换模型绕开该接口:插件只记录目标模型并写一条 model/selection 会话事件,真正生效由 agent/request 覆写请求,重试时仍走同一条路径。失败后正常返回重试,按继承来的分组切到下一个可用模型。
二、子代理可以选中模型 / 绑定分组
- 子代理会话的模型位不再置灰,可选模型、可绑分组;
- 子代理自己绑的分组标记为「显式」,优先于继承来的父会话分组;
- 这类绑定不改写「新会话默认分组」,不会污染父会话或其他新会话;
- 新增两个接口:
GET /api/model-failover/session-info(返回生效分组、继承来源、当前覆盖模型)与POST /api/model-failover/session-model(直接设置某会话的模型)。
三、修复绑定持久化丢失标记
session-bindings.json 写入时丢了「显式」标记,重启后用户给子代理选的绑定会退化成继承。现在该字段随绑定一起落盘,旧数据无此字段时按「非显式」处理,因此早期版本误写进子代理的默认分组绑定依旧被忽略。
四、包体积
files 里仍列着历代宿主模块,每次发版都多带六份没人加载的副本。现在 tarball 只含当前宿主模块,66 KB → 44 KB;历史文件留在仓库里供回溯。
升级注意
- 宿主半文件名改为
host.v7.mjs:Loader 在 patch 行变化时只重新 apply,模块 URL 未变就沿用缓存,改文件名才能确保加载新代码。package.json的main/exports已同步,dsh plugin add安装的包不受影响。 - 配置项、数据文件格式、
engines.dsh均无变化。
验证
node .offline-check.mjs 用假 ctx 直接跑监听器与 HTTP 处理器,9 项全通过,其中三条对应本版关键路径:子代理设模型不调用 selectModel、子代理彻底失败后返回重试、新子代理沿用父会话当前模型。线上另用 /debug/sessions 与 /session-info 核对:活子代理 ownBinding 为空、inherited: true、覆盖模型落在继承分组内。
资产
model-failover-manager-2.6.0.tgz —— npm pack 预构建包,免源码构建安装。
安装
dsh plugin add https://github.com/liaoyuqing/model-failover-manager