前言¶
在 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 走完整流程。