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.
# 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/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.--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.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.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
- Créez une clé sur
/app/keyset copiez-la — elle ne s’affiche qu’une seule fois. Exportez-la sous le nomKUNAVO_API_KEY, ou lisez-la depuis un gestionnaire de mots de passe directement dans la configuration. - 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. - Lancez
crushet appuyez surctrl+lpour ouvrir le sélecteur de modèles. Les lignesmodel largeetmodel smallci-dessus définissent déjà les deux emplacements ; le sélecteur sert donc à changer de modèle, et non à effectuer la configuration. - 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-compatest vide, ou lorsque vous transmettez--discover-models true. Kunavo répond àGET /v1/models; la liste se remplit donc automatiquement, et vos propres champsmodel addprévalent en cas de conflit. - 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.
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èle | Entrée / sortie sur Kunavo | Où cela s’intègre dans Crush |
|---|---|---|
claude-sonnet-5 | $1.40 / $7.00 | le modèle de l’emplacement large — le modèle quotidien pour le codage et l’édition |
claude-haiku-4-5 | $0.70 / $3.50 | le modèle de l’emplacement petit, que Crush sollicite constamment pour les titres et les résumés |
claude-opus-5 | $3.50 / $17.50 | basculer 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.20 | une deuxième famille avec la même clé, à un ajout de modèle près |
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.