dsh-cue-bank

memorymounts, not registerednpmMIT

Cross-session event-cue memory for DeepSeek Harness: auto-extracts task/conversation cues and user language habits from every turn into a persistent global cue bank, then re-injects remembered context on topic-switch detection (keyword or vector matching).

下载量 / Downloads
752
依赖体积 / node_modules
0.39 MB
测试时间 / Tested
2026-11-07
DSH 版本 / Version
0.2.2-rc.1

Install

dsh plugin --profile web add dsh-cue-bank

Sandbox test results

StageResult
1 install✓
2 list✓
3 mount✓
4 boot—

Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).

README

dsh-cue-bank — 跨会话「事件触点记忆」插件

让 Agent 的记忆能力向人类靠拢:人脑可以在不同任务间随时切换,靠的是对事件建立多维触点(关键词、视角、触发物…),触点被当前情境激活后,从长期记忆快速拉取事件细节。本插件把这一机制在 dsh(DeepSeek Harness)上落地。

设计原理

人脑记忆模型                          本插件实现
─────────────────                    ─────────────────────────────
事件经历                              触点库中的 topic(带摘要+关键词+时间)
事件触点(关键词/视角/触发物)         topic.keywords + dimensions
情境激活触点 → 唤醒事件               用户新消息关键词 → 扫描触点库
话题切换 → 快速拉取细节                重合度低于阈值 → 注入记忆唤醒上下文
记忆渐进完善                          每次触碰更新 lastTouchedAt / 合并关键词

两层架构

┌─ 写入侧(建库,每轮 turn 结束时)─────────────────────┐
│ agent/status=idle → 读本 turn 文本                    │
│   ├─ 对话级触点:本轮关键词(2~4 字中文 gram + 英文词)│
│   ├─ 任务级触点:session 聚合关键词(合并更新)        │
│   └─ 用户惯用词:近 N 轮窗口的高频个人用词(第二类)    │
│ → upsert 进全局触点库(原子写 JSON)                   │
└───────────────────────────────────────────────────────┘
┌─ 唤醒侧(话题切换时,每步组装前)─────────────────────┐
│ systemPrompt.context() provider(同步契约)           │
│   → 提取新消息关键词 → 与上轮关键词算重合度           │
│   → 重合度 < 阈值 = 话题切换                          │
│   → 扫描触点库(关键词 TF 加权 / 向量余弦)           │
│   → 命中 top-N → 注入 <system-reminder> 记忆唤醒块    │
│   → 命中用户惯用词 → 追加「用户惯用词」提示行          │
└───────────────────────────────────────────────────────┘

关键设计决策

1. 动态组装注入(不污染持久历史)

使用 systemPrompt.context() 注册动态上下文:每次 prompt 组装时求值 provider,生成带来源的 runtime-context 快照,随请求发送但不写入持久 session 历史。话题不切换时不注入,保持上下文干净。这正是与 agent-instructions(持久注入)的关键区别。

2. 触发时机可配置

配置 · 默认 · 说明

topic.switchDetection · true · 开启话题切换检测

topic.switchThreshold · 0.25 · 关键词重合度低于此值视为切换(0~1)

topic.scanEveryTurn · false · 每轮都扫描(灵敏但开销大);false 时只在切换时扫描

3. 匹配算法:双模式可配置

模式 · 成本/次唤醒 · 效果 · 适用

keyword(TF 加权穷举) · 0(纯本地) · 词面重合准确,语义弱 · 无外部 key

vector(向量余弦) · ≈ ¥0.000025(见下) · 语义匹配强 · 有 embedding key

auto(默认) · — · 有 key 用向量,否则降级关键词 · 推荐

⚠️ DeepSeek 官方 API 不提供 embedding 端点(见 issue #806),向量模式走 OpenAI 兼容接口(默认 SiliconFlow BAAI/bge-m3)。库向量在写入时预计算并缓存,唤醒时只编码 1 条 query,不重复计费。

成本估算(bge-m3 / SiliconFlow,2026-08 行情):

  • 单次唤醒:编码 query ~50 tokens ≈ ¥0.000025(每 1 万次话题切换约 ¥0.25)
  • 写入时:每轮 1 次嵌入(可忽略)
  • 关键词模式:零外部成本

4. 通用插件(所有 agent 生效)

监听全局 agent/created,对每个 agent 挂载唤醒/写入钩子,不限于飞书。userId 从 session id 提取(feishu:ou_xxx → ou_xxx;其他 session 用完整 id),按用户分片存储。

5. 全局存储

触点库存于 $DSH_HOME/storages/cue-bank/users/<userId>.json(默认),跨 profile、跨会话共享;可用 storageRoot 覆盖。单用户触点上限 200 条(LRU 淘汰),惯用词上限 50 条。

安装

1. 一键安装(推荐)

dsh plugin --profile web add github:itr-del/dsh-cue-bank

安装器通过 package.json 的 dsh.bundle manifest 解析插件(cordis.patch.yml),挂载到指定 profile 后重启 dsh 即生效。

2. 手动挂载到 profile(可选)

在 profile 的 package.json 加依赖:

"dependencies": {
  "@local/dsh-cue-bank": "file:/path/to/dsh-cue-bank"
}

在 profile 的 cordis.patch.yml 插入:

- insert:
    - id: cue-bank
      name: '@local/dsh-cue-bank'
      config:
        storageRoot: ''
        matchMode: 'auto'
        embedding:
          provider: 'openai-compatible'
          baseURL: 'https://api.siliconflow.cn/v1'
          apiKeyEnv: 'SILICONFLOW_API_KEY'
          model: 'BAAI/bge-m3'
          dimensions: 1024
        topic:
          switchDetection: true
          switchThreshold: 0.25
          scanEveryTurn: false
        inject:
          enabled: true
          maxCues: 3
          maxDetailChars: 400
        dbg: false

3. 安装并重启

cd ~/.dsh/profiles/web && pnpm install
# 重启 dsh web 后生效(插件在启动时加载)
🔒 隐私提示:向量模式(matchMode: auto 且设置了 SILICONFLOW_API_KEY)会把对话文本编码后发送到 https://api.siliconflow.cn/v1(默认第三方 OpenAI 兼容端点)生成嵌入向量,用于库内语义匹配。写入时的库向量也会经该端点预计算。若需完全本地运行,请勿设置该 API key(自动降级为纯关键词本地匹配),或把 embedding.baseURL 改为自托管端点。

完整配置项

键 · 默认 · 说明

storageRoot · '' · 空 = $DSH_HOME/storages/cue-bank

matchMode · auto · auto \ · keyword \ · vector

embedding.baseURL · https://api.siliconflow.cn/v1 · OpenAI 兼容端点

embedding.apiKeyEnv · SILICONFLOW_API_KEY · API key 环境变量名

embedding.model · BAAI/bge-m3 · 嵌入模型

embedding.dimensions · 1024 · 向量维度

embedding.timeoutMs · 5000 · 嵌入超时

topic.switchDetection · true · 话题切换检测开关

topic.switchThreshold · 0.25 · 切换阈值(关键词重合度)

topic.scanEveryTurn · false · 每轮扫描

topic.maxKeywords · 10 · 每轮提取关键词数

inject.enabled · true · 唤醒注入开关

inject.maxCues · 3 · 最多注入几条记忆

inject.maxDetailChars · 400 · 单条细节截断长度

extract.enabled · true · 建库开关

extract.maxKeywordsPerTurn · 12 · 每轮入库关键词数

extract.keywordMinLen · 2 · 关键词最小长度

extract.userIdiomWindowTurns · 10 · 惯用词统计窗口(轮)

extract.maxIdiomHints · 5 · 唤醒时最多提示几个惯用词

dbg · false · 调试日志

数据模型

{
  "version": 1,
  "userId": "ou_xxx",
  "idiosyncrasies": [                      // 第二类触点:用户用词偏好
    { "word": "闭环", "score": 0.2, "firstSeen": "...", "lastSeen": "..." }
  ],
  "topics": [                              // 第一类触点:事件
    {
      "id": "t-...",
      "level": "task" | "conversation",
      "keywords": [ { "word": "飞书插件", "score": 0.035 } ],
      "summary": "对话: 讨论飞书插件…",
      "dimensions": { "trigger": "keywords", "perspective": "task" },
      "embedding": [0.1, 0.2, ...] | null, // 向量模式缓存
      "refSessions": ["feishu:ou_xxx"],
      "createdAt": "...", "lastTouchedAt": "...", "hitCount": 3
    }
  ]
}

唤醒注入示例(模型视角)

<system-reminder>
📌 记忆唤醒(cue-bank): 检测到话题切换,以下为与该话题相关的历史记忆,可作为参考:
- [conversation] 对话: 我想做一个飞书插件,用来管理跨会话记忆…
  触点命中: 飞书插件、插件
  最近提及: 2026-08-15
  细节: 对话: 我想做一个飞书插件…
- [task] 任务: 我想做一个飞书插件…
用户惯用词: 形成闭环、闭环(用户习惯的表述,回复可顺应)
</system-reminder>

与 dsh 官方插件的对比(重复度调研)

调研日期:2026-08,基于 dsh-base 实际装配的插件清单逐一核验源码/README。

结论:核心能力几乎不重复(估计重复度 10-15%),方向相反——官方是「被动查询」,cue-bank 是「自动记忆 + 主动唤醒」。

官方插件(dsh-base 已装配) · 做什么 · 与 cue-bank 重复度

dsh-session-query + sqlite · 会话历史 FTS5 全文检索、关

…(truncated)

Rendered from the README published on npm. Formatted only, not edited.

Versions

Published on npm::1,最后更新 2026-08-20

Links

GitHub · Homepage · npm

Same category