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

探索模式 taxueseek/dsh-router-flash

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

按模型自动收窄首轮工具面,引导模型先探索再动手

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · skill
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 14 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件
查看扫描证据(共 1 处,展示前 1 条)
  • 读取本地文件
    lib/index.js:53
    if (existsSync(legacyDir)) {
扫描于 2026/10/31(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-agent-instructions@deepseek-ai/dsh-command-compact@deepseek-ai/dsh-compaction-basic@deepseek-ai/dsh-compaction-tool-result-pruner@deepseek-ai/dsh-persona@deepseek-ai/dsh-plan-mode@deepseek-ai/dsh-skill-filesystem@deepseek-ai/dsh-time-context@deepseek-ai/dsh-tool-ask-user@deepseek-ai/dsh-tool-bash@deepseek-ai/dsh-tool-fs@deepseek-ai/dsh-tool-fs-search
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

探索模式 · DeepSeek V4 Flash 专用 agent preset — 渠道无关命中、首轮工具面收窄、声明行交付

README

由 DeepSeek 最新模型翻译生成
dsh-router-flash 实际效果 / Actual UI 预设选择器 / Preset Picker 首轮工具面 / First-turn Tool Face 一句话 dsh 网页端里模型无关的 agent preset——只看模型 id,首轮收窄工具面,之后就不再多管。 为 DeepSeek V4 Flash 而生,但不限于它。 这是什么 一个以 bundle 补丁层交付的 dsh agent preset。安装插件即声明一条 @deepseek-ai/dsh-agent-preset 行;重启 dsh 后「探索模式」出现在预设选择器里。 没有任何落盘同步——DSH 0.2.0 起 preset 是插件行,不是目录。
展开完整文档(README 剩余 1 节)
dsh-router-flash

实际效果 / Actual UI

预设选择器 / Preset Picker

首轮工具面 / First-turn Tool Face

一句话

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),模型与渠道都无关 |
| persona | 对 Flash 一律 weak 分支(w7 引导):分类、回顾、反跑题、深度思考、决策闭环 |
| 首轮 | 只给 read / write / edit 加平台 shell(bash,Windows 上是 pwsh) |
| 首次 tool/call 之后 | 放开 29 行全目录,路由器不再介入 |

路由器挂在 system-prompt/assemble 接缝上,按轮次改写模型目录。模式由持久会话事件推导,所以 resume / reload 之后仍然保持。

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

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

- 任何渠道——命中只看模型 id,不看谁在转卖。任何提供 DeepSeek V4 Flash 的渠道都拿到同一套引导。
- 任何模型——不命中 isFlashModel 的模型仍能用本 preset 的通用分支:首条用户消息的关键词分类(build/fix)决定路由。所以 deepseek-v4-pro、gemini-2.5-flash、 qwen3-flash、gpt-5-flash 等等都能用「探索模式」。
- 一份 preset 服务所有模型——同一份声明行服务每个模型,路由器按会话自适应,不需要每个厂商配一份 preset。

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

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

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

| 模型 id | 命中 | 路由 |
| deepseek-v4-flash | 是 | weak(w7 引导,本 preset 的主体) |
| deepseek-v4-flash-0731、deepseek-v4-flash-vision-exp | 是 | weak |
| deepseek-v4-pro、deepseek-chat | 否 | 首条用户消息关键词分类(build/fix) |
| gemini-2.5-flash、qwen3-flash、gpt-5-flash | 否 | 同上 |

为什么不是只匹配 flash:那样会把 gemini-2.5-flash、qwen3-flash 这类非 DeepSeek 模型一起卷进本 preset 的弱 persona,对它们是负优化。未命中的模型仍能用本 preset,只是走通用分类分支。

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

安装

需要 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.4.1
重启 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.4.1

重启 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() 的关键词分类只服务非 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) | 未实测;presets/router-flash.patch.yml 内 process.platform === 'win32' 判断会自动禁用 bash、启用 pwsh |

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

兼容性

| dsh-router-flash | Harness | 说明 |
| 0.4.1 | 0.2.1-rc.1(当前,在跑) | 补回 time-context + tool-schedule,对齐 plan-mode 文案,修一处不可达的 FLASH_NEUTRAL 抛出;组合漂移 12/12 全部有理由。 |
| 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,要求差异集恰好等于 白名单(12 条,每条都写了理由)。
- 兼容门禁看得见本包:24 个宿主包写进 peerDependencies(^0.2.0-rc.2)。这不是装饰:宿主按它判定 bundle 兼容性,版本对不上时会在启动日志里明确跳过本 bundle,而不是装上了却一行都不生效(那正是 0.3.x 在 rc.2 上的真实状态)。

配置

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

| 键 | 默认 | 作用 |
| flashGuidance | true | 置 false 时 Flash 模型拿到中性 persona 句,而不是 w7 引导。永远不会退回 spec 句。 |

按 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 把这条规则变成断言:宿主交还的 22 行必须齐(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 不匹配被拦,本包不在其中,不是因为它兼容,而是因为它什么都没声明 | 声明 22 个宿主包 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 的已知差异

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

| 行 | 性质 | 理由 |
| router-bootstrap | 只本 preset 有 | 路由器本身 |
| command-goal / present / tool-plugin-manager / tool-plugin-market | 只官方有 | 家族工具面:不补(前两者见「工具面」;后两者属宿主/部署层,且官方行本身 disabled: true) |
| 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 事件、工具目录、会话事件),任一接缝变了也只是退化或告警,不抛错穿透到整轮请求。

适配了什么(相对上游 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 / 包子路径引用),以及 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)走关键词分类逻辑,仍可用。
- 复杂构建任务(如大型工程、从零开发)尤其受益于深度思考锚。

包结构

dsh-router-flash/
├── package.json # dsh.bundle(两条补丁)+ dsh.client + 22 条 peer 声明 ├── cordis.patch.yml # 补丁 1:insert dsh-router-flash 宿主行(旧目录体检) ├── presets/ │ └── router-flash.patch.yml # 补丁 2:@deepseek-ai/dsh-agent-preset 声明行(组合本体,29 行) ├── lib/ │ ├── index.js # host 端:只读体检旧形态目录,不再写盘 │ ├── client.js # client 端:空实现占位(无浏览器 UI) │ ├── router-bootstrap.mjs # 路由器:assemble 钩子(persona 路由 + 首轮工具面) │ └── router-core.mjs # 路由纯逻辑:模式识别 / persona / 工具面(零依赖) ├── 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 | 路由研究 |
| DeepSeek Harness | DeepSeek | MIT | 宿主框架 |

本仓库新增的 bundle 包装层(package.json / cordis.patch.yml / presets/ / lib/ / scripts/)为本仓库独立新增代码。

完整许可与衍生链说明见 LICENSE 与 NOTICE。DeepSeek 是 DeepSeek 公司商标;本项目为社区产物,与 DeepSeek 无关联。
预览分享卡片长什么样 ↓taxueseek/dsh-router-flash
分享 · DeepSeek Harness Hub
taxueseek/dsh-router-flash

按模型自动收窄首轮工具面,引导模型先探索再动手

回到顶部