Pi to agent do kodu w terminalu, którego używam na co dzień. Od Claude Code, Codeksa i podobnych narzędzi różni się głównie tym, czego nie ma: MCP, subagentów, trybu planu i okienek z prośbą o zgodę. Zmierzyłem, ile ta oszczędność daje w kontekście modelu, i opisuję, co w zamian trzeba zbudować albo zabezpieczyć samemu.
Zastrzeżenie na wejściu: szkolę zespoły z pracy z asystentami AI w repozytorium, a obok pi używam też Claude Code. Porównuję więc dwa narzędzia, które znam z codziennej pracy, i żadnemu z nich nie kibicuję.
Pi napisał Mario Zechner, autor libGDX, otwartego frameworka do gier. Pierwsza wersja trafiła na npm w listopadzie 2025. W tekście z 30 listopada Zechner tłumaczy, po co mu był własny agent. Claude Code, którego używał wcześniej, zamienił się według niego w „statek kosmiczny”, z którego 80 procent funkcji mu się nie przydaje. Drugim powodem były prompt systemowy i narzędzia, które zmieniały się z każdym wydaniem i psuły mu wypracowany sposób pracy.
8 kwietnia 2026 Zechner dołączył do Earendil, firmy założonej przez Armina Ronachera i jego wspólnika Colina, finansowanej między innymi przez fundusze Accel i Balderton. Projekt przeszedł razem z nim. Pakiet zmienił nazwę na @earendil-works/pi-coding-agent, a stary oznaczono jako wycofany. Dla firmy, która rozważa pi, ważniejszy jest dokument RFC 0015 o licencjonowaniu. Earendil zapisał w nim, że rdzeń pi zostaje na licencji MIT i to się nie zmieni. W tym samym dokumencie zapowiada jednak płatne dodatki na licencji Fair Source i części zamknięte, na przykład usługi serwerowe.
Stan na dziś: wersja 0.87.1 z 22 września 2026. Projekt zmienia się szybko. Od 6 sierpnia do 21 września cztery wydania miały w dzienniku zmian sekcję „Breaking Changes”. Dotyczyły interfejsów dla rozszerzeń, własnych dostawców modeli i integracji przez SDK, JSON albo RPC, a nie codziennej pracy w terminalu.
Agent przy każdym kroku wysyła modelowi prompt systemowy i definicje wszystkich narzędzi. To stały koszt w oknie kontekstu, płacony, zanim model przeczyta zadanie. Chciałem wiedzieć, jak duży jest w pi, więc go zmierzyłem.
Metoda: postawiłem lokalny serwer udający API Anthropic, który zapisuje każde żądanie, i skierowałem na niego oba narzędzia. Pi 0.87.1 i Claude Code 2.1.251 uruchomiłem w trybie nieinteraktywnym (-p), w pustym katalogu, z czystą konfiguracją, bez MCP, wtyczek i skilli, z tym samym poleceniem „Powiedz ok”. Tokeny policzyłem kodowaniem o200k_base z biblioteki tiktoken, bo tokenizator Claude'a nie jest publiczny. Trybu interaktywnego nie mierzyłem. Pomiar z 26 września 2026:
| Co trafia do modelu | pi 0.87.1 | Claude Code 2.1.251 |
|---|
| Prompt systemowy | 819 | 5 699 |
| Definicje narzędzi | 729 (4 narzędzia) | 23 579 (27 narzędzi) |
| Dopiski doklejone do wiadomości użytkownika | 0 | 1 876 |
| Razem | 1 548 | 31 154 |
| Część okna 200 tys. tokenów | 0,8% | 15,6% |
Claude Code wysyła na starcie 20 razy więcej. Pi dostaje cztery narzędzia: read, bash, edit i write. Claude Code dostaje 27, w tym subagentów, pobieranie stron, zadania cykliczne, osobne drzewa robocze gita i oddzielne narzędzie dla PowerShella. W rachunku kosztu agenta przyjąłem 8 tysięcy tokenów stałego początku zapytania. Sam Claude Code w domyślnej konfiguracji zajmuje w moim pomiarze prawie cztery razy tyle, zanim dołożysz swoje instrukcje i serwery MCP.
Trzy uwagi, żeby nie wyciągać z tabeli za dużo. Po pierwsze, liczby u Anthropic będą inne, bo tokenizator jest inny, ale oba narzędzia mierzę tą samą miarą. Po drugie, ten prefiks jest stały, więc trafia do cache'u po stronie dostawcy i przy odczycie kosztuje u Anthropic od 0,025 do 0,1 stawki wejściowej, zależnie od modelu. Większym problemem niż rachunek jest więc miejsce w oknie i uwaga modelu, o której pisałem przy higienie kontekstu. Po trzecie, te 27 narzędzi to funkcje, a nie balast. W pi każdą z nich trzeba dobudować i każda doda swoje tokeny.
Pi też urósł. Zechner w listopadzie 2025 pisał, że prompt i definicje narzędzi mieszczą się poniżej tysiąca tokenów. W wersji 0.87.1 wychodzi mi 1 548, bo doszły reguły dla edycji wielu miejsc naraz i rozbudowana sekcja o dokumentacji pi. Około 320 z tych tokenów to ścieżki do mojego katalogu tymczasowego, które są wyjątkowo długie, więc przy zwykłej instalacji wyjdzie trochę mniej. Cały prompt ma około 3 tysięcy znaków i każdy może go przeczytać w pliku system-prompt.ts.
Strona projektu wymienia wprost, czego autorzy nie zbudowali, i przy każdej pozycji podaje obejście:
| Brakuje | Co w zamian |
|---|
| MCP | narzędzia wiersza poleceń z plikiem README, skille albo rozszerzenie dodające MCP |
| Subagenci | kolejna instancja pi uruchomiona przez bash albo w tmux, rozszerzenie lub gotowy pakiet |
| Okienka zgody | kontener albo własny mechanizm potwierdzeń w rozszerzeniu |
| Tryb planu | plan zapisany w pliku albo rozszerzenie |
| Lista zadań | plik TODO.md albo rozszerzenie |
| Bash w tle | tmux |
Brak MCP Zechner uzasadnił w osobnym tekście. W listopadowym wpisie podaje własny pomiar: serwer Playwright MCP wnosi do kontekstu 21 narzędzi i 13,7 tysiąca tokenów, a Chrome DevTools MCP 26 narzędzi i 18 tysięcy. Proponuje zamiast tego zwykłe programy z krótkim README. Agent czyta instrukcję dopiero wtedy, gdy narzędzie jest mu potrzebne, a wywołuje je przez bash.
Przeciw subagentom Zechner ma argument z obserwowalności. Nie widać, co subagent przeczytał i co pominął, a główny agent sam decyduje, jaki kontekst mu przekazać. Zechner radzi zbierać kontekst w osobnej sesji, zapisać wynik do pliku i zacząć implementację od czystego okna. To ta sama logika, którą opisywałem przy spec-driven development.
Rozszerzenie to moduł w TypeScripcie, który może dodać narzędzie, komendę, skrót klawiszowy, dostawcę modeli albo element interfejsu. Nie wymaga kompilacji, a po zmianie wystarczy /reload. Najmniejszy przykład z dokumentacji to plik ~/.pi/agent/extensions/hello.ts:
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
pi.registerCommand("hello", {
description: "Show a greeting",
handler: async (name, ctx) => {
ctx.ui.notify(`Hello, ${name || "world"}!`, "info");
},
});
}
Twórcy zakładają, że rozszerzenie napisze sam pi. Prompt systemowy zawiera ścieżki do jego dokumentacji i przykładów, a na stronie projektu jest nagranie, na którym pi buduje sobie w ten sposób komendę do commitu i pusha. W repozytorium leży 79 przykładów, w tym potwierdzanie groźnych komend (permission-gate.ts), ochrona ścieżek (protected-paths.ts), tryb planu i subagenci. Gotowe zestawy instaluje się komendą pi install npm:<pakiet> albo pi install git:<repozytorium>.
Rozszerzenie działa w procesie pi z pełnymi uprawnieniami użytkownika i widzi prompty, pliki i dane logowania. Cudzy pakiet trzeba więc czytać przed instalacją tak samo jak każdą zależność. Sam projekt traktuje łańcuch dostaw poważnie: przypina dokładne wersje zależności, odrzuca wersje wydane tego samego dnia i instaluje zależności bez ich skryptów instalacyjnych.
Dokumentacja pi stawia sprawę jasno. Pi nie pyta o zgodę przed wywołaniem narzędzia, a śledzenie transkryptu i przeglądanie zmian nie tworzy granicy bezpieczeństwa. Zechner nazwał kiedyś zabezpieczenia w innych agentach „teatrem bezpieczeństwa”, bo agent, który może pisać i uruchamiać kod, może też wysłać dane na zewnątrz.
Granica jest w systemie, nie w agencie
Pi działa z uprawnieniami konta, które go uruchomiło. Jeśli nie chcesz, żeby model mógł czegoś dotknąć, uruchom pi w kontenerze albo maszynie wirtualnej i nie wkładaj tam kluczy, których zadanie nie potrzebuje.
Dokumentacja opisuje trzy warianty izolacji: całe pi w Dockerze, całe pi w piaskownicy OpenShell albo pi na hoście z narzędziami przekierowanymi do lokalnej mikromaszyny wirtualnej przez rozszerzenie Gondolin. Jest też mechanizm zaufania do projektu. Zanim pi wczyta z repozytorium ustawienia, rozszerzenia albo skille z katalogu .pi, pyta, czy ufasz temu folderowi.
Ten mechanizm ma lukę, o której dokumentacja pisze otwarcie. Pliki AGENTS.md i CLAUDE.md trafiają do modelu bez względu na decyzję o zaufaniu. Sklonowane obce repozytorium może więc wstrzyknąć instrukcje, zanim cokolwiek zatwierdzisz, dlatego cudzy kod lepiej otwierać w kontenerze.
Sesja jako drzewo. Każda rozmowa to plik JSONL, w którym wiadomości tworzą drzewo. Komenda /tree pozwala wrócić do dowolnego wcześniejszego miejsca i pójść w inną stronę bez kasowania tego, co było. Sesję można wyeksportować do HTML komendą /export.
Dwa rodzaje wiadomości w trakcie pracy. Enter wysyła wiadomość sterującą, która trafia do modelu po bieżącej odpowiedzi i jej narzędziach. Alt+Enter kolejkuje wiadomość na moment, gdy agent skończy całe zadanie. Na Windowsie ten skrót to Ctrl+Q.
Model zmieniany w trakcie sesji. Komenda /model albo Ctrl+P przełącza model bez zaczynania od nowa. Pi obsługuje kilkunastu dostawców, klucze API i logowanie subskrypcją.
Podtrzymywanie cache'u. W tekście o cache'u po stronie dostawcy liczyłem, ile kosztuje powrót do agenta po przerwie dłuższej niż pięć minut. Pi ma na to mechanizm, który sprawdziłem w kodzie. Przy 90 procentach czasu życia wpisu w cache'u powtarza ostatnie zapytanie z limitem jednego tokena odpowiedzi, co odnawia wpis. Robi to tylko wtedy, gdy szacowana oszczędność wynosi co najmniej 5 centów.
Domyślnie mechanizm działa, dopóki agent pracuje, na przykład gdy jedno wywołanie testów trwa dłużej niż pięć minut. Ustawienie cacheWarming: "idle" podtrzymuje cache także po zakończeniu zadania, najdłużej przez 30 minut. W przerwie pi zakłada, że wrócisz przed wygaśnięciem cache'u z prawdopodobieństwem 15 procent, więc odświeża głównie duże konteksty. Tę wartość autorzy według komentarza w kodzie zmierzyli na własnym użyciu. Wbudowany katalog modeli deklaruje dla Claude'a 300 i 3600 sekund, więc przy modelach Anthropic mechanizm działa od razu.
Jeden plik instrukcji na katalog. Pi szuka kolejno AGENTS.override.md, AGENTS.md i CLAUDE.md i bierze pierwszy, który znajdzie. Sprawdziłem to, kładąc oba pliki w jednym katalogu: do modelu trafił tylko AGENTS.md. Jeśli w repozytorium trzymasz oba, wszystko, co ma dotyczyć każdego agenta, musi być w AGENTS.md. Co do niego wkładać, opisałem w tekście o pliku z instrukcjami.
Windows bez WSL. Pi korzysta z Git Bash, a opcjonalnie może dać modelowi narzędzie powershell zamiast bash.
Pi dobrze pasuje do osób, które chcą wiedzieć, co model dostaje w kontekście, czytają transkrypty i nie boją się dopisać sobie brakującej funkcji. Pasuje też do zespołów budujących własnych agentów. Pod spodem są osobne biblioteki: jednolite API do wielu dostawców i pętla agenta, a pi da się sterować przez SDK, JSON albo RPC. Na pi działa między innymi OpenClaw.
Gorzej pasuje do zespołu, który chce zgód przed każdą komendą bez pisania czegokolwiek. Claude Code ma tryby uprawnień od razu po instalacji. Trzeba też wziąć pod uwagę sposób prowadzenia projektu: zgłoszenia i pull requesty od nowych kontrybutorów są zamykane automatycznie, a opiekunowie przeglądają je raz dziennie. Kierunek rozwoju wyznacza firma z inwestorami, która zapowiedziała płatne dodatki. Zespół, który potrzebuje gwarantowanego wsparcia, musi to wziąć pod uwagę przed wdrożeniem.
- Zainstaluj pi komendą
npm install -g --ignore-scripts @earendil-works/pi-coding-agent. Wymaga Node.js 22.19 lub nowszego. W katalogu projektu uruchom pi, a w środku /login.
- Pierwsze sesje prowadź w kontenerze albo na repozytorium, które znasz. Obcego kodu nie otwieraj na hoście, bo
AGENTS.md z tego repozytorium trafi do modelu bez pytania.
- Przenieś instrukcje do
AGENTS.md. Jeśli masz tylko CLAUDE.md, pi go przeczyta. Jeśli masz oba, przeczyta tylko AGENTS.md.
- Włącz podgląd cache'u: w
~/.pi/agent/settings.json ustaw "showCacheMissNotices": true i co jakiś czas sprawdź /session.
- Plan i listę zadań trzymaj w plikach
PLAN.md i TODO.md w repozytorium. Przetrwają zamknięcie sesji i zobaczy je każdy agent.
- Pierwszą brakującą funkcję zamów u pi jako rozszerzenie w
~/.pi/agent/extensions/. Przeczytaj kod, zanim wpiszesz /reload.
Za pi przemawia to, że w każdej chwili wiadomo, co model dostał w kontekście. Płaci się za to funkcjami, które trzeba dobudować, i bezpieczeństwem, które trzeba zapewnić samemu.