前言¶
在 DeepSeek Harness(DSH)里做长期运行的 agent,常见做法是每次对话从零开始,或把整段历史塞进上下文。前者丢事实与偏好,后者成本高、也难区分「当前任务」和「该长期保留什么」。社区插件 dsh-somni(维护者 liuqingman)走另一条路:醒时写入与按需联想,空闲时由 sidecar 做类似睡眠整理的蒸馏,把会话沉淀为可 grep 的 Markdown 记忆。分类上它属于 DSH 生态「记忆」类插件;目录页见 SkillHub,源码与说明在 GitHub(MIT,当前 package 版本 0.1.0)。DSH 本身是「一切皆插件」的 agent 宿主;SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系。
这是什么¶
dsh-somni 给 DSH agent 提供睡眠整理式长期记忆:醒着时身份与未竟意向常驻 system prompt,相关记忆在行动前/工具后自动联想注入,模型也可用工具主动检索;空闲一段时间后「做梦者」把当天 session 日志整理成情景、语义、前瞻、程序四类记忆。持久化全部是磁盘上的 Markdown + YAML front-matter,不依赖专有数据库(向量索引 SQLite 为可删可重建的派生物)。
架构上分为两半:TypeScript Cordis 插件(capture、inject、associate、9 个记忆工具、dream 调度)与 Python sidecar somni_memory(记忆管理、可选向量索引、ReAct 整理循环),经单条 stdio ndjson JSON-RPC(rpc.py)通信;做梦时 Python 反向 RPC 调用宿主 llm.chat,默认复用 harness 模型,无需额外 API key。
核心功能¶
记忆类型与到达模型的方式¶
| 类型 | 目录 | 模型如何用到 |
|---|---|---|
| 身份 | memory/(如 about_me.md、about_user_*.md) |
system prompt 常驻区段 |
| 前瞻(意向) | memory/intentions/ |
常驻区段 + 意向相关工具 |
| 情景 | memory/episodes/ |
search_episodes、recall_memories、联想提示 |
| 语义 | memory/knowledge/ |
search_knowledge、recall_memories、联想提示 |
| 程序(技能) | skills/agent_learned_skills/*/SKILL.md |
可配合 dsh-skill-filesystem;联想提示 |
| 工作记忆 | memory/session-log/ |
search_recent_conversation |
醒时:捕获、注入、联想¶
- Capture:订阅 DSH
session/event,在session/flush/turn/end写入memory/session-log/;子 agent 会话跳过。 - Inject:向 system prompt 注入身份、意向、纪律三个区段(可在
cordis.yml中开关)。 - Associate:在
agent/pre-step(最新用户消息)与tools/post-execute(工具名与参数)上对 knowledge / skills / episodes 混合打分;仅当最高分 ≥0.52且领先第二名 ≥0.04时注入提示,同一会话内同一条记忆不重复。未启用向量层时联想钩子保持静默,仍可关键词检索。
记忆工具(挂到 ctx.tools)¶
插件注册 9 个工具,返回均为 Markdown:recall_memories、search_episodes、search_recent_conversation、search_knowledge、add_intention、complete_intention、cancel_intention、list_intentions、dream_now。会话中可调用 dream_now 强制触发一次整理;任意新回合开始时会抢占正在进行的 dream,用户不必等待整理结束。
睡时:dream 整理¶
空闲计时满足配置(默认如 dream.idleMs 15 分钟、dream.maxIntervalMs 6 小时等)且有待处理 session 日志时,sidecar 执行 sleep.run ReAct 循环,产出 episodes、knowledge、intentions、skills 条目及 memory/dreams/ 运行日志,并做衰减与归档(低分条目移入 archived/,不物理删除)。
可选能力¶
- 向量层:安装
somni-memory[embed]并放置bge-small-zh-v1.5等 ONNX 模型后,启用语义召回与联想提示;否则仅关键词模式。 - 工具面总闸:配置
tools.gate.stateFile等,可通过外部 JSON 状态文件热切换是否向模型暴露 somni 工具 schema。
环境与依赖¶
运行 DSH 侧需 Node >= 22(见 package.json engines),DeepSeek Harness >= 0.2.0-rc.1 及 README 列出的 peer 包(dsh-agent、dsh-session、dsh-llm 等)。Sidecar 需要 Python >= 3.9 且在 PATH 上(可用配置项 python 指定);核心 sidecar 仅依赖 Python 标准库。Python 缺失时插件优雅降级:capture 与 dream 停止,宿主不崩溃。
安装与启用¶
官方 README 给出的安装方式如下(需已安装 DSH;README 中文安装段另写 node >= 18,与 package 声明的 Node >= 22 并存时,建议以宿主与 engines 为准使用 Node 22+):
git clone https://github.com/liuqingman/dsh-somni.git
cd dsh-somni
./install.sh # 装进 default profile
./install.sh --profile mybot # 或 $DSH_HOME/profiles 下任意 profile
install.sh 会 pip 安装 sidecar、把插件链入 profile 的 node_modules、将示例配置合并进 profile 的 cordis.patch.yml,并用 stdio ping 校验 sidecar;脚本幂等,可重复执行。
若需要语义召回与联想提示,可安装可选向量依赖并按文档放置模型:
python3 -m pip install "somni-memory[embed]"
# 将 BAAI/bge-small-zh-v1.5 的 ONNX 文件放入 ~/.dsh/somni/models/ 并配置 embed.provider: local
在 profile 的 cordis.patch.yml 中,插件条目需挂在顶层 - insert: 之下(install.sh 会自动写对)。常见片段包括启用 somni 与指向蒸馏技能目录,例如:
- insert:
- name: dsh-somni
- name: '@deepseek-ai/dsh-skill-filesystem'
config:
customSkillDirs: [~/.dsh/somni/skills/agent_learned_skills]
默认数据目录为 <DSH_HOME>/somni(配置键 dataDir)。完整可选配置见仓库 examples/cordis.patch.yml。
典型用法¶
- 日常对话:无需额外操作;插件自动写 session 日志、刷新身份/意向区段,并在合适时机注入联想提示。
- 主动回忆:让 agent 调用
recall_memories或search_knowledge/search_episodes检索磁盘记忆。 - 待办与意向:通过
add_intention、complete_intention、cancel_intention、list_intentions管理前瞻记忆;未完成意向在模型侧保持高激活(不做衰减)。 - 立即整理:调用
dream_now,或在空闲后等待调度器自动 dream。 - 人工维护:直接编辑
dataDir/memory/与skills/下 Markdown;用 grep 与版本管理工具审计 agent 记忆。
磁盘布局概要(见 README):
dataDir/
├── memory/
│ ├── about_me.md
│ ├── intentions/
│ ├── episodes/
│ ├── knowledge/
│ ├── session-log/
│ └── dreams/
├── skills/agent_learned_skills/
├── models/ # 可选 embedding
└── index.sqlite # 派生索引,可删后重建
适用场景与注意¶
适合:需要跨会话保留身份、事实、决策与技能沉淀的 DSH agent;希望记忆可读可改、可备份;愿意接受「空闲时异步整理」而非实时全量写库的场景。
注意:
- 插件与 Python sidecar 以当前 DSH 进程权限运行,可读写
dataDir并调用宿主 LLM;安装前请阅读源码与 MIT 许可证,确认数据目录与模型调用策略符合你的环境。 - JSON-RPC 走 stdio,sidecar 不得向 stdout 打印调试信息,否则会破坏协议(设计见
docs/HANDOFF.md)。 - 未配置 embedding 时联想提示关闭,但关键词检索与 dream 整理仍可用(视 Python sidecar 是否正常)。
- 与飞书 agent「somni」同源的记忆核心为解耦 fork,磁盘格式与整理策略一脉相承,但本仓库面向 DSH Cordis 插件形态。
结尾¶
dsh-somni 把「醒时回忆 + 睡时整理」落到 DSH 插件与 Python sidecar 的组合里,用 Markdown 长期记忆补齐 agent 的连续性与可运维性。进一步的设计细节见仓库 docs/design.md 与 README.zh.md。
- 目录页:https://www.skillhub.cn/plugins/liuqingman/dsh-somni
- GitHub:https://github.com/liuqingman/dsh-somni