跳过主要内容
W

dsh-companion

wuwen837/dsh-companion

在「工作」之外加一个「聊天」模式:使用自定义人设,每轮自动提炼长期记忆并按话题召回,还能保存和发送表情包。

安装

dsh plugin --profile web add github:wuwen837/dsh-companion

README

dsh-companion · 陪伴聊天与长期记忆

中文 | English

给 DeepSeek Harness(dsh)加一个「聊天」模式:在顶部切换 聊天 / 工作。聊天模式下,模型以你设定的人设和你聊天,自动记住聊过的事,在之后的对话里自然地用上;工作模式保持 dsh 原样,不带人设,也不读写聊天记忆。

聊天:记得之前的约定,并发出表情包

记忆表情包
记忆面板表情包面板

截图中的人设、记忆和表情均为演示数据。

功能

  • 顶部切换:Windows 桌面版放在标题栏「应用 / 编辑」菜单右边,浏览器里放在对话区左上角。打开某个会话时,模式会自动跟随它。
  • 人设:一张人设卡(名字、对你的称呼、性格、说话风格、关系、背景),作为聊天会话的完整系统提示词。
  • 自动记忆:每轮聊天结束后,在后台调用一次模型,提炼值得记住的事实、喜好、事件、约定,自动去重、更新或删除过时的记忆。
  • 按话题挑记忆:人设每次都完整带上;记忆只挑与当前话题相关的若干条,再加上重要和最近的,记忆再多也不会撑爆上下文。检索在本地完成,不需要 embedding 接口。
  • 记忆面板:查看、搜索、手动添加、编辑、删除、置顶(置顶 = 每次都带上)。手动写的和置顶的记忆,自动记忆不会改动。
  • 独立的聊天记录:聊天模式下侧边栏换成聊天记录列表;工作模式下聊天会话会从工作区列表中隐藏。
  • 表情包:
    • 在聊天里发图并说「存起来」,它会用 save_stickers 工具把图片存进表情库,自己起名字、写含义。
    • 也可以在「记忆与人设 → 表情包」里批量拖入上传,上传后会自动看图命名,名字和含义都能改。
    • 聊天时它偶尔在情绪明显的时候发一个:回复里写 [表情:名字],插件把它换成图片,以小图显示。
  • 独立的聊天模型:在聊天输入框里切换模型即可。插件会记住它作为新聊天的模型,并把工作模式的默认模型恢复原样。

实现方式

部分做了什么
companion Agent 预设聊天会话使用的预设:不挂任何工具,只保留上下文压缩。
dsh-companion/agent预设内的行:用人设作为完整系统提示词(dsh-persona 同样的方式),关闭可选的运行时上下文,再加一条必需的上下文,放当前时间和挑出的记忆。
dsh-companion(Host)记忆与人设存储、POST /api/dsh-companion/* 接口、聊天轮结束后的记忆提炼、聊天模型与工作默认模型的隔离。
dsh-companion(Web)顶部切换(conversation.header.leading)、聊天记录列表(以负优先级遮住 sidebar.workspaces)、记忆面板(main + sidebar.panellist)。

表情包相关:聊天预设里唯一的工具是 save_stickers;Host 包住 llm/stream,只在聊天会话里把回复中的 [表情:名字] 改写成指向本地文件的 Markdown 图片;面板上传时先把图片存成 dsh 附件,再调用一次能看图的模型自动命名。

数据保存在 ~/.dsh/companion/(设置了 DSH_HOME 时在其下):persona.json、memories.json、settings.json、stickers.json,表情图片在 dsh-companion-stickers/ 文件夹里。设置环境变量 DSH_COMPANION_HOME 可以把这些数据放到别的目录,比如用一份单独的演示数据。

安装

先从托盘完全退出 DeepSeek Harness 桌面版,然后从 GitHub 安装:

dsh plugin --profile desktop add github:wuwen837/dsh-companion

开发时也可以克隆仓库,再链接到本地目录,改完代码重启就生效:

git clone https://github.com/wuwen837/dsh-companion.git
dsh plugin --profile desktop add link:<克隆下来的目录的绝对路径>

安装后确认该 profile 的 package.json 里 dsh.profile.bundles 包含 dsh-companion,再打开桌面版。改了后台代码(index.js、agent.js、lib/)以后,同样要从托盘完全退出再重开,只关窗口不会重新加载。

使用

  1. 点顶部「聊天」。侧边栏会变成聊天记录,左侧出现「记忆与人设」。
  2. 打开「记忆与人设 → 人设」,写好人设卡并保存。
  3. 正常聊天即可。记忆会在每轮结束后自动整理,在「记忆」页可以查看和修改。
  4. 想换聊天模型,直接在输入框的模型菜单里换。

已知限制

  • 记忆检索是本地关键词匹配(中文按字和词组切分),能找出说法相近的记忆,但不理解同义改写。
  • 自动记忆每轮多调用一次模型(默认跟随当前聊天的模型,用最低的推理强度),可在「设置」里关闭或换成更便宜的模型。
  • 工作模式隐藏聊天会话是按会话行隐藏的;工作区默认只显示前几条会话,隐藏后那一组可能显示得比平时少一两条。
  • 表情库只存 JPG / PNG / GIF / WebP,按文件内容判断格式,不看扩展名。面板上传时,浏览器能打开的其他格式(AVIF、BMP 等,包括扩展名写成 .jpg 的)会自动转成 PNG;HEIC 浏览器打不开,需要先另存为 JPG / PNG。
  • 在聊天里发 GIF 让它存,存下来的是 dsh 处理过的静态图,动画会丢;想保留动图请在面板里上传。
  • 带图片的那一轮和调用工具会多花一些 token;面板上传时自动命名也会额外调用一次模型。
  • 浏览器(非桌面版)里,打开「记忆与人设」面板时,顶部切换按钮随对话头部一起隐藏,从侧边栏点回聊天即可。

开发

node test/offline.test.mjs

离线测试覆盖存储、检索、提示词和提炼结果解析。界面和模型调用需要在运行中的 dsh 里验证。

许可

MIT

相关插件