Documentazione

Documentazione

Junie CLI

Junie CLI accetta un endpoint personalizzato tramite un file JSON, non da una schermata delle impostazioni. Bastano nove righe in $JUNIE_HOME/models/kunavo.json e junie --model custom:kunavo per usare Claude e GPT con un'unica chiave, indirizzando il traffico di supporto verso un'opzione economica.

Junie CLI accetta un endpoint personalizzato come profilo JSON in $JUNIE_HOME/models/, dove baseUrl è l'URL completo dell'endpoint e fasterModel determina dove arriva il traffico ausiliario.

$JUNIE_HOME/models/kunavo.json — oppure .junie/models/kunavo.json
{
  "id": "claude-sonnet-5",
  "baseUrl": "https://api.kunavo.com/v1/chat/completions",
  "displayName": "Kunavo",
  "providerName": "Kunavo",
  "apiType": "OpenAICompletion",
  "apiKey": "${KUNAVO_API_KEY}",
  "fasterModel": {
    "id": "claude-haiku-4-5"
  }
}
baseUrl è l'endpoint completo, percorso incluso. JetBrains lo afferma chiaramente: «baseUrl viene usato come URL endpoint completo — Junie non vi aggiunge alcun percorso» e indica di «impostarlo sull'endpoint completo per il apiType scelto». Questo campo, quindi, non è né l'origine né la radice /v1 che serve alla maggior parte dei client: è https://api.kunavo.com/v1/chat/completions. Fermarsi a https://api.kunavo.com/v1 è il modo più probabile per ottenere un 404 con un profilo altrimenti corretto.
Se manca una variabile d'ambiente, non si carica l'intero profilo, non solo la richiesta. I valori di apiKey e extraHeaders accettano riferimenti $${VAR_NAME} e JetBrains documenta esattamente cosa accade: «Se una variabile d'ambiente referenziata non è impostata, il profilo non viene caricato e Junie segnala un errore che identifica la variabile mancante». Esporta KUNAVO_API_KEY prima di avviare Junie: il profilo viene letto al caricamento, non alla prima richiesta, quindi se la shell ha perso l'esportazione il profilo scompare da /model anziché restituire 401.
fasterModel è il modello a cui Junie affida le attività che non hai richiesto. JetBrains lo descrive come «Il modello usato per attività interne di supporto, come riepilogare il contesto o classificare le attività» e specifica che, se primaryModel o fasterModel «non sono definiti esplicitamente, ereditano le proprietà di primo livello». Un profilo senza un blocco fasterModel addebita quindi le attività di supporto alla tariffa del modello principale. La modifica di una riga qui sopra risolve il problema: ecco perché il blocco è nella configurazione minima e non in un'appendice.
Questo profilo deriva dallo schema pubblicato da JetBrains, consultato nella data indicata sotto. Kunavo non ha eseguito Junie CLI contro il proprio endpoint: né una sessione, né un turno in streaming, né un ciclo completo degli strumenti; inoltre, non è stata verificata e approvata alcuna build specifica del client. Una pagina di configurazione pubblicata non è un test e non va interpretata come tale. Il curl qui sotto è la parte che puoi verificare in dieci secondi; il comportamento di Junie su di esso dipende da te e da JetBrains.
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 Junie CLI.

Passo dopo passo

  1. Crea una chiave su /app/keys e copiala: viene mostrata una sola volta. Esportala come KUNAVO_API_KEY nella shell da cui avvierai Junie, oppure inserisci direttamente la chiave nel file; JetBrains precisa che «I valori senza alcun riferimento $${...} vengono usati così come sono».
  2. Salva il JSON qui sopra come $JUNIE_HOME/models/kunavo.json per il tuo account oppure come .junie/models/kunavo.json per condividerlo con un repository. Il nome del file senza .json diventa l'ID del profilo, ed è per questo che il selettore qui sotto mostra custom:kunavo.
  3. Imposta id sull'ID del modello che vuoi usare. È descritto come «L'identificatore del modello previsto dall'endpoint API», quindi puoi inserire direttamente uno slug Kunavo dalla tabella qui sotto: gli ID vengono risolti sull'endpoint, non all'interno di Junie.
  4. Avvia Junie e seleziona il profilo: junie --model custom:kunavo oppure il comando /model in una sessione interattiva. I modelli personalizzati «compaiono nell'elenco di selezione dei modelli dopo i provider integrati».
  5. Assegna un'attività che modifichi un file, non un semplice saluto. Junie è un client agentico e si affida alle chiamate agli strumenti per quasi tutto ciò che fa, quindi una prima esecuzione che legge e scrive qualcosa ti dice molto più di una singola risposta.

Verificato rispetto a Pagina JetBrains sui modelli LLM personalizzati per Junie 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 Confronto tra Junie CLI e Claude Code — il confine dell'endpoint.

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 Junie CLI.

# 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 Junie CLI
claude-sonnet-5$1.40 / $7.00il primaryModel per il lavoro ordinario, come le attività che modificano file
claude-opus-5$3.50 / $17.50un piano che sarebbe costoso sbagliare, fissato per sessione
claude-haiku-4-5$0.70 / $3.50il ruolo fasterModel: riepiloga il contesto e classifica le attività
gpt-5-6-sol$2.00 / $12.00un secondo parere da un'altra famiglia — un secondo profilo, la stessa chiave
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.

Gli altri due valori apiType a cui risponde Kunavo

apiType indica un formato di richiesta, non un fornitore, e Junie accetta quattro valori: OpenAICompletion, OpenAIResponses, Google e Anthropic. Kunavo offre tre route, quindi due degli altri tre valori hanno una baseUrl corrispondente. Poiché Junie non aggiunge alcun percorso, cambiare formato significa cambiare l'URL nella stessa modifica:

  1. "apiType": "OpenAICompletion" con https://api.kunavo.com/v1/chat/completions — il profilo qui sopra, consigliato in questa pagina perché è la route più ampiamente collaudata delle tre.
  2. "apiType": "Anthropic" con https://api.kunavo.com/v1/messages — Kunavo risponde in formato Messages su quel percorso.
  3. "apiType": "OpenAIResponses" con https://api.kunavo.com/v1/responses.

Quale dei tre funzioni meglio per un dato modello in Junie è proprio il tipo di domanda a cui risponde un test in esecuzione, ma non la lettura della documentazione; perciò questa pagina non li classifica oltre alla prima riga. Scegline uno, mantieni coerenti URL e apiType e, se un profilo con chiave impostata restituisce 401, specifica esplicitamente la credenziale invece di indovinare l'header usato da Junie: JetBrains documenta apiKey solo in negativo — «Se omesso, le richieste vengono inviate senza un header Authorization» — e non specifica mai lo schema usato quando è presente. extraHeaders è documentato come «header HTTP aggiuntivi da includere in ogni richiesta» e accetta gli stessi riferimenti $${VAR}, perciò "extraHeaders": {"Authorization": "Bearer $${KUNAVO_API_KEY}"} è la forma inequivocabile.

Domande frequenti

Come aggiungo un provider personalizzato a Junie CLI?

Junie CLI legge i provider personalizzati da profili JSON, non da una schermata delle impostazioni. Inserisci un file in $JUNIE_HOME/models/ per il tuo account oppure in .junie/models/ all'interno di un progetto: il nome del file senza l'estensione .json diventa l'ID del profilo. Le chiavi obbligatorie sono id, baseUrl e apiType; apiKey, displayName, providerName, extraHeaders, extraBody, temperature, maxContextLength, primaryModel e fasterModel sono facoltative. Selezionalo quindi con `junie --model custom:<id>` oppure con il comando /model: i modelli personalizzati compaiono nell'elenco dopo i provider integrati.

Il baseUrl di Junie CLI deve contenere /v1 o il percorso completo?

Il percorso completo. JetBrains afferma che baseUrl viene usato come URL endpoint completo, senza che Junie vi aggiunga un percorso, e indica di impostarlo sull'endpoint completo per apiType scelto. Per un profilo OpenAICompletion con Kunavo, è https://api.kunavo.com/v1/chat/completions: non l'origine né la radice /v1 richiesta da client come Kilo Code. Entrambi i profili di esempio nella documentazione JetBrains riportano un percorso completo per lo stesso motivo.

Perché Junie dice che un profilo non è stato caricato a causa di una variabile d'ambiente mancante?

Perché i valori di apiKey e extraHeaders supportano riferimenti ${VAR_NAME}; JetBrains specifica che se una variabile d'ambiente referenziata non è impostata, il profilo non viene caricato e Junie segnala un errore con il nome della variabile mancante. La risoluzione avviene al caricamento del profilo, quindi il sintomo è la sua scomparsa dall'elenco dei modelli, non una richiesta non riuscita. Esporta la variabile prima di avviare Junie oppure sostituisci il riferimento con un valore letterale.

Junie CLI può usare una propria chiave BYOK con un gateway come Kunavo?

La schermata BYOK e un profilo personalizzato sono due percorsi distinti. La pagina BYOK di JetBrains spiega come collegare un provider nominato — OpenAI, Anthropic, Google, xAI, OpenRouter o GitHub Copilot — tramite /account o «Usa la tua chiave API» nella schermata di benvenuto, e specifica che tutti i costi d'uso sono fatturati dal provider senza richiedere un abbonamento JetBrains AI. Un endpoint non presente nell'elenco, come Kunavo, va configurato invece come profilo LLM personalizzato, ovvero tramite il file JSON di questa pagina. L'uso della propria chiave è una funzionalità di Junie CLI: la documentazione del plugin JetBrains specifica che non è supportata tramite il plugin Junie.

Perché Junie chiama un modello che non ho selezionato?

Junie divide un profilo in due ruoli e fasterModel è documentato come il modello usato per attività interne di supporto, come riepilogare il contesto o classificare le attività. Se non definisci quel blocco, JetBrains specifica che i ruoli ereditano le proprietà di primo livello: il traffico di supporto usa quindi il modello principale e viene fatturato alla sua tariffa. Impostare fasterModel.id su un ID più economico, come nel profilo di questa pagina, risolve il problema; i valori di primo livello baseUrl, apiType e apiKey vengono ereditati da entrambi i ruoli, quindi basta cambiare l'ID.

Kunavo ha testato Junie CLI?

No. Il 21 settembre 2026 è stata consultata la documentazione ufficiale di JetBrains sui modelli LLM personalizzati: i nomi e l'ordine dei campi, i valori apiType accettati e la regola dell'endpoint completo sono tratti da lì. Kunavo non ha installato Junie CLI, fissato una build né inviato richieste tramite il client, e non fa affermazioni sullo streaming, sui cicli completi degli strumenti o sull'instradamento dei modelli all'interno del client. L'unica cosa che puoi verificare separatamente è se l'endpoint e la chiave funzionano: è a questo che serve il comando curl in questa pagina.