前言¶
在 DeepSeek Harness(DSH)里跑智能体时,工具和执行命令的输出往往会一次性塞进上下文:几十到几百 KB 并不罕见。结果是窗口被占满、token 成本上升,模型也容易在长噪声里丢掉核心指令(「lost in the middle」),多轮对话里还会反复读同一份文件或同一段命令输出。
context-mode(Mert Koseoglu)的思路是把大段工具输出拦在模型窗口之外,改由本地索引按需检索。dsh-plugin-context-mode 是 Domush 维护的 DSH 原生插件,把上述能力完整接到 Harness 的生命周期与 Web UI 上。下面介绍它做什么、怎么装、怎么配、以及模型侧会多哪些工具。
这是什么¶
- 名称:
dsh-plugin-context-mode(npm 包名与插件 id 一致) - 维护者:Domush
- 分类:工作流(社区目录归类)
- 许可:MIT(README 与 package.json 一致;当前 npm 版本 1.0.2)
- 定位:为 DSH 提供对 context-mode 的完整原生支持——本地 SQLite FTS5 索引、大输出拦截替换、以及 8 个 Context Mode 工具。
插件挂在 DSH 的 tools/post-execute 瀑布生命周期上:超过阈值的输出会被拦截并索引,模型只收到紧凑预览和可检索的句柄。
Context Mode 在解决什么问题¶
标准 agent 循环里,大工具输出直接进入上下文,典型后果包括:
- 上下文窗口饱和,token 费用变高。
- 噪声导致指令与目标被遗忘。
- 多轮里重复读取相同内容。
Context Mode 的做法(插件 README 与原项目一致):
- 大于 4 KB(默认阈值)的输出自动拦截,写入本地 SQLite FTS5。
- 向模型返回短预览 + 索引句柄。
- 模型通过
ctx_search等工具,用 BM25 与 Trigram RRF(RRF_K=60)按需取片段。 - 压缩或子代理场景下,用 session journal 与
ctx_resume等保持连续性。
存储引擎使用 Node.js 原生 node:sqlite(DatabaseSync)与 FTS5 虚拟表(porter unicode61、trigram),README 写明无需额外 C++ 编译或本地二进制安装。
核心功能¶
八个原生工具¶
| 工具 | 作用(据 README) |
|---|---|
ctx_execute |
沙箱执行 Node.js / Python / shell,输出上限 16 KB;超出部分索引,可按 intent 做语义过滤 |
ctx_batch |
批量 shell,结果拼接后统一进 FTS5 |
ctx_index |
显式索引文件、文本或 URL,不撑开上下文 |
ctx_search |
跨 session / worktree 检索已索引块 |
ctx_resume |
压缩边界或子代理后,用 ≤2048 B 的状态块恢复上下文 |
ctx_stats |
拦截字节、未进窗口字节、估算 token 节省等统计 |
ctx_doctor |
SQLite FTS5 分词器与运行环境诊断 |
ctx_purge |
清理索引源或清空 Context Mode 表 |
自动拦截与 UI¶
- autoIntercept:默认开启;超过
replaceTriggerBytes的输出被替换为 head/tail 预览与 search handle。 - Web UI:DSH 设置里提供自定义区块;实时指标(bytes kept out、token savings、进度条)、诊断表、一键 vacuum / purge。
- 语言:
en.json、zh.json双语界面文案。
数据库与表结构¶
默认库路径:~/.context-mode/context.db。表包括 events(回合日志)、sources(索引目录)、chunks / chunks_tri(FTS5)、meta(元数据)。可通过配置项 dbPath 覆盖路径(空字符串表示使用默认)。
安装与启用¶
插件从 npm 拉取,不要用 dsh plugin add github:... 自行拼接仓库地址。
在 DSH Web UI 中安装¶
- 打开 DeepSeek Harness Web UI,进入 Settings → Plugins。
- 点击 Add Plugin。
- 粘贴插件名:
dsh-plugin-context-mode
- 点击 Install,从 npm 安装并立即生效。
使用 CLI¶
dsh plugin install dsh-plugin-context-mode
写入 Profile(package.json)¶
{
"dependencies": {
"dsh-plugin-context-mode": "^1.0.0"
},
"dsh": {
"profile": {
"bundles": [
"dsh-plugin-context-mode"
]
}
}
}
说明:profile 示例中的依赖版本写为 ^1.0.0;npm 当前发布为 1.0.2,可按需收紧版本范围。
配置¶
在 cordis.patch.yml 或 DSH Settings 中插入(与 README 一致):
- insert:
- id: dsh-plugin-context-mode
name: dsh-plugin-context-mode
config:
enabled: true
autoIntercept: true
replaceTriggerBytes: 4096
injectSystemPrompt: true
dbPath: "" # defaults to ~/.context-mode/context.db
| 配置项 | 类型 | 默认 | 说明 |
|---|---|---|---|
enabled |
boolean | true |
启用/禁用插件 |
autoIntercept |
boolean | true |
自动拦截并索引超阈值输出 |
replaceTriggerBytes |
number | 4096 |
触发拦截的字节阈值 |
injectSystemPrompt |
boolean | true |
向系统提示注入 Context Mode 工具说明 |
dbPath |
string | "" |
自定义 SQLite 路径;空则 ~/.context-mode/context.db |
典型用法¶
以下 JSON 参数摘自 README,可在模型调用对应工具时复现。
ctx_execute:带输出上限的执行,大输出进索引。
{
"language": "shell",
"code": "git log --oneline -n 100",
"intent": "merge commit"
}
ctx_batch:多命令一批执行,再按查询检索。
{
"commands": ["pnpm test", "git status --short", "cat package.json"],
"queries": ["dependencies", "test failed"]
}
ctx_index:把文件编入 FTS5,不展开到对话上下文。
{
"path": "docs/architecture.md",
"source": "architecture-doc"
}
ctx_search:对已索引内容做 BM25 + Trigram RRF 检索。
{
"queries": ["PostToolUse", "FTS5 schema"],
"limit": 5
}
ctx_stats:查看节省报告。
{
"scope": "all"
}
经过上面的步骤,模型在需要细节时先 ctx_search,而不是把完整日志留在每一轮上下文里。
适用场景与注意¶
适合谁
- 经常在 DSH 里跑 shell、读大文件、或多工具串联,且上下文经常被输出撑满的团队或个人。
- 希望本地优先、用 SQLite 检索替代「整段输出复读」的智能体工作流(目录分类为「工作流」与此一致)。
使用注意
- 权限边界:
ctx_execute、ctx_batch等在 DSH 进程权限与环境里运行;安装前请阅读 仓库源码 与 MIT 许可证,确认符合你的安全策略。 - 依赖归属:核心能力与 context-mode 对齐;插件 README 标注 Context Mode 版本徽章 v2.1.7,与上游生态保持一致时需自行关注 upstream 变更。
- 生态说明:DSH 奉行「一切皆插件」;SkillHub 目录页 为社区收录,与 DeepSeek / 幻方无官方从属关系,不要当作官方应用商店条目理解。
结尾¶
dsh-plugin-context-mode 把 Context Mode 的拦截、索引、检索和恢复能力接到 DSH 原生生命周期与设置界面,适合需要控制上下文体积、又希望按需取回工具输出细节的场景。