用 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

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

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

小夜