mcpField
L
llmtrim

llmtrim

ローカル
github.comAI・エージェント2584 週間前に更新

llmtrim について

llmtrim は、LLM API へのリクエストを圧縮してトークンコストを抑えるローカルプロキシです。応答内容は変わりません。Claude Code、Codex、Cursor や独自アプリを使う開発者を想定しており、CLI、MCP サーバー、ライブラリとしても利用できます。

主な機能

  1. 01ローカルプロキシによる LLM API リクエストの圧縮
  2. 02ツール出力、ログ、diff、長いコンテキストの削減
  3. 03setup コマンドによる簡単なインストール
  4. 04CLI、MCP サーバー、複数言語のライブラリ
  5. 05Claude Code 向けの /sub によるサブスクリプション経路指定

活用シーン

  1. 01Claude Code などのコーディングエージェントのトークンコスト削減
  2. 02ビルドログや JSON をモデルへ送る前の圧縮
  3. 03独自アプリへのライブラリとしてのリクエスト圧縮の組み込み

MCP 対応

本プロジェクトは MCP サーバーとして提供され、圧縮機能をネイティブツールとして MCP クライアントに公開します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"fkiene-llmtrim": {
"command": "npx",
"args": [
"-y",
"@llmtrim/cli"
]
}
}
}
起動コマンドnpx -y @llmtrim/cli

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@llmtrim/cli0.13.4

ツール

3

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
requestanyはいプロバイダーのリクエスト本文(OpenAI、Anthropic、または Google 形式)。JSON オブジェクト自体、またはその JSON 文字列を受け付けます。本文全体を圧縮し、同じ形式で返します。
providerstring|nullいいえプロバイダーのヒント:`openai`、`anthropic`、または `google`。未指定の場合は、リクエストの形式から判定します。

詳細

llmtrim

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)

llmtrim のステータス:概要の節約額ダッシュボード、セッション、詳細、Sub ルーティングタブ(CLIProxyAPI のプリセット、フォールバック経路、モデルマップ)

CI ライセンス:MPL 2.0 crates.io npm npm のダウンロード数 Rust 1.88+

機能 • インストール • 日々の使い方 • 動作例 • 対応ツール • 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 が必要です)。

llmtrim トレイのポップオーバー

安全ですか?

mitmproxy と同じ手法を、LLM API ホストのみに限定して使用します。setup は3つの項目を変更します。llmtrim uninstall を実行すると、すべて元に戻ります。

  1. ~/.llmtrim/ 内のプライベート CA(名前制約付き。銀行やメールの通信を傍受できません)
  2. シェル環境変数:HTTPS_PROXY と CA の信頼設定
  3. ログイン時に起動するデーモンのサービス

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 retrievalBM25+ランキングとRM3フィードバック・TextTilingによるトピック分割・予算内で冗長性のない選択を行います。質問は保護されます長いコンテキスト
skeletonizationtree-sitterで関連する関数本体を残し、それ以外をシグネチャにします(14言語)コード
serialize + hygieneJSONを最小化し、レコード配列を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、またはライブラリとして使用する

同じエンジンを使用するため、プロキシは不要です。モデル呼び出しは追加されず、圧縮はプロセス内で実行されます。

言語インストール
Rustcargo add llmtrim-core
Pythonpip install llmtrim
Rubygem install llmtrim
Kotlinimplementation("io.github.fkiene:llmtrim:0.13.7")
SwiftSwiftPM 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 を実行してください。特に便利な設定項目は次のとおりです。

fielddefaultmeaning
tooloutagent/aggressive で有効ツール出力(ログ/差分/grep/ダンプ)の圧縮
retrievefalse長いコンテキストを対象とする語彙検索(損失あり)
skeletonizefalse関連性のない関数本体を削除し、シグネチャだけを残します
serializetrueレコード配列を TOON/CSV 形式でエンコードします
json_crushagent/aggressive で有効巨大なレコード配列をサンプリングします
output_controlfalse簡潔な出力を指示し、上限を設定します
output_anti_overthinkaggressive/rag/code/agent で有効量子化された推論トラフィックに、回答を確定するよう指示します
output_frugal_toolsagent で有効エージェントループがツール呼び出しのターン数を減らすよう促します(まとめて実行し、繰り返さない)
cachefalsecache_control のブレークポイント(損失なし)
deduptrue重複行をまとめます(損失なし)
quality_gatetrueクエリに関連する情報の網羅性が低下しすぎる場合、損失を伴う削減を取り消します

環境変数:LLMTRIM_PRESET(プリセット)、LLMTRIM_CONFIG(設定ファイルのパス)。

実行時設定(環境変数または設定ファイル)

これらの設定項目は圧縮とは独立しています。それぞれ環境変数を優先し、次に設定ファイルから値を読み込むため、用途に合う方を設定してください。両方が指定されている場合は環境変数が優先されます。

環境変数設定キー意味
LLMTRIM_EXTRA_HOSTSextra_hostsインターセプトする追加の完全一致LLM APIホスト(環境変数ではカンマ区切り、ファイルでは配列)。例:セルフホストのOpenAI互換エンドポイント
LLMTRIM_EXCLUDE_PROVIDERSexclude_providers圧縮をスキップするワイヤ形式:openai / anthropic / google(例:anthropic を指定するとClaude Codeには手を加えません)。大まかな指定で、その形式を使用するすべてのホストが対象です
LLMTRIM_EXCLUDE_HOSTSexclude_hosts圧縮をスキップする完全一致ホスト名(例:openrouter.ai)。正確な指定で、同じ形式の他のホストは圧縮されます
LLMTRIM_UPSTREAM_PROXYupstream_proxy別のプロキシ経由で外部通信をルーティングします(下記参照)
LLMTRIM_DB_PATHdb_path台帳の保存先
LLMTRIM_CAPTURE_DIRcapture_dir圧縮前後のQAキャプチャディレクトリ
LLMTRIM_CAPTURE_MAX_MBcapture_max_mbキャプチャコーパスのサイズ上限(0 で無効)
LLMTRIM_FIRST_ARRIVAL_RECALLfirst_arrival_recall復元可能な初回到着時のツール出力整形(デフォルトは false。true にすると、llmtrim recall でキャッシュ境界の結果を利用できます)
LLMTRIM_TOOL_OUTPUTtoolout_passthrough一致するコマンドのツール出力圧縮をスキップします:passthrough(すべて)またはコマンドのグロブ(*gpt.sh*)。コマンドへの代入または結果の行として指定した場合も認識されます。LLMTRIM_KEEP: 行は常に保持されます
LLMTRIM_FIRST_ARRIVAL_RECALL_TTL_SECSfirst_arrival_recall_ttl_secsメモリ内の生の結果の保持期間(デフォルトは18,000秒/5時間)
LLMTRIM_BINDbindリッスンするIP(デフォルトはループバック。コンテナでは 0.0.0.0)
LLMTRIM_BREAKDOWN_WINDOWbreakdown_windowコスト内訳のコンテキストウィンドウを上書きします
LLMTRIM_RETENTION_DAYSretention_days台帳を保持する日数
LLMTRIM_NO_UPDATE_CHECKno_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ケースの結果です:

llmtrim は往復料金を両端で削減します:元の $0.0365 に対して圧縮後は $0.0126、コストを −66% 削減。実際の A/B テスト112ケースの結果

元のまま圧縮後削減率
入力トークン71,03149,062−31%
出力トークン25,8436,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抽出型 QAtoken-F1 / EM11%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 エンコーダーを使用しており、このリポジトリから再現できます。

llmtrimHeadroomRTKcaveman
圧縮対象入力・出力入力ツール/CLI 出力モデル出力
変更不要な変換をスキップ✅❌❌該当なし
単一の静的バイナリ✅Python + モデル✅✅
入力

ライブ A/B テストで測定した回答品質と並べた、入力の削減率(決定論的)です。品質は、各ツールの比較設定における llmtrim からの低下を示します(✅ 維持。統計的に同等、❌ 有意に低下)。そのため、削減率が大きくても❌が付いている場合、そのツールは回答の質を犠牲にしてトークンを節約しています。

ツール削減率llmtrim に対する品質オーバーヘッド
llmtrim auto25%✅ 基準約5 ms
llmtrim aggressive28%✅ 基準約5 ms
Headroom(ML 有効)24%✅ 同等約0.9 s
leanctx / LLMLingua-252-81%❌ 18%低下約6 s
entroly80-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件のコーディング用プロンプトで有料のライブ呼び出しを行い、より簡潔な回答を求めた場合の出力削減率です。

出力削減率オーバーヘッド / リクエスト
caveman80%949 tokens
llmtrim output_terse69%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によるサインオフを通じてコントリビューションできます。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。