Documentazione

Documentazione

Jan Agent

Jan Agent non include un motore di inferenza, quindi chiama sempre un endpoint specificato dall’utente. Un’unica istruzione jan config set salva Kunavo in ~/.jan/config.toml e consente all’agente terminale di usare Claude e GPT con una sola chiave.

Una riga `jan config set --base-url https://api.kunavo.com/v1` scrive Kunavo in ~/.jan/config.toml, e la CLI di anteprima Jan Agent — priva di motore di inferenza — usa quella chiave.

jan config set — scrive in ~/.jan/config.toml
# Jan Agent is a preview on a nightly channel — check your build first.
jan --version

jan config set \
  --provider kunavo \
  --api-key sk-kn-... \
  --base-url https://api.kunavo.com/v1 \
  --model claude-sonnet-5 \
  --model claude-haiku-4-5 \
  --api-type openai

jan config list   # configured providers as JSON, keys redacted
L’URL base conserva /v1, con entrambi i tipi wire. Jan aggiunge solo la route: la pagina sull’aggiunta di un provider indica che l’accesso «convalida la chiave su GET {base_url}/models» e la pagina dei provider specifica che, la prima volta che apri /model in una sessione, viene interrogato il valore GET /models di una voce configurata. Tutti gli URL base riportati nella documentazione terminano con /v1, compreso quello Anthropic nell’esempio jan cli models list. Pertanto, anche --api-type anthropic richiede https://api.kunavo.com/v1, contrariamente a Claude Code e agli SDK ufficiali Anthropic, dove lo stesso suffisso genera /v1/v1/messages e un 404. Un percorso raddoppiato nell’errore rivela quale convenzione stai usando.
Jan Agent è un’anteprima, e lo dichiara esplicitamente. La guida rapida avverte che il programma di installazione su dev scarica dal canale agent-nightly: «aspettati build di qualità nightly». Non esiste una release con tag da citare, quindi esegui jan --version e annota il risultato accanto a questa configurazione: i flag qui sotto sono stati ricavati dalla documentazione nella data indicata in fondo alla pagina e una build nightly potrebbe rinominarne uno. Una build dal codice sorgente (scripts/install-jan-agent.sh --source) non si aggiorna automaticamente: è un modo per mantenere fissa una versione.
Questa configurazione è stata ricavata dalla documentazione ufficiale di Jan. Kunavo non ha eseguito Jan Agent sul proprio endpoint: né una sessione, né un turno in streaming, né uno scambio completo con strumenti; lo stesso vale per ogni client di questa famiglia. Una pagina di configurazione pubblicata non è un test di compatibilità. Durante la prova tieni disponibile la route che già funziona e ricorda che jan config unset --provider kunavo consente di annullare tutto.
Kunavo non fornisce modelli per embedding, sintesi vocale o trascrizione vocale, quindi una voce provider Kunavo risponde alle richieste di chat e a nient’altro. Jan Agent non richiede altro: la sua memoria consiste in semplici file in <project>/.jan/agent/memory/, anziché in un archivio vettoriale, quindi il ciclo dell’agente non ha bisogno di un secondo tipo di modello.
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 Jan Agent.

Passo dopo passo

  1. Crea una chiave su /app/keys e copiala: viene mostrata una sola volta.
  2. Verifica cosa stai configurando: jan --version. Anche Jan Desktop include una CLI avviata con jan, ma con un set di comandi diverso; prima di digitare il resto, verifica che jan config set --help elenchi --base-url.
  3. Esegui il comando jan config set qui sopra. --provider è un ID a tua scelta, non un nome da un elenco predefinito: l’esempio di configurazione hardware locale nella documentazione usa --provider local; inoltre, --model può essere ripetuto e sostituisce l’elenco esistente invece di aggiungervi elementi.
  4. Verifica che sia stato salvato con jan config list (le chiavi vengono oscurate) oppure con jan config path per il file stesso, quindi esegui jan cli models list per vedere cosa offre ogni provider. Un ID modello inserito manualmente resta disponibile anche quando l’endpoint smette di elencarlo; jan cli models refresh --provider kunavo considera invece autorevole l’elenco dell’endpoint.
  5. Entra in una directory di progetto ed esegui jan, quindi seleziona il modello con /model. Per la prima esecuzione, preferisci jan --plan: è in sola lettura, quindi un’incompatibilità del protocollo emerge prima che venga scritto qualcosa sul disco.
  6. Assegnagli un’attività che modifichi un file. Jan Agent è un agente, quindi la prima esecuzione dovrebbe verificare chiamate agli strumenti e streaming: sono le funzionalità che darebbero problemi per prime con un endpoint solo parzialmente compatibile, mentre un saluto non ne verifica nessuna.

Verificato rispetto a la pagina Provider di Jan Agent 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 la guida ai costi delle API e dei modelli Jan, che tratta anche Jan Desktop.

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 Jan Agent.

# 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 Jan Agent
claude-sonnet-5$1.40 / $7.00il modello operativo predefinito: l’ID da inserire per primo sotto --model
claude-opus-5$3.50 / $17.50un piano in cui sbagliare sarebbe costoso; abbinalo a jan --plan
claude-haiku-4-5$0.70 / $3.50turni economici: smistamento, riepiloghi e il ciclo che gira tutto il giorno
gpt-5-6-sol$2.00 / $12.00un secondo parere da un’altra famiglia, con la stessa chiave e lo stesso URL di base
gpt-5-6-terra$0.70 / $4.20lettura di contesti lunghi, sempre con il tipo API openai
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.

Due cose diverse vengono chiamate chiave API Jan

Sono nello stesso file e hanno significati opposti, ed è per questo che jan config list può sembrare errato a chi si aspetta l’altra chiave.

CosaDa dove provieneA cosa serve l’autenticazione
jan loginAccedere a Tokamak, il backend self-hosted, dalla shell o con /login nella consoleLa tua distribuzione Tokamak. Jan Agent scrive per te la chiave ricevuta in ~/.jan/config.toml
jan config set --api-keyUna credenziale che possiedi già per un endpoint — qui la chiave sk-kn- di KunavoQuell'endpoint, con fatturazione per richiesta. È la riga di cui tratta questa pagina

Jan Desktop non fornisce nessuna delle due: non ha un account, quindi non c'è nulla da generare. Il suo server API locale accetta una chiave che inventi tu, che ha ancora un terzo significato e appartiene a un host diverso.

Cosa fornisce Jan Desktop e dove si ferma

Jan Agent legge le impostazioni dei provider da quattro fonti, ciascuna con precedenza su quelle elencate sopra; la seconda è quella che sorprende più persone.

  1. ~/.jan/config.toml — la base e l'unico file che jan config set scrive.
  2. settings.json di Jan Desktop — solo in eredità. Aggiunge i provider che non hai configurato in Agent, non sovrascrive quelli che hai configurato e non viene mai riscritto.
  3. Un blocco [provider] nel file agent.toml di un progetto — una scelta esplicita per progetto, quindi prevale su entrambi. Di solito quel file viene sottoposto a commit, quindi tienine fuori api_key.
  4. --provider / --api-key dalla riga di comando, oppure JAN_API_KEY / <PROVIDER>_API_KEY — l'opzione più esplicita e più temporanea.

Ci sono due conseguenze da conoscere prima di fare debug della cosa sbagliata. jan config list può non mostrare alcun provider mentre jan cli models list ne restituisce molti: il secondo include quelli ereditati da Desktop, che non sono memorizzati in ~/.jan/config.toml. Inoltre, un provider ereditato non viene mai aggiornato, perché qui non c'è una voce da riscrivere: se vuoi mantenere aggiornato l'elenco dei modelli di Kunavo, deve essere una voce jan config set a sé, come quella creata dal blocco qui sopra.

Quando due provider offrono lo stesso ID modello

Kunavo fornisce ID come claude-sonnet-5, così come una voce provider che punta direttamente al fornitore. Jan Agent deve sceglierne uno e l'ordine documentato è: prima una corrispondenza esatta nell'elenco models di un provider, poi un prefisso <provider>/<model> che identifica un provider configurato e, se più provider offrono lo stesso ID, prevale quello con credenziali rispetto al gemello senza chiave. Ecco perché kunavo/claude-sonnet-5 serve a specificare quale intendevi. Il qualificatore serve solo a Jan: viene rimosso prima dell'invio della richiesta, perché i servizi upstream rifiutano gli ID qualificati con il provider.

La stessa voce, dalla console

Se preferisci non digitare flag: /settings > providers gestisce le stesse voci ~/.jan/config.toml e a apre un modulo per aggiungerne una, con i campi name, base url, api key e models separati da spazi. Il modulo fa due cose che i flag non fanno: l'URL di base deve essere https:// (oppure http:// per un endpoint localhost), così una chiave non viene mai inviata tramite una connessione remota in testo non crittografato — Kunavo usa https://, quindi non è un problema — e, quando modifichi una voce, il campo della chiave API mostra (unchanged) e conserva quella memorizzata a meno che tu non inserisca un nuovo valore. Se lasci vuoto il campo, la chiave viene cancellata invece di restare invariata.

Domande frequenti

Come posso indirizzare Jan Agent a un endpoint API personalizzato?

Con un solo comando: jan config set --provider <id> --api-key <key> --base-url <url> --model <model> --api-type openai. L'ID del provider lo scegli tu, non è un nome tratto da un elenco fisso; --model può essere ripetuto e sostituisce l'elenco esistente; --api-type è compatibile con OpenAI per impostazione predefinita, quindi puoi ometterlo per un endpoint con formato OpenAI. La voce viene scritta in ~/.jan/config.toml, che puoi modificare anche da /settings > providers nella console. La pagina di Jan dedicata al contributo di un provider spiega che un endpoint semplice compatibile con OpenAI non richiede codice, ma solo questa configurazione.

L'URL di base di Jan Agent deve terminare con /v1?

Sì, anche per il tipo wire Anthropic. Jan aggiunge solo il percorso: la pagina dedicata al contributo di un provider dice che l'accesso convalida la chiave tramite GET {base_url}/models, mentre la pagina dei provider spiega che, quando apri /model per la prima volta in una sessione, viene eseguita una richiesta GET /models per la voce configurata. Poiché il percorso aggiunto è /models e non /v1/models, l'URL di base memorizzato deve già essere la radice /v1: per Kunavo, https://api.kunavo.com/v1. Tutti gli URL di base riportati nella documentazione di Jan terminano nello stesso modo, inclusa la voce Anthropic nel suo esempio di jan cli models list. È l'opposto di Claude Code e degli SDK ufficiali Anthropic, dove l'aggiunta di /v1 produce /v1/v1/messages e un errore 404.

Qual è la differenza tra jan login e jan config set --api-key?

Autenticano cose diverse. jan login accede a Tokamak, il backend self-hosted, e salva la chiave ricevuta in ~/.jan/config.toml: accede alla tua distribuzione. jan config set --api-key memorizza una credenziale che possiedi già per un endpoint, come quella che useresti con un provider di terze parti quale Kunavo. Jan Desktop non fornisce nessuna delle due, perché non ha un account da cui ricavarne una; la chiave richiesta dal suo server API locale è una stringa che inventi tu, un'altra accezione della parola chiave.

Perché jan config list non mostra nulla mentre jan cli models list mostra dei modelli?

Perché i due comandi leggono insiemi diversi. jan config list mostra solo ciò che è memorizzato in ~/.jan/config.toml, mentre jan cli models list include anche i provider ereditati da Jan Desktop, che non sono memorizzati lì. La documentazione di Jan lo segnala esplicitamente. La conseguenza pratica è che un provider ereditato non viene mai aggiornato: non c'è una voce da riscrivere. Per mantenere aggiornato l'elenco dei modelli di un provider, aggiungilo prima con jan config set.

Jan Agent può eseguire modelli Claude senza un account Anthropic?

Sì. Jan Agent non include un motore di inferenza, quindi un modello viene sempre eseguito sull'endpoint configurato; --api-type indica il protocollo wire, non il fornitore. Un ID Claude viene risolto all'URL di base che hai impostato, quindi le credenziali che possiedi sono quelle dell'endpoint. Kunavo offre ID Claude e GPT tramite un'unica chiave, usando un'interfaccia compatibile con OpenAI. Questa configurazione è stata pubblicata sulla base della documentazione di Jan, non di una prova eseguita sul client; inoltre, Jan Agent è ancora un'anteprima sul canale nightly, quindi considera i flag validi per la build verificata con jan --version.

Jan Agent restituisce 404 per ogni richiesta. Qual è il problema?

Quasi sempre è l'URL di base. Se manca /v1, Jan richiede /models e /chat/completions all'origine, che restituisce 404 anziché un errore di autenticazione; se nell'errore compare /v1/v1, il suffisso è stato aggiunto a un URL che lo conteneva già. Prima di intervenire sul client, verifica l'endpoint con una semplice richiesta curl a GET /v1/models usando la stessa chiave: se ricevi JSON, endpoint e chiave funzionano e il problema è nella voce configurata; 401 indica un problema con la chiave, 404 con l'URL. Poi controlla jan config path e leggi direttamente il base_url memorizzato.