Documentazione

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.

~/.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 di base mantiene il suffisso /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.
Usa --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.
Un 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.
Kunavo non ha eseguito test runtime di Crush: né di questo client né di alcuno degli altri descritti in queste pagine. Qui è stata verificata la configurazione documentata da Crush rispetto all’endpoint pubblicato da Kunavo; una guida alla configurazione non è un risultato di test. Prima di adottarlo per il lavoro quotidiano, esegui un’attività circoscritta.
Non hai ancora una chiave? Crea un account Kunavo, genera una chiave (inizia con 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

  1. Crea una chiave in /app/keys e copiala: viene mostrata una sola volta. Esportala come KUNAVO_API_KEY oppure leggila da un gestore di password direttamente nella configurazione.
  2. Inserisci il blocco qui sopra in ~/.config/crush/crushrc. Crush legge prima ./.crushrc, poi ./crushrc e 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.
  3. Avvia crush e premi ctrl+l per aprire il selettore dei modelli. Le righe model large e model small qui sopra hanno già fissato entrambi gli slot, quindi usa il selettore per passare da un modello all’altro, non per configurarlo.
  4. 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 a GET /v1/models, quindi l’elenco viene compilato automaticamente; in caso di conflitto prevalgono i campi model add definiti manualmente.
  5. 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.

Questa è la versione breve. La guida completa, con scelta del modello, costo di una sessione reale e modalità di errore, è in Crush e OpenCode a confronto.

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 modelloKunavo ingresso / uscitaDove si inserisce in Crush
claude-sonnet-5$1.40 / $7.00lo slot model large: il modello quotidiano per programmazione e modifiche
claude-haiku-4-5$0.70 / $3.50lo slot model small, che Crush usa di continuo per titoli e riepiloghi
claude-opus-5$3.50 / $17.50passa a model large per una ristrutturazione del codice in cui un piano errato sarebbe costoso
gpt-5-6-terra$0.70 / $4.20un’altra famiglia con la stessa chiave: basta aggiungere un altro modello
La fatturazione è per token, usando un saldo prepagato senza canone mensile: vedi billing. In presenza di contesto ripetuto, che costituisce la maggior parte di ciò che invia un editor o un client di chat, prompt caching incide sulla spesa più della scelta del 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.