Documentação
DeepSeek Harness
O DeepSeek Harness mantém seu próprio cartão do DeepSeek e adiciona o seu ao lado. Cinco campos em “Add model provider” → “Custom model API” colocam Claude e GPT no mesmo seletor de modelos, com uma única chave.
Settings → Models → “Add model provider” → “Custom model API” recebe cinco campos — Provider ID, display name, base URL, API protocol e API key — e coloca Claude e GPT no mesmo seletor do cartão DeepSeek integrado.
# 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 usa https://api.kunavo.com/v1; anthropic-messages usa https://api.kunavo.com, sem /v1, porque o dsh acrescenta /v1/messages por conta própria. Uma execução do dsh 0.2.0-rc.2 contra um substituto local que registrava as solicitações confirmou os dois casos: o primeiro enviou uma solicitação para /v1/chat/completions; o segundo, para /v1/messages?beta=true a partir da raiz sem caminho — e para /v1/v1/messages quando a URL base incluía /v1, caso em que um gateway real responde com 404, não com um erro de autenticação.reasoningEfforts altera a função da mensagem no prompt do sistema, não se ela é enviada. A documentação do harness informa que, quando um modelo declara capacidade de raciocínio, o prompt do sistema é enviado como role: "developer". Kunavo interpreta essa função como a mensagem de sistema em todas as famílias, inclusive Claude, então não é preciso ativar compat. Até 2026-09-30, o caminho do Claude descartava a função, e este cartão orientava você a definir compat.supportsDeveloperRole: false; se você fez isso, não há problema, e a configuração pode permanecer.deepseek- e use esta para os IDs Claude e GPT da tabela abaixo. Isso também significa que a opção compat.thinkingFormat: deepseek documentada pelo harness para “DeepSeek V4 por meio de um gateway compatível com OpenAI” não tem efeito aqui.dsh_session_log, os eventos da sessão, incluindo o caminho do diretório de trabalho, e dsh_plugin_packages. Na execução, nenhum dos provedores personalizados enviou uma delas, então um provedor Kunavo não as recebe. Saiba quanto elas representam e qual opção desativa o envio em Preços do DeepSeek Harness.curl abaixo é a parte da Kunavo, e você pode verificá-la em dez segundos; o dsh é uma prévia para desenvolvedores e continua em evolução.sk-kn-) e adicione crédito a partir de $10 — as chamadas são pagas com esse saldo, e chamadas malsucedidas não são cobradas. O painel então abre na configuração de DeepSeek Harness.Passo a passo
- Crie uma chave em
/app/keyse copie-a — ela é exibida uma única vez. - Inicie a interface Web (
dsh web) e acesse Settings → Models. Selecione Add model provider. O cartão abre em Third-party model provider, que lista apenas os provedores incluídos nodsh— altere para Custom model API. - Preencha Provider ID (em letras minúsculas e permanente — a documentação informa que as solicitações, as sessões salvas, os padrões de modelo e as referências às credenciais usam esse ID; para renomeá-lo, é preciso adicionar um novo provedor e excluir o antigo), nome de exibição, URL base
https://api.kunavo.com/v1, protocolo da API OpenAI Chat Completions e chave de API. A chave é somente para gravação; o dsh a mantém em$DSH_HOME/.credentials.yamle armazena no perfil apenas uma referência a ela. - Em Model catalog, selecione Fetch available models — Kunavo responde com
GET /v1/models, então a lista é preenchida automaticamente. Marque os modelos que quiser e selecione Add selected. Também funciona digitar os IDs manualmente, e a documentação recomenda fazer isso sempre que a descoberta não listar nenhum modelo. - Opcional: para usar IDs Claude com o protocolo próprio da Anthropic, adicione uma segunda API de modelo personalizada com seu próprio Provider ID, URL base
https://api.kunavo.com— sem/v1—, protocolo da API Anthropic Messages e a mesma chave. A busca também lista o catálogo completo aqui; adicione apenas os IDsclaude-(saiba por que apenas esses). - Escolha um modelo no compositor e envie uma mensagem que envolva um arquivo, não apenas uma saudação — o harness depende de chamadas de ferramentas para a maior parte do que faz, então uma primeira execução que leia e edite algo informa mais. As alterações de modelo entram em vigor na próxima solicitação; a documentação afirma explicitamente que não é necessário reiniciar.
Verificado em a página “Configure models” do DeepSeek Harness (o mesmo texto de docs/user/guide/providers.md na tag dsh-v0.2.0-rc.2) em 1 de outubro de 2026. As configurações de terceiros podem mudar; se o nome de um campo aqui já não corresponder ao que você vê, aquela página é a autoridade, não esta.
Verifique antes de depurar o cliente
Uma solicitação determina se a falha está no endpoint, na chave ou no arquivo de configuração. Se isto retornar JSON, a mesma URL base e a mesma chave funcionarão em 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-..."Qual ID de modelo inserir no campo
Todo modelo de texto pode ser acessado como um ID de modelo — a lista atual está em GET /v1/models, e o catálogo com preços está na página de modelos. As tarifas são em USD por 1 milhão de tokens, entrada / saída.
| ID do modelo | Entrada / saída da Kunavo | Onde se encaixa em DeepSeek Harness |
|---|---|---|
claude-sonnet-5 | $1.40 / $7.00 | o modelo de trabalho padrão para sessões que editam arquivos |
claude-opus-5 | $3.50 / $17.50 | planejamento de uma mudança em que errar sairia caro |
claude-haiku-4-5 | $0.70 / $3.50 | interações baratas — triagem, resumos e o ciclo que roda o dia inteiro |
gpt-5-6-sol | $2.00 / $12.00 | uma segunda opinião de outra família, com a mesma chave e o mesmo provedor |
gpt-5-6-terra | $0.70 / $4.20 | entradas longas, em que a tarifa por token é o que determina o valor cobrado |
Claude por meio de Anthropic Messages
Kunavo também responde à API Anthropic Messages, e anthropic-messages é um dos três protocolos oferecidos pelo formulário. A documentação do harness é clara: “Um provedor usa um protocolo; portanto, um gateway que oferece dois precisa de dois provedores” — trata-se de um segundo provedor ao lado do primeiro, não de uma configuração dele.
- URL base
https://api.kunavo.com, a raiz sem caminho. Na execução, essa raiz enviou uma solicitação para/v1/messages?beta=true— o caminho que o Claude Code também usa e que a Kunavo responde. Com/v1no final, a solicitação foi enviada para/v1/v1/messages. DeepSeek Harness e Claude Code compara lado a lado as solicitações dos dois clientes. - Apenas IDs Claude. A
/v1/messagesda Kunavo atende IDsclaude-, e nenhum outro; um IDgpt-recebe um404que especifica/v1/chat/completions. Mantenha GPT no provedoropenai-completions. - A busca lista todos os modelos; adicione apenas os modelos Claude. O README do dsh em
llm-pi-aiinforma que a descoberta neste protocolo consultaGET /v1/modelscom o cabeçalhox-api-keyda Anthropic, e a lista de modelos da Kunavo aceita a chave nesse cabeçalho, assim como emAuthorization: Bearer— isso se baseia no código-fonte do dsh e nos próprios testes da Kunavo, não na execução. O resultado de Fetch available models é o catálogo completo, incluindo GPT e modelos de imagem; portanto, marque apenas os IDsclaude-. Digitar os IDs manualmente funciona da mesma forma. Uma lista completa confirma menos do que parece: o mesmo README diz que a URL de listagem é aceita com ou sem/v1, enquanto as solicitações de modelo usam a URL base sem alterações — portanto, Fetch também preenche a lista a partir dehttps://api.kunavo.com/v1, mas a primeira mensagem enviada usando essa URL base vai para/v1/v1/messages. - O que isso permite. A solicitação chega no formato da Anthropic — na execução, o prompt do sistema foi enviado no campo de nível superior
system, então a funçãodevelopernão entra em questão —, e a Kunavo o repassa como está, em vez de traduzi-lo do formato OpenAI. O provedoropenai-completionsalcança os mesmos IDs Claude por meio de tradução, e é por isso que ele é usado nas etapas.
O arquivo usado pelo formulário
A página Models grava $DSH_HOME/profiles/<profile>/cordis.patch.yml — $DSH_HOME/profiles/web/cordis.patch.yml quando você começa com dsh web. A documentação antiga do dsh apontava para $DSH_HOME/settings.yaml; a documentação da versão 0.2.0-rc.2, não. Quando o navegador está na mesma máquina que o servidor, Open configuration file no cabeçalho Settings abre o arquivo, e os adaptadores o leem novamente na próxima solicitação. Cinco detalhes importam para este endpoint:
- Janela de contexto e máximo de tokens de saída — no formulário, em Customized settings → Model options. Um ID digitado manualmente não inclui nenhum dos dois, então se aplicam os valores padrão da rota: 262,144 tokens de contexto e 32,768 de saída, segundo o README do
llm-pi-ai— e, na execução, os dois provedores personalizados solicitaram exatamentemax_tokens: 32768. Todos os IDs na tabela acima aceitam valores maiores; confira a linha correspondente e aumente os limites usando a entrada do catálogo do modelo se quiser mais. A Kunavo cobra pelos tokens que o modelo gera, não pelo limite. compat.supportsDeveloperRole— não é necessário. O harness recomenda essa opção para gateways que rejeitam a funçãodeveloper; Kunavo interpreta essa função como a mensagem de sistema em todas as famílias, inclusive Claude. (Até 2026-09-30, o caminho do Claude a descartava, e este item orientava a ativar a opção — não há problema em deixá-la ativada.)compat.maxTokensField— deixe como está. O harness combina essa opção com a opção acima como solução inicial habitual, mas o próprio manipulador da Kunavo lêmax_completion_tokense usamax_tokenscomo alternativa; assim, o valor padrão já funciona.reasoningEfforts— nenhum campo no formulário. Um modelo inserido manualmente não declara níveis, então o menu Effort não aparece, e o valor padrão do próprio endpoint determina se o modelo raciocina. Declare os níveis você mesmo se quiser o menu; emopenai-completions, cada chave é um nível e seu valor é a grafia enviada comoreasoning_effort. Isso funciona para um IDgpt-; em um IDclaude-, não tem efeito, porque a interface de chat da Kunavo não encaminhareasoning_effortpara a Anthropic (/docs/chat#reasoning).- Tipos de entrada (
input: [text, image]no arquivo) — a documentação deixa claro que isso “declara algo sobre seu endpoint, em vez de verificá-lo”. Marcar Image para um ID que não aceita imagens não é detectado pelo harness; a solicitação só é recusada mais adiante. Confira o ID em/modelsantes de marcar a opção.
O restante do que uma sessão envia — 24 definições de ferramentas por turno, uma solicitação curta de título para cada sessão nova e os campos adicionais na rota própria do DeepSeek — está contabilizado em Preços do DeepSeek Harness.
Perguntas frequentes
Como adiciono um provedor de API personalizado ao DeepSeek Harness?
Inicie a interface Web com dsh web, acesse Settings → Models e selecione "Add model provider". O cartão abre em "Third-party model provider", que lista apenas os provedores incluídos no dsh; altere para "Custom model API". O formulário solicita um Provider ID em letras minúsculas, um nome de exibição, uma URL base, um protocolo de API e uma chave de API; depois, é preciso adicionar pelo menos um modelo em Model catalog. O Provider ID é permanente, pois as solicitações, as sessões salvas, os padrões de modelo e as referências às credenciais usam esse ID; para renomeá-lo, é preciso adicionar um novo provedor e excluir o antigo. Na versão 0.2.0-rc.2, a página salva no cordis.patch.yml do perfil ativo — $DSH_HOME/profiles/web/cordis.patch.yml ao usar dsh web.
A URL base do DeepSeek Harness precisa terminar com /v1?
Depende do protocolo da API. Para openai-completions, sim: https://api.kunavo.com/v1; em uma execução do dsh 0.2.0-rc.2, a solicitação foi enviada para /v1/chat/completions. Para anthropic-messages, não: https://api.kunavo.com, porque o dsh acrescenta /v1/messages por conta própria — a raiz sem caminho enviou uma solicitação para /v1/messages?beta=true, enquanto uma URL base terminada em /v1 enviou uma solicitação para /v1/v1/messages, caso em que um gateway real responde com 404, não com um erro de autenticação. A execução foi feita contra um substituto local que registra as solicitações, não contra a Kunavo.
O DeepSeek Harness pode usar modelos Claude ou GPT em vez de DeepSeek?
Sim. O campo do protocolo da API indica o formato de transmissão, não o fornecedor: openai-completions é o OpenAI Chat Completions, openai-responses é a Responses API e anthropic-messages é a Anthropic Messages API. Um provedor personalizado envia o ID do modelo diretamente para a URL base configurada, então um ID Claude ou GPT é resolvido nesse endpoint, não dentro do harness. Na Kunavo, um provedor openai-completions em https://api.kunavo.com/v1 acessa IDs Claude e GPT; um segundo provedor com anthropic-messages em https://api.kunavo.com acessa somente os IDs Claude, no formato de solicitação próprio da Anthropic. Ambos ficam ao lado do cartão DeepSeek integrado, sem substituí-lo, então os IDs DeepSeek continuam usando sua chave DeepSeek.
O que o DeepSeek Harness envia a um provedor personalizado?
Em uma execução registrada do dsh 0.2.0-rc.2, os dois provedores personalizados — openai-completions e anthropic-messages — enviaram 24 definições de ferramentas em cada turno do agente, solicitaram max_tokens 32,768, valor padrão do harness para modelos inseridos sem especificar um limite, e fizeram uma solicitação curta de título por sessão nova com max_tokens 64. Nenhum deles enviou dsh_session_log ou dsh_plugin_packages: esses dois campos, o registro de eventos da sessão e a lista de plug-ins instalados, foram enviados apenas pela rota DeepSeek integrada. A execução usou um substituto que registra as solicitações, não a Kunavo, então mostra o que o dsh envia, não o que qualquer provedor faz com elas.
Por que o DeepSeek Harness parece ignorar meu prompt do sistema?
Confira se o modelo declara níveis de raciocínio. Com openai-completions, o harness envia o prompt do sistema de um modelo com capacidade de raciocínio usando a função "developer" em vez de "system", porque infere o formato da solicitação com base na URL do endpoint e considera que um endereço que não reconhece não é o próprio OpenAI. Kunavo interpreta essa função como a mensagem de sistema em todas as famílias de modelos, inclusive Claude, então, na Kunavo, o prompt chega de qualquer forma. Até 2026-09-30, o caminho do Claude descartava essa função silenciosamente; se um prompt não chegava antes disso, essa era a causa, e compat.supportsDeveloperRole: false na rota ou no modelo em cordis.patch.yml do perfil era a solução alternativa. Isso não é mais necessário, e não há problema em deixar a configuração. Um provedor anthropic-messages nunca envia essa função: o prompt do sistema é enviado no campo system de nível superior da Anthropic.
Por que “Fetch available models” não retorna nada ou retorna 401 no DeepSeek Harness?
A descoberta usa a URL base, o protocolo e a chave informados no formulário, então um 401 geralmente indica um problema com a chave, e uma lista vazia, com a URL base ou com um formato de listagem que a descoberta não reconhece. O harness documenta ambos os resultados e recomenda inserir os IDs manualmente, o que funciona da mesma forma. Os dois protocolos enviam a chave de formas diferentes — openai-completions usa Authorization: Bearer; anthropic-messages usa o cabeçalho x-api-key da Anthropic — e a lista de modelos da Kunavo aceita ambos. Para identificar onde está o problema, faça um curl simples para https://api.kunavo.com/v1/models usando a mesma chave no mesmo cabeçalho: se receber JSON, o problema está no formulário; se receber 401, está na chave; se receber 404, está na URL. Em anthropic-messages, uma lista completa ainda deixa duas dúvidas: se a URL base está correta, pois a descoberta remove um /v1 final da URL de listagem, mas as solicitações de modelo não, e quais IDs o provedor pode chamar, pois a lista contém o catálogo completo, mas apenas os IDs claude- funcionam ali. Para um provedor integrado, a resposta sempre vem do catálogo instalado, mesmo quando a URL base aponta para outro lugar; use a busca por um provedor personalizado para ver o que o endpoint realmente oferece.