前言¶
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):
- 持久 Session projection 记录用户侧消息及其轮次。
- 仅当原始
user/message的 seq 已不在当前 Session surface 时,该条才成为 anchor。 - 动态
PromptContext将选中的 anchors 渲染为一条 user 角色的 runtime-context 快照。 - 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 顺序):
- 优先考虑最新的被遮住轮次。
- 候选若在
tokenBudget内则接纳。 - 若最新一轮单独超过
tokenBudget,可保留至hardMaxTokens。 - 仍超限则先丢该轮最旧 anchor;单条仍过大则截断并标注
… [anchor truncated; full text remains in session log]。 - 更旧轮次在剩余软预算内拟合,否则不再考虑更旧轮次。
- 省略或截断会在块内追加披露行,例如
[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