前言¶
在 DeepSeek Harness(DSH)里跑 PTC(Program Tool Calling)会话时,模型主要通过内置的 run_code 写程序、调工具。对话变长后,宿主自带的自动压缩会按体量裁历史,并不知道「前四十条消息刚做完一个子任务、后十条是另一件事」。上下文挤满时,模型仍要带着已完成阶段的细节继续推理,成本和窗口压力都会上去。
社区插件 dsh-block-ptc(维护者 mengwEX)在 PTC 场景下引入「黑板块(block)」协议:由模型自己开块、在块内干活,再在合适时机用自写的摘要替换块内消息,保留后续工作仍需要的信息。本文介绍其定位、机制、安装与典型用法;事实以 GitHub 仓库 与 SkillHub 目录页 为准。SkillHub 为社区插件目录,与 DeepSeek / 幻方无官方从属关系。
这是什么¶
dsh-block-ptc 是面向 DSH PTC 模式 的 profile bundle:为 run_code 增加块标记,并在程序内提供 block_compact,让模型控制「哪一段历史可以收成摘要」。当前 npm 版本为 0.4.0;0.4.0 起只支持 block_compact({ ids, content }),旧的 block_summary 工具以及 summary/单 id 参数已不再支持,升级后需重启 DSH 并新建 Block PTC 会话。
插件零运行时依赖(除 node:crypto 外无外部 import),许可证 MIT。分类上常归在「模型推理」相关能力:本质是上下文组织,而非换模型或改推理后端。
核心机制¶
DSH 的 PTC 展示层只允许模型直接调用 run_code,因此块协议写在工具描述里,并在程序内调用压缩 API:
run_code({ description: "[block: <ids>] <goal>", code }) // 模型可直接调用的唯一工具
await tools.block_compact({ ids, content }) // 在程序内调用
下面分步说明插件在会话里做什么。
run_code.description头部的[block: <ids>]声明本段程序推进的块 id;这些 id 作用于整条 assistant 消息(含前面的思考/正文)及其工具结果;同一 assistant 消息里多次run_code的 id 取并集。tools.block_compact({ ids, content })把「最早到最晚出现过的任一目标 id」之间的整段区间,替换为模型提交的content(保留摘要)。- 摘要继承该区间 id 的并集,减去被压缩的目标 id;仍带 id 的摘要可参与后续再次压缩;无剩余 id 的摘要会保留。
- 若区间内某对工具调用尚未结束,请求会排队等待结果;若区间内含受保护的 system/developer 消息,整段区间拒绝压缩,不会静默替换前缀。
示意(README 中的区间替换):
A A B A C B -- compact([A]) --> S[B] C B
S[B] C B -- compact([B]) --> T[C]
T[C] -- compact([C]) --> U[]
对人类而言:会话日志仍是 append-only,原文各轮都还在;模型下一次请求看到的是摘要而非块内原文。Web UI 里摘要会渲染为 compaction checkpoint 节点。插件不会再跑单独的摘要模型,摘要内容由模型在 block_compact 调用里自己写入。
与自动压缩的对比:自动压缩按 token 压力与体量决策;块压缩由模型在子任务边界主动收口。README 也提醒:块关闭后用摘要替换历史可能使缓存后缀失效,更小的上下文不保证更高的 cache 命中率或更低账单;插件报告的 tokensFreed 不是服务商侧的 cache 命中测量。
环境要求¶
- DeepSeek Harness ≥ 0.2.1-rc.2(peer 无上限;该版本曾用于 live 验证)
- Cordis ≥ 4.0.5
- Node ≥ 22(见 package.json
engines)
安装前请知悉:DSH 插件以当前 DSH 进程权限运行,安装 bundle 前应自行查看源码与 MIT 许可证,确认符合你的安全与合规要求。
安装与启用¶
插件是 profile bundle:安装后会在 dsh.profile.bundles 增加一行,并新增 agent 预设 block-ptc,不会修改自带的 ptc 预设。
推荐从 npm 安装:在 Harness Plugin Manager 中找到 dsh-block-ptc,或由已启用 Plugin Manager 工具的 agent 执行:
plugin_manager install_bundle dsh-block-ptc
包发布在 npm。安装完成后:
- 重启应用一次(loader 按解析 URL 缓存插件模块,不重启仍可能是旧一代模块)。
- 在会话预设中选择 Block PTC 并开始新会话。
卸载:
plugin_manager remove_bundle dsh-block-ptc
然后重启。若只想停用而不删包,可使用 plugin_manager set_bundle dsh-block-ptc enabled=false。
典型用法¶
README 建议:先在某块内完成讨论或实现,再在转向其他工作时,对「原文已不再需要」的块做整理。示例对话意图如下——先解释 tokenizer,再转到 lexer,并提示模型在 lexer 开始前整理较早的块:
Explain how the tokenizer works.
After that discussion: move on to the lexer; organize the earlier block if its original content is no longer needed.
预期行为包括:模型用带 [block: …] 的 run_code 标记工作区间;在适当时机于程序内调用 tools.block_compact({ ids, content }),用自写摘要替换对应区间;你在 transcript 里仍能看到完整历史,而模型后续请求的上下文已是压缩后的视图。
升级到 0.4.0 后若仍使用旧 API,需改为 block_compact({ ids, content }) 并新开 Block PTC 会话。
适用场景与注意¶
更适合:长链路 PTC 任务、可划分子阶段的工作(调研一段、实现一段、再讨论下一段),且希望由模型在边界处保留「对自己后续仍有用的」摘要,而不是等宿主按体量统一压缩。
需要留意的限制(摘自 README 设计说明与已知限制类章节,使用前宜通读仓库文档):
- 块协议依赖 PTC 仅暴露
run_code的呈现方式;换预设或宿主行为变更时需自行验证。 - 压缩与缓存、计费的关系是机制说明而非基准测试;勿把
tokensFreed当成供应商 cache 指标。 - 方法存在性检查不能保证事件语义、预设配置或模型行为与新版 DSH 完全一致。
结尾¶
dsh-block-ptc 把「哪一段对话可以收成摘要」的决定权交给模型,在 PTC 单工具表面下用 block_compact 维护可继续推理的上下文,同时让人类侧 transcript 保持完整可追溯。若要安装或看更新说明,可访问 SkillHub 目录页 与 GitHub:mengwEX/dsh-block-ptc(README 含中文版 README.zh.md)。