Paritok: jak obniżyć koszty tokenów agenta AI?
Dowiedz się, jak bramka Paritok v1.3.0 kompresuje odczyty plików i dane wyjściowe narzędzi. Analiza mechanizmu redukcji o 74 procent oraz wyliczenia opłacalności rozwiązania.
Jak Paritok przetwarza żądania
Paritok to bramka tokenów: proxy działające między agentem programistycznym a API modelu, które kompresuje każde żądanie przed jego przekazaniem. Agent komunikuje się z http://127.0.0.1:8080 zamiast bezpośrednio z dostawcą. Proxy przepisuje schematy narzędzi, odczyty plików, dane wyjściowe narzędzi oraz starsze tury konwersacji, wysyła mniejszy ładunek do dostawcy, a następnie zwraca odpowiedź w niezmienionej formie.
Dostawca nalicza opłaty za dane, które do niego docierają, więc mniejszy ładunek oznacza niższą fakturę. Na tym polega główna idea rozwiązania. Jest to założenie inne niż „wydłużenie kontekstu” i właśnie dlatego narzędzie to jest interesujące, a nie tylko porządkujące.
Projekt jest na wczesnym etapie rozwoju. Pierwsze publiczne tagi pochodzą z lipca 2026 roku, a obecna wersja to v1.3.0 z 5 sierpnia 2026 roku. Wagi modelu oraz kod bramki udostępniono na licencji Apache 2.0. Model kompresji to adapter LoRA (low-rank adaptation) dla Qwen3-4B-Instruct-2507, wytrenowany na 45 000 próbek destylowanych od nauczyciela, pochodzących z rzeczywistych trajektorii pracy agentów programistycznych.
Dlaczego to nie jest przycinanie kontekstu
Przycinanie usuwa dane. Gdy agent zbliża się do limitu kontekstu i odrzuca najstarsze tury konwersacji, plik odczytany w turze 3 przepada. Jeśli agent będzie potrzebował tego pliku w turze 20, odczyta go ponownie, więc za te tokeny płaci się drugi raz. Oszczędność była tylko pożyczką.
Paritok zastępuje segment krótszą formą wraz ze znacznikiem [REF:id] i przechowuje pełny tekst na proxy. Model odzyskuje segment poprzez wywołanie read_original lub expand_context. Zmienia to sposób występowania błędów. Mechanizm przycinania zawodzi poprzez zapominanie, o czym nigdy nie informuje. Kompresor zawodzi poprzez dostarczenie modelowi stratnego podsumowania, a model może poprosić o oryginał, gdy podsumowanie jest niewystarczające.
Filtr narzędzi działa w ten sam sposób. Przefiltrowane schematy narzędzi są zastępowane skrótami zamiast usuwania, a model odzyskuje pełny schemat poprzez wywołanie gateway_search_tools. Jest to istotne, ponieważ filtr, który trwale ukrywa narzędzie, zmienia możliwości agenta, o czym można by się dowiedzieć dopiero poprzez zadanie, które po cichu zakończyło się niepowodzeniem.
Trzy dźwignie i informacja o tym, która z nich jest darmowa
Pierwszą dźwignią jest filtr schematu narzędzi. Każde żądanie przenosi całą tablicę tools. W przypadku sesji Claude Code z kilkoma podłączonymi serwerami MCP (model context protocol), projekt szacuje ten blok na około 29 000 tokenów. Filtr osadza żądanie użytkownika oraz opis każdego narzędzia przy użyciu BAAI/bge-small-en-v1.5, modelu embeddingowego o rozmiarze 130 MB, zachowuje pasujące narzędzia, a pozostałe zastępuje wycinkami. Blok zmniejsza się do około 8 000 tokenów. Ten model embeddingowy działa na CPU.
Drugą dźwignią jest kompresja treści i jest to część wymagająca modelu 4B na GPU. Odczyty plików, dane wyjściowe narzędzi oraz historia są przepisywane do 25,7% swojego pierwotnego rozmiaru. Stąd bierze się wartość 74%. Należy czytać to uważnie: 74% to stopień kompresji treści, która podlega kompresji, a nie obniżka rachunku.
Trzecią dźwignią jest podsumowywanie historii. Gdy budżet kontekstu zostanie wyczerpany, tury wykraczające poza ostatnie okno są podsumowywane, dzięki czemu długa sesja może być kontynuowana zamiast osiągać limit.
Tylko druga dźwignia wymaga GPU. To najważniejsze zdanie na tej stronie. pip install "paritok[toolselect]" zapewnia filtr narzędzi na zwykłym serwerze VPS z procesorem CPU i jest to połowa produktu, która nie generuje miesięcznych kosztów. Warto wypróbować to rozwiązanie przed wynajęciem karty graficznej.
Co mierzył projekt i na jakim środowisku testowym
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
}
]Są to opublikowane dane projektu, zmierzone na jego własnym środowisku testowym względem SWE-bench Lite. Paritok-4B-v1 kompresuje zawartość do 25.7% pierwotnego rozmiaru, zachowując 86.5% skuteczności rozwiązywania zadań w porównaniu z wersją nieskompresowaną. Użycie gpt-5 jako kompresora pozwala zachować wyższą jakość, 93.6%, ale kompresuje tylko do 61.9%, co wiąże się z ponoszeniem kosztów modeli klasy frontier w celu zaoszczędzenia na kosztach modeli klasy frontier.
Należy rzetelnie interpretować kolumnę jakości. Zachowanie 86.5% skuteczności oznacza, że skompresowane uruchomienia nie rozwiązały problemów, które wersje nieskompresowane rozwiązały – mowa o blisko jednym na siedem zadań. W benchmarku jest to tylko liczba w tabeli. W przypadku własnego repozytorium jest to zadanie, które trzeba wykonać dwukrotnie.
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
}
]Oszczędności typu end-to-end rosną wraz z czasem trwania sesji, ponieważ historia się kumuluje, a to właśnie ona podlega kompresji. Projekt raportuje około 25% oszczędności w pojedynczej turze, 39% w turze 5 oraz 63% w turze 20. Wskazuje również, w którym momencie wzrost ustaje: przy budżecie 200,000 tokenów bezwzględna oszczędność stabilizuje się na poziomie około 48,000 tokenów na turę, mniej więcej między turą 8 a 12, ponieważ po zapełnieniu kontekstu historia przestaje rosnąć. Często cytowana wartość "ponad 85%" opisuje sesje z nasyconym kontekstem. Jest to scenariusz optymistyczny, dlatego nie należy na nim opierać planowania.
Czy karta graficzna 24 GB zwraca się przy Paritok?
Karta 24 GB stanowi standardową jednostkę wynajmu dla modelu tej wielkości. Według stanu na 7 sierpnia 2026 r. mediana publikowanych stawek na żądanie dla RTX 4090 z 24 GB wynosi 0,44 USD za godzinę, przy czym najtańsze oferty oscylują wokół 0,20 USD. Przyjmijmy stawkę 0,44 USD. Uruchomienie przez cały miesiąc to 730 godzin, co daje 321 USD. Uruchomienie tylko w godzinach pracy, 8 godzin dziennie przez 22 dni, to 176 godzin, czyli 77 USD.
Teraz należy przeliczyć redukcję tokenów na oszczędności dolarowe. Redukcja dotyczy tokenów wejściowych. Tokeny wyjściowe przechodzą przez proxy bez zmian, więc ich koszt pozostaje stały. Przyjmijmy, że tokeny wejściowe stanowią 80% całkowitego rachunku, co jest typowe dla agenta programistycznego, i zweryfikuj to założenie na podstawie własnych faktur. Oszczędność dolarowa to wówczas redukcja tokenów pomnożona przez 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
}
]Przy wskaźniku nasycenia sesji na poziomie 85%, zachowujesz 68% kwoty rachunku. Oznacza to, że karta pozostawiona w trybie ciągłym zwraca się, gdy miesięczne wydatki na agenta przekroczą około 472 USD, lub około 114 USD, jeśli instancja jest wyłączana poza godzinami pracy. Przy wskaźniku 63% (dla 20 tur), wartości te wynoszą 637 USD oraz 154 USD. Przy wskaźniku 39% (dla 5 tur), co odpowiada krótkim sesjom, wymagane jest wydawanie około 1,030 USD miesięcznie, aby wynajem karty był opłacalny.
Dwa czynniki sprawiają, że sytuacja wygląda lepiej, niż sugeruje tabela. Model nie wymaga 24 GB pamięci: kompilacja q4 zajmuje około 2,5 GB, a bf16 około 8 GB. Mniejsza karta lub serwer GPU wykorzystywany już do innych zadań obniża każdą wartość w zestawieniu. Zatrzymywanie instancji, gdy nikt nie programuje, jest najważniejszym czynnikiem optymalizacyjnym, ponieważ redukuje koszt wynajmu o około trzy czwarte.
Jeden czynnik pogarsza sytuację. Proces kompresji wymaga mocy obliczeniowej. Każdy token kompresowany przez model 4B musi zostać odczytany, a następnie zapisany, co zwiększa opóźnienie każdej tury agenta. W przypadku karty wynajmowanej na godziny koszt ten objawia się jako czas oczekiwania, a nie jako pozycja na fakturze, więc łatwo go przeoczyć, dopóki nie stanie się odczuwalny.
Jeśli porównujesz koszty wynajmu GPU z kosztami tokenów API, punkt rentowności między GPU VPS a tokenami API opiera się na tej samej arytmetyce dla samej inferencji.
Uruchamianie bramy Paritok na VPS
Wymagany jest Python 3.10 lub nowszy. Ubuntu 24.04 dostarcza Python 3.12, więc czysty obraz VPS jest wystarczający dla wersji działającej wyłącznie na CPU.
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"Przypnij wersję. Repozytorium oznaczyło wersję v1.2.8 w dniu 29 lipca 2026 r. oraz v1.3.0 w dniu 5 sierpnia 2026 r., a projekt rozwijający się w takim tempie zmienia nazwy kluczy konfiguracyjnych pomiędzy wydaniami. Samo pip install paritok lub git clone z main spowoduje, że w przyszłym tygodniu otrzymasz inną bramę i nie pozostawisz żadnego zapisu o tym, która wersja wygenerowała zmierzone wyniki.
Domyślnym backendem jest Ollama. Pobierz model, a następnie nadaj mu krótką nazwę, której oczekuje proxy.
ollama pull paritok/paritok-4b-v1
ollama cp paritok/paritok-4b-v1 paritok-4b-v1Zapisz paritok.yaml obok niego. use_gpu_server: false odpowiada za utrzymanie kompresji na własnym sprzęcie.
use_gpu_server: false
local_model:
base_url: http://localhost:11434paritok proxy --port 8080 --config-file paritok.yamlparitok up to skrót dla wszystkich powyższych czynności: pobiera model, jeśli go brakuje, i uruchamia proxy na porcie 8080. Sprawdź proxy, zanim skierujesz na nie agenta.
curl http://127.0.0.1:8080/health
curl http://127.0.0.1:8080/stats/health zwraca mały obiekt JSON zawierający "status":"ok" oraz ciąg znaków wersji. /stats zwraca sumy kompresji oraz własne szacunki proxy dotyczące uzyskanych oszczędności. Traktuj te szacunki jako ocenę pracy własnej proxy i zweryfikuj je na stronie zużycia u swojego dostawcy.
W przypadku potrzeby uzyskania większej przepustowości zamiast wygody, vLLM obsługuje adapter na bazie modelu podstawowego.
vllm serve Qwen/Qwen3-4B-Instruct-2507 \
--enable-lora \
--lora-modules paritok-4b-v1=paritok/paritok-4b-v1 \
--port 8000Ollama jest szybsza w konfiguracji. vLLM znacznie lepiej radzi sobie z jednoczesnymi żądaniami, co zaczyna mieć znaczenie, gdy z serwera korzysta więcej niż jeden agent. Praktyczna różnica między Ollama a vLLM jest czynnikiem decydującym w tym przypadku.
Skieruj agenta na proxy za pomocą zmiennych środowiskowych bazowego adresu URL.
export ANTHROPIC_BASE_URL=http://127.0.0.1:8080
export OPENAI_BASE_URL=http://127.0.0.1:8080Codex CLI ignoruje OPENAI_BASE_URL, więc projekt zapisuje ~/.codex/config.toml za Ciebie, gdy codex.enabled: true jest ustawione w paritok.yaml. Eksportowanie samej zmiennej spowoduje, że Codex będzie komunikował się bezpośrednio z dostawcą, a oznaką tego jest licznik /stats, który nie zmienia się podczas pracy.
Utrzymuj nasłuchiwanie na 127.0.0.1, nigdy na 0.0.0.0. Proxy przesyła klucz API dostawcy do upstreamu, więc proxy dostępne z Internetu stanowi otwarty przekaźnik dla tego klucza: każdy, kto znajdzie port, wyda Twoje pieniądze, nigdy nie widząc samego klucza. Uzyskaj dostęp z laptopa przez tunel SSH lub VPN zamiast otwierać port.
Uruchom usługę pod kontrolą systemd, aby przetrwała restart. Dostosuj ścieżki do swojej instalacji.
[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.targetWłącz ją za pomocą sudo systemctl enable --now paritok, a następnie ponownie wykonaj curl /health. Jednostka, która uruchamia się i natychmiast kończy działanie, zazwyczaj oznacza błędną ścieżkę do pliku konfiguracyjnego, a journalctl -u paritok -n 50 wyświetli przyczynę.
Opcja hostowana i jej koszty
Projekt oferuje również kompresję jako usługę. Ustawienie use_gpu_server: true wraz z kluczem API pozwala na uruchomienie modelu 4B na infrastrukturze dostawcy. Koszt wynosi 0.30 USD za milion przetworzonych tokenów, przy czym zgodnie z dokumentacją usługa jest bezpłatna do końca sierpnia 2026 roku. Eliminuje to konieczność wynajmu GPU oraz wykonywania wszystkich powyższych prac operacyjnych.
Oznacza to również, że prompty oraz pliki odczytywane przez agenta opuszczają lokalną maszynę i trafiają do strony trzeciej, zanim dotrą do dostawcy modelu. Self-hosting istnieje właśnie po to, aby uniknąć tego etapu. Przed ustawieniem tej flagi należy zdecydować, który z tych aspektów jest priorytetowy, ponieważ zmiana flagi to modyfikacja jednej linii, ale jej konsekwencje są znacznie poważniejsze.
Jak zmierzyć własne wyniki przed i po
Opublikowane liczby pochodzą z testów projektu, przeprowadzonych w środowisku SWE-bench Lite. Twoje repozytorium nie jest SWE-bench Lite. Zmierz własne wyniki.
- Przepracuj jeden normalny tydzień bez proxy w ścieżce. Zapisz liczbę tokenów wejściowych, tokenów odczytanych z pamięci podręcznej (cache-read) oraz tokenów wyjściowych jako osobne wiersze z panelu użycia dostawcy, a nie jako jedną łączną kwotę w dolarach.
- Przepracuj kolejny tydzień z aktywnym proxy, wykonując ten sam rodzaj zadań.
- Porównaj wiersze wejścia i odczytu z pamięci podręcznej. Liczba tokenów wyjściowych powinna pozostać na zbliżonym poziomie, ponieważ kompresja ich nie dotyczy. Jeśli dane wyjściowe znacząco się zmieniły, oznacza to, że poza proxy zmieniło się coś jeszcze.
- Policz zadania, które musiałeś wykonać ponownie. To połowa równania dotycząca jakości, której nie raportuje żaden pulpit nawigacyjny.
- Dodaj godziny pracy GPU do drugiego tygodnia przed porównaniem sumarycznych kosztów.
Rozdzielenie danych wejściowych od wyjściowych jest istotne, ponieważ są one wyceniane zupełnie inaczej, a kompresor wpływa tylko na jedną z tych grup. Według stanu na sierpień 2026, Claude Sonnet 4.6 kosztuje 3 USD za milion tokenów wejściowych i 15 USD za milion tokenów wyjściowych, a odczyt z pamięci podręcznej promptu (prompt-cache) to 10% stawki wejściowej, czyli 0,30 USD za milion. Różnica między kosztem tokenów wejściowych a wyjściowych decyduje o tym, czy kompresor po stronie wejściowej jest dla Ciebie opłacalny. Gdzie faktycznie trafiają tokeny Claude Code wskazuje, która część Twojego kontekstu jest na tyle duża, by warto było ją kompresować.
Buforowanie promptów (prompt caching) komplikuje w szczególności obliczenia dotyczące filtrów narzędzi. Blok narzędzi znajduje się na początku żądania, więc po pierwszej turze zazwyczaj trafia do pamięci podręcznej, kosztując 10% ceny wejściowej. Usunięcie 21 000 tokenów z zbuforowanego bloku pozwala zaoszczędzić 21 000 tokenów po stawce 0,30 USD za milion, czyli około 0,006 USD na turę, zamiast 0,063 USD, co sugerowałaby stawka bez buforowania. Projekt utrzymuje przefiltrowany blok w stanie zamrożonym przez całą sesję, dzięki czemu zbuforowany prefiks nie ulega zmianie. Filtr, który wybierałby narzędzia na nowo w każdej turze, unieważniłby ten prefiks i kosztowałby więcej, niż pozwoliłby zaoszczędzić.
Co pozostaje niezweryfikowane
Każda z powyższych liczb dotyczących wydajności pochodzi od samego twórcy projektu. Brak jest niezależnej weryfikacji wyników SWE-bench Lite, a ze względu na pierwsze tagi datowane na lipiec 2026, kod nie posiada jeszcze długiej historii operacyjnej. Zarówno stopień kompresji, jak i wskaźnik zachowania jakości są mierzone przez stronę, która czerpie korzyści z korzystnych wyników. Nie oznacza to, że są one błędne. Oznacza to, że są niepotwierdzone i należy traktować je z większą rezerwą niż dane wygenerowane samodzielnie.
Warto znać jedno udokumentowane zachowanie, zanim użytkownik uzna konfigurację za wadliwą. Model osadzeń (embedding model) używany przez filtr narzędzia ładuje się przy pierwszym żądaniu, a nie podczas uruchamiania. Projekt dokumentuje czas rozgrzewki (warm-up) wynoszący od 10 do 15 sekund, a następnie około 15 ms na każde kolejne wywołanie. Należy wysłać jedno testowe żądanie po uruchomieniu proxy, aby uniknąć wrażenia zawieszenia się agenta przy pierwszym rzeczywistym zadaniu.
Cztery kwestie można zweryfikować samodzielnie w jedno popołudnie: czy proxy uruchamia się i pozostaje aktywne, czy /stats zmienia się podczas pracy, czy faktycznie spada liczba tokenów wejściowych u dostawcy oraz czy agent nadal kończy pracę. Te czynniki określają przydatność rozwiązania w danej konfiguracji znacznie lepiej niż jakikolwiek opublikowany benchmark.
Jeśli chodzi o miejsce tego rozwiązania wśród innych narzędzi: samodzielnie hostowana bramka LiteLLM kieruje i mierzy ruch bez zmiany zawartości żądań. Oba rozwiązania rozwiązują inne problemy i mogą być łączone w łańcuch, przy czym Paritok powinien znajdować się najbliżej agenta. Jeśli celem jest obniżenie rachunków, a nie konkretne narzędzie, szerszy zestaw kontroli kosztów dla agenta na VPS obejmuje kilka zmian, których przetestowanie nic nie kosztuje.
FAQ
Czy Paritok obniża rachunek za API, czy tylko zużycie kontekstu?
Obniża rachunek, ponieważ proxy modyfikuje żądanie przed dotarciem do dostawcy, a dostawca nalicza opłaty za otrzymane dane. Skala tej redukcji jest mniejsza, niż sugerują nagłówki. Wartość 74% odnosi się do stopnia kompresji samej treści. W ujęciu całościowym projekt raportuje około 25% oszczędności w pojedynczej turze i 63% w 20. turze, przy czym redukcja dotyczy wyłącznie tokenów wejściowych. Tokeny wyjściowe pozostają niezmienione.
Ile pamięci GPU potrzeba do samodzielnego hostowania modelu kompresji?
Wersja q4 zajmuje około 2,5 GB, a wersja bf16 około 8 GB, więc model mieści się na karcie 24 GB z dużym zapasem. Mniejsza karta również wystarczy, co zmienia kalkulację opłacalności na korzyść użytkownika. Filtr tool-schema nie wymaga GPU: korzysta z BAAI/bge-small-en-v1.5, czyli modelu embeddingowego o rozmiarze 130 MB, który działa na CPU. Zainstaluj paritok[toolselect] na zwykłym VPS, aby uzyskać redukcję bloków narzędzi kosztem niewielkiej ilości pamięci RAM.
Co się stanie, jeśli kompresor usunie coś, czego agent potrzebował?
Nic nie jest usuwane. Skompresowane segmenty są oznaczone tagiem [REF:id], a model odzyskuje pełny tekst za pomocą read_original lub expand_context. Przefiltrowane schematy narzędzi są zastępowane skrótami zamiast usuwania, a model odzyskuje pełną treść za pomocą gateway_search_tools. Rzeczywiste ryzyko jest mniej oczywiste niż brak pliku: model pracuje na stratnym podsumowaniu i może nie zorientować się, że powinien poprosić o oryginał. Właśnie to mierzy wskaźnik 86,5% zachowanej jakości w teście SWE-bench Lite.
Dlaczego pierwsze żądanie trwa piętnaście sekund?
Model embeddingowy obsługujący filtr narzędzi ładuje się przy pierwszym żądaniu, a nie podczas startu. Dokumentacja projektu wskazuje na czas rozgrzewki rzędu 10 do 15 sekund, po czym każde kolejne wywołanie trwa około 15 ms. Wyślij jedno testowe żądanie za pomocą curl po uruchomieniu proxy, aby uniknąć opóźnienia przy pierwszej właściwej turze agenta.
Czy powinienem korzystać z hostowanego serwera GPU zamiast hostowania własnego?
Eliminuje to koszty wynajmu GPU i utrzymania, wycenione na 0,30 USD za milion przetworzonych tokenów według stanu na sierpień 2026. Rozwiązanie to przesyła jednak prompty oraz pliki odczytywane przez agenta do podmiotu zewnętrznego, zanim trafią one do dostawcy modelu. Jeśli hostujesz rozwiązanie samodzielnie, aby utrzymać kod na kontrolowanej infrastrukturze, to ustawienie niweluje cel takiego działania. Samodzielne hostowanie pozwala zachować zarówno kontekst, jak i klucz API dostawcy na własnym serwerze.