zcd0818/dsh-scribe ↗★ 2

dsh-scribe

Cross-session memory and a local knowledge base for DeepSeek Harness: local-first by default, cloud optional, migration always user-approved

패키지
dsh-scribe
호환성
미검증
버전
1.1.0
라이선스
MIT
최근 업데이트
2026. 10. 28.

설치

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:zcd0818/dsh-scribe

配置页面(推荐)

安装后打开 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 时过期即删
字段默认说明
defaultProviderlocal新记忆写入的后端
autoInject / autoSavetrue / true两个自动化开关,可单独关
includeSubagentsfalse子代理是否也注入/记录
dataDir~/.dsh/memory向量缓存与迁移日志所在目录
retrieval.modehybrid无向量时自动等价于 lexical
retrieval.llmReranktrue候选多于结果数时用会话模型重排
retention.maxMemories5000超出按时间淘汰最旧
ui.sidebartrue是否在左侧菜单栏放入口
knowledgeBase.enabledtrue知识库总开关
knowledgeBase.workspace.overrides{}按工作区路径覆盖知识库目录
knowledgeBase.workspace.rootkb相对会话工作目录
knowledgeBase.workspace.include30 种文本/代码扩展名只索引 UTF-8 文本,二进制格式跳过
knowledgeBase.workspace.exclude原始/、inbox/、锁文件等投放区与原始资料默认不进知识库
knowledgeBase.extract.enabledtrue是否抽取二进制文档正文
knowledgeBase.extract.documents.docx .xlsx .pptx .pdf需要抽取正文的扩展名
knowledgeBase.global.root/kb/global留空即默认位置
knowledgeBase.chunk.maxChars1200单块上限,超出按空行切分
knowledgeBase.refreshSeconds300索引 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 时会弹审批框;你拒绝 = 零写入。