dsh-task-splitter:在宿主侧识别长任务并自动拆分,适配小上下文本地模型

前言

在 DeepSeek Harness(DSH)里接 llama.cpp、Ollama 等本地小模型时,单次请求的 maxTokens 和上下文窗口往往比云端模型紧得多。用户一句「写一篇 3000 字报告」或「帮我选一只明天可能涨的股票」,模型可能在单次回复里写不完,或在多步工具调用后上下文被塞满、中间结论丢失。指望模型自己判断「该不该拆步」并不稳定。下面介绍社区插件 dsh-task-splitter:它在 DSH 宿主侧用启发式打分识别两类长任务,并在同一次请求里通过 agent/pre-step 注入可执行规程,而不是额外多耗一轮对话。

这是什么

dsh-task-splitter 由 Passenger-Qin 维护,分类为工作流,当前 npm 包版本为 0.1.1(MIT 许可)。定位一句话:DSH 宿主插件,检测「长产出」与「多步流程」类任务,为小上下文本地模型自动拆分——要么搭 parts 骨架,要么搭 PLAN.md 台账,并注入执行规则。

插件不替模型做业务判断;车道 B 尤其强调过程与诚实性(计划、证据落盘、来源与不确定性),不保证最终答案正确。

两类车道:产出型与流程型

README 用两条「车道」区分失败模式,插件对每条车道给出不同脚手架。

车道 A — 长产出(long output) 车道 B — 长流程(long workflow)
典型例子 「写一篇 3000 字的行业报告,分 4 部分」 「帮我选一只明天大概率会涨的股票」
提示词特点 通常较明确(字数、段数、分节) 可能极短
瓶颈 单次输出预算(maxTokens) 步骤数与上下文:工具输出占满窗口、小模型漂移、中间结果丢失
插件动作 创建 tasks/<slug>/parts/NN-*.md 与 MANIFEST.json;每轮只写一段,最后 assemble 创建 tasks/<slug>/PLAN.md 与 notes/;先立计划、每轮一步、结果写盘

车道 A 适合显式长文、分节列表、多交付物等;车道 B 适合决策/研究类动词配合依赖数据的领域名词,或显式多步、需要当前外部数据的任务。单次查询(如「明天天气怎么样」)会被刻意压在阈值以下,避免误拆。

文档中的判定示例(宿主侧打分,不依赖模型配合):

用户提示 结果
what's the weather 不拆分
look up tomorrow's weather for me 不拆分(单次查询)
recommend me a movie 不拆分(得分 2,低于阈值 3)
pick me a stock likely to rise tomorrow 车道 B → PLAN.md + notes/
compare these three laptops and pick one 车道 B
write a 3000-word industry report, 4 parts 车道 A → 4 段骨架
带 1./2./3. 分节列表的提示 车道 A(分节标题用作 part 标题)

宿主如何介入

打分在宿主完成,无需模型自觉。车道 A 信号包括:显式字数/字符数、显式 part 数、编号分节列表、长文关键词加写作动词、超长提示词、多交付物表述等。车道 B 信号包括:pick / recommend / evaluate / compare / analyse / predict / research / screen 等动词,加上 stocks、funds、housing、flights、papers、competitors、laptop 等依赖数据的领域名词,或显式多步措辞、「需要当前外部数据」等。

规程通过 agent/pre-step 前置到同一次请求(不额外多一轮),且仅作用于以人类消息开始的那一步。

安装与依赖

在 profile 下安装官方包名(装完后需重启 DSH):

dsh plugin --profile <your-profile> add dsh-task-splitter

从源码打包安装时,README 给出:

npm pack
dsh plugin --profile <your-profile> add file:./dsh-task-splitter-0.1.0.tgz

(打包产物文件名以实际 npm pack 输出为准;当前 package.json 版本为 0.1.1。)

宿主需暴露 agent/pre-step、ctx.agents 与 ctx.sessions,并与 @deepseek-ai/dsh-agent / dsh-session 的 ^0.1.1-rc.2 || ^0.2.0-rc.1 兼容。Node 引擎要求 >= 20。README 记载在 Windows 上 DSH 0.2.0-rc.2 与 llama.cpp 服务的 Qwen3 上做过测试。

插件以当前 DSH 进程权限运行;安装前建议阅读 GitHub 仓库 源码与 MIT 许可证,确认与本地环境一致。

配置

在 profile 的 cordis patch(或 home patch)中增加片段,例如:

- id: task-splitter
  config:
    enabled: true
    providers: [qwen-local]   # 空数组表示对所有 provider 生效
    lanes: [parts, plan]      # 去掉一项可关闭对应车道
    minScore: 3               # 车道 A 阈值
    workflowScore: 3          # 车道 B 阈值(提高到 4 更保守)
    maxParts: 8               # 车道 A:最多拆成多少 part
    wordsPerPart: 900         # 车道 A:每个 part 的目标字符量
    tasksDir: tasks           # 相对 session 工作目录
    toolPath: ''              # 注入规程里用的 CLI;默认用内置
    extraRules: ''            # 追加到注入规程末尾的补充说明(环境特定的工具名/服务地址)

检测是启发式的;调高 workflowScore / minScore 可减少误触发。最坏情况只是多注入一条短指令,不会阻塞任何一轮。

车道 A 配套 CLI:dsh-task-parts

插件自带 dsh-task-parts(亦可通过 dsh-task-splitter/task-parts 引用),在模型外驱动 parts 流程:

node bin/task-parts.mjs init <taskDir> --title "T" --parts "one|two|three"
node bin/task-parts.mjs status <taskDir>     # 各 part 完成状态,未完成时 exit 2
node bin/task-parts.mjs next <taskDir>       # 下一个待写 part
node bin/task-parts.mjs assemble <taskDir>   # 拼接为 final.md

典型用法是:宿主识别车道 A 后建好 tasks/<slug>/parts/ 骨架,模型按注入规则每轮只填一段,完成后在任务目录执行 assemble 得到整稿。

适用场景与局限

更适合谁:本地小模型(如 Qwen3 27B IQ2、maxTokens: 8192)做 DSH 日常对话;需要长文分块写出,或多步调研/对比类任务且希望中间结果落盘、按步推进的开发者。

需要接受的局限(README 明确写出):

  • 车道 B 保证流程与诚实(计划、证据、来源、不确定性、禁止编造数据),不保证选股、预测等结论正确;没有行情/财务数据源时,规程应引导模型说明无法给出可靠结论,而不是编数字。
  • 误检/漏检可通过 minScore、workflowScore 调节;插件从不硬拦用户一轮。
  • 仓库内 test-sim.mjs 含 27 个离线模拟用例,npm 包内不包含该文件。

DSH 生态强调「一切皆插件」;社区目录 SkillHub 插件页 为独立站点,与 DeepSeek / 幻方无官方从属关系。

小结

dsh-task-splitter 把「长产出」和「长流程」两类问题在宿主侧分开处理:前者用 parts 骨架与 assemble,后者用 PLAN.md 与 notes/ 按步执行。若你正在 DSH 上用小上下文本地模型扛长任务,可先按上文命令安装、按需调整 lanes 与阈值,再结合任务目录里的 CLI 走完整流程。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜