Documentazione
Crush
Crush è l’agente di programmazione da terminale di Charm, non la shell Rust con lo stesso nome. La sua configurazione è scritta in Bash, quindi per indirizzarlo a un altro endpoint basta aggiungere un provider con un tipo, un URL di base e una chiave.
La configurazione di Crush è Bash — un solo `provider add kunavo --type openai-compat --base-url "https://api.kunavo.com/v1"` in un crushrc porta l'agente da terminale di Charm su Claude e 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’esempio ufficiale di Crush per la compatibilità con OpenAI è --base-url "https://api.deepseek.com/v1" e anche quello compatibile con Anthropic termina allo stesso modo: il suffisso è quindi una convenzione del client, non un’ipotesi. Se lo ometti, l’errore sarà un 404 anziché un errore di autenticazione.--type openai-compat, non openai. Il README distingue chiaramente i due casi: openai serve a inoltrare o instradare richieste tramite OpenAI; openai-compat serve per provider non OpenAI con API compatibili con OpenAI. Kunavo rientra nel secondo caso.crushrc è Bash con le funzionalità integrate di Crush e, secondo l’avvertenza dello stesso Crush, è codice attendibile: viene eseguito in una shell completa. Questo consente anche di mantenere --api-key "$(op read ...)" fuori dal file. Il vecchio crush.json continua a essere caricato, ma il README lo definisce deprecato; è quindi preferibile usare crushrc.sk-kn-) e aggiungi credito da $10: le chiamate vengono pagate con quel saldo e le chiamate non riuscite non vengono addebitate. La dashboard si apre quindi sulla configurazione Crush.Passo dopo passo
- Crea una chiave in
/app/keyse copiala: viene mostrata una sola volta. Esportala comeKUNAVO_API_KEYoppure leggila da un gestore di password direttamente nella configurazione. - Inserisci il blocco qui sopra in
~/.config/crush/crushrc. Crush legge prima./.crushrc, poi./crushrce infine il file globale; in questo modo un progetto può sovrascrivere le impostazioni della macchina, ma anche un repository clonato può includere un file di configurazione. - Avvia
crushe premictrl+lper aprire il selettore dei modelli. Le righemodel largeemodel smallqui sopra hanno già fissato entrambi gli slot, quindi usa il selettore per passare da un modello all’altro, non per configurarlo. - Se preferisci non registrare gli ID manualmente: il rilevamento automatico viene eseguito quando l’elenco dei modelli di un provider
openai-compatè vuoto oppure quando passi--discover-models true. Kunavo risponde aGET /v1/models, quindi l’elenco viene compilato automaticamente; in caso di conflitto prevalgono i campimodel adddefiniti manualmente. - Esegui un’attività circoscritta, quindi controlla l’addebito registrato sul tuo account in
/app/billing. La cifra mostrata nel terminale è calcolata a partire dai valori--price-*inseriti manualmente; il registro contiene l’importo addebitato.
Verificato rispetto a La sezione Custom Providers di Crush il 21 settembre 2026. Le impostazioni di terze parti cambiano; se il nome di un campo qui non corrisponde più a quello visualizzato, fa fede quella pagina, non questa.
Verifica prima di eseguire il debug del client
Una sola richiesta stabilisce se il problema riguarda l'endpoint, la chiave o il file di configurazione. Se restituisce JSON, lo stesso base URL e la stessa chiave funzionano in 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-..."Quale model id inserire nel campo
Ogni modello di testo è raggiungibile come model id: l'elenco aggiornato è GET /v1/models e il catalogo con i prezzi è nella pagina dei modelli. Le tariffe sono in USD per 1M di token, input / output.
| ID del modello | Kunavo ingresso / uscita | Dove si inserisce in Crush |
|---|---|---|
claude-sonnet-5 | $1.40 / $7.00 | lo slot model large: il modello quotidiano per programmazione e modifiche |
claude-haiku-4-5 | $0.70 / $3.50 | lo slot model small, che Crush usa di continuo per titoli e riepiloghi |
claude-opus-5 | $3.50 / $17.50 | passa a model large per una ristrutturazione del codice in cui un piano errato sarebbe costoso |
gpt-5-6-terra | $0.70 / $4.20 | un’altra famiglia con la stessa chiave: basta aggiungere un altro modello |
Domande frequenti
Come si aggiunge un provider API personalizzato alla CLI Crush?
Inseriscilo in un crushrc, che usa Bash con le funzioni integrate di Crush. Una riga registra l'endpoint — provider add kunavo --type openai-compat --base-url "https://api.kunavo.com/v1" --api-key "$KUNAVO_API_KEY" — e un comando model add per ogni ID registra ciò che vuoi chiamare, con il nome visualizzato, la finestra di contesto e i prezzi per milione di token che Crush usa per la stima mostrata sullo schermo. Crush legge ./.crushrc, poi ./crushrc, quindi ~/.config/crush/crushrc, perciò lo stesso blocco funziona per progetto o per macchina.
L'URL di base di Crush deve terminare con /v1?
Sì. Gli esempi ufficiali di provider personalizzati di Crush includono il suffisso in entrambi i casi: https://api.deepseek.com/v1 per il caso compatibile con OpenAI e https://api.anthropic.com/v1 per quello compatibile con Anthropic. Per una chiave Kunavo, il valore è https://api.kunavo.com/v1. È l'opposto di Claude Code, dove ANTHROPIC_BASE_URL è un'origine senza percorso perché il client aggiunge da sé il percorso: stesso gateway, due forme diverse; se manca /v1, si ottiene un 404 invece di un 401.
Devo usare --type openai o --type openai-compat?
openai-compat, per qualsiasi gateway di terze parti. Il README di Crush riserva openai al proxying o all'instradamento delle richieste tramite OpenAI stesso e indica openai-compat per i provider non OpenAI con API compatibili con OpenAI. Il tipo determina anche il comportamento oltre al formato sul filo: la ricerca automatica dei modelli viene eseguita per un provider openai-compat il cui elenco di modelli è vuoto. Crush supporta inoltre --type anthropic per gli endpoint compatibili con Anthropic, che richiede --extra-header anthropic-version 2023-06-01.
crush.json è ancora il posto giusto per questa configurazione?
No. crush.json è il formato originale e la documentazione ufficiale di Crush ora lo definisce deprecato e non più destinatario di nuove funzionalità; il formato attuale è crushrc. Nota che entrambi vengono eseguiti, non analizzati: un crushrc viene eseguito in una shell completa e qualsiasi $(...) in crush.json viene espanso al caricamento. Per questo la documentazione sconsiglia di avviare Crush in una directory la cui configurazione non è stata letta e per questo è possibile recuperare una chiave da un gestore di password direttamente nella configurazione.
Perché il costo mostrato da Crush è diverso da quello che mi è stato addebitato?
Perché sono due valori diversi, provenienti da due fonti diverse. La stima mostrata sullo schermo per un provider registrato manualmente è un calcolo basato sui valori --price-input e --price-output inseriti con model add; per i provider integrati, proviene da Catwalk, il catalogo esterno di provider di Crush. Nessuno dei due legge il tuo account. Un errore di battitura in un flag --price-* produce una lettura errata, non un addebito errato. Verifica il registro contabile in /app/billing.
Crush può usare modelli Claude o GPT tramite un provider personalizzato?
Sì, e Crush non impone alcuna restrizione. Charm Hyper è il provider ufficiale verso cui indirizza la procedura iniziale, ma un provider personalizzato è un percorso documentato di prima classe, senza vincoli legati al piano; l'ID del modello viene risolto dall'endpoint, non dal client. Quindi un ID Claude su un provider openai-compat è la combinazione prevista: il tipo indica il protocollo sul filo, non il fornitore.