dsh-plugin-corpus
Verifieddsh-plugin-corpus · v1.5.0 · GPL-2.0-or-later · Web UI
全局语料库:内容放在一个可整体搬走的根目录,插件按工作区/会话/路径授权,提供检索、按行读取、文档导入、内置小代理结构化、仓库/会话总结接口、后台重建、Web GUI 面板与右栏权限管理。
Install
dsh plugin add dsh-plugin-corpus Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-plugin-corpus(插件使用与开发说明)
dsh-plugin-corpus 是 DeepSeek Harness (DSH) 的文件语料库插件。
它的核心思想很简单:
- 内容是普通文件:语料根目录可以整体搬走、备份;
- 索引只是缓存:每个集合一份 SQLite,可以随时重建;
- 模型只读
processed/:插件不再保存源文件; - 一切访问先过 ACL:按工作区/会话/路径授权,默认拒绝。
当前版本:1.5.0。
1. 安装与启用
从 Release 安装
- 下载
dsh-plugin-corpus-v<version>-plugin.zip; - 解压到
%USERPROFILE%\.dsh\plugins\,得到:%USERPROFILE%\.dsh\plugins\dsh-plugin-corpus\ - 确认 DSH profile 的
dependencies和dsh.profile.bundles都包含dsh-plugin-corpus(通过插件管理器安装时通常会自动完成); - 完全重启 DSH。宿主半部(工具、提示词、面板路由、提取器)和客户端 bundle 都只在进程启动时加载,刷新浏览器不够。
默认语料根:
%USERPROFILE%\.dsh\corpus
可以在面板的 语料库根目录 设置中修改或迁移。
从 npm / 插件市场安装
dsh plugin add dsh-plugin-corpus
安装后完全重启 DSH。npm 包:https://www.npmjs.com/package/dsh-plugin-corpus。
从源码部署
git clone https://github.com/czdcm/dsh-plugin-corpus.git
cd dsh-plugin-corpus
powershell -NoProfile -ExecutionPolicy Bypass -File tools\deploy.ps1
# 完全重启 DSH
tools\deploy.ps1 会把 plugin/ 复制到 DSH 插件目录。GitHub 源码 clone 不含 vendor 二进制;完整安装请用 Release 包,源码开发前先把 vendor 文件放回 plugin/vendor/,否则脚本会提示降级。
2. 界面与日常使用
左侧栏「语料库」
- 导入语料:浏览器文件可多选;本机路径可多行输入(每行一个文件/目录),同一批全部导入同一个集合;集合留空会自动创建
import-日期-时间;集合名支持中文、空格和常用符号(≤64 字符,不能含/ \ : * ? " < > |); - 公式与图形:HTML MathML、Word/PowerPoint OMML、Unicode 数学符号和已有 LaTeX 会统一整理为
$...$/$$...$$;Office/PPT 会读取对象树、连接线、图表并渲染版式缩略图,提示词要求解释图形逻辑,不再以“图示略”跳过; - 检索:按关键词搜索已索引的
processed/内容;结果只用于定位,不直接打开预览; - 查看:文件列表每行的「用外部软件打开」主按钮优先读取 Windows 默认关联直接打开;没有关联时打开系统软件选择器,由 Windows 记录本次选择;
▾可再次打开系统软件选择器;文件列表的图标/名称/类型跟随处理后语料类型,按钮只显示默认应用图标,右侧箭头保留系统选择器;不再内置右侧栏预览; - 语料文件:按集合分组的资源管理器式列表;
- 集合组默认折叠,点集合标题
▸/▾展开或折叠; - 顶部有「全部展开 / 全部折叠」;
- 每行显示图标、名称、类型、大小、导入时间、操作;
- 行尾「删除」是两击确认的软删除;
- 集合组默认折叠,点集合标题
- 重建:增量/全量重建索引;
- 根目录设置:查看、复制、打开、迁移语料根。
右侧栏「语料权限」
- 查看当前会话/工作区实际能访问哪些集合;
- 编辑策略:默认拒绝,按 workspace/session 授权,可设置过期时间;
- 保存前自动备份原策略。
主会话工具
模型可以通过 13 个工具使用语料库:
| 工具 | 用途 |
|---|---|
corpus_search |
在可访问集合中检索 |
corpus_read |
按路径和行范围读取 processed 文档 |
corpus_list |
列出集合与文档 |
corpus_catalog |
返回集合/文档卡片、行数、章节目录摘要 |
corpus_outline |
返回章节/小节标题、起止行号、摘要;缺失目录时按需生成 |
corpus_reindex |
启动增量/全量重建 |
corpus_status |
查看重建/导入任务、索引状态、访问范围 |
corpus_import |
导入本机文件或已上传文件 |
corpus_ingest |
后台提取并导入文档 |
corpus_structure |
把仓库/目录/文件/文本总结为结构化语料 |
corpus_summarize_session |
把会话总结成语料 |
corpus_delete |
软删除单篇或整个集合 |
corpus_access |
解释当前工作区/会话的权限范围 |
3. 数据布局
<CORPUS_ROOT>/
├─ <collection>/
│ ├─ <subfolder>/ 可选,可继续嵌套,形成树状目录
│ └─ <import-folder>/
│ ├─ processed/ 模型使用的 Markdown
│ └─ .meta.json
└─ .corpus/
├─ index/<collection>.sqlite
├─ config.json
├─ outlines/<hash>.json 文档结构目录(不进入检索分块)
├─ import-tmp/
└─ trash/<时间>/ 软删除内容,可手动恢复
每次导入都有自己的文件夹,方便整体删除或迁移;集合内部也可以建子目录并继续嵌套,文件列表按目录分组。
索引表很轻:
docs:文档路径、标题、大小、mtime、hash、块数;chunks:块文本、标题、行号范围;meta:indexed_at等元数据。
删除索引不会丢语料;重新 corpus_reindex 即可重建。
4. 支持的文件格式
| 格式 | 提取方式 |
|---|---|
.md .markdown .txt .text |
直接读取文本 |
.html .htm |
去标签,保留标题/段落/列表 |
.csv |
文本化表格 |
.pdf |
随包 pdftotext 抽文字层;缺文字层/乱码的页逐页用 Windows OCR,最后按页序合并 |
.docx .xlsx .pptx |
优先 OfficeCLI;失败/缺失时回退纯 JS ZIP+XML 解析 |
.png .jpg .jpeg .webp .gif .bmp .tif .tiff |
有可用视觉模型时结构化;否则使用 Windows OCR/占位 Markdown |
PDF 文本在进入 AI 前会做质量闸门:空格比例过低、符号/控制字符异常或夹带 PDF/JPEG 二进制标记的输出会被丢弃。逐页判断:可读的页保留文字层,缺文字层/乱码的页单独 OCR,合并后仍不可读时导入失败,不会把乱码写进 processed/。.meta.json 的 pdfPages 记录总页数、文字层页数、OCR 页数与不可读页数。
面板里的 Vision 不可用时会显示具体原因,通常是当前默认模型不支持图片输入。可以在 DSH profile 的插件配置中设置 ingestVisionProvider / ingestVisionModel 指向可接收图片的模型;未配置视觉模型时图片退回内置 Windows OCR。
完整包随附 PDF/Office 工具。没有 officecli 时 Office 回退纯 JS;没有 pdftotext 时 PDF 文字层不可提取,只能整本走 Windows OCR(非 Windows 则无法导入 PDF)。官方 Release 只发布完整包。
OfficeCLI 是 Apache-2.0;Poppler pdftotext 是 GPL-2.0-or-later,详见仓库根目录的
THIRD_PARTY_NOTICES.md。
5. 访问控制(ACL)
策略文件默认位置:
%USERPROFILE%\.dsh\corpus-access.json
结构示例:
{
"version": 1,
"default": "deny",
"grants": [
{
"workspace": "C:/Users/<you>/work/project-a",
"paths": ["collection-a"]
},
{
"session": "session-id",
"paths": ["collection-b/guides", "collection-b/reference.md"],
"expiresAt": "2027-01-01T00:00:00.000Z"
}
],
"deny": []
}
规则:
- 默认拒绝;
grants按 workspace/session + 路径匹配; - 显式
deny优先于grants; - 过期的 grant 自动忽略;
- 集合名、路径前缀、glob 都可以作为
paths; - 工具调用、提示词列表、面板
/access使用同一套判断。
右栏「语料权限 → 全局」的「全局访问」用于默认拒绝时给指定合集放行:填写合集名后点击添加,保存为 workspace: "*" 的 grant,对所有工作区/会话生效;其他合集仍按默认拒绝。
仓库中的 config/corpus-access.example.json 是脱敏模板;本机 ACL 文件不要提交。
6. 配置项
插件配置(DSH profile 中):
| 配置 | 默认 | 说明 |
|---|---|---|
corpusRoot |
空 | 覆盖语料根;空 = ~/.dsh/corpus |
promptOrder |
9000 |
语料提示词段在 system prompt 中的顺序 |
maxPromptFiles |
12 |
提示词里最多列多少个文件标题 |
maxPromptChars |
8000 |
提示词目录文本的最大字符数 |
ingestProvider / ingestModel |
空 | 内置小代理使用的模型覆盖 |
ingestVisionProvider / ingestVisionModel |
空 | 图片识别使用的视觉模型;留空跟随默认模型 |
ingestMaxChars |
24000 |
单次 ingest 的材料上限 |
ingestTimeoutMs |
120000 |
ingest LLM 超时 |
structureMaxChars |
48000 |
仓库/会话结构化的材料上限 |
maxToolOutputChars |
24000 |
工具返回值的硬上限;超限时逐级压缩长字符串/长数组并标记 _truncated,避免把超大文本写进会话历史 |
perfLogMs |
250 |
单次 corpus_import 超过该毫秒数时写 warn 日志,便于定位慢导入 |
性能说明(v1.5.0):插件跑在 DSH 宿主进程里,任何同步长任务都会连带卡住 GUI。 现在导入按文件异步执行、每 32 个文件或 8ms 让出一次事件循环;单次导入只预热前 40 份目录, 其余按需生成。提示词目录缓存 60 秒、面板轮询缓存 1.5 秒,导入/重建/删除后主动失效。
7. 面板 HTTP API
面板使用同源路由,前缀:
/api/dsh-plugin-corpus
路由列表:
GET /overview GET /files POST /search
POST /read POST /reindex GET /status
GET /access GET /import/targets POST /import
GET /import/status POST /delete GET /gallery
GET /settings POST /settings/root POST /settings/open
GET /app-icon
POST /open-external
GET/POST /policy
这些接口服务于本机 DSH 面板,不应暴露到公网。
常用请求示例
# 概览
Invoke-RestMethod http://127.0.0.1:<port>/api/dsh-plugin-corpus/overview
# 搜索(POST JSON)
Invoke-RestMethod -Method Post `
-Uri http://127.0.0.1:<port>/api/dsh-plugin-corpus/search `
-ContentType 'application/json' `
-Body '{"query":"search terms","limit":8}'
# 文件列表
Invoke-RestMethod 'http://127.0.0.1:<port>/api/dsh-plugin-corpus/gallery?limit=100'
实际端口以 DSH 启动时为准。
8. 限制与安全
- 面板是本地管理界面,没有面向公网的认证;不要反向代理到公网;
corpus_read只读processed/;- 删除是软删除,内容移到
.corpus/trash/; - 浏览器上传单文件默认 25 MiB;本机路径单文件默认 256 MiB;格式白名单见
/import/targets; - 扫描版 PDF 的 OCR 依赖 Windows OCR,速度比文字层提取慢(约 0.25 秒/页);混合型 PDF 只 OCR 缺文字层的页;
- 访问策略文件、本机 ACL 配置不要提交到 Git。
9. 开发
# 运行全部本地验收
powershell -NoProfile -ExecutionPolicy Bypass -File tools\test-all.ps1
# 部署到 ~/.dsh/plugins/dsh-plugin-corpus
powershell -NoProfile -ExecutionPolicy Bypass -File tools\deploy.ps1
# 打完整插件包(唯一的发布形态:包含 OfficeCLI 与 pdftotext)
powershell -NoProfile -ExecutionPolicy Bypass -File tools\package-plugin.ps1
测试使用 Node 自带模块和手写断言;tools/test-all.ps1 优先使用 DSH_NODE,
否则自动查找 DSH 自带 Node 或 PATH 中的 node。
真实语料回归测试默认跳过;需要时设置:
$env:CORPUS_TEST_ROOT = '...'
$env:CORPUS_TEST_IT = '...'
$env:CORPUS_TEST_DSH = '...'
更多架构说明见仓库根目录的 LEARNING.md。
10. 许可证
本项目源码采用 GPL-2.0-or-later。
第三方组件:
- OfficeCLI:Apache-2.0;
- Poppler
pdftotext:GPL-2.0-or-later; - Windows OCR:调用系统 API,不再分发微软二进制。
完整说明见仓库根目录的 THIRD_PARTY_NOTICES.md 与 LICENSE。