dsh-fingerprint-remover: Removing DSH client fingerprints at the outbound boundary

前言

DeepSeek Harness(DSH)把模型调用、工具描述和系统提示一起序列化后发给上游网关。若请求里带有可被规则匹配的固定文本或标识,网关可能直接拒绝,返回 400 与 code 11-128(Illegal API invocation from an unapproved channel),这与选用的模型无关,而是对请求体中某段连续文本的匹配结果。

社区插件 dsh-fingerprint-remover(维护者 LhyCloud,分类 admin-security)在 DSH 的出站请求边界改写序列化后的 body 与部分 HTTP 头,去除已知客户端特征,降低因此被网关拦下的概率。下面介绍它的定位、能力与安装用法;事实以 GitHub 仓库 README 为准。

这是什么

dsh-fingerprint-remover 是一款 DSH 插件,不更换 provider、模型、路由、凭证、工具名或 DSH 本体,只改写即将发出的 JSON 请求与相关头字段。

README 说明:网关拒绝的不是模型,而是请求里可被匹配的「连续文本」。例如,DSH 请求曾以两句固定的 path 说明开头;单独任一句可得到 200,两句紧挨则触发 11-128;改写第一句即可打破匹配。除该句对外,请求还可能携带 harness 身份句、GUI 段落、checkout 行、本地 Web GUI URL、.dsh / dsh 路径、dsh-* 包名、HOST_* 环境变量、reasoning 块、工具结果以及归因 User-Agent 等,插件按表面对这些项做清洗或替换。

核心功能

网关侧已知触发点(参考)

README 在同上游、同 system slot 下做过对比:两句 reference-rules 连续出现会 400 / 11-128;改写第一句或两句都改写则恢复 200。插件会改写两句,避免相邻配对再次形成指纹。

处理范围

表面 处理方式(摘自 README)
Reference-rules 句对 第一句 paraphrase;第二句同义改写
Harness identity 句 删除
GUI 段落 将含 Web GUI URL 的表述改写
Runtime context 去掉 checkout 行与本地 Web GUI URL;工作区路径替换为 <workspace>
重放历史 system / developer / assistant / runtime-context / user / tool
Reasoning 块 与可见文本相同规则
tool_calls 参数 JSON 字符串清洗
工具与参数描述 清洗 dsh、HOST_*、包名等
User-Agent 将 dsh token 替换为 WorkBuddy 桌面 UA
归因头 移除 x-dsh-*

默认会清洗普通 user 消息;若需保持用户消息字节不变,可在配置中设置 sanitizeUserMessages: false。

实现边界

插件在 globalThis.fetch 处拦截:解析 JSON body → 改写 messages、system、tools → 再序列化发送,并改写 User-Agent、去掉 x-dsh-*。同时保留 system-prompt/assemble 钩子,使会话日志里存的 prompt 已是清洗后的版本。adapter 的 options 被冻结,llm/stream waterfall 无法替换该对象。

安装与启用

官方 README 给出三种安装方式,任选其一:

dsh plugin add dsh-fingerprint-remover

从 GitHub 仓库安装:

dsh plugin add github:LhyCloud/dsh-fingerprint-remover

从本地目录(示例为 desktop profile):

dsh plugin --profile desktop add file:/path/to/dsh-fingerprint-remover

安装后需重启 DSH 一次。启动日志中可出现类似:

[dsh-fingerprint-remover] active … prompt sanitizer on, UA -> WorkBuddy/5.8.4 workbuddy-ai/5.8.4 CLI/2.161.0

package.json 标明插件要求 dsh 引擎 >=0.2.0-rc.1,Node >=20;当前包版本为 1.0.0,许可证 MIT。

配置项

在 DSH 配置中插入插件块(字段含义以 README 为准):

- insert:
    - id: dsh-fingerprint-remover
      name: 'dsh-fingerprint-remover'
      config:
        enabled: true
        providers: []                    # [] = all providers
        sanitizePrompt: true
        sanitizeToolResults: true
        sanitizeUserMessages: true
        sanitizeUserAgent: true
        stripAttributionHeaders: true
        userAgent: 'WorkBuddy/5.8.4 workbuddy-ai/5.8.4 CLI/2.161.0'
        referenceRulesReplacement: 'An @ prefix marks a path the user named explicitly.'
        hostRuleReplacement: 'Relative paths are resolved against the workspace root, while absolute paths refer to files or directories on the machine.'
        dumpPath: ''                      # optional: write the last sanitized request
        verbose: false

dumpPath 非空时会把最后一次清洗后的请求写成机器本地 JSON,便于自查,默认关闭且不会外传。

典型用法

会话内命令

命令 作用
/fingerprint 或 /fingerprint status 状态、计数、最近一次 payload 扫描
/fingerprint scan 最近出站请求:provider/model,清洗前后指纹数量
/fingerprint on / off 当前进程内开关(重启后恢复配置文件)
/fingerprint why 根因说明

只读 JSON 状态(仅 loopback):

GET /dsh-fingerprint-remover

健康检查时,/fingerprint scan 对真实最近一次请求的「剩余指纹」期望为 0。README 回放示例:308 条消息 + 40 个工具,清洗前 4768 个指纹项 → 清洗后 0。

本地测试

仓库内无网络测试:

npm test        # README 写明 17 tests

适用场景与注意

适合谁: 需要通过 WorkBuddy 等网关出站、且因 DSH 固定 prompt 片段或客户端标识触发 11-128 的开发者;属于 admin-security 类能力,使用前应理解改写范围。

权限与信任: 插件以当前 DSH 进程权限运行,能读写出站请求与头;安装前应阅读 源码与 LICENSE,在可恢复的 profile 上验证。README 建议保留插件包管理器生成的备份文件。

范围与限制(README):

  • 规则基于已知指纹锚点;上游新增规则时需插件侧补充对应规则。
  • 不伪造 machineId / sessionId 等 proto 级身份字段。
  • 历史 tool results 被改写后,模型可能看到占位符而非真实路径,这是为降低可检测性做的取舍。

DSH 生态强调「一切皆插件」;社区目录 skillhub.cn 插件页 为独立站点,与 DeepSeek / 幻方无官方从属关系。

链接

  • 目录页:https://www.skillhub.cn/plugins/LhyCloud/dsh-fingerprint-remover
  • GitHub:https://github.com/LhyCloud/dsh-fingerprint-remover
羽毛球分组比赛记分
小程序二维码

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

Xiaoye