Passer au contenu principal
L

dsh-ebbing-context

light-ei/dsh-ebbing-context

Compression contextuelle par couches pour DeepSeek Harness : regroupe les anciens tours en blocs de résumé L1–L3 rédigés par le modèle et indique le contenu de chaque couche. Réveille le modèle lorsque le contexte dépasse un seuil de taille ou continue de croître. Nécessite par défaut le plugin expérimental Session Search de DSH (session_event_read / session_event_search) ; sans lui, les outils restent désactivés, sauf si requireSessionQuery est désactivé.

Installer

dsh plugin --profile web add github:light-ei/dsh-ebbing-context

README

Ebbing Context

test license

模拟记忆衰退的 DSH 分层上下文压缩插件。

模型自己决定压哪里、自己写摘要;插件只写宿主本来就认识的会话事件,把旧内容一层层降成更粗的表示:

原文(逐字) → L1 块(一段的结论与数据) → L2 块 → L3 块(只剩关键词句)

越旧的越粗,但从来没有被删掉——原文仍在会话日志里,装了「会话搜索」插件就能按事件号取回。

ebbing 是"渐渐消退":降不降、降多少,由模型看着上下文压力自己决定,不是定时任务。

状态:功能完整、测试全绿,已在真机上跑通过压缩。没留下的是可复现的验证记录——当时的地图、日志与压缩前后对比都没归档。目标宿主 DSH 0.2.1-rc.3 ~ 0.2.2-alpha.2。试的时候请先备份 profile、用新会话试。 逐版变更见 CHANGELOG。


它怎么工作

  • 两个工具 + 一条命令:context_map(分层结构与占用)、compress(执行一次压缩)、/context-status(只读,同地图)。
  • 键名 = 要压的那一层:l0 压原文 → L1 块;l1 压 L1 → L2;l2 压 L2 → L3;l3 把整个 L3 区压成一块(唯一不写 to 的键)。
  • to 只能从地图上抄:l0 写轮号(T19),l1/l2 写该区从 1 起的块序号。写错就被拒,拒绝回执里带刷新后的地图。
  • 级联:压深层时,比它浅且还能压的层必须同批给完,否则整批拒绝(只断一次前缀缓存)。
  • 零台账:不建库、不写状态文件;层级每轮从会话表层现算,块的身份写在正文第一行 〔L1|T16–T19|ev 4121–4390〕标题。
  • 提醒但不代劳:占用到线、又长了、某层超配额时,在本轮收尾把模型叫醒并附一张新地图。从不自动压缩,也不催 /compact。

完整设计(分层模型、级联、保护边界、配置、宿主约定、限制)见 docs/SPEC.md。


安装

npm 已发布:dsh plugin add dsh-ebbing-context(也可以 npm install dsh-ebbing-context)。下面两种方式也仍可用。

方式一:从 npm 装(推荐)

dsh plugin add dsh-ebbing-context

方式二:从源码目录装

git clone https://github.com/Light-EI/dsh-ebbing-context.git
dsh plugin add ./dsh-ebbing-context

方式三:手动挂到 profile

  1. 把仓库内容放进 profile 的 node_modules/dsh-ebbing-context/
  2. 在 profile 的 cordis.patch.yml 里加一行 dsh-ebbing-context:(路径写法见 docs/SPEC.md 的"目录与开发")
  3. 重启 DSH

装完确认三件事:插件卡片显示运行中、context_map / compress 两个工具都在、/context-status 能出地图。

卸载(dsh plugin remove dsh-ebbing-context 之后还要做两步):

  1. 打开 profile 的 cordis.patch.yml,删掉 dsh-ebbing-context 那一节(包括面板里改过的 config)。不删的话,下一次启动会因为"patch 指向的条目不存在"在 stderr 刷一条警告——不会坏,但会一直刷。
  2. 日志在 $DSH_HOME/logs/ebbing-context.log(滚动时还有 .1 / .2),卸载不会自动删,确认不需要排查后手动删掉即可。 建议关掉宿主自带的自动压缩(compaction-basic 的 auto,默认 80% 触发)。它一旦触发会把多层摘要重新拍平,细节永久丢失。插件照样能压,只是效果打折。关的位置取决于你的安装方式与预设。

配置

共 17 项(triggerPct、keepTurns、pruneFirst、foldCallRecord、requireSessionQuery、reservedTokens、budget.*、segment.*、title.maxTokens、notice.*),在插件面板里改,改完点「保存」才生效。

默认值、含义与拒绝规则见 docs/SPEC.md 第 6 节。


依赖与边界

  • 需要宿主提供 agent/pre-step、agent/turn-stopping、agent/followup 与会话表层 API。
  • 默认要求装「会话搜索」(session_event_read / session_event_search),取不回原文就不让压。
  • 只做"成对替换"或"只改 tool/result 正文",从不单点删节点。
  • 不联网、不读文件、不收集遥测。

已知限制

  • 并行调用时不折叠(也不改写返回),摘要正文会以参数形式留在上下文里(插件会提醒以后单独发)。
  • 折叠只在下一次请求发出之前做;错过这一步的那条就不再折,调用记录原样留着。
  • 图片无法取回,只按张数记账。
  • 轮次大纲损坏(日志缺 turn/start 或乱序)时,该轮报红色错误并停用。
  • 区占用由插件自估(中文约 0.6 token/字、英文约 0.3 token/字),与宿主计价器接近但仍会有几个百分点的差异。

许可

MIT。

参与

Issue / PR 都欢迎。动手前请先看 docs/SPEC.md 的"依赖的宿主约定"一节;那是正确性的前提。

Plugins associés