【Claude Code-上下文实测】Server-side compaction 不是魔法摘要:pause_after_compaction 与长会话状态迁移

非线智能API经验 [Claude Code-上下文实测] 第16篇

摘要

Anthropic 的 server-side compaction 把长会话压缩从应用层摘要提升为平台能力:当输入超过阈值时,旧上下文可以被替换成摘要,从而让 agent workflow 继续运行。这个能力对长时 coding agent 很重要,因为它可以减少应用自己拼接、摘要和裁剪历史的负担。

但 compaction 不是无损压缩。它本质上是在把一段执行历史迁移成新的状态表示。pause_after_compaction 的价值正在于此:压缩完成后先暂停,让应用有机会检查摘要、补充关键约束、保留近期消息或保存 checkpoint,再决定是否继续。也就是说,server-side compaction 不是“自动变短”这么简单,而是需要被治理的状态转换。

数据来源:非线智能Nonlinear 官网

证据层级

Anthropic Compaction 文档、Automatic Context Compaction cookbook、Context Engineering cookbook 和 Bedrock Compaction 文档可以支撑 compaction、pause_after_compaction、压缩后继续请求等机制事实。Pydantic AI 等 SDK 文档适合说明上层框架如何包装这些配置。带工具 agent 的压缩风险,则应结合 Anthropic / AWS 关于 tool use 的官方文档和实际工程经验来写。

本文不把某个 SDK 的默认阈值写成 Anthropic API 的全局默认行为,也不把 compaction 描述成无损历史存储。

compaction 解决的不是长度,而是状态承载

长会话 agent 如果一直 append history,会遇到三个问题:

问题 表现
输入 token 持续增长 每轮请求越来越贵、越来越慢
上下文上限 到达模型窗口后无法继续
低信号历史污染 旧日志、过期假设、已解决错误仍影响推理

compaction 的直接目标是减少输入体积,但它更深层的作用是把“完整执行历史”转换成“继续执行所需状态”。这和压缩一个文本文件不同。coding agent 的历史里有用户约束、文件状态、工具调用结果、失败根因、计划变更和未完成任务;压缩时真正要保住的是这些状态,而不是每一句历史对话。

server-side compaction 的基本模型

一个简化的 compaction 流程可以理解为:

1、应用继续发送长会话历史。
2、服务端检测输入超过配置阈值或上下文管理策略触发。
3、旧消息被归纳成较短的 compacted context。
4、新请求携带压缩后的上下文继续执行。
5、如果开启暂停策略,服务端在压缩后返回,让应用检查或补充状态。

这带来两个工程变化。

第一,应用不必完全自己维护所有历史裁剪逻辑,但仍要决定哪些内容必须保留、如何检查摘要、压缩后是否继续。第二,压缩结果变成新的事实来源。后续模型看到的不再是原始历史,而是摘要后的历史。

pause_after_compaction 的真正含义

pause_after_compaction 很容易被理解成一个控制流开关:压缩后先停一下。但它的产品含义更重要:压缩摘要需要应用层介入。

压缩后暂停可以做这些事:

动作 目的
检查摘要 确认用户硬约束、当前目标、关键决策没有丢
注入补充消息 把不可违反约束、最新 diff、测试状态重新写入上下文
保存 checkpoint 记录压缩前后摘要、时间、token、会话 id
审计风险 对安全、权限、外部写入任务做人工或程序检查
调整后续策略 决定继续、重新压缩、切新会话或请求用户确认

如果压缩后立刻继续生成或调用工具,应用就失去了这次检查机会。对普通问答这可能没关系;对长时 coding agent,压缩遗漏可能直接导致错误修改、重复工作或违反用户约束。

压缩是有损状态迁移

compaction 的核心风险是“摘要看起来合理,但状态不完整”。常见丢失点包括:

丢失点 后果
用户硬约束 后续修改违反用户明确要求
权限边界 agent 执行不该执行的命令或外部写入
已排除方案 模型重复尝试失败路径
测试失败根因 修复方向漂移
文件版本信息 基于旧代码继续推理
工具结果完整性 把截断结果当成完整事实
未完成 TODO 长任务中途丢项
原始证据引用 无法复盘摘要是否正确

因此,不应把 compacted summary 当成完整历史的无损替代品。更合适的理解是:它是一个新的执行状态,需要有 schema、质量门槛和审计引用。

带工具 agent 的特殊风险

coding agent 通常带有 tools。压缩这类历史时,要额外注意三件事。

第一,压缩摘要阶段应明确要求只输出文本摘要,不调用工具。否则摘要流程可能与正常 tool use 流程混淆,尤其是在应用层把“模型输出包含 tool call”作为统一执行路径处理时。

第二,未闭合的工具状态不能被随意压缩。Anthropic tool use 协议中,tool_use 和后续 tool_result 有配对关系;如果压缩或清理破坏了这个状态机,后续请求可能报错或产生错误推理。

第三,工具结果本身也要分级。完整测试日志、大文件内容、MCP 输出不应长期留在上下文里,但它们也不能只被一句“测试失败”替代。至少要保留命令、退出码、关键错误、相关文件、原始日志引用和截断状态。

压缩摘要模板

推荐把压缩摘要做成固定字段,而不是自由散文:

{
  "task": {
    "user_goal": "当前用户目标",
    "done_definition": "完成标准"
  },
  "constraints": {
    "must_keep": ["用户硬约束", "权限边界", "不要修改的文件"],
    "must_not_do": ["禁止动作"]
  },
  "verified_facts": [
    {
      "fact": "已验证事实",
      "evidence": "命令 / 文件 / 链接 / 工具结果引用",
      "freshness": "current | stale | unknown"
    }
  ],
  "decisions": [
    {
      "decision": "已做决策",
      "rationale": "理由",
      "alternatives_rejected": ["被排除方案"]
    }
  ],
  "code_state": {
    "changed_files": ["path/to/file"],
    "critical_locations": ["path/to/file:line"],
    "diff_summary": "关键改动摘要"
  },
  "tool_state": {
    "open_tool_calls": [],
    "archived_outputs": [
      {
        "tool": "run_tests",
        "status": "error",
        "summary": "关键失败",
        "raw_ref": "artifact/log.txt",
        "truncated": false
      }
    ]
  },
  "open_questions": ["未解决问题"],
  "next_steps": ["下一步动作"]
}

这个 JSON 不一定要原样发给模型;它可以是内部 compact checkpoint,再渲染成适合目标 provider 的文本。但字段顺序和语义应保持稳定,方便检查、diff 和缓存。

质量门槛

压缩摘要至少要满足五个门槛:

门槛 要求
可继续 另一个 agent 只读摘要也能知道下一步做什么
可判定 能区分已完成、未完成、已验证、未验证
可定位 保留关键文件、函数、测试名、命令或链接
可复盘 保留原始证据引用、hash、artifact 路径
可过期 标注事实新鲜度,避免旧信息伪装成当前状态

如果摘要无法满足这些要求,压缩虽然降低了 token,但会提高任务失败概率。

与应用层 memory 的分工

server-side compaction 不应替代应用层 memory。更稳健的结构是:

存什么
Provider compaction 压缩旧对话,让请求继续运行
Task checkpoint 当前目标、约束、决策、下一步
Tool audit log 原始工具输入输出、hash、错误、成本
Artifact store 完整日志、截图、长文件片段
Prompt cache layer 稳定前缀、工具定义、项目规则

Provider compaction 负责“上下文还能放得下”;应用层 memory 负责“状态能被可靠恢复”。两者不能互相替代。

失败模式

失败模式 触发原因 修复策略
摘要遗漏硬约束 自由摘要未区分约束和背景 固定 constraints 字段,压缩后检查
压缩后误调用工具 摘要阶段未约束输出形态 明确要求只输出文本 / summary block
工具状态机损坏 压缩未闭合 tool_use / tool_result 压缩前做 pending tool ledger 检查
无法复盘 原始日志只进摘要,没有归档 原文外置,摘要记录 raw_ref 和 hash
prompt cache miss 压缩改写稳定前缀 稳定前缀和动态历史分离
旧事实继续污染 摘要未标注时间和版本 记录 commit、mtime、运行时间和 freshness

验证清单

• 构造包含用户硬约束、工具结果、错误日志和文件修改的长会话,触发 compaction 后检查摘要完整性。
• 开启 pause_after_compaction,验证应用能在继续前注入补充约束。
• 构造未闭合工具调用,确认压缩前能够阻止破坏状态机。
• 构造长测试日志,确认摘要保留退出码、关键错误、相关文件和 raw_ref。
• 让另一个会话只读 compact checkpoint 继续任务,评估恢复质量。
• 比较自由摘要和结构化摘要在约束遗漏率上的差异。

工程结论

server-side compaction 是长会话 agent 的重要能力,但它不是无损存储,也不是上下文治理的全部。pause_after_compaction 应被视为状态迁移检查点:压缩完成后,应用要检查、补充、归档和决定是否继续。只有当 compaction、tool audit、task checkpoint 和 prompt cache 分工清晰时,长会话 agent 才能既省 token,又不丢状态。

参考链接

Anthropic Compaction
Anthropic Cookbook: Automatic context compaction
Anthropic Cookbook: Context engineering, memory, compaction, and tool clearing
AWS Bedrock: Compaction
Anthropic Engineering: Effective context engineering for AI agents
AWS Bedrock: Anthropic Claude tool use
Pydantic AI Anthropic model docs

本文由非线智能API Claude Code 行业专家整理编写