用 dsh-context-doctor 看清 DeepSeek Harness 每次请求注入了多少上下文

前言

在 DeepSeek Harness(dsh)里跑编码智能体时,模型每个请求都会自动带上一批注入物:从 git 根到当前目录层层叠加的 AGENTS.md / CLAUDE.md、技能目录里每一条 name + description、当前可见的工具 schema,以及 MCP 服务器展开出来的工具面。这些内容常驻在输入里,计量条只能给出一个总数。重复段落、描述完全相同的技能、同名技能互相遮蔽,通常要等上下文告警才被注意到。

DeepSeek Harness 的设计原则是「一切皆插件」:界面、工具、压缩都可以替换。社区目录 deepseek-harness-plugin.com 是独立收录站,和 DeepSeek / 幻方没有官方从属关系,不能当成官方应用商店。其中有一款界面增强插件专门做这件事:把常驻注入拆开,逐项估算 token,标出重复和冲突。

本文按插件目录详情页、GitHub README / package.json / agent-setup.md 与仓库源码交叉核对后整理:dsh-context-doctor 是什么、审计哪些对象、怎么安装、怎么用。

这是什么

dsh-context-doctor 是面向 DeepSeek Harness 的上下文注入审计插件。目录页归在「界面增强」,由 Zhenyu98 维护,仓库为 Zhenyu98/dsh-context-doctor。GitHub API 在 2026-08-17 显示 12 星;package.json 当前版本 0.5.0,许可证为 BSD-3-Clause(LICENSE、目录页与 GitHub 元数据一致)。主要语言是 JavaScript / TypeScript。

它解决的问题很具体:不要只看计量条上的一个数字,而是回答「指令链、技能目录、工具 schema、MCP 工具各自占多少」「哪些段落或技能描述完全重复」「同名技能谁胜出、谁被静默遮蔽」。审计路径只读,不改被检查的文件。

插件有两种入口,可以一起用:

  1. Web UI 里的 Context Doctor 圆环面板,替代发送按钮左侧的上下文计量控件。
  2. 模型可调用的 context_audit 工具,输出分节报告和按严重度排序的裁剪建议。没有 Web 界面时,工具仍然可用。

核心功能

圆环面板:常驻成本一眼能看

装好并重启 dsh web 之后,已有会话的发送按钮左侧会出现 Context Doctor 控件。圆环显示常驻上下文的估算 token(指令链 + 技能目录 + 工具 schema),颜色按仓库 README 给出的阈值分级:绿小于 10k、黄小于 30k、红大于等于 30k。

面板本身是英文等宽界面,指标和建议卡片用低饱和语义色;外层 DSH 外壳仍跟随浅色、深色或系统主题。点击后展开四组明细:Instruction chainSkills catalogTool schemasMCP tools,并提供手动刷新。数据走 GET /api/context-doctor/audit,host 侧默认缓存 60 秒。

新会话还没分配 sessionId 时,不会出现会话级控件。原生替代还要求当前 DSH 提供 conversation.input.context 插槽;没有该插槽的版本仍可调用 context_audit,只是看不到这块 UI。

四类常驻注入,外加可选的技能正文

README 把审计对象分成五类,前四类是每请求常驻成本:

注入物 统计什么
指令链 从 git 根到当前工作目录每一层的 AGENTS.md / CLAUDE.md:文件数、token 估算、跨文件完全相同的重复段落
技能目录 ctx.skills 里全部技能的 name + description(模型每请求看到的 <available_skills>),按来源分组,并找出描述完全相同的冗余技能
工具 schema ctx.tools.schemas 中当前 agent 可见的全部工具:数量、schema token,以及原生工具与 MCP 工具分组
MCP 工具面 按服务器汇总 MCP 工具数与 schema token,用来识别工具面膨胀
技能正文(可选) 前 N 个技能正文的总 token;按需加载,不计入常驻请求,用来对比「目录摘要」和「真正读正文」的成本差

冲突检测针对同名技能多来源并存:例如项目技能把 bundled 技能 shadow 掉时,报告胜出者与被遮蔽者(rank shadow)。

token 不是模型 tokenizer 的精确值。README 写明启发式规则:ASCII 约 4 字符/token,中文约 1.5 字符/token,用来做相对比较和排序;和计量条对不上时,以模型侧实际计数为准。MCP 工具 schema 目前只按 name + description 估算,不计入 JSON Schema 参数细节。指令链重复检测只认完全相同的段落块,换一种表述写同一条规则不会被标出来。

context_audit:报告可以直接拿去裁

模型调用 context_audit 后,得到一份 canonical JSON(AuditReport),原生渲染成五段可读报告:指令链、技能、工具、冲突、建议。建议按严重度排序,模型可以按条目去改文件、关技能或收工具面。

默认是摘要:成本、冲突、修复建议。加上 detail=developer 会多一张 context-audit receipt:已加载指令文件的路径、字节、token、加载顺序和重复块短预览;catalog 里每条技能的名称、来源、provider、描述字节;每个 tool schema 的序列化字节与签名;重复 MCP 签名;shadowed skill 关系。回执不含完整 prompt 或技能正文。

报告里的 trimmed 字段,当前版本固定为 unavailable。README 的说明是:只有 DSH 暴露上下文装配轨迹之后才会填条目,避免把看不到的状态写成「已经裁过」。

安装与启用

目录详情页上的安装命令是:

dsh plugin add github:Zhenyu98/dsh-context-doctor

dsh CLI 会从 GitHub 解析插件并装进当前配置。目录页同时提醒:如需可复现安装,应固定 commit 哈希,形式为 dsh plugin add github:Zhenyu98/dsh-context-doctor#commit。本文核对仓库时,main 最新提交是 a15e68d68f511db5ae4057c96ae1c727e21bf1b1(2026-08-17):

dsh plugin add github:Zhenyu98/dsh-context-doctor#a15e68d68f511db5ae4057c96ae1c727e21bf1b1

仓库 README / agent-setup.md 面向 Web UI 的写法带了 --profile web,并钉在 main 分支;git 源安装已包含构建产物,不必本机构建:

dsh plugin --profile web add "github:Zhenyu98/dsh-context-doctor#main"
dsh --profile web --dump-config | grep context-doctor

合成树里应出现类似下面的 insert 条目:

- insert:
    - id: context-doctor
      name: 'dsh-context-doctor'

然后重启 dsh web。成功信号有两个:已有会话的 composer 旁出现圆环,或新会话里模型调用 context_audit 返回分节报告。

agent-setup.md 列出的前置条件是:本机已安装 DeepSeek Harness(dsh 在 PATH 中,版本 ≥ snapshot0811 / 0.0.1-rc.1)。Node.js ≥ 22.19 只在开发 / 构建时需要。若 dsh plugin 报找不到 pnpm,需要先把 pnpm 放进 PATH——安装是显式的包管理操作。

也可以把仓库提供的安装说明交给 Codex、Claude Code、Cursor 或 DSH 里的 agent,让它按 agent-setup.md 执行;改文件、用凭据或跑破坏性命令前,应先看计划。

浏览器面板的默认审计目录和缓存可以写在配置里:

context-doctor:
  defaultCwd: /path/to/project
  cacheTtlMs: 60000

defaultCwd 缺省为进程启动目录;cacheTtlMs 缺省 60000 毫秒。

典型用法

模型直接调用工具即可。仓库给出的调用形式如下:

context_audit
context_audit cwd=/path/to/project
context_audit includeSkillBodies=true maxSkillBodies=20
context_audit detail=developer

不传参数时,审计当前会话工作目录。includeSkillBodies 会逐个加载技能正文,默认关闭;maxSkillBodies 默认 20。

README 中的报告结构示例(字段名与嵌套来自仓库,数值是文档里的示意,不是某次真实会话的测量结果):

{
  "tool": "context_audit",
  "version": 1,
  "cwd": "/path/to/project",
  "injected": {
    "instructions": {
      "files": [{ "path": "...", "bytes": 3421, "tokens": 812 }],
      "totalTokens": 812,
      "duplicateBlocks": []
    },
    "skills": {
      "catalogCount": 177,
      "catalogDescriptionTokens": 4150,
      "bySource": [],
      "duplicateDescriptions": []
    },
    "tools": {
      "visibleCount": 42,
      "schemaTokens": 9800,
      "nativeCount": 38,
      "nativeTokens": 6100,
      "mcp": {
        "servers": [{ "server": "github", "tools": 12, "schemaTokens": 2400 }],
        "totalTools": 12,
        "totalTokens": 2400
      }
    }
  },
  "conflicts": [],
  "suggestions": []
}

没有 Web 时,把插件挂到 headless profile 后直接让模型调用 context_audit 即可。源码在没有 webServer 服务时会跳过 HTTP 路由注册,工具不受影响。

圆环不出现时,按 README 的顺序排查:是否已重启 dsh web、是否进入已有会话的 composer、dump-config 是否含 context-doctor。原生替代还依赖 conversation.input.context 插槽;改过插件源码必须重新执行 ./scripts/build.sh

适用场景与注意事项

适合已经在 DSH 里堆了多层 AGENTS.md、大量技能和 MCP 服务器,计量条发红却说不清预算花在哪的人。也适合维护共享项目指令、给智能体做环境体检:先看常驻 catalog 有多贵,再决定要不要打开 includeSkillBodies 对比正文成本。只跑 CLI / headless 的用法同样成立,只是没有圆环。

使用前要接受这些边界(均来自 README 的 v0.5 说明与安全章节):

  • 审计只读:只用 ctx.fs 的 read / stat / list,不写、不删、不执行被审计对象。
  • 单文件超过 256 KB 会跳过,避免审计器被大文件拖垮。
  • 报告只含路径、统计和重复段落片段,不含完整文件内容;技能正文默认只在显式打开时统计总量,仍不输出正文。
  • 重复检测不做语义相似度;MCP schema 估算不含参数 JSON Schema。
  • token 是启发式估算,用来排优先级,不能当计费依据。

目录页写明:插件以当前 dsh 进程的权限运行,安装时可能执行代码。安装前应检查源代码仓库和许可证;需要可复现安装时,固定 commit 哈希,不要长期钉在浮动的 main 上。

小结

dsh-context-doctor 把「上下文很满」拆成可以逐项核对的账单:指令链、技能目录、工具 schema、MCP 工具面各占多少,哪些完全重复,同名技能谁被遮蔽。Web 圆环负责日常扫一眼,context_audit 负责给出能执行的裁剪建议;审计本身保持只读。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-context-doctor/

GitHub:https://github.com/Zhenyu98/dsh-context-doctor

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

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

小夜