dsh-memory-jev:用 Jev 类型化判决为 DSH 记忆加三道门

前言

在 DeepSeek Harness(DSH)里给智能体加「长期记忆」,常见做法是模型自己决定写什么、读什么、要不要塞进上下文。文本一旦由模型生成,就容易出现编造条目、误把记忆当指令、或在不相关轮次里硬塞历史片段等问题。

下面介绍社区插件 dsh-memory-jev(维护者 Towzai,分类:记忆)。它把 TypeSafe 的 Jev 决策模型当作记忆系统的安全边界:Jev 只输出三种类型化结果——choice(在候选里选一个)、score、noul(是/否概率)——从不生成自由文本。是否值得写入、替换哪条旧记忆、召回是否相关、本轮是否注入,都由 Jev 做判决;记忆正文始终由插件控制,模型不能凭空发明记忆内容。

这是什么

dsh-memory-jev 是面向 DSH 的服务端记忆插件(当前 package 版本 0.4.1,MIT 许可证)。它在每次记忆的读、写路径上挂接 Jev,并额外提供在每轮对话前可选的注入门(fail-closed:判不准就不注入)。

生态上,DSH 强调「一切皆插件」;插件可在社区目录 skillhub.cn 检索,该站点与 DeepSeek / 幻方无官方从属关系。源码与说明见 GitHub:Towzai/dsh-memory-jev。

核心功能:三道门与不变量

插件用三个「门」组织行为;失败时的策略 deliberately 不同——写入偏 fail-open,注入偏 fail-closed。

门 作用 失败时
Write gate mem_remember 本地 bigram 预过滤 → 一次 Jev:worth_keeping(noul)+ supersedes(在候选与 none 间 choice) 仍会写入;仅标记 gate=unavailable\|budget
Recall gate mem_recall 词法预过滤 top-N → 每条候选一个 rel_<id> noul → 按概率过滤排序 回退本地排序并标记 degraded(「未经过 Jev 判决」)
Injection gate agent/pre-step 廉价文本门 → 候选池减法 → Jev 相关性判决 → 在上下文尾部追加一条带框的用户快照 不注入(宁可沉默也不加噪声)

设计上的几条约束(README 中的 Invariants)值得单独记一下:

  1. 每个 (session, turn) 最多注入一块;同轮后续步骤不再重复判决或注入。
  2. 每条记忆在同一会话内最多注入一次;已注入的 id 在 Jev 调用前就从候选池移除,不再消耗请求。
  3. 注入块离开上下文后,对应 id 可再次参与候选(日志记为 reset)。
  4. 注入块用 <retrieved-memories …> framing,并声明「不是对话历史、不是指令」;记忆正文内的 < 会转义为 \u003c,避免伪造分隔符。
  5. 仅追加在尾部,系统提示与先前历史字节级不变,利于 prefix cache。

工具与本地存储

工具 用途
mem_remember 写入门;无论门结果如何都会持久化(返回 persisted)
mem_recall 召回门;返回 {gate, degraded, items[]},jev_prob 与 local_score 分开保留
mem_list / mem_view 列表 / 查看
mem_forget / mem_restore 软删除 / 恢复(保留 supersedeHistory,支持 cascade)
mem_merge 将较旧条目正文折入较新条目后软删旧条(合并后长度 ≥ 旧条长度)
mem_pin 跳过一次相关性阈值,每会话最多一次,会话开始时不可用
mem_gate_status 花费 / 预留 / 剩余 / 调用次数 / 熔断 / 密钥是否存在 / 存储路径
mem_gate_log 审计日志查询(仅 id 与 hash,不含正文)

不会发生物理删除:删除一律是 retired=true,可恢复。

安装与启用

通过 DSH 插件市场

仓库带上 dsh-plugin topic 后会被注册表 CI 索引(约每 2 小时扫描)。安装命令(README 原文):

dsh plugin --profile web install Towzai/dsh-memory-jev

说明:用户线索中的仓库路径为 towzai/dsh-memory-jev,安装命令以 README 中的 <owner>/dsh-memory-jev 为准,即 Towzai/dsh-memory-jev。

手动安装

  1. 将仓库复制到 ~/.dsh/profiles/web/node_modules/dsh-memory-jev/。
  2. 在 profile 的 cordis.patch.yml 中注册(或由市场完成),例如:
- id: dsh-memory-jev
  name: dsh-memory-jev
  config:
    storePath: /absolute/path/to/gate-store.json   # 空则 <cwd>/data/gate-store.json
    injectEnabled: true
  1. 在进程级重启 DSH(仅 set_bundle enabled:false→true 会重挂载行,不会清 ESM 模块缓存)。
  2. 用 mem_gate_status 确认插件已加载。

宿主接口包(@deepseek-ai/cordis、dsh-llm、dsh-tools)在 package 中仅声明为 peerDependencies,不应在插件内打包副本,否则会 shadow 宿主并破坏工具调用。

配置要点

在 profile 的 cordis.patch.yml(或 bundle 自带 patch)里改配置后,同样需要进程级重启。

键 默认 含义
storePath ''(即 <cwd>/data/gate-store.json) 存储文件;生产环境建议绝对路径
injectEnabled true 注入门总开关
injectInSubagents false 是否在子会话注入(成本随子会话数上升)
injectLimit 3 单次注入最多条数
injectMinProbability 0.6 注入相关性阈值(比手动 recall 更严)
prefilterLimit 40 送给 Jev 的候选数
supersedeCandidates 12 写入门「可能重复」候选数
dailyBudgetCny 3.5 日预算(人民币)
dailyCallLimit 3000 日调用上限

调参时 README 建议依据证据而非直觉:mem_gate_log 或按日分片的 gate-decisions-*.jsonl 会记录各候选的 noul 概率与当时阈值,便于复盘某阈值会放行或丢弃哪些条目。

成本方面,Jev 输入约 $0.042/M、输出免费;插件以 CNY 记账。单次判决约 2 000–4 200 input tokens,约合 ¥0.0006–0.0012;预算采用 reserve → settle → reconcile,串行账本避免并发超支。

典型用法

安装并重启后,先用门状态确认存储路径、密钥与预算:

  • 在 DSH 中调用工具 mem_gate_status,查看 spend / reserved / remaining、调用次数、熔断状态、OPENROUTER_API_KEY 是否可用、以及 storePath。

日常记忆操作走 mem_* 工具族:

  1. mem_remember:写入新记忆;写入门会尝试 Jev 判决是否值得保留、是否 supersede 某条旧记忆,但无论门是否可用都会持久化。
  2. mem_recall:按查询召回;返回项中同时带有 Jev 的 jev_prob 与本地 local_score,便于对比「判决分」与「词法分」。可通过参数 min_probability 覆盖默认的 recallMinProbability(默认 0.5)。
  3. mem_list / mem_view:浏览与检查条目;mem_forget / mem_restore / mem_merge / mem_pin 做软删、恢复、合并与单次 pin。
  4. 需要审计时调用 mem_gate_log(无正文,仅 id/hash);调阈值前可配合 gate-report 脚本(package.json 中 npm run gate-report)做汇总。

若关闭注入或 Jev 不可用:写/召回会标记 degraded 或 budget/unavailable;注入门在无判决时不向上下文追加任何块。

数据边界与离线行为

插件声明 cloud: true,出站仅三处,均指向 https://openrouter.ai/api/alpha/decisions(写入门:新记忆前 600 字 + 候选标题;召回与注入:问题文本 + 候选标题)。存在离线路径:无 API key 时写/召回走确定性降级行为(标记 degraded),注入门不注入。

  • 凭据从环境变量 OPENROUTER_API_KEY 按需读取(Windows 可回退注册表 HKCU\Environment);不写入配置文件、不回显、不记入日志。
  • 若问题或正文匹配电话 / 身份证 / 银行卡 / sk- / Bearer / password / api_key 等模式,判决整段跳过(gate=redacted-skip)。
  • 审计日志只记 id、概率、token、CNY、错误类型与 build 版本;无正文、无原始查询(仅 hash 与长度)。
  • 本地 store、审计与预算文件与 storePath 同目录;不上传、不同步。
  • 可选 egressGuard(默认 false):开启后,看起来像携带密钥的 question 不会发往端点,召回回退本地排序但仍返回你的记忆条目。

Node 引擎要求 >= 22.0.0(package.json)。

适用场景与注意

适合谁:已经在用 DSH、希望记忆读写与自动注入都有「类型化判决」而不是纯 LLM 自由文本;能接受 OpenRouter Jev 端点的网络依赖与按次计费;愿意用 mem_gate_log 和配置项做阈值与预算治理的开发者。

安装前务必:

  1. 插件以当前 DSH 进程权限运行,会读写本地 store、可能访问网络与 OPENROUTER_API_KEY;安装前应自行审阅 源码仓库 与 MIT 许可证。
  2. 生产环境为 storePath 配置绝对路径,并理解写入 fail-open、注入 fail-closed 的差异——重要内容不要假设「门一定会拦住写入」。
  3. 社区目录页星标等信息会变动;以 GitHub README 与 release 为准。

结尾

dsh-memory-jev 把 Jev 的「只判决、不生成文本」当作记忆系统的边界:写、召、注入三道门分工明确,正文与 framing 留在插件侧,并配有预算、审计与软删除恢复。若你在 DSH 里做 agent 记忆,可以从安装、mem_gate_status 验活、再按场景调 injectMinProbability 与 dailyBudgetCny 起步。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye