用 dsh-telemetry-redactor 给 DeepSeek Harness 会话遥测做导出脱敏

前言

DeepSeek Harness(dsh)把会话事件记在本地规范日志里,这是排查智能体循环的一手材料。一旦部署打开会话遥测后端,同一批事件还会再走一条外发路径:先投影成 SessionTelemetryRecord,再交给 collector。官方文档写得很清楚:session-telemetry/record 这条 waterfall 本身不带任何脱敏规则,没挂监听器时,后端收到的就是捕获时的原样副本。

问题也因此出现。会话事件里经常夹着 Authorization、cookie、apiKeysk-... 这类凭证。规范日志可以留在本机,外发副本却可能进 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/recordnetworkfilesystem 均为 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 列出的支持范围如下。

高风险键名下的完整值会被替换,例如 authorizationcookiecredentialpasswordsecrettokenapiKeyaccess_tokenclientSecretprivateKey。键名本身若命中已识别凭据模式,键名也会被改写;改写后若发生键冲突,整条记录会被拒绝而不是半脱敏导出。

字符串里还会匹配这些固定模式:

  • Bearer / Basic 后跟至少 8 个凭据字符
  • sk-...
  • GitHub token(ghp_ / gho_ / ghu_ / ghs_ / ghr_github_pat_
  • Slack token(xoxa- / xoxb- / xoxp- / xoxr- / xoxs-
  • JWT 三段式
  • token=...api_key: ... 这类带标签的赋值

匹配前会先对键名分词,因此 inputTokensoutput_tokenstokenUsagetokenCountcontextTokenCount 以及 tokenizer 这类计数和普通字段会保留。递归处理数组、普通对象和 null-prototype 对象中的可枚举 JSON 数据,最多 64 层容器;超深、循环引用、accessor、非普通对象会抛错,由官方 coordinator 扣下该条副本。

默认替换文本是 [REDACTED]

明确不覆盖的边界

SECRET-MATRIX.md 把「检测」和「脱密证明」分开写。下面这些情况可能继续透传,或根本进不了这条规则:

  • 既不在敏感键下、也不符合已识别字符串模式的未知秘密格式
  • 编码 / 加密后的值、过短的 Bearer、出现在无关字符串里的 Cookie 文本
  • LLM / provider 配置里的 apiKeyapiKeyEnv、请求 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.jsondsh.bundle 指向 cordis.patch.yml,后者只 insert 一条 id: telemetry-redactor 的记录,不会改后端。README 提醒:dsh.plugin.json 只是补充社区元数据,真正控制 DSH 安装的是 dsh.bundlecordis.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。

使用前建议同时做到这几件事:

  1. 阅读仓库 SECURITY.mdSECRET-MATRIX.md,按部署实际审查完整 waterfall listener 集合。另一个插件如果再 prepend 一层更外的监听器,仍可能在脱敏之后加入内容。
  2. 尽量少采遥测。插件自己的安全文档建议:在明确授权前沿用官方默认关闭的 sharing 策略,限制 collector 访问和留存,脱敏后的记录仍当敏感数据。
  3. 安装前核对源码、许可证(MIT)和 commit。插件以当前 dsh 进程权限运行,安装时可能执行代码。
  4. 不要把「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

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

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

小夜