Documentação

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
# 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-5
A URL base depende do protocolo da API. openai-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.
Kunavo não oferece nenhum modelo DeepSeek. Este provedor fica ao lado do cartão do DeepSeek, não o substitui — mantenha sua chave DeepSeek onde está para os IDs 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.
O registro da sessão não é enviado junto. Na rota DeepSeek integrada, o dsh adiciona duas informações a cada solicitação que o modelo nunca vê: 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.
Ninguém na Kunavo executou o DeepSeek Harness contra o endpoint da Kunavo. O que foi executado, na data abaixo: dsh 0.2.0-rc.2 do npm, sem interface gráfica, três sessões novas por rota contra um substituto local que registra cada solicitação e responde com uma chamada de ferramenta — não contra a Kunavo nem contra um modelo. Todas as nove sessões concluíram uma troca de ferramenta em fluxo contínuo e enviaram os mesmos bytes em todas as execuções, o que confirma os caminhos e os limites desta página. Isso não diz nada sobre a autenticação da Kunavo, o roteamento ou as respostas de um modelo. A 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.
Kunavo não oferece modelos de incorporação, conversão de texto em fala nem conversão de fala em texto, então este provedor atende apenas a conclusões de conversa. Um plug-in do harness que transcreve áudio ou cria um índice vetorial mantém a chave do provedor que já usa — adicionar este provedor não redireciona essas chamadas.
Ainda não tem uma chave? Crie uma conta na Kunavo, gere uma chave (ela começa com 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

  1. Crie uma chave em /app/keys e copie-a — ela é exibida uma única vez.
  2. 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 no dsh — altere para Custom model API.
  3. 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.yaml e armazena no perfil apenas uma referência a ela.
  4. 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.
  5. 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 IDs claude- (saiba por que apenas esses).
  6. 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 modeloEntrada / saída da KunavoOnde se encaixa em DeepSeek Harness
claude-sonnet-5$1.40 / $7.00o modelo de trabalho padrão para sessões que editam arquivos
claude-opus-5$3.50 / $17.50planejamento de uma mudança em que errar sairia caro
claude-haiku-4-5$0.70 / $3.50interações baratas — triagem, resumos e o ciclo que roda o dia inteiro
gpt-5-6-sol$2.00 / $12.00uma segunda opinião de outra família, com a mesma chave e o mesmo provedor
gpt-5-6-terra$0.70 / $4.20entradas longas, em que a tarifa por token é o que determina o valor cobrado
A cobrança é por token, usando um saldo pré-pago e sem tarifa mensal — consulte billing. Em contextos repetidos — que representam a maior parte do que um editor ou cliente de chat envia — o cache de prompt altera a conta mais do que a escolha do modelo.

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 /v1 no 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/messages da Kunavo atende IDs claude-, e nenhum outro; um ID gpt- recebe um 404 que especifica /v1/chat/completions. Mantenha GPT no provedor openai-completions.
  • A busca lista todos os modelos; adicione apenas os modelos Claude. O README do dsh em llm-pi-ai informa que a descoberta neste protocolo consulta GET /v1/models com o cabeçalho x-api-key da Anthropic, e a lista de modelos da Kunavo aceita a chave nesse cabeçalho, assim como em Authorization: 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 IDs claude-. 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 de https://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ção developer não entra em questão —, e a Kunavo o repassa como está, em vez de traduzi-lo do formato OpenAI. O provedor openai-completions alcanç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:

  1. 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 exatamente max_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.
  2. compat.supportsDeveloperRole — não é necessário. O harness recomenda essa opção para gateways que rejeitam a função developer; 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.)
  3. 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_tokens e usa max_tokens como alternativa; assim, o valor padrão já funciona.
  4. 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; em openai-completions, cada chave é um nível e seu valor é a grafia enviada como reasoning_effort. Isso funciona para um ID gpt-; em um ID claude-, não tem efeito, porque a interface de chat da Kunavo não encaminha reasoning_effort para a Anthropic (/docs/chat#reasoning).
  5. 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 /models antes 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.