Зворотний T9 для LLM. Безкоштовний open-source CLI-проксі компресор промптів для ваших AI-промптів та агентів.
$ 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 чи будь-куди.
Невеликий CLI-інструмент, який стискає AI-промпти на 25–50 % до того, як вони потраплять до моделі. Видаляє слова-паразити, замінює поширені слова короткими формами та захищає технічні терміни (API, JSON, camelCase, func(), числа, імена файлів), щоб їх ніколи не зачепило.
| Лише локально | Жодних моделей, жодних мережевих викликів, ніякі дані не залишають вашу машину. Текст на вхід — текст на вихід. |
| Детермінований | На основі словників. Однаковий вхід завжди дає однаковий вихід. |
| Гнучкий | Перемикайте фільтри для одного запуску або зберігайте налаштування через exprompt config set. |
| Крихітний | Один статичний Go-бінарник. Обробляє будь-який реалістичний промпт за <1 мс. |
| Відкритий | Ліцензія MIT; кожна трансформація живе у звичайних JSON-файлах, які можна читати, форкати чи розширювати. |
Не є метою: семантичне переписування (жоден LLM не переписує ваш текст), переклад чи робота як проксі інференсу.
- Менші рахунки за API. Кожен токен коштує грошей. eXprompt зрізає третину входу, не змінюючи відповіді моделі.
- Більше місця у вікні контексту. Той самий бюджет, більше сигналу. Чудово для довгих чатів, code-review та RAG.
- Швидші промпти. Менший текст швидше летить по мережі та швидше префільниться на боці моделі.
- Одна команда, жодного lock-in. Працює з будь-яким LLM (ChatGPT, Claude, Gemini, Llama…), бо вихід — це звичайний текст.
- Не заважає. Підключаєте до 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/>окремі слова, після паразитів<br/><i>you→u, should→shld, and→&</i>]
AbbW --> Vow[<b>Голосні</b><br/>БЕТА, типово вимкнено]
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" фраза "I think that" на першому проході не є суцільною (слово "honestly" між ними). Перший прохід прибирає "honestly". Другий прохід тепер бачить "I think that" як суцільний паразит і видаляє його. Третій прохід підтверджує: змін більше немає — готово.
Мета: щоб 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
⚠️ Завжди беріть промпт у лапки. Одинарні лапки найбезпечніші — інакше shell інтерпретує( ) $ ! "ще до того, як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 # додає UserPromptSubmit-хук у .claude/settings.jsonТепер кожен промпт у 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/.
Розширені розділи — повна конфігурація, фільтр голосних (БЕТА), команда savings, безпека, структура проєкту й гайд для контриб'юторів — у README англійською.
MIT — повністю open source, без обмежень.
Наші англійські словники паразитів та хеджів стартували з MIT-ліцензованих списків Titus Wormer. Відтоді ми їх значно розширили, прокурували й переорганізували під стиск промптів — але саме ті репозиторії стали зерном, з якого виріс цей проєкт. Велика подяка:
- words/fillers — поширені слова-паразити
- words/hedges — пом'якшувальні фрази
Оригінальні тексти MIT-ліцензії (збережені для тих записів, які ми залишили) лежать у pkg/filters/dictionaries/README.md поруч із самими даними.
Зроблено на Go · Для тих, хто пише LLM-ам занадто ввічливо.