Paritok: чи зменшить токен-шлюз рахунки agent
Paritok стискає читання файлів і вивід інструментів для coding agent та заявляє на 74% менше токенів. Розбираємо механізм і точку беззбитковості.
Що Paritok робить із запитом
Paritok — це токен-шлюз: проксі, який працює між вашим coding agent і model API та стискає кожен запит перед пересиланням. Ваш agent взаємодіє з http://127.0.0.1:8080, а не безпосередньо з провайдером. Проксі переписує схеми інструментів, читання файлів, вивід інструментів і попередні ходи діалогу, надсилає менше корисне навантаження вгору за ланцюжком і повертає відповідь без змін.
Провайдер виставляє рахунок за дані, які надходять до нього, тому менше корисне навантаження означає менший рахунок. У цьому полягає вся ідея. Це інше твердження, ніж «ваш контекст зберігається довше», і саме тому цей інструмент цікавий, а не просто акуратний.
Проєкт ще молодий. Перші публічні теги датовані July 2026, а поточний тег — v1.3.0, датований 5 August 2026. Ваги та код шлюзу поширюються за ліцензією Apache 2.0. Модель стиснення — це адаптер LoRA (low-rank adaptation) для Qwen3-4B-Instruct-2507, навчений на 45,000 дистильованих учителем прикладах, отриманих із реальних траєкторій coding agent.
Чому це не обрізання контексту
Обрізання видаляє дані. Коли агент наближається до ліміту контексту й відкидає найстаріші ходи, файл, який він прочитав на ході 3, зникає. Якщо файл знадобиться йому на ході 20, він прочитає його знову, і ви вдруге заплатите за ці токени. Отримана економія була лише відтермінованою витратою.
Paritok замінює сегмент коротшою формою та тегом [REF:id] і зберігає повний текст на проксі. Модель відновлює сегмент викликом read_original або expand_context. Це змінює характер відмови. Обрізання призводить до того, що модель забуває дані, і ніколи не повідомляє вам про це. Компресія передає моделі стислий виклад із втратою даних, а модель може запросити оригінал, якщо викладу недостатньо.
Фільтр інструментів працює так само. Схеми відфільтрованих інструментів замінюються заглушками, а не видаляються, і модель відновлює одну з них викликом gateway_search_tools. Це важливо, оскільки фільтр, який назавжди приховує інструмент, змінює можливості агента. Ви дізнаєтеся про це лише через завдання, яке непомітно завершилося неправильно.
Три важелі та безкоштовний із них
Перший важіль — фільтр схем інструментів. Кожен запит містить весь масив tools. Під час сеансу Claude Code із підключеними серверами MCP (model context protocol) цей блок у проєкті займає приблизно 29,000 токенів. Фільтр кодує запит користувача й опис кожного інструмента за допомогою BAAI/bge-small-en-v1.5 — моделі для створення embedding розміром 130 MB, залишає інструменти, що відповідають запиту, а для решти створює заглушки. Розмір блоку зменшується приблизно до 8,000 токенів. Ця модель embedding працює на CPU.
Другий важіль — стиснення вмісту. Саме для нього потрібна модель 4B на GPU. Вміст файлів, результати роботи інструментів і історія переписуються до 25.7% початкового розміру. Саме звідси береться показник 74%. Уважно прочитайте: 74% — це рівень стиснення вмісту, який стискається, а не зменшення вашого рахунку.
Третій важіль — узагальнення історії. Коли бюджет контексту вичерпується, ходи за межами недавнього вікна узагальнюються, щоб тривалий сеанс продовжував працювати, а не досягав ліміту.
Лише для другого важеля потрібен GPU. Це найважливіше речення на цій сторінці. pip install "paritok[toolselect]" надає фільтр інструментів на звичайному CPU VPS і є тією частиною продукту, за яку ви нічого не сплачуєте щомісяця. Спробуйте її, перш ніж орендувати GPU.
Що вимірював проєкт і на чиєму тестовому стенді
The data behind this chart
[
{
"label": "Paritok-4B-v1",
"compressed_to_pct": 25.7,
"quality_retained_pct": 86.5
},
{
"label": "gpt-4.1-mini",
"compressed_to_pct": 50.2,
"quality_retained_pct": 85.6
},
{
"label": "gpt-5",
"compressed_to_pct": 61.9,
"quality_retained_pct": 93.6
}
]Це власні опубліковані показники проєкту, виміряні на його власному тестовому стенді для SWE-bench Lite. Paritok-4B-v1 стискає вміст до 25.7% початкового розміру, зберігаючи 86.5% коефіцієнта розв’язання для нестисненого вмісту. Використання gpt-5 як компресора зберігає більше якості — 93.6%, — але стискає лише до 61.9%, тож ви платитимете за frontier-модель, щоб заощадити на витратах frontier-моделі.
Оцінюйте стовпчик якості об’єктивно. Збереження 86.5% коефіцієнта розв’язання означає, що стиснені запуски не розв’язали задачі, які розв’язали нестиснені запуски, тобто не було розв’язано приблизно одну задачу із семи. На тесті це число в таблиці. У вашому репозиторії це задача, яку ви запускаєте двічі.
The data behind this chart
[
{
"label": "Turn 1",
"saved_pct": 25
},
{
"label": "Turn 5",
"saved_pct": 39
},
{
"label": "Turn 12",
"saved_pct": 57
},
{
"label": "Turn 20",
"saved_pct": 63
}
]Економія для повного циклу зростає під час роботи сесії, оскільки накопичується історія, а стискається саме вона. Проєкт повідомляє про приблизно 25% економії за один хід, 39% на 5-му ході та 63% на 20-му ході. Також указано, де це зростання припиняється: за бюджету 200,000 токенів абсолютна економія стабілізується на рівні приблизно 48,000 токенів за хід десь між 8-м і 12-м ходами, оскільки після заповнення контексту історія перестає зростати. Часто цитоване значення «понад 85%» описує сесії з повністю заповненим контекстом. Це найкращий сценарій, тому не плануйте роботу, виходячи з нього.
Чи окупається 24GB GPU для Paritok?
Карта на 24 GB — типовий орендований варіант для моделі такого розміру. Станом на 7 August 2026 медіанна опублікована погодинна on-demand ставка для RTX 4090 з 24 GB становила $0.44, а найдешевші пропозиції були близько $0.20. Візьмімо $0.44. Якщо залишати GPU увімкненим увесь місяць, це 730 годин, тобто $321. Якщо запускати його лише в робочі години — 8 годин на день протягом 22 днів, — це 176 годин, тобто $77.
Тепер перетворімо скорочення кількості токенів на економію в доларах. Скорочення стосується вхідних токенів. Вихідні токени проходять через проксі без змін, тому їхня кількість не змінюється. Припустімо, що вхідні токени становлять 80% загальної суми в доларах. Для coding agent це типове співвідношення, але перевірте його за власним рахунком. Економія в доларах дорівнює скороченню кількості токенів, помноженому на 0.8.
The data behind this chart
[
{
"label": "Turn 5 (39% saved)",
"bill_always_on_usd": "1,030",
"bill_workday_only_usd": 248
},
{
"label": "Turn 20 (63% saved)",
"bill_always_on_usd": 637,
"bill_workday_only_usd": 154
},
{
"label": "Saturated (85% saved)",
"bill_always_on_usd": 472,
"bill_workday_only_usd": 114
}
]За показника 85% для насиченої сесії ви зберігаєте 68% рахунку. Тому карта, яка працює постійно, окупається, коли щомісячні витрати на agent перевищують приблизно $472, або приблизно $114, якщо зупиняти інстанс поза робочими годинами. За показника 63% для turn-20 ці значення становлять $637 і $154. За показника 39% для turn-5, що відповідає коротким сесіям на практиці, щомісячні витрати мають становити приблизно $1,030, перш ніж оренда карти взагалі стане вигідною.
Два фактори роблять результат кращим, ніж показано в таблиці. Моделі не потрібно 24 GB: збірка q4 займає приблизно 2.5 GB, а збірка bf16 — приблизно 8 GB. Тому менша карта або GPU box, який ви вже використовуєте для іншого завдання, зменшить усі значення на графіку. Зупиняти інстанс, коли ніхто не пише код, — найефективніший захід, оскільки це скорочує орендну плату приблизно на три чверті.
Один фактор погіршує результат. Етап стиснення потребує реальних обчислень. Кожен токен, який стискає модель 4B, вона спочатку зчитує, а потім записує. Це збільшує затримку під час кожного ходу agent. На карті, яку орендують погодинно, ця вартість проявляється як очікування, а не як окремий рядок у рахунку. Тому її легко не помітити, доки ви не відчуєте її на практиці.
Якщо ви загалом порівнюєте орендовані години GPU з API-токенами, у розрахунку точки беззбитковості між GPU VPS і API-токенами використано таку саму арифметику для самого inference.
Запуск шлюзу Paritok на VPS
Потрібна Python 3.10 або новіша. Ubuntu 24.04 постачається з Python 3.12, тому для частини, що працює лише на CPU, достатньо стандартного образу VPS.
sudo apt update && sudo apt install -y python3-venv curl
python3 -m venv /opt/paritok/venv
source /opt/paritok/venv/bin/activate
pip install "paritok[proxy]==1.3.0"
pip install "paritok[toolselect]==1.3.0"Зафіксуйте версію. Репозиторій мав тег v1.2.8 29 July 2026 і v1.3.0 5 August 2026, а проєкт із таким темпом розробки перейменовує ключі конфігурації між випусками. Простий pip install paritok або git clone для main наступного тижня встановить інший шлюз, і не залишиться запису про те, який саме шлюз сформував виміряні вами показники.
Типовим бекендом є Ollama. Завантажте модель, а потім надайте їй коротке ім’я, яке очікує проксі.
ollama pull paritok/paritok-4b-v1
ollama cp paritok/paritok-4b-v1 paritok-4b-v1Вкажіть поруч paritok.yaml. use_gpu_server: false забезпечує виконання стиснення на вашому обладнанні.
use_gpu_server: false
local_model:
base_url: http://localhost:11434paritok proxy --port 8080 --config-file paritok.yamlparitok up — це скорочена команда для всіх описаних дій: вона завантажує модель, якщо її ще немає, і запускає проксі на порту 8080. Перевірте проксі, перш ніж підключати до нього агента.
curl http://127.0.0.1:8080/health
curl http://127.0.0.1:8080/stats/health повертає невеликий JSON-об’єкт, що містить "status":"ok" і рядок версії. /stats повертає загальні показники стиснення та власну оцінку проксі щодо обсягу зекономлених даних. Не вважайте цю оцінку об’єктивною: проксі оцінює власну роботу. Підтвердьте її на сторінці використання вашого провайдера.
Якщо важлива пропускна здатність, а не зручність, vLLM запускає adapter поверх базової моделі.
vllm serve Qwen/Qwen3-4B-Instruct-2507 \
--enable-lora \
--lora-modules paritok-4b-v1=paritok/paritok-4b-v1 \
--port 8000Ollama швидше налаштувати. vLLM значно краще обробляє паралельні запити, що стає важливим, щойно сервером користується більше одного агента. Практична різниця між Ollama і vLLM визначає вибір у цьому випадку.
Підключіть агента до проксі за допомогою змінних середовища базової URL-адреси.
export ANTHROPIC_BASE_URL=http://127.0.0.1:8080
export OPENAI_BASE_URL=http://127.0.0.1:8080Codex CLI ігнорує OPENAI_BASE_URL, тому проєкт автоматично записує для вас ~/.codex/config.toml, коли codex.enabled: true задано в paritok.yaml. Якщо експортувати змінну окремо, Codex і надалі звертатиметься безпосередньо до провайдера. Ознакою цього є лічильник /stats, який не змінюється під час роботи.
Залиште listener на 127.0.0.1, а не на 0.0.0.0. Проксі передає ваш API-ключ провайдеру, тому проксі, доступний з інтернету, стає відкритим ретранслятором для цього ключа: той, хто знайде порт, зможе витрачати ваші кошти, навіть не бачачи самого ключа. Підключайтеся до нього з ноутбука через SSH-тунель або VPN, а не відкривайте порт назовні.
Запускайте його через systemd, щоб він працював після перезавантаження. Змініть шляхи відповідно до вашого встановлення.
[Unit]
Description=Paritok compression proxy
After=network-online.target
[Service]
User=paritok
WorkingDirectory=/opt/paritok
ExecStart=/opt/paritok/venv/bin/paritok proxy --port 8080 --config-file /opt/paritok/paritok.yaml
Restart=on-failure
[Install]
WantedBy=multi-user.targetУвімкніть unit за допомогою sudo systemctl enable --now paritok, а потім знову виконайте curl /health. Якщо unit запускається і відразу завершує роботу, зазвичай це означає неправильний шлях до файлу конфігурації. journalctl -u paritok -n 50 виведе причину.
Хостований варіант і його вартість для вас
Проєкт також надає стиснення як сервіс. Налаштуйте use_gpu_server: true за допомогою API key, і модель 4B працюватиме на його обладнанні. Вартість становить $0.30 за мільйон оброблених токенів. Згідно з документацією проєкту, до кінця August 2026 послуга безкоштовна. Це усуває витрати на оренду GPU та всю операційну роботу, описану вище.
Водночас ваші prompts і файли, які читає agent, залишають вашу машину та потрапляють до третьої сторони ще до того, як досягнуть вашого model provider. Self-hosting потрібен саме для уникнення такого передавання. Визначте, що саме ви оптимізуєте, перш ніж установлювати цей flag: змінити його можна в одному рядку, але наслідки такої зміни набагато суттєвіші.
Як виміряти власні показники до і після
Опубліковані показники належать проєкту. Їх отримано за допомогою тестового стенду проєкту на SWE-bench Lite. Ваш репозиторій — не SWE-bench Lite. Виконайте власні вимірювання.
- Проведіть один звичайний тиждень без проксі в ланцюжку запитів. Запишіть окремими рядками кількість вхідних токенів, токенів, прочитаних із кешу, і вихідних токенів зі сторінки статистики використання вашого провайдера, а не одну загальну суму в доларах.
- Наступного тижня виконуйте той самий тип роботи з проксі перед застосунком.
- Порівняйте рядки для вхідних токенів і токенів, прочитаних із кешу. Кількість вихідних токенів має залишитися приблизно сталою, оскільки компресія на неї не впливає. Якщо вона суттєво змінилася, змінилося щось інше, крім проксі.
- Порахуйте завдання, які довелося виконати повторно. Це якісна складова компромісу, і жодна інформаційна панель не показує її.
- Додайте години роботи GPU за другий тиждень, перш ніж порівнювати підсумкові витрати.
Важливо розділяти вхідні та вихідні токени, оскільки їхня вартість суттєво відрізняється, а компресор впливає лише на один із цих типів. Станом на August 2026 Claude Sonnet 4.6 коштує $3 за мільйон вхідних токенів і $15 за мільйон вихідних токенів, а читання з prompt cache коштує 10% від тарифу для вхідних даних — $0.30 за мільйон. Різниця у вартості вхідних і вихідних токенів визначає, чи буде компресор для вхідних даних корисним у вашому випадку. Куди насправді витрачаються токени Claude Code показує, яка частина вашого контексту достатньо велика, щоб її варто було стискати.
Prompt caching особливо ускладнює розрахунок економії від фільтрації інструментів. Блок інструментів розташований на початку запиту, тому після першого ходу зазвичай потрапляє в кеш і тарифікується за 10% від вартості вхідних даних. Видалення 21,000 токенів із кешованого блока заощаджує оплату за 21,000 токенів за тарифом $0.30 за мільйон, тобто близько $0.006 за хід, а не $0.063, які випливали б із тарифу без кешування. Проєкт залишає відфільтрований блок незмінним протягом сеансу, тому префікс у кеші не змінюється. Фільтр, який заново вибирав би інструменти на кожному ході, інвалідовував би цей префікс і коштував би більше, ніж заощаджував.
Що ще не підтверджено
Усі наведені вище показники продуктивності взято безпосередньо з самого проєкту. Незалежного відтворення результатів SWE-bench Lite немає. Крім того, перші теги датовано July 2026, тому код має дуже малу історію експлуатації. Показники коефіцієнта стиснення та збереженої якості вимірює сторона, зацікавлена в тому, щоб вони виглядали якомога краще. Це не означає, що вони неправильні. Це означає, що вони не підтверджені. Ставтеся до них інакше, ніж до показника, який ви отримали самостійно.
Перед тим як звинувачувати власну конфігурацію, варто знати про одну задокументовану особливість. Модель embedding, яку використовує фільтр інструментів, завантажується під час першого запиту, а не під час запуску. Тому проєкт вказує час прогрівання 10–15 секунд, після чого один виклик займає приблизно 15 мс. Надішліть один непотрібний запит після запуску проксі. Тоді перший реальний крок агента не виглядатиме як зависання.
За один день можна самостійно перевірити чотири речі: чи запускається проксі та продовжує працювати, чи змінюється /stats під час роботи, чи справді зменшується рядок вхідних токенів у вашого провайдера і чи агент так само завершує завдання. Для вашої конфігурації ці результати значно важливіші за будь-який опублікований бенчмарк.
Щодо взаємодії з іншими інструментами: self-hosted шлюз LiteLLM маршрутизує запити та веде облік їх використання, не змінюючи їхній вміст. Тому ці два інструменти вирішують різні завдання й можуть працювати в ланцюжку, причому Paritok розташовується найближче до агента. Якщо справжня мета — зменшити рахунок, а не використовувати саме цей інструмент, ширший набір способів зменшити витрати агента на VPS містить кілька змін, які спочатку можна спробувати безкоштовно.
FAQ
Чи зменшує Paritok витрати на API, чи лише використання контексту?
Він зменшує рахунок, оскільки proxy переписує запит до того, як він надходить до провайдера, а провайдер стягує плату за отримані дані. Розмір цього зменшення менший, ніж випливає з основного показника. Значення 74% — це коефіцієнт стиснення контенту, який стискається. Від початку до кінця проєкт показує приблизно 25% для одного ходу та 63% до 20-го ходу; змінюються лише вхідні токени. Вихідні токени проходять без змін.
Яка потужність GPU потрібна для self-hosting моделі стиснення?
Збірка q4 займає близько 2.5 GB, а збірка bf16 — близько 8 GB, тому модель із великим запасом поміщається на карті обсягом 24 GB. Підійде й менша карта, що покращує розрахунок окупності на вашу користь. Фільтр tool-schema взагалі не потребує GPU: він використовує BAAI/bge-small-en-v1.5 — embedding-модель обсягом 130 MB, яка працює на CPU. Встановіть paritok[toolselect] на звичайному VPS і отримайте зменшення обсягу tool-блоків за рахунок невеликого обсягу RAM.
Що станеться, якщо compressor видалить щось потрібне агенту?
Нічого не видаляється. Стиснуті сегменти містять тег [REF:id], а модель відновлює повний текст за допомогою read_original або expand_context. Відфільтровані tool-схеми замінюються заглушками, а модель відновлює одну з них за допомогою gateway_search_tools. Реальний ризик менш очевидний, ніж відсутність файлу: модель працює на основі неточного summary і не розуміє, що потрібно запросити оригінал. Саме це вимірює показник збереження якості 86.5% на SWE-bench Lite.
Чому мій перший запит триває п’ятнадцять секунд?
Embedding-модель, яка працює за tool-фільтром, завантажується під час першого запиту, а не під час запуску. У документації проєкту зазначено прогрівання тривалістю від 10 до 15 секунд, після чого один виклик займає приблизно 15 ms. Після запуску proxy надішліть один тестовий запит із curl, і перший реальний хід агента не затримуватиметься.
Чи варто використовувати hosted GPU server замість self-hosting?
Це усуває витрати на оренду GPU та обслуговування; станом на August 2026 вартість становить $0.30 за мільйон оброблених токенів. Водночас ваші prompt-и та файли, які читає агент, надсилаються третій стороні до того, як вони потрапляють до вашого провайдера моделі. Якщо ви використовуєте self-hosting, щоб зберігати код на інфраструктурі під власним контролем, цей параметр суперечить самій причині такого вибору. Self-hosting зберігає і контекст, і API key провайдера моделі на вашому сервері.