🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

自动推理路由 prgrmrwy/dsh-auto-model-routing

DeepSeek Harness
prgrmrwy8 天前有提交已提供中文文档扫描:含敏感能力

按每轮任务难度自动调整推理强度,不换模型

30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/24 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add prgrmrwy/dsh-auto-model-routing
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · security
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 8 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/24) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 39 处,展示前 38 条)
  • 读取本地文件
    eval/live.mjs:5
    const questions = JSON.parse(readFileSync(new URL('../src/rubric.json', import.meta.url)))
  • 读取本地文件
    eval/live.mjs:6
    const cases = JSON.parse(readFileSync(new URL('./cases.json', import.meta.url)))
  • 读取本地文件
    eval/live.mjs:9
    assert(!existsSync(output), 'Result file already exists; refusing duplicate paid execution')
  • 读取密钥环境变量
    eval/live.mjs:10
    const key = process.env.OPENROUTER_API_KEY
  • 请求外部主机openrouter.ai
    eval/live.mjs:12
    const meta = await fetch('https://openrouter.ai/api/v1/models/typesafe/jev-1.13/endpoints', { signal: AbortSignal.timeout(20_000), redirect: 'error' }
  • 发起网络请求
    eval/live.mjs:12
    const meta = await fetch('https://openrouter.ai/api/v1/models/typesafe/jev-1.13/endpoints', { signal: AbortSignal.timeout(20_000), redirect: 'error' }
  • 写入本地文件
    eval/live.mjs:19
    const save = () => writeFileSync(output, JSON.stringify(report, null, 2), { mode: 0o600 })
  • 请求外部主机openrouter.ai
    eval/live.mjs:28
    const response = await fetch('https://openrouter.ai/api/alpha/decisions', { method: 'POST', redirect: 'error', signal: AbortSignal.timeout(20_000), he
  • 发起网络请求
    eval/live.mjs:28
    const response = await fetch('https://openrouter.ai/api/alpha/decisions', { method: 'POST', redirect: 'error', signal: AbortSignal.timeout(20_000), he
  • 读取本地文件
    src/feedback.ts:25
    try { text=readFileSync(file,'utf8') } catch(error) { if((error as NodeJS.ErrnoException).code==='ENOENT')return;throw error }
  • 写入本地文件
    src/feedback.ts:61
    private append(record:unknown){mkdirSync(dirname(this.file),{recursive:true});appendFileSync(this.file,JSON.stringify(record)+'\n',{mode:0o600})}
  • 写入本地文件
    src/feedback.ts:61
    private append(record:unknown){mkdirSync(dirname(this.file),{recursive:true});appendFileSync(this.file,JSON.stringify(record)+'\n',{mode:0o600})}
  • 发起网络请求
    src/jev.ts:71
    const response = await fetch(this.service ? service.endpoint : this.url, {
  • 写入本地文件
    src/policy-store.ts:39
    mkdirSync(this.directory, { recursive: true, mode: 0o700 })
  • 写入本地文件
    src/policy-store.ts:40
    writeFileSync(`${this.path(id)}.bound`, id, { flag: 'wx', mode: 0o600 })
  • 读取本地文件
    src/policy-store.ts:43
    try { if (readFileSync(`${this.path(id)}.bound`, 'utf8') !== id) throw new Error('绑定标记损坏'); return true }
  • 读取本地文件
    src/policy-store.ts:48
    const raw: unknown = JSON.parse(readFileSync(this.path(id), 'utf8'))
  • 写入本地文件
    src/policy-store.ts:66
    mkdirSync(this.directory, { recursive: true, mode: 0o700 }); chmodSync(this.directory, 0o700)
  • 写入本地文件
    src/policy-store.ts:66
    mkdirSync(this.directory, { recursive: true, mode: 0o700 }); chmodSync(this.directory, 0o700)
  • 写入本地文件
    src/policy-store.ts:68
    writeFileSync(temp, JSON.stringify(checked), { flag: 'wx', mode: 0o600 })
  • 写入本地文件
    src/policy-store.ts:69
    renameSync(temp, target)
  • 读取本地文件
    src/settings.ts:39
    try { raw = JSON.parse(readFileSync(this.path, 'utf8')) }
  • 读取本地文件
    src/settings.ts:69
    try { disk = JSON.parse(readFileSync(this.path, 'utf8')) } catch { disk = {} }
  • 写入本地文件
    src/settings.ts:72
    mkdirSync(directory, { recursive: true, mode: 0o700 }); chmodSync(directory, 0o700)
  • 写入本地文件
    src/settings.ts:72
    mkdirSync(directory, { recursive: true, mode: 0o700 }); chmodSync(directory, 0o700)
  • 写入本地文件
    src/settings.ts:75
    writeFileSync(temporary, `${JSON.stringify(persisted, null, 2)}\n`, { mode: 0o600, flag: 'wx' })
  • 写入本地文件
    src/settings.ts:76
    renameSync(temporary, this.path)
  • 删除本地文件
    src/settings.ts:79
    try { unlinkSync(temporary) } catch {}
  • 读取本地文件
    src/state.ts:26
    try { return stateSchema.parse(JSON.parse(readFileSync(this.path(id), 'utf8'))) as SessionState }
  • 写入本地文件
    src/state.ts:34
    mkdirSync(dirname(target), { recursive: true })
  • 写入本地文件
    src/state.ts:36
    writeFileSync(temporary, JSON.stringify(value), { mode: 0o600 })
  • 写入本地文件
    src/state.ts:38
    renameSync(temporary, target)
  • 读取本地文件
    src/usage-report.ts:51
    try { text = readFileSync(file, 'utf8') } catch { return [] }
  • 读取本地文件
    src/usage-report.ts:64
    try { dirs = readdirSync(root) } catch { return paths }
  • 读取本地文件
    src/usage-report.ts:67
    try { ids = readdirSync(join(root, dir)) } catch { continue }
  • 读取本地文件
    src/usage-report.ts:68
    for (const id of ids) { const file = join(root, dir, id, 'session.v4.jsonl.zstd'); if (existsSync(file)) paths.set(id, file) }
  • 读取本地文件
    src/usage-report.ts:76
    try { decoded = decode(readFileSync(file)) } catch { decoded = undefined }
  • 读取本地文件
    src/usage-report.ts:282
    try { stateFiles = readdirSync(join(state, 'sessions')).filter(f => f.endsWith('.json')).sort() } catch { }
扫描于 2026/10/31(1 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
涉及外部主机:openrouter.ai

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-loop@deepseek-ai/dsh-api-session-controller@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-ui-chat@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-credentials
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 插件:用 Jev 按轮调整推理强度,不用切换已选模型,子代理路由可配置

README

由 DeepSeek 最新模型翻译生成
dsh-auto-model-routing English · 简体中文 AUTO 实际效果:「重构并调试」被判为 complex,用 high;随后的「改个名」被判为 simple,降到 low;悬停 AUTO 芯片查看判档,点击切到 MANUAL 不必每条消息都手动调高或调低推理强度。AUTO 下,每个用户回合由 Jev 决策模型(经 OpenRouter)判为 simple / standard / complex / escalated,插件只调整你已选模型的推理强度,不换 provider 和模型。Jev 任何失败都会让 AUTO 自动停用,芯片上显示原因。 安装:DSH 0.2.0-rc.2,Node.js >=22.19。 dsh plugin --profile web add dsh-auto-model-routing 或从源码安装(出现提示时批准本地构建): dsh plugin --profile web add prgrmrwy/dsh-auto-model-routing 重启 DSH、刷新页面,再到设置 → 自动模型路由配置 OpenRouter key。配套 skill 已包含,提供委派指引,但不强制拦截每次派发。与模型池路由或本地分类器不同,本插件用外部 Jev 判档,始终不换主模型。
展开完整文档(README 剩余 1 节)
dsh-auto-model-routing

English · 简体中文

AUTO 实际效果:「重构并调试」被判为 complex,用 high;随后的「改个名」被判为 simple,降到 low;悬停 AUTO 芯片查看判档,点击切到 MANUAL

不必每条消息都手动调高或调低推理强度。AUTO 下,每个用户回合由 Jev 决策模型(经 OpenRouter)判为 simple / standard / complex / escalated,插件只调整你已选模型的推理强度,不换 provider 和模型。Jev 任何失败都会让 AUTO 自动停用,芯片上显示原因。

安装:DSH 0.2.0-rc.2,Node.js >=22.19。

dsh plugin --profile web add dsh-auto-model-routing
或从源码安装(出现提示时批准本地构建):
dsh plugin --profile web add prgrmrwy/dsh-auto-model-routing

重启 DSH、刷新页面,再到设置 → 自动模型路由配置 OpenRouter key。配套 skill 已包含,提供委派指引,但不强制拦截每次派发。与模型池路由或本地分类器不同,本插件用外部 Jev 判档,始终不换主模型。演示来自隔离 Host,使用本地模拟的 Jev 和模型响应。

在 ohmydsh 中只需启用 local auto-model-routing 条目并运行 dsh build,不再单独启用 skill 条目。

使用

| 位置 | 操作 |
| AUTO / MANUAL 芯片(模型选择器左侧) | 点击切换;悬停查看本回合 effort、最近一次 Jev 决策及其分布 |
| 判档提示 | 每次判档后在芯片上方显示 3 秒,例如 complex → high · 0.70s |
| 回复下方的仪表按钮 | 悬停看判档,点击标注「这轮应该用哪档」 |
| 设置 → 自动模型路由 | OpenRouter key、默认模式、强度上限、判档等待上限、提示开关、路由映射(见下图) |

设置 → 自动模型路由:判档服务、会话默认值,以及 Claude / GPT 分页下每档的主会话推理等级与子会话推荐

缺省强度:从各模型的官方推荐起点出发。standard 取起点,simple 降一级,complex 升一级,escalated 升两级;受上限约束(缺省 xhigh),AUTO 永不选 max。路由映射可逐格覆盖:主会话等级作用于同体系所有模型,子会话格为完整的 model + effort。

子会话:route_subagent 工具用同一套判档,返回 provider/model/effort(Claude:Haiku → Sonnet → Opus → Opus;GPT:Luna → Sol → Sol → Sol)。只有根会话为 AUTO 时才判档,否则返回 routed: false。这些路由须在官方子智能体允许列表中,该列表在会话创建时固定。

须知

- 新会话缺省 MANUAL,可在设置中改。
- 失败即关闭:无 key、余额不足、限流、地区受限、超时或响应无效时,会话切到 MANUAL · Jev 停用 并显示原因,点 AUTO 重试。没有本地降级,也不重试。
- MANUAL 只停止调整:会话保持 AUTO 最后设定的 effort。AUTO 也会把它写入官方模型选择,所以新会话会从这个值开始。
- 外发数据:AUTO 下每个用户回合会把你的消息(最多 8000 字符)和上一轮的少量片段发给 OpenRouter / TypeSafe(typesafe/jev-1.13)。外发前先按形态脱敏(密钥、token、URL 凭据、IP),这是尽力而为,不保证去掉所有敏感信息。
- key 经官方 DSH 凭据服务保存,不写进插件配置。启动环境里的 OPENROUTER_API_KEY 优先且只读;要迁到 GUI,先从启动环境删掉它,重启一次,再在设置页保存。
- 文件:设置在 $DSH_HOME/plugins/dsh-auto-model-routing/config.json;每个会话的模式与判档记录在 $DSH_HOME/state/auto-model-routing/。改动在下一次请求生效,无需重启。

架构

auto-model-routing 架构图:芯片与 RPC 端点、agent/pre-step 钩子经 OpenRouter 请求 Jev、agent/request 钩子只改推理强度、route_subagent 工具共用同一判断

agent/pre-step 钩子在每个用户回合的第 1 步判档;随后以 prepend 注册的 agent/request 钩子只改写 reasoningEffort,并同步到官方模型选择。入口 src/index.ts,判档规则 src/rubric.json,强度表 src/effort.ts,界面 src/client/,回归用例 eval/,图源 docs/architecture.json(archify)。

开发验证

npm test
npm run typecheck
npm run build

测试使用真实 AgentLoop、假 LLM 流和本地回环假 Jev,不访问 OpenRouter。node scripts/label-report.mjs 按规则版本汇总你的档位标注。

规范与设计:当前规范见 openspec/specs/auto-model-routing。归档 change 记录了设计演进:路由(决策 D1–D14)与设置。配套 skill 见 skills/subagent-model-routing。修改钩子前先读 DSH 插件集成陷阱。

移除

运行 dsh plugin --profile web remove dsh-auto-model-routing,重启 DSH 并刷新页面;ohmydsh 则设为 enabled: false 并构建。插件提供的 skill 与工具一并撤销,设置和日志保留。会话保持 AUTO 最后设定的 effort,直到在模型选择器里另选。
预览分享卡片长什么样 ↓prgrmrwy/dsh-auto-model-routing
分享 · DeepSeek Harness Hub
prgrmrwy/dsh-auto-model-routing

按每轮任务难度自动调整推理强度,不换模型

回到顶部