dsh-adaptive-model-router
Deterministic per-turn adaptive model routing for DeepSeek Harness
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 24, 2026
- Updated
- Aug 24, 2026
Introduction
dsh-adaptive-model-router
Deterministic per-turn adaptive model routing for DeepSeek Harness. Simple work uses an economy model; complex work and turns that stop making progress upgrade to a quality model.
The router does not call another model to classify the request. Routing is local, synchronous, reproducible, and adds no tokens or provider requests.
The package targets and has been composed against DeepSeek Harness 0.1.1-rc.2.
Install
dsh plugin --profile web add github:icyaaaww/dsh-adaptive-model-router
The package ships runnable ESM JavaScript, so a GitHub installation requires no prepare build or pnpm build-script allowance.
For this local checkout, run from its parent directory:
dsh plugin --profile web add ./dsh-adaptive-model-router
Configuration
The included bundle defaults to DeepSeek Flash and Pro:
- id: adaptive-model-router
name: dsh-adaptive-model-router
config:
economy:
provider: deepseek-official
model: deepseek-v4-flash
quality:
provider: deepseek-official
model: deepseek-v4-pro
inputCharsThreshold: 1200
complexityKeywords: [architecture, migration, security, 架构, 迁移, 安全]
upgradeAfterStep: 2
upgradeAfterToolFailures: 1
failureExclude: [todo_write, job_output, job_list]
preserveUnknownSelection: true
Each route also accepts optional reasoningEffort and maxTokens. A selected route without reasoningEffort clears the previous model's effort so the selected adapter can apply its own default; an omitted route maxTokens preserves an explicit request limit. Temperature, stop sequences, and every other request field remain unchanged.
Routing behavior
At the first admitted step of each turn, the router selects Quality when the entering text reaches inputCharsThreshold or contains a configured case-insensitive keyword. Otherwise it selects Economy.
Within that turn routing has hysteresis: it may upgrade to Quality but never downgrade. It upgrades when either condition is met:
- The zero-based request step reaches
upgradeAfterStep. - Consecutive non-excluded tool failures reach
upgradeAfterToolFailures.
A successful tracked tool resets only the failure counter; it does not downgrade a turn already upgraded. A new turn starts a fresh decision and may return to Economy.
With preserveUnknownSelection: true, requests currently targeting neither configured route pass through unchanged. This keeps an explicit user selection, another provider, or a specialized vision model from being silently replaced. Set it to false only when this plugin should own every conversation request.
Model Experience
The router changes the logged request configuration and keeps the system prompt's provider and model template variables aligned with that route. It injects no prompt, tool, message, or hidden model-visible instruction. Existing request/header records make every route change durable and visible to replay, telemetry, and clients.
Token effect
The plugin itself adds zero tokens. Savings depend on how many requests move to the economy route and provider pricing.
KV cache effect
Changing provider or model starts a different provider cache identity. Per-turn hysteresis prevents oscillation inside one turn, while a new user turn may deliberately select a different route.
Test
npm test
Limitations
- Keyword and length rules estimate complexity; they do not measure answer quality.
- Tool failures produced by policy denial also count unless their tool is excluded.
- Already-running parallel tools can settle after the route has upgraded.
- The router does not verify model catalog membership; the selected provider owns availability diagnostics.
- Cost reporting is not included. Compare telemetry before and after deployment to tune thresholds.