前言¶
DeepSeek Harness(dsh)把会话事件记在本地规范日志里,这是排查智能体循环的一手材料。一旦部署打开会话遥测后端,同一批事件还会再走一条外发路径:先投影成 SessionTelemetryRecord,再交给 collector。官方文档写得很清楚:session-telemetry/record 这条 waterfall 本身不带任何脱敏规则,没挂监听器时,后端收到的就是捕获时的原样副本。
问题也因此出现。会话事件里经常夹着 Authorization、cookie、apiKey、sk-... 这类凭证。规范日志可以留在本机,外发副本却可能进 OpenTelemetry、反馈通道或自建 collector。DeepSeek 官方仓库的口号是「一切皆插件」,这条脱敏缝也留给部署自己补。dsh-telemetry-redactor 就是挂在这条缝上的社区 Profile Bundle:默认拦截外发副本,分享前先抹掉已支持的敏感模式,同时不改写规范会话日志。
本文依据插件目录页、GitHub README / SECRET-MATRIX.md / SECURITY.md、npm 包说明,以及 DeepSeek Harness 官方会话遥测文档交叉核对后整理。社区插件目录是独立站点,与 DeepSeek / 幻方没有官方从属关系。
这是什么¶
dsh-telemetry-redactor 是一个最小的 DeepSeek Harness Profile Bundle,由 GitHub 用户 030611 维护,当前版本 0.1.0,许可证 MIT,主要语言 TypeScript。目录页把它归在「会话与消息」分类;截至 2026-08-18,GitHub 与目录页均显示 3 颗星。npm 上同名包于 2026-08-14 发布。
它解决的问题很窄:在已配置的遥测后端收到导出副本之前,对受支持的凭证模式做递归脱敏。仓库 README 强调两件事:
- 插件只改变外发副本,绝不改写权威 session log。
- 它不添加、不替换、也不启用任何遥测后端;只保护部署已经选好的后端会处理的那些记录。
dsh.plugin.json 把效果声明为只挂 session-telemetry/record,network、filesystem 均为 false,modelVisible 为 false。README 的「Model Experience」一节也写明:不贡献 prompt、工具 schema、消息或模型请求,对 KV Cache 无影响。
维护者把它和另外三个社区 trust-layer 插件并列:Verification Receipt、Evidence Audit、Context Provenance。它们同样声明「由社区维护,并非 DeepSeek 官方项目」。
核心功能¶
挂在官方 waterfall 上¶
官方 SessionTelemetryCoordinator 会在进入 session-telemetry/record 之前,对规范会话事件做深拷贝。插件源码里的挂载方式是:
ctx.on('session-telemetry/record', (_record, next) => redactRecord(next(), replacement), { prepend: true })
它先调用 next(),让其他部署规则继续组合,再对返回值做一份新的递归脱敏记录。监听器以 Cordis prepend 注册,因此通常会包裹其前后挂载的规则,并脱敏这些规则的最终输出。官方文档对这条 waterfall 的约定与此一致:监听器通过变换 next() 的返回值来叠加;抛错则由 coordinator 隔离,只扣下这一条导出副本,不进入 agent loop。
仓库把这种行为叫做 fail-closed,但含义很窄:只表示官方 coordinator 丢弃这一条失败的导出副本,agent loop 继续跑。它不是「所有遥测路径、所有 listener 顺序都不可绕过」的保证。SECURITY.md 写明:第三方 dispatcher 如果忽略官方隔离约定,就不在支持边界内。
脱敏哪些内容¶
规则写死在源码里,不能通过配置关闭。README 与 SECRET-MATRIX.md 列出的支持范围如下。
高风险键名下的完整值会被替换,例如 authorization、cookie、credential、password、secret、token、apiKey、access_token、clientSecret、privateKey。键名本身若命中已识别凭据模式,键名也会被改写;改写后若发生键冲突,整条记录会被拒绝而不是半脱敏导出。
字符串里还会匹配这些固定模式:
Bearer/Basic后跟至少 8 个凭据字符sk-...- GitHub token(
ghp_/gho_/ghu_/ghs_/ghr_、github_pat_) - Slack token(
xoxa-/xoxb-/xoxp-/xoxr-/xoxs-) - JWT 三段式
token=...、api_key: ...这类带标签的赋值
匹配前会先对键名分词,因此 inputTokens、output_tokens、tokenUsage、tokenCount、contextTokenCount 以及 tokenizer 这类计数和普通字段会保留。递归处理数组、普通对象和 null-prototype 对象中的可枚举 JSON 数据,最多 64 层容器;超深、循环引用、accessor、非普通对象会抛错,由官方 coordinator 扣下该条副本。
默认替换文本是 [REDACTED]。
明确不覆盖的边界¶
SECRET-MATRIX.md 把「检测」和「脱密证明」分开写。下面这些情况可能继续透传,或根本进不了这条规则:
- 既不在敏感键下、也不符合已识别字符串模式的未知秘密格式
- 编码 / 加密后的值、过短的 Bearer、出现在无关字符串里的 Cookie 文本
- LLM / provider 配置里的
apiKey、apiKeyEnv、请求headers(不在SessionTelemetryRecord里) - OTel exporter 的
headers、endpoint URL / query 凭据 - 直接调用后端
emit(),或另一个更外层的 prepended listener 在本插件返回之后再写入内容
因此它是安全过滤器,不是「任意未知秘密都不会泄漏」的证明。导出数据即使经过脱敏,仍应按敏感数据处理。
安装与启用¶
目录页给出的安装命令是:
dsh plugin add github:030611/dsh-telemetry-redactor
需要可复现安装时,按目录页说明固定 commit 哈希:
dsh plugin add github:030611/dsh-telemetry-redactor#<commit>
仓库 README 与 npm 包同时提供按 profile 安装公开包的写法(示例 profile 为 web):
dsh plugin --profile web add dsh-telemetry-redactor
dsh --profile web --dump-config
配置 dump 里必须出现新增的 telemetry-redactor 行。package.json 的 dsh.bundle 指向 cordis.patch.yml,后者只 insert 一条 id: telemetry-redactor 的记录,不会改后端。README 提醒:dsh.plugin.json 只是补充社区元数据,真正控制 DSH 安装的是 dsh.bundle 和 cordis.patch.yml。
兼容性以当前仓库声明为准:Node ^22.19.0 || >=24.0.0;peer 依赖 @deepseek-ai/cordis ^4.0.1、@deepseek-ai/dsh-session-telemetry >=0.1.0-rc.5 <0.2.0。release smoke 使用随包携带、对应官方 commit 47f943859bef60e4160492346772ded9b24f765a 的冻结 fixture。DeepSeek Harness 仍处于开发者预览,官方 README 已声明会有破坏性变更,安装后应以当时解析到的版本再核对一次。
目录页和官方插件文档都提示:插件以当前 dsh 进程的权限运行,安装时可能执行代码。安装前检查源代码仓库和许可证。
典型用法¶
装好之后,唯一可配项是 replacement。默认 [REDACTED],长度必须是 1 到 128 个字符,且自身不能命中已支持的凭据模式;非法值会在 Cordis plugin fiber 被 await 时直接失败。
- id: telemetry-redactor
config:
replacement: '[TELEMETRY-REDACTED]'
键名规则和字符串模式不能关。想确认插件是否真正挡住了外发副本、同时没改规范日志,仓库提供一组不连网、不调模型、不需要 API key 的测试:
pnpm run typecheck
pnpm test
pnpm run build
pnpm run test:smoke
pnpm run test:performance
pnpm run test:official-head
pnpm run test:official-patch
pnpm run test:packed:clean-env
README 写明:这组测试会用真实 Cordis Loader 与 SessionTelemetryCoordinator 组合——后端只能收到替换值,权威 session event 仍保留 fixture 里的秘密;超深记录会被阻断,异常不会逃出捕获 handler。
日常部署侧的验收更简单:先 dsh --profile <profile> --dump-config 看到 telemetry-redactor,再确认遥测后端本身是你显式选中的。本插件不会替你打开 sharing。
适用场景与注意事项¶
适合已经(或准备)挂上会话遥测后端的 DSH 部署:要把会话事件送到 collector、反馈通道或运维看板,又不希望 apiKey、Bearer、GitHub / Slack token 原样出门。它不适合当成完整的隐私方案——规范日志仍在本地保留明文事件;provider 配置和 exporter 凭证也不走这条 waterfall。
使用前建议同时做到这几件事:
- 阅读仓库
SECURITY.md和SECRET-MATRIX.md,按部署实际审查完整 waterfall listener 集合。另一个插件如果再 prepend 一层更外的监听器,仍可能在脱敏之后加入内容。 - 尽量少采遥测。插件自己的安全文档建议:在明确授权前沿用官方默认关闭的 sharing 策略,限制 collector 访问和留存,脱敏后的记录仍当敏感数据。
- 安装前核对源码、许可证(MIT)和 commit。插件以当前 dsh 进程权限运行,安装时可能执行代码。
- 不要把「fail-closed」理解成全路径不可绕过。直接
emit()、非官方 dispatcher、未知秘密格式,都不在这条规则的承诺里。
小结¶
dsh-telemetry-redactor 做的事情很具体:在官方 session-telemetry/record 上补一条默认拦截的导出脱敏规则,抹掉已支持的凭证模式,留下规范会话日志不动。能力边界写得很清楚,配置也只有替换文本一项。
目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-telemetry-redactor/
GitHub:https://github.com/030611/dsh-telemetry-redactor