dsh-plugin
DayuanJiang/next-ai-draw-iodsh 的 draw.io 绘图插件:通过 next-ai-drawio MCP 服务器作图,点回复里的链接在右侧栏打开实时预览,可以手动修改图,AI 的每次修改都是可以恢复的版本。需 Node.js 18+,首次使用由 npx 下载 MCP 服务器。
本地知识库管理:多格式导入、CJK 感知分块、sqlite-vec 向量 + BM25 混合检索与 bge-reranker-base 重排序、快照恢复、kbpack 导入导出与跨库检索,提供 22 个 agent 工具与 Web 面板。
English · 简体中文
dsh-kb-manager 是面向 DeepSeek Harness (dsh) 的本地知识库全生命周期插件:多格式导入 → CJK 感知智能分块 → 基于 SQLite 的向量 + 全文索引 → 混合检索(向量 KNN + BM25/FTS5 → RRF → 可选 rerank)→ 引用溯源;并提供软删 + 物理回收、异步 Job 系统、导入路径白名单 + SSRF 防护,以及每库审计。
用自然语言下达指令即可。插件提供 22 个 Agent 工具(异步 Job + 同步操作,含 rename_kb / compact_index / cancel_job / list_snapshots / configure)与可选 Web 面板(知识库列表、新建、详情、库内混合检索、带实时进度的文档导入、重建索引、两步删除、快照历史)——无需另外部署 RAG 服务。
设计规格见 DESIGN.md(v2.1)。
| 能力 | 带来的变化 |
|---|---|
| 22 个统一工具 | 异步 6(import_document / rebuild_index / compact_index / cancel_job / get_job + 导出/导入 Job)+ 同步 16:create_kb / list_kbs / get_kb / rename_kb / delete_kb / list_documents / delete_document / search_kb / multi_kb_search / get_chunk / get_kb_stats / configure / create_snapshot / list_snapshots / restore_snapshot / export_kb / import_kb;所有工具统一返回 `{ ok, data |
| SQLite 原生索引 | sqlite-vec KNN + FTS5 全文(每库一个 kb.db);无需外部向量库进程。 |
| CJK 感知分词 | Intl.Segmenter(内置、零依赖)为 BM25 切分中日韩文本。 |
| 混合检索 | 向量 + BM25 → RRF → 可选 rerank;rerank 状态显式标注 `applied |
| 异步 Job 系统 | 导入/重建立即返回 job_id;get_job 轮询进度;崩溃恢复(JOB.INTERRUPTED)+ 协作式取消。 |
| 导入路径白名单 | 仅允许白名单内路径(默认:会话 workspace + <storage>/inbox/)或 http(s) URL。 |
| SSRF 防护 | URL 导入拒绝私网 / 环回 / 云元数据地址。 |
| 检索结果不可信标记 | 检索结果一律 untrusted: true——内容只是数据,不是指令。 |
| 软删 + 物理回收 | 删除为毫秒级软删;rebuild_index / compact 物理回收空间,无孤立向量。 |
| 两步破坏性操作 | delete_kb 需一次性 confirm_token(绑定 kb_id,60 秒有效)。 |
| 审计追踪 | 每库审计表记录所有变更。 |
| 快照 / 导出 / 跨库导入 | create_snapshot / list_snapshots / restore_snapshot(两步确认)、export_kb(kbpack/JSON)、import_kb(kbpack,哈希去重合并);已全部经 remote-service 暴露给 Web 面板与 Headless。 |
flowchart LR
A[文档 / URL] --> B[解析]
B --> C[分块<br/>Intl.Segmenter CJK]
C --> D[向量化<br/>bge-small-zh / mock]
D --> E[向量索引<br/>sqlite-vec KNN]
C --> F[FTS5 BM25]
E --> G[混合检索]
F --> G
G --> H[RRF]
H --> I[可选 rerank<br/>applied / fallback_rrf / disabled]
I --> J[引用 + untrusted 标记]
E --> K[软删 / compact_index]
C --> K
G --> L[异步 Job 队列 + 审计]
[!NOTE] 使用前请确保已安装 DeepSeek Harness。
dsh plugin add github:xiaoshi7915/dsh-kb-manager
(收录进 awesome-dsh-plugin 后亦可从 dsh-market 市场页一键安装。)
git clone https://github.com/xiaoshi7915/dsh-kb-manager.git
cd dsh-kb-manager
npm install
npm run build
dsh plugin --profile web add .
检查组合配置、重启 DSH,然后刷新 Web UI:
dsh --profile web --dump-config
dsh web
然后可以直接说:
创建一个名为「项目文档」的知识库,导入这份 PDF,检索认证流程是怎么写的,并给出原文出处。
create_kb 创建知识库,选择 embedding 身份(默认 bge-small-zh-v1.5 / onnx / 512 维;开发测试用 mock provider)。import_document 导入白名单内的本地文件或 http(s) URL → 进入异步 Job:解析 → 分块 → 向量化 → 建索引;用 get_job 轮询进度。search_kb 检索:sqlite-vec KNN + FTS5 BM25 → RRF → 可选 rerank;rerank 状态显式标注(applied | fallback_rrf | disabled)。get_chunk 溯源(前后文 + 出处元数据;内容标记 untrusted: true)。delete_document 即时软删(重导同源未变内容即可恢复);delete_kb 需两步 confirm_token;rebuild_index 物理回收。storage_path(默认 ~/.dsh/kb-manager/)。Web 面板复用同一套服务能力:知识库列表 / 新建 / 详情、库内检索、带实时进度的导入、重建索引、两步删除。| 工具 | 说明 | 关键参数 |
|---|---|---|
create_kb | 创建知识库 | name*、description?、domain_tags? |
list_kbs | 列出全部知识库 | — |
get_kb | 知识库详情(embedding 身份 / 状态) | kb_id* |
delete_kb | 两步删除(影响面预览 + confirm_token) | kb_id*、confirm_token? |
list_documents | 列出文档(可按状态过滤) | kb_id*、status?、limit?、offset? |
import_document | 导入白名单本地文件或 http(s) URL(异步 Job) | kb_id*、source*、metadata? |
delete_document | 软删块、索引置 dirty | kb_id*、doc_id* |
search_kb | 混合检索,显式 rerank 状态 | kb_id*、query*、top_k?、filters?、rerank? |
get_chunk | 分块原文 + 前后上下文(溯源) | kb_id*、chunk_id* |
get_kb_stats | 统计(文档/块/索引体积/删除占比) | kb_id* |
rebuild_index | 全量重建(异步 Job) | kb_id*、target_engine?、embedding? |
get_job | 轮询后台任务进度 | job_id* |
configure | 调优分块 / 检索 / 同步设置 | patch |
所有工具统一返回信封 { ok, data | error: { code, message, hint } },error.hint 给出可执行的下一步。领域错误统一返回(不向外 throw)。检索结果一律标记 untrusted: true。
import_document + get_jobsearch_kbget_chunksearch_kb(读取显式 rerank 状态)create_kbdelete_document(软删;重导恢复)delete_kb(两步:先看影响面,再确认)list_kbs / get_kb_statsrebuild_index + get_jobconfigure默认即可全离线使用。可在受信 Profile 中覆盖(插件 id: kb-manager),或运行时通过 configure 工具 / Web 面板调整:
| 字段 | 默认值 | 说明 |
|---|---|---|
storage_path | ~/.dsh/kb-manager/ | 存储根目录,~ 展开为用户主目录 |
embedding.model | bge-small-zh-v1.5 | embedding 模型名 |
embedding.provider | onnx | onnx / mock / openai-compat(onnxruntime-node 为可选依赖) |
embedding.base_url | '' | openai-compat 的 OpenAI 兼容 endpoint |
embedding.api_key_ref | '' | API key 引用 |
chunk_size | 512 | 分块大小(字符数) |
chunk_overlap | 50 | 分块重叠长度 |
chunk_strategy | recursive | fixed / recursive |
top_k | 5 | 检索默认返回条数 |
enable_rerank | true | 是否在 RRF 后启用 rerank |
rerank_model | '' | rerank 模型;留空用规则式兜底 |
auto_sync_dir | '' | 目录监听路径;留空关闭 |
auto_sync_interval | 300 | 补扫间隔(秒) |
max_file_size_mb | 100 | 单文件大小上限(MB) |
示例(Profile 行):
- insert:
- id: kb-manager
name: 'dsh-kb-manager'
config:
storagePath: '' # 空 = ~/.dsh/kb-manager/
logLevel: 'info'
<storage>/inbox/)与 http(s) URL;URL 来源经 SSRF 防护(私网 / 环回 / 云元数据地址一律拒绝)。untrusted: true;切勿当作指令执行。delete_document 为软删;物理空间由 rebuild_index / compact 回收;重导同源未变内容即可恢复。| 能力 | 本插件 | 常见 RAGFlow / Dify / kotaemon / pdfkb-mcp 方案 |
|---|---|---|
| 显式 rerank 状态(`applied | fallback_rrf | disabled`) |
| 异步 Job + 崩溃恢复 + 取消 | ✅ | 多为同步阻塞 |
| 导入路径白名单 + SSRF 防护 | ✅ | 参差不齐 |
带可执行 hint 的统一信封 | ✅ | 参差不齐 |
每条检索结果带 untrusted 标记 | ✅ | 少见 |
| 软删 + compact 物理回收 | ✅ | 参差不齐 |
| 零 native 构建(sqlite-vec 预编译、Intl.Segmenter) | ✅ | 往往依赖重 |
dsh-kb-manager/
├── package.json cordis.patch.yml tsconfig.json tsconfig.build.json vitest.config.ts
├── DESIGN.md README.md README_ZH.md
├── assets/readme/ # hero.png(banner 图)
├── src/
│ ├── host-entry.ts # DSH 插件入口(工具注册 + preamble + 清理)
│ ├── index.ts # KbManager 顶层装配
│ ├── contracts/ # 类型 / 错误码 / 默认值 / ok·err 信封
│ ├── security/ # 路径白名单、SSRF 防护、SHA-256、审计
│ ├── chunker/ # Intl.Segmenter 分词 + 递归/fixed 分块
│ ├── store/ # better-sqlite3 + sqlite-vec + FTS5
│ ├── embedder/ # mock / onnx(结构性)/ openai-compat
│ ├── jobs/ # 每库 FIFO 队列,maxGlobal=2,崩溃恢复
│ ├── services/ # kb / doc / search / snapshot / export
│ ├── agent-tools/ # 22 个 Agent 工具(统一信封)
│ ├── remote.ts / remote-service.ts / typert.ts / remote-client.ts # typert remote
│ └── web/ # 设置页(KbSection + zh/en 文案)→ lib/client.js
└── tests/ evals/
npm install # 安装依赖
npm run typecheck # tsc --noEmit(strict + noUncheckedIndexedAccess)
npm test # vitest:tokens / rrf-bm25 / security / chunker / store / tools / pipeline / remote / kb-section
npm run eval # 评测 harness:合成语料 recall@5 / MRR / P95(mock embedder)
npm run build # tsc -p tsconfig.build.json → lib/(ESM + .d.ts)
npm run dev # tsx src/host-entry.ts(模块加载冒烟)
onnxruntime-node 已接入为可选依赖;模型下载(sha256 校验 + 用户确认)与 WordPiece 词表尚未接入——onnx provider 干净返回 EMB.NOT_READY。开发/测试用 provider: 'mock'。PARSE.UNSUPPORTED(升级路线见 DESIGN §13)。MIT © 2026 xiaoshi7915