Paritok: jak obniżyć koszty tokenów agenta AI?
Paritok kompresuje odczyty plików i dane wyjściowe narzędzi, redukując zużycie tokenów o 74 procent. Sprawdź mechanizm działania bramki v1.3.0 oraz wyliczenia opłacalności.
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 wystawia rachunek za dane, które do niego dotarły, więc mniejszy ładunek oznacza niższą fakturę. Na tym polega główna idea rozwiązania. Jest to założenie odmienne od stwierdzenia, że „kontekst wystarcza na dłużej”, 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 dnia 5 sierpnia 2026 roku. Wagi 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 rozmowy, plik odczytany w turze 3 znika. Jeśli agent potrzebuje tego pliku w turze 20, musi odczytać go ponownie, co oznacza ponowną opłatę za te tokeny. 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 serwerze proxy. Model odzyskuje segment poprzez wywołanie read_original lub expand_context. Zmienia to sposób występowania awarii. Mechanizm przycinania zawodzi poprzez zapominanie, o czym nigdy nie informuje. Kompresor zawodzi poprzez przekazanie modelowi stratnego podsumowania, przy czym model może zażądać oryginału, 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 użytkownik dowiedziałby się dopiero po cichym niepowodzeniu zadania.
Trzy dźwignie i która z nich jest darmowa
Pierwszą dźwignią jest filtr schematu narzędzi. Każde żądanie przenosi całą tablicę tools. W cyklu pracy 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 osadzeń o rozmiarze 130 MB, zachowuje pasujące narzędzia, a resztę zastępuje wycinkami. Blok zmniejsza się do około 8 000 tokenów. Ten model osadzeń działa na procesorze CPU.
Drugą dźwignią jest kompresja treści i to właśnie ta część wymaga modelu 4B na procesorze GPU. Odczyty plików, dane wyjściowe narzędzi oraz historia są przepisywane do 25,7% swojego pierwotnego rozmiaru. Stąd bierze się nagłówek o 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 bieżące 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 samego 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 przy tym 86.5% skuteczności rozwiązywania zadań w porównaniu do wersji nieskompresowanej. 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 przebiegi nie rozwiązały problemów, z którymi poradziły sobie przebiegi nieskompresowane – dotyczy to niemal jednego na siedem zadań. W benchmarku jest to tylko liczba w tabeli. W Twoim repozytorium jest to zadanie, które uruchamiasz 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 5. turze oraz 63% w 20. turze. Wskazuje również, gdzie wzrost ten 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 8. a 12. turą, 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 planować pracy w oparciu o niego.
Czy karta graficzna 24 GB zwraca się przy Paritok?
Karta 24 GB to standardowa jednostka 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 pamięci wynosiła 0,44 USD za godzinę, przy czym najtańsze oferty oscylowały wokół 0,20 USD. Przyjmijmy stawkę 0,44 USD. Praca przez cały miesiąc (730 godzin) generuje koszt 321 USD. Praca tylko w godzinach roboczych, czyli 8 godzin dziennie przez 22 dni, daje 176 godzin i koszt 77 USD.
Teraz przeliczmy redukcję tokenów na oszczędności w dolarach. 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ść w dolarach to 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 nasyconej sesji na poziomie 85% oszczędzasz 68% 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 zatrzymujesz instancję poza godzinami pracy. Przy wskaźniku turn-20 na poziomie 63% wartości te wynoszą odpowiednio 637 USD oraz 154 USD. Przy wskaźniku turn-5 na poziomie 39%, co odpowiada krótkim sesjom, miesięczne wydatki muszą przekroczyć 1,030 USD, 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, który już wykorzystujesz do innych zadań, obniża każdą wartość w zestawieniu. Zatrzymywanie instancji, gdy nikt nie programuje, jest najważniejszym czynnikiem optymalizacji, ponieważ redukuje koszty wynajmu o około trzy czwarte.
Jeden czynnik pogarsza sytuację. Proces kompresji wymaga mocy obliczeniowej. Każdy token, który model 4B kompresuje, musi zostać odczytany i 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 rozważasz opłacalność wynajmu GPU w porównaniu z tokenami API, punkt rentowności między GPU VPS a tokenami API opiera się na tej samej arytmetyce dla samej inferencji.
Uruchamianie bramki Paritok na serwerze VPS
Wymagany jest Python 3.10 lub nowszy. Ubuntu 24.04 dostarcza Python 3.12, więc standardowy obraz VPS jest wystarczający dla wersji działającej wyłącznie na procesorze (CPU-only).
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 posiada tagi v1.2.8 z 29 lipca 2026 oraz v1.3.0 z 5 sierpnia 2026. Projekt rozwijany w takim tempie zmienia nazwy kluczy konfiguracyjnych pomiędzy wydaniami. Zwykłe pip install paritok lub git clone z main spowoduje pobranie innej wersji bramki w przyszłym tygodniu i uniemożliwi weryfikację, 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-v1Ponieważ model lokalny generuje przepisanie dla każdego kompresowanego segmentu, długotrwała operacja kompresji objawia się jako zawieszenie tury agenta. Parametr Ollama's num_predict cap on output length pozwala ograniczyć ten czas.
Zapisz paritok.yaml obok niego. use_gpu_server: false zapewnia, że kompresja odbywa się na Twoim 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 powyższych kroków: pobiera model, jeśli go brakuje, i uruchamia proxy na porcie 8080. Sprawdź działanie proxy przed skierowaniem 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 sumaryczne dane o kompresji oraz szacunkowe oszczędności wyliczone przez proxy. Traktuj te szacunki jako ocenę własnej pracy przez proxy i weryfikuj je na stronie rozliczeniowej dostawcy.
Jeśli priorytetem jest przepustowość, a nie wygoda, użyj vLLM do serwowania adaptera na modelu bazowym.
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 równoległymi żądaniami, co staje się istotne, gdy z serwera korzysta więcej niż jeden agent. The practical difference between Ollama and vLLM to czynnik decydujący o wyborze rozwiązania.
Skieruj agenta na proxy, używając 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, dlatego projekt zapisuje ~/.codex/config.toml za Ciebie, gdy codex.enabled: true jest ustawione w paritok.yaml. Eksportowanie samej zmiennej powoduje, że Codex komunikuje się bezpośrednio z dostawcą, co objawia się licznikiem /stats, który nie zmienia się podczas pracy.
Nasłuchuj wyłącznie na 127.0.0.1, nigdy na 0.0.0.0. Proxy przekazuje klucz API dostawcy w górę strumienia, więc proxy dostępne z Internetu staje się otwartym przekaźnikiem dla tego klucza: każdy, kto znajdzie port, może wykorzystać Twój limit, nawet nie widząc samego klucza. Uzyskaj dostęp z laptopa przez tunel SSH lub VPN zamiast otwierać port na świat.
Uruchom usługę przez systemd, aby przetrwała restart systemu. 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 usługę 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; journalctl -u paritok -n 50 wyświetli przyczynę błędu.
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 podmiotu trzeciego, 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 dwóch aspektów jest priorytetowy, ponieważ zmiana flagi to operacja jednowierszowa, ale jej konsekwencje są znacznie poważniejsze.
Jak samodzielnie zmierzyć wyniki przed i po
Opublikowane liczby pochodzą z testów projektu, przeprowadzonych w środowisku SWE-bench Lite. Twoje repozytorium nie jest SWE-bench Lite. Dokonaj własnych pomiarów.
- Przepracuj jeden typowy 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 wartości z panelu użycia u dostawcy, a nie jako łączną kwotę w dolarach.
- Przepracuj kolejny tydzień z aktywnym proxy, wykonując ten sam rodzaj zadań.
- Porównaj wiersze dotyczące danych wejściowych i odczytów z pamięci podręcznej. Liczba tokenów wyjściowych powinna pozostać zbliżona, ponieważ nic ich nie kompresuje. Jeśli dane wyjściowe znacząco się zmieniły, oznacza to, że poza proxy zmieniło się coś jeszcze.
- Policz zadania, które wymagały powtórzenia. 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 prompt-cache kosztuje 10% stawki wejściowej, czyli 0,30 USD za milion. Różnica w kosztach tokenów wejściowych i 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ęść kontekstu jest na tyle duża, aby opłacało się ją kompresować.
Prompt caching komplikuje w szczególności obliczenia dotyczące filtrowania narzędzi. Blok narzędzi znajduje się na początku żądania, więc po pierwszej turze zazwyczaj następuje trafienie do pamięci podręcznej (cache hit) przy 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 cache. 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 ponownie 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 wartości wydajności pochodzi bezpośrednio od twórców projektu. Wyniki SWE-bench Lite nie zostały niezależnie zweryfikowane, a ze względu na datowanie pierwszych tagów na lipiec 2026, kod nie posiada 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 dane są błędne. Oznacza to, że są niepotwierdzone, dlatego należy traktować je z większym dystansem niż wyniki wygenerowane samodzielnie.
Przed podjęciem prób diagnozy własnej konfiguracji warto poznać jedno udokumentowane zachowanie. Model osadzeń (embedding model) wykorzystywany przez filtr narzędzi ładuje się przy pierwszym żądaniu, a nie podczas uruchamiania. Dokumentacja projektu wskazuje na czas rozgrzewki rzędu 10 do 15 sekund, po czym czas odpowiedzi wynosi około 15 ms na 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 limit tokenów wejściowych u dostawcy faktycznie maleje oraz czy agent nadal kończy pracę. Te czynniki określają przydatność rozwiązania w danej konfiguracji znacznie lepiej niż jakikolwiek opublikowany benchmark.
W kwestii miejsca tego rozwiązania wśród innych narzędzi: samodzielnie hostowana bramka LiteLLM kieruje i mierzy żądania bez zmiany ich zawartości. Oba rozwiązania rozwiązują zatem inne problemy i mogą być łączone w łańcuch, przy czym Paritok powinien znajdować się najbliżej agenta. Jeśli rzeczywistym 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 to, co otrzymał. Skala tej redukcji jest mniejsza, niż sugerują nagłówki. Wartość 74% to stopień kompresji treści poddanych procesowi. W ujęciu całościowym projekt raportuje około 25% oszczędności w pojedynczej turze i 63% w turze 20, przy czym redukcji podlegają wyłącznie tokeny wejściowe. Tokeny wyjściowe pozostają niezmienione.
Ile zasobów 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ż zadziała, co zmienia rachunek opłacalności na korzyść użytkownika. Filtr tool-schema nie wymaga GPU: korzysta z BAAI/bge-small-en-v1.5, 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 potrzebuje agent?
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 je 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, a następnie około 15 ms na każde kolejne wywołanie. 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. Powoduje to jednak wysyłanie promptów oraz plików odczytywanych przez agenta do strony trzeciej, zanim dotrą one do dostawcy modelu. Jeśli hostujesz samodzielnie, aby utrzymać kod na kontrolowanej przez siebie infrastrukturze, to ustawienie niweluje powód, dla którego rozpocząłeś proces. Samodzielne hostowanie pozwala zachować zarówno kontekst, jak i klucz API dostawcy na własnym serwerze.