PerryLink/dsh-autotier ↗★ 1

dsh-autotier

Automatic strong/cheap model-tier routing for DeepSeek Harness: intent-gated tier landing on the agent/request waterfall, plan-mode handoff (strong plans, cheap implements), deterministic high-risk guards on tools/pre-execute, failure escalation with TTL fallback, a /tier command, and tier status tools 适合需要根据任务意图和风险自动分流强弱模型以优化成本的用户。

패키지
dsh-autotier
호환성
미검증
Harness peer 범위
>=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0 || >=0.1.7-0 <0.2.0
Cordis peer 범위
^4.0.3
버전
0.2.8
라이선스
Apache-2.0
최근 업데이트
2026. 9. 25.

설치

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:PerryLink/dsh-autotier

Configuration

Every key is validated at load time; an invalid value fails loudly instead of silently disabling routing. cordis.patch.yml in this repository documents the same keys inline.

KeyDefaultMeaning
tiers.strong.providerdeepseek-officialProvider for the planning/review tier.
tiers.strong.modeldeepseek-v4-proCatalog id of the strong model.
tiers.strong.efforthighAdapter vocabulary off | low | high | max.
tiers.strong.followSessionfalsefalse = this tier's effort overrides the session's.
tiers.strong.fallback[]Ordered provider/model landings when the tier is unavailable.
tiers.cheap.providerdeepseek-officialProvider for the implementation tier.
tiers.cheap.modeldeepseek-flashCatalog id of the cheap model.
tiers.cheap.effortlowAdapter vocabulary off | low | high | max.
tiers.cheap.followSessiontruetrue = inherit the session's effort so an explicit choice wins.
tiers.cheap.fallback[]Ordered provider/model landings when the tier is unavailable.
tiers.vision.providerdeepseek-officialProvider for image-carrying turns.
tiers.vision.modeldeepseek-flashThe catalog's image-capable model.
intent.ruleThreshold0.7Confidence at or above which the rule layer decides alone.
intent.attemptBand.enabledfalseStart the middle band on the cheap tier and escalate on a signal.
intent.attemptBand.tauLow0.45Lower bound of the attempt-first band.
intent.hysteresis.toStrong0.8Score that switches a cheap turn to strong.
intent.hysteresis.toCheap0.6Score below which a strong turn returns to cheap.
intent.rules[]Declarative rule table (when.patterns / when.tools / when.cwd, tier, priority).
intent.judge.enabledtrueAllow the low-confidence judge.
intent.judge.model''Judge model id; empty = first catalog model containing flash.
intent.judge.temperature0Judge sampling temperature.
intent.judge.maxTokens16Judge output cap (it answers with one word).
intent.judge.cooldownMs30000Minimum gap between two judge calls.
intent.judge.timeoutMs2000Judge call timeout.
intent.judge.unavailableSkip2Consecutive judge failures after which the turn skips it.
intent.scenariosall truePer-scenario switches: coding, review, planning, retrieval, batch, daily, longText, multimodal.
intent.costModebalancedAmbiguity arbitration: cost-first | quality-first | balanced.
guard.enabledtrueEnable the deterministic high-risk guard.
guard.tiers[cheap]Tiers the guard protects.
guard.whitelist[]Commands, tools or path prefixes that never trip the guard.
guard.protectedPaths['.dsh','AGENTS.md','package.json','.github/workflows']Self-modification surfaces that force strong-tier review.
guard.interopDefendautoRelationship with dsh-defend: auto audits coexistence, none stays silent.
escalation.threshold2Failures within the window that raise the tier.
escalation.windowMs60000Failure-counting window.
escalation.ttlMs180000How long an escalation stays in effect.
escalation.fallbackTtlMs300000TTL used after a fallback landing was taken.
escalation.signaturetrueCount same-signature recurrences instead of every failure.
routingModeautoauto | strong | cheap | delegated | off.

All keys can also be edited live from the plugin's card on the Plugins page; the Host validates the new value against the schema and commits it with loader/volatile-update, and this plugin then re-judges the whole configuration through the same cross-field judge the mount path uses. A value that violates a cross-field requirement (two tiers landing on the same route, a hysteresis pair that cannot stop flapping, a rule with neither a pattern nor a tool) leaves the last good policy routing instead of swapping in something unroutable.

routingMode is the one key that is not live: it is the composition default, and the runtime switch is the session-scoped override written by /tier, the composer pill and the card's selector. Making it live as well would give the same behaviour two owners.