Sections de la base de connaissances ▾

Navigation

▸ Commencez ici Par rôles

Catégories

Outils 52
Glossaire 12

Outils

Crush + JoinGonka Gateway : agent Charm sur les modèles du réseau Gonka

Crush est un agent de codage terminal de Charm, l'équipe dont les bibliothèques pour interfaces console servent à construire des dizaines de milliers de programmes. Il lit et modifie les fichiers de projet, exécute des commandes, récupère le contexte auprès des serveurs de langage (LSP), connecte des outils externes via MCP et sait changer de modèle en pleine session sans perdre le contexte. Fonctionne dans les terminaux macOS, Linux et Windows, ainsi que sur Android et BSD ; licence — FSL-1.1-MIT. Le pédigrée du projet est notable : le dépôt d'archive opencode-ai/opencode renvoie directement à Crush — le projet a été poursuivi par son auteur original et l'équipe de Charm.

Crush accepte deux types de fournisseurs tiers — avec API compatible OpenAI et Anthropic. JoinGonka Gateway se connecte comme openai-compat : avec une commande d'installation ou une dizaine de lignes de configuration. Ensuite, l'agent fonctionne sur les modèles du réseau décentralisé Gonka — DeepSeek V4 Flash, GLM-5.3 Flash et MiniMax M2.7 — à un prix unique : $0.0069 par million de jetons d'entrée.

Deux particularités de Crush doivent être connues avant la première session : il répartit les modèles dans deux emplacements, large et small, et le modèle choisi dans l'interface est stocké dans un fichier d'état séparé, qui prévaut sur la configuration. Une section dédiée leur est consacrée. Les commandes et messages ci-dessous ont été vérifiés par une exécution réelle de Crush 0.96.1 via la passerelle le 23 septembre 2026. Après confirmation de l'adresse, 3M de jetons gratuits seront crédités sur le compte — assez pour tout refaire vous-même.

Démarrage rapide : installation et une seule commande

Étape 1 : installer Crush. Les méthodes officielles depuis le README du projet :

# 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

On y trouve aussi les dépôts de paquets pour Debian, Ubuntu, Fedora et RHEL, Nix et Scoop, et la page des releases propose des binaires prêts à l'emploi. Pour vérifier : crush --version, qui renvoie une ligne du type crush version v0.96.1.

Étape 2 : obtenir une clé. Inscrivez-vous sur gate.joingonka.ai/register, confirmez votre adresse et créez une clé avec le préfixe jg- dans la section « Clés API ». Une seule clé et un seul solde valent pour tous les modèles du réseau.

Étape 3 : lancer l'installeur.

npx @joingonka/setup --tool crush

L'installeur vous demandera la clé — elle n'est pas passée en argument de ligne de commande, pour ne pas rester dans l'historique du shell — et fera quatre choses :

  • inscrire le fournisseur joingonka dans ~/.config/crush/crush.json : type openai-compat, adresse de la passerelle, clé en clair et trois modèles du réseau avec leurs fenêtres de contexte, plafonds de réponse et prix par million de tokens, qu'il récupère en direct auprès de la passerelle au moment de l'installation — c'est sur cette base que Crush calcule le coût de la session. Le fichier recevra les droits 600 ;
  • définir les modèles : dans le slot large, DeepSeek V4 Flash ; dans le small, MiniMax M2.7 ; et GLM-5.3 Flash restera dans la liste pour une sélection manuelle. Il ne le fait que si le slot large est vide ou pointe vers notre modèle retiré du réseau ; un choix tiers est conservé, avec une indication en sortie sur la façon de basculer ;
  • vérifier que le choix prend effet : le modèle sélectionné dans l'interface de Crush est stocké dans le fichier d'état, qui prime sur la config — d'où la section sur large et small ;
  • faire une sauvegarde, laisser les autres fournisseurs et réglages tels quels, et terminer par une requête réelle vers la passerelle pour valider immédiatement la clé, l'adresse et le modèle.

Pour choisir un autre modèle, utilisez le flag --model avec les raccourcis deepseek, glm ou minimax ; un modèle explicitement indiqué est toujours écrit. L'installeur prend en compte les répertoires non standard comme le fait Crush lui-même : CRUSH_GLOBAL_CONFIG pour la config, CRUSH_GLOBAL_DATA pour le fichier d'état, ainsi que XDG_CONFIG_HOME et XDG_DATA_HOME. Pour les serveurs et les scripts, il existe un mode sans questions, où la clé est lue depuis une variable d'environnement :

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

Le format principal de Crush est désormais crushrc, mais l'installeur écrit crush.json : toutes les versions le comprennent. Si vous avez déjà un crushrc, Crush fusionnera les deux fichiers, crushrc l'emportant en cas de conflit de clés, et l'installeur n'y touche pas.

Configuration manuelle : crush.json ou crushrc

Tout ce que fait l'installateur peut être écrit à la main. Voici un ~/.config/crush/crush.json fonctionnel — ce fichier, nous l'avons fait passer par la passerelle :

{
  "$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" }
  }
}
ChampValeurÀ retenir
typeopenai-compatType destiné aux services tiers dotés d'une API compatible OpenAI. Le type openai, la documentation de Crush le réserve aux requêtes passant par OpenAI lui-même
base_urlhttps://gate.joingonka.ai/v1Avec /v1 à la fin : le chemin /chat/completions, Crush l'ajoute lui-même
api_keyvotre clé jg-…Crush fait passer la valeur par la substitution du shell, donc à la place de la clé vous pouvez écrire $JOINGONKA_API_KEY — la variable doit alors être exportée là d'où Crush est lancé
context_windowfenêtre du modèleC'est sur cette base que Crush affiche le remplissage du contexte et décide quand compresser l'historique
default_max_tokensplafond de réponsePart dans chaque requête sous max_tokens. Chez les modèles raisonneurs, le raisonnement entre aussi dans ce budget

Crush n'accepte que du JSON strict : un commentaire ou une virgule superflue, et il ne démarre pas. Les champs de prix (cost_per_1m_in, cost_per_1m_out et les deux champs pour le cache) ne servent qu'au compteur de coût : l'installateur y inscrit le prix réel de la passerelle, et sans eux Crush fonctionne et affiche zéro — seul l'éditeur avec le schéma de $schema les signalera comme obligatoires.

Le même fournisseur au format crushrc, c'est du Bash ordinaire avec les commandes intégrées de Crush. Le fichier ~/.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

Ici, le modèle s'écrit sous la forme provider/model-id : avant la première barre oblique, le nom du fournisseur, ensuite l'identifiant du réseau tel quel. La forme ${JOINGONKA_API_KEY:?…} garde la clé hors du fichier, mais sans variable exportée Crush ne démarre pas — mieux vaut une erreur au démarrage que des requêtes avec une clé vide.

Modèles large et small et fichier d'état

Le modèle dans Crush n'est pas choisi comme un tout, mais pour deux emplacements :

EmplacementCe qui s'y exécuteCe que le programme d'installation définitComment changer
largeAgent principal : toutes les actions incluant la lecture et l'édition de fichiers ainsi que les commandesDeepSeek V4 Flash : fenêtre de 380K et le plus grand plafond de réponse du réseau, 32768ctrl+l dans l'interface, -m pour crush run, models.large dans la config
smallTâches auxiliaires : titre de la session et sous-agent qui effectue des recherches sur le Web et lit les pages web. Si le petit modèle échoue à trouver un titre, Crush répète la requête au grandMiniMax M2.7 : il possède la plus grande capacité du réseau--small-model pour crush run, models.small dans la config, model small dans crushrc

Le troisième modèle du réseau, le modèle de raisonnement GLM-5.3 Flash, est choisi pour une logique complexe, en gardant à l'esprit que son plafond de réponse est de 8192 et qu'une partie est utilisée pour le raisonnement — plus de détails dans l' aperçu du modèle. Pour une exécution, le modèle est défini par son nom complet : crush run -m joingonka/zai-org/GLM-5.3-Flash "…". Tous les noms disponibles sont affichés par crush models joingonka.

Fichier d'état. Le modèle choisi dans l'interface via ctrl+l n'est pas enregistré par Crush dans crush.json, mais dans un fichier d'état machine : ~/.local/share/crush/crush.json, sous Windows — %LOCALAPPDATA%\crush\crush.json. Ce fichier prévaut sur la config utilisateur et crushrc : Crush les lit dans l'ordre /etc/crush/crush.json → ~/.config/crush/crush.json → ~/.config/crush/crushrc → fichier d'état, chaque fichier écrasant le précédent. Seuls les paramètres du projet prévalent — crush.json ou crushrc dans son répertoire. L'emplacement des fichiers sur votre machine est indiqué par crush dirs.

Dans notre test, nous avons ouvert la sélection des modèles — le fournisseur « JoinGonka (Gonka) » y figure avec la mention « ✓ Configured » — et avons choisi MiniMax M2.7. Crush a répondu « Large model changed to MiniMax M2.7 (Gonka) » et a écrit dans le fichier d'état :

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

Désormais, ce modèle prévaut sur ce qui est écrit dans crush.json. Le programme d'installation reconnaît cette situation et se comporte différemment :

  • sans --model il ne touche pas au fichier d'état — c'est votre choix de travail — mais avertit clairement avec quel modèle Crush démarrera réellement : Heads-up: Crush will still start with joingonka/MiniMaxAI/MiniMax-M2.7, not joingonka/deepseek-ai/DeepSeek-V4-Flash-0731. Il en va de même si GLM-5.3 Flash ou le modèle d'un autre fournisseur est sélectionné dans l'interface ;
  • avec --model explicite il corrige exactement une entrée dans le fichier d'état — models.large — après avoir sauvegardé une copie, et indique ce qu'il y avait avant et après. Sinon, l'indicateur ne produirait aucun effet silencieusement. Après cette exécution, Crush dans notre test a démarré avec le modèle spécifié dans l'indicateur.

Vérification : ce qui devrait se passer

Vérifiez d'abord que Crush voit bien le fournisseur :

crush models joingonka

La réponse tient en trois lignes :

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

Ensuite, faites un essai unique sans interface. Placez dans le répertoire du projet un fichier contenant un bug évident et demandez-lui de le trouver :

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

L'agent doit appeler lui-même l'outil de lecture de fichier et répondre sur le fond, avec le numéro de ligne. Lors de notre essai, les trois modèles du réseau ont trouvé le bug, et la tâche a pris 20 à 40 secondes. Le flag -q masque l'indicateur d'attente. En mode crush run, tous les appels d'outils sont approuvés automatiquement : lancez-le donc dans votre propre projet. Dans l'interface classique (commande crush), le modèle actif apparaît dans la barre d'état : ◇ DeepSeek V4 Flash (Gonka) via JoinGonka (Gonka). Crush conserve ses sessions et son journal dans le répertoire .crush du projet, protégé de git par son propre .gitignore ; le journal s'affiche avec crush logs. Côté passerelle, la requête est visible dans l'espace client : section « Utilisation », ventilations « Par modèles » et « Par clés ».

Si quelque chose ne tourne pas rond, le diagnostic se lit généralement directement dans le message :

Ce que vous voyezCe que cela signifieQue faire
unauthorized: Invalid API key.La passerelle n'a pas accepté la cléVérifiez api_key : la clé en entier, sans espaces. S'il s'agit d'une référence à une variable, celle-ci doit être exportée dans ce shell
invalid JSON in config file …/crush.jsonLe fichier contient un commentaire, une virgule superflue ou une coquilleCrush n'accepte que du JSON strict : corrigez le fichier. L'installateur ne supprime pas les commentaires lui-même, mais il vous avertit de leur présence ; un fichier totalement illisible, lui, n'est pas touché et la cause est indiquée
failed to load shell config …/crushrc: … exit status 1Erreur dans crushrc, le plus souvent une variable non définie contenant la clé sous la forme ${…:?}Exportez la variable avant le lancement ou corrigez la ligne sur laquelle le script plante
Failed to override models: large model "…" not foundCoquille dans le nom du modèle passé au flag -mCopiez le nom depuis la sortie de crush models joingonka
too many requests: Model "…" is currently overloaded in the Gonka network (rate limit)Le modèle a épuisé sa capacité disponible sur le réseau aux heures de pointeCrush relance lui-même la requête avec des pauses croissantes — environ une minute lors de notre essai — et n'abandonne qu'ensuite. Basculez vers un autre modèle via ctrl+l ou -m, ou patientez ; l'état est visible sur la page de statut
Crush s'est ouvert sur un autre modèle que celui annoncé par l'installateurLa sélection faite dans l'interface est stockée dans un fichier d'état et prend le pas sur la configChoisissez le modèle via ctrl+l ou relancez l'installation avec --model
402Le solde est épuiséRechargez le compte dans la section « Facturation » ; la clé, elle, reste valide

Combien cela coûte

Un agent consomme des jetons différemment d'un chat : pour chaque phrase, Crush ajoute un prompt système et les descriptions de ses outils, et une tâche prend généralement plusieurs étapes. Dans notre test, chaque requête au modèle transportait environ 11,5 mille jetons en entrée, et la tâche « lire un fichier et trouver l'erreur » a nécessité deux à trois requêtes et 23-35 mille jetons, presque entièrement en entrée. Le prix par jeton est donc crucial ici.

Via JoinGonka Gateway, les jetons coûtent $0.0069 par million en entrée et $0.021 par million en sortie — le prix est identique pour tous les modèles du réseau et est récupéré sur cette page depuis une source en temps réel.

ScénarioConsommationVia Gateway
Tâche unique : lire un fichier, trouver une erreur23-35K jetonscentimes de cent
Journée de travail actif3-7M jetonsquelques centimes
Mois de développement actif~150M jetonsenviron un dollar

Les estimations dans la colonne de droite sont basées sur les prix de septembre 2026. À titre de comparaison, voici comment payer les modèles dans Crush :

MéthodeModèle de paiementCe qui limite
Hyper — fournisseur officiel Charmabonnement, niveau gratuit disponibleconditions tarifaires chez Charm
Clé fournisseur directementpar jetons selon le prix du fournisseurla facture augmente avec la durée des sessions ; le prix dépend du modèle
JoinGonka Gatewaypar jetons, solde prépayéconsommation visible dans le tableau de bord ; pas d'abonnement ni de quotas mensuels

Le compteur de coûts dans l'interface Crush calcule selon les champs de prix de la configuration. Il contient le prix de la passerelle au moment de l'installation, et le prix en dollars sur le réseau fluctue avec le cours du GNK, donc le compteur est une estimation. La consommation exacte et le solde se trouvent dans le tableau de bord, dans les sections « Utilisation » et « Facturation ». Pourquoi DeepSeek V4 Flash est défini par défaut dans le slot large est détaillé dans la présentation du modèle.

Points à considérer

Permissions. Par défaut, l'interface de Crush demande une autorisation avant chaque appel d'outil. Le flag --yolo supprime toutes les questions d'un coup, et les outils auxquels vous faites confiance de manière ciblée se listent dans la config :

# crushrc
permissions allow view ls grep

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

Rappel : crush run approuve tout de lui-même. C'est une propriété de Crush, indépendante du fournisseur du modèle.

Timeout des requêtes. Crush coupe la requête si aucun fragment de réponse n'arrive du modèle pendant un long moment : en version 0.96.1, c'est deux minutes de silence (la documentation annonce 60 secondes, mais dans le code et lors de notre test, c'est deux minutes). Les pings techniques par lesquels la passerelle maintient la connexion ne remettent pas ce compteur à zéro — nous l'avons vérifié sur un banc local. Or la passerelle, aux heures de charge, attend jusqu'à 150 secondes le premier token du réseau : mieux vaut donc augmenter la marge :

# crushrc
option request-timeout 300

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

Signatures dans les commits. Les commits et les pull requests créés par Crush reçoivent par défaut la ligne Assisted-by: Crush:<model> et la mention « Generated with Crush ». Si vous n'en voulez pas :

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

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

Métriques. Crush envoie aux développeurs des statistiques d'usage pseudonymisées — uniquement des métadonnées, sans prompts ni réponses. Désactivation via la variable CRUSH_DISABLE_METRICS=1 ou DO_NOT_TRACK=1. De son côté, la passerelle ne conserve pas le contenu des prompts et des réponses — seuls des agrégats de consommation subsistent dans les statistiques.

La config, c'est du code. Crush exécute crushrc comme crush.json avec les droits de votre shell : un $(…) dans un champ de clé s'exécutera au chargement, et le crushrc du projet s'activera dès que vous ouvrirez Crush dans ce répertoire. Ne lancez pas l'agent dans un dépôt tiers sans avoir lu ses configs.

Crush se connecte à la passerelle JoinGonka avec une seule commande — npx @joingonka/setup --tool crush — ou via le bloc providers.joingonka dans ~/.config/crush/crush.json : type openai-compat, adresse https://gate.joingonka.ai/v1, clé jg-…, modèles avec des paramètres context_window et default_max_tokens corrects. La même chose peut être configurée avec plusieurs lignes provider add et model add dans crushrc. Le slot large est attribué à DeepSeek V4 Flash, le small à MiniMax M2.7, et GLM-5.3 Flash pour la logique complexe. Le piège principal est le fichier d'état : le modèle sélectionné via ctrl+l prévaut sur la configuration, donc l'installateur avec l'option explicite --model modifie également celui-ci. Pour vérifier, utilisez crush models joingonka et crush run ; il est recommandé d'augmenter le délai d'expiration à 300 secondes.

Vous voulez en savoir plus ?

Explorez d'autres sections ou commencez à gagner des GNK dès maintenant.

Obtenir une clé et des jetons gratuits →