DSH HUB
HomePlugin StorePlugin PacksCommunityRankingsResourcesPublish Guide
Plugin source
Back to catalog

taxueseek /

taxueseek/dsh-router-flash

Verified

探索模式 · DeepSeek V4 Flash 专用,兼容其他开源模型。减少 Token 消耗,有效提升使用效率

★ 1 Stars0 Forks0 IssuesN/A Community rating0 Confirmed installs
View on GitHubProject homepage
READMESource: main@142fcd5e

English | 简体中文

dsh-router-flash

dsh-router-flash 总览:渠道无关命中、首轮工具面收窄、声明行交付

实际效果 / Actual UI

预设选择器 / Preset Picker

预设选择器:选中「探索模式」,含描述与其他内建预设

首轮工具面 / First-turn Tool Face

首轮只给 read/write/edit 加平台 shell,首次工具调用后放开 28 行全目录

一句话

dsh 网页端里模型无关的 agent preset——只看模型 id,首轮收窄工具面,之后就不再多管。 为 DeepSeek V4 Flash 而生,但不限于它。

这是什么

一个以 bundle 补丁层交付的 dsh agent preset。安装插件即声明一条 @deepseek-ai/dsh-agent-preset 行;重启 dsh 后「探索模式」出现在预设选择器里。 没有任何落盘同步——DSH 0.2.0 起 preset 是插件行,不是目录。

它做的事:

阶段 行为
命中 isFlashModel(id) = /deepseek/i.test(id) && /flash/i.test(id),模型与渠道都无关;modelFamily() 把 id 分成 flash / deepseek / longcat / third-party 四家族
persona 对 Flash 一律 weak 分支(w7 引导):分类、回顾、反跑题、深度思考、决策闭环
首轮 只给 read / write / edit 加平台 shell(bash,Windows 上是 pwsh)
首次 tool/call 之后 放开 28 行全目录;路由器还在 tools/result 上跑 HarnessMM 链式置换

路由器挂在 system-prompt/assemble 接缝上做人设路由。DSH 0.2.2+ 的首轮收窄 在 agent/created 时经 ctx.tools.restrict() 登记、首次 tools/result 后解除; 旧宿主上 assemble 载荷仍带 tools,过滤在那里跑。模式由持久会话事件推导, 所以 resume / reload 之后仍然保持。

模型无关,是演化出来的分支

本 preset 是早期 dsh-router-flash(v0.1.0,绑定单一渠道的 DeepSeek V4 Flash)演化 出来的分支。路由逻辑重做后,不再绑定某个厂商或模型家族:

  • 任何渠道——命中只看模型 id,不看谁在转卖。任何提供 DeepSeek V4 Flash 的渠道 都拿到同一套引导。
  • 任何模型,但不是同一套引导——模型 id 分四个家族,各走各的: flash(DeepSeek + flash)拿 w7 + 首轮收窄;deepseek 其余家族拿 w6 关键词分类
    • 首轮收窄;longcat 拿龙猫专属长上下文人设 + 首轮收窄; third-party(gemini / qwen / gpt …)不收窄首轮;人设默认仍按关键词 分类,中性句是 opt-in(thirdPartyGuidance: neutral)。
  • 一份 preset 服务所有模型——同一份声明行服务每个模型,路由器按会话自适应, 不需要每个厂商配一份 preset。

这就是扩展性收益:新增模型或渠道不需要改 preset——只要模型 id 命中(以及路由里的 provider 配置)。

命中规则(模型与渠道都无关)

isFlashModel(modelId) = /deepseek/i.test(modelId) && /flash/i.test(modelId)

家族判定(modelFamily())只看 id,四档:

模型 id 家族 路由
deepseek-v4-flash、deepseek-v4-flash-0731、deepseek-v4-flash-vision-exp flash w7 引导 + 首轮收窄(本 preset 的主体)
deepseek-v4-pro、deepseek-chat deepseek 首条用户消息关键词分类(build/fix)+ 首轮收窄
LongCat-*、longcat-* longcat 龙猫专属长上下文人设(WEAK_LONGCAT)+ 首轮收窄
gemini-2.5-flash、qwen3-flash、gpt-5-flash third-party 关键词分类(默认)或中性句(opt-in);不收窄首轮

第三方只改了一处,因为只有这一处有测量:首轮收窄会让提示词继续教 glob/grep 怎么用,而 schema 里没有这两个工具。在本机 13 个历史第三方会话里,这个不一致 13/13 全部复现(scripts/replay-routing.mjs 可复跑),所以第三方家族一律放开首轮目录。

人设没动:w6 与 w7 都只在 DeepSeek 家族上测过,拿不到对照结论就不改默认。想要中性句 (不分类)可显式设 thirdPartyGuidance: neutral,等对照测量出来再谈默认值。

为什么不是只匹配 flash:那样会把 gemini-2.5-flash、qwen3-flash 这类非 DeepSeek 模型一起卷进 Flash 的弱 persona,对它们是负优化。

为什么不是绑定 opencode-go:模型能力取决于模型本身,不取决于谁在转卖它。任何 渠道的 DeepSeek V4 Flash 都该拿到同一套引导;渠道差异用 provider 配置表达,不进 preset。

HarnessMM 决策重用(GDR / CCS)

lib/router-core.mjs 带一层来自 HarnessMM(Apache-2.0) 的确定性决策重用逻辑。模型可以在一次慢思考里声明一小串确定性后续动作,控制器在 本地连续置换执行,只要每一步的卫述被上一步的收据满足——不必再调一次模型。

导出 作用
evaluateGuard(guard, receipt) 用卫述条件评估工具收据:return_code / exitCode、stdout_contains、stdout_equals、stderr_empty、json_equals、status == success
shouldBypassCallback(receipt, candidate) 候选动作的卫述被满足且参数完整(字面闭合)时为真
ChiselPlanScheduler 每会话的候选节点队列;step(receipt) 推进并返回下一个动作,卫述不满足时返回 null(安全回退给模型)
createSubstitutionCertificate(meta) 为被置换掉的慢思考调用留审计凭证
isRedundantVerification(prevReceipt, currentAction) 幂等拦截:上一步测试已通过时,抑制重复跑同一个测试

接线在 lib/router-bootstrap.mjs:agent/created 登记首轮 tools.restrict(); tools/result 解除收窄并把收据喂给调度器。队列由模型自己声明的候选填充——preset 不发明动作。卫述失败时队列清空,控制权交还模型的正常推理。

这段逻辑是 LICENSE / NOTICE 里 Apache-2.0 例外的同一部分,见「致谢与来源」。

安装

需要 harness ≥ 0.2.0-rc.2(在 0.2.0-rc.2 上实测,0.2.1-rc.1 在跑)。

curl -fsSL https://raw.githubusercontent.com/taxueseek/dsh-router-flash/main/install.sh | sh
# 重启 DSH

等价手工操作:

dsh plugin --profile web add -w github:taxueseek/dsh-router-flash#v0.5.0
# 重启 DSH

重启后 router-flash preset 会以显示名「探索模式」出现在预设选择器里。然后把模型指向 任意渠道的 DeepSeek V4 Flash——provider 填什么由你的渠道决定,本 preset 不做 假设(已验证渠道见下)。模型路由在 profile 的 cordis.patch.yml 里配宿主 dsh-agent-default-model 行,或直接在界面上的模型选择器里选。新会话选用「探索模式」 即可。

想让默认预设就是它,在 profile 的 cordis.patch.yml 里覆盖注册表那行(preset 的 默认值由它决定):

- id: agent-preset-registry
  name: '@deepseek-ai/dsh-agent-preset-registry'
  config:
    default: router-flash

0.2.0 起 ~/.dsh/settings.yaml 的 agent-presets.default 已不存在。若你照着旧 文档改过,那处配置现在既不被读、也不会报错——删掉即可。

升级

dsh plugin --profile web add -w github:taxueseek/dsh-router-flash#v0.5.0

重启 DSH 后声明行随补丁层换新,没有需要覆盖的用户目录。

0.3.x → 0.4.0 的独有一步:0.3.x 会把 preset 文件同步到 ~/.dsh/.agent-presets/router-flash/,那个目录在 0.2.0-rc.2 上已不被读取(详见 「版本适配」)。插件启动时会检查它并在日志里给出提醒,确认升级完成重启后即可手动 删除——插件本身只做只读体检,不会替你删。

卸载

dsh plugin --profile web remove dsh-router-flash

重启后声明行随补丁层一起消失,presets 名册里不再有它。若还有 0.3.x 留下的旧目录, 需手动删除。

使用

  1. 安装后重启 dsh,在新会话的预设选择器里选「探索模式」。

  2. 直接提交任务即可。persona 会自动注入「分类 + 回顾 + 反跑题 + 深度思考 + 决策闭环」 五个锚。注意口径:对 DeepSeek Flash,代码层不判任务类型——一律 weak 分支, 分类由模型按 persona 里那句自己判;classifyTask() 的关键词分类只服务 DeepSeek 非 Flash 家族。第三方模型默认不分类,拿中性句(见「命中规则」)。

  3. 会话启动后,模型的 system prompt 应包含:

    You are a helpful assistant.
    Before acting, decide the task type (build or fix)...
    Before acting, briefly review what you have already done...
    Do not run environment checks (echo, whoami, uname...)...
    Think deeply about the architecture, edge cases...
    Produce when your information is complete...
    

跨平台支持

本 preset 三平台通用,dsh 会自动选择 shell 工具:

系统 shell 状态
macOS bash 实测通过(本轮验证环境)
Linux bash 未实测;走同一 bash 分支
Windows pwsh(PowerShell) 未实测;cordis.patch.yml 内 process.platform === 'win32' 判断会自动禁用 bash、启用 pwsh

核心路由逻辑(persona / 引导 / 模型识别)与操作系统无关。缺 shell 时不再报错, 退化为文件工具并写警告。

兼容性

dsh-router-flash Harness 说明
0.5.0 0.2.1-rc.5(latest) / 0.2.2-alpha.2(alpha) 适配 0.2.2-alpha.2:删掉已移除的 tool-subagent-control/list-agents 行、不再读 assembled.tools(改用 ctx.tools.restrict());第三方模型首轮不再收窄;新增 thirdPartyGuidance。
0.4.1 0.2.1-rc.1 补回 time-context + tool-schedule,对齐 plan-mode 文案,修一处不可达的 FLASH_NEUTRAL 抛出;组合漂移 13/13 全部有理由。
0.4.0 0.2.0-rc.2(实测) 破坏性:preset 改为声明行交付,不再落盘同步。
0.3.1 0.1.5-rc.2(历史) 目录形态 preset——在 0.2.0-rc.2 上等于不存在。

需要 Node.js ≥ 22.19。

在 0.2.1-rc.1 上实际验证过(本代码):

  • 接缝仍在:system-prompt/assemble 仍是 (assembly, context, next) (dsh-system-prompt:355);assembly.sections / contexts / tools 形状未变; session.snapshotEvents()、tool/call、user/message 事件名未变。
  • npm test 5/5 绿——组合体检逐行对照官方 standard,要求差异集恰好等于 白名单(13 条,每条都写了理由)。
  • 兼容门禁看得见本包:24 个宿主包写进 peerDependencies(^0.2.0-rc.2)。这不是 装饰:宿主按它判定 bundle 兼容性,版本对不上时会在启动日志里明确跳过本 bundle, 而不是装上了却一行都不生效(那正是 0.3.x 在 rc.2 上的真实状态)。

配置

bundle 条目不带宿主侧 config 段。唯一的开关在声明行本身:

键 默认 作用
flashGuidance true 置 false 时 Flash 模型拿到中性 persona 句,而不是 w7 引导。永远不会退回 spec 句。
thirdPartyGuidance classify 第三方家族的人设策略。classify:首条消息关键词分类(0.4.1 行为);neutral:中性句、不分类(opt-in,尚无对照测量)。两种策略都不收窄首轮工具面。DeepSeek 家族不受影响。

按 Loader 行 id 在 profile 的 cordis.patch.yml 里覆盖:

- id: preset-router-flash
  name: '@deepseek-ai/dsh-agent-preset'
  config: { ...完整重述... }   # 覆盖是整体替换

覆盖是整体替换:漏字段即丢字段,所以覆盖时要把 id / plugins 连同你改的 一并重述。

依赖

  • DeepSeek Harness(dsh) 0.2.0-rc.2 及以上。本 preset 在 0.2.0-rc.2 与 0.2.1-rc.1 上实测;0.2.0 之前是 目录形态的 preset,本包 0.4.0 起不再支持。
  • 任意渠道的 DeepSeek V4 Flash 模型(id 含 deepseek + flash)。
  • 已验证渠道:opencode-go(https://opencode.ai/zen/go/v1)、tokenrhythm (https://tokenrhythm.studio/v1)。两者共用同一套 preset,唯一差异是模型路由里的 provider 取值。

零运行时依赖:dependencies 仍为空。

工具面:限制的性质有两种,本 preset 分别处理

dsh-web-app(Web 宿主 bundle)在宿主层把 23 个 agent 面行设为 disabled: true, 注释写明 「Presets own the human command and model-facing tool」,涵盖 tool-web / command-goal / tool-goal / tool-bash … 等模型与命令入口。所以在 Web 部署里, preset 少写一行 = 该能力对该 preset 的 agent 直接不存在。

由此还派生一条与「限制」无关、但同样致命的规则:宿主不声明、只有官方 preset 声明的 行,本 preset 也不写就等于没有。0.4.1 据此补回两行,性质是恢复缺口,不是口味 加法:

补回的行 没有它时的实际后果 成本
time-context 模型拿不到当前时间/时区,对「今天」「最近」「这文件什么时候改的」只能猜 默认 10 分钟注入一次读数,约百字符/次,可忽略
tool-schedule 没有 schedule_create/list/update/delete,建不了定时提醒 4 个工具的 schema,仅首轮之后可见

另外把 plan-mode 的 section 首句改回官方 0.2.1 的措辞(until the user approves your plan through exit_plan_mode)。旧句写的是 until exit_plan_mode succeeds——把 「调用成功」当成批准条件,模型可以在用户没点头时自行退出计划模式。

上游与同类插件在这块一致地做了限制:

行 godmode / router-standard 一系 锚定系(apex / anchored-flash / liangshen / anchored-standard) dsh 内置 minimal / ptc / standard / cordis
tool-web → web_fetch fetch: false(6/6) fetch: false(4/4) fetch: true
command-goal(/goal) 缺失(6/6) 缺失(4/4) 有
present(交付物呈现) 缺失(6/6) 缺失(4/4) 有(0.1.5-alpha.2 起)

但这两条限制的性质不同,处理方式因此不同。

web_fetch:模型可见的减法 → 跟随家族,保持 false

  • 这是家族刻意写的行,不是抄漏:dsh-web-app 自 0.1.1-rc.2 起就禁用了宿主 tool-web 行(早于家族落笔),家族知道这行归 preset,仍写 fetch: false 而把 search 留着。
  • 它是模型可见的减法(web_fetch 的 schema 进模型目录),去掉它需要测量,而 9 个 preset 的文档里对这条一个字都没解释,也没有任何测量。
  • 它是真关掉:dsh-tool-web 的 apply() 末尾是 if (resolved.fetch) applyWebFetchTool(...),条件不成立就完全不注册。
  • 但部署自己表态时会被绕过(实测):部署层写一条显式 tool-web 行(如 fetch: true),生效的是部署那条,preset 的取值不参与;只有在无人表态时,这一行才 体现为「扣掉宿主默认」。所以这条限制「该管的地方管不到,不该扣的地方扣掉」——它是 家族的习惯,不是安全或测量结论。
  • 本 preset 保持 false(跟随家族)。要开启:把该行的 fetch 改成 true,并同步改 test/router.test.mjs 里那条断言。

command-goal:模型不可见,但仍跟随家族 → 不补

这里有一个容易搞反的点,先说结论:不补是决定,不是遗漏。

  • 事实层面:dsh-base 任何版本都带这行且启用;dsh-web-app 从 0.1.2-alpha.2 起把它设为 disabled: true;官方 preset 在同一版本补上该行。 这之前(含上游家族的目标版本 0.1.0-rc.6 / 0.1.1-rc.2)宿主直接提供 /goal。
  • 所以上游家族不是漏写、也不是不想要:它写那行注释时,宿主确实提供 /goal,省略 是正确的。缺口只在把同一份 preset 拿到 0.1.2-alpha.2 之后(含本机 0.1.5-rc.2)跑时才出现。
  • 现状(实测 0.1.5-rc.2):不写该行,commands.list() = [compact, feedback, permission, plan],也就是没有 /goal。写了才有 goal。
  • 为什么还是不加:它虽然不占模型上下文(dsh-commands 不注册 prompt 段,已核源码, 所以加它零扰动),但加它就是偏离家族工具面。本 preset 的定位是「补兼容、不补 口味」,/goal 属于口味。上游 4 个 preset 一致不带这行,本 preset 也保持一致。
  • 要开启:把 - id: command-goal / name: '@deepseek-ai/dsh-command-goal' 两行加回 goals 段,并同步改 test/router.test.mjs 里的对应断言(那里现在是「必须不存在」)。

present:模型可见的加法 → 跟随家族,不补

  • 它进了官方 preset,但只从 0.1.5-alpha.2 起——社区家族写于更早,属于「没赶上」 而非「不想要」。
  • 即便如此,它仍是模型可见的一项(描述约 464 字符),补进去等于改动家族测过的 目录。按同一条规则(模型可见的改动需要测量)不补。要开启:把该行加回 agent.cordis.yml(- id: present / name: '@deepseek-ai/dsh-tool-present')。

规则

工具面跟随上游家族,不增不减;只补会炸的兼容问题。 家族明写的(fetch: false)、 家族没写的(present、command-goal)都不动——包括那些「加了看起来更好」的项,因为 「看起来更好」没有测量支撑,而这一族的全部价值来自它的测量。

test/router.test.mjs 把这条规则变成断言:宿主交还的 21 行必须齐(command-goal 除外,它属于上面的决定),command-goal 与 present 必须不在,tool-web 必须 fetch: false。

宿主所有权移交时间线(goal / present / tool-web)

/goal、present、web_fetch 这三项归属权,在 dsh 的 0.1.x 里分批从宿主移交给 preset。逐版本核过 npm 包后的实际时间线:

版本 dsh-base dsh-web-app 官方 preset(standard)
0.1.0-rc.6 ← 上游家族的目标版本 command-goal 启用 不碰该行 无该行(不需要)
0.1.1-rc.2 command-goal 启用 tool-web 已 disabled 无 command-goal 行
0.1.2-alpha.2 command-goal 启用 command-goal 也 disabled 补上 command-goal 行
0.1.5-alpha.2 同上 同上 再补 present 行
0.1.5-rc.2 同上 23 行全部 disabled 三行齐全
0.2.0-rc.2 ← 本机 command-goal 仍启用 command-goal / tool-ralph / tool-web 三行均 disabled 三行齐全(另加 tool-plugin-manager,disabled)

关键点:tool-web 的移交早于家族落笔(家族知道这行归 preset,仍写 fetch: false,是刻意取舍);command-goal 的移交晚于家族落笔(家族写注释时宿主 确实提供 /goal,所以它的省略在当时是正确的,不是漏写)。两者性质不同,处理方式也 不同。

dsh-command-goal 包本身自 0.0.1-rc.1 就存在,从来不是新功能——变的只是「谁负责 挂它」。

版本适配

策略始终是只修兼容、不动行为。上游 v0.1.0 只适配到 dsh 0.1.0-rc.6,在 0.1.5-rc.2 上会装得上、用不了。

0.2.1(0.4.1 本轮)

这一代没有改 agent preset 的契约(system-prompt/assemble、sections/tools/contexts、 snapshotEvents() 都仍在),变的是官方 preset 的组合本身:

偏差 症状 修法
官方 standard 新增 time-context 本 preset 不写 → 模型没有当前时间,日期类判断全靠猜 补该行(宿主 Web 组合不声明它,只能由 preset 给)
官方 standard 新增 tool-schedule 没有 schedule_* 四个工具,建不了定时提醒 补该行
plan-mode 的 section 改文案 旧句 until exit_plan_mode succeeds 把「调用成功」当批准条件,模型可在用户未批准时退出计划模式 首句改回官方措辞,其余逐字保留
官方移除 tool-ralph / tool-subagent-codex / -claude-code 行 本 preset 仍有这三行(ralph 还是启用态) 记为 only-here 白名单,去留待测量,本轮不动

0.2.0-rc.2(0.4.0 本轮)

偏差 症状 修法
preset 目录形态被移除 $DSH_HOME/.agent-presets/<id>/ 已无人读取(rc.2 依赖树 288 个包全树检索 0 命中;官方迁移文档原话 "Nothing reads that directory any more.")。实测症状最狠:插件装上了、每次启动照旧同步文件、留一屋子日志,而 preset 名册里根本没有它 改为 bundle patch 里的 @deepseek-ai/dsh-agent-preset 声明行;删掉全部落盘同步
组合里的相对模块引用 name: ./router-bootstrap.mjs 在声明行里无处可解析(rc.2 要求资产从已安装的包解析) 改为包内子路径导出 dsh-router-flash/router-bootstrap(由 exports 声明)
dsh-workflow-worker-thread 已改名 该包在 rc.2 不存在(→ dsh-workflow-ptc),该行会让整份 preset 挂载失败 行 id 与包名同步改名
persona 的 text 键 rc.2 的 schema 只认 prefix;text 是未声明键,实测「保留但无人读」= 死键 删掉 text,只留 prefix
兼容门禁看不见本包 0.3.x 的 dependencies/peerDependencies 全是空的,宿主无从判定它与运行时的关系——本轮有 6 个 bundle 因 peer 不匹配被拦,本包不在其中,不是因为它兼容,而是因为它什么都没声明 声明 24 个宿主包 peer(^0.2.0-rc.2),让门禁能拦
README 的默认预设配方 ~/.dsh/settings.yaml 在 rc.2 上已不存在 改为覆盖 agent-preset-registry 行的 config.default

实测仍然在线、因此一行未改的接缝:system-prompt/assemble 仍是 (assembly, context, next)(dsh-system-prompt:355);assembly.sections / contexts / tools 形状未变;session.snapshotEvents()、tool/call、user/message 事件名未变。这也是本 preset 的路由逻辑能原样搬过来的原因。

0.1.5-rc.2(0.3.0 的历史适配,保留记录)

偏差 症状 修法
persona 行只写 config.text dsh-persona 自 0.1.5 起要求 prefix,该行校验失败即整份 preset 挂载被拒(agent-preset/invalid) 双写 prefix + text(schemastery 保留未声明键),0.1.2-rc.1 ~ 0.1.5-rc.2 两代都能挂。0.4.0 起已不需要,text 已删
读 session.events 该属性已在 0.1.2-alpha.4 被 eventAt() / snapshotEvents() 取代,每轮提示词装配抛 TypeError sessionEvents() 特性探测:snapshotEvents() 优先,回退 session.events
persona 段位置 AssembledSection 现在只有 { name, text },没有 order 可设,渲染顺序即数组顺序 上游「过滤后追加」会把身份句甩到全部工具说明之后(已实测),改为原位替换
/goal 命令缺失 宿主自 0.1.2-alpha.2 起不再提供该行,preset 不写就没有 /goal 不修:属工具面选择(不占模型上下文,但补它偏离家族),见「工具面」一节

contexts: [] 保持上游原样(两个分支都清空):放行它会往每一轮(尤其首轮)注入约 470 字符的运行时上下文快照,改动最敏感的那一轮需要有测量支撑,目前没有。想要这份 可见性的部署请自行决定——那是部署的取舍,不是 preset 的。

组合与官方 standard 的已知差异

cordis.patch.yml(preset 声明 insert)的 28 个叶子行里有 27 行指向别人的包(96%)。为了让 「上游改了、这里没跟」不再静默,差异被固化成一张必须逐条给理由的表,并由 npm test 强制: 与官方 standard preset 的差异集必须恰好等于白名单,多一条要解释,少一条要删 (防腐化)。

行 性质 理由
router-bootstrap 只本 preset 有 路由器本身
command-goal / present / tool-plugin-manager / tool-plugin-market / tool-subagent-list-agents 只官方有 家族工具面:不补(前两者见「工具面」;tool-plugin-manager / tool-plugin-market 属宿主/部署层,且官方行本身 disabled: true;tool-subagent-list-agents 在 0.2.2-alpha.2 被移除——list_agents 并入 control 包主入口)
persona 取值不同 身份句不同且无 suffix;本行只是 fallback,装配时被路由器整体替换
tool-ralph 只本 preset 有 官方 0.2.1 已整行移除;本 preset 仍开 maxRounds: 64——真实差异,去留待一次测量
tool-subagent 取值不同 缺 0.2.0 新增的 modelSelectionSettings: true(模型可见加法,未测量不跟)
tool-subagent-fork 取值不同 本 preset 多 backgroundMode: continuable(可续聊),官方无该键
tool-subagent-codex / -claude-code 只本 preset 有 两行均 disabled: true,不注册工具,不可观测
tool-web 取值不同 家族取值 fetch: false(模型可见减法,未测量不改)

0.4.1 已消掉的差异:time-context、tool-schedule 从「只官方有」变成两边都有 (能力恢复),plan-mode 的 section 文案与官方逐字对齐。

补充说明:「config 键是否在该包的 schema 里」不在离线检查范围内——那份 schema 只在 运行时存在。要查它用宿主 Inspect:cordis_inspect_query → host/Config/listConfigs {name: "@deepseek-ai/dsh-<包名>"}。

运行时健壮性

  • 不再写盘:0.4.0 起 preset 由组合层交付。插件启动时只做一次只读体检(旧的 .agent-presets/router-flash 是否还在),并把这唯一一件事的失败降级成日志——说明性 插件绝不该让宿主起不来。
  • 缺 shell 不再致命:工具目录里既没有 bash 也没有 pwsh 时,首轮退化为文件工具 并写警告,而不是抛错让整轮请求失败。
  • 崩溃面收窄:路由逻辑只依赖四个接缝(system-prompt/assemble 事件、agent/created 事件、tools/result 事件、会话事件),任一接缝变了也只是退化或告警,不抛错穿透到整轮请求。

适配了什么(相对上游 v0.1.0)

上游依赖三个在 0.1.0-rc.6 上就已失效的机制,本 preset 沿用其修法并补上 0.1.5 的适配:

  1. ctx.on('session/event') 注入 —— session/event 是 session-scoped,agent-plane preset 收不到。
  2. target.inbox.append —— agent 对象没有 .inbox 属性。
  3. assemble 时事件里还没有 user/message —— 时序问题。

修复方式:把引导静态合并进 WEAK_FLASH persona,不依赖任何动态注入机制。

自检

npm test          # = node test/router.test.mjs && node scripts/check-composition.mjs

不需要 npm install:本包零依赖,体检脚本从本机的 dsh 运行时借 js-yaml 与官方 preset 文件。

  • test/router.test.mjs —— 纯逻辑回归:模型识别(DeepSeek Flash 命中、同名 flash 的 其他家族不命中)、persona 原位替换与去重、首轮工具面(core + 平台 shell)、首次 tool/call 后放开全目录、运行时上下文保留、关键词分类、缺 shell 时的降级告警、 交付形态自洽(声明行 id / config.id / 包子路径引用)、HarnessMM 决策重用层 (evaluateGuard / shouldBypassCallback / ChiselPlanScheduler / createSubstitutionCertificate / isRedundantVerification)、0.2.2+ 的 tools.restrict() 路径,以及 0.4.1 新增的两条:时钟行与定时行必须在组合里、 flashGuidance:false 必须退回中性句且不得退回 spec 句。
  • scripts/check-composition.mjs —— 契约体检,四条断言各自报出:①声明行结构自洽; ②自有引用都能由 exports 提供且文件存在;③组合里每个 @deepseek-ai/... 行名都能在 当前 dsh 运行时里解析(改名漂移的拦网);④与官方 standard 的差异集恰好等于 白名单。找不到 dsh 时明确报 SKIP 而非假装通过;--strict 把 SKIP 升级为 FAIL。

适用范围

  • 命中 isFlashModel 后一律走 weak 模式(作者实测 w7 最优解)。
  • DeepSeek 非 Flash 模型(如 deepseek-v4-pro)走关键词分类逻辑,仍可用。
  • 第三方模型(如 gemini-2.5-flash)默认仍按首条消息分类,但不收窄 首轮;中性句是 opt-in(thirdPartyGuidance: neutral)。LongCat 系 id 另成 longcat 家族,配龙猫专属长上下文人设。
  • 复杂构建任务(如大型工程、从零开发)尤其受益于深度思考锚。
  • HarnessMM 决策重用层对所有家族生效:模型可以声明一小串确定性链条,控制器在 每一步卫述成立时本地执行,一旦失败立即回退给模型的正常推理。

包结构

dsh-router-flash/
├── package.json                     # dsh.bundle(单条补丁)+ dsh.client + 24 条 peer 声明
├── cordis.patch.yml                 # 两条 insert:dsh-router-flash 宿主行(旧目录体检)+ @deepseek-ai/dsh-agent-preset 声明行(组合本体,28 行)
├── lib/
│   ├── index.js                     # host 端:只读体检旧形态目录,不再写盘
│   ├── client.js                    # client 端:空实现占位(无浏览器 UI)
│   ├── router-bootstrap.mjs         # 路由器:assemble 钩子(persona 路由)+ agent/created tools.restrict + tools/result HarnessMM 链式置换
│   └── router-core.mjs              # 路由纯逻辑:模式识别 / persona / 工具面 / HarnessMM 决策重用(零依赖)
├── test/router.test.mjs             # 纯逻辑自检
├── scripts/check-composition.mjs    # 契约体检(结构 / 引用 / 可解析 / 基线差异白名单)
├── install.sh                       # git 渠道安装脚本
├── intro.png                        # 头图
├── ui-preset-picker.png             # 实际 UI:预设选择器
└── ui-first-turn-tools.png          # 实际 UI:首轮工具面

dsh.bundle.patch 是数组(官方 dsh-web-app 也这么用):宿主行与 preset 声明各自 一个文件,改哪半边就 diff 哪半边。

说明

  • host 插件不再写盘。0.3.x 曾用 Node 原生文件 API 同步 preset 目录(为了绕开启动 时序),0.4.0 起整个写入路径消失——preset 走组合层,插件只剩一次只读体检。
  • 覆盖 preset 用 Loader 行 id(preset-router-flash)在 profile 的 cordis.patch.yml 里整段替换 config;覆盖是整体替换,漏字段即丢字段,所以 覆盖时要把 id/plugins 一并重述。
  • 行 id preset-router-flash 是 Loader 地址,config.id: router-flash 才是会话记住的 身份。改名会让老会话认不回自己的 preset,因此固定不动。

致谢与来源

本仓库是衍生作品,内容来源如下:

项目 作者 许可 用途
SheberDavid/v4-flash-godmode-opencode-go SheberDavid 无独立 LICENSE(其 README 声明基于 MIT 项目) presets/ 组合本体与 dsh rc.6 适配逻辑的直接来源
dsh-router-standard yjh051108 MIT(© 2026 yjh051108) Flash w7 persona、深度思考锚与路由研究的源头
dsh-routing-suite yjh051108 MIT 路由研究
HarnessMM PhiAgent-0 contributors Apache-2.0(© 2026 PhiAgent-0 contributors) GDR/CCS 决策重用逻辑(evaluateGuard、ChiselPlanScheduler、置换凭证)的来源
DeepSeek Harness DeepSeek MIT 宿主框架

本仓库新增的 bundle 包装层(package.json / cordis.patch.yml / presets/ / lib/ / scripts/)为本仓库独立新增代码,但 lib/ 中的 HarnessMM 派生决策重用逻辑除外 (见上表)。

完整许可与衍生链说明见 LICENSE 与 NOTICE。DeepSeek 是 DeepSeek 公司商标;本项目为社区产物,与 DeepSeek 无关联。

—/ 5

No ratings yet

Verified DSH bundle

Commit 142fcd5e5268

Community comments

No comments yet. Be the first to write one.

DSH HUB

A community index for DSH plugins. Not an official GitHub or DeepSeek AI product.

CommunityResourcesAPIAbout