Documentazione
DeepSeek Harness
DeepSeek Harness mantiene la propria scheda DeepSeek e aggiunge la tua accanto. Cinque campi in “Add model provider” → “Custom model API” inseriscono Claude e GPT nello stesso selettore di modelli, con un'unica chiave.
Settings → Models → “Add model provider” → “Custom model API” richiede cinque campi — Provider ID, display name, base URL, API protocol e API key — e inserisce Claude e GPT nello stesso selettore della scheda DeepSeek integrata.
# Settings → Models → Add model provider → Custom model API
#
# Provider ID kunavo (lowercase, and permanent)
# display name Kunavo
# base URL https://api.kunavo.com/v1
# API protocol OpenAI Chat Completions (openai-completions)
# API key sk-kn-...
#
# Then Model catalog → Fetch available models → Add selected,
# or type the ids by hand. The page writes the active profile's
# $DSH_HOME/profiles/<profile>/cordis.patch.yml — profile "web" under
# `dsh web`. The same provider there, plus an optional second one
# that sends Claude ids over Anthropic Messages, whose base URL has
# NO /v1. This entry replaces the whole llm-pi-ai config: keep any
# provider already in it.
- id: llm-pi-ai
config:
providers:
kunavo:
apiKeyEnv: KUNAVO_API_KEY
api: openai-completions
baseURL: https://api.kunavo.com/v1 # → /v1/chat/completions
models:
- id: claude-sonnet-5
- id: claude-opus-5
- id: claude-haiku-4-5
- id: gpt-5-6-sol
kunavo-claude:
apiKeyEnv: KUNAVO_API_KEY
api: anthropic-messages
baseURL: https://api.kunavo.com # → /v1/messages
models:
- id: claude-sonnet-5
- id: claude-haiku-4-5openai-completions richiede https://api.kunavo.com/v1; anthropic-messages richiede https://api.kunavo.com, senza /v1, perché dsh aggiunge da sé /v1/messages. Un'esecuzione di dsh 0.2.0-rc.2 contro un server sostitutivo di test che registrava le richieste ha confermato entrambi i casi: la prima ha inviato la richiesta a /v1/chat/completions, la seconda a /v1/messages?beta=true partendo dalla radice senza percorso; con /v1 mantenuto nell'URL di base, invece, l'ha inviata a /v1/v1/messages, a cui un gateway reale risponde con un 404, non con un errore di autenticazione.reasoningEfforts cambia il ruolo del prompt di sistema, non il fatto che venga inviato. La documentazione dell'harness indica che a un modello che dichiara di avere capacità di ragionamento il prompt di sistema viene inviato come role: "developer". Kunavo interpreta quel ruolo come il turno di sistema per ogni famiglia, Claude incluso, quindi non serve attivare compat. Fino al 2026-09-30, il percorso Claude eliminava il ruolo; questa scheda consigliava di impostare compat.supportsDeveloperRole: false. Se l'hai fatto, non causa problemi e puoi lasciarlo attivo.deepseek- e usa questa per gli ID Claude e GPT nella tabella seguente. Ciò significa anche che l'interruttore compat.thinkingFormat: deepseek documentato dall'harness per “DeepSeek V4 dietro un gateway compatibile con OpenAI” qui non ha alcun effetto.dsh_session_log, gli eventi della sessione, incluso il percorso della directory di lavoro, e dsh_plugin_packages. Nell'esecuzione, nessuno dei due provider personalizzati ha inviato l'uno o l'altro, quindi un provider Kunavo non li riceve. Il loro peso e l'interruttore per disattivarne il caricamento sono descritti in Prezzi di DeepSeek Harness.curl qui sotto riguarda la parte Kunavo e puoi verificarlo in dieci secondi; dsh è un'anteprima per sviluppatori e continua a evolversi.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 DeepSeek Harness.Passo dopo passo
- Crea una chiave su
/app/keyse copiala: viene mostrata una sola volta. - Avvia la Web UI (
dsh web) e vai a Impostazioni → Modelli. Seleziona Aggiungi provider di modelli. La scheda si apre su Provider di modelli di terze parti, che elenca solo i provider inclusi indsh; seleziona API di modello personalizzata. - Compila ID provider (in minuscolo e permanente: la documentazione spiega che richieste, sessioni salvate, impostazioni predefinite dei modelli e riferimenti alle credenziali lo usano tutti; per rinominarlo occorre aggiungere un nuovo provider ed eliminare quello vecchio), nome visualizzato, URL di base
https://api.kunavo.com/v1, protocollo API OpenAI Chat Completions e chiave API. La chiave è di sola scrittura; dsh la conserva in$DSH_HOME/.credentials.yamle nel profilo memorizza solo un riferimento a essa. - In Catalogo modelli, seleziona Recupera i modelli disponibili: Kunavo risponde a
GET /v1/models, quindi il selettore si compila automaticamente. Seleziona quelli che vuoi e scegli Aggiungi selezionati. Gli ID inseriti manualmente funzionano altrettanto bene e la documentazione consiglia di usarli come alternativa ogni volta che la ricerca non restituisce alcun risultato. - Facoltativo: per gli ID Claude tramite il protocollo nativo di Anthropic, aggiungi una seconda API di modello personalizzata con un proprio ID provider, URL di base
https://api.kunavo.com— senza/v1— protocollo API Anthropic Messages e la stessa chiave. Anche qui Recupera elenca l'intero catalogo; aggiungi solo gli IDclaude-(perché solo quelli). - Seleziona un modello nel compositore e invia un turno che interagisca con un file, non un semplice saluto: l'harness si basa sulle chiamate agli strumenti per gran parte delle sue funzioni, quindi una prima esecuzione che legge e modifica qualcosa ti darà più informazioni. Le modifiche al modello hanno effetto dalla richiesta successiva; la documentazione specifica che non è necessario riavviare.
Verificato rispetto a la pagina di DeepSeek Harness “Configure models” (lo stesso testo di docs/user/guide/providers.md nel tag dsh-v0.2.0-rc.2) il 1 ottobre 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 DeepSeek Harness.
# 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 DeepSeek Harness |
|---|---|---|
claude-sonnet-5 | $1.40 / $7.00 | il modello di lavoro predefinito per le sessioni che modificano file |
claude-opus-5 | $3.50 / $17.50 | pianificare una modifica che sarebbe costosa se andasse male |
claude-haiku-4-5 | $0.70 / $3.50 | turni economici: triage, riepiloghi, il ciclo che gira tutto il giorno |
gpt-5-6-sol | $2.00 / $12.00 | un secondo parere da un'altra famiglia, con la stessa chiave e lo stesso provider |
gpt-5-6-terra | $0.70 / $4.20 | input lunghi, per cui è la tariffa per token a determinare il costo |
Claude tramite Anthropic Messages
Kunavo risponde anche all'API Anthropic Messages e anthropic-messages è uno dei tre protocolli offerti dal modulo. La documentazione dell'harness è chiara: “Un provider usa un solo protocollo, quindi un gateway che ne offre due richiede due provider”. Si tratta quindi di un secondo provider accanto al primo, non di un'impostazione del primo.
- URL di base
https://api.kunavo.com, la radice senza percorso. Nell'esecuzione, quella radice ha inviato la richiesta a/v1/messages?beta=true: il percorso usato anche da Claude Code e a cui Kunavo risponde. Con/v1alla fine, la richiesta è stata inviata a/v1/v1/messages. DeepSeek Harness e Claude Code a confronto mostra affiancate le richieste dei due client. - Solo ID Claude. L'
/v1/messagesdi Kunavo supporta gli IDclaude-e nient'altro; un IDgpt-genera una404che indica/v1/chat/completions. Mantieni GPT sul provideropenai-completions. - Recupera elenca tutti i modelli; aggiungi solo quelli Claude. Il README di dsh
llm-pi-aispiega che la ricerca tramite questo protocollo invia una richiestaGET /v1/modelscon l'header Anthropicx-api-keye che l'elenco dei modelli di Kunavo accetta la chiave in quell'header, così come inAuthorization: Bearer: queste informazioni provengono dal codice sorgente di dsh e dai test di Kunavo, non dall'esecuzione. Il risultato di Recupera i modelli disponibili è l'intero catalogo, inclusi GPT e i modelli di immagini, quindi seleziona solo gli IDclaude-; inserirli manualmente funziona altrettanto bene. Un elenco completo dimostra meno di quanto sembri: lo stesso README dice che l'URL di elenco viene accettato con o senza/v1, mentre le richieste dei modelli usano l'URL di base così com'è. Pertanto, Recupera compila l'elenco anche dahttps://api.kunavo.com/v1, ma il primo turno inviato usando quell'URL di base va a/v1/v1/messages. - A cosa serve. La richiesta arriva nel formato Anthropic: nell'esecuzione, il prompt di sistema è stato trasmesso nel campo di primo livello
system, quindi il ruolodevelopernon entra in gioco; Kunavo la inoltra così com'è, senza convertirla dal formato OpenAI. Il provideropenai-completionsraggiunge gli stessi ID Claude tramite traduzione: ecco perché è quello usato nei passaggi.
Il file dietro il modulo
La pagina Modelli scrive in $DSH_HOME/profiles/<profile>/cordis.patch.yml — $DSH_HOME/profiles/web/cordis.patch.yml quando si inizia da dsh web. La documentazione precedente di dsh indicava $DSH_HOME/settings.yaml; quella della versione 0.2.0-rc.2 no. Quando il browser si trova sulla stessa macchina del server, Apri file di configurazione nell'intestazione delle Impostazioni lo apre, e gli adattatori lo rileggono alla richiesta successiva. Per questo endpoint contano cinque cose:
- Finestra di contesto e token di output massimi — nel modulo, in Impostazioni personalizzate → Opzioni del modello. Un ID inserito manualmente non include nessuno dei due valori, quindi si applicano i valori predefiniti del percorso: 262,144 token di contesto e 32,768 di output, secondo il README di
llm-pi-ai; nell'esecuzione, entrambi i provider personalizzati hanno richiesto esattamentemax_tokens: 32768. Tutti gli ID nella tabella sopra richiedono valori superiori; controlla la riga in ogni caso e, se vuoi valori più alti, aumentali in base alla voce del catalogo del modello. Kunavo addebita i token generati dal modello, non il limite massimo. compat.supportsDeveloperRole— non serve. L'harness lo consiglia per i gateway che rifiutano il ruolodeveloper; Kunavo interpreta quel ruolo come il turno di sistema per ogni famiglia, Claude incluso. (Fino al 2026-09-30, il percorso Claude lo eliminava e questa voce consigliava di attivare l'interruttore: lasciarlo attivo non causa problemi.)compat.maxTokensField— lascialo invariato. L'harness lo abbina all'interruttore sopra come prima soluzione abituale, ma il gestore di Kunavo leggemax_completion_tokense ripiega sumax_tokens, quindi il valore predefinito funziona già.reasoningEfforts— il modulo non ha un campo per questo. Un modello inserito manualmente non dichiara livelli, quindi il menu Effort non appare e il valore predefinito dell'endpoint determina se il modello esegue il ragionamento. Dichiara tu i livelli se vuoi il menu; inopenai-completionsogni chiave è un livello e il relativo valore è la forma inviata comereasoning_effort. Questo raggiunge un IDgpt-; non ha effetto su un IDclaude-, perché l'interfaccia chat di Kunavo non inoltrareasoning_effortad Anthropic (/docs/chat#reasoning).- Tipi di input (
input: [text, image]nel file): la documentazione chiarisce che questo “dichiara una caratteristica del tuo endpoint, invece di verificarla”. Se selezioni Immagine per un ID che non accetta immagini, l'harness non rileva l'incompatibilità; la richiesta viene rifiutata più avanti. Controlla l'ID su/modelsprima di selezionare la casella.
Il resto dei dati inviati da una sessione — 24 definizioni di strumenti per turno, una breve richiesta di titolo per ogni nuova sessione e i campi aggiuntivi sul percorso DeepSeek — è conteggiato in Prezzi di DeepSeek Harness.
Domande frequenti
Come aggiungo un provider API personalizzato a DeepSeek Harness?
Avvia la Web UI con dsh web, vai a Settings → Models e seleziona "Add model provider". La scheda si apre su "Third-party model provider", che elenca solo i provider inclusi in dsh; seleziona "Custom model API". Il modulo richiede un ID provider in minuscolo, un nome visualizzato, un URL di base, un protocollo API e una chiave API, quindi almeno un modello in Model catalog. L'ID provider è permanente, perché richieste, sessioni salvate, impostazioni predefinite dei modelli e riferimenti alle credenziali lo usano tutti; per rinominarlo occorre aggiungere un nuovo provider ed eliminare quello vecchio. Nella versione 0.2.0-rc.2, la pagina salva nel file cordis.patch.yml del profilo attivo — $DSH_HOME/profiles/web/cordis.patch.yml con dsh web.
L'URL di base di DeepSeek Harness deve terminare con /v1?
Dipende dal protocollo API. Per openai-completions, sì: https://api.kunavo.com/v1, che in un'esecuzione di dsh 0.2.0-rc.2 ha inviato la richiesta a /v1/chat/completions. Per anthropic-messages, no: https://api.kunavo.com, perché dsh aggiunge da sé /v1/messages. La radice senza percorso ha inviato la richiesta a /v1/messages?beta=true, mentre un URL di base che termina in /v1 l'ha inviata a /v1/v1/messages, a cui un gateway reale risponde con 404 invece che con un errore di autenticazione. L'esecuzione è stata effettuata contro un server sostitutivo locale che registra le richieste, non contro Kunavo.
DeepSeek Harness può usare modelli Claude o GPT al posto di DeepSeek?
Sì. Il campo del protocollo API indica il formato sul filo, non il fornitore: openai-completions è OpenAI Chat Completions, openai-responses è l'API Responses e anthropic-messages è l'API Anthropic Messages. Un provider personalizzato passa l'ID del modello direttamente all'URL di base configurato, quindi un ID Claude o GPT viene risolto da quell'endpoint, non dall'harness. Su Kunavo, un provider openai-completions all'indirizzo https://api.kunavo.com/v1 raggiunge gli ID Claude e GPT; un secondo provider con anthropic-messages all'indirizzo https://api.kunavo.com raggiunge solo gli ID Claude, usando il formato di richiesta nativo di Anthropic. Entrambi si affiancano alla scheda DeepSeek integrata, senza sostituirla, perciò gli ID DeepSeek continuano a usare la tua chiave DeepSeek.
Che cosa invia DeepSeek Harness a un provider personalizzato?
In un'esecuzione registrata di dsh 0.2.0-rc.2, entrambi i provider personalizzati — openai-completions e anthropic-messages — hanno inviato 24 definizioni di strumenti per ogni turno dell'agente, richiesto max_tokens 32,768, il valore predefinito dell'harness per un modello inserito manualmente senza indicarne le dimensioni, e inviato una breve richiesta di titolo per ogni nuova sessione con max_tokens 64. Nessuno dei due ha inviato dsh_session_log o dsh_plugin_packages: questi due campi, il registro degli eventi della sessione e l'elenco dei plugin installati, sono stati inviati solo con il percorso DeepSeek integrato. L'esecuzione è stata condotta con un server sostitutivo che registra le richieste, non con Kunavo, quindi mostra cosa invia dsh, non cosa ne fa un provider.
Perché DeepSeek Harness si comporta come se ignorasse il mio prompt di sistema?
Controlla se il modello dichiara livelli di ragionamento. Con openai-completions, l'harness invia il prompt di sistema di un modello di ragionamento con il ruolo "developer" invece di "system", perché deduce il formato della richiesta dall'URL dell'endpoint e tratta un indirizzo che non riconosce come se non fosse OpenAI stesso. Kunavo interpreta quel ruolo come il turno di sistema per ogni famiglia di modelli, Claude incluso, quindi su Kunavo il prompt arriva in entrambi i casi. Fino al 2026-09-30, il percorso Claude eliminava silenziosamente il ruolo: se prima di allora mancava un prompt, quella era la causa; la soluzione temporanea era compat.supportsDeveloperRole: false nel percorso o nel modello nel file cordis.patch.yml del profilo. Non è più necessario e non crea problemi se resta impostato. Un provider anthropic-messages non invia mai quel ruolo: il prompt di sistema viene trasmesso nel campo system di primo livello di Anthropic.
Perché “Recupera i modelli disponibili” non restituisce nulla o dà un errore 401 in DeepSeek Harness?
La ricerca usa l'URL di base, il protocollo e la chiave attualmente inseriti nel modulo; quindi un 401 in genere indica un problema con la chiave, mentre un elenco vuoto indica un problema con l'URL di base o un formato di elenco che la ricerca non legge. L'harness documenta entrambi i casi e consiglia di inserire gli ID manualmente, cosa che funziona allo stesso modo. I due protocolli inviano la chiave in modo diverso: openai-completions come Authorization: Bearer, anthropic-messages nell'header Anthropic x-api-key; l'elenco dei modelli di Kunavo accetta entrambi. Per capire quale parte non funziona, esegui un curl semplice verso https://api.kunavo.com/v1/models usando la stessa chiave nello stesso header: se ricevi JSON, il problema è nel modulo; un 401 indica la chiave, un 404 indica l'URL. Con anthropic-messages, un elenco completo lascia aperti due dubbi: se l'URL di base è corretto, perché la ricerca rimuove un eventuale /v1 finale dall'URL di elenco, ma le richieste dei modelli no; e quali ID il provider può chiamare, perché l'elenco comprende l'intero catalogo e qui funzionano solo gli ID claude-. Un provider integrato riceve sempre le risposte dal catalogo installato anche quando il suo URL di base punta altrove; usa quindi un provider personalizzato per vedere cosa offre davvero l'endpoint.