Sekcje bazy wiedzy ▾

Nawigacja

▸ Zacznij tutaj Według ról

Kategorie

Narzędzia 52
Słownik 12

Narzędzia

Crush + JoinGonka Gateway: agent Charm na modelach sieci Gonka

Crush — terminalowy agent kodujący od Charm, zespołu, na którego bibliotekach do interfejsów konsolowych oparto dziesiątki tysięcy programów. Czyta i poprawia pliki projektu, uruchamia polecenia, pobiera kontekst z serwerów językowych (LSP), podłącza zewnętrzne narzędzia przez MCP i potrafi zmienić model w trakcie sesji, nie tracąc kontekstu. Działa w terminalach macOS, Linux i Windows, a także na Androidzie i BSD; licencja — FSL-1.1-MIT. Projekt ma znaczącą historię: archiwalne repozytorium opencode-ai/opencode bezpośrednio odsyła do Crush — projekt kontynuowali jego pierwszy autor oraz zespół Charm.

Crush akceptuje zewnętrznych dostawców dwóch rodzajów — z API kompatybilnym z OpenAI oraz Anthropic. JoinGonka Gateway łączy się jako openai-compat: jedną komendą instalatora lub kilkunastoma liniami konfiguracji. Po tym agent pracuje na modelach zdecentralizowanej sieci Gonka — DeepSeek V4 Flash, GLM-5.3 Flash oraz MiniMax M2.7 — w jednolitej cenie: $0.0069 za milion tokenów wejściowych.

Warto znać dwie cechy Crush przed pierwszą sesją: modele układa w dwóch slotach, large i small, a model wybrany w interfejsie przechowuje w oddzielnym pliku stanu, który jest ważniejszy od konfiguracji. Poświęcono im oddzielną sekcję. Polecenia i komunikaty poniżej zostały zweryfikowane poprzez uruchomienie Crush 0.96.1 przez bramę 23 września 2026 roku. Po potwierdzeniu adresu na konto trafią 3M darmowych tokenów — wystarczą, aby powtórzyć to wszystko samodzielnie.

Szybki start: instalacja i jedna komenda

Krok 1: zainstalować Crush. Oficjalne metody z README projektu:

# Homebrew
brew install charmbracelet/tap/crush

# npm
npm install -g @charmland/crush

# Arch Linux
yay -S crush-bin

# Windows
winget install charmbracelet.crush

# Go
go install github.com/charmbracelet/crush@latest

Tam też opisano repozytoria pakietów dla Debian, Ubuntu, Fedora i RHEL, Nix oraz Scoop, a na stronie wydań znajdują się gotowe binarki. Weryfikacja — crush --version, w odpowiedzi przyjdzie wiersz w postaci crush version v0.96.1.

Krok 2: zdobyć klucz. Zarejestruj się na gate.joingonka.ai/register, potwierdź adres i utwórz klucz z prefiksem jg- w sekcji „Klucze API”. Jeden klucz i jedno saldo działają dla wszystkich modeli sieci.

Krok 3: uruchomić instalator.

npx @joingonka/setup --tool crush

Instalator zapyta o klucz — nie przekazuje się go w argumentach wiersza poleceń, żeby nie zaległ w historii powłoki — i zrobi cztery rzeczy:

  • wpisze dostawcę joingonka do ~/.config/crush/crush.json: typ openai-compat, adres bramy, klucz jawnie i trzy modele sieci z oknami kontekstu, limitami odpowiedzi i cenami za milion tokenów, które w momencie instalacji pobiera z bramy na żywo — na ich podstawie Crush liczy koszt sesji. Plik otrzyma uprawnienia 600;
  • przypisze modele: w slocie large — DeepSeek V4 Flash, w small — MiniMax M2.7, a GLM-5.3 Flash pozostanie na liście do ręcznego wyboru. Robi to tylko wtedy, gdy slot large jest pusty lub wskazuje na nasz model, który zniknął z sieci; obcy wybór zostaje, a w wyniku pojawi się podpowiedź, jak się przełączyć;
  • sprawdzi, że wybór zadziała: model z interfejsu Crush trzyma w pliku stanu, który nadpisuje konfigurację — o tym jest sekcja o large i small;
  • zrobi kopię zapasową, pozostałych dostawców i ustawienia zostawi bez zmian i zakończy żywym zapytaniem do bramy, żeby od razu sprawdzić klucz, adres i model.

Inny model ustawia flaga --model ze skrótem deepseek, glm lub minimax; jawnie wskazany model jest zapisywany zawsze. Niestandardowe katalogi instalator uwzględnia tak samo jak sam Crush: CRUSH_GLOBAL_CONFIG dla konfiguracji, CRUSH_GLOBAL_DATA dla pliku stanu, a także XDG_CONFIG_HOME i XDG_DATA_HOME. Dla serwerów i skryptów jest tryb bez pytań, w którym klucz pobiera się ze zmiennej środowiskowej:

JOINGONKA_API_KEY=jg-your-key npx @joingonka/setup --tool crush --model glm --non-interactive

Głównym formatem Crush jest teraz crushrc, ale instalator pisze crush.json: rozumieją go wszystkie wersje. Jeśli masz już crushrc, Crush scali oba pliki, przy zgodnych kluczach wygra crushrc, a sam instalator go nie rusza.

Konfiguracja ręczna: crush.json lub crushrc

Wszystko, co robi instalator, można napisać ręcznie. Oto działający plik ~/.config/crush/crush.json — właśnie ten plik przepuściliśmy przez bramę:

{
  "$schema": "https://charm.land/crush.json",
  "providers": {
    "joingonka": {
      "name": "JoinGonka (Gonka)",
      "type": "openai-compat",
      "base_url": "https://gate.joingonka.ai/v1",
      "api_key": "jg-your-key",
      "models": [
        { "id": "deepseek-ai/DeepSeek-V4-Flash-0731", "name": "DeepSeek V4 Flash (Gonka)",
          "context_window": 380000, "default_max_tokens": 32768,
          "can_reason": true, "supports_attachments": false },
        { "id": "MiniMaxAI/MiniMax-M2.7", "name": "MiniMax M2.7 (Gonka)",
          "context_window": 200000, "default_max_tokens": 8192,
          "can_reason": false, "supports_attachments": false },
        { "id": "zai-org/GLM-5.3-Flash", "name": "GLM-5.3 Flash (Gonka)",
          "context_window": 390000, "default_max_tokens": 8192,
          "can_reason": true, "supports_attachments": false }
      ]
    }
  },
  "models": {
    "large": { "provider": "joingonka", "model": "deepseek-ai/DeepSeek-V4-Flash-0731" },
    "small": { "provider": "joingonka", "model": "MiniMaxAI/MiniMax-M2.7" }
  }
}
PoleWartośćNa co uważać
typeopenai-compatTyp dla zewnętrznych usług z API zgodnym z OpenAI. Typ openai dokumentacja Crush zostawia dla zapytań kierowanych przez samo OpenAI
base_urlhttps://gate.joingonka.ai/v1Z /v1 na końcu: ścieżkę /chat/completions Crush dopisuje sam
api_keytwój klucz jg-…Crush przepuszcza wartość przez podstawienie powłoki, więc zamiast klucza możesz wpisać $JOINGONKA_API_KEY — wtedy zmienna musi być wyeksportowana tam, skąd uruchamiasz Crush
context_windowokno modeluNa tej podstawie Crush pokazuje zapełnienie kontekstu i decyduje, kiedy kompresować historię
default_max_tokenslimit odpowiedziTrafia do każdego zapytania jako max_tokens. W modelach rozumujących w ten budżet wlicza się też rozumowanie

Crush przyjmuje wyłącznie ścisły JSON: komentarz albo wiszący przecinek — i nie wystartuje. Pola ceny (cost_per_1m_in, cost_per_1m_out i dwa pola dla cache) są potrzebne tylko licznikowi kosztów: instalator wpisuje tam aktualną cenę bramy, a bez nich Crush działa i pokazuje zero — jedynie edytor ze schematem z $schema podświetli je jako obowiązkowe.

Ten sam provider w formacie crushrc to zwykły Bash z wbudowanymi komendami Crush. Plik ~/.config/crush/crushrc:

provider add joingonka \
  --name "JoinGonka (Gonka)" \
  --type openai-compat \
  --base-url "https://gate.joingonka.ai/v1" \
  --api-key "${JOINGONKA_API_KEY:?set JOINGONKA_API_KEY}"

model add joingonka/deepseek-ai/DeepSeek-V4-Flash-0731 \
  --name "DeepSeek V4 Flash (Gonka)" \
  --context-window 380000 --default-max-tokens 32768 --can-reason true

model add joingonka/MiniMaxAI/MiniMax-M2.7 \
  --name "MiniMax M2.7 (Gonka)" \
  --context-window 200000 --default-max-tokens 8192

model add joingonka/zai-org/GLM-5.3-Flash \
  --name "GLM-5.3 Flash (Gonka)" \
  --context-window 390000 --default-max-tokens 8192 --can-reason true

model large joingonka/deepseek-ai/DeepSeek-V4-Flash-0731
model small joingonka/MiniMaxAI/MiniMax-M2.7

Model podajemy tu w formie provider/model-id: do pierwszego ukośnika — nazwa providera, dalej — identyfikator sieci taki, jaki jest. Forma ${JOINGONKA_API_KEY:?…} trzyma klucz poza plikiem, ale bez wyeksportowanej zmiennej Crush nie wystartuje — lepiej błąd na starcie niż zapytania z pustym kluczem.

Modele large i small oraz plik stanu

Model w Crush wybierany jest nie jeden do wszystkiego, lecz dla dwóch slotów:

SlotCo jest na nim wykonywaneCo ustawia instalatorJak zmienić
largeGłówny agent: wszystkie operacje z czytaniem i edycją plików oraz komendamiDeepSeek V4 Flash: okno 380K i największy w sieci limit odpowiedzi, 32768ctrl+l w interfejsie, -m w crush run, models.large w konfiguracji
smallZadania pomocnicze: nazwa sesji i pod-agent, który przeszukuje sieć i czyta strony internetowe. Jeśli mały model nie poradził sobie z nazwą, Crush powtarza zapytanie do dużegoMiniMax M2.7: posiada największą pojemność w sieci--small-model w crush run, models.small w konfiguracji, model small w crushrc

Trzeci model sieci, wnioskujący GLM-5.3 Flash, wybiera się do skomplikowanej logiki, pamiętając, że limit odpowiedzi wynosi 8192 i część z niego jest zużywana na rozumowanie — szczegóły w przeglądzie modelu. Na jedno uruchomienie model określa się pełną nazwą: crush run -m joingonka/zai-org/GLM-5.3-Flash "…". Wszystkie dostępne nazwy wypisuje crush models joingonka.

Plik stanu. Model wybrany w interfejsie za pomocą ctrl+l, Crush zapisuje nie w crush.json, lecz w maszynowym pliku stanu: ~/.local/share/crush/crush.json, w Windows — %LOCALAPPDATA%\crush\crush.json. Ten plik jest ważniejszy niż konfiguracja użytkownika i crushrc: Crush czyta je w kolejności /etc/crush/crush.json → ~/.config/crush/crush.json → ~/.config/crush/crushrc → plik stanu, przy czym każdy kolejny nadpisuje poprzedni. Wyżej stoją tylko ustawienia projektu — crush.json lub crushrc w jego katalogu. Gdzie znajdują się pliki na twojej maszynie, pokaże crush dirs.

W naszym przebiegu otworzyliśmy wybór modeli — dostawca „JoinGonka (Gonka)” znajduje się tam z oznaczeniem „✓ Configured” — i wybraliśmy MiniMax M2.7. Crush odpowiedział „Large model changed to MiniMax M2.7 (Gonka)” i zapisał w pliku stanu:

{"models":{"large":{"model":"MiniMaxAI/MiniMax-M2.7","provider":"joingonka","max_tokens":8192}}, …}

Teraz ten model jest ważniejszy niż to, co zapisano w crush.json. Instalator rozpoznaje taką sytuację i zachowuje się różnie:

  • bez --model pliku stanu nie dotyka — to twój roboczy wybór — ale wyraźnie ostrzega, z jakim modelem Crush faktycznie się otworzy: Heads-up: Crush will still start with joingonka/MiniMaxAI/MiniMax-M2.7, not joingonka/deepseek-ai/DeepSeek-V4-Flash-0731. Tak samo postąpi, jeśli w interfejsie wybrano GLM-5.3 Flash lub model innego dostawcy;
  • z jawnym --model poprawia w pliku stanu dokładnie jeden wpis — models.large — po uprzednim zachowaniu kopii i pisze, co było i co się zmieniło. W przeciwnym razie flaga nie zadziałałaby po cichu. Po takim uruchomieniu Crush w naszym przebiegu otworzył się na modelu wskazanym we fladze.

Weryfikacja: co powinno się stać

Najpierw upewnij się, że Crush widzi providera:

crush models joingonka

W odpowiedzi dostaniesz trzy linie:

joingonka/MiniMaxAI/MiniMax-M2.7
joingonka/deepseek-ai/DeepSeek-V4-Flash-0731
joingonka/zai-org/GLM-5.3-Flash

Następnie jednorazowy przebieg bez interfejsu. Umieść w katalogu projektu plik z oczywistym błędem i poproś o jego znalezienie:

crush run -q "Read calc.py and tell me in one sentence whether it has a bug."

Agent sam powinien wywołać narzędzie czytania pliku i odpowiedzieć konkretnie, z numerem linii. W naszym przebiegu błąd znalazły wszystkie trzy modele sieci, a zadanie zajęło 20-40 sekund. Flaga -q ukrywa wskaźnik oczekiwania. W trybie crush run wszystkie wywołania narzędzi są zatwierdzane automatycznie, więc uruchamiaj go we własnym projekcie. W zwykłym interfejsie (polecenie crush) aktywny model widać w linii stanu: ◇ DeepSeek V4 Flash (Gonka) via JoinGonka (Gonka). Sesje i dziennik Crush przechowuje w katalogu .crush projektu, odizolowanym od gita własnym .gitignore; dziennik wyświetla crush logs. Po stronie bramy żądanie jest widoczne w panelu: sekcja „Użycie”, podział „Według modeli” i „Według kluczy”.

Jeśli coś poszło nie tak, diagnozę zwykle można odczytać wprost z komunikatu:

Co widaćCo to znaczyCo zrobić
unauthorized: Invalid API key.Brama nie przyjęła kluczaSprawdź api_key: klucz w całości, bez spacji. Jeśli wskazuje na zmienną, musi być wyeksportowana w tej powłoce
invalid JSON in config file …/crush.jsonW pliku jest komentarz, wiszący przecinek lub literówkaCrush przyjmuje tylko ścisły JSON: popraw plik. Instalator sam nie usuwa komentarzy, ale ostrzega o nich, a pliku, którego zupełnie nie da się sparsować, nie rusza i podaje przyczynę
failed to load shell config …/crushrc: … exit status 1Błąd w crushrc, najczęściej niezdefiniowana zmienna z kluczem w formie ${…:?}Wyeksportuj zmienną przed uruchomieniem lub popraw linię, na której skrypt się wywala
Failed to override models: large model "…" not foundLiterówka w nazwie modelu przy fladze -mSkopiuj nazwę z wyniku crush models joingonka
too many requests: Model "…" is currently overloaded in the Gonka network (rate limit)Modelowi w godzinach szczytu skończyła się wolna przepustowość w sieciCrush sam powtarza żądanie z rosnącymi pauzami — w naszym przebiegu około minuty — i dopiero potem się poddaje. Przełącz się na inny model przez ctrl+l lub -m albo poczekaj; stan widać na stronie statusu
Crush otworzył się na innym modelu niż ten, o którym poinformował instalatorWybór z interfejsu leży w pliku stanu i nadpisuje konfigWybierz model przez ctrl+l lub powtórz instalację z --model
402Na koncie skończyły się środkiDoładuj konto w sekcji „Rozliczenia”; klucz przy tym działa

Ile to kosztuje

Agent zużywa tokeny inaczej niż czat: do każdej frazy Crush dodaje prompt systemowy i opisy swoich narzędzi, a zadanie zazwyczaj wymaga kilku kroków. W naszym teście każde zapytanie do modelu niosło około 11,5 tysiąca tokenów wejściowych, a zadanie „odczytaj plik i znajdź błąd” zajęło dwa-trzy zapytania i 23-35 tysięcy tokenów, z czego prawie wszystko to wejście. Dlatego cena za token ma tutaj kluczowe znaczenie.

Przez JoinGonka Gateway tokeny kosztują $0.0069 za milion na wejściu i $0.021 za milion na wyjściu — cena jest taka sama dla wszystkich modeli w sieci i jest pobierana na tej stronie ze źródła na żywo.

ScenariuszZużyciePrzez Gateway
Zadanie jednorazowe: odczyt pliku, znalezienie błędu23-35K tokenówsetne części centa
Dzień aktywnej pracy3-7M tokenówkilka centów
Miesiąc aktywnej pracy~150M tokenówokoło dolara

Szacunki w prawej kolumnie dotyczą cen z września 2026. Dla porównania — jak w ogóle można płacić za modele w Crush:

SposóbModel płatnościCo ogranicza
Hyper — oficjalny dostawca Charmsubskrypcja, dostępny darmowy planwarunki taryfy po stronie Charm
Klucz dostawcy bezpośrednioza tokeny według cennika dostawcyrachunek rośnie wraz z długością sesji; cena zależy od modelu
JoinGonka Gatewayza tokeny, przedpłacone saldozużycie widać w panelu; brak subskrypcji i miesięcznych limitów

Licznik kosztów w interfejsie Crush oblicza dane na podstawie pól ceny w pliku konfiguracyjnym. Trafia tam cena bramy w momencie instalacji, a dolarowa cena w sieci zmienia się wraz z kursem GNK, więc licznik jest tylko orientacyjny. Dokładne zużycie i pozostałe środki znajdują się w panelu, w sekcjach „Użycie” i „Billing”. Dlaczego w slocie large domyślnie ustawia się DeepSeek V4 Flash, zostało szczegółowo wyjaśnione w przeglądzie modelu.

O czym warto pamiętać podczas pracy

Uprawnienia. W interfejsie Crush domyślnie pyta o zgodę przed wywołaniem narzędzia. Flaga --yolo wyłącza wszystkie pytania naraz, a punktowo zaufane narzędzia wymienia się w konfigu:

# crushrc
permissions allow view ls grep

# crush.json
"permissions": { "allowed_tools": ["view", "ls", "grep"] }

Przypominamy, że crush run zatwierdza wszystko sam. To właściwość Crush, nie zależy od dostawcy modelu.

Timeout żądania. Crush przerywa żądanie, jeśli od modelu długo nie przychodzi żaden fragment odpowiedzi: w wersji 0.96.1 to dwie minuty ciszy (dokumentacja podaje 60 sekund, ale w kodzie i w naszym teście — dwie minuty). Służbowe pingi, którymi brama podtrzymuje połączenie, nie zerują tego licznika — sprawdziliśmy na lokalnym stanowisku. Brama w godzinach szczytu czeka na pierwszy token z sieci do 150 sekund, więc warto zwiększyć zapas:

# crushrc
option request-timeout 300

# crush.json
"options": { "request_timeout": 300 }

Podpisy w commitach. Commity i pull requesty tworzone przez Crush domyślnie otrzymują wiersz Assisted-by: Crush:<model> oraz dopisek „Generated with Crush”. Jeśli tego nie chcesz:

# crushrc
option attribution-trailer-style none
option attribution-generated-with false

# crush.json
"options": { "attribution": { "trailer_style": "none", "generated_with": false } }

Metryki. Crush wysyła deweloperom pseudonimowe statystyki użycia — tylko metadane, bez promptów i odpowiedzi. Wyłącza się je zmienną CRUSH_DISABLE_METRICS=1 lub DO_NOT_TRACK=1. Brama ze swojej strony nie przechowuje treści promptów ani odpowiedzi — w statystykach zostają tylko agregaty zużycia.

Konfig to kod. I crushrc, i crush.json Crush wykonuje z uprawnieniami twojej powłoki: $(…) w polu klucza uruchomi się przy wczytywaniu, a projektowy crushrc zadziała, gdy tylko otworzysz Crush w tym katalogu. Nie uruchamiaj agenta w cudzym repozytorium, nie przeczytawszy jego konfigów.

Crush łączy się z JoinGonka Gateway za pomocą jednej komendy — npx @joingonka/setup --tool crush — lub bloku providers.joingonka w ~/.config/crush/crush.json: typ openai-compat, adres https://gate.joingonka.ai/v1, klucz jg-…, modele z rzetelnymi context_window i default_max_tokens. To samo zapisuje się kilkoma wierszami provider add oraz model add w crushrc. Slot large obsługują DeepSeek V4 Flash, small — MiniMax M2.7, a GLM-5.3 Flash — do skomplikowanej logiki. Główna pułapka to plik stanu: model wybrany za pomocą ctrl+l jest ważniejszy niż konfiguracja, dlatego instalator z jawnym --model poprawia również jego. Weryfikacja — crush models joingonka i crush run; limit czasu zapytania warto zwiększyć do 300 sekund.

Chcesz wiedzieć więcej?

Zapoznaj się z innymi sekcjami lub zacznij zarabiać GNK już teraz.

Uzyskaj klucz i darmowe tokeny →