LLM のための逆 T9。 AI プロンプトとエージェントのための、無料・オープンソースの CLI プロキシ型プロンプト圧縮ツール。
English · Español · Français · Deutsch · 日本語 · Українська
$ exprompt 'Actually I think you should really check if the API returns correct JSON'
→ chk if the API rtrns crct JSON
███████████░░░░░░░░░ 56% saved · 31 chars · 2 passes · <1ms
✓ copied to clipboard
結果はクリップボードに入っているので、そのまま ChatGPT、Claude、その他どこにでも貼り付けられます。
モデルに送る前の AI プロンプトを 25〜50% 短くする小さな CLI ツールです。フィラー(間投詞・冗長な言い回し)を取り除き、よく使われる単語を短縮形に置き換え、技術用語(API、JSON、camelCase、func()、数値、ファイル名)は絶対に変えないように保護します。
| 完全ローカル | モデルは動かさず、ネットワーク通信もせず、データはマシンの外に出ません。テキスト入力、テキスト出力。 |
| 決定論的 | 辞書ベース。同じ入力なら必ず同じ出力。 |
| 組み合わせ可能 | 実行ごとにフィルタを切り替えたり、exprompt config set で設定を保存できます。 |
| 小さい | 単一の静的 Go バイナリ。現実的なプロンプトなら 1 ms 未満で処理します。 |
| 開かれている | MIT ライセンス。すべての変換は読める JSON ファイルで、フォークや拡張が自由です。 |
目的としないこと: 意味の書き換え(LLM による書き換えはしません)、翻訳、推論プロキシとして振る舞うこと。
- API 課金を圧縮。 トークンは課金対象。eXprompt は入力側を 1/3 ほど削っても、モデルの回答は変えません。
- コンテキストウィンドウに余白。 同じ予算でより多くの情報を入れられる。長い会話、コードレビュー、RAG に効きます。
- プロンプトが速い。 小さいテキストはネットを早く通り、モデル側のプリフィルも速くなります。
- コマンド 1 つ、ロックインなし。 出力はただのテキストなので、ChatGPT・Claude・Gemini・Llama など、どの LLM でも使えます。
- 邪魔をしない。 Claude Code に一度フックすれば、その存在を忘れていられます。
決定論的な固定チェーンがテキスト全体に適用されます。出力が変化しなくなるまで(最大 3 パス)チェーン全体を繰り返し実行します。これにより、単語単位の除去によって複数語のフレーズが再び連続したとき、次のパスでそれを捕まえられます。
flowchart TD
Input([あなたのプロンプト]) --> P[<b>Anchors.Protect</b><br/>func、大文字語、ファイル名、<br/>camelCase、数値などを<br/>§A0 §A1 … に置換]
P --> Punct[<b>句読点</b> 除去<br/>, . ! ? ; : ' "]
Punct --> AbbP[<b>略語.フレーズ</b><br/>多語、元のテキスト上で実行<br/><i>that is → i.e.</i>]
AbbP --> Fil[<b>フィラー</b><br/>フレーズ → 単語 → フレーズ再実行<br/>+ 代名詞クリーンアップ]
Fil --> AbbW[<b>略語.単語</b><br/>1 語、フィラー除去のあと<br/><i>you→u, should→shld, and→&</i>]
AbbW --> Vow[<b>母音抜き</b><br/>BETA、既定オフ]
Vow --> Rest[<b>Anchors.Restore</b><br/>§A0 → 元のテキスト]
Rest --> Orph[<b>孤立した "I" のクリーンアップ</b><br/><i>I tht the X → the X</i>]
Orph --> WS[<b>空白の圧縮</b>]
WS --> Conv{前パスと<br/>同一か?}
Conv -- いいえ、変化あり --> P
Conv -- はい、収束 --> Out([圧縮済みプロンプト])
ループが必要な理由: "I honestly think that the createUserTable() function should be documented" の場合、パス 1 では "I think that" は連続していません("honestly" が間にある)。パス 1 で "honestly" を除去すると、パス 2 では "I think that" が連続したフィラーフレーズとして検出され、削除されます。パス 3 で変化なしを確認 — 完了です。
ゴール:どのフォルダからでも exprompt が使えること。
brew install bladysh/tap/exprompt
exprompt -v更新:brew upgrade exprompt。削除:brew uninstall exprompt。
scoop bucket add bladysh https://github.com/bladysh/scoop-bucket
scoop install exprompt
exprompt -v更新:scoop update exprompt。削除:scoop uninstall exprompt。
最新リリースページ から対応するアーカイブをダウンロードして展開し、exprompt を PATH に配置してください。
git clone https://github.com/bladysh/exprompt.git
cd exprompt
make install # /usr/local/bin/ にコピー(sudo を要求)
exprompt -v
⚠️ プロンプトは必ずクォートで囲んでください。 シングルクォートが最も安全です — そうしないとシェルが( ) $ ! "などをexpromptに渡す前に解釈してしまいます。
exprompt 'あなたのプロンプト' # 既定動作: 圧縮
echo 'プロンプト' | exprompt # stdin から読み込む
exprompt --stdin -q --no-copy < prompt.txt
exprompt '...' --no-copy # クリップボードを触らない
result=$(exprompt '...' -q) # 圧縮結果を変数へ
exprompt '...' --disable fillers # 特定フィルタを無効化cd プロジェクト
exprompt hook claude # .claude/settings.json に UserPromptSubmit フックを書き込むこれでそのフォルダで Claude Code に送るプロンプトはすべて事前に圧縮されます。フックはバイナリの 絶対パス を保存するので、PATH に依存しません。解除:exprompt hook remove。状態確認:exprompt hook status。
pkg/exprompt は公開 Go パッケージです — CLI を介さず、自分のコードからパイプラインを使えます。
go get github.com/bladysh/expromptimport "github.com/bladysh/exprompt/pkg/exprompt"
p := exprompt.NewPipeline("en")
r, _ := p.Compress("Actually you should test the API")
fmt.Println(r.Text) // "test the API"
fmt.Println(r.Savings) // 0.42(0.0〜1.0)
fmt.Println(r.Passes) // 2(実際に動いたパス数)実行可能なサンプルは examples/ にあります。
詳細な設定、母音抜きフィルタ(BETA)、savings コマンド、セキュリティ、プロジェクト構成、貢献ガイドは 英語版 README にあります。
MIT — 完全にオープンソース、制限なし。
英語のフィラー/ヘッジ辞書は、Titus Wormer さんの MIT ライセンスの単語リストを出発点にしています。その後プロンプト圧縮向けに大幅に拡張・整理・再構成しましたが、元のリポジトリがこのプロジェクトを可能にした種でした。大いに感謝します:
- words/fillers — 一般的なフィラー単語
- words/hedges — ヘッジ表現
元の MIT ライセンス全文(私たちが採用したエントリのために保持)は、対応するデータの隣にある pkg/filters/dictionaries/README.md にあります。
Go 製 · LLM に丁寧すぎるあなたに。