Lowfat: 用于减少 LLM Token 使用量的可插拔 CLI 过滤器

Lowfat 是一个轻量级的 CLI 工具,通过在命令行输出到达 AI agent 之前对其进行过滤,从而降低 AI token 成本。通过从 CLI 响应中去除噪声,它可以防止上下文窗口膨胀并降低 LLM API 调用产生的经济成本。

核心架构与设计理念

Lowfat 被构建为一个可组合的、本地优先的实用程序,遵循 UNIX 风格的管道原则。其设计强调用户控制和可扩展性,而非“魔法”般的自动化过滤。

  • 本地优先 (Local-First): 该工具不包含任何遥测数据,确保数据保留在用户的控制之下。
  • 可组合性 (Composable): 它允许用户通过管道将内置过滤器与自定义定义的过滤器混合使用。
  • 轻量级 (Lightweight): 它以带有极简核心的小型单二进制文件形式分发。
  • 用户所有 (User-Owned): 用户可以通过 lowfat history 跟踪他们最常用的命令,以识别最需要进行定制化的地方。

安装与集成

Lowfat 可以通过 Cargo (cargo install lowfat) 或 Homebrew (brew install zdk/tools/lowfat) 进行安装,GitHub Releases 上也提供了预构建的二进制文件。

Agent 集成

Lowfat 提供了几种透明集成到 AI agent 工作流的方法:

  • Claude Code: 可以作为 PreToolUse 钩子添加到 .claude/settings.json 中,以过滤 Bash 命令。
  • Shell 集成: 在设置了 CLAUDECODE=1CODEX_ENV 的环境中会自动激活,或者可以通过在 shell 配置文件中添加 eval "$(lowfat shell-init zsh)" 来强制启用,使用 LOWFAT_ENABLE=1
  • OpenCode: 通过 lowfat opencode install 进行集成,该命令会将插件写入 ~/.config/opencode/plugins/lowfat.ts 以透明地重写命令。
  • Pi Agent:~/.pi/agent/settings.json 中使用 shellCommandPrefix 字段进行配置。

直接使用

用户可以手动为任何命令添加前缀以过滤其输出,例如 lowfat git statuslowfat docker ps

管理与可扩展性

Lowfat 包含一套用于监控节省情况和扩展功能的工具:

  • 监控 (Monitoring): lowfat stats 提供终身 token 节省量,而 lowfat stats --audit 显示最近的插件执行情况。
  • 配置 (Configuration): lowfat info 显示当前激活的过滤器以及特定命令的流水线 (例如,lowfat info git)。
  • 定制化 (Customization): 用户可以使用 lowfat level ultra 设置过滤的激进程度,或者使用环境变量进行一次性覆盖 (例如,LOWFAT_LEVEL=lite lowfat git log)。
  • 插件开发 (Plugin Development): 可以使用 lowfat plugin new <name> 创建插件脚手架,并使用 lowfat plugin doctor 进行验证。

社区洞察与权衡

虽然 Lowfat 旨在优化 token 使用量,但社区讨论强调了几个关键的权衡和上下文管理的替代策略。

过度过滤的风险

几个用户表达了担忧,认为激进的过滤可能会移除关键信息,例如特定的堆栈跟踪 (stack traces),而这些信息是 LLM 解决问题所必需的。一位用户指出,这类工具有时会“比帮助更有干扰,导致 agent 做出更多的 API 调用以补偿缺失的数据,从而抵消了成本节省。”

后置过滤的策略性替代方案

对于后置执行过滤的批评者认为,根源通常在于 agent 使用了过于宽泛的命令。

"The bigger problem is agents defaulting to the broadest command possible. kubectl get -o yaml when a jsonpath query would give 1/50th the tokens. filtering after the fact works, but you're still paying for the round trip."

替代建议包括:

  • 教导 Agent 更加精准: 鼓励 agent 编写更窄的查询 (例如,使用 jsonpath) 而不是过滤宽泛的输出。
  • 使用指针进行响应截断: 截断输出但告知 LLM 全文内容可在特定的临时文件路径下,从而允许 LLM 仅查询必要的部分。
  • 本地预过滤 (Local Pre-Filtering): 在将输出传递给更大的、更昂贵模型之前,使用廉价的本地 LLM 来识别并提取 CLI 输出中仅有的“有意义”的部分。

基准测试与主张张力

对于高百分比节省量的说法存在怀疑态度。一些用户认为,减少特定命令的输出 token 量并不等同于任务整体 token 使用量的全面减少,因为整体的 prompt 和 agent 的推理过程仍然会消耗大量资源。

Sources