DeepSeek em toda parte: Claude Code e uma pilha de agentes locais

Publicado em
11 julho 2026
Atualizado em
16 setembro 2026
Por
Jacob Lloyd — escrito com ajuda de IA, depois do projeto
Tempo de leitura
11 min de leitura

Em termos simples: Um guia para integrar o DeepSeek – um serviço de IA na nuvem muito barato – às suas ferramentas de IA existentes, em vez de pagar por opções mais caras. O guia apresenta três configurações prontas para serem copiadas; uma delas garante que sua chave de acesso secreta permaneça bem protegida. Você terá assim assistência de IA de qualidade, por apenas uma fração de centavo por mensagem.

O DeepSeek sustentou três componentes diferentes na minha casa em julho de 2026: o “cérebro” da minha pilha de agentes, a interface de linha de comando Claude Code, e o nível de nuvem de um sistema de redundância. O esforço total para a configuração consistiu em algum JSON, algumas variáveis de ambiente e um bug relacionado ao systemd que me tomou uma noite inteira para resolver.

Atualização em 16/09/2026: minha pilha de agentes foi posteriormente reduzida para seis agentes; desde o final de agosto de 2026, o agente principal opera no MiniMax M3, com o DeepSeek atuando como alternativa sob demanda. A lista de oito agentes abaixo descreve a configuração existente na época da redação deste texto. A configuração de conexão permanece inalterada, sendo assim que o DeepSeek continua sendo integrado ao sistema.

Resumo:

  • O que é: A API em nuvem paga do DeepSeek, que funciona como o “cérebro” por trás de um sistema doméstico multiagente e também como backend para o CLI do Claude Code — não se trata de mais um guia do tipo “execute tudo no seu próprio GPU”.
  • Quanto custa: Frações de centavo por mensagem no plano mais barato. Não há assinatura; basta uma chave de API.
  • O que você precisa: uma chave de API do DeepSeek, qualquer ferramenta compatível com o padrão de completação de chat estilo OpenAI, e systemd caso queira usar o truque do Claude Code.
  • O que você obtém no final: três configurações prontas para copiar e colar, uma lista para decidir entre uso na nuvem ou localmente, além de um método para proteger a chave de API, impedindo que ela apareça no ps, no systemctl show e nos seus logs.

O resultado final

Antes de entrarmos nos detalhes práticos, vejam como ficou o sistema que montei em julho. Executei o OpenClaw, um gateway de agentes, com oito agentes nomeados por trás de uma interface de chat; além disso, usei também o CLI do Claude Code para as tarefas de programação propriamente ditas. O DeepSeek serviu de suporte para ambos.

PadrãoO que fazCusto
1. “Cérebro” do agenteO DeepSeek atua como provedor no arquivo de configuração do gateway; qualquer agente pode escolhê-lo como opção principal ou de reserva$0,14–$0,87 por milhão de tokens
2. Backend do Claude CodeO systemd redireciona automaticamente o CLI para o endpoint compatível com Anthropic do DeepSeek; não é necessária nenhuma reinstalaçãomesmo preço por token
3. Sequência de fallbackUma lista de critérios que determina quando uma tarefa deve ser enviada ao DeepSeek ou a um modelo local$0, caso seja processada localmente

O único elemento que torna tudo isso possível: o DeepSeek disponibiliza um endpoint compatível com Anthropic em https://api.deepseek.com/anthropic. Qualquer sistema criado para interagir com o Claude — incluindo o CLI do Claude Code — pode ser configurado para usá-lo apenas por meio de variáveis de ambiente. Não é preciso nenhum script intermediário, nem modificações adicionais.

Padrão 1: DeepSeek como “cérebro” de agentes

Um único bloco de provedor na configuração do gateway. Versão real; chaves foram redigidas:

"deepseek": {
  "baseUrl": "https://api.deepseek.com/v1",
  "api": "openai-completions",
  "apiKey": "CHANGE_ME",
  "timeoutSeconds": 450,
  "models": [
    {
      "id": "deepseek-v4-pro",
      "name": "deepseek-v4-pro",
      "reasoning": true,
      "input": ["text"],
      "cost": { "input": 0.435, "output": 0.87,
                "cacheRead": 0.003625, "cacheWrite": 0.435 },
      "contextWindow": 1000000,
      "maxTokens": 384000
    },
    {
      "id": "deepseek-v4-flash",
      "name": "deepseek-v4-flash",
      "reasoning": true,
      "input": ["text"],
      "cost": { "input": 0.14, "output": 0.28,
                "cacheRead": 0.0028, "cacheWrite": 0.14 },
      "contextWindow": 1000000,
      "maxTokens": 384000
    }
  ]
}

Cada agente, então, escolhe um modelo principal e uma cadeia de modelos de fallback:

"model": {
  "primary": "deepseek/deepseek-v4-flash",
  "fallbacks": ["deepseek/deepseek-v4-pro", "vllm/google/gemma-4-31b"]
}

Veja o que acontece quando uma mensagem chega por esse roteamento:

Minha lista de agentes em agosto de 2026, por função. A maioria dos agentes usava o DeepSeek como modelo principal e recorria a modelos locais como fallback; o modelo local, por sua vez, agia de forma inversa:

AgenteModelo principalModelos de fallback
Agente de chat principalDeepSeek flashDeepSeek pro → modelo local gemma-4-31b
Agente de raciocínioDeepSeek promodelo local gemma-4-31b
Trabalhador rápidoDeepSeek flashDeepSeek pro → modelo local
Agente de implantaçãoDeepSeek proDeepSeek flash → modelo local
Agente seguro para uso familiarDeepSeek flashDeepSeek pro → modelo local
Trabalhador localmodelo local 120BDeepSeek flash (inversamente: o modelo local é priorizado)
Segundo agente seguro para uso familiarmodelo localDeepSeek flash → DeepSeek pro
Agente de visãomodelo local gemma-31bDeepSeek pro → DeepSeek flash

O agente de visão é importante aqui: as configurações do DeepSeek são apenas para texto ("input": ["text"]), portanto todo o processamento de imagens permanece local, independentemente da cadeia de modelos escolhida. Os aliases (ds-flash, ds-brain) permitem que eu troque os modelos durante uma conversa, sem precisar editar a configuração.

Duas configurações podem causar problemas se forem ignoradas:

  • "reasoning": true é obrigatório para modelos de raciocínio. Eles transmitem o reasoning_content antes da resposta final; sem essa opção ativada, o gateway interpreta isso como silêncio, presume que o modelo travou e encerra a conversa após cerca de 390 segundos. Perguntem-me como eu sei disso.
  • Aumente o valor de timeoutSeconds. O timeout padrão para requisições era de 120 segundos; execuções longas de raciocínio ultrapassavam esse limite e “falhavam” aleatoriamente. Aqui, definir o valor como 450 resolveu o problema; as configurações dos provedores são recarregadas dinamicamente — não é preciso reiniciar o gateway.

Padrão 2: Claude Code CLI no DeepSeek

O Claude Code CLI lê as variáveis ANTHROPIC_BASE_URL, ANTHROPIC_MODEL e ANTHROPIC_AUTH_TOKEN/ANTHROPIC_API_KEY a partir do seu ambiente; o endpoint /anthropic do DeepSeek utiliza o mesmo formato de comunicação que o Claude. Portanto, para redirecionar o CLI, basta alterar o ambiente que o gateway fornece a cada subprocesso do Claude Code — o próprio CLI permanece como uma instalação padrão.

O arquivo em questão é um “drop-in” do systemd. Em julho, o meu foi gerado por um pequeno aplicativo GTK que eu desenvolvi, capaz de alternar entre quatro modos (Local com LM Studio / DeepSeek / Cloud da Anthropic / Desativado); porém, o arquivo é curto o suficiente para ser escrito manualmente:

# ~/.config/systemd/user/openclaw-gateway.service.d/60-subagent-routing.conf
[Service]
# Routes Claude Code CLI sub-processes to DeepSeek's Anthropic-compatible
# endpoint. The key is NOT copied here: $$DEEPSEEK_API_KEY is systemd's escape
# for a literal $DEEPSEEK_API_KEY, which bash expands at runtime from the
# gateway EnvironmentFile -- the secret never enters the unit or the argv.
Environment="ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic"
Environment="ANTHROPIC_MODEL=deepseek-v4-pro"
ExecStart=
ExecStart=/usr/bin/bash -c 'export ANTHROPIC_AUTH_TOKEN="$$DEEPSEEK_API_KEY"; export ANTHROPIC_API_KEY="$$DEEPSEEK_API_KEY"; exec node /path/to/openclaw/dist/index.js gateway --port 18789'

A chave de autenticação fica armazenada em um único local: no arquivo EnvironmentFile do serviço (um arquivo de ambiente controlado pelo gateway, com permissões chmod 600), que contém apenas a linha DEEPSEEK_API_KEY=CHANGE_ME.

O “truque” com $$ (o motivo real deste post)

Na minha primeira tentativa, usei um único $. Não deu certo. Dentro de um arquivo de unidade do systemd, o valor de $VAR é expandido pelo próprio systemd no momento da execução; isso faz com que a chave seja inserida diretamente na linha de comando — ficando visível em ps, em /proc/<pid>/cmdline e em systemctl show. Definitivamente não é o lugar ideal para guardar um segredo.

O uso de $$VAR é uma forma de “escapar” o valor de $VAR: o systemd passa essa string sem alterações, e o bash a expande posteriormente, a partir do ambiente já preenchido pelo EnvironmentFile. Resultado final: a chave fica armazenada apenas num arquivo com permissões chmod 600; ela nunca aparece no arquivo de unidade, em systemctl show ou nos argumentos do comando. É, na prática, um “gerenciador de segredos” rudimentar baseado no systemd e no bash — e funciona perfeitamente.

Outros cuidados ao implementar isso na prática:

  • Defina ambas as variáveis de autenticação. Versões diferentes do CLI lêem ANTHROPIC_AUTH_TOKEN ou ANTHROPIC_API_KEY; definir apenas uma é um “jogo de azar”.
  • Defina também ANTHROPIC_MODEL, caso contrário os aliases padrão do CLI (sonnet/opus) são enviados ao endpoint do DeepSeek, resultando em erro 404.
  • O “drop-in” sobrescreve qualquer chave da Anthropic real. Um único ambiente controla todo o funcionamento do CLI; percebi isso quando meus aliases para redirecionar as requisições ao Claude real pararam de funcionar sem aviso.
  • Inclua uma linha vazia antes de ExecStart=; senão o systemd simplesmente adiciona seu comando ao original, em vez de substituí-lo.
  • Atualizações de pacotes podem “desativar” esse wrapper. Como ele codifica o comando de execução, uma atualização que altere o ExecStart original exige a regeração do arquivo “drop-in”. Meu gerador lê o comando padrão a partir do FragmentPath da unidade e se recusa a modificar qualquer coisa que já contenha $$DEEPSEEK_API_KEY.
  • Por fim, recarregue o systemd: systemctl --user daemon-reload && systemctl --user restart <service>.

Para testar todo esse fluxo de ponta a ponta, basta pular o CLI e usar o curl diretamente:

curl https://api.deepseek.com/anthropic/v1/messages \
  -H "x-api-key: $DEEPSEEK_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"deepseek-v4-pro","max_tokens":16,"messages":[{"role":"user","content":"ping"}]}'

Se o retorno for um objeto "type":"message", significa que todo o caminho compatível com a Anthropic está funcionando perfeitamente.

Padrão 3: quando usar efetivamente o DeepSeek em vez do modelo local

Ter ambos os modelos não significa que todas as tarefas sejam enviadas para a nuvem. Por milhão de tokens, considerando os preços listados da Claude para diferentes escalas (Opus: $5/$25; Sonnet: $3/$15; Haiku: $1/$5):

OpçãoEntradaSaídaObservações
DeepSeek flash$0,14$0,28Custo de leitura do cache: $0,0028; o uso em agentes de chat custa apenas alguns centavos por dia
DeepSeek pro$0,435$0,87A versão “avançada” do modelo; ainda assim é 7 a 17 vezes mais barata que o Sonnet
Local (no mesmo computador)$0$0Apenas custos com eletricidade

A velocidade foi a maior surpresa. Os modelos locais de 100 bilhões de parâmetros me forçaram a aumentar os limites de tempo de resposta para 20–30 minutos; além disso, dois agentes compartilhando uma única GPU acabavam travando um ao outro. O DeepSeek responde em segundos; o limite máximo de 450 segundos só se torna relevante nos casos mais complexos de raciocínio. Outra diferença importante é o tamanho do contexto: o DeepSeek suporta até 1 milhão de tokens, enquanto os modelos locais permitem apenas cerca de 128 mil tokens. Por isso, sessões longas com agentes ou tarefas que envolvem grandes bases de código são melhor resolvidas pelo DeepSeek. Já no caso de processamento de imagens, o cenário é inverso: minhas integrações com o DeepSeek trabalham apenas com texto; portanto, tarefas como “analise esta imagem” devem ser feitas por um modelo local especializado em visão computacional.

O critério prático que eu uso para questões de privacidade é: não envie à nuvem nada que você não enviaria por e-mail.

As cadeias de fallback funcionam nos dois sentidos, e essa é a parte que mais gosto. Os agentes que usam principalmente a nuvem recorrem ao modelo local quando a internet ou a API falham; já os sistemas que dependem do modelo local caem no DeepSeek flash quando o servidor local está sobrecarregado ou indisponível. Assim, ninguém fica completamente sem resposta.

Armadilhas comuns – lista resumida

O sinalizador reasoning: true, o limite de tempo de 120 segundos, o caractere de escape $$ e o mecanismo de substituição que mascara sua chave real da Anthropic são todos abordados nos Padrões 1 e 2. Mais dois pontos importantes:

  • Uma lista de permissões de plugins não vazia é rigorosa. No OpenClaw, um provedor habilitado que não consta na lista plugins.allow simplesmente não é carregado. Sem erros, sem avisos — apenas silêncio.
  • O DeepSeek aqui funciona apenas com texto. Verifique o campo "input" na configuração do modelo antes de enviar tarefas que envolvam processamento visual para ele.

Quer rodar tudo localmente — sem chave de API, sem custos na nuvem? Também escrevi sobre isso: DeepSeek: Executando Localmente — um Guia em 4 Passos. O DeepSeek pode ser executado na sua própria GPU usando Ollama, Docker e Open WebUI. Esse é o caminho para iniciantes; este guia, por sua vez, destina-se a situações em que as tarefas pesadas ultrapassam a capacidade da GPU, mas os dados confidenciais precisam permanecer no seu ambiente local.

Relacionado: a pilha de agentes de IA local na qual essa configuração opera, OpenClaw Model Manager (a interface gráfica que gera o mecanismo de substituição do Claude Code), execução totalmente local do DeepSeek e como configurar um assistente de IA baseado em LLM.


← Mais de IA e LLM Local