把对话要点存成图记忆,按语义或实体随时召回
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/25 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add shuunO-O/dsh-neo4j-memory该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · chat
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 10 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 94 处,展示前 58 条)
- 发起网络请求client.js:477
const response = await fetch('/dsh-neo4j-memory/credentials', values === undefined ? { - 发起网络请求client.js:519
const response = await fetch('/dsh-neo4j-memory/embedding-status', { cache: 'no-store', headers: { accept: 'application/json' } }) - 发起网络请求client.js:648
const response = await fetch('/dsh-neo4j-memory/reembed', { - 读取本地文件hostdeps.js:38
for (const entry of readdirSync(join(npm, '@deepseek-ai'))) { - 读取本地文件hostdeps.js:50
for (const profile of readdirSync(join(home, 'profiles'))) { - 读取本地文件hostdeps.js:64
if (!existsSync(manifest)) return null - 读取本地文件hostdeps.js:65
const pkg = JSON.parse(readFileSync(manifest, 'utf8')) - 读取本地文件hostdeps.js:70
return existsSync(file) ? pathToFileURL(file).href : null - 发起网络请求lib/api.js:43
const response = await fetch(base.replace(/ +$/, '') + path, { - 读取本地文件lib/api.js:98
{ role: 'system', content: readFileSync(new URL('../assets/extraction_prompt.md', import.meta.url), 'utf8') }, - 读取本地文件lib/runtime.js:29
for await (const chunk of createReadStream(path)) - 写入本地文件lib/runtime.js:52
await mkdir(staging, { recursive: true }); - 写入本地文件lib/runtime.js:69
await mkdir(path, { recursive: true }); - 写入本地文件lib/runtime.js:71
await mkdir(dirname(path), { recursive: true }); - 写入本地文件lib/runtime.js:73
await pipeline(stream, createWriteStream(path, { flags: 'wx' })); - 读取本地文件lib/runtime.js:81
const children = await readdir(staging, { withFileTypes: true }); - 读取本地文件lib/runtime.js:84
if (existsSync(destination)) - 写入本地文件lib/runtime.js:86
await mkdir(dirname(destination), { recursive: true }); - 写入本地文件lib/runtime.js:87
await rename(source, destination); - 删除本地文件递归lib/runtime.js:91
await rm(staging, { recursive: true, force: true }); - 读取本地文件lib/runtime.js:116
this.home = existsSync(join(bundled, 'neo4j', 'bin')) ? join(bundled, 'neo4j') : join(this.dataRoot, 'neo4j'); - 读取本地文件lib/runtime.js:117
this.jre = existsSync(join(bundled, 'jre', 'bin')) ? join(bundled, 'jre') : join(this.dataRoot, 'jre'); - 读取本地文件lib/runtime.js:149
const state = JSON.parse(await readFile(join(this.dataRoot, 'state.json'), 'utf8')); - 发起网络请求lib/runtime.js:224
const response = await fetch(url, { headers: offset ? { Range: `bytes=${offset}-` } : {}, signal: AbortSignal.any([AbortSignal.timeout(300_000), ...(t - 删除本地文件lib/runtime.js:227
await rm(part, { force: true }); - 删除本地文件lib/runtime.js:240
await rm(part, { force: true }); - 执行外部命令来自配置/变量lib/runtime.js:317
const child = spawn(options.executable, options.args, { cwd: options.cwd, env: options.env, windowsHide: true, detached: true, stdio: ['ignore', fd.fd - 执行外部命令来自配置/变量lib/runtime.js:332
const child = spawn(executable, args, { windowsHide: true, stdio: ['pipe', 'pipe', 'ignore'], env: { ...process.env, ELECTRON_RUN_AS_NODE: '1' } }); - 删除本地文件lib/runtime.js:448
await rm(join(this.runDir, 'dsh-neo4j-memory.pid'), { force: true }); - 执行外部命令固定命令lib/guardian.js:14
spawnSync('taskkill', ['/PID', String(child.pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore', timeout: 20_000 }); - 执行外部命令来自配置/变量lib/guardian.js:31
child = spawn(executable, args, { cwd, env, windowsHide: true, detached: process.platform !== 'win32', stdio: ['ignore', fd, fd] }); - 读取本地文件selfcheck.mjs:44
const read = (path) => readFileSync(join(ROOT, path), 'utf8') - 发起网络请求selfcheck.mjs:177
const response = await fetch(base + path, options) - 读取本地文件selfcheck.mjs:401
statSync(join(ROOT, required)) - 发起网络请求src/api.ts:38
const response = await fetch(base.replace(/ +$/, '') + path, { - 读取本地文件src/api.ts:73
{ role: 'system', content: readFileSync(new URL('../assets/extraction_prompt.md', import.meta.url), 'utf8') }, - 执行外部命令固定命令src/guardian.ts:12
if (process.platform === 'win32') spawnSync('taskkill', ['/PID', String(child.pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore', timeout: 20_000 - 执行外部命令来自配置/变量src/guardian.ts:23
try { child = spawn(executable, args, { cwd, env, windowsHide: true, detached: process.platform !== 'win32', stdio: ['ignore', fd, fd] }); } - 读取本地文件src/runtime.ts:29
const hash = createHash('sha256'); for await (const chunk of createReadStream(path)) hash.update(chunk); return hash.digest('hex'); - 写入本地文件src/runtime.ts:46
await mkdir(staging, { recursive: true }); - 写入本地文件src/runtime.ts:56
if (entry.fileName.endsWith('/')) await mkdir(path, { recursive: true }); - 写入本地文件src/runtime.ts:58
await mkdir(dirname(path), { recursive: true }); - 写入本地文件src/runtime.ts:60
await pipeline(stream, createWriteStream(path, { flags: 'wx' })); - 读取本地文件src/runtime.ts:67
const children = await readdir(staging, { withFileTypes: true }); - 读取本地文件src/runtime.ts:70
if (existsSync(destination)) throw new RuntimeUnavailable(`Incomplete runtime at ${destination}; move it aside before retrying`); - 写入本地文件src/runtime.ts:71
await mkdir(dirname(destination), { recursive: true }); await rename(source, destination); - 写入本地文件src/runtime.ts:71
await mkdir(dirname(destination), { recursive: true }); await rename(source, destination); - 删除本地文件递归src/runtime.ts:73
if (resolve(staging).startsWith(resolve(dirname(archive)) + sep) && /^unpack-[0-9a-f]+$/.test(staging.split(sep).at(-1)!)) await rm(staging, { recursi - 读取本地文件src/runtime.ts:84
this.home = existsSync(join(bundled, 'neo4j', 'bin')) ? join(bundled, 'neo4j') : join(this.dataRoot, 'neo4j'); - 读取本地文件src/runtime.ts:85
this.jre = existsSync(join(bundled, 'jre', 'bin')) ? join(bundled, 'jre') : join(this.dataRoot, 'jre'); - 读取本地文件src/runtime.ts:105
const state = JSON.parse(await readFile(join(this.dataRoot, 'state.json'), 'utf8')); - 发起网络请求src/runtime.ts:154
const response = await fetch(url, { headers: offset ? { Range: `bytes=${offset}-` } : {}, signal: AbortSignal.any([AbortSignal.timeout(300_000), ...(t - 删除本地文件src/runtime.ts:155
if (response.status === 416) { await response.body?.cancel(); await rm(part, { force: true }); continue; } - 删除本地文件src/runtime.ts:159
if (await digest(part) !== checksum) { await rm(part, { force: true }); throw new Error('Checksum mismatch'); } - 执行外部命令来自配置/变量src/runtime.ts:211
const child = spawn(options.executable, options.args, { cwd: options.cwd, env: options.env, windowsHide: true, detached: true, stdio: ['ignore', fd.fd - 执行外部命令来自配置/变量src/runtime.ts:221
const child = spawn(executable, args, { windowsHide: true, stdio: ['pipe', 'pipe', 'ignore'], env: { ...process.env, ELECTRON_RUN_AS_NODE: '1' } }); - 删除本地文件src/runtime.ts:287
await rm(join(this.runDir, 'dsh-neo4j-memory.pid'), { force: true }); - 发起网络请求web/graph/app.js:350
response=await fetch(`/dsh-neo4j-memory/graph.json${query}`,{signal:activeRequest.signal,headers:{Accept:'application/json'}});
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-tools@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
为 DeepSeek Harness(DSH)提供长期图谱记忆的插件,由 Neo4j 驱动。
README
由 DeepSeek 最新模型翻译生成dsh-neo4j-memory
给 DeepSeek Harness(DSH)用的长期图记忆插件。
只向模型提供两个工具:
- memory_database_save(content):提取事件、人物、概念、地点和关系,写入 Neo4j。
- memory_database_search(query_text?, target_label?, entity_filter?, time_hint?):按语义、实体或日期召回,返回主匹配及一跳关系。
记忆按「事件 + 实体 + 关系」组织,不是聊天记录切片。只有显式调用保存工具的内容才会被写入;插件不扫描聊天记录。
说明:这是一个纯 vibe coding 项目,使用 GPT6.1-Sol 与 deepseek-v4.1-flash-1017 完成。功能和主要链路在真实环境里跑过;请把它当成一个可读、可改的开源原型,而不是生产级产品。
展开完整文档(README 剩余 1 节)
dsh-neo4j-memory 给 DeepSeek Harness(DSH)用的长期图记忆插件。 只向模型提供两个工具: - memory_database_save(content):提取事件、人物、概念、地点和关系,写入 Neo4j。 - memory_database_search(query_text?, target_label?, entity_filter?, time_hint?):按语义、实体或日期召回,返回主匹配及一跳关系。 记忆按「事件 + 实体 + 关系」组织,不是聊天记录切片。只有显式调用保存工具的内容才会被写入;插件不扫描聊天记录。 说明:这是一个纯 vibe coding 项目,使用 GPT6.1-Sol 与 deepseek-v4.1-flash-1017 完成。功能和主要链路在真实环境里跑过;请把它当成一个可读、可改的开源原型,而不是生产级产品。 特性 - 四类节点:Event、Person、Concept、Location;四类关系:PARTICIPATED_IN、OCCURRED_AT、MENTIONS、HAS_ATTITUDE - 首次调用自动下载本地 Neo4j 5.26.30 + Temurin JRE 21(约 211 MB),无需系统 Java;也可连外部 Neo4j - 设置页:三组模型 Key 与端点、概念对齐开关与阈值、向量维度、重新向量化 - 只读图谱页:查看实际写入的节点、关系和属性 - 写入是一个 Neo4j 事务,失败回滚 - Key、端点、模型、阈值、维度保存后下一次调用生效 - 节点 ID 按类型自增:event_1、person_2、concept_3…… 效果 以下截图由一段合成对话生成,人物、地点与数值均为虚构。 点击节点查看属性与一跳关系: 要求 - Windows 10/11 x64 - DSH >=0.2.1-rc.2 <0.3.0 - Node.js 22+(桌面宿主内置) - 提取与向量 API Key;概念对齐 Key 可选 安装 桌面版插件页(推荐): 1. 打开 插件 → 添加插件。 2. 输入 dsh-neo4j-memory,按提示安装。 3. 安装完成后重启 DSH(或按插件页提示重载),在 设置 → Neo4j 记忆 配置 Key。 命令行安装(PowerShell;路径按你的实际安装位置调整): $cli = "D:\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd" & $cli plugin --profile desktop add dsh-neo4j-memory 也可以直接从 GitHub 安装: $cli = "D:\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd" & $cli plugin --profile desktop add github:shuunO-O/dsh-neo4j-memory --profile desktop 是桌面版默认 profile;如果你用的是其他 profile,换成对应名称。 配置 安装并启用后打开 设置 → Neo4j 记忆: - API Key(默认折叠):提取、向量、概念对齐三组 - 模型端点与阈值(默认折叠):三组 Base URL 与模型名、概念对齐阈值(80%–99%) - 向量维度:默认 1024,必须与向量模型实际输出一致;修改后点「重新向量化」 - 数据库:本地/外部模式、外部 Neo4j 密码、本地数据目录 | 用途 | 默认服务 / 模型 | | 提取 | DeepSeek / deepseek-flash | | 向量 | DashScope / qwen3.7-text-embedding,1024 维 | | 概念对齐 | TypeSafe / jev,阈值 0.95 | 概念对齐填的是完整 endpoint:TypeSafe 为 https://api.typesafe.ai/v1/systemone,OpenRouter 为 https://openrouter.ai/api/alpha/decisions。用 OpenRouter 时模型可填 typesafe/jev-1.13 或 typesafe/jev-1.14;换模型后建议重新校准阈值。 保存后,Key、端点、模型、阈值、维度在下一次调用时生效;本地数据目录、Neo4j 模式、外部密码需要重启 DSH。Key 保存在当前 profile 配置中,不回显,也不进入对话。 向量维度与重新向量化 不同模型或不同维度的向量不能比较,Neo4j 的向量索引也固定维度。插件把当前模型与维度记录在 MemoryMeta 节点里;配置变化后,保存和语义搜索会被拒绝,直到重新向量化。 设置页「向量索引」区域会显示当前库的模型、维度、节点数,并提供「重新向量化」按钮。操作会重算所有记忆节点的向量、重建四个向量索引;新向量先暂存,全部计算成功后才替换旧向量并更新元数据。 本地 Neo4j 默认 DSH_NEO4J_MEMORY_NEO4J_MODE=auto:没有配置外部 URI/密码时使用本地实例,首次调用工具时下载并启动。数据、日志、state.json 位于 %LOCALAPPDATA%\dsh-neo4j-memory\,可在设置页改到其他可写目录(需重启)。 同一时间只建议运行一个使用托管模式的 DSH 实例。想让本地实例在 DSH 退出后继续运行,设置 DSH_NEO4J_MEMORY_NEO4J_KEEP_RUNNING=1。 排障日志: - %LOCALAPPDATA%\dsh-neo4j-memory\provision.log - %LOCALAPPDATA%\dsh-neo4j-memory\logs\console.log Neo4j Community 采用 GPLv3,Temurin JRE 采用 GPLv2+CE;插件不随包分发这些二进制,首次运行时从官方地址下载。 环境变量(可选) 插件配置优先于环境变量。 | 变量 | 默认值 | | DEEPSEEK_API_KEY / EMBEDDING_API_KEY / TYPESAFE_API_KEY | 无;提取、向量、对齐 Key | | DSH_NEO4J_MEMORY_NEO4J_MODE | auto(auto / managed / external) | | DSH_NEO4J_MEMORY_NEO4J_URI | bolt://localhost:7687(external) | | NEO4J_PASSWORD | 无;external 必填 | | DSH_NEO4J_MEMORY_RUNTIME_DIR | %LOCALAPPDATA%\dsh-neo4j-memory | | DSH_NEO4J_MEMORY_EXTRACTION_URL / _MODEL | https://api.deepseek.com / deepseek-flash | | DSH_NEO4J_MEMORY_EMBEDDING_URL / _MODEL | DashScope compatible / qwen3.7-text-embedding | | DSH_NEO4J_MEMORY_EMBEDDING_DIMENSIONS | 1024 | | DSH_NEO4J_MEMORY_ALIGNMENT_URL / _MODEL | https://api.typesafe.ai/v1/systemone / jev | | DSH_NEO4J_MEMORY_ALIGNMENT_THRESHOLD | 0.95(0.80–0.99) | | DSH_NEO4J_MEMORY_CONCEPT_ALIGNMENT | true;设为 0/false 关闭 | | DSH_NEO4J_MEMORY_TIMEZONE | Asia/Shanghai | 外部 Neo4j 需支持向量索引与 vector.similarity.cosine(如 Neo4j 5.23+)。 工作方式 保存:content → 提取事件/实体/关系 → 生成事件摘要与实体名向量 → 概念对齐(可选) → 一个 Neo4j 事务写入 检索:query / entity / date → 向量 top-3,或按实体/日期过滤 → 取最相关节点的一跳邻居 → 返回主匹配 + 次要匹配 + 上下文 图谱页:设置 → Neo4j 记忆 → 展开图谱,或访问 /dsh-neo4j-memory/graph/。只读,不写回 Neo4j;导出 JSON 只影响浏览器视图。 当前限制 - 提取与合并较粗:仅单次抽取;概念按名称/别名 + 向量 + 两两判同,不保证一定准确。 - 检索较粗:向量 top-3 + 一跳。 - 图谱只读:没有删除、合并、编辑节点/关系的 UI。 - 0.6.0,没有 benchmark,只在几十条记忆的规模上验证过;仅在 Windows x64 上测试过。 开发 npm ci --legacy-peer-deps npm run build node selfcheck.mjs node tests/backend.test.mjs npm pack - src/ 是 TypeScript 源码,lib/ 是编译产物,assets/ 是提取提示词,web/graph/ 是图谱页面。 - npm test 使用 node --test;DSH_NEO4J_MEMORY_INTEGRATION=1 node tests/integration.test.mjs 可跑真实 Neo4j 集成测试。 - npm publish 会先执行 prepublishOnly:构建 + selfcheck + 后端测试;npm pack 会先构建。 隐私 - 记忆库在本机,但提取/向量/对齐会把内容发给你配置的模型 API。 - API Key 存在当前 DSH profile 的配置里,不进入对话或模型上下文。 - 不要把密码、密钥或不想发给模型服务的内容存进记忆库。 许可证 MIT,见 LICENSE。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
shuunO-O/dsh-neo4j-memory
把对话要点存成图记忆,按语义或实体随时召回
相关插件 · 对话 / 记忆
上下文中枢oceanbase/powercontext
上下文跟着工作走 —— 跨会话、跨智能体、跨人。
★ 1,489已汉化DSH
73.1
智能体记忆库plastic-labs/honcho
Honcho 是记忆基础设施,用来构建有状态的智能体。这些智能体能理解不断变化的人、智能体、群组、项目和想法。
★ 7,918已汉化DSH
71.7
长程智能体控制面loopx-project/loopx
给 Agent 一个目标,让工作持续向前。
★ 6,358已汉化DSH
71.3
智能体上下文数据库volcengine/OpenViking
给 AI 智能体用的上下文数据库
★ 41,453已汉化DSH
71.3
长效机器人团队Fei2411/DS-Bot
Download DS Bot for Windows 10/11 64-bit / 下载 Windows…
★ 5,293已汉化DSH
71.2
可携带记忆层EverMind-AI/EverOS
为什么选择 EverOS
★ 13,797已汉化DSH
71.1
这是你的仓库?认领条目