Docs

工作原理

sift 按内容类型分发到专用压缩器(detectContentType 自动判断)。无损优先:规则 JSON 数组先尝试 CSV-schema(至少节省 15%),其他 JSON minify 与日志 Drain 模板化按原门槛短路;不够再走有损路径,原文入 stash store。整个流程守住三条安全底线:

  1. 只在消息内压缩,绝不跨消息丢弃内容 —— 每条消息独立处理,tool_use / tool_result 配对受保护。
  2. 冻结前缀字节不动 —— cache_control 标记以下的消息是 prompt cache 锚点,压缩绝不触碰。
  3. 有损压缩必须可恢复 —— 原文进 stash store,输出留 «stash:HASH» 标记,端到端无损。

压缩管线

请求 body
  │ detectRequestFormat ──→ anthropic / chat_completions / responses
  │                        (floor = cache_control 冻结下界)
  ▼
逐消息 text block
  │ detectContentType ──→ json_array / build_output / search_results /
  │                      git_diff / source_code / plain_text / html /
  │                      structured_config / tabular
  │ mixed_content:同一 block 内分段路由;嵌入 JSON span 递归处理
  ▼
无损重排(JSON CSV-schema ≥15% / minify / LogTemplate-Drain)─→ 短路返回
  ▼
有损压缩(OffloadTransform)── 原文写 stash store,输出留 «stash:HASH»
  ▼
token 估算校验 ── 不达预期则回退原 block(blocksReverted)

压缩器类型

内容类型压缩器策略无损?
json_arrayJsonReformatter + SmartCrusher同构记录转 CSV-schema,异构记录可分桶;任意文档深度的数组/字符串化 JSON 递归紧凑化,且 >256 B opaque 值可独立 stash优先无损,否则有损可恢复
build_outputLogCompressor错误 / 堆栈 / 摘要行保留,重复 warning 模板折叠有损(可恢复)
search_resultsSearchCompressorgrep / ripgrep 输出抽稀,保留匹配上下文有损(可恢复)
git_diffDiffNoise + DiffCompressorlockfile / 纯空白变化摘要,unified diff hunk 采样,改动行保留有损(可恢复)
plain_textTextCrusher按 query 相关性、位置、显著信息与近重复抑制抽取代表句段有损(可恢复)
source_codeCodeCompressortree-sitter AST,8 语言;保留签名和结构,按引用、fan-out、公开约定及 query 相关性分配最多 5 行完整语句;Python docstring 默认保留首行有损(可恢复)
htmlHtmlExtractor正文转 Markdown,移除脚本/样式/导航/侧栏/广告/页脚有损(可恢复)
structured_configConfigCompressorYAML/TOML/INI 保留全部键值与顺序,安全卸载整行注释/空行;保护 block scalar 与多行字符串有损(可恢复)
tabularTabularCompressor严格解析 CSV/TSV/Markdown 表格列,桥接 CSV-schema;采用时保留全部记录信息无损,原表可从 stash 恢复

共用机制

走一个真实例子

假设一段工具输出(tool_result)里有 2000 行构建日志,sift 会这样处理它:

输入(节选):
  $ npm run build
  [vite] building for production...
  ✓ 1420 modules transformed.
  warning: chunk size exceeds 500 kB (vendor.js)
  warning: chunk size exceeds 500 kB (utils.js)
  warning: chunk size exceeds 500 kB (ui.js)   ← 同类 warning 重复 47 次
  ERROR in src/api/client.ts:52
  TS2339: Property 'retry' does not exist on type 'Client'.

处理过程:
  1. detectContentType → build_output → 路由到 LogCompressor
  2. 先试无损(Drain 模板化)→ 仍 >80%,进入有损
  3. 优先保留错误 / 堆栈行;抽稀同类 warning
  4. 原文写入 stash 文件,每段省略位置附行坐标,末尾留恢复标记

输出(节选):
  $ npm run build
  ✓ 1420 modules transformed.
  warning: chunk size exceeds 500 kB (vendor.js)
  [... 46 lines omitted from file "/home/agent/.sift/stash/HASH", starting at line 5]
  ERROR in src/api/client.ts:52
  TS2339: Property 'retry' does not exist on type 'Client'.

提示中的行号始终对应 stash 文件。需要局部原文时,Agent 可直接分片读文件;需要全文时,仍可使用末尾的 stash 标记恢复。有损抽稀可能省略低相关内容,不会把这种省略冒充无损重排。

设计取舍

首页演示里可以逐类型查看真实输入与压缩输出的左右对比。