🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

会话语义搜索 minhaoli/dsh-session-query-vector

DeepSeek Harness
minhaoli15 天前有提交已提供中文文档扫描:含敏感能力

用自然语言描述,找出讨论该话题的会话

29.4/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/23 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add minhaoli/dsh-session-query-vector
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · chat
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 15 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 11 处,展示前 11 条)
  • 发起网络请求
    lib/index.js:289
    res = await fetch(url, { method: "POST", headers, body: JSON.stringify(body), signal: ctrl.signal });
  • 读取密钥环境变量
    indexer.mjs:41
    const API_KEY = process.env.VEC_API_KEY ?? "";
  • 读取本地文件
    indexer.mjs:70
    try { dirs = readdirSync(root, { withFileTypes: true }); } catch { return map; }
  • 读取本地文件
    indexer.mjs:75
    try { subs = readdirSync(p1, { withFileTypes: true }); } catch { continue; }
  • 读取本地文件
    indexer.mjs:80
    try { files = readdirSync(p2); } catch { continue; }
  • 读取本地文件
    indexer.mjs:84
    const m = statSync(join(p2, target)).mtimeMs;
  • 发起网络请求
    indexer.mjs:106
    const res = await fetch(url, {
  • 写入本地文件
    indexer.mjs:166
    mkdirSync(dirname(DB_PATH), { recursive: true });
  • 读取本地文件
    indexer.mjs:172
    try { holder = readFileSync(LOCK_PATH, "utf8").trim(); } catch {}
  • 写入本地文件
    indexer.mjs:182
    writeFileSync(LOCK_PATH, String(process.pid));
  • 删除本地文件
    indexer.mjs:183
    process.on("exit", () => { try { unlinkSync(LOCK_PATH); } catch {} });
扫描于 2026/11/2(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-session-query@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 的语义会话搜索后端,由 Ollama 或任意 OpenAI 兼容的嵌入端点提供支持。

README

由 DeepSeek 最新模型翻译生成
dsh-session-query-vector 给 DSH 的会话语义搜索后端,跑在 Ollama 或任何 OpenAI 兼容的 /v1/embeddings 接口上。 DSH 自带一个 SQLite 全文后端(@deepseek-ai/dsh-session-query-sqlite),回答的是「哪个会话出现过这个词」。这个包把它换成向量后端,回答的是「哪个会话在讲这件事」—— 你用自己的话问,查询被嵌入成向量,最接近的片段带着会话和摘录一起返回。 它是对官方后端的直接替换:两者都扩展同一个 sessionQuery 服务,所以同一时刻只能挂一个。 适用版本 | DSH | 0.2.1-rc.2(开发与验证所用版本) | | @deepseek-ai/cordis | ~4.0.5 | | @deepseek-ai/schemastery | 3.18.5(DSH 自带) | | Node.js | 22+ —— 索引器用的是内置 node:sqlite(DatabaseSync) | | 嵌入服务 | 本地 Ollama,或任何 OpenAI 兼容 API | 更早的 DSH 版本未验证。 两个部分 | 部分 | 是什么 | | lib/index.js | 查询侧 —— 一个 SessionQueryEngine 子类,作为插件挂载。
展开完整文档(README 剩余 1 节)
dsh-session-query-vector

给 DSH 的会话语义搜索后端,跑在 Ollama 或任何 OpenAI 兼容的 /v1/embeddings 接口上。

DSH 自带一个 SQLite 全文后端(@deepseek-ai/dsh-session-query-sqlite),回答的是「哪个会话出现过这个词」。这个包把它换成向量后端,回答的是「哪个会话在讲这件事」—— 你用自己的话问,查询被嵌入成向量,最接近的片段带着会话和摘录一起返回。

它是对官方后端的直接替换:两者都扩展同一个 sessionQuery 服务,所以同一时刻只能挂一个。

适用版本

| DSH | 0.2.1-rc.2(开发与验证所用版本) |
| @deepseek-ai/cordis | ~4.0.5 |
| @deepseek-ai/schemastery | 3.18.5(DSH 自带) |
| Node.js | 22+ —— 索引器用的是内置 node:sqlite(DatabaseSync) |
| 嵌入服务 | 本地 Ollama,或任何 OpenAI 兼容 API |

更早的 DSH 版本未验证。

两个部分

| 部分 | 是什么 |
| lib/index.js | 查询侧 —— 一个 SessionQueryEngine 子类,作为插件挂载。搜索时只读索引,从不触发嵌入。 |
| indexer.mjs | 索引侧 —— 独立脚本。遍历 ~/.dsh/sessions,嵌入消息正文,写入向量。 |

刻意分开:搜索必须快,嵌入很慢。查询侧在搜索路径上绝不触发嵌入;索引没建好就返回空结果。

两侧必须用同一个嵌入模型。 否则存的向量和查询向量不在同一个空间里,所有分数都是噪声。embedModel 两边要配成一样。

安装

dsh plugin --profile <你的 profile> add github:minhaoli/dsh-session-query-vector

包里声明了 dsh.bundle.patch,所以 dsh plugin add 会把它写进 dsh.profile.bundles,下次启动即挂载。

bundle patch 同时会 disable 官方后端,因为两者都注册 sessionQuery:

本包自带的 cordis.patch.yml
- id: session-query-sqlite
disabled: true

- insert:
- id: session-query-vector
name: 'dsh-session-query-vector'
config:
provider: ollama
baseUrl: 'http://127.0.0.1:11434'
embedModel: bge-m3
openAt: first-search

如果你想保留官方后端,就把第一行删掉、并且不要挂这个包 —— 两者不能共存。

配置

写在 profile 的 cordis.patch.yml 里。patch 是整块替换目标行的 config 而不是合并进去,所以要保留的键必须一起重写。

~/.dsh/profiles/<profile>/cordis.patch.yml
- insert:
- id: session-query-vector
name: 'dsh-session-query-vector'
config:
path: 'C:/Users/<you>/.dsh/storages/session-query-vector.sqlite'
provider: openai
baseUrl: 'https://api.siliconflow.cn/v1'
apiKey: 'sk-...'
embedModel: 'BAAI/bge-m3'
openAt: first-search
topK: 20
minScore: 0.45

| 键 | 默认值 | 含义 |
| path | ~/.dsh/storages/session-query-vector.sqlite | 索引库。首次使用时创建。 |
| openAt | first-search | startup 挂载时开库;first-search 首次查询时开;never 完全禁用搜索。 |
| provider | ollama | ollama 或 openai。openai 指任何 OpenAI 兼容的 /v1/embeddings。 |
| baseUrl | http://127.0.0.1:11434 | 嵌入接口地址。结尾的 /v1 会被剥掉再加回去,所以 https://host/v1 和 https://host 都能用。 |
| apiKey | "" | 非空时以 Authorization: Bearer 发送。Ollama 不需要。 |
| embedModel | bge-m3 | 必须和索引器一致。 |
| embedTimeoutMs | 120000 | 单次请求超时。 |
| topK | 20 | 排序前从索引里取的候选数。 |
| minScore | 0.45 | 余弦相似度下限。 |
| relMargin | 0.10 | 相对截断:只有分数落在最佳命中 relMargin 之内的才算。 |
| snippetChars | 240 | 结果里摘录的长度。 |
| readWindowMax | 50 | 引擎「优先读活会话」的读取窗口。 |

接口契约

Ollama(provider: ollama)

POST {baseUrl}/api/embeddings
content-type: application/json

{ "model": "bge-m3", "prompt": "要嵌入的文本" }

返回 { "embedding": [0.013, -0.021, ...] }。

先把模型拉下来:

ollama pull bge-m3

OpenAI 兼容(provider: openai)

POST {baseUrl}/v1/embeddings
authorization: Bearer <apiKey>
content-type: application/json

{ "model": "BAAI/bge-m3", "input": ["片段一", "片段二"] }

返回 { "data": [{ "index": 0, "embedding": [...] }, ...] }。用之前会按 data[].index 排序 —— 有些提供方不按顺序返回。

baseUrl 结尾的 /v1 会先被剥掉再拼 /v1/embeddings,所以 https://api.siliconflow.cn/v1 不会变成 /v1/v1/embeddings。

满足这个契约的接口都能用:SiliconFlow、OpenAI、Azure OpenAI、Together、本地 vLLM 或 LM Studio,等等。把 baseUrl、apiKey、embedModel 设成那家自己的叫法即可。

建索引

indexer.mjs 不由 DSH 启动 —— 查询侧配好之后自己跑。它需要能 import 到 @deepseek-ai/,所以要用 DSH 的运行时跑(见下)。

分层:先第 1 层(用户消息),再第 2 层(助手消息)
node indexer.mjs

node indexer.mjs --layer=1 # 只跑用户消息 —— 最快让搜索可用
node indexer.mjs --layer=2 # 只跑助手消息
node indexer.mjs --limit=200 # 本次最多处理 200 个会话
node indexer.mjs --status # 只打印进度,不索引
node indexer.mjs --force # 强制重跑未变更的会话
node indexer.mjs --quiet # 不刷进度行,只记关键事件
node indexer.mjs --skip-active=5 # 跳过最近 5 分钟内有写入的会话

| 环境变量 | 默认值 | 含义 |
| DSH_HOME | ~/.dsh | DSH 主目录,其余路径都由它推导。 |
| DSH_MODULES | $DSH_HOME/node_modules/@deepseek-ai | 从哪里解析 @deepseek-ai/。打包版桌面应用要覆盖。 |
| VEC_DB | $DSH_HOME/storages/session-query-vector.sqlite | 索引路径 —— 必须等于插件的 path。 |
| VEC_SESSIONS | $DSH_HOME/sessions | 会话日志根目录。 |
| VEC_PROVIDER | ollama | ollama 或 openai —— 必须等于插件的 provider。 |
| VEC_BASE_URL | http://127.0.0.1:11434 | 必须等于插件的 baseUrl。 |
| VEC_API_KEY | "" | 必须等于插件的 apiKey。 |
| VEC_MODEL | bge-m3 | 必须等于插件的 embedModel。 |
| VEC_CHUNK | 1200 | 每个片段的字符数。 |
| VEC_BATCH | 16 | 每次嵌入请求的片段数。 |
| VEC_SUBAGENTS | — | 设为 1 时把子 agent 会话也纳入。 |

对打包版桌面应用跑索引器

Electron 应用的 @deepseek-ai/* 模块在 app.asar 里,普通 node 读不到。把 DSH_MODULES 指向 asar,并用应用自己的二进制以 Node 模式跑:

$env:ELECTRON_RUN_AS_NODE = '1'
$env:DSH_MODULES = 'D:/APP/deepseek harness/resources/app.asar/dsh/node_modules/@deepseek-ai/'
& 'D:\APP\deepseek harness\DeepSeek Harness.exe' indexer.mjs --status

从源码检出跑的话,直接 node indexer.mjs 就行 —— DSH_MODULES 已经指向真实文件。

索引结构

单个 SQLite 文件,application_id = 1146308690(和官方后端区分开),user_version = 1。application_id 属于别的应用的文件会被拒绝,而不是覆盖掉。

| 表 | 作用 |
| vec_chunks(session_id, seq, type, time, chunk_idx, text, dim, vector BLOB) | 每个嵌入片段一行。主键 (session_id, seq, chunk_idx)。 |
| vec_sessions(id, revision, indexed_at, chunks, cwd, layer) | 每会话的簿记;revision 决定增量跳过。 |
| vec_queries(text, vector, dim, at) | 查询向量缓存,重复搜索省掉一次嵌入往返。 |

所有表都是 STRICT。每个会话一个事务,中断不会留下写了一半的会话。

值得知道的失败模式

- 结果为空但没报错。 索引没建,或者建的时候用了别的模型。跑一下 --status。
- database ... belongs to another application。 path 指向了本包没创建过的文件。
- database ... is not an empty or recognized index。 文件存在且有表,但没有 application_id —— 换个 path 或删掉它。
- /v1/v1/embeddings 404。 baseUrl 带结尾 /v1 的情况代码已经处理;这里还 404 说明那家提供方的路径不符合 OpenAI 契约。
- 两个后端同时挂着。 sessionQuery 被注册两次,第二个挂载失败。把 session-query-sqlite disable 掉。

配套插件

- dsh-session-tree —— 带标签、分组、拖拽移动的侧栏。
- dsh-session-manager —— 会话维护的 agent 工具与 REST API。
- dsh-session-search —— 对话内查找栏(基于 DOM,与本插件互补)。
- dsh-ui-reload —— 一键重载前端按钮。

许可

MIT —— 见 LICENSE。
预览分享卡片长什么样 ↓minhaoli/dsh-session-query-vector
分享 · DeepSeek Harness Hub
minhaoli/dsh-session-query-vector

用自然语言描述,找出讨论该话题的会话

回到顶部