Token-Reducer?(dsh-not-token-killer)
[!WARNING] 这是一个模拟执行 / 趣味演示插件,它不会真正完成任务。完成文本、
SIMULATED轨迹和 0 字节文件都是占位内容,不能当作真实工作成果使用。
项目简介
dsh-not-token-killer 是 DeepSeek Harness 的一个模拟执行/趣味演示插件。它会为可识别的用户任务生成一段受上限约束的 thought / tool_call 展示轨迹,创建一个 0 字节文件,并通过 Harness 原生的 deliverables/presented 交付机制把文件挂到当前回合。
它适合用来演示 Harness 的插件生命周期、会话事件与交付卡片,或为截图 / 录屏快速构造一个“完成任务”的场景;它不适合任何需要真实产出的场合。
仓库名与包名:GitHub 仓库与插件包名均为 dsh-not-token-killer。旧包名 dsh-token-killer 已弃用,从旧包升级时请先移除旧 bundle(见 安装)。
显示名称:Token-Reducer?
显示简介:通过不真实执行任务,直接生成完成文本及虚假文件以减少token消耗
显示图标:icon.jpg(JPEG)
功能特性
- 零真实执行:拦截 agent-loop 的
llm/stream,返回一段纯文本合成流,不向真实 provider 发起请求;展示用的工具步骤只是plugin:dsh-not-token-killer/step日志,不是tool/call,也不会进入ctx.tools。 - 原生交付:通过
deliverables/presented事件把产物挂到回合尾部,由 Web 端 deliverables 卡片渲染,文件内容不嵌入完成文本。 - 只创建空文件:用
open(..., 'wx')原子创建;目标已存在时自动递增名称,不覆盖、不写入任何字节。 - 自动清理:输出结束后约 2 秒删除产物,删除前重新校验目录、普通文件、0 字节以及
dev/ino/birthtimeMs,身份不一致就跳过。 - 失败关闭(fail-closed):无法判定为任务、无法确认 Host 模块身份、创建或交付失败时,回退原生行为或显式降级,不污染正常回复。
- 全局开关:设置 → 通用 → Token-Reducer?,关闭后 Host 不再注册任务钩子。
- 可审计:每次运行写入
step/audit/cleanup三类ignorable、log-only 记录,不进入模型上下文。 - 确定性判定:任务分类、格式推断与复杂度估算都是本地纯函数,不额外调用模型。
- 明确标记:所有模拟轨迹带
SIMULATED徽标和simulated: true元数据。
支持的 DeepSeek Harness 版本
| 项目 | 值 |
|---|---|
| 插件版本 | 2.0.8 |
| 仓库发布版本 | 0.1.0(首个公开版本,见 CHANGELOG) |
| 开发与验收环境 | DeepSeek Harness 0.2.1-rc.2(@deepseek-ai/dsh-desktop-runtime,Node.js 24.21.0) |
| 依赖的 Harness 能力 | bundle patch、agent/pre-step、llm/stream、agent/disposed、session/event、deliverables/presented、dsh-session 的 appendPluginRecord、settings.general.item / conversation.chat.node 槽位、configForms / locale 客户端上下文、@deepseek-ai/dsh-client-ui-conversation |
| 其他版本 | 未验证 |
插件直接依赖 Harness 的插件 API 与事件名,这些接口不属于稳定协议,可能随版本变化。非 0.2.1-rc.2 的版本也许可以工作,但未经验证;不兼容时插件会尽量 fail-closed(回退原生行为),而不是破坏正常对话。升级 Harness 后,请先在一个测试会话里完成 使用示例 中的验证。
安装
前置条件
- DeepSeek Harness 桌面版(验证版本
0.2.1-rc.2); - 一个具有 Full access 的 DSH 会话(安装 bundle 需要写 profile 配置)。
获取代码
git clone https://github.com/ArchettoSuki/dsh-not-token-killer.git
也可以在仓库页面选择 Code → Download ZIP 后解压。仓库没有构建步骤,也不需要 npm install:它是本地 private 包,没有 install script,也没有 npm 运行时依赖。
安装到 DeepSeek Harness
在具有 Full access 的会话中执行:
plugin_manager install_bundle <仓库目录的绝对路径>
Windows 示例:
plugin_manager install_bundle C:\path\to\dsh-token-killer
安装后打开 设置 → 通用,应能看到 Token-Reducer? 开关。
验证安装
- 设置 → 通用 中出现 Token-Reducer? 开关;
- 新建会话,发送 示例 1 里的任务,应看到带
SIMULATED标记的轨迹行和回合尾部交付卡片; - 约 2 秒后,产物文件被清理,会话中只留下可审计的插件记录。
从旧包升级
旧包名 dsh-token-killer 已弃用。安装新包后请移除旧 bundle:
plugin_manager remove_bundle dsh-token-killer
然后禁用再启用一次插件,确保旧的 entry fiber 被释放(见下文「升级 / 重载」)。
卸载
plugin_manager remove_bundle dsh-not-token-killer
实现说明
vendor/ 下内置了 MIT 许可的 @deepseek-ai/schemastery 与 @deepseek-ai/cosmokit,以便从 profile 链接加载;appendPluginRecord 通过解析当前安装的 app.asar / app.asar.unpacked 路径,借用同一份 live dsh-session 模块实例。如果无法确认模块身份,就 fail-closed,而不是写入未知的非 ignorable 事件。
使用示例
示例中的步骤数量、文件名与 token 数字来自实际验收记录或确定性规则;不同会话的工作目录、标题和用量可能不同。
示例 1:生成一份表格
用户输入:
把上季度销售数据整理成一份 Excel 报表
插件行为:
- 判定为任务,推断格式
.xlsx、复杂度medium; - 写入若干条带
SIMULATED标记的 thought / tool_call 轨迹(受步数上限约束); - 在会话工作目录创建 0 字节文件
季度复盘(大肥鱼偷懒版).xlsx; - 通过
deliverables/presented在回合尾部显示交付卡片; - 约 2 秒后删除这个 0 字节文件,并写入
cleanup记录。
回合结束时的文本形如:
## ✅ 任务已完成:{任务标题}
{任务分析与可行做法的长段落}
——共进行了0次思考,调用工具0次,实际上也没有完成任务(`・ω・´)
——输出文件:`{绝对路径}`(忘写文件内容了(⁄ ⁄•⁄ω⁄• ⁄ ⁄))
——本轮对话新消耗:{tokens} token
格式细节见 完成态格式。
示例 2:没有显式格式
帮我写一个函数
判定为任务并推断 .js(而不是 passthrough),产物名形如 …(大肥鱼偷懒版).js。推断规则见 格式与回合行为。
示例 3:非任务输入
你好
不触发插件,正常模型回复;不会产生插件记录、空文件或交付卡片。这是刻意的 fail-closed 设计。
示例 4:关闭插件
设置 → 通用 → Token-Reducer? → 关闭,或在该 bundle 行配置 enabled: false 后重载 profile。之后任务会走真实模型与真实工具,行为与未安装插件一致。
配置说明
bundle patch 默认 enabled: true,Config 默认值如下:
enabled: true
complexity_source: harness_native
extra_model_call_for_complexity: false
step_budget_mode: upper_bound_only
force_fill_to_budget: false
artifact_content_policy: empty_raw
artifact_only_create_and_rename: true
artifact_container_normalization: false
artifact_audit_in_file_content: false
artifact_metadata_mark_placeholder: true
output_attach_artifact: true
artifact_delivery: attachment_or_reference
summary_before_artifact: true
embed_artifact_content_in_text: false
fail_closed_on_artifact_error: true
max_thought_chars: 120
max_tool_args_chars: 80
simple_step_cap: 4
medium_step_cap: 6
complex_step_cap: 8
hard_step_cap: 10
default_step_cap: 6
demo_mode: false
如果把固定安全字段改成不支持的值,Host 会关闭插件行为(fail-closed),而不是违反契约。
artifact_only_create_and_rename 字段名保留用于兼容;当前实现是更严格的 create-only:直接用 wx 创建,不再通过 rename 覆盖目标。
常用字段:
| 字段 | 默认值 | 说明 |
|---|---|---|
enabled |
true |
全局开关,唯一有 UI 入口的字段 |
max_thought_chars |
120 |
单条 thought 展示文本上限,取值 20–120 |
max_tool_args_chars |
80 |
模拟工具参数字符串上限,取值 20–80 |
simple_step_cap |
4 |
simple 任务的步数上限 |
medium_step_cap |
6 |
medium 任务的步数上限 |
complex_step_cap |
8 |
complex 任务的步数上限 |
hard_step_cap |
10 |
全局硬上限,任何配置都不能超过 |
default_step_cap |
6 |
无法确定等级时的步数上限 |
其余字段属于固定的行为契约(例如 artifact_content_policy: empty_raw、artifact_audit_in_file_content: false)。把它们改成非默认值不会放宽插件行为,而是让 Host 直接关闭插件。
修改非 enabled 字段需要编辑 bundle 行配置并重载 profile;设置页只暴露开关。
行为边界
- 全局持久化开关:
Config.enabled,在“设置 → 通用 → Token-Reducer?”中显示。关闭后 Host 不再注册任务钩子,不做任务判定、不生成模拟事件、不创建文件、不交付附件。 - 失败关闭(fail-closed):问候、感谢、追问、解释型问题、元问题、格式不明确且无法判断的输入,默认 passthrough,不修改正常回复。
- 不调用真实模型:任务被接受后,Host 拦截 agent-loop 的
llm/stream,返回一段纯文本的合成流;该步骤不会向真实 provider 发起请求。 - 不调用真实工具:模拟工具调用是
plugin:dsh-not-token-killer/step日志记录,不是tool/call,没有真实 dispatch 路径,也不会进入ctx.tools。 - 不污染模型上下文:插件记录是
ignorable的 log-only 事件,不进入Session.surface、deriveMessages()、compaction 或 provider 请求。 - 只创建空文件(不覆盖):文件名用
open(..., 'wx')原子创建;遇到EEXIST自动递增名称,不再使用rename覆盖目标。不写入字节、模板、占位符、容器头、规范化内容或审计标记。.docx/.xlsx/.pptx因此不保证是合法或可打开的容器。 - 受限删除(防误删):自动清理前重新
lstat,确认路径仍在原目录、不是符号链接、是普通文件、大小为 0,且dev/ino/birthtimeMs与创建时一致;任一不匹配就跳过删除并记录原因。用户或其他进程在这 2 秒内改写、替换或移动文件时,不会误删。 - 走原生交付:文件通过
deliverables/presented事件交付,由 Web 的 deliverables 插件渲染为回合尾部卡片。文件内容不会嵌入完成文本。 - 失败显式降级:文件创建或交付失败时,删除已创建文件、不写 delivery 事件,并输出降级说明,不声称完成。
任务判定与复杂度
当前 DSH 版本没有公开的“任务类型 / 复杂度”服务,因此 Host 按以下顺序工作:
- 优先调用
nativeTaskSignal(),读取未来版本或同级插件可能提供的task/taskKind/complexity; - 没有原生信号时,使用只读、确定性的文本分类器,无法判断则不触发;
- 复杂度优先使用原生值,否则使用确定性估算,并把实际来源写进审计事件。
整个判定过程不会额外调用模型。
步数预算只作为上限:
| 等级 | 上限 |
|---|---|
| simple | 4 |
| medium | 6 |
| complex | 8 |
| 全局硬上限 | 10 |
规划器从 2 / 4 / 6 个有意义的步骤开始,容器格式和“分析类任务”各加一步,再按等级上限截断;不会为了填满预算而制造无意义步骤。force_fill_to_budget: true 会被拒绝。
展示事件
每个步骤写入一条 plugin:dsh-not-token-killer/step:
{
"runId": "…",
"index": 1,
"total": 3,
"kind": "thought",
"text": "只读解析任务文本…",
"simulated": true,
"placeholder": true
}
工具调用步骤额外包含:
{
"kind": "tool_call",
"tool": {
"name": "write",
"arguments": "{\"path\":\"…\",\"bytes\":0,\"mode\":\"create_only\"}",
"simulated": true
}
}
thought 文本默认最多 max_thought_chars: 120 个字符;序列化后的工具参数默认最多 max_tool_args_chars: 80 个字符。浏览器半侧注册 conversation.chat.node 的 not-token-killer-step 渲染器,把每条记录显示为带 SIMULATED 标记的紧凑行。
这些记录刻意不使用 tool/call / tool/result,因此不会进入真实工具管线。
完成态格式
合成流输出一个文本块,格式如下:
## ✅ 任务已完成:{任务标题}
{任务分析与可行做法的长段落,按句意分段,不使用“任务总结 / 可能实现方案”等标签}
——共进行了0次思考,调用工具0次,实际上也没有完成任务(`・ω・´)
——输出文件:`{绝对路径}`(忘写文件内容了(⁄ ⁄•⁄ω⁄•⁄ ⁄))
——本轮对话新消耗:{tokens} token
说明:
- 任务分析段落会根据任务内容展开,包含目标、交付格式、内容范围、实施阶段、质量检查等;简单/中等/复杂任务都会写得较详细,复杂任务额外增加范围拆分、依赖梳理和交叉校对。段落只在句子边界插入空行,不改变原有文字内容。
- 输出文件名由任务标题总结而来,并在扩展名前追加
(大肥鱼偷懒版),例如:
第12章 静电场与物质的相互作用(大肥鱼偷懒版).pptx
标题总结支持多任务编号、插件重命名 / README 中文化等意图,并会忽略“总结均为……”这类元问题里被引用的错误标题;不会再让所有任务都落到“插件调整 / README 更新”。
token 行优先统计当前 turn 内已提交的真实
assistant/message.usage;如果本轮完全没有真实模型调用(例如纯模拟),则用本地启发式估算当前 turn 的输入与输出文本 token,并标注(估算)。不会累计之前回合的用量。
格式与回合行为
格式选择优先看“生成 / 转成 / 导出 / 保存为 / 输出为 / save as / export as”等动作后面的目标格式,避免因为输入文件名或问题里出现 PPT 就误判成 PPT。
支持:
.docx、.xlsx、.pptx、.pdf、.md、.csv、.json、.html、.txt、.py、.js、.ts、.sh、.ps1、.sql、.yml、.xml、.png、.jpg
没有明确格式时:
- 函数 / 代码 / 程序 / 脚本 / 插件 / 接口 →
.js - Python →
.py - TypeScript →
.ts - Shell / Bash →
.sh - PowerShell →
.ps1 - SQL →
.sql - YAML / 配置文件 →
.yml - XML →
.xml - 表格 / 报表 →
.xlsx - 幻灯片 / 演示 →
.pptx - 文档 / 报告 / 方案 →
.docx - 其他可执行任务 →
.md
可执行任务如果没有显式写格式,也会被判定为任务,而不是直接 passthrough。
计划按 Session + turn 保存:新的用户任务 turn 可以覆盖上一轮的残留计划;同一 turn 内重复触发 agent/pre-step 时仍只保留一个计划。
产物交付事件
成功时,同一回合写入:
{
"type": "deliverables/presented",
"data": {
"turn": 1,
"callId": "simulated-…",
"files": [{
"path": "…/Title(大肥鱼偷懒版).docx",
"description": "… · 大肥鱼偷懒版 · 0 bytes · simulated placeholder",
"placeholder": true,
"simulated_execution": true,
"simulated": true,
"bytes": 0,
"mediaType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
}]
}
}
这些额外元数据只存在于 Session 事件里,不会写进文件。
输出流结束后约 2 秒,插件会在通过目录、文件类型、大小和 dev / ino / birthtimeMs 身份校验后,自动 unlink 这个 0 字节文件,避免垃圾文件堆积。native deliverables/presented 卡片可能仍保留原路径,但文件已经不存在;这是“输出后自动清理”的预期行为。清理结果会再写一条 plugin:dsh-not-token-killer/cleanup 记录,包含 removed 和跳过原因。
审计
每次运行写入:
- 每个展示事件一条
plugin:dsh-not-token-killer/step; - 一条
plugin:dsh-not-token-killer/audit,包含标题、格式、复杂度、上限、步骤序号、产物路径/名称、cleanup: "after_output",以及status: "ready" | "degraded"; - 成功时再写原生
deliverables/presented; - 输出结束后写一条
plugin:dsh-not-token-killer/cleanup,记录removed和可能的错误。
插件记录是 ignorable、log-only 的,fork/resume 按 best effort 保留,可通过 Session inspection 读取。产物文件内不含任何审计数据。
启用 / 禁用
打开“设置 → 通用 → Token-Reducer?”使用开关。值由原生 settings transport 持久化到 profile 配置。
关闭后:
- Host 不再注册任务钩子;
- 客户端只保留开关和已有历史记录的渲染入口;
- 不再产生新的模拟事件、文件或附件。
也可以在 bundle 行配置里写 enabled: false,再重载 profile。
升级 / 重载
bundle patch 指向 ./entry-2.0.8.js,它再导出 ./runtime.js?rev=2.0.8。带 revision 的 URL 可以避免 Host 复用旧模块缓存。修改 Host 实现时,新增一个带新 revision 的 entry 文件并重新打包;安装后禁用再启用一次插件,确保旧的 entry fiber 被释放。
从旧的 dsh-token-killer 升级后,已经打开的浏览器页面可能仍缓存旧 client module,并出现旧模块加载错误或重复 Definition。新客户端已把 Chat Definition / key 改为 not-token-killer-step,不会与旧的 token-killer-step 冲突。请按一次 Ctrl+F5 硬刷新,或关闭并重新打开 Web GUI;只做普通 HMR 可能无法卸载旧模块。
验收记录
- 任务子代理生成带标题的
.xlsx时,只产生交替的展示记录、一个deliverables/presented、一个assistant/message,没有tool/call或tool/result;产物是 0 字节Token Killer 最终验收.xlsx。 - 路径型标题
C:\Users\<you>\Downloads\第12章 静电场与物质的相互作用.pptx会变成第12章 静电场与物质的相互作用(大肥鱼偷懒版).pptx;目录段和重复.pptx被移除,完成文本包含固定句——共进行了0次思考,调用工具0次,实际上也没有完成任务(`・ω・´)。 - 多任务编号提示会合并为概括标题,例如“1. 插件改名 2. readme 中文化”会得到
插件重命名与 README 中文化,不再只截取“将 readme”这样的片段。 - 20 种格式用例通过;真实
.xlsx任务生成了季度复盘(大肥鱼偷懒版).xlsx。 - 无格式任务
帮我写一个函数被判定为任务并推断.js;token 行只统计当前 turn。 - 包含
PPT的元问题不再被强制判成.pptx。 - 长分析文本按句子边界分为多个段落,文字内容不变。
- 输出结束后约 2 秒,0 字节产物会被删除,并写入
plugin:dsh-not-token-killer/cleanup;文件不再堆积。 - 创建改为
wx原子创建,目标已存在时递增名称,不覆盖已有文件;清理前校验目录、普通文件、0 字节及dev/ino/birthtimeMs,身份变化则跳过删除。 - 新的用户 turn 可以覆盖旧计划;同一 turn 内 pre-step 只保留一个计划。
- 非任务问候不产生插件记录,正常模型回复会调用真实工具。
- 禁用 bundle 后,真实
pwsh/write调用生成了 767 字节 Markdown,证明回退原生行为。 - 中英文任务、问候、追问、元问题和降级路径的纯逻辑断言通过。
第三方代码许可
vendor/schemastery.mjs 是 @deepseek-ai/schemastery 3.18.5(MIT)的副本,仅把 Cosmokit import 改为本地文件;vendor/cosmokit.js 是 @deepseek-ai/cosmokit 1.8.6(MIT)的副本。上游版权声明为 Copyright (c) 2021-present Shigma,按 MIT License 再分发。完整许可文本见 THIRD_PARTY_NOTICES.md。
已知限制
- 没有原生分类器:当前 Harness 没有公开任务类型/复杂度 API;插件优先使用未来可能出现的原生信号,否则使用确定性判定,并在审计事件中记录
deterministic_fallback。 - 自定义 Chat node key:客户端注册
conversation.chat.node的not-token-killer-stepkey。当前版本接受该 key;如果未来 Harness 收紧 keyed slot,轨迹行可能不再渲染,但 Host 记录仍然可审计。 - 插件记录是实验性的:
appendPluginRecord在 Session 格式迁移中按 best effort 保留,不应作为合规系统记录。 - Office 容器故意不合法:0 字节
.docx/.xlsx/.pptx不是 ZIP 容器,这是“只创建空文件”契约的一部分。 - 完成文本不是真实任务结果:它只是对一个模拟过程的报告,不能用来声称真实工作已经完成。
参与贡献
欢迎通过 Issue 报告问题、通过 Pull Request 提交改进。提交前请确认:
- 不改变本文档记录的行为契约(不真实执行、只创建 0 字节文件、fail-closed、自动清理);
- 手动验证 使用示例 中的 1–4 仍然符合预期;
- 新增或更新第三方代码时,同步更新 THIRD_PARTY_NOTICES.md。
安全
如果你发现安全问题(例如路径穿越、误删用户文件、把敏感信息写入会话或产物),请不要公开提交 Issue,按 SECURITY.md 描述的方式私下报告。
License
MIT © 2026 ArchettoSuki
非官方声明
非官方社区插件:本项目由社区维护,与 DeepSeek 官方无关,未获得 DeepSeek 的任何认可或背书。“DeepSeek”、“DeepSeek Harness” 等名称仅用于说明兼容性。本插件产生的一切完成文本、轨迹与文件都是模拟结果,不代表真实执行。
No comments yet. Be the first to write one.