DSH Plugin Store
Back to home

SnowAmberX

dsh-role-router

Role-based model routing plugin for DeepSeek Harness: planner/subagent roles plus a settings card and composer summary

Stars
0
Language
TypeScript
Created
Aug 14, 2026
Updated
Aug 14, 2026
Other
GitHub repo

Introduction

中文 | English

多角色模型路由插件(dsh-role-router)

还在为计划与执行阶段手动切换模型而烦恼?dsh-role-router 替你自动完成:输入 /plan 进入计划模式,请求即自动路由到配置的 planner 模型;退出计划模式自动切回默认模型——全程无需手动干预。

  • 角色路由default / planner / subagent 三种角色独立配置——配置了强制使用该模型,未配置则跟随官方模型选择器planner 由计划模式(/plan 等)自动触发。
  • Web UI:设置页「多角色模型路由」卡片提供三个模型下拉框(并可单独指定推理强度),选项与 /model 同源(host 实时模型目录,provider 分组,自动刷新);composer 旁附模型摘要胶囊,当前选择一目了然。
  • 两级配置:支持 cordis.yml(composition 层)与 role-router settings 命名空间(用户层,后者优先);保存即生效,无需重启。

预览

主界面与 composer 模型摘要

设置页中的多角色模型路由卡片

路由语义

每次模型请求按角色路由,监听器注册在根上下文(同时覆盖主代理与所有进程内子代理):

角色请求范围模型来源
default默认模式下的主代理请求已配置 → 强制使用配置的模型;未配置 → 跟随官方选择器(composer / /model / agent-default-model)
planner计划模式(plan mode)下的主代理请求已配置 → 强制使用配置的模型;未配置 → 跟随官方选择器
subagent所有进程内子代理请求(任意嵌套深度)已配置 → 强制使用配置的模型;未配置 → 跟随官方选择器

切换模型时,若角色未配置显式 reasoningEffort,则剥离继承的 adapter-owned effort(目标模型可能不支持原模型的推理档位;prepareCall 会拒绝未受支持的显式 effort);配置了显式强度则写入并由 prepareCall 校验。未配置而跟随官方选择器时,保留官方的推理强度(reasoningEffort)。

计划模式状态从会话日志的 plan/mode 事件折叠(foldPlanMode);ctx.planMode 可见时优先读取(含 pending 意图)。

辅助模型调用(compaction、session-title)不经 agent/request 派发,不受影响;进程外子代理 provider(acp、codex 等)的请求不经过本进程,同样不受影响。

Web UI(client 半区)

插件声明了 dsh.client(platform: web),向 Web GUI 提供两处界面:

  1. 设置 → 插件配置 →「多角色模型路由」卡片:三个模型下拉框(默认模型 / planner / subagent),选项来自 host 实时模型目录(provider 分组,与 /model 同源,llm/adapters-updated 自动刷新);每个字段选中模型后还可单独指定推理强度,档位来自该模型在目录中的 reasoning.efforts(适配器声明,非硬编码)。
    • 三个角色字段(默认模型 / planner / subagent)都写入 role-router 设置命名空间,保存后下一请求即生效(无需重启);未配置的角色跟随官方模型选择器,配置了则强制使用所选模型。
  2. 会话输入框旁(composer):胶囊摘要显示 默认模型: <配置的 default 或当前会话选择> · planner: <配置的 planner 模型>。官方模型席位(下拉选择)与 /model 命令保持原样。

配置

cordis.yml(composition 层)

- id: model-router
  name: '@snowamberx/dsh-role-router'
  config:
    default:        # 可选;未配置时跟随官方选择器
      provider: deepseek-official
      model: deepseek-v4-flash
      reasoningEffort: high   # 可选;未配置时遵循目标模型默认
    planner:        # 可选
      provider: deepseek-official
      model: deepseek-v4-pro
      reasoningEffort: max    # 可选
    subagent:       # 可选
      provider: deepseek-official
      model: deepseek-v4-flash

未知键、空白 provider/model/reasoningEffort 在加载期直接报错(fail loud)。三个角色均为可选:未配置的角色跟随官方模型选择器(agentDefaultModel.currentSelection()),配置了则强制使用。

settings(用户层)

role-router 命名空间:{ default?, planner?, subagent? },每个角色为 { provider, model, reasoningEffort? }。设置文档值优先于 composition 层。

安装

dsh plugin --profile web add @snowamberx/dsh-role-router
# 本地开发:
dsh plugin --profile web add link:/path/to/this/repo

重启 dsh web 后生效(client-modules 的包元数据在重启时重新扫描)。

开发

pnpm install        # @deepseek-ai/* 运行时依赖由 harness checkout 软链提供(见下)
pnpm build          # tsc(host 半区 + 类型)+ tsdown(client bundle)
pnpm test           # vitest(host 路由集成测试 + 配置/分类单测)

@deepseek-ai/* 及 react/tsdown/lightningcss 等依赖通过 node_modules 软链指向 DeepSeek Harness checkout(与官方 profile 的 flat-fallback 机制一致),无需 npm 安装;tsconfig 开启 preserveSymlinks 使类型解析走同一平铺链。

已知限制

  • 模型目录是 advisory(adapter 可接受未列出的模型 id),下拉框只列出目录内模型。
  • composer 摘要仅显示 default + planner 两个角色(subagent 不在摘要范围)。
  • 设置页无当前会话时,卡片下拉框显示"打开会话后可加载模型列表"(目录经当前会话的 session.models RPC 获取,groups 本身是全局的)。
  • planner/subagent 配置的 provider 未注册 adapter 时,请求按 harness 常规路径报 NO_ADAPTER 轮次错误(响亮失败,不静默降级)。