llmtrim について
llmtrim は、LLM API へのリクエストを圧縮してトークンコストを抑えるローカルプロキシです。応答内容は変わりません。Claude Code、Codex、Cursor や独自アプリを使う開発者を想定しており、CLI、MCP サーバー、ライブラリとしても利用できます。
主な機能
- 01ローカルプロキシによる LLM API リクエストの圧縮
- 02ツール出力、ログ、diff、長いコンテキストの削減
- 03setup コマンドによる簡単なインストール
- 04CLI、MCP サーバー、複数言語のライブラリ
- 05Claude Code 向けの /sub によるサブスクリプション経路指定
活用シーン
- 01Claude Code などのコーディングエージェントのトークンコスト削減
- 02ビルドログや JSON をモデルへ送る前の圧縮
- 03独自アプリへのライブラリとしてのリクエスト圧縮の組み込み
MCP 対応
本プロジェクトは MCP サーバーとして提供され、圧縮機能をネイティブツールとして MCP クライアントに公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
3掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| request | any | はい | プロバイダーのリクエスト本文(OpenAI、Anthropic、または Google 形式)。JSON オブジェクト自体、またはその JSON 文字列を受け付けます。本文全体を圧縮し、同じ形式で返します。 |
| provider | string|null | いいえ | プロバイダーのヒント:`openai`、`anthropic`、または `google`。未指定の場合は、リクエストの形式から判定します。 |
詳細
llmtrim
LLM API の通信を圧縮し、支払額を抑えるローカルプロキシです。同じ回答で、請求額を削減します。
入力 −31% · 出力 −74% · 往復コスト −66% · 実環境での A/B テスト 112 件 · 1 回あたり約 5 ms · モデルの読み込み不要
Claude Code をお使いですか? 1 回のインストールで、CLIProxyAPI 経由で利用できる /sub
も導入されます。
プロキシ · CLI · MCP · ライブラリ(Python · Ruby · Swift · Kotlin · JS/WASM)
機能 • インストール • 日々の使い方 • 動作例 • 対応ツール • Claude Code • 数値 • 設定 • CLI とライブラリ
機能
Claude Code、Codex、Cursor、または独自のアプリを使っているとします。リクエストのたびに、システムプロンプト、ツール、履歴、生のコマンド出力など、大量のデータが送信されます。モデルの役に立たない部分も含め、そのすべてのトークンに料金がかかります。
2 つのエラーが含まれる 200 行のビルドログ。呼び出しのたびに再送されるツールスキーマ。よく似た行が何百も並ぶ JSON。こうしたデータにも料金がかかります。
llmtrim はお使いのマシン上でローカルプロキシとして動作し、無駄を削減して、より小さなリクエストを転送します。返答は変わりません。同じツールと回答をそのまま使いながら、支出を抑えられます。
before: your tool ───── full request ─────▶ OpenAI / Anthropic / …
◀──────── reply ──────────
after: your tool ──▶ llmtrim ──smaller──▶ OpenAI / Anthropic / …
(on your machine)
◀──────── reply ────────── (same answer)
圧縮によって請求額が増えたり、リクエストが壊れたりすることはありません。最悪の場合でも、節約額がゼロになるだけです。すべてローカルで処理され、こちらにデータが送られることはありません。動作例 →
Claude Code では、同じインストールで /sub も設定され、別のサブスクリプション経由でセッションをルーティングできます。詳細 →
はじめに
npm install -g @llmtrim/cli@latest && llmtrim setup
# open a new terminal, then keep working
llmtrim status
これで完了です。setup はローカルプロキシを起動し、シェルを設定します。Claude Code が存在する場合は、/sub も有効にします。そのために別途インストールする必要はありません。
| 目的 | 実行するコマンド |
|---|---|
| 初回インストール | llmtrim setup |
| 新しいバージョンに更新 | llmtrim update(その後、npm/brew/cargo の実行後に llmtrim ensure) |
| 問題が発生した場合 | llmtrim ensure · llmtrim doctor --fix · または status で f |
HTTPS_PROXYに対応するツールならどれでも動作します(Claude Code、Codex、Cursor、Aider、お使いの SDK)。GitHub Copilot は動作しません(証明書のピン留めのため)。対応ツールの一覧 →
その他のインストーラー(Homebrew、curl、Scoop、Cargo、Docker)
# Linux / macOS
curl -fsSL https://raw.githubusercontent.com/fkiene/llmtrim/main/install.sh | sh
# Windows (PowerShell)
irm https://raw.githubusercontent.com/fkiene/llmtrim/main/install.ps1 | iex
# Package managers
brew install fkiene/tap/llmtrim
cargo binstall llmtrim
scoop install llmtrim
docker run -d -p 43117:43117 -v llmtrim-state:/data ghcr.io/fkiene/llmtrim
オプションの詳細:INSTALL.md。
デスクトップトレイ(メニューバー/システムトレイ)
節約額を同じように表示するメニューバー/システムトレイのポップオーバーです。Homebrew、Scoop、npm に同梱されています。setup でログイン時に開くよう設定できます。llmtrim tray で開きます。Linux デスクトップでは、対話型の ensure により、最新リリースからトレイバイナリを取得できます(libwebkit2gtk-4.1 と libayatana-appindicator3 が必要です)。
安全ですか?
mitmproxy と同じ手法を、LLM API ホストのみに限定して使用します。setup は3つの項目を変更します。llmtrim uninstall を実行すると、すべて元に戻ります。
~/.llmtrim/内のプライベート CA(名前制約付き。銀行やメールの通信を傍受できません)- シェル環境変数:
HTTPS_PROXYと CA の信頼設定 - ログイン時に起動するデーモンのサービス
API キーは保存されません(お使いのツールの認証情報は転送されます)。プロンプトがディスクに保存されることはなく、匿名化されたトークン数のみが扱われます。復元可能なツールの結果は、デフォルトで最大5時間、制限付きのデーモン RAM に保持され、再起動すると消去されます。脅威モデルの詳細:SECURITY.md。
llmtrim ca
openssl x509 -in ~/.llmtrim/ca.pem -noout -text | grep -A3 "Name Constraints"
日常の使い方
llmtrim status # savings + health (aliases: monitor, gain)
llmtrim update # new release, restart daemon, refresh integrations
llmtrim ensure # match the recommended install state on this machine
| 状況 | コマンド |
|---|---|
| 節約額を確認する | llmtrim status |
npm / brew / cargo のアップグレード後 | llmtrim ensure(または status で f) |
| 診断する | llmtrim doctor · doctor --fix で修復 |
| プロキシを一時停止/再開する | llmtrim stop · llmtrim start |
| 1つのセッションを強制的に llmtrim 経由で実行する | llmtrim wrap claude |
| すべて削除する | llmtrim uninstall |
setup、update、または ensure の実行後は、管理対象の Claude Code /sub がバイナリと同期されます。
時系列データ:llmtrim status --daily · --weekly · --monthly · --json · --csv。
実際の動作
あるエージェントがビルドを実行しました。ツールは58行を返し、そのうち2行がエラーでした。58行すべてが課金対象になるところでした。
4,662文字 → 978(−79%)。エラーはそのまま残ります。繰り返されるINFO行は、テンプレートと値にまとめられます(範囲が規則的な場合は情報を失いません)。
# before (noise + signal)
[2026-06-13T10:02:00Z] INFO compiling module core::worker::task_0 (incremental)
… 28 more near-identical INFO lines …
[2026-06-13T10:02:31Z] ERROR src/worker/pool.rs:214: mismatched types: expected `usize`, found `i64`
… 25 more INFO lines …
[2026-06-13T10:03:01Z] ERROR src/net/conn.rs:88: cannot borrow `buf` as mutable more than once
[2026-06-13T10:03:02Z] INFO build failed, 2 errors
# after (errors verbatim; INFO folded losslessly)
[{}] INFO compiling module core::worker::task_{} (incremental) [×30: (10:02:00Z..10:02:29Z step 1s; 0..29)]
[2026-06-13T10:02:31Z] ERROR src/worker/pool.rs:214: mismatched types: expected `usize`, found `i64`
[{}] INFO compiling module core::net::conn_{} (incremental) [×25: 10:02:32Z..10:02:56Z; 0..24]
[2026-06-13T10:03:01Z] ERROR src/net/conn.rs:88: cannot borrow `buf` as mutable more than once
[2026-06-13T10:03:02Z] INFO build failed, 2 errors
ご自身のリクエストボディでも試してみてください。
echo '{"model":"gpt-4o","messages":[...]}' | llmtrim compress --provider openai
ログの折りたたみは、処理段階の1つです。ほかの段階は、異なる種類の無駄に対処します。
| 無駄 | 処理内容 |
|---|---|
| ビルドログ、差分、grepのダンプ | エラー/変更/一致箇所を残し、それ以外を折りたたみます |
| 長い貼り付けコンテキスト | 質問に関連するチャンクを残します |
| ソースコード | 有用な本体を残し、それ以外をシグネチャに変換します |
| 毎ターンのツールスキーマ | 短縮し、キャッシュプレフィックスを安定させます |
| 巨大なJSON配列 | コンパクトなテーブル(TOON)に変換するか、サンプリングします |
| 冗長なモデルの応答 | 安全な範囲で、より簡潔な出力を求めます |
重要
圧縮によって請求額が増えたり、リクエストが失敗したりすることはありません。各段階ではプロバイダーの実際のトークナイザーを使って再計測し、トークンが削減されない場合は元に戻します。プロバイダーが圧縮後のボディを拒否した場合は、元のボディを再送信します。最悪の場合でも、削減量がゼロになるだけです。
既存のプロンプトキャッシュプレフィックス(cache_control)には手を加えません。初回到着時の復元可能な整形(llmtrim recall r_…)はデフォルトで無効です。ライブゾーンでのツール出力ウィンドウ処理は引き続き実行され、同じツールを再実行すると出力全体を送信します。コマンドの整形をスキップするには(ターミナル末尾の文字列を含む標準出力をそのまま保持するには)、toolout_passthrough = ["*gpt.sh*"]を設定するか、コマンドの前にLLMTRIM_TOOL_OUTPUT=passthroughを付けます。LLMTRIM_KEEP:で始まる行は、残りが切り詰められてもウィンドウ処理後に保持されます。
10種類の圧縮処理
各段階は、削減効果の高い順に実行されます。cache_controlマーカーの下にあるものは書き換えられません。
| 段階 | 処理内容 | 実行タイミング |
|---|---|---|
| tool-output | まず情報を損なわずにテンプレートへ折りたたみ、その後、ログ・差分・grep・ダンプをエラー/変更/一致箇所までウィンドウ処理します。オプトインの初回到着時リコールでは、llmtrim recallを使ってキャッシュ境界で省略された結果を復元できます | ツールの結果 |
| cache discipline | 不変のプレフィックスにマークを付けて安定化します(ツール/スキーマの並べ替え・OpenAI prompt_cache_key)。これによりキャッシュに残る状態を保ちます | ツール |
| lexical retrieval | BM25+ランキングとRM3フィードバック・TextTilingによるトピック分割・予算内で冗長性のない選択を行います。質問は保護されます | 長いコンテキスト |
| skeletonization | tree-sitterで関連する関数本体を残し、それ以外をシグネチャにします(14言語) | コード |
| serialize + hygiene | JSONを最小化し、レコード配列をTOONまたはCSVにエンコードして、Unicodeを正規化します | 常時・情報損失なし |
| json sample | 巨大なレコード配列をダウンサンプリングします。先頭/末尾・外れ値・クエリを考慮した多様なサンプルを残します | 大きなJSON |
| dedup | 重複行と類似行をまとめます(散文のみ) | 常時 |
| output control | 簡潔な指示・Chain-of-Draft・トークン予算・ネイティブJSONスキーマ・過剰思考防止指示(量子化推論)・エージェントループの簡潔さを促す指示を適用します | 自動 |
| tool layer | 静的なツール選択と説明の短縮を行います | ツール |
| multimodal | 画像をプロバイダーの解像度上限まで縮小します | 画像 |
デフォルトのautoでは、各段階を効果がある場合にのみ有効にします。safeでは、情報損失のない処理だけを実行します。設定 →
Claude Code
~/.claude が存在する場合、setup、update、ensure により /sub(およびルーティングされたサブエージェント)が設定されます。個別のインストールコマンドはありません。
| 機能 | 内容 |
|---|---|
/sub | ウィンドウごと:/sub on [optional:codex|kimi|grok] · /sub off · /sub status |
サブスクリプションの再ルーティング(`sub`)(オプトイン。プロバイダーの利用規約に抵触する場合があります)
Claude Code を Anthropic の代わりに CLIProxyAPI 経由で実行するか、現在の経路が失敗した場合のフォールバック経路として使用します。ログインには CLIProxyAPI の TUI を使います。プロバイダーの利用規約に適合するかどうかは、ご自身で判断してください。
llmtrim sub on # install + start CLIProxyAPI, enable redirect
llmtrim sub on grok # write opus/sonnet/haiku/fable → that CLI's models
llmtrim sub auth # CLIProxyAPI TUI — sign in
llmtrim sub models # official + live sidecar models
llmtrim sub map on opus grok-4.6
llmtrim sub chain anthropic,codex
llmtrim sub mode fallback # try hops in order when the current one fails
llmtrim sub status
llmtrim sub off
対話操作:llmtrim status → タブ 4 Sub — Off / Always / Fallback を選択し、e で入力→出力のマップを編集します(入力して CLIProxyAPI のカタログ を検索します。s で保存、a で追加、d で削除)。[ ] でフォールバックの最初のホップを切り替えます。
llmtrim update は、CLIProxyAPI を使用している場合、CLIProxyAPI も更新します。既存のインスタンスを使う場合は、LLMTRIM_CLIPROXY_URL をそのインスタンスに設定すると、管理対象のサイドカーをスキップできます。
親ウィンドウはそのままに、委譲された Claude Code サブエージェントだけをルーティングするには、次のようにします。
llmtrim agents install # also installed/refreshed by setup, update, and ensure
その後、自然な言葉で指示します:Implement it using a Grok subagent、use Terra、または review this with GPT Terra。プロバイダーのみを指定するエージェントは、設定されたマッピングを通じて子のリクエストの Claude ティアを維持します。モデルを明示したエージェントは、そのプロバイダーのモデルに固定されます。リクエスト単位のエージェントは、自身のリクエストに限り、ウィンドウの /sub とグローバルポリシーを上書きします。llmtrim agents uninstall は llmtrim が所有するエージェントファイルのみを削除し、オプトアウトを記録するため、ensure を実行してもファイルは再作成されません。
このウィンドウのみ(ensure でインストールされ、サブエージェントを含み、/clear 後も有効です):
/sub on [optional:cli-or-model] # gemini, codex, claude, grok, kimi, vertex, qwen, copilot, or a model id
/sub off
/sub status
サイドカー:~/.llmtrim/cliproxy/(バイナリ+設定)。認証情報:~/.cli-proxy-api が存在する場合はそこに、それ以外は ~/.llmtrim/cliproxy/auth に保存されます。環境変数:LLMTRIM_SUB、LLMTRIM_SUB_MODE、LLMTRIM_CLIPROXY_URL、LLMTRIM_CLIPROXY_KEY。
Anthropic /login と claude.ai コネクターについて: グローバルの sub が always モードの場合、デフォルトでは llmtrim がダミーの ANTHROPIC_AUTH_TOKEN を ~/.claude/settings.json に書き込みます(claude-code-proxy の ANTHROPIC_AUTH_TOKEN=unused と同じ考え方です)。これにより、Claude Code で有効な Anthropic OAuth セッションが不要になります。MITM はこのダミートークンを取り除き、/v1/messages を CLIProxyAPI に送信します。メッセージ以外の Anthropic プローブにはローカルで応答するため、401 Invalid bearer token が返されることはありません。
Claude Code は API キーによる認証を claude.ai ログインより優先するため、ダミートークンが設定されている間は claude.ai コネクターが無効になります。これは想定された動作です。コネクターを有効にしたままにし(セッションの期限切れ時に Anthropic /login を受け入れるには)、次のようにします。
llmtrim sub anthropic-login keep # connectors OK; Anthropic login required
llmtrim sub anthropic-login skip # default: no Anthropic /login; connectors off
設定変更を反映するには、sub on/sub off/sub mode/sub anthropic-login の実行後に Claude Code を再起動してください。最初のホップが「使用中のもの」となるフォールバックでは、引き続き有効な Anthropic ログインが必要です。
CLI、MCP、またはライブラリとして使用する
同じエンジンを使用するため、プロキシは不要です。モデル呼び出しは追加されず、圧縮はプロセス内で実行されます。
| 言語 | インストール |
|---|---|
| Rust | cargo add llmtrim-core |
| Python | pip install llmtrim |
| Ruby | gem install llmtrim |
| Kotlin | implementation("io.github.fkiene:llmtrim:0.13.7") |
| Swift | SwiftPM fkiene/llmtrim-swift ≥ 0.1.8 |
| JS / TS | @llmtrim/js(WASM) |
CLI パイプ
echo '{"model":"gpt-4o","messages":[...]}' | llmtrim compress --provider openai > out.json
echo '{"model":"gpt-4o","messages":[...]}' | llmtrim send --provider openai
Rust · Python · JS
use llmtrim_core::{compress, ir::ProviderKind};
let out = compress(request_json, Some(ProviderKind::OpenAi))?;
import llmtrim
out = llmtrim.compress(request_json, llmtrim.Provider.OPEN_AI, "aggressive")
import { compress } from "@llmtrim/js";
const out = compress(requestJson, "openai", "aggressive");
バインディングと WASM に関する注意事項:crates/llmtrim-uniffi · crates/llmtrim-wasm。
MCP サーバー
llmtrim mcp install # Claude Code
llmtrim mcp install --print # paste into any client
{
"mcpServers": {
"llmtrim": { "command": "llmtrim", "args": ["mcp"] }
}
}
ツール:llmtrim_compress、llmtrim_compress_text、llmtrim_stats(status と同じ台帳を使用します)。
HTTPS_PROXY と環境変数で指定された CA を使用できるツールなら、どれでも対応します。
| ツール | 対応状況 | 備考 |
|---|---|---|
| Claude Code | ✅ | プロンプトキャッシュの割引はそのまま維持されます |
| Codex CLI | ✅ | |
| Gemini CLI | ✅ | |
| Cursor(IDE)、Cline、Roo、Kilo Code | ✅ | VS Code 拡張機能です。Node ホストプロセスには NODE_EXTRA_CA_CERTS を設定してください |
| Goose、OpenCode、Crush、Mux、Forge、OpenClaw、Pi/OMP | ✅ | 標準のプロバイダーホストを使用する CLI エージェントです |
| Qwen Code、Grok CLI、Kimi Code、Mistral Vibe | ✅ | プロバイダーホストが llm_providers レジストリに含まれているため、初期状態でインターセプトされます |
Aider、その他の HTTPS_PROXY 対応 CLI | ✅ | |
| Hermes、Droid(BYOK モード) | ✅ | 直接プロバイダーキーを設定した場合にのみインターセプトできます。Hermes についてはガイドを参照してください |
| 独自のアプリ/SDK | ✅ | または、CLI/ライブラリを直接呼び出してください |
| GitHub Copilot | ❌ | 証明書ピンニングによりインターセプトできません |
| Warp、Devin | ❌ | プロバイダーへの呼び出しはサーバー側で行われるため、ローカルプロキシでは確認できません |
| Cursor Agent、Kiro | ❌ | 標準のプロバイダーホストではなく、ベンダーのゲートウェイ経由で通信します |
プロキシを使わない場合、すべての MCP クライアントで llmtrim をツールとして呼び出す(llmtrim mcp install)か、CLI/ライブラリを使用できます。
プロバイダーは llm_providers レジストリ(OpenAI、Anthropic、Google、DeepSeek、Mistral、xAI、Moonshot、Zhipu、Qwen、OpenRouter など)から取得され、レジストリに合わせて更新されます。LLM 以外の接続には一切介入しません。
設定
ほとんどのトラフィックではデフォルト設定で問題ありません。auto は各リクエストを調べ、形状に応じて圧縮方式を選びます(ツール → agent、コード → code、長文の Q&A → rag、それ以外 → aggressive)。
LLMTRIM_PRESET=<name> を設定するか、$XDG_CONFIG_HOME/llmtrim/config.toml に preset = "<name>" を指定して上書きできます。
| preset | 使用する場面 |
|---|---|
auto (デフォルト) | llmtrim にリクエストごとの選択を任せます |
safe | 損失のない入力のみを対象にします |
aggressive | 品質ゲートで制御しながら最大限に圧縮します |
高度なプリセット
auto はリクエストの形状に応じてこれらを組み合わせるため、ほとんどのユーザーは個別に設定する必要はありません。トラフィックの特性が分かっていて、形状の検出を省略したい場合は、いずれかを選択してください。
| preset | 用途 |
|---|---|
agent | ツール呼び出しのループ向け:ツールブロックは最初のターンのみ残し、プロンプトキャッシュを有効な状態に保ちます |
code | コーディングのターン向け:コードを骨組み化して縮小し、貼り付けられたログや差分を圧縮します |
rag | 質問を伴う長いコンテキスト向け:文単位で検索します |
cache | 多数の呼び出しで再利用する固定プレフィックス向け |
reasoning | 数学や段階的な処理が必要なワークロード向け |
frugal | エージェントループの節約指示だけを切り分け、クリーンなベンチマークを実施できます |
フラグごとの上書き(上級者向け)
各ステージは設定フラグで個別に調整できます。preset は個々のフラグより優先されます。全項目の一覧は長いため、config.rs のフィールド一覧を確認するか、llmtrim compress --help を実行してください。特に便利な設定項目は次のとおりです。
| field | default | meaning |
|---|---|---|
toolout | agent/aggressive で有効 | ツール出力(ログ/差分/grep/ダンプ)の圧縮 |
retrieve | false | 長いコンテキストを対象とする語彙検索(損失あり) |
skeletonize | false | 関連性のない関数本体を削除し、シグネチャだけを残します |
serialize | true | レコード配列を TOON/CSV 形式でエンコードします |
json_crush | agent/aggressive で有効 | 巨大なレコード配列をサンプリングします |
output_control | false | 簡潔な出力を指示し、上限を設定します |
output_anti_overthink | aggressive/rag/code/agent で有効 | 量子化された推論トラフィックに、回答を確定するよう指示します |
output_frugal_tools | agent で有効 | エージェントループがツール呼び出しのターン数を減らすよう促します(まとめて実行し、繰り返さない) |
cache | false | cache_control のブレークポイント(損失なし) |
dedup | true | 重複行をまとめます(損失なし) |
quality_gate | true | クエリに関連する情報の網羅性が低下しすぎる場合、損失を伴う削減を取り消します |
環境変数:LLMTRIM_PRESET(プリセット)、LLMTRIM_CONFIG(設定ファイルのパス)。
実行時設定(環境変数または設定ファイル)
これらの設定項目は圧縮とは独立しています。それぞれ環境変数を優先し、次に設定ファイルから値を読み込むため、用途に合う方を設定してください。両方が指定されている場合は環境変数が優先されます。
| 環境変数 | 設定キー | 意味 |
|---|---|---|
LLMTRIM_EXTRA_HOSTS | extra_hosts | インターセプトする追加の完全一致LLM APIホスト(環境変数ではカンマ区切り、ファイルでは配列)。例:セルフホストのOpenAI互換エンドポイント |
LLMTRIM_EXCLUDE_PROVIDERS | exclude_providers | 圧縮をスキップするワイヤ形式:openai / anthropic / google(例:anthropic を指定するとClaude Codeには手を加えません)。大まかな指定で、その形式を使用するすべてのホストが対象です |
LLMTRIM_EXCLUDE_HOSTS | exclude_hosts | 圧縮をスキップする完全一致ホスト名(例:openrouter.ai)。正確な指定で、同じ形式の他のホストは圧縮されます |
LLMTRIM_UPSTREAM_PROXY | upstream_proxy | 別のプロキシ経由で外部通信をルーティングします(下記参照) |
LLMTRIM_DB_PATH | db_path | 台帳の保存先 |
LLMTRIM_CAPTURE_DIR | capture_dir | 圧縮前後のQAキャプチャディレクトリ |
LLMTRIM_CAPTURE_MAX_MB | capture_max_mb | キャプチャコーパスのサイズ上限(0 で無効) |
LLMTRIM_FIRST_ARRIVAL_RECALL | first_arrival_recall | 復元可能な初回到着時のツール出力整形(デフォルトは false。true にすると、llmtrim recall でキャッシュ境界の結果を利用できます) |
LLMTRIM_TOOL_OUTPUT | toolout_passthrough | 一致するコマンドのツール出力圧縮をスキップします:passthrough(すべて)またはコマンドのグロブ(*gpt.sh*)。コマンドへの代入または結果の行として指定した場合も認識されます。LLMTRIM_KEEP: 行は常に保持されます |
LLMTRIM_FIRST_ARRIVAL_RECALL_TTL_SECS | first_arrival_recall_ttl_secs | メモリ内の生の結果の保持期間(デフォルトは18,000秒/5時間) |
LLMTRIM_BIND | bind | リッスンするIP(デフォルトはループバック。コンテナでは 0.0.0.0) |
LLMTRIM_BREAKDOWN_WINDOW | breakdown_window | コスト内訳のコンテキストウィンドウを上書きします |
LLMTRIM_RETENTION_DAYS | retention_days | 台帳を保持する日数 |
LLMTRIM_NO_UPDATE_CHECK | no_update_check | バックグラウンドでのアップデート確認を無効にします |
extra_hosts には完全一致するホスト名を指定してください(llm.acme.com のように指定し、acme.com のようなドメイン単体は指定できません)。各ホスト名の追加によって、名前制約付きMITM CAの対象範囲が広がります。CAは次回起動時に、それらを対象に含むよう自動的に再生成されます。
Claude Codeのオプション(サブスクリプションのルート変更)については、Claude Codeを参照してください。
上流プロキシ(企業ネットワークからの外部通信、またはローカルツールの連携)
export LLMTRIM_UPSTREAM_PROXY=http://host:port
# or with auth: http://user:pass@host:port (redacted in logs)
外部への呼び出しには、検証付きTLSによる CONNECT を使用します。上流プロキシから見えるのは暗号化されたストリームのみです。
llmtrim自身のリッスンアドレスへのループバックは拒否されます。この変数は、対話型シェルだけでなく、デーモンの起動環境(launchd / systemd)に設定してください。プロファイルのシークレットは平文で保存されます。
別のポートで動作する関連ツール(例:headroom)は問題なく使用できます。
各ケースを元のままと圧縮後の2回送信し、両方の回答を実際の料金で採点・課金します。コストと品質を推定ではなく同時に測定した、112ケースの結果です:
| 元のまま | 圧縮後 | 削減率 | |
|---|---|---|---|
| 入力トークン | 71,031 | 49,062 | −31% |
| 出力トークン | 25,843 | 6,628 | −74% |
| 往復コスト | $0.0365 | $0.0126 | −66% |
| 回答品質 | 78.9% | 82.2% | 測定された劣化なし |
トークン削減率はモデルに依存しません(入力 −31%、出力 −74%)。金額の削減率はモデルの出力価格と入力価格の比率に応じて変わります。今回の −66% は、GPT-4o の料金では −57%、Claude Sonnet の料金では −59% と見込まれます。プロキシは新しいコンテンツ部分のみを圧縮し、キャッシュ制御されたプレフィックスは書き換えないため、プロンプトキャッシュの割引は維持されます。
標準ベンチマークで精度を維持
標準的な学術ベンチマークでも、保守的な形状一致プリセット(qwen3-next-80b、対応のある95%信頼区間)を使って同じ A/B テストを実施しました。品質は元のリクエストと圧縮後のリクエストのスコアです。GSM8K は上記のフロンティアから取得(n=12)、残りの3つは読者が比較対象とする名称付きベンチマークです(各 n=20):
| ベンチマーク | タスク | 採点方法 | 入力削減率 | 品質(元 → 圧縮) | 維持率 |
|---|---|---|---|---|---|
| GSM8K | 小学校レベルの算数 | 数値の完全一致 | −47%¹ | 100% → 92% | −8pp |
| TruthfulQA (MC1) | 事実に関する正確性 | 選択肢の完全一致 | 0% | 75% → 75% | +0.0±0.0pp |
| SQuAD v2 | 抽出型 QA | token-F1 / EM | 11% | 84% → 84% | −0.0±15.2pp |
| BFCL (live_multiple) | 関数呼び出し | ツール呼び出しの一致 | 33% | 95% → 95% | +0.0±15.2pp |
品質を落とさずに圧縮できたのは3行で、低下が見られたのは GSM8K です:
- BFCL では、クエリに不要なツールスキーマを削除します(呼び出しごとに候補が2~37個)。
- SQuAD v2 では、回答不能な質問にも引き続き正しく回答します。
- TruthfulQA では、事実の正確性を完全に維持します。約75トークンのプロンプトはほとんどが回答テキストのため、安全なプリセットでは削減できるものが見つかりません。
- GSM8K では、精度を −8pp 犠牲にしてコストを −71% 削減します。推論用プリセットを有効にする前に、ワークロードごとに測定してください。¹入力がマイナスになっているのは、このプリセットが Chain-of-Draft 指示を追加し、その効果が出力側に現れるためです(上のフロンティア表を参照)。
エビデンスと再現用の1行コマンド(名称付きベンチマークのスナップショット):
make -C crates/llmtrim-cli/bench data
(cd crates/llmtrim-cli && cargo run -q --features live -- bench quality \
--corpus bench/data/squad2.jsonl --preset rag \
--model qwen/qwen3-next-80b-a3b-instruct --route "" --n 20)
手法、コーパスごとのフロンティア、信頼区間については、crates/llmtrim-cli/bench/README.mdを参照してください。再現するには:
make -C crates/llmtrim-cli/bench data # pull real corpora (gsm8k, humaneval, dolly, hotpotqa, …)
(cd crates/llmtrim-cli && cargo run -q --features live -- bench suite) # live A/B across all corpora (needs OPENROUTER_API_KEY)
(cd crates/llmtrim-cli/bench/scripts && PYTHONPATH=. python3 -m benchkit.tools.chart) # regenerate the chart + table
比較
各ツールはリクエストの一部分を圧縮します。llmtrim は入力と出力を圧縮し、プロンプトキャッシュを安定させるためにキャッシュ済みプレフィックスはそのまま維持します。また、削除したトークン数ではなく、圧縮後も回答が保たれるかどうかで評価します。以下の両方の軸では o200k_base エンコーダーを使用しており、このリポジトリから再現できます。
| llmtrim | Headroom | RTK | caveman | |
|---|---|---|---|---|
| 圧縮対象 | 入力・出力 | 入力 | ツール/CLI 出力 | モデル出力 |
| 変更不要な変換をスキップ | ✅ | ❌ | ❌ | 該当なし |
| 単一の静的バイナリ | ✅ | Python + モデル | ✅ | ✅ |
入力
ライブ A/B テストで測定した回答品質と並べた、入力の削減率(決定論的)です。品質は、各ツールの比較設定における llmtrim からの低下を示します(✅ 維持。統計的に同等、❌ 有意に低下)。そのため、削減率が大きくても❌が付いている場合、そのツールは回答の質を犠牲にしてトークンを節約しています。
| ツール | 削減率 | llmtrim に対する品質 | オーバーヘッド |
|---|---|---|---|
llmtrim auto | 25% | ✅ 基準 | 約5 ms |
llmtrim aggressive | 28% | ✅ 基準 | 約5 ms |
| Headroom(ML 有効) | 24% | ✅ 同等 | 約0.9 s |
| leanctx / LLMLingua-2 | 52-81% | ❌ 18%低下 | 約6 s |
| entroly | 80-89% | ❌ 42%低下 | <1 ms |
オーバーヘッドは、呼び出しごとの圧縮時間の中央値です(Python の実時間で、同条件の CPU 比較ではありません)。ここでは Headroom と leanctx は CPU 上で ML を実行しており(GPU ではより高速です)、これに加えてモデルの初回読み込みに約3 s と約4 s かかります。llmtrim は Rust 製、entroly は字句処理のため、どちらもこの処理はありません。
autoは品質ゲート付きのデフォルトです。aggressiveは、ゲートが維持される範囲で情報損失を伴う削減を許可します。- Headroom は ML を無効にすると削減率が0%になります(ルーターは文章に対して何もしません)。
- leanctx と entroly は品質ゲートのない情報損失を伴う方式です。entroly には削減率を抑えるモードがありません。
削減率を揃えた条件(24-25%、n=30、有意差なし)では Headroom の品質は同等ですが、回答が長くなり、モデルの出力トークン上限に達して llmtrim の2回に対し12回切り詰められます。これがコスト増につながる出力の肥大化の原因です。leanctx(26%で測定)と entroly(最も穏やかな設定の69%)は llmtrim より有意に低いスコアとなり(n=20)、それぞれの代表的な削減率ではさらに低下します(vs-leanctx、vs-entroly)。
出力
9件のコーディング用プロンプトで有料のライブ呼び出しを行い、より簡潔な回答を求めた場合の出力削減率です。
| 出力削減率 | オーバーヘッド / リクエスト | |
|---|---|---|
| caveman | 80% | 949 tokens |
llmtrim output_terse | 69% | 19 tokens |
コストは、caveman がリクエストのたびに再送する949トークンのシステムプロンプトです(右列)。llmtrim のコストは19トークンで、ほぼ同じ削減率を実現します。どちらもここでは総合的に節約できるため、caveman の削減幅がより大きいという利点を生かせるのは、削除する出力が、追加される949トークンを上回る価値を持つ場合だけです(vs-caveman の成果物)。
ツールは組み合わせて使えます。まず RTK が CLI 出力を縮小し、その上から llmtrim がツールスキーマを圧縮します。詳細な比較については、crates/llmtrim-cli/bench/README.mdをご覧ください。
既知の制限事項
節約効果を実証する同じ A/B テストで、次の制限事項も確認されています。
- Anthropic / Gemini のトークン数は概算です。 正確なトークナイザーが公開されていないため、BPE による近似値を使用し、
statusでその旨を示します。OpenAI では正確に計測されます。 - 出力の節約量はライブでは測定されません。 近似処理で圧縮するのは入力です。出力の節約量を測るには A/B の反実仮想が必要で、これはオフラインベンチマークでのみ実行されます。
statusの「saved」は入力側の値です。 - デフォルトは品質ゲート付きであり、情報を完全には保持しません。 情報損失を伴う段階が実行されるのは、評価で品質が維持されると確認された場合のみです。バイト単位で忠実な往復変換が必要な場合は、
safeプリセットを使用してください。 - 「情報損失なし」とは入力側のことであり、応答の復元を意味しません。 情報損失のない段階では、モデルが読み取る情報を保持します(ログの連続部分をまとめる、配列を TOON 形式でエンコードする、モデルがプロンプト内で解釈する略語一覧を付けるなど)。また、トークンゲートにより、効果のない入力削減は元に戻されます。エンジンがモデルの応答を元の形式に変換し直すことはありません。
謝辞
各コンプレッサーは、公開された研究を忠実に実装したものです。アイデアは研究者のものであり、エンジニアリングとトークンゲートは私たちのものです。
各ステージの論文とクレート
検索とコンテキスト: BM25 (Robertson & Zaragoza 2009、bm25);BM25+ (Lv & Zhai、CIKM 2011);RM3 (Lavrenko & Croft、SIGIR 2001);TextTiling (Hearst、CL 1997);TextRank (Mihalcea & Tarau、EMNLP 2004);MMR (Carbonell & Goldstein、SIGIR 1998);劣モジュラ目的関数 (Lin & Bilmes、ACL 2011);修正貪欲法によるナップサック最大化 (Tang et al.、SIGMETRICS 2021、arXiv:2008.05391);DPP による多様なサンプリング (Chen et al.、NeurIPS 2018);Lost in the Middle (arXiv:2307.03172);DSLR (arXiv:2407.03627)。
コード: RepoCoder (arXiv:2303.12570);階層的コンテキストプルーニング (arXiv:2406.18294);可読性の隠れたコスト (arXiv:2508.13666);最小化のトークン計算 (arXiv:2606.01326)。
ツール出力: Drain (He et al.、ICWS 2017);Brain (Yu et al.、IEEE TSC 2023);LogLSHD (arXiv:2504.02172)。
重複排除と略語: SimHash (Charikar、STOC 2002、gaoya);CompactPrompt (arXiv:2510.18043);最長反復部分文字列 (arXiv:1304.0528) + Re-Pair (Larsson & Moffat、DCC 1999)。
出力制御: Chain-of-Draft (arXiv:2502.18600);TALE (arXiv:2412.18547)。
シリアライズ: TOON (Token-Oriented Object Notation)、Johann Schopplich。
tiktoken-rs、tree-sitter、image、whatlang、hudsucker、rusqlite などを基盤としています。
問題を見つけましたか?
llmtrim doctor # diagnose
llmtrim doctor --fix # diagnose + apply repairs
llmtrim ensure # same repair path
失敗した各チェックに、修正方法が示されます。リクエストが改変されてしまった場合は、LLMTRIM_CAPTURE_DIR を設定し、変更前と変更後のペアを添えて
issue を作成してください。
llmtrim によって費用を節約できた場合は、⭐ を付けると、ほかの人にも見つけてもらいやすくなります。
スター履歴
MPL-2.0に基づきライセンスされています。商用利用を含め、llmtrimを自由にスタックでご利用いただけます。ご自身のコードを公開する義務はありません。ファイル単位のコピーレフトは、llmtrim自体のソースファイルに加えた変更にのみ適用されます。DCOによるサインオフを通じてコントリビューションできます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。