dsh-memorybear
Verified@kesun5/dsh-memorybear · v0.1.0-alpha.6 · Apache-2.0 · Web UI
MemoryBear long-term memory for DeepSeek Harness: per-turn recall, end-of-turn write, and a memory_search tool
Install
dsh plugin add @kesun5/dsh-memorybear Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Published to npm without a public repository. Inspect the package contents before installing.
Tags
Creators
Readme
dsh-memorybear
给 DeepSeek Harness(dsh)接入 MemoryBear 长期记忆的插件。
- 召回:会话第一轮加载 MemoryBear 用户画像(
meta),也可以每轮自动召回一次(recall: true)。 - 偏好:用 MemoryBear 偏好引擎按任务挑出相关偏好(比如"装依赖用 uv"),两种用法二选一(
preferenceMode):auto每轮开头自动注入;tool不注入,由模型在需要时调memory_preferences,用一句话描述接下来的工作去查,场景仍由服务端判断。服务端记忆配置要开启偏好引擎才有数据。 - 工具:
memory_search,由模型按需调用,档位(express / quick / normal / deep)也由模型选;preferenceMode: tool时另有memory_preferences。 - 写入:一轮对话完成后,把用户原话和助手最后一条回复写入 MemoryBear。可以每轮写、每 N 轮写,或者会话空闲后再写。
- 网页配置页:在 dsh 网页版的 Plugins 页里可以改配置。API key 存在 dsh 的凭据库里,不写进配置文件。
测试环境:dsh 0.2.0-rc.2,Node 22,2026-10-14。dsh 还是预发布版,接口在不同版本之间会变。如果你用的 dsh 版本和这里不一样,先按下面的「验证」一节跑一遍。
网络与数据
插件只连你在配置里填的 baseURL,用到这些接口:
| 接口 | 用途 |
|---|---|
POST {baseURL}/memory/read/sync |
画像、召回、memory_search |
POST {baseURL}/memory/write |
写入对话(只写用户原话和助手最后一条回复,附件以 files 字段带上) |
POST {baseURL}/memory/files/upload |
上传用户消息里的图片/文件(attachments 不为 none 时) |
GET {baseURL}/memory/emotion-memory/query_emotion_overview、GET .../query_emotion_timeline |
右侧边栏"记忆"标签页的近期情绪、情绪记录(panel 开启时) |
GET {baseURL}/dashboard/end_users?keyword=<endUserId> |
右侧边栏"记忆"标签页的记忆标签和记忆条数(按 endUserId 精确挑出本人那一行;panel 开启时);偏好接口要的本人 other_id 也从这里查,查到后缓存 |
POST {baseURL}/memory/preference/recall |
每轮偏好召回,请求头 X-End-User-Other-Id 带本人 other_id(preferenceMode: auto 时每轮调;tool 时由 memory_preferences 工具调) |
GET {baseURL}/memory/analytics/community_graph |
右侧边栏"记忆"标签页的记忆主题(服务端只取社区节点的名字、摘要、实体数和核心实体;panel 开启时) |
右侧边栏"记忆"标签页的数据由插件在 dsh 服务端注册的 GET /api/memorybear/insights 转发,dsh 负责登录校验,API key 不会发到浏览器。
插件不会创建 end_user,需要事先建好(可以用 scripts/create_end_user.py)。
请求头带 Authorization: Bearer <key>。子代理(subagent)会话不召回也不写入。
安装
dsh plugin --profile <你的 profile> add @kesun5/[email protected]
桌面端在插件页的"包名或地址"里填同样的 @kesun5/[email protected]。
- 一律写明版本号:pnpm 11 有新版冷却期(
minimumReleaseAge),不带版本号时刚发布的版本可能被跳过,装成旧版。 add会自动把插件加进 profile 的dsh.profile.bundles,不用手动改package.json。add底层是 PATH 里的 pnpm(npm 装的 dsh 不自带)。实测 pnpm 11 可用;没有 pnpm 时执行npm i -g pnpm@11。- 从 alpha.1/alpha.2 升级:这两版依赖
@deepseek-ai/dsh-tools,会在 profile 的node_modules里多装一份,导致该 profile 所有工具调用报Cannot read properties of undefined (reading 'prepare'),或插件卡在"等待依赖 tools"。alpha.3 去掉了这个依赖。升级后若<profile>/node_modules/@deepseek-ai/dsh-tools还在,先卸载插件再装 alpha.3,然后完全退出 dsh / 桌面端(Cmd+Q)再打开。
也可以用 git 地址(github:keeees/MemoryBearDSHPlugin#v0.1.0-alpha.6)或 tgz 文件安装。本地开发时可以用 link: 依赖指向源码目录。
配置
写在 profile 自己的 cordis.patch.yml 里:
- id: memorybear-memory
config:
baseURL: https://<memorybear-host>/v1
endUserId: <end_user uuid>
apiKeyEnv: MEMORYBEAR_API_KEY # key 从这个环境变量或 dsh 凭据库读取,不要写进配置文件
profile: true # 会话首轮加载画像
recall: false # 关掉每轮自动召回,改由模型按需调 memory_search
也可以用 !!js 从环境变量读,避免把地址和 ID 写死:
baseURL: !!js (process.env.MEMORY_SERVICE_BASE_URL ?? '').replace(/\/+$/, '').replace(/(\/v1)?$/, '/v1')
endUserId: !!js process.env.MEMORY_ENDUSER_ID ?? ''
完整选项和默认值:
| 选项 | 默认 | 说明 |
|---|---|---|
baseURL |
空 | V1 服务 API 根地址。和 endUserId 都填上之前插件不连服务(召回、写入都不做,memory_search 返回"未配置") |
endUserId |
空 | 一个 dsh 用户对应一个固定的 MemoryBear end_user |
apiKeyEnv |
MEMORYBEAR_API_KEY |
API key 的凭据引用 |
profile |
false |
会话首轮加载 meta 画像 |
recall |
true |
每轮自动召回 |
preferenceMode |
auto |
偏好用法:auto 每轮自动召回注入 / tool 注册 memory_preferences 由模型按需查 / off 不用 |
preferenceContextMessages |
4 |
偏好召回带上的前几条消息(服务端也会截断) |
preferenceTimeoutMs |
8000 |
偏好召回超时,和记忆召回同时进行 |
searchSwitch |
express |
自动召回用的档位 |
tool |
true |
注册 memory_search |
toolSearchSwitches |
[express, quick, normal, deep] |
模型可选的档位 |
slowSearchTimeoutMs |
15000 |
normal/deep 超时后降级到 quick |
write |
true |
是否写入 |
writeMode |
turn |
turn 每轮写 / batch 每 N 轮写 / idle 空闲后写;会话或插件销毁时会补写 |
writeEveryTurns |
3 |
batch 模式下每几轮写一次 |
writeIdleMinutes |
10 |
空闲多久算空闲 |
attachments |
images |
附件写入:none 不写 / images 只写图片 / all 图片加 MemoryBear 能解析的文档、音频、视频 |
maxAttachmentMB |
20 |
单个附件超过这个大小就跳过 |
panel |
true |
右侧边栏"记忆"标签页(记忆数、记忆标签、近期情绪、情绪记录、画像、记忆主题) |
panelTimeoutMs |
20000 |
标签页每个数据请求的超时 |
recallTimeoutMs / toolTimeoutMs / writeTimeoutMs |
8000 / 30000 / 15000 |
各请求超时 |
maxRecallChars |
4000 |
注入的记忆文本上限 |
minQueryChars |
2 |
短于这个长度的输入(如"好""继续")不召回 |
language |
zh |
写入时的 X-Language-Type |
验证
# 单元测试,不需要 dsh 和真实服务
node test/client-page.test.mjs
MOCK_LOG=/tmp/mock.jsonl node test/write-modes.test.mjs
# 端到端:本地 mock 服务 + 真实 dsh
node test/mock-memorybear.mjs 18765 mock.jsonl &
MEMORY_SERVICE_BASE_URL=http://127.0.0.1:18765 MEMORY_SERVICE_API_KEY=mock \
uv run python scripts/run_dsh.py "我最喜欢什么颜色?"
mock 服务预置的记忆是"最喜欢的颜色是靛蓝色"。mock.jsonl 里应该能看到 read/sync 和 write 请求。scripts/run_dsh.py 从 ~/.config/redbear/secrets.env 读取 LLM 和 MemoryBear 的 key,并通过子进程环境变量传给 dsh。
目录
| 路径 | 内容 |
|---|---|
index.js |
服务端插件,全部逻辑都在这里 |
client.js |
网页 Plugins 页的配置界面 |
cordis.patch.yml |
bundle 补丁,把插件插进 profile |
test/ |
单元测试和 mock 服务 |
scripts/ |
启动 dsh、直连探测服务、建 end_user 等脚本 |
examples/tutorial/ |
插件开发教程的 4 个示例 |
docs/ |
插件开发教程(md/html)和实现说明 |
License
Apache-2.0