Skip to content

dsh-memorybear

Verified

@redbearai/dsh-memorybear · v0.2.4 · 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 @redbearai/dsh-memorybear

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

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 不会发到浏览器。

更新检查另请求 GET https://registry.npmjs.org/@redbearai/dsh-memorybear/latest,只读取版本号;updateCheck: false 可关闭。发现新版本时配置页会提示并提供“复制更新命令”按钮,命令里的 PROFILE 需替换为实际 profile 名。

插件不会创建 end_user,需要事先在 MemoryBear 控制台或管理接口建好。所有 MemoryBear 路由、查询参数和请求体集中在 src/services/api.ts。

请求头带 Authorization: Bearer <key>。子代理(subagent)会话不召回也不写入。

安装

dsh plugin --profile <你的 profile> add @redbearai/[email protected]

桌面端在插件页的"包名或地址"里填同样的 @redbearai/[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)再打开。

也可以安装本地打包的 tgz:在仓库根目录执行 pnpm --filter @redbearai/dsh-memorybear pack,把生成的 redbearai-dsh-memorybear-0.2.4.tgz 交给 dsh plugin add。本地开发时可以用 link: 依赖指向源码目录(先 pnpm build)。

配置

写在 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 标签页每个数据请求的超时
updateCheck true 启动和打开配置页时查询 npm registry;只提示新版本,不自动安装
recallTimeoutMs / toolTimeoutMs / writeTimeoutMs 8000 / 30000 / 15000 各请求超时
maxRecallChars 4000 注入的记忆文本上限
minQueryChars 2 短于这个长度的输入(如"好""继续")不召回
language zh 写入时的 X-Language-Type

开发与验证

源码全部是 TypeScript 6.x,位于 src/;dsh Host 适配层和表单框架来自 @redbearai/dsh-memory-core。构建产物在 lib/(不提交):

  • lib/index.js:Host 半边打成单个 ESM 文件
  • lib/client.js:浏览器半边打成 dsh 客户端加载器要求的 lazy-CJS bundle
  • lib/types/**/*.d.ts:两半边的类型声明
# 在仓库根目录先执行 pnpm install
pnpm build          # 先构建 core,再 tsc 生成 lib/types、esbuild 打出两个 bundle
pnpm typecheck      # 全量类型检查(含测试和脚本)
pnpm test           # 单元测试,不需要 dsh 和真实服务

端到端:本地 mock 服务 + 真实 dsh。

pnpm mock 18765 mock.jsonl &
MEMORY_SERVICE_BASE_URL=http://127.0.0.1:18765 MEMORY_SERVICE_API_KEY=mock \
  pnpm dsh "我最喜欢什么颜色?"

mock 服务预置的记忆是"最喜欢的颜色是靛蓝色"。mock.jsonl 里应该能看到 read/sync 和 write 请求。scripts/run-dsh.ts 从 ~/.config/redbear/secrets.env 读取 LLM 和 MemoryBear 的 key,并通过子进程环境变量传给 dsh。

目录

路径 内容
src/index.ts 服务端插件入口:组装各 feature,导出 name / inject / Config / apply
src/config.ts 配置 schema、volatile 快照、连接字段校验
src/dsh/session.ts 从会话事件日志读取偏好召回所需的上下文
src/features/ 召回、写入、工具、记忆面板、更新检查五个功能模块
src/services/ MemoryBear 路由与请求构造(api.ts)、V1 客户端、画像解析、面板数据整形
src/client/ 网页 Plugins 配置页和右侧栏记忆面板(打包成 lib/client.js)
src/client/locale/ 配置页与记忆面板文案 JSON,构建时打进 lib/client.js
locale/ dsh 插件元数据(标题、描述),由插件管理器读取
test/ 单元测试、fake host 和 mock 服务
scripts/ 构建、mock 服务和启动 dsh 的开发脚本
lib/ 构建产物:index.js、client.js、types/(不提交)
cordis.patch.yml bundle 补丁,把插件插进 profile

License

Apache-2.0