dsh-lossless-anchors:在压缩后按预算回放用户原文

前言

DeepSeek Harness(DSH)在长会话里会用 compaction 把较早的对话表面替换成摘要,以控制上下文长度。摘要提示会要求模型在关键处引用原话,但摘要仍是模型生成的衍生物,精确约束、纠错、路径、数字和审批决定仍可能丢失。

若要把这些细节留在模型可见的上下文中,一种做法是保留用户侧输入与交互决定的原文,在压缩之后再注入。dsh-lossless-anchors 是社区维护者 EvannZhongg 发布的 DSH 插件,在 SkillHub 目录中归类为「记忆」。它不改 DSH 核心、不新增 Session 事件类型、也不改动 compaction-basic,而是利用 DSH 自带的 Session 投影与 PromptContext 接缝实现上述思路。

这是什么

dsh-lossless-anchors(npm 包名 dsh-lossless-anchors,当前资料中版本为 0.1.3)在 compaction 已经「遮住」某条用户消息之后,把该消息的精确文本记入持久投影,并在后续请求里以带 token 预算的 runtime-context 快照形式重新注入。

插件 README 中的保证范围需要区分:

  • 保证:在配置的 token 预算内,用户侧 anchor 为逐字原文(唯一例外是预算触发的截断路径,且会在块内明示)。
  • 不保证:整段对话无损压缩;助手与工具历史仍由 compaction 摘要表示。

「被 compaction 遮住」在实现上指:该条 user/message 的 seq 已不在当前 Session surface 的 nodes 中。

核心功能

持久投影与注入路径

插件通过四条接缝工作(均来自 README):

  1. 持久 Session projection 记录用户侧消息及其轮次。
  2. 仅当原始 user/message 的 seq 已不在当前 Session surface 时,该条才成为 anchor。
  3. 动态 PromptContext 将选中的 anchors 渲染为一条 user 角色的 runtime-context 快照。
  4. compaction 遮住该快照后,agent 循环的 RuntimeContextProjection 会从插件持久投影中重建;在 agent/request-error 溢出重试时同样会重建。

Replay、resume 与 fork 可从 Session 日志重建投影,无需额外状态文件。

哪些消息会成为 anchor

anchor 需同时满足:

  • 事件为 user/message;
  • source.kind 落在配置的 includeSources 内(默认含 user、user-question-reply、user-approval);
  • 其 seq 在请求时刻不在 Session.surface.nodes 中。

因此当前用户提示与仍留在表面的近期尾部不会被重复注入。goal、plan-mode、agent-instructions、runtime-context、compact-checkpoint 等来源默认不计入用户 anchor。

图片在回放时替换为 [image omitted: <mediaType>, <w>x<h>];文件保留显示名与字节数,历史图片字节不会重新上传。

预算与截断

预算用 charsPerToken(非 CJK)与 cjkCharsPerToken(CJK)估算,并计入与 DSH 单条 user 消息相同的块/角色 framing。默认 4 与 1.6,使中文 anchor 块更接近名义 token 预算,而非统一按 4 字/token 放大。

截断策略概要(README 顺序):

  1. 优先考虑最新的被遮住轮次。
  2. 候选若在 tokenBudget 内则接纳。
  3. 若最新一轮单独超过 tokenBudget,可保留至 hardMaxTokens。
  4. 仍超限则先丢该轮最旧 anchor;单条仍过大则截断并标注 … [anchor truncated; full text remains in session log]。
  5. 更旧轮次在剩余软预算内拟合,否则不再考虑更旧轮次。
  6. 省略或截断会在块内追加披露行,例如 [anchor budget: 2 older anchor message(s) elided; 1 anchor text(s) truncated to fit the configured budget]。

完整原文始终在 Session 日志中;仅预算截断路径下「逐字」保证不成立。

模型侧呈现

compaction 遮住 anchor 之后,下一次请求会携带 user 角色的 runtime-context 快照,块内包含 [Lossless User Anchors] 标题、逐条带时区的 turn 行与用户原文。系统提示中会注册如何解读该块的说明,且从首次请求起无条件注册,避免中途改 system prompt 破坏前缀缓存。

anchor 时间戳格式与 DSH durable time-context 一致;消息若记录了浏览器时区则按该时区渲染,否则使用配置的 timeZone。

安装与启用

插件声明了 dsh.bundle.patch,安装时会插入 lossless-anchors 行。package.json 要求 DSH 版本 >=0.2.0-0 <0.3.0。

本地 checkout:

dsh plugin --profile web add ./dsh-lossless-anchors

从 GitHub 安装(仓库跟踪已构建的 lib/):

dsh plugin --profile web add github:EvannZhongg/dsh-lossless-anchors

若需手写 patch 行,README 给出示例:

- insert:
    - id: lossless-anchors
      name: dsh-lossless-anchors
      config:
        tokenBudget: 2000

配置说明

在 bundle 或 patch 中为 lossless-anchors 设置 config。README 完整示例:

- id: lossless-anchors
  config:
    tokenBudget: 2000      # soft budget, calibrated tokens
    hardMaxTokens: 3000    # absolute cap; defaults to ceil(tokenBudget * 1.5)
    charsPerToken: 4       # calibrated characters per token for non-CJK text
    cjkCharsPerToken: 1.6  # calibrated characters per token for CJK text
    maxTurns: 32           # most-recent shadowed turns considered
    maxAnchors: 256        # projection-state retention cap
    includeSources:
      - user
      - user-question-reply
      - user-approval
    timeZone: Asia/Shanghai # zone for anchors whose message recorded none; defaults to the host zone
    required: true         # keep the context when optional runtime context is disabled

常用字段含义(默认值见 README 表格):

字段 作用摘要
tokenBudget 渲染块的软预算(校准 token)。最新被遮住轮次可单独保留至 hardMaxTokens。
hardMaxTokens 绝对上限,须 >= tokenBudget,默认 ceil(tokenBudget * 1.5)。
charsPerToken / cjkCharsPerToken 非 CJK / CJK 的字符/token 校准;密代码或 JSON 可适当调低前者。
maxTurns 参与选择的最近被遮住轮次数。
maxAnchors 投影状态保留上限,超出则丢弃更旧 anchor。
includeSources 视为用户侧-authored 的 source.kind 列表。
timeZone 未记录浏览器时区时使用的 IANA 时区。
required 为 true 时,即使 includeRuntimeContext: false 也不抑制该上下文。

典型调参:长会话、约束密集时适当提高 tokenBudget 与 hardMaxTokens;以中文为主时可保留默认 cjkCharsPerToken: 1.6;若希望审批类回复也进入 anchor,确认 user-approval 仍在 includeSources 中。

适用场景与注意

适合:依赖 compaction 的长程 agent 会话,需要在摘要之外仍让模型看到用户曾经写下的精确措辞、路径、数字或审批决定;希望用 DSH 原生投影与 runtime context 扩展,而不是 fork 核心。

不适合作为:整段对话的无损存档或助手/工具历史的完整回放——后者仍由 compaction 摘要承担。

安全与运维:插件以当前 dsh 进程权限运行,安装前应阅读仓库源码并确认 MIT 许可证(package.json)。SkillHub 为社区插件目录站点,与 DeepSeek / 幻方无官方从属关系;目录页显示该仓库星标为 0,不代表功能不可用,但使用前请自行评估维护者与版本(0.1.3)是否满足环境。

DSH 生态强调「一切皆插件」;本插件是其中针对 compaction 后用户原文保留的一种实现,不替代 Session 日志本身的完整性。

链接

  • SkillHub 目录页:https://www.skillhub.cn/plugins/EvannZhongg/dsh-lossless-anchors
  • GitHub 仓库:https://github.com/EvannZhongg/dsh-lossless-anchors
羽毛球分组比赛记分
小程序二维码

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

Xiaoye