oh-my-clm:把可编辑上下文镜像成文件,由模型自行整理

前言

在 DeepSeek Harness(DSH)或 Pi 里跑长任务时,对话历史会不断变长:工具输出、重复推理、已过时的中间结论都会占满 context window。常见做法是依赖宿主自带的 compaction,或由人在会话外手工删改 JSONL。Facebook Research 的 context-language-models 提出另一种思路:把「当前可编辑上下文」投影到普通文件里,让模型通过结构化编辑删除 stale 内容,而不是再开一轮专门的 compact LLM turn。

下面介绍社区插件 oh-my-clm(维护者 DevZjQx):同一套核心实现同时作为 Pi 扩展与 DSH/Cordis 插件发布,在 DSH 社区目录中归类为「记忆」。仓库见 GitHub,目录页见 SkillHub。

这是什么

oh-my-clm 是可直接加载的 live-context 扩展:宿主在构建下一次请求的 projection 时,把可编辑部分镜像到当前 session 的临时目录(例如 /tmp/clm-${sessionId}/LIVE_CTX_MAIN.md),模型通过 cleanup 工具或同一次工具调用内的 mirror 读写来缩短历史;合法变更在 turn 结束时经宿主原生的 context edit 持久化,不改写原始 session JSONL。

npm 包名 oh-my-clm,当前资料中的版本为 0.1.12。Pi 与 DSH 可从 npm 或 GitHub 安装,DSH 不读取 Pi 的 settings,两边安装互不影响。

核心机制

镜像文件与块结构

每个 session 使用独立临时目录,多 session 共用工作目录时也不会互相覆盖 mirror。文件内用 clm-v2 协议标记可编辑块,例如:

<!-- clm-v2 -->
<!-- CLM_SNAPSHOT ... -->

[[CLM_ENTRY id=1 role=assistant]]
这段旧内容可以被改写成一句更短的事实摘要。
[[/CLM_ENTRY id=1]]

编辑规则要点(摘自官方 README):

  • 只改 block body;保留 CLM_SNAPSHOT、CLM_ENTRY 与闭合标记。
  • id 为从 1 开始的可读序号,不要改 ID 或重排 block;扩展内部仍用 Pi 的 opaque entry ID。
  • 删除可编辑 block 会从后续 projection 中省略该消息;初始用户任务受保护,不出现在可编辑区域。
  • 所有接受的 mirror 编辑采用 shrink-only:编辑后上下文必须严格短于编辑前,否则拒绝。

cleanup 与索引

模型可调用宿主提供的 cleanup({ blockIds: [...] }),按 1-based 可编辑 ID 删除 stale、重复或噪声;也可使用 ranges: ["3-16"]、skipRoles: ["user"] 等参数。cleanup({ list: "3-16" }) 为只读展开,不删除。assistant 与 tool result 配对会级联处理,避免孤立 tool message。

DSH 在 runtime context 中注入 <oh-my-clm-block-index>,模式由 CLM_INDEX_MODE 控制:

  • digest(默认):按 turn 摘要,适合长会话。
  • blocks:逐个列出可编辑 block 的 ID、role 与短 preview。

进程内可用 /clm mode [blocks|digest|auto] 做不重启的 A/B 切换;跨重启保持需设置环境变量。

DSH 侧契约

社区发现入口为仓库中的 dsh-plugin.json,构建入口为 dist/dsh/index.js;bundle 元数据在 package.json 的 dsh.bundle.patch 与 cordis.patch.yml。DSH 通过 Cordis 的 agent/pre-step、session/event、systemPrompt.context()、tools.register() 等扩展点接入;cleanup 对当前 session surface 做 native replacement,不依赖读 mirror 文件完成删除。

安装与启用

dsh plugin 是 DSH 包管理入口,安装时需指定 profile(如 web 或 tui):

# 从 npm 安装
dsh plugin --profile <profile> add oh-my-clm

# 从 GitHub 安装
dsh plugin --profile <profile> add github:DevZjQx/oh-my-clm

安装后重启对应 profile:

dsh --profile <profile>

卸载:

dsh plugin --profile <profile> remove oh-my-clm

固定版本时,npm 源可在包名后加 @<version>(例如 oh-my-clm@0.1.12),GitHub 源可在仓库后加 #<ref>。插件以当前 DSH 进程权限运行,安装前请自行查看仓库源码与许可证(资料中未单独列出许可证字段则以仓库为准)。

Pi 用户可使用 pi install npm:oh-my-clm 或 pi install git:github.com/DevZjQx/oh-my-clm,与本文 DSH 路径无关,此处不展开。

典型用法

  1. 安装并重启 profile 后,开始会产生多轮工具输出的任务;扩展会在 session start 与请求前自动刷新 mirror。
  2. 需要压缩历史时,让模型按 block ID 调用 cleanup({ blockIds: [...] }),或在同一次 host-side 工具调用内对 LIVE_CTX_MAIN.md 做 read+write 改写(缩短已有 block 时,普通 edit 仅适用于完整未截断 body)。
  3. 查看当前 mirror 路径、字节数、可编辑块数、token 估算与 shrink-only 策略:
/clm
/clm status

DSH 另支持 /clm mode 切换索引形状。两个宿主均不提供 /clm refresh;手动整体压缩仍可使用 Pi 原生的 /compact(DSH 侧行为以宿主文档为准)。

可选环境变量(资料中明确出现):

# 近似目标预算;达到约 0.75 × max(1, budget - 2048) 时会 nudge 模型做一次 cleanup 或 mirror 编辑
CLM_CONTEXT_BUDGET=32000

# DSH 可覆盖 mirror 显示上限(默认与 Pi 一致:单 block 约 12000 字符,总 mirror 约 96000 字符)
CLM_MAX_BLOCK_CHARS=...
CLM_MAX_MIRROR_CHARS=...
CLM_INDEX_MODE=digest   # 或 blocks

适用场景与注意

适合:长会话 agent、工具链密集的任务,希望模型在宿主约束下自行删除过时块或改写为短摘要,而不是完全依赖外部脚本改 session 文件。

边界(官方「设计边界」摘要):

  • mirror 位于系统临时目录,默认目录权限 0700、文件 0600;不应提交到 Git。
  • 显示截断只影响 preview,不改变 canonical source;若工具结果读过完整 mirror,未来 projection 会替换成短指针,避免自我复制。
  • 在 agent turn 外直接改 mirror,下次同步会恢复为 canonical projection。
  • token 估算为 provider-independent 近似(如 3.5 chars/token),不是精确 tokenizer;最终仍以 DSH/Pi 的 context window 为准。

DSH 生态采用「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。oh-my-clm 在 GitHub 上星标数为 1(以目录页/仓库当时展示为准),使用前请自行评估维护活跃度与适配的 DSH 版本(README 提及在 DSH 0.2.0-rc.2 语境下 bundle 元数据等行为)。

结尾

oh-my-clm 把 CLM harness 的「可编辑 live context 镜像 + 模型自整理」落到 Pi 与 DSH 双宿主:临时文件承载协议化块、cleanup 与 shrink-only 编辑保证会话可缩短且可审计。若你在 Harness 里需要可操作的「记忆」层而非纯被动截断,可按上文命令装入 profile 后结合 /clm status 与 cleanup 试用。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜