Documentation

Documentation

Crush

Crush est l’agent de codage en terminal de Charm — et non le shell Rust du même nom. Sa configuration est en Bash ; pour le diriger vers un autre point de terminaison, il suffit donc d’ajouter un fournisseur avec un type, une URL de base et une clé.

La configuration de Crush est en Bash — une seule commande `provider add kunavo --type openai-compat --base-url "https://api.kunavo.com/v1"` dans un crushrc place l’agent terminal de Charm sur Claude et GPT.

~/.config/crush/crushrc
# A crushrc is Bash, not a settings file. Everything here is executed.
provider add kunavo \
  --type openai-compat \
  --base-url "https://api.kunavo.com/v1" \
  --api-key "${KUNAVO_API_KEY:?set KUNAVO_API_KEY}"

model add kunavo/claude-sonnet-5 \
  --name "Claude Sonnet 5" \
  --context-window 1000000 \
  --default-max-tokens 32000 \
  --price-input 1.4 \
  --price-output 7

model add kunavo/claude-haiku-4-5 \
  --name "Claude Haiku 4.5" \
  --context-window 200000 \
  --default-max-tokens 16000 \
  --price-input 0.7 \
  --price-output 3.5

model large kunavo/claude-sonnet-5
model small kunavo/claude-haiku-4-5
L’URL de base conserve le suffixe /v1. L’exemple compatible avec OpenAI documenté par Crush utilise --base-url "https://api.deepseek.com/v1", et son exemple compatible avec Anthropic se termine de la même façon : le suffixe relève donc de la convention du client, ce n’est pas une supposition. Sans lui, l’échec se traduit par une erreur 404 plutôt que par une erreur d’authentification.
Utilisez --type openai-compat, et non openai. Le README établit lui-même la distinction : openai sert à acheminer ou relayer les requêtes via OpenAI, tandis que openai-compat est destiné aux fournisseurs autres qu’OpenAI disposant d’API compatibles avec OpenAI. Kunavo relève du deuxième cas.
Un crushrc est un script Bash avec les fonctions intégrées de Crush, et Crush avertit qu’il s’agit de code auquel on fait confiance : il s’exécute dans un shell complet. C’est aussi ce qui permet à --api-key "$(op read ...)" de garder la clé hors du fichier. L’ancien crush.json est toujours chargé, mais le README le qualifie d’obsolète ; partez donc de crushrc.
Kunavo n’a pas testé Crush en conditions d’exécution — ni ce client ni aucun autre présenté sur ces pages. La vérification porte ici sur la configuration documentée par Crush et sur le point de terminaison publié par Kunavo ; une page de configuration n’est pas un résultat de test. Exécutez une tâche limitée avant d’en faire votre outil quotidien.
Pas encore de clé ? Créez un compte Kunavo, créez une clé (elle commence par sk-kn-) et ajoutez un crédit à partir de 10 $ — les appels sont payés sur ce solde et les appels échoués ne sont pas facturés. Le tableau de bord s’ouvre ensuite sur la configuration Crush.

Étape par étape

  1. Créez une clé sur /app/keys et copiez-la — elle ne s’affiche qu’une seule fois. Exportez-la sous le nom KUNAVO_API_KEY, ou lisez-la depuis un gestionnaire de mots de passe directement dans la configuration.
  2. Placez le bloc ci-dessus dans ~/.config/crush/crushrc. Crush lit ./.crushrc, puis ./crushrc, puis le fichier global. Un projet peut donc remplacer la configuration de la machine, et un dépôt cloné peut en fournir une.
  3. Lancez crush et appuyez sur ctrl+l pour ouvrir le sélecteur de modèles. Les lignes model large et model small ci-dessus définissent déjà les deux emplacements ; le sélecteur sert donc à changer de modèle, et non à effectuer la configuration.
  4. Si vous préférez éviter d’enregistrer les identifiants manuellement : la détection automatique s’exécute lorsque la liste des modèles d’un fournisseur openai-compat est vide, ou lorsque vous transmettez --discover-models true. Kunavo répond à GET /v1/models ; la liste se remplit donc automatiquement, et vos propres champs model add prévalent en cas de conflit.
  5. Exécutez une tâche limitée, puis consultez le montant enregistré sur votre compte à /app/billing. Le chiffre affiché dans le terminal est calculé à partir des valeurs --price-* que vous avez saisies ; c’est le registre qui fait foi pour la facturation.

Vérifié avec La section « Fournisseurs personnalisés » de Crush le 21 septembre 2026. Les paramètres tiers évoluent ; si le nom d’un champ ne correspond plus à ce que vous voyez ici, cette page fait autorité, pas celle-ci.

Voici la version courte. Le guide complet — choix du modèle, coût d’une session réelle et modes d’échec — se trouve dans Crush et OpenCode.

Vérifiez avant de déboguer le client

Une requête suffit à déterminer si l’échec vient de l’endpoint, de la clé ou du fichier de configuration. Si cette requête renvoie du JSON, la même URL de base et la même clé fonctionnent dans Crush.

# Settles whether a failure is the endpoint, the key, or the client.
curl -sS https://api.kunavo.com/v1/models \
  -H "Authorization: Bearer sk-kn-..."

Quel identifiant de modèle saisir dans le champ

Tous les modèles textuels sont accessibles sous forme d’identifiant de modèle — la liste à jour se trouve sur GET /v1/models, et le catalogue avec les prix sur la page des modèles. Les tarifs sont en USD par million de tokens, entrée / sortie.

Identifiant du modèleEntrée / sortie sur KunavoOù cela s’intègre dans Crush
claude-sonnet-5$1.40 / $7.00le modèle de l’emplacement large — le modèle quotidien pour le codage et l’édition
claude-haiku-4-5$0.70 / $3.50le modèle de l’emplacement petit, que Crush sollicite constamment pour les titres et les résumés
claude-opus-5$3.50 / $17.50basculer vers le modèle de l’emplacement large pour un refactor où un plan erroné coûterait cher
gpt-5-6-terra$0.70 / $4.20une deuxième famille avec la même clé, à un ajout de modèle près
La facturation se fait au token à partir d’un solde prépayé, sans frais mensuels — consultez la facturation. Avec un contexte répété — ce qu’envoient la plupart des éditeurs et clients de chat — la mise en cache des prompts influe davantage sur la facture que le choix du modèle.

Questions fréquentes

Comment ajouter un fournisseur API personnalisé au CLI Crush ?

Écrivez-le dans un crushrc, qui est un script Bash avec les commandes intégrées de Crush. Une ligne enregistre le point de terminaison — provider add kunavo --type openai-compat --base-url "https://api.kunavo.com/v1" --api-key "$KUNAVO_API_KEY" — et une commande model add par identifiant enregistre le modèle que vous souhaitez appeler, avec son nom d’affichage, sa fenêtre de contexte et ses prix par million de jetons, utilisés par Crush pour l’estimation à l’écran. Crush lit ./.crushrc, puis ./crushrc, puis ~/.config/crush/crushrc ; le même bloc fonctionne donc par projet ou par machine.

L’URL de base de Crush doit-elle se terminer par /v1 ?

Oui. Dans ses exemples de fournisseurs personnalisés, Crush indique le suffixe pour les deux types : https://api.deepseek.com/v1 pour le cas compatible avec OpenAI et https://api.anthropic.com/v1 pour celui compatible avec Anthropic. Pour une clé Kunavo, la valeur est https://api.kunavo.com/v1. C’est l’inverse de Claude Code, où ANTHROPIC_BASE_URL reçoit une origine sans chemin, car ce client ajoute lui-même le chemin — même passerelle, deux écritures, et l’absence de /v1 entraîne une réponse 404 plutôt que 401.

Dois-je utiliser --type openai ou --type openai-compat ?

openai-compat, pour toute passerelle tierce. Le fichier README de Crush réserve openai au transfert ou au routage des requêtes par OpenAI lui-même et indique d’utiliser openai-compat pour les fournisseurs autres qu’OpenAI qui proposent des API compatibles avec OpenAI. Le type détermine aussi le comportement au-delà du format sur le réseau : la détection automatique des modèles s’exécute pour un fournisseur openai-compat dont la liste de modèles est vide. Crush prend également en charge --type anthropic pour les points de terminaison compatibles avec Anthropic, avec l’option --extra-header anthropic-version 2023-06-01.

crush.json est-il toujours le bon emplacement pour cette configuration ?

Non. crush.json est le format d’origine, et la documentation de Crush le qualifie désormais de déconseillé et précise qu’il ne recevra pas de nouvelles fonctionnalités ; le format actuel est un crushrc. À noter que les deux sont exécutés plutôt qu’analysés : un crushrc s’exécute dans un shell complet et toute expression $(...) contenue dans crush.json est développée au chargement. C’est pourquoi la documentation déconseille de lancer Crush dans un répertoire dont vous n’avez pas lu la configuration, et pourquoi il est possible d’extraire une clé d’un gestionnaire de mots de passe depuis la configuration.

Pourquoi le coût affiché par Crush diffère-t-il du montant qui m’a été facturé ?

Parce qu’il s’agit de deux nombres différents provenant de deux sources différentes. L’estimation à l’écran pour un fournisseur enregistré manuellement est calculée à partir des valeurs --price-input et --price-output que vous avez saisies dans model add. Pour les fournisseurs intégrés, elle provient de Catwalk, le catalogue externe de fournisseurs de Crush. Aucune de ces sources ne consulte votre compte. Une faute de frappe dans une option --price-* produit un affichage erroné, pas une facturation incorrecte. Vérifiez le relevé dans /app/billing.

Crush peut-il utiliser des modèles Claude ou GPT via un fournisseur personnalisé ?

Oui, et rien dans Crush ne l’en empêche. Charm Hyper est le fournisseur officiel vers lequel l’assistant de configuration vous oriente, mais un fournisseur personnalisé est une option prise en charge de premier ordre et documentée, sans restriction liée à l’offre. L’identifiant du modèle est résolu au niveau du point de terminaison, pas dans le client. Ainsi, un identifiant Claude sur un fournisseur openai-compat est la combinaison prévue : le type désigne le protocole réseau, pas le fournisseur.