dsh-foxy-memory
kun-fox/dsh-foxy-memory
把 DSH 的 Foxy 接入 Foxy Memory,支持跨平台召回、本地 JSONL 回退、平台筛选与记忆浏览。需先安装 dsh-foxy。
安装
dsh plugin --profile web add github:kun-fox/dsh-foxy-memoryREADME
dsh-foxy-memory
dsh-foxy-memory 是 dsh-foxy 的可选记忆子插件。它把 Foxy 会话写成本地 JSONL,并在下一轮把最近记忆注入 Foxy 的 persona。
它本身不依赖 ChatLuna/LivingMemory;只装 dsh-foxy + dsh-foxy-memory 就能得到能记住对话的 Foxy。
依赖关系
- 必需:
dsh-foxy(提供foxyMemory扩展契约)。 - 可选:
koishi-plugin-chatluna-foxy-memory(QQ 侧/跨平台记忆中枢)。把 provider 设为livingmemory,bridgeUrl指向新插件的/foxy-memory;它直接读写 Koishi 数据库与向量索引,不再需要旧koishi-plugin-foxy-memory-bridge进程。 - 平台子插件
dsh-foxy-bili/dsh-foxy-weibo会把事件写入本插件暴露的foxyMemoryprovider。
记录格式
默认文件:
%USERPROFILE%\.dsh\foxy\memory\entries.jsonl
每条记录:
{
"id": "uuid",
"presetId": "preset",
"sessionId": "session-id",
"platform": "dsh",
"sourceLabel": "DSH",
"speaker": "用户",
"role": "user",
"type": "conversation",
"status": "active",
"content": "今天在 DSH 做了……",
"keywords": [],
"summary": "",
"importance": 0.5,
"createdAt": 1790000000000,
"updatedAt": 1790000000000
}
注入时会格式化成:
- [2026-11-06 20:00] [DSH] 用户: 今天在 DSH 做了……
- [2026-11-06 20:00] [DSH] Foxy: 记住啦。
platform 统一小写(dsh),显示时用 sourceLabel(如 DSH);presetId 允许 Foxy 主预设和 Character 预设分开存档。
配置
| 字段 | 默认 | 说明 |
|---|---|---|
dataDir | $DSH_HOME/foxy/memory | 数据目录 |
entriesFile | entries.jsonl | 文件名 |
maxEntries | 5000 | 超过后丢弃最旧记录 |
maxContentChars | 4000 | 单条内容截断 |
maxContextEntries | 20 | 最多注入条数 |
maxContextChars | 6000 | 注入内容总字符上限 |
userLabel | 用户 | 用户显示名 |
assistantLabel | Foxy | 助手显示名 |
provider | livingmemory(配置 bridgeUrl 时)/ local | 记忆写到哪个 provider |
bridgeUrl | 空 | 新插件地址,如 http://127.0.0.1:5140/foxy-memory |
bridgeToken | 空 | 与新插件 foxyApiToken 一致;公网部署必须设置 |
bridgePresetId | preset(Character) | 写入 LivingMemory 的 preset |
bridgeTimeoutMs | 15000 | 桥请求超时 |
batchSize | 8 | 累积多少条消息后调用 /ingest |
flushIntervalMs | 30000 | 未满一批时的定时冲刷间隔 |
extractModel | deepseek/deepseek-flash | 桥提取记忆使用的模型 |
DSH 侧不再逐条写记忆:record 只把消息放进 pending,满 batchSize 或到 flushIntervalMs 时调用桥的 /ingest,由模型提炼成中文第一人称记忆。stats() 会显示 pending。
Foxy 面板的「记忆桥设置」可以修改这些值,保存到 $DSH_HOME/foxy/settings.json;插件启动时读取,保存后尝试热重载。/api/dsh-foxy/settings 在 DSH host 内提供。
记忆浏览界面
安装并重启 DSH 后,左侧栏出现 Foxy Memory。页面提供:
- 记忆总数、待写入数、来源平台数和当前 provider;
- 按平台(QQ / 微博 / B站 / DSH)、状态筛选;
- 按内容、说话人、关键词搜索;
- 单条归档,默认只显示活跃记忆。
Host 路由:
GET /api/dsh-foxy-memory/stats
GET /api/dsh-foxy-memory/list?platform=weibo&status=active&pageSize=50
GET /api/dsh-foxy-memory/search?q=关键词
POST /api/dsh-foxy-memory/archive {"id":"..."}
POST /api/dsh-foxy-memory/reload
/list 和 /search 在 provider: "livingmemory" 时走新记忆插件的 /foxy-memory/list|search,失败自动回退本地 JSONL。
服务
加载后提供:
ctx.foxyMemory.record({ role, text, presetId, sessionId, platform, speaker })
ctx.foxyMemory.context({ presetId, limit })
ctx.foxyMemory.list({ presetId, status, limit })
ctx.foxyMemory.search(query, { presetId })
ctx.foxyMemory.archive(id)
ctx.foxyMemory.stats()
同时通过 ctx.foxy.registerMemoryProvider('local', ...) 和(配置了桥时)registerMemoryProvider('livingmemory', ...) 注册到 Foxy 的 provider 注册表。
与 Foxy Memory 的关系
本地 JSONL 是默认实现,适合只装 DSH、不接 QQ 的场景。它不会自动写入 Koishi 的 koishi.db 或 PGlite 向量索引。
如果需要 DSH 与 QQ 共用同一套跨平台记忆,安装并配置 koishi-plugin-chatluna-foxy-memory:
# DSH 侧 dsh-foxy-memory 配置
provider: livingmemory
bridgeUrl: http://127.0.0.1:5140/foxy-memory
bridgeToken: 与新插件 foxyApiToken 一致的随机串
bridgePresetId: preset(Character)
新插件的 /foxy-memory/record|ingest|context|list|search|health 直接操作 Koishi 数据库、用户画像与向量索引。DSH 侧只发 HTTP 请求,不再启动旧 koishi-plugin-foxy-memory-bridge。
迁移时保留原 living_memory_* 表与 PGlite 目录;新插件就是同一套表结构的兼容 fork,不需要导出/导入 JSONL。切换前先备份 koishi.db 与向量目录,再开启 foxyApiEnabled。桥不可用时会自动回退本地 JSONL,不会丢消息。
安装
dsh plugin --profile desktop add "file:D:\path\to\dsh-foxy-memory"
需要同时安装 dsh-foxy;重启 DSH 后,Foxy 会话会使用当前 provider。默认是本地 JSONL;配置 bridgeUrl 后默认切到 LivingMemory 桥(也可显式 provider: local 保持本地)。
License
MIT