dsh-scribe
Cross-session memory and a local knowledge base for DeepSeek Harness: local-first by default, cloud optional, migration always user-approved
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:zcd0818/dsh-scribe说明文档
阅读完整 README ↗配置页面(推荐)
安装后打开 DSH 设置,左侧会多出 记忆与知识库 一页,四个分页:
| 分页 | 能做什么 |
|---|---|
| 概览 | 运行状态(后端、条数、时间范围、可用性、数据目录)、界面入口开关、数据边界说明 |
| 记忆 | 按关注点分五组:记忆后端(写入位置、注入开关与上限)、本机存储(目录、引擎)、阿里云百炼记忆库(凭据与隔离键)、检索(重排开关、检索策略、语义嵌入两个子组)、会话摘要与留存;底部统一保存与连通性测试 |
| 知识库 | 索引状态(每个工作区与全局共用一张表:目录、文件数/块数、更新时间、重建/更换目录)、上传文件、使用方式 |
| 数据迁移 | 目标后端 → 生成计划(条数/大小/时间范围/样例)→ 确认执行 → 进度 → 迁移记录与撤销 |
后端的无关字段不会出现:选 local 时不显示百炼凭据,选 bailian 时不显示本机目录——减少每页的干扰项。
页面写的是 profile 配置,保存后插件立即重新挂载,不必手改 YAML。几条它坚持的规则:
- API Key 只写不读:页面只显示「已保存」,输入框留空表示保持不变。
- 迁移必须先看计划再确认:确认按钮用的是后端签发的一次性 token(5 分钟有效、用后作废),跳过页面直接调接口也绕不过去。
- 接口只认同源请求:外来
Origin或sec-fetch-site: cross-site一律 403。
页面走插件自己的本地接口(前缀 /dsh-scribe/api),不经过任何第三方。
配置(YAML)
不想用页面也可以直接写在 DSH profile 的 cordis.patch.yml(或本包的 cordis.patch.yml):
- insert:
- id: dsh-scribe
name: 'dsh-scribe'
config:
defaultProvider: local # 新记忆写到哪
autoInject: true # 会话开始是否注入
autoSave: true # 会话结束是否写回
injectLimit: 5
injectMaxChars: 1200
providers:
local:
type: local
path: '~/.dsh/memory'
engine: file # file(默认,零依赖)| chromadb(需自建服务端)
bailian: # 可选:阿里云百炼记忆库
type: bailian
apiKey: 'env:BAILIAN_API_KEY'
workspaceId: 'llm-xxxxxxxxxxxx'
userId: dsh
planVersion: pro
hybrid: # 可选:云端主 + 本地镜像
type: hybrid
primary: bailian
mirror: local
embedding: # 可选:配了才有语义检索
endpoint: 'https://api.deepseek.com/v1'
apiKey: 'env:EMBEDDING_API_KEY'
model: text-embedding-v3
retrieval:
mode: hybrid # recent | lexical | vector | hybrid
minScore: 0.18
llmRerank: true
summarization:
shortTurns: 10 # 少于这么多轮 → 抽取式
maxChars: 320
retention:
maxMemories: 5000
ttlDays: 0 # >0 时过期即删
| 字段 | 默认 | 说明 |
|---|---|---|
defaultProvider | local | 新记忆写入的后端 |
autoInject / autoSave | true / true | 两个自动化开关,可单独关 |
includeSubagents | false | 子代理是否也注入/记录 |
dataDir | ~/.dsh/memory | 向量缓存与迁移日志所在目录 |
retrieval.mode | hybrid | 无向量时自动等价于 lexical |
retrieval.llmRerank | true | 候选多于结果数时用会话模型重排 |
retention.maxMemories | 5000 | 超出按时间淘汰最旧 |
ui.sidebar | true | 是否在左侧菜单栏放入口 |
knowledgeBase.enabled | true | 知识库总开关 |
knowledgeBase.workspace.overrides | {} | 按工作区路径覆盖知识库目录 |
knowledgeBase.workspace.root | kb | 相对会话工作目录 |
knowledgeBase.workspace.include | 30 种文本/代码扩展名 | 只索引 UTF-8 文本,二进制格式跳过 |
knowledgeBase.workspace.exclude | 原始/、inbox/、锁文件等 | 投放区与原始资料默认不进知识库 |
knowledgeBase.extract.enabled | true | 是否抽取二进制文档正文 |
knowledgeBase.extract.documents | .docx .xlsx .pptx .pdf | 需要抽取正文的扩展名 |
knowledgeBase.global.root | /kb/global | 留空即默认位置 |
knowledgeBase.chunk.maxChars | 1200 | 单块上限,超出按空行切分 |
knowledgeBase.refreshSeconds | 300 | 索引 TTL,过期自动重建 |
apiKey 支持四种写法,避免把密钥写进仓库:字面量、$VAR、${VAR}、env:VAR。
使用
斜杠命令是
/scribe,工具统一带scribe_前缀(scribe_memory_*/scribe_kb_*)。原因是 DSH 的注册表遇到重名会直接抛错——memory_search、kb_search、/memory这些通用名市场上都有别的插件在用,撞上会让后装的插件整体装不上。1.0.0 的旧名/memory仍会在未被占用时自动注册为别名。
-
什么都不用做:新会话自动带上记忆。
-
要改设置:设置 → 记忆与知识库(见上)。
-
让它记住:说「记住这个」,或
/scribe save 提交前必须跑 node --test。 -
主动查:
/scribe search 部署脚本,或直接问模型。 -
看状态:
/scribe status/list/providers。 -
换后端:
/scribe migrate bailian # 只打印计划,不动数据 /scribe migrate bailian --yes # 执行,写可回滚日志 /scribe rollback mig_xxxxxx # 撤销这次迁移新增的记录模型自己调
scribe_memory_migrate时会弹审批框;你拒绝 = 零写入。