bale:在工具输出进入模型上下文前做结构化压缩

前言

在 DSH(DeepSeek Harness)里跑 Agent 时,bash、pwsh、web_fetch、run_code 等工具很容易吐出几十万字符的日志或搜索结果。这些内容会占满上下文窗口,而真正需要推理的错误行、diff 改动反而没地方展开。常见做法要么整段丢弃(丢信息),要么原样留给模型(窗口爆炸)。bale 是维护者 AQYLPZ 发布的 DSH 工作流类插件:在模型看到输出之前,把大块文本压成带类型的摘要,同时按内容哈希把原文存到本地;需要细节时通过 headroom_retrieve(hash) 取回完整字节。本文介绍其定位、架构、安装与配置,事实均出自 GitHub README 与仓库内 package.json。

这是什么

bale 的 package.json 描述为:在工具输出进入模型上下文之前进行压缩,并支持基于哈希的原文检索。它挂在 DSH 的 tools/post-execute 钩子上,针对白名单工具的大输出调用本地 sidecar(http://127.0.0.1:8797/compress),用压缩结果替换模型所见内容;压缩失败时采用 fail-open,原样放行,不让压缩拖垮工具调用。

社区目录页:https://www.skillhub.cn/plugins/AQYLPZ/bale。SkillHub 为社区插件目录,与 DeepSeek / 幻方无官方从属关系。README 记载当前包版本为 0.1.5,许可证 MIT,GitHub 星标以目录页为准(撰写时为 0)。

核心功能

压缩策略与 kind

sidecar 会识别内容类型并选择策略,返回字段包含 kind、hash、text、ratio。README 列出的类型与实测比例如下:

kind 适用内容 压缩方式(摘要) README 实测 ratio
log 带时间戳的构建/测试/容器日志 按行折叠,ERROR/WARN 优先保留 0.2% – 30%
json JSON 数组/对象 字典编码与去重 12% – 46%
diff git diff / patch 折叠未改动上下文,保留 -/+ 约 18%
search grep / ripgrep 按文件聚合,保留首尾命中 约 6%
generic 文件列表、堆栈、测试报告等 头 80 行 + 关键行 + 尾 40 行 30% – 41%

README 给出的样例:24,611 字符构建日志 → 7,531 字符(30.6%,ERROR/WARN 零丢失);28,544 字符 grep → 1,750 字符(6.1%);13,763 字符 git diff → 2,538 字符(18.4%,-/+ 改动行完整保留)。设计原则写的是:宁可少压,也不造假。

基于 Kompress ONNX 的 text(语义压缩)在 README 中标记为已停用(收益低、易超时);sidecar 默认通过 HEADROOM_DISABLED_KINDS=text 短路。

双进程架构

组件 职责 实现
DSH 插件(Node.js ESM) 钩子、阈值与白名单判定、替换输出、注册 headroom_retrieve lib/index.js 等
sidecar(Python 3.10–3.14) 压缩算法、原文存储、HTTP 服务 sidecar/sidecar.py,默认 127.0.0.1:8797

原文按字节写入 store/<sha256[:16]>.bin。压缩算法依赖 Python 库 headroom-ai(仓库内为精简重打包 wheel)。

默认介入的工具

配置默认白名单为:ops_bash、bash、pwsh、web_fetch、run_code。另有 protectTools(如 read、edit、write 等)强制不压缩。低于 minChars(默认 8192)或超过 maxChars(默认 32MB)时不压缩。

安装与启用

安装前请自行阅读仓库源码与 MIT 许可证。bale 以当前 DSH 进程权限运行 sidecar 与写本地 store,路径与 Python 解释器需按你的 profile 核对。

前置要求

  • DSH 桌面版或 CLI
  • Node.js ≥ 20
  • Python 3.10–3.14(README 实测 3.12.14 与 3.14.7)
  • 预置 wheel 仅 Windows x64;macOS / Linux 需按 tools/repack/README.md 重打包

本项目未发布到 npm(npm 上另有同名包);README 要求用本地 npm pack 生成的 tgz 安装。

步骤概览

1. 获取源码并准备 Python 环境

README 的快速开始以克隆仓库为例(路径 https://github.com/AQYLPZ/bale.git)。在仓库根目录创建 venv 并安装依赖:

python -m venv venv

# Windows
venv/Scripts/python.exe -m pip install -r requirements.txt
# macOS / Linux
venv/bin/python -m pip install -r requirements.txt

也可使用 --find-links ./vendor/wheels 安装 headroom-ai[code]==0.42.0.post1。README 明确:不要安装 [ml] 额外组。插件装入 profile 后,也可对 node_modules/bale/requirements.txt 执行同等安装(0.1.4+ tgz 已含 vendor/wheels/)。

2. 打包插件

在仓库根目录执行:

npm pack

生成如 bale-0.1.5.tgz(README 示例)。将 tgz 放入 profile 的 vendor/,在 profile 的 package.json 中添加:

{
  "dependencies": {
    "bale": "file:./vendor/bale-0.1.5.tgz"
  },
  "dsh": {
    "profile": {
      "bundles": [ "bale" ]
    }
  }
}

然后执行 pnpm install。

3. 配置绝对路径

在 profile 的 cordis.patch.yml 中增加(<PROFILE> 换为实际绝对路径):

- id: bale
  name: bale
  config:
    enabled: true
    sidecarPython: '<PROFILE>/.headroom/venv/Scripts/pythonw.exe'
    sidecarScript: '<PROFILE>/node_modules/bale/sidecar/sidecar.py'
    storeDir: '<PROFILE>/.headroom/store'
    wsDir: '<PROFILE>/.headroom/headroom_ws'
    logFile: '<PROFILE>/.headroom/logs/headroom-auto.log'

README 强调:必须写绝对路径;默认从 lib/ 推导 venv 在真实目录下可能算错,sidecar 起不来时会静默 fail-open,表面正常却无压缩。

4. 重启 DSH 并探活

curl http://127.0.0.1:8797/health

期望形如 {"ok": true, "version": "0.1.5", ...};compressors_loaded 初始为空属正常(懒加载)。

典型用法

自动压缩

满足白名单工具、长度阈值且 sidecar 可用时,大输出会在进入模型前被替换为「压缩头 + 摘要」,并附带可用于检索的 hash。无需额外调用即可节省上下文。

按哈希取回原文

当模型或工作流需要完整输出时,使用插件注册的 headroom_retrieve(hash),按 README 说明从本地 store 逐字节取回与压缩前一致的内容。

常用配置项(节选)

键 默认 说明
enabled true 总开关
minChars 8192 低于此长度不压缩
timeoutMs 15000 压缩超时
replaceMode replace replace 替换;preview 仅标记
sidecarUrl http://127.0.0.1:8797 sidecar 地址
kinds log,json,code,diff,search,generic 允许的压缩类型

完整表见 README「配置参考」。

适用场景与注意

适合谁:长期在 DSH 里用 Shell、抓取网页、跑代码块,且经常遇到「日志/tests/build 输出撑爆上下文」的 Agent 开发者;希望保留 ERROR/WARN、diff 改动与可检索原文,而不是粗暴截断。

务必注意:

  • sidecar 异常、超时或任一步失败时 fail-open,输出不压缩;排障可看 README「排障」与健康检查。
  • Windows 以外需自行重打包 wheel;网络需能拉取 PyPI 传递依赖。
  • 卸载与 store 瘦身见 README「卸载」;0.1.5+ 对 store 口径有修复说明。

结尾

bale 把「大工具输出」从上下文中摘出来,换成结构化摘要 + 本地哈希存储,在 DSH 工作流里给模型留出 headroom,又不丢掉按 hash 还原原文的能力。进一步了解可看 SkillHub 目录页 与 GitHub 仓库。

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

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

Xiaoye