我让DSH自己解决模型路由问题,待验证:
DSH 模型路由分裂问题 — 总结一、问题描述现象:用户在 DSH Web 界面选择了 opencode-go provider + deepseek-v4-flash 模型,但: - 子代理仍使用 deepseek(deepseek-official)provider 的 dsv4-flash
- web_search 同样固定走 deepseek-official,绕过用户选择的模型
影响:主代理、子代理、search 三者的请求分别落到不同的 provider / 端点 / 协议 / API key → 各自独立的 prompt-cache 域 → 缓存命中率低、token 成本与延迟上升。 二、根因(已从源码 + 实际 session 日志双重确认)根因 1:子代理继承"创建时冻结的模型快照"- 主代理创建时 agentOptions() 把当时的默认模型快照进 agent.options
- UI 切换模型(selectModel)只更新 session 级选择(selectionFor(...).current = picked),不更新 agent.options
- 子代理经 resolveChildAgentOptions(parent, ...) 继承的是 parent.options(旧快照)→ 分裂
- 关键时序:session 创建后再切换模型即触发;若创建时默认已是 opencode-go 则一致(本机当前 4 个 session 恰好如此,所以未复现,但代码路径确实存在缺陷)
根因 2:web_search 写死 deepseek-official 并绕过 ctx.llm- dsh-base/cordis.patch.yml 硬编码 searchProvider: deepseek-official + DEEPSEEK_API_KEY
- dsh-web-search-deepseek 源码明确:"不使用 ctx.llm",固定走 api.deepseek.com/anthropic/v1 + deepseek-v4-flash
- 与对话完全不同的端点/协议/key → 缓存域完全不同,且完全无视用户模型选择
三、解决方案与当前状态✅ 已完成并验证① 本地补丁(D:\AI工作区\dsh-fixes\)— 已应用到 node_modules,需重启 DSH 生效 文件 修复
fix-dsh-model-route.patch统一 diff(3 个文件)
apply-patch.ps1 / apply-fix.mjs一键应用/回滚(幂等),rollback→apply 循环已测试通过
README.md / upstream-issue.md说明文档 + 上游 issue 全文
补丁内容: - dsh-subagent:resolveChildAgentOptions 优先继承父代理当前实际路由(session.requestHeader()?.config),回退到快照
- dsh-host-apiproxy:selectModel 切换时同步更新 agent.options
- dsh-web-search-deepseek:search 模型名跟随 agentDefaultModel + 支持 DEEPSEEK_SEARCH_MODEL 环境变量
② MCP 网关(D:\AI工作区\dsh-model-gateway-mcp\)— 开发完成、测试全过 统一的模型路由 MCP 服务器(Node.js + MCP SDK 1.30),四个工具: - chat_completion — 统一模型调用入口
- web_search — 跟随 provider(anthropic 路由用原生 web_search_20250305;openai 路由用外部检索 + 同路由回答)
- get_route / list_models — 路由诊断
③ 随 DSH web 自动启动 — 已配置 - 已写入 %USERPROFILE%\.dsh\profiles\web\cordis.patch.yml(patch 层每次启动应用 → MCP 随 DSH 自动拉起、崩溃自动重连)
- 工具注册在 global layer → 主代理 + 子代理都可见
- 关键修正:API key 由网关自动从 ~/.dsh/.credentials.yaml 读取(DSH 会 scrub 子进程环境,env 传 key 无效),实测读取成功
- 12 项冒烟测试 + 模拟 DSH spawn 测试全部通过
四、待办 / 边界事项 状态
重启 DSH 使补丁 + MCP 挂载生效待用户重启
提交上游 issue已备好 upstream-issue.md;GitHub 禁用密码认证,需 PAT token 或手动粘贴
升级 DSH 后重打补丁.\apply-patch.ps1 apply
"每次必走路由"的强保证MCP 工具是模型可选调用;根治需上游把 web_search 接入 ctx.llm(已写入 issue 建议)
五、一句话总结问题属实:DSH 存在两条独立的模型路由分裂缺陷(子代理继承冻结快照 + search 写死 deepseek-official),导致缓存命中率低;已通过「node_modules 补丁修内部继承链 + MCP 网关提供统一路由入口并随 DSH 自动启动」双层方案解决,全部代码已本地验证,只差重启 DSH 生效。
|