<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Lucas</title>
    <description>The latest articles on DEV Community by Lucas (@lucas_ferreira).</description>
    <link>https://dev.to/lucas_ferreira</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3821523%2F8a141e03-a0f4-42d4-b4f6-38a3247d8baf.png</url>
      <title>DEV Community: Lucas</title>
      <link>https://dev.to/lucas_ferreira</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lucas_ferreira"/>
    <language>en</language>
    <item>
      <title>Ghostty Deixando o GitHub: Impacto para Criadores de Ferramentas de Desenvolvedores</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Thu, 30 Apr 2026 03:57:48 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/ghostty-deixando-o-github-impacto-para-criadores-de-ferramentas-de-desenvolvedores-5h9f</link>
      <guid>https://dev.to/lucas_ferreira/ghostty-deixando-o-github-impacto-para-criadores-de-ferramentas-de-desenvolvedores-5h9f</guid>
      <description>&lt;p&gt;Em 28 de abril de 2026, Mitchell Hashimoto anunciou que o Ghostty, seu emulador de terminal de código aberto, deixará o GitHub. Hashimoto é o usuário 1299 do GitHub, entrou na plataforma em fevereiro de 2008 e a usou quase todos os dias por mais de 18 anos. Mesmo assim, após registrar interrupções frequentes em um diário de “quase todo dia tem um X”, uma falha do GitHub Actions no dia do anúncio bloqueou suas revisões de PR por duas horas. O veredito foi direto: “Este não é mais um lugar para trabalho sério se ele simplesmente te bloqueia por horas por dia, todos os dias.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Se você desenvolve ferramentas para desenvolvedores, vale ler esse anúncio como um estudo de caso de confiabilidade. Hashimoto não é um usuário casual: ele cofundou a HashiCorp sobre o GitHub e lançou Terraform, Vagrant, Vault, Consul e Boundary usando a plataforma. Quando um usuário desse perfil sai por motivos de confiabilidade, a discussão deixa de ser “qual forja usar” e passa a ser: sua ferramenta continua funcionando quando a infraestrutura que você não controla falha?&lt;/p&gt;

&lt;p&gt;Para contexto sobre ferramentas de desenvolvedor na era da IA e fluxos nativos do GitHub, veja &lt;a href="http://apidog.com/blog/how-to-write-agents-md-files?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como escrever arquivos AGENTS.md&lt;/a&gt; e &lt;a href="http://apidog.com/blog/github-copilot-usage-billing-api-teams?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;uso e API de faturamento do GitHub Copilot para equipes&lt;/a&gt;. Para um exemplo de automação em torno de lacunas de confiabilidade do GitHub, veja o &lt;a href="http://apidog.com/blog/clawsweeper-openclaw-github-triage-bot?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;artigo sobre o bot de triagem Clawsweeper&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mitchell Hashimoto anunciou em 28 de abril de 2026 que o Ghostty deixará o GitHub para uma forja ainda não nomeada.&lt;/li&gt;
&lt;li&gt;O motivo foi confiabilidade: interrupções recorrentes do GitHub Actions e da plataforma, registradas por ele em um diário de “quase todo dia tem um X”.&lt;/li&gt;
&lt;li&gt;No dia do anúncio, uma interrupção de duas horas do Actions bloqueou revisões de PR.&lt;/li&gt;
&lt;li&gt;O repositório do Ghostty no GitHub permanecerá como espelho somente leitura; o desenvolvimento ativo migrará de forma incremental.&lt;/li&gt;
&lt;li&gt;A lição principal para quem constrói ferramentas de desenvolvedor: confiabilidade supera recursos quando sua ferramenta está no caminho crítico.&lt;/li&gt;
&lt;li&gt;Para equipes de API, o caminho prático é desacoplar dependências: simulações, múltiplos provedores, adaptadores intercambiáveis e pipelines de fallback.&lt;/li&gt;
&lt;li&gt;O &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; segue esse padrão ao permitir modelagem, testes e simulação de APIs em um fluxo único.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O que Hashimoto anunciou
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mitchellh.com/writing/ghostty-leaving-github" rel="noopener noreferrer"&gt;A publicação de Hashimoto&lt;/a&gt; é curta e direta. Ele explica que começou a manter um diário de interrupções do GitHub, que esse diário cresceu mais rápido do que o esperado e que, na manhã em que escreveu o anúncio, uma falha do GitHub Actions o impediu de revisar PRs por duas horas.&lt;/p&gt;

&lt;p&gt;A decisão não foi apresentada como reação a um único incidente. Segundo ele, o problema era o padrão: interrupções frequentes o suficiente para tornar o GitHub inadequado para o trabalho diário do Ghostty.&lt;/p&gt;

&lt;p&gt;O escopo da mudança também foi delimitado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Ghostty sairá do GitHub.&lt;/li&gt;
&lt;li&gt;Outros projetos de Hashimoto permanecerão no GitHub por enquanto.&lt;/li&gt;
&lt;li&gt;O &lt;a href="https://github.com/ghostty-org/ghostty" rel="noopener noreferrer"&gt;repositório Ghostty&lt;/a&gt; continuará disponível como espelho somente leitura.&lt;/li&gt;
&lt;li&gt;Issues, pull requests e CI migrarão para uma nova forja.&lt;/li&gt;
&lt;li&gt;A migração será incremental.&lt;/li&gt;
&lt;li&gt;O destino ainda não foi anunciado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O ponto importante: Hashimoto não citou preço, recursos, Copilot, Microsoft ou direção de produto. A queixa foi operacional: a plataforma parava de responder por horas, e isso bloqueava o trabalho.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que o problema central é confiabilidade
&lt;/h2&gt;

&lt;p&gt;A pergunta menos útil é “para onde o Ghostty vai?”. A pergunta mais útil para equipes técnicas é:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O que acontece quando uma plataforma central para o seu fluxo de entrega deixa de ser confiável o suficiente?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Três fatores tornam esse caso relevante para desenvolvedores:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. O usuário
&lt;/h3&gt;

&lt;p&gt;Hashimoto construiu ferramentas de infraestrutura usadas em escala empresarial. Quando ele diz que uma plataforma não é confiável para trabalho sério, essa mensagem chega a pessoas que decidem onde código-fonte, CI, releases e automações corporativas vivem.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. O motivo
&lt;/h3&gt;

&lt;p&gt;Ele não saiu por uma controvérsia de produto. Saiu porque o serviço continuava falhando. Isso reduz a discussão ao critério mais importante para ferramentas de desenvolvedor:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A ferramenta funciona quando o usuário precisa dela?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. O tom
&lt;/h3&gt;

&lt;p&gt;A publicação não é um manifesto. Parece uma decisão operacional tomada depois de tentativas de continuar. Isso torna o sinal mais forte: não há exagero, apenas acúmulo de falhas.&lt;/p&gt;

&lt;p&gt;Para quem opera uma ferramenta de desenvolvedor, esse é o pior cenário: um usuário avançado registra pequenas falhas durante meses até concluir que migrar custa menos do que continuar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como auditar sua própria ferramenta
&lt;/h2&gt;

&lt;p&gt;Se seu produto está no caminho crítico de desenvolvedores, use o caso Ghostty como checklist.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Quantos usuários poderiam escrever o mesmo diário sobre você?
&lt;/h3&gt;

&lt;p&gt;Faça um levantamento dos últimos 90 dias:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;incidentes públicos;&lt;/li&gt;
&lt;li&gt;degradações não publicadas;&lt;/li&gt;
&lt;li&gt;falhas parciais;&lt;/li&gt;
&lt;li&gt;lentidão em endpoints críticos;&lt;/li&gt;
&lt;li&gt;jobs de background atrasados;&lt;/li&gt;
&lt;li&gt;erros intermitentes em integrações.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depois mapeie isso contra as horas de trabalho dos seus principais clientes.&lt;/p&gt;

&lt;p&gt;Pergunta prática:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Quantas horas produtivas um usuário pesado perdeu por causa da nossa ferramenta nesta semana?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se a resposta for “mais de zero” de forma recorrente, você tem um problema de tendência.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Sua confiabilidade está melhorando ou piorando?
&lt;/h3&gt;

&lt;p&gt;Não olhe apenas para uptime agregado. Observe a direção.&lt;/p&gt;

&lt;p&gt;Um serviço pode cumprir SLA e, ainda assim, estar ficando pior para usuários intensivos. O diário de Hashimoto não documentava um único evento; documentava uma tendência.&lt;/p&gt;

&lt;p&gt;Implemente um orçamento de erro por componente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Componente: CI
SLO: 99,9% de disponibilidade em horário comercial
Orçamento de erro mensal: 43 minutos
Responsável: Equipe de plataforma
Revisão: toda segunda-feira
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se ninguém lê esse orçamento semanalmente, ele não influencia decisões.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Sua página de status reduz ou aumenta a desconfiança?
&lt;/h3&gt;

&lt;p&gt;Usuários criam seus próprios diários quando não confiam no sinal público.&lt;/p&gt;

&lt;p&gt;Sua página de status deve indicar degradação real, não apenas downtime total. Publique quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;uma região estiver lenta;&lt;/li&gt;
&lt;li&gt;filas estiverem atrasadas;&lt;/li&gt;
&lt;li&gt;webhooks estiverem com latência elevada;&lt;/li&gt;
&lt;li&gt;APIs estiverem retornando 5xx acima do normal;&lt;/li&gt;
&lt;li&gt;CI estiver com tempo de espera elevado;&lt;/li&gt;
&lt;li&gt;autenticação estiver intermitente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se o usuário percebe falha e sua página diz “All systems operational”, você perdeu credibilidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Seu uptime mede a experiência certa?
&lt;/h3&gt;

&lt;p&gt;Um uptime de 99,95% pode ser ruim se o downtime ocorrer no horário em que os desenvolvedores usam o produto.&lt;/p&gt;

&lt;p&gt;Para ferramentas de desenvolvedor, meça disponibilidade contra a curva real de uso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;horário de revisão de PR;&lt;/li&gt;
&lt;li&gt;janelas de deploy;&lt;/li&gt;
&lt;li&gt;horário de execução de CI;&lt;/li&gt;
&lt;li&gt;picos de chamadas de API;&lt;/li&gt;
&lt;li&gt;ciclos de release.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Duas horas de indisponibilidade durante uma sessão de revisão podem invalidar a sessão inteira.&lt;/p&gt;

&lt;h2&gt;
  
  
  O custo real do “sempre GitHub”
&lt;/h2&gt;

&lt;p&gt;Hashimoto escreveu que, para ele, “nunca foi uma questão onde colocar meus projetos: sempre GitHub”.&lt;/p&gt;

&lt;p&gt;Esse hábito tem custo.&lt;/p&gt;

&lt;p&gt;Quando uma plataforma concentra repositórios, issues, PRs, CI, pacotes, releases e identidade, o lock-in não está apenas no Git. Clonar o histórico do repositório é simples. Migrar todo o resto não é.&lt;/p&gt;

&lt;p&gt;O que costuma ficar preso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;histórico de issues;&lt;/li&gt;
&lt;li&gt;discussões;&lt;/li&gt;
&lt;li&gt;comentários de PR;&lt;/li&gt;
&lt;li&gt;revisões;&lt;/li&gt;
&lt;li&gt;checks de CI;&lt;/li&gt;
&lt;li&gt;segredos;&lt;/li&gt;
&lt;li&gt;permissões;&lt;/li&gt;
&lt;li&gt;CODEOWNERS;&lt;/li&gt;
&lt;li&gt;GitHub Actions;&lt;/li&gt;
&lt;li&gt;GitHub Packages;&lt;/li&gt;
&lt;li&gt;automações via API;&lt;/li&gt;
&lt;li&gt;integrações OAuth;&lt;/li&gt;
&lt;li&gt;workflows internos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O custo de migração é um iceberg: o repositório é a parte visível.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como reduzir lock-in na prática
&lt;/h2&gt;

&lt;p&gt;Se você constrói uma ferramenta de desenvolvedor integrada ao GitHub, trate o GitHub como um provedor, não como a infraestrutura inteira.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use adaptadores
&lt;/h3&gt;

&lt;p&gt;Em vez de espalhar chamadas diretas para a API do GitHub pelo código, isole-as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;SourceControlProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;getPullRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PullRequest&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;listIssues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Issue&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;createComment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;targetId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;getChangedFiles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FileChange&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois implemente provedores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GitHubProvider&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;SourceControlProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getPullRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// chamada para GitHub API&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;listIssues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// chamada para GitHub Issues&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;createComment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;targetId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// comentário em PR ou issue&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getChangedFiles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// arquivos alterados no PR&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No futuro, você pode adicionar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GitLabProvider&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;SourceControlProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// mesma interface, outro backend&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ForgejoProvider&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;SourceControlProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// mesma interface, outro backend&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O objetivo não é migrar amanhã. É evitar que a migração exija reescrever o produto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Separe CI da plataforma de hospedagem
&lt;/h3&gt;

&lt;p&gt;Se todo o seu pipeline depende do GitHub Actions, uma interrupção do Actions bloqueia seu release.&lt;/p&gt;

&lt;p&gt;Opções práticas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;manter um runner auto-hospedado para caminhos críticos;&lt;/li&gt;
&lt;li&gt;espelhar jobs essenciais em outro CI;&lt;/li&gt;
&lt;li&gt;documentar release manual;&lt;/li&gt;
&lt;li&gt;manter artefatos reproduzíveis localmente;&lt;/li&gt;
&lt;li&gt;evitar que publicação de pacote dependa de uma única plataforma.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de checklist mínimo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ ] Consigo gerar build localmente?
[ ] Consigo rodar testes sem GitHub Actions?
[ ] Consigo publicar release se o GitHub estiver fora?
[ ] Consigo reconstruir artefatos a partir de tag assinada?
[ ] Existe runbook para release manual?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Espelhe antes de precisar
&lt;/h3&gt;

&lt;p&gt;Espelhamento semanal para uma segunda forja já reduz risco.&lt;/p&gt;

&lt;p&gt;Exemplo simples de mirror com Git:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--mirror&lt;/span&gt; git@github.com:org/projeto.git
&lt;span class="nb"&gt;cd &lt;/span&gt;projeto.git
git remote add backup git@codeberg.org:org/projeto.git
git push &lt;span class="nt"&gt;--mirror&lt;/span&gt; backup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Automatize isso em CI ou em um job agendado fora do GitHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternativas de forja
&lt;/h2&gt;

&lt;p&gt;Hashimoto não anunciou o destino do Ghostty. As opções plausíveis incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Forgejo&lt;/strong&gt;: fork FOSS do Gitea, mantido pela Codeberg e.V.; opção comum para projetos alinhados ao ecossistema FOSS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codeberg&lt;/strong&gt;: instância hospedada do Forgejo, operada como organização sem fins lucrativos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitLab&lt;/strong&gt;: CI/CD forte e ampla cobertura de recursos, com suporte comercial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sourcehut&lt;/strong&gt;: fluxo baseado em e-mail, minimalista e rápido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forgejo ou Gitea auto-hospedado&lt;/strong&gt;: controle máximo, maior responsabilidade operacional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Radicle&lt;/strong&gt;: abordagem peer-to-peer, ainda mais inicial para projetos públicos de grande visibilidade.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nenhuma substitui o GitHub perfeitamente em todos os fluxos. Esse é justamente o problema: quando uma plataforma absorve toda a pilha, sair dela exige planejamento incremental.&lt;/p&gt;

&lt;h2&gt;
  
  
  A lição para equipes de API
&lt;/h2&gt;

&lt;p&gt;Para equipes que constroem APIs ou ferramentas de API, substitua:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub Actions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;por:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API upstream da qual seu produto depende
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A questão estrutural é a mesma:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Quanto do trabalho do cliente depende de um serviço que você não controla?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Três práticas reduzem esse risco.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Simule tudo que você depende
&lt;/h2&gt;

&lt;p&gt;Se a API upstream cair, o desenvolvimento local e os testes não devem parar.&lt;/p&gt;

&lt;p&gt;Você precisa de mocks realistas para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;desenvolvimento local;&lt;/li&gt;
&lt;li&gt;testes automatizados;&lt;/li&gt;
&lt;li&gt;CI;&lt;/li&gt;
&lt;li&gt;demos;&lt;/li&gt;
&lt;li&gt;validação de contrato;&lt;/li&gt;
&lt;li&gt;cenários de erro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de resposta simulada para uma API de chat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chatcmpl_mock_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chat.completion"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1714300000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mock-model"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"choices"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"assistant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Resposta simulada para ambiente de desenvolvimento."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"finish_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stop"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com o Apidog, você define os esquemas de request/response e gera um servidor simulado a partir dessas definições. Isso permite continuar desenvolvendo mesmo quando o provedor real está indisponível.&lt;/p&gt;

&lt;p&gt;Veja também &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como usar a API GPT-5.5&lt;/a&gt; para um exemplo de fluxo multi-provedor no formato OpenAI.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Teste contra múltiplos provedores
&lt;/h2&gt;

&lt;p&gt;Se seu produto depende de provedores como OpenAI, Anthropic, Mistral, DeepSeek, Google ou xAI, evite acoplar a lógica de negócio a apenas um deles.&lt;/p&gt;

&lt;p&gt;Use variáveis de ambiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;API_PROVIDER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;openai
&lt;span class="nv"&gt;API_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.openai.com/v1
&lt;span class="nv"&gt;API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para alternar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;API_PROVIDER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;backup
&lt;span class="nv"&gt;API_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.backup-provider.example/v1
&lt;span class="nv"&gt;API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O teste deve validar o contrato comum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;chat completion provider&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;returns a message with content&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createChatCompletion&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Olá&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBeTruthy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A diferença entre “estamos fora porque o provedor caiu” e “roteamos para um fallback” costuma ser arquitetura, não milagre.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Desacople release da hospedagem
&lt;/h2&gt;

&lt;p&gt;Se CI, artefatos e publicação dependem de uma única plataforma, a falha dessa plataforma bloqueia entrega.&lt;/p&gt;

&lt;p&gt;Tenha pelo menos um caminho alternativo para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;build;&lt;/li&gt;
&lt;li&gt;testes críticos;&lt;/li&gt;
&lt;li&gt;assinatura;&lt;/li&gt;
&lt;li&gt;publicação;&lt;/li&gt;
&lt;li&gt;rollback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um runbook mínimo deve responder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Se o CI primário estiver indisponível por 4 horas, como lançamos uma correção crítica?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se a resposta não estiver documentada, a resposta real é: não lançamos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Um fluxo resiliente com Apidog
&lt;/h2&gt;

&lt;p&gt;Um fluxo prático para equipes de API:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Baixe o Apidog&lt;/a&gt; e crie um projeto para cada API upstream crítica.&lt;/li&gt;
&lt;li&gt;Defina schemas de request e response uma vez.&lt;/li&gt;
&lt;li&gt;Gere um servidor mock a partir desses schemas.&lt;/li&gt;
&lt;li&gt;Configure ambientes como &lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;staging&lt;/code&gt; e &lt;code&gt;prod&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Guarde credenciais como segredos por ambiente.&lt;/li&gt;
&lt;li&gt;Rode os mesmos testes de contrato contra mocks, sandbox e produção.&lt;/li&gt;
&lt;li&gt;Quando o upstream estiver degradado, alterne para o mock e continue desenvolvendo.&lt;/li&gt;
&lt;li&gt;Quando houver múltiplos provedores, rode a mesma suíte contra todos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Exemplo de separação por ambiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dev      -&amp;gt; servidor mock
staging  -&amp;gt; sandbox do provedor
prod     -&amp;gt; API real
backup   -&amp;gt; provedor alternativo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse padrão não é específico de IA, GitHub ou Ghostty. É uma forma geral de manter desenvolvimento, testes e release funcionando mesmo quando dependências externas falham.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que os desenvolvedores estão concluindo
&lt;/h2&gt;

&lt;p&gt;As reações ao anúncio tendem a cair em quatro grupos.&lt;/p&gt;

&lt;h3&gt;
  
  
  “Finalmente alguém disse”
&lt;/h3&gt;

&lt;p&gt;Usuários avançados do GitHub que já estavam frustrados viram a publicação como validação. Muitos já mantinham mirrors e agora consideram promovê-los.&lt;/p&gt;

&lt;h3&gt;
  
  
  “Foi só uma interrupção”
&lt;/h3&gt;

&lt;p&gt;Alguns apontam que o uptime geral do GitHub continua competitivo. O argumento faz sentido no agregado, mas perde o ponto principal: Hashimoto reagiu a uma tendência, não a um único incidente.&lt;/p&gt;

&lt;h3&gt;
  
  
  “Migrar é caro”
&lt;/h3&gt;

&lt;p&gt;Esse grupo está certo. Issues, PRs, CI e automações tornam migração difícil. Por isso a abordagem incremental com espelho somente leitura é mais realista do que uma troca abrupta.&lt;/p&gt;

&lt;h3&gt;
  
  
  “Isso também me afeta?”
&lt;/h3&gt;

&lt;p&gt;Depende da criticidade. Para um projeto de fim de semana, uma interrupção de algumas horas pode ser aceitável. Para uma ferramenta usada diariamente por equipes pagantes, pode ser bloqueante.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist prático para sua stack
&lt;/h2&gt;

&lt;p&gt;Use esta lista como auditoria rápida:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Repositórios ativos são espelhados para uma segunda forja?&lt;/li&gt;
&lt;li&gt;[ ] O mirror é testado periodicamente?&lt;/li&gt;
&lt;li&gt;[ ] Issues e PRs críticos têm estratégia de exportação?&lt;/li&gt;
&lt;li&gt;[ ] GitHub API está isolada atrás de uma interface?&lt;/li&gt;
&lt;li&gt;[ ] Existe adaptador para outro provedor ou plano para criá-lo?&lt;/li&gt;
&lt;li&gt;[ ] CI crítico roda fora do GitHub Actions se necessário?&lt;/li&gt;
&lt;li&gt;[ ] Existe release manual documentado?&lt;/li&gt;
&lt;li&gt;[ ] Dependências externas críticas estão listadas?&lt;/li&gt;
&lt;li&gt;[ ] Para cada dependência, há resposta para “e se cair por 4 horas?”&lt;/li&gt;
&lt;li&gt;[ ] APIs upstream têm mocks realistas?&lt;/li&gt;
&lt;li&gt;[ ] Testes de contrato rodam contra mock e produção?&lt;/li&gt;
&lt;li&gt;[ ] Métricas de confiabilidade são revisadas semanalmente?&lt;/li&gt;
&lt;li&gt;[ ] A página de status reflete degradações parciais?&lt;/li&gt;
&lt;li&gt;[ ] A equipe monitora tendência de incidentes, não apenas SLA?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para um exemplo aplicado a APIs, veja &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como construir fluxos de trabalho duráveis que sobrevivem a interrupções de provedores&lt;/a&gt;, usando DeepSeek e OpenAI como exemplo de provedor duplo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perguntas frequentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Para onde o Ghostty está se mudando?
&lt;/h3&gt;

&lt;p&gt;Hashimoto não anunciou o destino. Ele afirmou que está conversando com vários provedores, comerciais e FOSS, e que a migração será incremental. O repositório atual no GitHub continuará como espelho somente leitura.&lt;/p&gt;

&lt;h3&gt;
  
  
  O GitHub é realmente tão pouco confiável?
&lt;/h3&gt;

&lt;p&gt;Os números agregados de uptime do GitHub seguem competitivos com plataformas similares. A crítica de Hashimoto é sobre a recorrência de interrupções parciais e o impacto acumulado em trabalho real, especialmente em Actions, Packages e API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Devo mover meus repositórios para fora do GitHub agora?
&lt;/h3&gt;

&lt;p&gt;Para a maioria das equipes, espelhar vale a pena imediatamente. Tornar outra forja primária depende do custo de migrar issues, PRs, CI e integrações. Comece por reduzir dependência antes de precisar sair.&lt;/p&gt;

&lt;h3&gt;
  
  
  Isso afeta GitHub Copilot ou GitHub Actions?
&lt;/h3&gt;

&lt;p&gt;A publicação não foi sobre Copilot. O gatilho imediato citado foi uma interrupção do GitHub Actions. Para equipes que usam Copilot, mudanças relacionadas a faturamento estão documentadas em &lt;a href="http://apidog.com/blog/github-copilot-usage-billing-api-teams?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;uso e API de faturamento do GitHub Copilot para equipes&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que isso significa para ferramentas de IA que dependem da API do GitHub?
&lt;/h3&gt;

&lt;p&gt;Bots de revisão, triagem de issues, servidores MCP e automações similares herdam a confiabilidade do GitHub. Mitigue com cache, fallback, filas resilientes e mocks de upstream. O &lt;a href="http://apidog.com/blog/clawsweeper-openclaw-github-triage-bot?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;artigo sobre o bot de triagem Clawsweeper&lt;/a&gt; mostra um exemplo funcional.&lt;/p&gt;

&lt;h3&gt;
  
  
  Isso é uma tendência de saída do GitHub?
&lt;/h3&gt;

&lt;p&gt;Provavelmente será lenta. Migrar projetos grandes é caro. O sinal importante é que um dos usuários mais antigos da plataforma concluiu que o custo de continuar superou o custo de migrar.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que significa “ferramenta de desenvolvedor” aqui?
&lt;/h3&gt;

&lt;p&gt;Qualquer software usado por desenvolvedores no fluxo diário de trabalho: terminais, editores, CI, clientes de API, monitoramento, registros de pacotes, bots de revisão e assistentes de IA. Se sua ferramenta fica entre o desenvolvedor e a entrega, confiabilidade é parte central do produto.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como Usar a API Mistral Medium 3.5? Guia Completo</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Thu, 30 Apr 2026 03:49:10 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/como-usar-a-api-mistral-medium-35-guia-completo-gjn</link>
      <guid>https://dev.to/lucas_ferreira/como-usar-a-api-mistral-medium-35-guia-completo-gjn</guid>
      <description>&lt;p&gt;A Mistral lançou o Medium 3.5 em 29 de abril de 2026. O ID do modelo da API é &lt;code&gt;mistral-medium-3.5&lt;/code&gt;, o endpoint é &lt;code&gt;https://api.mistral.ai/v1/chat/completions&lt;/code&gt;, e o formato da requisição é próximo ao padrão da OpenAI. Na prática, migrar de outro provedor costuma exigir apenas trocar a URL base e o ID do modelo. Os destaques: contexto de 256K, visão nativa, chamada de função, suporte a 24 idiomas e 77,6% no SWE-Bench Verified.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Este guia mostra como autenticar, configurar parâmetros, chamar a API em Python e Node, usar visão, ferramentas, modo JSON, streaming, tratamento de erros e um fluxo de trabalho com &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para acompanhar custo por chamada enquanto você itera nos prompts. Para modelos comparáveis, veja &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como usar a API DeepSeek V4&lt;/a&gt; e &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como usar a API GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Endpoint: &lt;code&gt;POST https://api.mistral.ai/v1/chat/completions&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Autenticação: bearer token no cabeçalho &lt;code&gt;Authorization&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Modelo: &lt;code&gt;mistral-medium-3.5&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Contexto: 256K tokens.&lt;/li&gt;
&lt;li&gt;Preço: US$ 1,5 por milhão de tokens de entrada e US$ 7,5 por milhão de tokens de saída.&lt;/li&gt;
&lt;li&gt;Recursos: visão nativa, chamada de função, saída JSON estruturada, raciocínio e suporte a 24 idiomas.&lt;/li&gt;
&lt;li&gt;Pesos abertos: &lt;code&gt;mistralai/Mistral-Medium-3.5-128B&lt;/code&gt; no Hugging Face sob Licença MIT Modificada com exceção para grandes receitas.&lt;/li&gt;
&lt;li&gt;Benchmarks citados: 77,6% no SWE-Bench Verified e 91,4 no τ³-Telecom.&lt;/li&gt;
&lt;li&gt;Use o &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para salvar requisições, proteger a chave como variável secreta e comparar custo entre execuções.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O que mudou no Medium 3.5
&lt;/h2&gt;

&lt;p&gt;O Medium 3 foi lançado como um modelo apenas de texto com contexto de 128K. O &lt;a href="https://mistral.ai/news/vibe-remote-agents-mistral-medium-3-5" rel="noopener noreferrer"&gt;Medium 3.5&lt;/a&gt; muda o perfil: ele combina seguimento de instruções, raciocínio e codificação em um único conjunto de pesos. Você não precisa alternar entre um checkpoint de chat e outro de raciocínio.&lt;/p&gt;

&lt;p&gt;Principais mudanças:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contexto ampliado de 128K para 256K.&lt;/li&gt;
&lt;li&gt;Visão nativa.&lt;/li&gt;
&lt;li&gt;Chamada de função integrada.&lt;/li&gt;
&lt;li&gt;Melhor desempenho em tarefas de código e agentes.&lt;/li&gt;
&lt;li&gt;Preço mais alto que o Medium 3.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw1gvxkk5hewmsinakjv3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw1gvxkk5hewmsinakjv3.png" alt="Mistral Medium 3.5" width="800" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Os números mais relevantes para implementação são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;77,6% no SWE-Bench Verified&lt;/strong&gt;: útil para revisão e correção de código.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;91,4 no τ³-Telecom&lt;/strong&gt;: indica bom comportamento em fluxos agenticos de múltiplos turnos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;256K de contexto&lt;/strong&gt;: permite enviar uma base de código média, documentos longos ou transcrições grandes em uma única chamada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O preço também muda. O Medium 3 custava US$ 0,40/M tokens de entrada e US$ 2,00/M tokens de saída. O Medium 3.5 sobe para US$ 1,5/M entrada e US$ 7,5/M saída. Use o Medium 3.5 quando a tarefa justificar raciocínio, visão, ferramentas ou contexto longo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;p&gt;Antes de chamar a API, prepare:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Uma conta em &lt;a href="https://console.mistral.ai/" rel="noopener noreferrer"&gt;console.mistral.ai&lt;/a&gt; com método de pagamento. Sem saldo, a API pode retornar &lt;code&gt;402 Payment Required&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Uma chave de API com escopo para o projeto correto.&lt;/li&gt;
&lt;li&gt;Um SDK:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mistralai&lt;/code&gt; para Python ou JavaScript.&lt;/li&gt;
&lt;li&gt;SDK da OpenAI, se você quiser reaproveitar código com &lt;code&gt;base_url&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Um cliente de API para repetir e versionar requisições. O &lt;code&gt;curl&lt;/code&gt; serve para o primeiro teste; para iteração, use o &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tzda8jztthm2ey28nb0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tzda8jztthm2ey28nb0.png" alt="Apidog workflow" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Exporte a chave:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;MISTRAL_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Endpoint e autenticação
&lt;/h2&gt;

&lt;p&gt;A URL base da API é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.mistral.ai/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O endpoint de chat completions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST https://api.mistral.ai/v1/chat/completions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Requisição mínima com &lt;code&gt;curl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.mistral.ai/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$MISTRAL_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "mistral-medium-3.5",
    "messages": [
      {
        "role": "user",
        "content": "Explain dense merged checkpoints in two sentences."
      }
    ]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma resposta bem-sucedida retorna:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;choices&lt;/code&gt;: lista de respostas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;usage.prompt_tokens&lt;/code&gt;: tokens de entrada.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;usage.completion_tokens&lt;/code&gt;: tokens de saída.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;usage.total_tokens&lt;/code&gt;: total.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt;: identificador para rastreamento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Erros retornam um envelope &lt;code&gt;error&lt;/code&gt; com &lt;code&gt;code&lt;/code&gt; e &lt;code&gt;message&lt;/code&gt;, semelhante ao formato da OpenAI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parâmetros principais
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parâmetro&lt;/th&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Valores&lt;/th&gt;
&lt;th&gt;Observações&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mistral-medium-3.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Obrigatório.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;messages&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;array&lt;/td&gt;
&lt;td&gt;pares &lt;code&gt;role&lt;/code&gt; / &lt;code&gt;content&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Obrigatório. Mesmo padrão da OpenAI.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;temperature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0&lt;/code&gt; a &lt;code&gt;1.5&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A Mistral recomenda &lt;code&gt;0.7&lt;/code&gt; para uso geral e &lt;code&gt;0.3&lt;/code&gt; para código.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;top_p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0&lt;/code&gt; a &lt;code&gt;1&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Padrão &lt;code&gt;1.0&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1&lt;/code&gt; até o limite de contexto&lt;/td&gt;
&lt;td&gt;Limita a saída.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stream&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;bool&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;true&lt;/code&gt; ou &lt;code&gt;false&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Habilita streaming SSE.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;array&lt;/td&gt;
&lt;td&gt;especificação de ferramenta estilo OpenAI&lt;/td&gt;
&lt;td&gt;Chamada de função nativa.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tool_choice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string/object&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;auto&lt;/code&gt;, &lt;code&gt;any&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt; ou ferramenta específica&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;any&lt;/code&gt; para forçar ferramenta.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;response_format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;object&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;{"type":"json_object"}&lt;/code&gt; ou schema JSON&lt;/td&gt;
&lt;td&gt;Saída estruturada.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;random_seed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;qualquer inteiro&lt;/td&gt;
&lt;td&gt;Para reprodutibilidade.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;safe_prompt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;bool&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;true&lt;/code&gt; ou &lt;code&gt;false&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Adiciona o preâmbulo de segurança da Mistral.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;presence_penalty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;-2&lt;/code&gt; a &lt;code&gt;2&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Penaliza tópicos repetidos.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;frequency_penalty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;-2&lt;/code&gt; a &lt;code&gt;2&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Penaliza tokens repetidos.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Duas diferenças importantes ao migrar da OpenAI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI: &lt;code&gt;tool_choice="required"&lt;/code&gt;
Mistral: &lt;code&gt;tool_choice="any"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;OpenAI: &lt;code&gt;seed&lt;/code&gt;
Mistral: &lt;code&gt;random_seed&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cliente Python
&lt;/h2&gt;

&lt;p&gt;Instale o SDK oficial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mistralai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chamada básica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mistralai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Mistral&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Mistral&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MISTRAL_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mistral-medium-3.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reply in code only.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a Rust function that debounces events.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Conteúdo:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Total de tokens:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;estimated_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completion_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;7.5&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Estimativa de custo (USD):&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;estimated_cost&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se sua aplicação já usa o SDK da OpenAI, altere apenas &lt;code&gt;base_url&lt;/code&gt; e &lt;code&gt;model&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MISTRAL_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.mistral.ai/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mistral-medium-3.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, Mistral.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use o SDK &lt;code&gt;mistralai&lt;/code&gt; quando quiser suporte mais direto a recursos específicos da Mistral. Use o SDK da OpenAI quando a prioridade for compatibilidade com código existente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cliente Node.js
&lt;/h2&gt;

&lt;p&gt;Instale o SDK oficial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @mistralai/mistralai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo com SDK nativo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Mistral&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@mistralai/mistralai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Mistral&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MISTRAL_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mistral-medium-3.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain dense merged checkpoints in plain English.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Uso:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo com SDK da OpenAI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MISTRAL_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.mistral.ai/v1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mistral-medium-3.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, Mistral.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Streaming de respostas
&lt;/h2&gt;

&lt;p&gt;Para streaming, defina &lt;code&gt;stream: true&lt;/code&gt; ou use o método de stream do SDK.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mistral-medium-3.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Stream a 300-word essay on merged checkpoints.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O formato segue o padrão SSE. O conteúdo incremental aparece em &lt;code&gt;choices[].delta.content&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para depurar streaming e comparar execuções lado a lado, use o visualizador de respostas do &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chamada de ferramenta
&lt;/h2&gt;

&lt;p&gt;O Medium 3.5 suporta chamada de função nativa via &lt;code&gt;tools&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_weather&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Return the current weather for a city.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;parameters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;city&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;c&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;city&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mistral-medium-3.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Weather in Lagos in Celsius?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tool_choice&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tool_call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fluxo típico:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Envie &lt;code&gt;messages&lt;/code&gt; + &lt;code&gt;tools&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Leia &lt;code&gt;message.tool_calls&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Execute a função localmente.&lt;/li&gt;
&lt;li&gt;Adicione o resultado como mensagem &lt;code&gt;role: "tool"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Chame a API novamente para gerar a resposta final.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Exemplo conceitual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Weather in Lagos in Celsius?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mistral-medium-3.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tool_choice&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tool_call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Execute sua função real aqui
&lt;/span&gt;&lt;span class="n"&gt;tool_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;city&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Lagos&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;c&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_call_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_result&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;final_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mistral-medium-3.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;final_response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Modo JSON e saída estruturada
&lt;/h2&gt;

&lt;p&gt;Para forçar JSON válido, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mistral-medium-3.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reply with a single valid JSON object.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize today&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s Mistral Medium 3.5 release.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;response_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json_object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para validar por schema:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json_schema&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json_schema&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;release_note&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;schema&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bullets&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;array&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bullets&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;additionalProperties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strict&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mistral-medium-3.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reply with a single JSON object matching the schema.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize today&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s Mistral Medium 3.5 release.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;response_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use schema estrito quando o resultado alimentar outro sistema. Use &lt;code&gt;json_object&lt;/code&gt; quando você só precisa garantir JSON válido e fará a validação no cliente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entrada de visão
&lt;/h2&gt;

&lt;p&gt;O Medium 3.5 aceita imagem e texto no mesmo &lt;code&gt;message.content&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mistral-medium-3.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What is in this image and what is it doing wrong?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/diagram.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As imagens são cobradas como tokens de entrada. A contagem depende da resolução e aparece em &lt;code&gt;usage.prompt_tokens&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para controlar custo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Corte a região relevante antes de enviar.&lt;/li&gt;
&lt;li&gt;Reduza a resolução quando possível.&lt;/li&gt;
&lt;li&gt;Evite enviar frames redundantes em fluxos de vídeo.&lt;/li&gt;
&lt;li&gt;Registre tokens por imagem antes de escalar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Crie uma coleção no Apidog
&lt;/h2&gt;

&lt;p&gt;Um fluxo prático para desenvolvimento:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Baixe o Apidog&lt;/a&gt; e crie um projeto.&lt;/li&gt;
&lt;li&gt;Crie um ambiente com:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;BASE_URL=https://api.mistral.ai/v1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;MISTRAL_API_KEY&lt;/code&gt; como variável secreta.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Salve uma requisição:

&lt;ul&gt;
&lt;li&gt;Método: &lt;code&gt;POST&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;{{BASE_URL}}/chat/completions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Header: &lt;code&gt;Authorization: Bearer {{MISTRAL_API_KEY}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Header: &lt;code&gt;Content-Type: application/json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Parametrize &lt;code&gt;model&lt;/code&gt;, &lt;code&gt;temperature&lt;/code&gt;, &lt;code&gt;max_tokens&lt;/code&gt; e &lt;code&gt;tool_choice&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Inspecione &lt;code&gt;usage&lt;/code&gt; em cada resposta.&lt;/li&gt;
&lt;li&gt;Adicione um cálculo de custo por chamada:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;usage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000_000&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completion_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;7.5&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Estimated cost: $&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;cost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você já tem uma &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;coleção da API DeepSeek V4&lt;/a&gt;, duplique a coleção, troque a URL base para &lt;code&gt;https://api.mistral.ai/v1&lt;/code&gt; e altere o modelo para &lt;code&gt;mistral-medium-3.5&lt;/code&gt;. O mesmo padrão vale para &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;comparar com o GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tratamento de erros
&lt;/h2&gt;

&lt;p&gt;Códigos comuns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Código&lt;/th&gt;
&lt;th&gt;Significado&lt;/th&gt;
&lt;th&gt;Como resolver&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;400&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Requisição inválida&lt;/td&gt;
&lt;td&gt;Valide &lt;code&gt;messages&lt;/code&gt;, &lt;code&gt;tools&lt;/code&gt; e JSON.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;401&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chave inválida&lt;/td&gt;
&lt;td&gt;Regenere a chave em &lt;a href="https://console.mistral.ai/" rel="noopener noreferrer"&gt;console.mistral.ai&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;402&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pagamento necessário&lt;/td&gt;
&lt;td&gt;Adicione saldo ou método de pagamento.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;403&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modelo não permitido&lt;/td&gt;
&lt;td&gt;Verifique escopo da chave e grafia do modelo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;422&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Parâmetro fora do intervalo&lt;/td&gt;
&lt;td&gt;Revise &lt;code&gt;max_tokens&lt;/code&gt;, &lt;code&gt;tool_choice&lt;/code&gt; e schema.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;429&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rate limit&lt;/td&gt;
&lt;td&gt;Use retry com backoff exponencial e jitter.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;500&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Erro do servidor&lt;/td&gt;
&lt;td&gt;Tente novamente uma vez.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;503&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sobrecarga&lt;/td&gt;
&lt;td&gt;Espere ou faça fallback para outro modelo.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Exemplo simples de retry em Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_with_retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status_code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;502&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;503&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;504&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
                &lt;span class="k"&gt;raise&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;max_attempts&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;raise&lt;/span&gt;

            &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não tente novamente erros &lt;code&gt;4xx&lt;/code&gt; automaticamente, exceto &lt;code&gt;429&lt;/code&gt;. Em geral, eles indicam bug de payload ou configuração.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controle de custo
&lt;/h2&gt;

&lt;p&gt;O Medium 3.5 é mais caro que o Medium 3. Use roteamento e limites desde o início.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Use Medium 3 como padrão e escale para 3.5
&lt;/h3&gt;

&lt;p&gt;Faça a primeira passagem com um modelo mais barato. Envie para o Medium 3.5 apenas quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;o validador falhar;&lt;/li&gt;
&lt;li&gt;a confiança for baixa;&lt;/li&gt;
&lt;li&gt;houver necessidade de visão;&lt;/li&gt;
&lt;li&gt;o contexto exceder o limite do modelo menor;&lt;/li&gt;
&lt;li&gt;a tarefa envolver ferramentas ou raciocínio mais complexo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Defina &lt;code&gt;max_tokens&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A saída é o lado mais caro. Evite deixar a geração sem limite.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mistral-medium-3.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Reduza prompts de sistema
&lt;/h3&gt;

&lt;p&gt;Prompts de sistema longos são cobrados em todas as chamadas. Se um preâmbulo de 2K tokens pode virar 500 tokens, você reduz custo de entrada em 75% naquele trecho.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Registre &lt;code&gt;usage&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Envie para sua observabilidade:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;prompt_tokens&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;completion_tokens&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;total_tokens&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;custo estimado&lt;/li&gt;
&lt;li&gt;modelo usado&lt;/li&gt;
&lt;li&gt;endpoint&lt;/li&gt;
&lt;li&gt;latência&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Use visão seletivamente
&lt;/h3&gt;

&lt;p&gt;Não envie imagens inteiras quando um recorte resolve. Não envie múltiplos frames quando um único frame responde à pergunta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparando o Medium 3.5 com outros níveis da Mistral
&lt;/h2&gt;

&lt;p&gt;Linha citada para o final de abril de 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modelo&lt;/th&gt;
&lt;th&gt;Contexto&lt;/th&gt;
&lt;th&gt;Entrada $/M&lt;/th&gt;
&lt;th&gt;Saída $/M&lt;/th&gt;
&lt;th&gt;Visão&lt;/th&gt;
&lt;th&gt;Melhor para&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mistral-small&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;32K&lt;/td&gt;
&lt;td&gt;US$ 0.10&lt;/td&gt;
&lt;td&gt;US$ 0.30&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;Classificação de alto volume e chat leve&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mistral-medium-3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;US$ 0.40&lt;/td&gt;
&lt;td&gt;US$ 2.00&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;Alto rendimento e chat longo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mistral-medium-3.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;US$ 1.5&lt;/td&gt;
&lt;td&gt;US$ 7.5&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;Raciocínio, código, visão e agentes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mistral-large&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;US$ 2.00&lt;/td&gt;
&lt;td&gt;US$ 6.00&lt;/td&gt;
&lt;td&gt;Limitado&lt;/td&gt;
&lt;td&gt;Raciocínio de texto de nível de fronteira&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;O Medium 3.5 é o nível que combina contexto longo, visão e capacidades mescladas de raciocínio. Escolha pelo tipo de trabalho, não apenas pelo nome do modelo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrando de outro provedor
&lt;/h2&gt;

&lt;p&gt;A migração costuma ser uma troca de URL base e modelo.&lt;/p&gt;

&lt;p&gt;Da OpenAI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- base_url="https://api.openai.com/v1"
- model="gpt-5.5"
&lt;/span&gt;&lt;span class="gi"&gt;+ base_url="https://api.mistral.ai/v1"
+ model="mistral-medium-3.5"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Da DeepSeek:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- base_url="https://api.deepseek.com/v1"
- model="deepseek-v4-pro"
&lt;/span&gt;&lt;span class="gi"&gt;+ base_url="https://api.mistral.ai/v1"
+ model="mistral-medium-3.5"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ajustes obrigatórios:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- tool_choice="required"
&lt;/span&gt;&lt;span class="gi"&gt;+ tool_choice="any"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- seed=123
&lt;/span&gt;&lt;span class="gi"&gt;+ random_seed=123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes de mudar produção:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rode sua suíte de testes.&lt;/li&gt;
&lt;li&gt;Compare respostas para prompts críticos.&lt;/li&gt;
&lt;li&gt;Espelhe tráfego em modo sombra por um dia.&lt;/li&gt;
&lt;li&gt;Registre as duas respostas.&lt;/li&gt;
&lt;li&gt;Compare latência, custo e taxa de falha no &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Casos de uso práticos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Revisão de código
&lt;/h3&gt;

&lt;p&gt;O contexto de 256K permite enviar diffs grandes com arquivos relacionados. A pontuação de 77,6% no SWE-Bench Verified torna o modelo relevante para fluxos de PR review e correção de bugs.&lt;/p&gt;

&lt;h3&gt;
  
  
  QA em documentos longos
&lt;/h3&gt;

&lt;p&gt;Contratos, RFPs, políticas internas e documentos técnicos podem caber em uma única chamada, reduzindo a necessidade de chunking.&lt;/p&gt;

&lt;h3&gt;
  
  
  Extração multimodal
&lt;/h3&gt;

&lt;p&gt;Você pode extrair campos estruturados de recibos, screenshots ou diagramas usando visão + JSON estruturado na mesma chamada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agentes com ferramentas
&lt;/h3&gt;

&lt;p&gt;A chamada de função nativa ajuda em fluxos onde o modelo precisa decidir entre:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chamar uma ferramenta;&lt;/li&gt;
&lt;li&gt;pedir mais informação;&lt;/li&gt;
&lt;li&gt;responder diretamente;&lt;/li&gt;
&lt;li&gt;continuar um loop de execução.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Qual é o ID do modelo na API?
&lt;/h3&gt;

&lt;p&gt;Use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mistral-medium-3.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O checkpoint no Hugging Face é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mistralai/Mistral-Medium-3.5-128B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para a API hospedada, use o ID curto. Para self-hosting, use o ID do Hugging Face.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Medium 3.5 é compatível com OpenAI?
&lt;/h3&gt;

&lt;p&gt;É próximo, mas não idêntico. O endpoint, cabeçalhos e a maioria dos parâmetros seguem o padrão da OpenAI. Os SDKs Python e Node da OpenAI funcionam com override de URL base.&lt;/p&gt;

&lt;p&gt;Diferenças principais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tool_choice="any"&lt;/code&gt; em vez de &lt;code&gt;required&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;random_seed&lt;/code&gt; em vez de &lt;code&gt;seed&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Posso executar o Medium 3.5 localmente?
&lt;/h3&gt;

&lt;p&gt;Sim. Os pesos são abertos sob uma Licença MIT Modificada com exceção para grandes receitas. O modelo tem 128B parâmetros, então exige memória GPU significativa. Builds GGUF quantizados de &lt;code&gt;unsloth/Mistral-Medium-3.5-128B-GGUF&lt;/code&gt; podem rodar em uma placa de consumidor de ponta. Os padrões de &lt;a href="http://apidog.com/blog/how-to-run-deepseek-v4-locally?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como executar o DeepSeek V4 localmente&lt;/a&gt; são aplicáveis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ele suporta streaming com chamadas de ferramenta?
&lt;/h3&gt;

&lt;p&gt;Sim. O streaming retorna fragmentos de argumentos de ferramenta em &lt;code&gt;delta.tool_calls&lt;/code&gt;, no mesmo estilo do streaming de tool calls da OpenAI. Os fragmentos formam um JSON completo ao final do stream.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como contar tokens antes de enviar?
&lt;/h3&gt;

&lt;p&gt;Use o tokenizador do pacote Python &lt;code&gt;mistral-common&lt;/code&gt;. Ele usa o mesmo tokenizador da API, então as contagens devem corresponder a &lt;code&gt;usage.prompt_tokens&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Qual contexto devo planejar para produção?
&lt;/h3&gt;

&lt;p&gt;O limite é 256K, mas o custo escala linearmente. Uma chamada com 200K tokens de entrada custa US$ 0,30 antes da geração. Para a maioria dos workloads, tente ficar abaixo de 32K e use contexto longo apenas quando necessário.&lt;/p&gt;

&lt;h3&gt;
  
  
  Existe nível gratuito?
&lt;/h3&gt;

&lt;p&gt;A Mistral não anuncia um nível gratuito permanente, mas novas contas geralmente recebem um pequeno crédito de teste. Para experimentação gratuita em modelos similares, veja &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como usar a API DeepSeek V4 gratuitamente&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Plataforma API para Workflow API Design-First</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Thu, 30 Apr 2026 03:31:25 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/plataforma-api-para-workflow-api-design-first-5gk5</link>
      <guid>https://dev.to/lucas_ferreira/plataforma-api-para-workflow-api-design-first-5gk5</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;A abordagem design-first significa escrever a especificação da API antes do código de implementação. Essa especificação passa a orientar mocks, documentação, testes e stubs de cliente. Ao usar uma plataforma que cobre esse fluxo de ponta a ponta, você reduz o atrito de manter código, documentação e contratos sincronizados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://apidog.com/download/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Experimente o Apidog gratuitamente&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;A maioria dos desenvolvedores começa criando APIs com uma abordagem code-first:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Escreve uma rota.&lt;/li&gt;
&lt;li&gt;Adiciona anotações ou decorators.&lt;/li&gt;
&lt;li&gt;Gera documentação.&lt;/li&gt;
&lt;li&gt;Ajusta conforme o código evolui.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Isso funciona em projetos pequenos. O problema aparece quando a API cresce.&lt;/p&gt;

&lt;p&gt;A documentação se desvia. As anotações ficam desatualizadas. Um endpoint muda o formato da resposta, mas a especificação não é atualizada. Meses depois, o frontend consome uma documentação que diz que a API retorna um array de strings, enquanto a resposta real retorna um array de objetos com um campo &lt;code&gt;value&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;No design-first, a especificação é a fonte da verdade. Código, documentação, mocks e testes partem dela. Quando a especificação muda, todo o fluxo acompanha essa mudança.&lt;/p&gt;

&lt;p&gt;Na prática, isso permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desenvolvimento frontend e backend em paralelo.&lt;/li&gt;
&lt;li&gt;Mocks disponíveis antes da implementação.&lt;/li&gt;
&lt;li&gt;Documentação sempre alinhada ao contrato.&lt;/li&gt;
&lt;li&gt;Testes de contrato para detectar divergências.&lt;/li&gt;
&lt;li&gt;Revisão explícita de mudanças na API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O ponto crítico é a ferramenta. Se escrever a especificação for mais lento do que implementar a rota diretamente, a equipe tende a ignorar o processo. Uma boa plataforma design-first precisa tornar a criação do contrato rápida, visual e integrada ao restante do ciclo de desenvolvimento.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que design-first significa na prática
&lt;/h2&gt;

&lt;p&gt;Design-first não é uma tecnologia específica. É um fluxo de trabalho.&lt;/p&gt;

&lt;p&gt;A ideia central é simples:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Defina o contrato da API antes de implementar a API.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esse contrato geralmente é escrito em OpenAPI para APIs REST.&lt;/p&gt;

&lt;h3&gt;
  
  
  Antes de escrever código
&lt;/h3&gt;

&lt;p&gt;Comece definindo a especificação da API. Ela deve incluir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caminhos e métodos HTTP.&lt;/li&gt;
&lt;li&gt;Parâmetros de path, query e headers.&lt;/li&gt;
&lt;li&gt;Schemas de request body para &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt; e &lt;code&gt;PATCH&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Schemas de resposta para status como &lt;code&gt;200&lt;/code&gt;, &lt;code&gt;400&lt;/code&gt;, &lt;code&gt;401&lt;/code&gt;, &lt;code&gt;422&lt;/code&gt; e &lt;code&gt;500&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Requisitos de autenticação.&lt;/li&gt;
&lt;li&gt;Descrições de campos.&lt;/li&gt;
&lt;li&gt;Exemplos de payloads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo simplificado de especificação OpenAPI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.0.3&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Users&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;API"&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;

&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/users/{id}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Buscar usuário por ID&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Usuário&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;encontrado"&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/UserProfile"&lt;/span&gt;
      &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;404"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Usuário&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;não&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;encontrado"&lt;/span&gt;

&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;UserProfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;name&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usr_123"&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ana&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Silva"&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
          &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ana@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa etapa força decisões importantes antes da implementação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como os recursos serão nomeados.&lt;/li&gt;
&lt;li&gt;Qual será o formato dos erros.&lt;/li&gt;
&lt;li&gt;Como paginação será representada.&lt;/li&gt;
&lt;li&gt;Quais campos são obrigatórios.&lt;/li&gt;
&lt;li&gt;Quais status HTTP serão usados.&lt;/li&gt;
&lt;li&gt;Como autenticação será aplicada.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Durante o desenvolvimento
&lt;/h3&gt;

&lt;p&gt;Depois que a especificação existe, publique um mock baseado nela.&lt;/p&gt;

&lt;p&gt;Com isso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O frontend consome a URL mockada.&lt;/li&gt;
&lt;li&gt;O backend implementa seguindo o contrato.&lt;/li&gt;
&lt;li&gt;Ambos trabalham em paralelo.&lt;/li&gt;
&lt;li&gt;A integração começa antes da API real estar pronta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de fluxo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Equipe define GET /users/{id} na especificação
2. Mock é gerado automaticamente
3. Frontend usa o mock para construir a tela
4. Backend implementa o endpoint real
5. Testes validam se a resposta real segue o schema
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Após a implementação
&lt;/h3&gt;

&lt;p&gt;A implementação deve ser validada contra a especificação.&lt;/p&gt;

&lt;p&gt;Por exemplo, se a especificação diz que &lt;code&gt;email&lt;/code&gt; é obrigatório e a API real não retorna esse campo, o teste deve falhar.&lt;/p&gt;

&lt;p&gt;Esse tipo de validação evita que divergências cheguem ao ambiente de produção.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quando os requisitos mudam
&lt;/h3&gt;

&lt;p&gt;A ordem correta é:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Atualizar a especificação.&lt;/li&gt;
&lt;li&gt;Revisar a mudança com as partes envolvidas.&lt;/li&gt;
&lt;li&gt;Atualizar mocks e documentação.&lt;/li&gt;
&lt;li&gt;Ajustar implementação.&lt;/li&gt;
&lt;li&gt;Rodar testes de contrato.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A implementação não deve mudar silenciosamente sem atualizar o contrato.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que uma plataforma design-first precisa oferecer
&lt;/h2&gt;

&lt;p&gt;Nem toda ferramenta de API suporta bem fluxos design-first. Para funcionar no dia a dia, a plataforma precisa cobrir mais do que edição de YAML.&lt;/p&gt;

&lt;h3&gt;
  
  
  Editor visual de API
&lt;/h3&gt;

&lt;p&gt;YAML puro é útil, mas não é a melhor interface para design colaborativo.&lt;/p&gt;

&lt;p&gt;Um bom editor visual deve permitir configurar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Método HTTP.&lt;/li&gt;
&lt;li&gt;Path.&lt;/li&gt;
&lt;li&gt;Parâmetros.&lt;/li&gt;
&lt;li&gt;Headers.&lt;/li&gt;
&lt;li&gt;Body.&lt;/li&gt;
&lt;li&gt;Responses.&lt;/li&gt;
&lt;li&gt;Schemas.&lt;/li&gt;
&lt;li&gt;Exemplos.&lt;/li&gt;
&lt;li&gt;Regras de validação.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Também deve gerar OpenAPI válido sem exigir que a equipe escreva tudo manualmente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Validação OpenAPI em tempo real
&lt;/h3&gt;

&lt;p&gt;A especificação precisa ser válida antes de ser usada para mocks, documentação ou geração de código.&lt;/p&gt;

&lt;p&gt;A ferramenta deve indicar problemas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Campos obrigatórios ausentes.&lt;/li&gt;
&lt;li&gt;Referências &lt;code&gt;$ref&lt;/code&gt; quebradas.&lt;/li&gt;
&lt;li&gt;Tipos inválidos.&lt;/li&gt;
&lt;li&gt;Responses sem schema.&lt;/li&gt;
&lt;li&gt;Parâmetros declarados no path, mas não definidos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso evita descobrir erros apenas no CI ou no momento da integração.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mock automático a partir da especificação
&lt;/h3&gt;

&lt;p&gt;O mock deve ser gerado diretamente da especificação, sem configuração duplicada.&lt;/p&gt;

&lt;p&gt;Fluxo ideal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Criar endpoint → Definir schema → Salvar → Obter URL mockada
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O mock deve respeitar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tipos de campos.&lt;/li&gt;
&lt;li&gt;Formatos como &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt;, &lt;code&gt;uuid&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Valores mínimos e máximos.&lt;/li&gt;
&lt;li&gt;Enums.&lt;/li&gt;
&lt;li&gt;Arrays.&lt;/li&gt;
&lt;li&gt;Objetos aninhados.&lt;/li&gt;
&lt;li&gt;Schemas reutilizáveis via &lt;code&gt;$ref&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Documentação com pré-visualização
&lt;/h3&gt;

&lt;p&gt;A documentação deve ser derivada da especificação.&lt;/p&gt;

&lt;p&gt;Durante o design, a equipe deve conseguir revisar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Descrição do endpoint.&lt;/li&gt;
&lt;li&gt;Parâmetros.&lt;/li&gt;
&lt;li&gt;Payloads.&lt;/li&gt;
&lt;li&gt;Schemas.&lt;/li&gt;
&lt;li&gt;Exemplos de request e response.&lt;/li&gt;
&lt;li&gt;Códigos de erro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso ajuda frontend, backend, QA, produto e integrações externas a validarem o contrato antes da implementação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Revisão em equipe
&lt;/h3&gt;

&lt;p&gt;Mudanças em APIs devem ser tratadas como mudanças de código.&lt;/p&gt;

&lt;p&gt;Uma plataforma design-first deve permitir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comentários em endpoints.&lt;/li&gt;
&lt;li&gt;Discussões em campos específicos.&lt;/li&gt;
&lt;li&gt;Histórico de alterações.&lt;/li&gt;
&lt;li&gt;Revisão assíncrona.&lt;/li&gt;
&lt;li&gt;Visibilidade sobre quem alterou o quê.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exportação para OpenAPI padrão
&lt;/h3&gt;

&lt;p&gt;A especificação precisa ser portátil.&lt;/p&gt;

&lt;p&gt;Você deve conseguir exportar OpenAPI 3.x e usar com outras ferramentas, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Geradores de código.&lt;/li&gt;
&lt;li&gt;Gateways de API.&lt;/li&gt;
&lt;li&gt;Validadores.&lt;/li&gt;
&lt;li&gt;Test runners.&lt;/li&gt;
&lt;li&gt;Ferramentas de documentação.&lt;/li&gt;
&lt;li&gt;Pipelines de CI/CD.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Apidog como plataforma design-first
&lt;/h2&gt;

&lt;p&gt;O Apidog organiza o fluxo em torno da especificação da API. Design, mock, documentação, testes e colaboração usam a mesma definição de API como base.&lt;/p&gt;

&lt;h3&gt;
  
  
  Editor visual OpenAPI
&lt;/h3&gt;

&lt;p&gt;No Apidog, cada endpoint é editado em uma interface estruturada.&lt;/p&gt;

&lt;p&gt;Você configura:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Path.&lt;/li&gt;
&lt;li&gt;Método HTTP.&lt;/li&gt;
&lt;li&gt;Parâmetros.&lt;/li&gt;
&lt;li&gt;Headers.&lt;/li&gt;
&lt;li&gt;Body.&lt;/li&gt;
&lt;li&gt;Responses.&lt;/li&gt;
&lt;li&gt;Schemas.&lt;/li&gt;
&lt;li&gt;Descrições.&lt;/li&gt;
&lt;li&gt;Exemplos.&lt;/li&gt;
&lt;li&gt;Regras de validação.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso reduz a necessidade de escrever YAML manualmente.&lt;/p&gt;

&lt;p&gt;Ainda assim, se preferir, é possível visualizar e editar a representação bruta em YAML ou JSON. As alterações feitas na visualização visual e na visualização bruta permanecem sincronizadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reutilização com componentes
&lt;/h3&gt;

&lt;p&gt;Componentes de schema são essenciais para evitar duplicação.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;ErrorResponse&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;code&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;message&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;USER_NOT_FOUND"&lt;/span&gt;
        &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Usuário&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;não&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;encontrado"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, o mesmo schema pode ser referenciado em vários endpoints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;404"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Usuário não encontrado&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/ErrorResponse"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No Apidog, esses componentes podem ser definidos uma vez e reutilizados em múltiplas rotas. Ao alterar o schema, os endpoints que o referenciam refletem a mudança.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pré-visualização de documentação em tempo real
&lt;/h3&gt;

&lt;p&gt;Enquanto você projeta um endpoint, a documentação pode ser pré-visualizada.&lt;/p&gt;

&lt;p&gt;Isso permite validar rapidamente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se os nomes dos campos estão claros.&lt;/li&gt;
&lt;li&gt;Se os exemplos fazem sentido.&lt;/li&gt;
&lt;li&gt;Se os status HTTP estão documentados.&lt;/li&gt;
&lt;li&gt;Se os erros estão compreensíveis.&lt;/li&gt;
&lt;li&gt;Se a estrutura do payload é fácil de consumir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa pré-visualização é útil para revisar a API com frontend, QA, produto ou times externos antes de implementar o backend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Smart Mock: da especificação para um mock funcional
&lt;/h3&gt;

&lt;p&gt;Ao salvar um endpoint no Apidog, o servidor de mock fica disponível.&lt;/p&gt;

&lt;p&gt;O mock gera respostas com base nos schemas definidos. Por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Campos &lt;code&gt;string&lt;/code&gt; com &lt;code&gt;format: email&lt;/code&gt; retornam emails válidos.&lt;/li&gt;
&lt;li&gt;Campos &lt;code&gt;integer&lt;/code&gt; com &lt;code&gt;minimum&lt;/code&gt; e &lt;code&gt;maximum&lt;/code&gt; retornam valores dentro do intervalo.&lt;/li&gt;
&lt;li&gt;Campos &lt;code&gt;enum&lt;/code&gt; retornam um dos valores permitidos.&lt;/li&gt;
&lt;li&gt;Arrays e objetos aninhados seguem a estrutura definida.&lt;/li&gt;
&lt;li&gt;Schemas com &lt;code&gt;$ref&lt;/code&gt; são resolvidos corretamente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de schema:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;UserProfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
  &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usr_123"&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;enum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;admin&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;member&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;viewer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O mock pode retornar algo compatível com esse contrato:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usr_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"member"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também é possível configurar regras de mock para cenários específicos, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retornar &lt;code&gt;404&lt;/code&gt; quando &lt;code&gt;id = 0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Retornar um payload específico para determinado parâmetro de query.&lt;/li&gt;
&lt;li&gt;Simular respostas de erro.&lt;/li&gt;
&lt;li&gt;Testar estados vazios.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Revisão em equipe e histórico de mudanças
&lt;/h3&gt;

&lt;p&gt;Mudanças na especificação ficam visíveis para os membros do workspace.&lt;/p&gt;

&lt;p&gt;A equipe pode comentar em endpoints ou campos específicos e acompanhar o histórico de alterações.&lt;/p&gt;

&lt;p&gt;Para um fluxo design-first, isso ajuda a manter uma prática importante:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nenhuma mudança de contrato deve acontecer sem visibilidade para quem consome a API.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Design-first vs. code-first: compensações reais
&lt;/h2&gt;

&lt;p&gt;Design-first não é sempre a melhor escolha. A decisão depende do contexto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens do design-first
&lt;/h3&gt;

&lt;p&gt;Use design-first quando você precisa de coordenação entre pessoas ou times.&lt;/p&gt;

&lt;p&gt;Benefícios principais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend e backend trabalham em paralelo.&lt;/li&gt;
&lt;li&gt;Mocks ficam disponíveis desde o início.&lt;/li&gt;
&lt;li&gt;A documentação nasce junto com o contrato.&lt;/li&gt;
&lt;li&gt;Mudanças são revisadas antes da implementação.&lt;/li&gt;
&lt;li&gt;Testes conseguem validar a implementação contra o schema.&lt;/li&gt;
&lt;li&gt;Problemas de integração aparecem mais cedo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desvantagens do design-first
&lt;/h3&gt;

&lt;p&gt;O design-first também tem custos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exige tempo inicial para definir a especificação.&lt;/li&gt;
&lt;li&gt;A equipe precisa aprender a ferramenta.&lt;/li&gt;
&lt;li&gt;É necessário manter disciplina para não alterar a implementação sem atualizar o contrato.&lt;/li&gt;
&lt;li&gt;Especificar demais muito cedo pode dificultar mudanças quando o domínio ainda está incerto.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vantagens do code-first
&lt;/h3&gt;

&lt;p&gt;Code-first pode ser melhor quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O projeto é pequeno.&lt;/li&gt;
&lt;li&gt;Você está prototipando.&lt;/li&gt;
&lt;li&gt;Há apenas um desenvolvedor.&lt;/li&gt;
&lt;li&gt;A API ainda é experimental.&lt;/li&gt;
&lt;li&gt;A velocidade de descoberta é mais importante do que a estabilidade do contrato.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desvantagens do code-first
&lt;/h3&gt;

&lt;p&gt;Os problemas aparecem conforme a API cresce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentação tende a ficar desatualizada.&lt;/li&gt;
&lt;li&gt;Frontend precisa esperar a implementação real.&lt;/li&gt;
&lt;li&gt;O contrato fica implícito no código.&lt;/li&gt;
&lt;li&gt;Mudanças quebram consumidores com mais facilidade.&lt;/li&gt;
&lt;li&gt;Refatorações exigem atualização manual da documentação.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como regra prática:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Projeto experimental ou solo → code-first pode ser suficiente
API consumida por múltiplos times → design-first tende a escalar melhor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Ferramentas que suportam fluxos design-first
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apidog
&lt;/h3&gt;

&lt;p&gt;O Apidog combina editor visual, mock, documentação, testes e revisão em equipe em uma única plataforma.&lt;/p&gt;

&lt;p&gt;É uma boa opção para times que querem manter a especificação como fonte da verdade e usar o mesmo contrato para design, mock, validação e documentação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stoplight Studio
&lt;/h3&gt;

&lt;p&gt;O Stoplight Studio oferece um editor OpenAPI forte e linting com Spectral para padronização.&lt;/p&gt;

&lt;p&gt;É útil para organizações que precisam de governança de API. Porém, não foca no mesmo nível de integração entre mock, testes e fluxo completo de desenvolvimento.&lt;/p&gt;

&lt;h3&gt;
  
  
  SwaggerHub
&lt;/h3&gt;

&lt;p&gt;O SwaggerHub é uma plataforma madura para edição e colaboração em OpenAPI.&lt;/p&gt;

&lt;p&gt;É bastante usado em ambientes corporativos e funciona bem para organizações já inseridas no ecossistema Swagger. Sua capacidade de mock e testes é mais limitada em comparação com plataformas mais integradas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Postman com API Builder
&lt;/h3&gt;

&lt;p&gt;O Postman oferece recursos de design de API e geração de especificações OpenAPI.&lt;/p&gt;

&lt;p&gt;Ainda assim, os fluxos de design e collections podem parecer separados. O mock geralmente exige configuração manual a partir de collections, em vez de nascer automaticamente da especificação.&lt;/p&gt;

&lt;p&gt;Funciona bem para equipes code-first que querem adicionar documentação e alguns recursos de contrato.&lt;/p&gt;

&lt;h3&gt;
  
  
  Insomnia com modo de documento
&lt;/h3&gt;

&lt;p&gt;O Insomnia permite editar especificações OpenAPI e oferece mock básico.&lt;/p&gt;

&lt;p&gt;É uma opção leve para desenvolvedores solo, mas menos completa para fluxos design-first colaborativos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Como configurar um fluxo design-first no Apidog
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Passo 1: comece pela especificação
&lt;/h3&gt;

&lt;p&gt;Crie um projeto e abra a área de design.&lt;/p&gt;

&lt;p&gt;Antes de enviar qualquer request, defina pelo menos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Path.&lt;/li&gt;
&lt;li&gt;Método HTTP.&lt;/li&gt;
&lt;li&gt;Parâmetros.&lt;/li&gt;
&lt;li&gt;Schema de resposta.&lt;/li&gt;
&lt;li&gt;Possíveis códigos de erro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo mínimo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /users/{id}

Path param:
- id: string, obrigatório

Responses:
- 200: UserProfile
- 404: ErrorResponse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 2: defina componentes compartilhados
&lt;/h3&gt;

&lt;p&gt;Antes de criar muitos endpoints, padronize os schemas reutilizáveis.&lt;/p&gt;

&lt;p&gt;Componentes comuns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ErrorResponse&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pagination&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UserProfile&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AuthToken&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ValidationError&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Metadata&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;Pagination&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
  &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;page&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integer&lt;/span&gt;
      &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="na"&gt;pageSize&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integer&lt;/span&gt;
      &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
    &lt;span class="na"&gt;total&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integer&lt;/span&gt;
      &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;150&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso evita que cada endpoint implemente paginação ou erros de forma diferente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 3: salve o endpoint e use a URL de mock
&lt;/h3&gt;

&lt;p&gt;Assim que o endpoint estiver salvo, copie a URL do mock e compartilhe com o frontend.&lt;/p&gt;

&lt;p&gt;O frontend pode começar com algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://mock.example.com/users/usr_123&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mesmo que o backend ainda não esteja pronto, a interface já pode ser implementada usando o contrato.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 4: revise a documentação antes do código
&lt;/h3&gt;

&lt;p&gt;Abra a pré-visualização da documentação e valide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O objetivo do endpoint está claro?&lt;/li&gt;
&lt;li&gt;Os campos têm descrições úteis?&lt;/li&gt;
&lt;li&gt;Os exemplos representam casos reais?&lt;/li&gt;
&lt;li&gt;Os erros estão documentados?&lt;/li&gt;
&lt;li&gt;O frontend tem informação suficiente para consumir a API?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se algo não estiver claro na documentação, corrija na especificação antes da implementação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 5: bloqueie o contrato durante o sprint
&lt;/h3&gt;

&lt;p&gt;Depois da revisão, trate a especificação como o contrato do sprint.&lt;/p&gt;

&lt;p&gt;Se a implementação exigir uma mudança, não altere apenas o código. Faça o fluxo correto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Propor alteração na especificação
2. Revisar impacto com consumidores da API
3. Atualizar mock e documentação
4. Ajustar backend
5. Validar com testes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso evita que o frontend integre contra um comportamento diferente do planejado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 6: valide schemas no CI
&lt;/h3&gt;

&lt;p&gt;Configure testes para garantir que a resposta real respeite o contrato.&lt;/p&gt;

&lt;p&gt;Exemplo de validação esperada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Endpoint: GET /users/{id}
Esperado:
- status 200
- body compatível com UserProfile
- campo email presente
- campo email no formato correto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em um pipeline, a ideia é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build → Deploy ambiente de teste → Executar testes de API → Validar schema → Aprovar ou falhar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse passo mantém implementação e especificação sincronizadas ao longo do tempo.&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O design-first é apenas para APIs REST?
&lt;/h3&gt;

&lt;p&gt;Não.&lt;/p&gt;

&lt;p&gt;O princípio se aplica a qualquer tecnologia em que exista um contrato:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST com OpenAPI.&lt;/li&gt;
&lt;li&gt;GraphQL com schema-first.&lt;/li&gt;
&lt;li&gt;gRPC com arquivos &lt;code&gt;.proto&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sistemas orientados a eventos com AsyncAPI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Apidog suporta design REST e GraphQL. Para gRPC, os arquivos proto cumprem o papel de contrato primeiro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Precisamos definir todos os endpoints antes de começar?
&lt;/h3&gt;

&lt;p&gt;Não.&lt;/p&gt;

&lt;p&gt;Você pode adotar design-first por recurso.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sprint atual: módulo de usuários
Defina primeiro apenas os endpoints de usuários
Implemente backend e frontend em paralelo
Depois avance para o próximo módulo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A adoção incremental funciona bem e reduz resistência da equipe.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como design-first funciona com sprints ágeis?
&lt;/h3&gt;

&lt;p&gt;No início do sprint, faça uma sessão curta de design da API.&lt;/p&gt;

&lt;p&gt;Saída esperada:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Endpoints definidos.&lt;/li&gt;
&lt;li&gt;Schemas revisados.&lt;/li&gt;
&lt;li&gt;Mocks publicados.&lt;/li&gt;
&lt;li&gt;Documentação inicial disponível.&lt;/li&gt;
&lt;li&gt;Pontos de dúvida registrados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depois disso, frontend e backend trabalham em paralelo durante o sprint.&lt;/p&gt;

&lt;h3&gt;
  
  
  E se a implementação precisar divergir da especificação?
&lt;/h3&gt;

&lt;p&gt;Isso pode acontecer.&lt;/p&gt;

&lt;p&gt;O processo correto é:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Atualizar a especificação.&lt;/li&gt;
&lt;li&gt;Revisar a mudança com os consumidores da API.&lt;/li&gt;
&lt;li&gt;Atualizar mocks e documentação.&lt;/li&gt;
&lt;li&gt;Alterar a implementação.&lt;/li&gt;
&lt;li&gt;Rodar os testes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A especificação deve continuar sendo a fonte da verdade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Podemos gerar stubs de servidor a partir da exportação OpenAPI do Apidog?
&lt;/h3&gt;

&lt;p&gt;Sim.&lt;/p&gt;

&lt;p&gt;Exporte a especificação como OpenAPI 3.x e use um gerador de código compatível.&lt;/p&gt;

&lt;p&gt;Por exemplo, com &lt;code&gt;openapi-generator&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openapi-generator-cli generate &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-i&lt;/span&gt; openapi.yaml &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-g&lt;/span&gt; nodejs-express-server &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; ./generated-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;openapi-generator&lt;/code&gt; suporta várias linguagens e frameworks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como lidar com versionamento da especificação?
&lt;/h3&gt;

&lt;p&gt;O Apidog mantém histórico de mudanças dentro do projeto.&lt;/p&gt;

&lt;p&gt;Para versões principais mantidas em paralelo, como &lt;code&gt;v1&lt;/code&gt; e &lt;code&gt;v2&lt;/code&gt;, uma abordagem comum é usar projetos ou branches separados.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API Users v1 → projeto/branch estável
API Users v2 → projeto/branch em evolução
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Design-first exige um pequeno investimento inicial em disciplina, mas reduz custos de integração conforme a API cresce.&lt;/p&gt;

&lt;p&gt;O fluxo recomendado é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Especificar → Revisar → Mockar → Implementar → Testar → Documentar automaticamente
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ferramenta escolhida precisa tornar esse fluxo simples. Se escrever a especificação for difícil, a equipe volta para code-first.&lt;/p&gt;

&lt;p&gt;Com editor visual, mock instantâneo, documentação em tempo real e testes conectados ao mesmo contrato, o Apidog torna o design-first mais prático para equipes que precisam construir APIs de forma colaborativa e previsível.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>APIDOG Abril: Novidades, Debugger IA, Debugger A2A e Migração Postman Fácil</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Wed, 29 Apr 2026 08:48:27 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/apidog-abril-novidades-debugger-ia-debugger-a2a-e-migracao-postman-facil-2mgi</link>
      <guid>https://dev.to/lucas_ferreira/apidog-abril-novidades-debugger-ia-debugger-a2a-e-migracao-postman-facil-2mgi</guid>
      <description>&lt;p&gt;O lançamento de abril foca em um problema comum no desenvolvimento de Agentes de IA: &lt;strong&gt;inspecionar o que aconteceu antes da resposta final&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Quando você está construindo agentes, a dificuldade raramente está apenas na resposta retornada. O desafio é entender o caminho até ela:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O agente interpretou corretamente a intenção do usuário?&lt;/li&gt;
&lt;li&gt;Qual modelo foi chamado?&lt;/li&gt;
&lt;li&gt;Qual ferramenta foi executada?&lt;/li&gt;
&lt;li&gt;O retorno da ferramenta estava correto?&lt;/li&gt;
&lt;li&gt;O erro veio do prompt, da configuração do modelo ou da lógica de negócio?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neste mês, o Apidog adiciona recursos para tornar esse fluxo mais fácil de depurar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI Agent Debugger&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A2A Debugger&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Importação do Postman via API&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pergunte à IA em documentos publicados na barra lateral&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provedores personalizados de modelo de IA&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⭐ Novas Atualizações
&lt;/h2&gt;

&lt;h2&gt;
  
  
  🔥 AI Agent Debugger: inspecione a execução completa do agente
&lt;/h2&gt;

&lt;p&gt;O Apidog já suportava depuração visual para endpoints SSE, útil para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;respostas de modelo em streaming;&lt;/li&gt;
&lt;li&gt;atualizações de progresso;&lt;/li&gt;
&lt;li&gt;notificações em tempo real;&lt;/li&gt;
&lt;li&gt;APIs orientadas a eventos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mas depurar agentes exige mais do que visualizar um stream.&lt;/p&gt;

&lt;p&gt;Uma resposta final mostra onde o agente chegou. Para corrigir problemas reais, você precisa ver &lt;strong&gt;como ele chegou lá&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Com o novo &lt;strong&gt;AI Agent Debugger&lt;/strong&gt;, você pode acompanhar a execução completa do agente dentro do Apidog, incluindo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rodadas de conversa;&lt;/li&gt;
&lt;li&gt;chamadas de modelo;&lt;/li&gt;
&lt;li&gt;chamadas de ferramenta MCP;&lt;/li&gt;
&lt;li&gt;execução de Skills personalizadas;&lt;/li&gt;
&lt;li&gt;resultados das ferramentas;&lt;/li&gt;
&lt;li&gt;saída final.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na prática, isso ajuda a responder perguntas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O prompt forneceu contexto suficiente?&lt;/li&gt;
&lt;li&gt;O agente escolheu a ferramenta correta?&lt;/li&gt;
&lt;li&gt;A ferramenta MCP retornou o resultado esperado?&lt;/li&gt;
&lt;li&gt;O problema está no modelo, nos parâmetros da ferramenta ou na regra de negócio?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse tipo de inspeção é especialmente útil quando o fluxo do agente deixa de ser uma demo simples e passa a envolver múltiplas etapas, ferramentas e decisões intermediárias.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤝 A2A Debugger: teste comunicação agente-para-agente
&lt;/h2&gt;

&lt;p&gt;Sistemas multiagentes estão se tornando mais comuns. Quando agentes começam a trabalhar juntos, você precisa validar se eles conseguem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;delegar tarefas;&lt;/li&gt;
&lt;li&gt;trocar mensagens;&lt;/li&gt;
&lt;li&gt;retornar resultados;&lt;/li&gt;
&lt;li&gt;lidar corretamente com parâmetros e respostas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Apidog agora suporta depuração para o protocolo &lt;strong&gt;A2A&lt;/strong&gt;, ou &lt;strong&gt;Agente-para-Agente&lt;/strong&gt;, do Google.&lt;/p&gt;

&lt;p&gt;Com o &lt;strong&gt;A2A Debugger&lt;/strong&gt;, você pode:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;enviar requisições A2A diretamente;&lt;/li&gt;
&lt;li&gt;inspecionar os parâmetros da requisição;&lt;/li&gt;
&lt;li&gt;verificar a resposta;&lt;/li&gt;
&lt;li&gt;validar o resultado da interação entre agentes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A diferença entre os dois novos recursos é direta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Agent Debugger&lt;/strong&gt;: depura o que acontece dentro de um único agente durante a execução.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A2A Debugger&lt;/strong&gt;: depura a comunicação entre um agente e outro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você está criando sistemas com múltiplos agentes, provavelmente vai precisar dos dois.&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Importe dados do Postman através da API do Postman
&lt;/h2&gt;

&lt;p&gt;A migração do Postman agora tem uma opção melhor para equipes maiores.&lt;/p&gt;

&lt;p&gt;O Apidog já suportava importação de arquivos locais do Postman. Agora, também é possível importar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Workspaces;&lt;/li&gt;
&lt;li&gt;Coleções;&lt;/li&gt;
&lt;li&gt;Ambientes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tudo isso através da &lt;strong&gt;API do Postman&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fuploads%2Fhelp%2F2026%2F04%2F29%2Fxhy7y-9y.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fuploads%2Fhelp%2F2026%2F04%2F29%2Fxhy7y-9y.gif" alt="Apidog-02.gif" width="600" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse fluxo é mais adequado para migrações em massa ao criar novos projetos.&lt;/p&gt;

&lt;p&gt;Em vez de exportar arquivos manualmente, fazer upload e depois ajustar tudo, você pode importar dados diretamente. Se sua conta do Postman tiver vários Workspaces, o Apidog criará projetos correspondentes após a importação.&lt;/p&gt;

&lt;p&gt;Use assim:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para importações pequenas: arquivos locais ainda funcionam.&lt;/li&gt;
&lt;li&gt;Para migrações maiores: use a importação via API do Postman.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📄 Pergunte à IA em documentos publicados agora abre na barra lateral
&lt;/h2&gt;

&lt;p&gt;O recurso &lt;strong&gt;Pergunte à IA&lt;/strong&gt; em documentação publicada agora funciona em uma barra lateral.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fuploads%2Fhelp%2F2026%2F04%2F29%2Fw7yvf-n5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fuploads%2Fhelp%2F2026%2F04%2F29%2Fw7yvf-n5.gif" alt="Apidog-01.gif" width="560" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isso permite que o leitor mantenha a documentação aberta enquanto faz perguntas sobre ela.&lt;/p&gt;

&lt;p&gt;Na prática, o fluxo fica mais simples:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;leia a documentação da API;&lt;/li&gt;
&lt;li&gt;abra a barra lateral do Pergunte à IA;&lt;/li&gt;
&lt;li&gt;faça uma pergunta sobre o conteúdo;&lt;/li&gt;
&lt;li&gt;continue na mesma página, sem perder o contexto.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Essa mudança é útil principalmente em documentações longas, onde a resposta pode estar na página, mas não é fácil de localizar rapidamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Provedores de modelo de IA personalizados
&lt;/h2&gt;

&lt;p&gt;Equipes agora podem conectar provedores personalizados usando uma &lt;strong&gt;URL Base personalizada&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Isso é útil se sua empresa já usa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;um serviço de modelo auto-hospedado;&lt;/li&gt;
&lt;li&gt;um gateway interno de modelos;&lt;/li&gt;
&lt;li&gt;uma configuração própria para fluxos de IA.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Assim, você pode usar essa configuração no Apidog ao depurar fluxos relacionados à IA, sem alternar entre várias ferramentas.&lt;/p&gt;

&lt;h2&gt;
  
  
  🐞 Correções de bugs e melhorias menores
&lt;/h2&gt;

&lt;p&gt;Também foram lançadas correções e melhorias neste mês:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Corrigido um problema onde a mesclagem inteligente OpenAPI não mantinha exemplos de resposta de endpoint.&lt;/li&gt;
&lt;li&gt;Corrigido um problema onde a mesclagem de uma branch filha para uma branch principal protegida poderia incluir endpoints que não foram selecionados.&lt;/li&gt;
&lt;li&gt;Corrigida a exibição incorreta do menu suspenso ao criar versões de endpoint a partir de branches.&lt;/li&gt;
&lt;li&gt;Corrigido um problema onde TestData e TestCases não funcionavam ao executar testes via CLI.&lt;/li&gt;
&lt;li&gt;Corrigido um problema onde a exportação OpenAPI incluía componentes de resposta de módulos não relacionados.&lt;/li&gt;
&lt;li&gt;Corrigida a formatação da exportação Markdown para JSON com comentários.&lt;/li&gt;
&lt;li&gt;Corrigido um erro de exportação Word causado por &lt;code&gt;crypto is not defined&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Corrigido um problema onde a importação do Knife4j com Basic Auth habilitado não mostrava os campos de usuário e senha.&lt;/li&gt;
&lt;li&gt;Corrigido um erro de filtragem de endpoint quando as tags eram números.&lt;/li&gt;
&lt;li&gt;Corrigido um problema onde &lt;code&gt;apidog endpoint list --branch&lt;/code&gt; não retornava dados para a branch especificada.&lt;/li&gt;
&lt;li&gt;Corrigidos vários problemas de parâmetros, filtragem e mensagens de erro da ferramenta MCP.&lt;/li&gt;
&lt;li&gt;Corrigido um problema onde o código gerado estava faltando a opção de configuração &lt;code&gt;typescriptThreePlus&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🌟 O que isso significa
&lt;/h2&gt;

&lt;p&gt;Este lançamento é voltado para equipes que estão levando Agentes de IA para projetos reais.&lt;/p&gt;

&lt;p&gt;Resumo prático:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use o &lt;strong&gt;AI Agent Debugger&lt;/strong&gt; para entender a execução interna de um agente.&lt;/li&gt;
&lt;li&gt;Use o &lt;strong&gt;A2A Debugger&lt;/strong&gt; para validar comunicação entre agentes.&lt;/li&gt;
&lt;li&gt;Use a &lt;strong&gt;importação via API do Postman&lt;/strong&gt; para migrações maiores.&lt;/li&gt;
&lt;li&gt;Use o &lt;strong&gt;Pergunte à IA na barra lateral&lt;/strong&gt; para melhorar a experiência em documentação publicada.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;provedores personalizados de modelo&lt;/strong&gt; para trabalhar com sua própria infraestrutura de IA.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O objetivo não é adicionar recursos chamativos. É reduzir o tempo gasto tentando descobrir onde um fluxo de agente falhou.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬 Participe da conversa
&lt;/h2&gt;

&lt;p&gt;Conecte-se com outros engenheiros de API e com a equipe Apidog:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Junte-se à nossa comunidade do &lt;a href="https://discord.com/invite/ZBxrzyXfbJ" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; para discussões e suporte em tempo real.&lt;/li&gt;
&lt;li&gt;Participe da nossa comunidade do &lt;a href="https://join.slack.com/t/apidogcommunity/shared_invite/zt-2neie4nh2-4_zhufuNBmCq4EtI6fZUwA" rel="noopener noreferrer"&gt;Slack&lt;/a&gt; para conversas técnicas.&lt;/li&gt;
&lt;li&gt;Siga-nos no &lt;a href="https://x.com/ApidogHQ" rel="noopener noreferrer"&gt;X (Twitter)&lt;/a&gt; para as últimas atualizações.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;P.S. Para todos os detalhes sobre as atualizações, confira o &lt;a href="https://apidog.canny.io/changelog/" rel="noopener noreferrer"&gt;Apidog Changelog&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Atenciosamente,&lt;br&gt;&lt;br&gt;
A Equipe Apidog&lt;/p&gt;

</description>
    </item>
    <item>
      <title>GitHub Copilot: Faturamento e Custos para Equipes de API</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Wed, 29 Apr 2026 07:09:07 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/github-copilot-faturamento-e-custos-para-equipes-de-api-79f</link>
      <guid>https://dev.to/lucas_ferreira/github-copilot-faturamento-e-custos-para-equipes-de-api-79f</guid>
      <description>&lt;p&gt;O modelo de faturamento do GitHub Copilot mudou duas vezes no ano passado e mudou novamente este mês. Agora, a revisão de código do Copilot em pull requests consome minutos do GitHub Actions da conta de faturamento proprietária do repositório. Para equipes de API, isso significa gerenciar três medidores ao mesmo tempo: licenças do Copilot, solicitações premium e minutos do Actions. Este guia mostra como cada medidor funciona, por que repositórios de API tendem a consumir mais e como estimar o custo antes de ele aparecer na fatura.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;No final, combinamos esse modelo com um fluxo de trabalho no Apidog para manter especificação da API, testes de contrato e etapas de revisão de IA em um único fluxo, em vez de espalhar o controle entre vários painéis de faturamento.&lt;/p&gt;

&lt;p&gt;Se você também está avaliando modelos de API consumidos diretamente pela sua equipe, veja os guias sobre &lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;precificação do GPT-5.5&lt;/a&gt; e &lt;a href="http://apidog.com/blog/deepseek-v4-api-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;precificação do DeepSeek V4&lt;/a&gt;, que cobrem o lado por token da mesma discussão.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O Copilot agora tem três medidores principais: licença por usuário, solicitações premium e minutos do Actions para revisão de código.&lt;/li&gt;
&lt;li&gt;A revisão de código em PRs roda como uma GitHub Action e consome a cota normal de minutos da organização.&lt;/li&gt;
&lt;li&gt;Repositórios de API tendem a consumir mais porque PRs incluem especificação, clientes gerados, handlers e testes.&lt;/li&gt;
&lt;li&gt;Solicitações premium impactam principalmente recursos como Workspace, modo agente, Copilot Spaces e seleção de modelos.&lt;/li&gt;
&lt;li&gt;Defina limites de gastos antes do próximo ciclo. Para um repositório de API ativo, comece estimando 400 a 800 minutos do Actions por mês e ajuste após 30 dias.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Os três medidores do Copilot
&lt;/h2&gt;

&lt;p&gt;O Copilot deixou de ser uma única linha previsível na fatura. Agora você precisa acompanhar três itens.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Licença por usuário
&lt;/h3&gt;

&lt;p&gt;Este é o custo fixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Copilot Business:    $10 por usuário/mês
Copilot Enterprise:  $19 por usuário/mês
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A licença cobre recursos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chat;&lt;/li&gt;
&lt;li&gt;conclusões inline;&lt;/li&gt;
&lt;li&gt;sugestões de múltiplas linhas;&lt;/li&gt;
&lt;li&gt;integrações com IDE;&lt;/li&gt;
&lt;li&gt;acesso ao pool padrão de modelos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse é o medidor mais simples de prever, mas também o mais fácil de superdimensionar. Faça uma auditoria trimestral e remova licenças de usuários inativos.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Solicitações premium
&lt;/h3&gt;

&lt;p&gt;Solicitações premium são usadas pelos recursos mais caros do Copilot, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;modo agente;&lt;/li&gt;
&lt;li&gt;Workspace;&lt;/li&gt;
&lt;li&gt;Copilot Spaces;&lt;/li&gt;
&lt;li&gt;seleção manual de modelos fora do padrão.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Custos atuais em solicitações premium:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Recurso&lt;/th&gt;
&lt;th&gt;Custo em solicitações premium&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chat do modelo padrão&lt;/td&gt;
&lt;td&gt;Gratuito para planos pagos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conclusões inline&lt;/td&gt;
&lt;td&gt;Gratuito para planos pagos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modo agente com modelo padrão&lt;/td&gt;
&lt;td&gt;1 por solicitação&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workspace com modelo padrão&lt;/td&gt;
&lt;td&gt;1 por solicitação&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.5&lt;/td&gt;
&lt;td&gt;Multiplicador de 1,5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;Multiplicador de 2x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5 Pro&lt;/td&gt;
&lt;td&gt;Multiplicador de 6x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consulta Copilot Spaces&lt;/td&gt;
&lt;td&gt;1 por consulta&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cotas incluídas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Copilot Business:    300 solicitações premium por licença/mês
Copilot Enterprise:  1.000 solicitações premium por licença/mês
Excedente:           $0.04 por solicitação
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para equipes de API, os prompts que mais consomem esse medidor geralmente são tarefas do modo agente, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Regenerar o cliente OpenAPI.
Criar testes de contrato para este endpoint.
Atualizar os mocks com base na nova especificação.
Refatorar handlers afetados pela mudança de schema.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma única tarefa pode gerar várias etapas internas. Na prática, um prompt pode consumir quatro ou cinco solicitações premium.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Minutos do Actions para revisão de código
&lt;/h3&gt;

&lt;p&gt;Esta é a mudança que mais surpreende equipes de engenharia.&lt;/p&gt;

&lt;p&gt;Quando o Copilot executa uma revisão automática em um pull request, essa revisão roda sobre a infraestrutura do GitHub Actions. Ou seja, ela consome os mesmos minutos usados pela sua CI.&lt;/p&gt;

&lt;p&gt;Pontos importantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Os minutos entram na cota existente do GitHub Actions.&lt;/li&gt;
&lt;li&gt;Eles não são uma cota separada do Copilot.&lt;/li&gt;
&lt;li&gt;Repositórios privados consomem minutos faturáveis.&lt;/li&gt;
&lt;li&gt;Repositórios públicos continuam com Actions gratuito, conforme as regras do GitHub.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uma revisão típica do Copilot em um PR de API consome de 2 a 6 minutos do Actions. Em PRs grandes, com muitos arquivos e contexto completo do repositório, esse número pode chegar a 15 minutos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que repositórios de API consomem mais
&lt;/h2&gt;

&lt;p&gt;Repositórios de API costumam amplificar os três medidores por alguns motivos práticos.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. PRs de API são maiores
&lt;/h3&gt;

&lt;p&gt;Uma alteração simples em API pode tocar vários arquivos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openapi.yaml
clientes gerados
handler do servidor
schemas
testes de contrato
mocks
documentação
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quanto maior o diff, mais trabalho para a revisão automática e maior o tempo de execução no Actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Código gerado aumenta o ruído
&lt;/h3&gt;

&lt;p&gt;Muitas equipes versionam clientes gerados no repositório. Quando isso acontece, a revisão do Copilot pode analisar também arquivos que não deveriam ser revisados manualmente.&lt;/p&gt;

&lt;p&gt;Exemplo comum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;clients/typescript/**
clients/python/**
clients/java/**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se esses diretórios entram no diff, eles aumentam o tempo de revisão sem necessariamente melhorar a qualidade do feedback.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. O PR pode acionar vários revisores
&lt;/h3&gt;

&lt;p&gt;Em um mesmo pull request, a equipe pode rodar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copilot Review;&lt;/li&gt;
&lt;li&gt;CodeQL;&lt;/li&gt;
&lt;li&gt;Snyk;&lt;/li&gt;
&lt;li&gt;scanner interno de segurança;&lt;/li&gt;
&lt;li&gt;testes de contrato;&lt;/li&gt;
&lt;li&gt;linters;&lt;/li&gt;
&lt;li&gt;validação de OpenAPI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada ferramenta tem seu próprio custo operacional. O Copilot passa a ser mais um item nesse pipeline.&lt;/p&gt;

&lt;p&gt;Exemplo de impacto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;50 PRs/mês × 4 minutos por revisão = 200 minutos/mês
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em um plano Team com 3.000 minutos mensais para runners Linux, isso representa cerca de 7% da cota mensal para um único repositório. Com três repositórios semelhantes, você já compromete aproximadamente 21% antes de considerar o restante da CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como estimar sua fatura mensal
&lt;/h2&gt;

&lt;p&gt;Modele o custo em três etapas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Etapa 1: calcule as licenças
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Business:
seats = usuários_ativos × $10

Enterprise:
seats = usuários_ativos × $19
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10 usuários no Enterprise = 10 × $19 = $190/mês
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Etapa 2: estime solicitações premium
&lt;/h3&gt;

&lt;p&gt;Use uma estimativa por perfil de uso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Uso leve:
~150 solicitações/mês por pessoa

Uso intenso com Workspace ou modo agente:
~600 a 800 solicitações/mês por pessoa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fórmula para excedente no Business:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;premium_overage = max(0, requests_used - 300_por_licença) × $0.04
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5 usuários Business
Cota incluída: 5 × 300 = 1.500 solicitações

Uso real: 2.000 solicitações
Excedente: 500 solicitações

Custo: 500 × $0.04 = $20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Defina um limite de gastos no nível da organização. O padrão ilimitado é arriscado para qualquer equipe que use agentes sem monitoramento ativo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Etapa 3: estime minutos do Actions para revisão
&lt;/h3&gt;

&lt;p&gt;Comece com uma média de 4 minutos por PR de API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;review_minutes = prs_por_mês × 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se houver excedente de Actions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;review_overage = max(0, review_minutes - actions_quota_remaining) × $0.008
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para repositórios privados Linux, use o valor vigente do GitHub como base de cálculo.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;200 PRs/mês × 4 minutos = 800 minutos/mês
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em uma organização Enterprise, isso provavelmente fica dentro da cota. Em uma equipe menor no Business, pode acelerar o consumo dos minutos disponíveis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo completo de estimativa
&lt;/h2&gt;

&lt;p&gt;Cenário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10 desenvolvedores
Copilot Enterprise
200 PRs de API por mês
Uso moderado de modo agente
4 minutos por revisão
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Estimativa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Licenças:
10 × $19 = $190

Excedente premium:
~$40

Minutos de revisão:
200 × 4 = 800 minutos
Dentro da cota Enterprise: $0

Total aproximado:
$230/mês
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O valor exato depende do uso real de solicitações premium e da cota restante do Actions, mas esse modelo ajuda a detectar riscos antes do fechamento da fatura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como ajustar seu pipeline de CI
&lt;/h2&gt;

&lt;p&gt;Três mudanças reduzem custo rapidamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Ignore PRs de bots
&lt;/h3&gt;

&lt;p&gt;Você provavelmente não precisa de revisão de IA para atualizações automáticas do Dependabot ou Renovate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;opened&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;synchronize&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;copilot-review&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.actor != 'dependabot[bot]' &amp;amp;&amp;amp; github.actor != 'renovate[bot]'&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github/copilot-review@v1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Filtre arquivos gerados
&lt;/h3&gt;

&lt;p&gt;Não revise clientes gerados se eles forem resultado direto da especificação.&lt;/p&gt;

&lt;p&gt;Exemplo de estrutura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apis/**/*.yaml
cmd/**
internal/**
tests/**
clients/generated/**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mantenha a revisão nos arquivos que exigem decisão humana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;apis/**/*.yaml'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cmd/**'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;internal/**'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tests/**'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se os clientes gerados estiverem em &lt;code&gt;clients/generated/**&lt;/code&gt;, deixe-os fora do gatilho.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Use labels para acionar revisão
&lt;/h3&gt;

&lt;p&gt;Em vez de rodar a revisão em todo PR, execute apenas quando o PR tiver uma label específica.&lt;/p&gt;

&lt;p&gt;Exemplo de política:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;review-please
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse modelo reduz revisões desnecessárias e mantém o controle com o autor ou mantenedor do PR.&lt;/p&gt;

&lt;h2&gt;
  
  
  Governança: quatro controles obrigatórios
&lt;/h2&gt;

&lt;p&gt;Configure estes itens antes do próximo ciclo de faturamento.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Limite de gastos
&lt;/h3&gt;

&lt;p&gt;Defina no nível da organização.&lt;/p&gt;

&lt;p&gt;Regra prática:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;limite = orçamento_máximo_aceitável × 0.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Arredondar para baixo cria margem para erro.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Alertas de solicitações premium
&lt;/h3&gt;

&lt;p&gt;O GitHub envia alertas em marcos como 50%, 75% e 90% da cota. Encaminhe esses alertas para Slack, Teams ou ferramenta de incidentes.&lt;/p&gt;

&lt;p&gt;Não dependa apenas de e-mail individual.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Política de gatilho por repositório
&lt;/h3&gt;

&lt;p&gt;Decida explicitamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Revisão em todo PR?
Revisão apenas com label?
Revisão apenas em branches principais?
Revisão apenas em paths críticos?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para repositórios de API, o modelo com label costuma ser mais eficiente.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Habilitação por equipe
&lt;/h3&gt;

&lt;p&gt;Não habilite todos os recursos do Copilot Enterprise para toda a organização de uma vez.&lt;/p&gt;

&lt;p&gt;Prefira ativar por equipe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;time-api-core
time-integrations
time-platform
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso reduz risco de adoção acidental e facilita comparar uso por grupo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Onde o Apidog se encaixa
&lt;/h2&gt;

&lt;p&gt;O &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; não substitui o Copilot. Ele entra como camada para centralizar especificação, mocks e testes de contrato.&lt;/p&gt;

&lt;p&gt;Um fluxo prático para equipes de API:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Manter a especificação e exemplos de request na coleção do Apidog.&lt;/li&gt;
&lt;li&gt;Commitar a coleção junto com o repositório.&lt;/li&gt;
&lt;li&gt;Executar testes de contrato contra o mock server do Apidog.&lt;/li&gt;
&lt;li&gt;Validar contrato antes da revisão de IA.&lt;/li&gt;
&lt;li&gt;Acionar a revisão do Copilot apenas se os checks baratos passarem.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Exemplo de ordem no pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lint
openapi validation
contract tests with Apidog
unit tests
Copilot review
security scans
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ordem importa porque a revisão do Copilot é uma das etapas mais caras. Se um erro de contrato pode ser detectado em 30 segundos, não faz sentido gastar minutos de revisão de IA antes disso.&lt;/p&gt;

&lt;p&gt;O &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia de testes de API sem Postman&lt;/a&gt; cobre o fluxo de mock do Apidog. O &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia da API DeepSeek V4&lt;/a&gt; mostra o padrão aplicado a um modelo de API.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que observar no próximo ciclo de faturamento
&lt;/h2&gt;

&lt;p&gt;Acompanhe o uso por semana.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dias 1 a 7
&lt;/h3&gt;

&lt;p&gt;O uso de solicitações premium costuma parecer normal. A maioria dos usuários ainda está abaixo da cota incluída.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dias 14 a 21
&lt;/h3&gt;

&lt;p&gt;Usuários intensivos começam a exceder a cota. Se houver limite de gastos, algumas solicitações podem falhar. Sem limite, a fatura cresce.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dias 28 a 30
&lt;/h3&gt;

&lt;p&gt;Os minutos do Actions consumidos pela revisão do Copilot ficam mais visíveis. Compare a fatura com o mês anterior e separe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CI tradicional
revisões do Copilot
scans de segurança
testes de contrato
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois do primeiro mês, ajuste:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;licenças de usuários inativos;&lt;/li&gt;
&lt;li&gt;plano de usuários pesados;&lt;/li&gt;
&lt;li&gt;filtros de paths;&lt;/li&gt;
&lt;li&gt;labels de revisão;&lt;/li&gt;
&lt;li&gt;limite de gastos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Erros comuns
&lt;/h2&gt;

&lt;p&gt;Evite estes cinco problemas.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Não definir limite de gastos
&lt;/h3&gt;

&lt;p&gt;Um loop de agente pode rodar por muito tempo. Sempre configure um teto.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Habilitar revisão em todo repositório
&lt;/h3&gt;

&lt;p&gt;Nem todo repositório precisa de revisão automática. Priorize APIs críticas ou serviços com alto volume de mudanças.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Revisar código gerado
&lt;/h3&gt;

&lt;p&gt;Filtre clientes gerados, SDKs e artefatos derivados da especificação.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Revisar PRs de bots
&lt;/h3&gt;

&lt;p&gt;Ignore Dependabot, Renovate e atualizadores internos automáticos.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Não criar linha de base
&lt;/h3&gt;

&lt;p&gt;Baixe mensalmente o CSV de faturamento do GitHub. Sem baseline, você não consegue medir se uma otimização realmente reduziu custo.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O preço da licença ainda é $10 por usuário?
&lt;/h3&gt;

&lt;p&gt;Sim, para Copilot Business. O Copilot Business custa $10 por usuário/mês, o Copilot Enterprise custa $19 por usuário/mês, e o Copilot Pro para indivíduos custa $10/mês. A licença também define a cota de solicitações premium incluídas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusões inline agora são cobradas?
&lt;/h3&gt;

&lt;p&gt;Não. Chat com modelo padrão e conclusões inline continuam sem cobrança adicional para planos pagos. Solicitações premium se aplicam aos recursos mais caros e à seleção de modelos.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que acontece quando a cota premium acaba?
&lt;/h3&gt;

&lt;p&gt;Por padrão, solicitações podem falhar por erro de cota. Você pode permitir excedente a $0.04 por solicitação até o limite de gastos configurado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Os minutos do Actions para revisão são cobrados separadamente?
&lt;/h3&gt;

&lt;p&gt;Não. Eles consomem o mesmo pool de minutos do GitHub Actions usado pelo restante da CI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Posso desabilitar a revisão do Copilot?
&lt;/h3&gt;

&lt;p&gt;Sim. O administrador da organização pode controlar a revisão por política, repositório ou equipe.&lt;/p&gt;

&lt;h3&gt;
  
  
  A revisão funciona em especificações privadas de API?
&lt;/h3&gt;

&lt;p&gt;Sim. Em repositórios privados, a execução consome minutos do Actions. O revisor lê arquivos de especificação, handlers e testes como qualquer outro código-fonte.&lt;/p&gt;

&lt;h3&gt;
  
  
  A revisão do Copilot também usa solicitações premium?
&lt;/h3&gt;

&lt;p&gt;Atualmente, a revisão consome minutos do Actions. O modelo usado pelo revisor faz parte da plataforma Copilot e não é cobrado separadamente como solicitação premium. Essa é uma área que pode mudar, então acompanhe o changelog do GitHub.&lt;/p&gt;

&lt;p&gt;Para equipes que executam tanto revisão do Copilot quanto chamadas diretas a APIs de modelo em CI, o &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-free-codex?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia do Codex gratuito GPT-5.5&lt;/a&gt; cobre o lado por token, enquanto o &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; ajuda a manter mocks e contratos antes da etapa mais cara de revisão de IA.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como Usar a API Zuplo: Guia Completo</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Mon, 27 Apr 2026 08:43:19 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/como-usar-a-api-zuplo-guia-completo-31l1</link>
      <guid>https://dev.to/lucas_ferreira/como-usar-a-api-zuplo-guia-completo-31l1</guid>
      <description>&lt;p&gt;Se você leu sobre o Zuplo e quer colocar algo real em produção, este guia te mostra como fazer na prática. Aqui você vai criar um projeto, expor uma rota, adicionar autenticação por chave de API e limitação de taxa, escrever uma política TypeScript customizada, fazer deploy para a edge e testar com o Apidog — tudo em passos objetivos para implementação rápida.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;No final, você terá um gateway de API funcional na frente da sua origem, com autenticação, limitação de taxa, portal do desenvolvedor auto-gerado e CI friendly via Git. O passo a passo leva cerca de 30 minutos.&lt;/p&gt;

&lt;p&gt;Se ainda está avaliando se o Zuplo é o ideal, comece pelo nosso post complementar: &lt;a href="http://apidog.com/blog/what-is-zuplo-api-gateway?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;O que é o gateway de API Zuplo&lt;/a&gt;. Para cenários não cobertos aqui, confira a &lt;a href="https://zuplo.com/docs" rel="noopener noreferrer"&gt;documentação do Zuplo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cadastre-se em &lt;a href="https://portal.zuplo.com" rel="noopener noreferrer"&gt;portal.zuplo.com&lt;/a&gt; ou crie um projeto local com &lt;code&gt;npm create zuplo&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Defina rotas em &lt;code&gt;config/routes.oas.json&lt;/code&gt; e encaminhe para sua origem via URL Forward Handler.&lt;/li&gt;
&lt;li&gt;Adicione políticas de entrada (API key auth, rate limit, validação de schema) editando o arquivo de rota ou usando o Route Designer.&lt;/li&gt;
&lt;li&gt;Escreva lógica customizada como módulos TypeScript em &lt;code&gt;modules/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Faça push para sua branch Git para deploy de preview; merge para produção em mais de 300 edges.&lt;/li&gt;
&lt;li&gt;Teste todas as rotas com o &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; antes de promover para produção.&lt;/li&gt;
&lt;li&gt;O plano gratuito oferece 100 mil requisições/mês; o Builder custa $25/mês.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;p&gt;Você precisa de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conta Zuplo&lt;/li&gt;
&lt;li&gt;Uma API de origem (use &lt;code&gt;https://echo.zuplo.io&lt;/code&gt; se não tiver uma)&lt;/li&gt;
&lt;li&gt;Node.js 18+ para usar o CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para desenvolvimento local, use um editor de código. VS Code com TypeScript é recomendado, e pode ser integrado com a &lt;a href="http://apidog.com/blog/how-to-use-apidog-inside-vscode?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;extensão Apidog VS Code&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 1: Crie seu projeto Zuplo
&lt;/h2&gt;

&lt;p&gt;Duas formas de começar: via portal web ou CLI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opção A: Portal
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Faça login em &lt;a href="https://portal.zuplo.com" rel="noopener noreferrer"&gt;portal.zuplo.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Clique em "New Project" e escolha um nome, ex: &lt;code&gt;acme-gateway&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Selecione "Empty Project" para não gerar nada automaticamente.&lt;/li&gt;
&lt;li&gt;A aba "Code" mostra a estrutura inicial.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdr81khlfl02v9c67utmp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdr81khlfl02v9c67utmp.png" alt="Estrutura inicial do projeto no portal" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O portal já vincula a um repositório Git, que pode ser conectado ao seu GitHub, GitLab, Bitbucket ou Azure DevOps depois.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opção B: CLI
&lt;/h3&gt;

&lt;p&gt;O CLI prepara o projeto local para editar na IDE e usar Git desde o início:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm create zuplo@latest &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; acme-gateway
&lt;span class="nb"&gt;cd &lt;/span&gt;acme-gateway
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O dev server inicia na porta 9000 e o Route Designer local em &lt;code&gt;http://localhost:9100&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para vincular ao seu Zuplo e fazer deploy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx zuplo &lt;span class="nb"&gt;link&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Escolha conta/ambiente. Depois, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx zuplo deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passo 2: Defina sua primeira rota
&lt;/h2&gt;

&lt;p&gt;Abra &lt;code&gt;config/routes.oas.json&lt;/code&gt; e adicione a rota que faz proxy para sua origem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"openapi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"info"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Acme Gateway"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"paths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"/v1/products"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"get"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"List products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"operationId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"list-products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"x-zuplo-route"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"corsPolicy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"anything-goes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"handler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"urlForwardHandler"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$import(@zuplo/runtime)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${env.ORIGIN_URL}"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"policies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"inbound"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"responses"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"200"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Success"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;x-zuplo-route&lt;/code&gt; define handler e políticas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;${env.ORIGIN_URL}&lt;/code&gt; usa variável de ambiente. Defina em Settings &amp;gt; Environment Variables no portal ou em &lt;code&gt;config/.env&lt;/code&gt; local.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Salve e teste em &lt;code&gt;http://localhost:9000/v1/products&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 3: Adicione autenticação por chave de API
&lt;/h2&gt;

&lt;p&gt;Para proteger APIs públicas, use a política de API key do Zuplo.&lt;/p&gt;

&lt;p&gt;No arquivo da rota, adicione:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"policies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inbound"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"api-key-auth"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, defina a política em &lt;code&gt;config/policies.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api-key-auth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policyType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api-key-inbound"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ApiKeyInboundPolicy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$import(@zuplo/runtime)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"allowUnauthenticatedRequests"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crie um consumidor (usuário de chave):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No portal: Services &amp;gt; API Key Service.&lt;/li&gt;
&lt;li&gt;Clique em "Create Consumer".&lt;/li&gt;
&lt;li&gt;Use um identificador, ex: &lt;code&gt;acme-customer-1&lt;/code&gt;, e e-mail do responsável.&lt;/li&gt;
&lt;li&gt;Copie a chave gerada.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Teste:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; https://YOUR-PROJECT.zuplo.app/v1/products
&lt;span class="c"&gt;# Deve retornar HTTP/2 401&lt;/span&gt;

curl &lt;span class="nt"&gt;-i&lt;/span&gt; https://YOUR-PROJECT.zuplo.app/v1/products &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer SUA_API_KEY"&lt;/span&gt;
&lt;span class="c"&gt;# Deve retornar HTTP/2 200&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se preferir usar cliente real, importe a OpenAPI no &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, defina header global &lt;code&gt;Authorization: Bearer {{api_key}}&lt;/code&gt; e vincule a variável.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 4: Limite a taxa da rota
&lt;/h2&gt;

&lt;p&gt;Para evitar abusos, adicione rate limit logo após a autenticação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"policies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inbound"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"api-key-auth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate-limit-by-key"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em &lt;code&gt;config/policies.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate-limit-by-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policyType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate-limit-inbound"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RateLimitInboundPolicy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$import(@zuplo/runtime)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"rateLimitBy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sub"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"requestsAllowed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"timeWindowMinutes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;"rateLimitBy": "sub"&lt;/code&gt; limita por cliente autenticado.&lt;/li&gt;
&lt;li&gt;Troque para &lt;code&gt;"ip"&lt;/code&gt; se quiser limitar por IP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Teste com 70 requisições rápidas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;1..70&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    https://YOUR-PROJECT.zuplo.app/v1/products &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer SUA_API_KEY"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Espere 60 respostas 200 e 10 de 429.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 5: Valide payloads de requisição
&lt;/h2&gt;

&lt;p&gt;Para rotas &lt;code&gt;POST&lt;/code&gt;, use validação automática via JSON Schema na OpenAPI.&lt;/p&gt;

&lt;p&gt;Exemplo de rota:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"/v1/products"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Create product"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"operationId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"create-product"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"requestBody"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"application/json"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"priceCents"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"minLength"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"priceCents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"integer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"minimum"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"enum"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"food"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"drink"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"x-zuplo-route"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"handler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;igual&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ao&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;anterior&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;*/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"policies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"inbound"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"api-key-auth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"rate-limit-by-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"validate-request"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Política em &lt;code&gt;config/policies.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"validate-request"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policyType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"open-api-request-validation-inbound"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OpenApiRequestValidationInboundPolicy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$import(@zuplo/runtime)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"validateBody"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reject"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Teste no &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; com casos: sucesso, campo ausente, enum inválido. Execute todos em um clique.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 6: Escreva uma política TypeScript personalizada
&lt;/h2&gt;

&lt;p&gt;Quando precisar de lógica especial, crie uma política customizada.&lt;/p&gt;

&lt;p&gt;Exemplo: cabeçalho de cache variando por plano.&lt;/p&gt;

&lt;p&gt;Crie &lt;code&gt;modules/tiered-cache.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@zuplo/runtime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;PolicyOptions&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;paidPlanHeader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;paidMaxAge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PolicyOptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;free&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;free&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cache-Control&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;no-store&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cache-Control&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;`public, max-age=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;paidMaxAge&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Cache header set for plan=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Defina em &lt;code&gt;config/policies.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tiered-cache"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policyType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"custom-code-outbound"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$import(./modules/tiered-cache)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"paidPlanHeader"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"x-plan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"paidMaxAge"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Referencie na rota:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"policies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inbound"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"api-key-auth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate-limit-by-key"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"outbound"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"tiered-cache"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Testes unitários podem ser feitos com Vitest/Jest simulando requests e responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 7: Faça o deploy para a edge
&lt;/h2&gt;

&lt;p&gt;Deploy = push Git. Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add products gateway with auth, rate limit, and tiered cache"&lt;/span&gt;
git push origin feature/products-gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zuplo cria ambiente de preview para cada branch, com subdomínio separado.&lt;/p&gt;

&lt;p&gt;Teste a URL de preview no &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;. Se tudo ok, faça merge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout main
git merge feature/products-gateway
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em menos de um minuto, a produção é atualizada em mais de 300 edges. Rollback é só revert/push.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 8: Gere o portal do desenvolvedor
&lt;/h2&gt;

&lt;p&gt;Portal automático em &lt;code&gt;https://YOUR-PROJECT.developers.zuplo.com&lt;/code&gt;, reconstruído a cada deploy. Inclui:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Página por rota, esquema, descrição, console de testes.&lt;/li&gt;
&lt;li&gt;Exemplos de código para várias linguagens.&lt;/li&gt;
&lt;li&gt;Emissão de chave de API self-service.&lt;/li&gt;
&lt;li&gt;Branding customizável em Developer Portal &amp;gt; Settings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se sua OpenAPI tem descrições e exemplos, o portal já fica apresentável. Para customizar, clone o código Next.js do &lt;a href="https://github.com/zuplo/zudoku" rel="noopener noreferrer"&gt;repositório do portal Zuplo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 9: Teste tudo com o Apidog
&lt;/h2&gt;

&lt;p&gt;Garanta qualidade testando todas as rotas, políticas e erros com o &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogdwuct2qhdh0f7n983r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogdwuct2qhdh0f7n983r.png" alt="Testando APIs com Apidog" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Workflow recomendado:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Importe a OpenAPI do gateway de &lt;code&gt;https://YOUR-PROJECT.zuplo.app/openapi&lt;/code&gt; no Apidog.&lt;/li&gt;
&lt;li&gt;Crie ambientes para &lt;code&gt;local&lt;/code&gt;, &lt;code&gt;preview&lt;/code&gt; e &lt;code&gt;production&lt;/code&gt;, cada um com seu &lt;code&gt;base_url&lt;/code&gt; e &lt;code&gt;api_key&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Salve pelo menos três requisições por rota: sucesso, falha de auth, limite de taxa. Rode tudo antes de cada deploy.&lt;/li&gt;
&lt;li&gt;Use cenários automatizados do Apidog para encadear chamadas e validar respostas.&lt;/li&gt;
&lt;li&gt;Gere exemplos de código e adicione aos runbooks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Migrando do Postman? Siga o &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia de migração&lt;/a&gt;. &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Baixe o Apidog&lt;/a&gt; se ainda não tiver.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perguntas comuns sobre o uso do Zuplo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Como alternar uma rota entre ambientes sem alterar a especificação?
&lt;/h3&gt;

&lt;p&gt;Use variáveis de ambiente. Defina &lt;code&gt;ORIGIN_URL&lt;/code&gt; por ambiente (portal ou &lt;code&gt;config/.env&lt;/code&gt;), e referencie como &lt;code&gt;${env.ORIGIN_URL}&lt;/code&gt; nas opções do handler.&lt;/p&gt;

&lt;h3&gt;
  
  
  Posso rodar o Zuplo offline?
&lt;/h3&gt;

&lt;p&gt;Sim. &lt;code&gt;npm run dev&lt;/code&gt; sobe gateway local na porta 9000 e Route Designer na 9100. Políticas, validação e rate limit funcionam localmente. Apenas o serviço de chave de API é online, mas pode ser usado com &lt;code&gt;npx zuplo link&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como faço rollback de um deploy ruim?
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;git revert&lt;/code&gt; do commit de merge e push. O Zuplo faz deploy do estado anterior. Não existe botão de "rollback" porque o Git é a fonte da verdade.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que acontece com requisições em andamento durante o deploy?
&lt;/h3&gt;

&lt;p&gt;Deploys são atômicos na edge: requisições em andamento terminam na versão antiga, novas já usam a nova versão. Sem downtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  Posso usar o Zuplo com gRPC ou WebSockets?
&lt;/h3&gt;

&lt;p&gt;Sim. O &lt;code&gt;urlForwardHandler&lt;/code&gt; faz proxy de upgrades WebSocket, e existe handler específico para gRPC. REST e GraphQL têm suporte nativo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como expor minha API Zuplo para agentes de IA?
&lt;/h3&gt;

&lt;p&gt;Adicione o MCP Server Handler na rota, referencie sua OpenAPI e selecione operações a expor. Políticas de autenticação e rate limit também se aplicam. Veja a &lt;a href="https://zuplo.com/docs/mcp-server/introduction" rel="noopener noreferrer"&gt;documentação do Zuplo MCP Server&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quanto custa o gateway em produção?
&lt;/h3&gt;

&lt;p&gt;Plano gratuito cobre 100k requisições/mês. Builder: $25/mês para 1 milhão/mês, adicionais por $100/100k. Enterprise começa em $1.000/mês. Veja &lt;a href="https://zuplo.com/pricing" rel="noopener noreferrer"&gt;preços completos&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Agora você tem um gateway Zuplo funcional com autenticação por chave de API, limitação de taxa, validação de requisição, política TypeScript customizada e portal do desenvolvedor — tudo versionado e implantado via Git, pronto para CI/CD e ambientes de preview e produção.&lt;/p&gt;

&lt;p&gt;O que mantém seu gateway robusto é o ciclo de testes. Use o &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; em cada preview antes do merge e capture problemas de autenticação, schema ou rate limit antes de irem para produção. &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Baixe o Apidog&lt;/a&gt; e conecte ao seu gateway agora.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>O Que É o Zuplo API Gateway?</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Mon, 27 Apr 2026 06:29:21 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/o-que-e-o-zuplo-api-gateway-50ef</link>
      <guid>https://dev.to/lucas_ferreira/o-que-e-o-zuplo-api-gateway-50ef</guid>
      <description>&lt;p&gt;A maioria dos gateways de API ainda parece ter sido projetada para uma equipe de operações de 2014. Você escreve YAML, luta com um painel de controle e espera que alguém com acesso ao cluster envie suas alterações. O Zuplo inverte esse modelo. É um gateway de API programável, nativo da borda, onde suas rotas vivem em um repositório Git, suas políticas são TypeScript, e cada commit é implantado em mais de 300 locais globais em segundos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Este guia explica o que o gateway de API Zuplo faz, como ele difere do Kong e AWS API Gateway, quais são seus custos e como lançar seu primeiro gateway em menos de trinta minutos. Você verá exemplos de código para roteamento, autenticação e limitação de taxa, além de uma seção sobre como testar cada endpoint com &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; antes que ele chegue à produção.&lt;/p&gt;

&lt;p&gt;O Zuplo se encaixa em uma categoria que costumava ser dominada por Kong, Apigee e AWS API Gateway. A proposta é simples: desenvolvedores obtêm uma linguagem de programação real, operações obtêm um serviço gerenciado e o produto obtém uma camada de monetização integrada. As compensações e o fluxo de trabalho real são o que esta postagem detalha.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Zuplo é um gateway de API totalmente gerenciado e nativo da borda que executa suas rotas em mais de 300 data centers da Cloudflare com latência inferior a 50ms e zero inicializações a frio.&lt;/li&gt;
&lt;li&gt;A configuração é nativa de GitOps; seu gateway reside em um repositório Git e é entregue via CI/CD, não por uma UI.&lt;/li&gt;
&lt;li&gt;As políticas são escritas em TypeScript com suporte total a IDEs, não em YAML ou Lua.&lt;/li&gt;
&lt;li&gt;O nível gratuito cobre 100 mil requisições por mês com ambientes ilimitados, chaves de API e portais de desenvolvedor.&lt;/li&gt;
&lt;li&gt;Recursos integrados incluem autenticação por chave de API, JWT, OAuth2, limitação de taxa, validação de requisições, um portal de desenvolvedor gerado automaticamente e monetização impulsionada pelo Stripe.&lt;/li&gt;
&lt;li&gt;O Zuplo agora oferece um MCP Server Handler, para que qualquer rota do gateway possa ser exposta ao Claude, Codex, Cursor ou qualquer cliente MCP.&lt;/li&gt;
&lt;li&gt;Teste cada rota do Zuplo de ponta a ponta com &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; antes de ativar a produção.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O que é o Zuplo?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zuplo.com/docs/api-management/introduction" rel="noopener noreferrer"&gt;Zuplo é uma plataforma de gerenciamento de API&lt;/a&gt; centrada em: código em vez de configuração, borda em vez de região e Git em vez de GUI. Ele roda como um serviço gerenciado na rede de borda da Cloudflare, então uma única implantação chega a mais de 300 data centers sem configuração manual.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F06t6wd5qu6bick3ihqgi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F06t6wd5qu6bick3ihqgi.png" alt="Um diagrama conceitual mostrando como o Zuplo roteia requisições para diferentes serviços de API com base na rede de borda." width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Diferente dos gateways tradicionais que usam YAML armazenado em um painel, o Zuplo trata o gateway como um projeto TypeScript. Você tem um &lt;code&gt;routes.oas.json&lt;/code&gt; para endpoints, módulos TypeScript para lógica personalizada e um arquivo de configuração de políticas. Basta enviar para o GitHub e a plataforma constrói, valida e implanta.&lt;/p&gt;

&lt;p&gt;A plataforma suporta REST, GraphQL, gRPC, WebSockets e SOAP. É compatível com SOC 2 Tipo II, funciona em backends AWS, Azure e GCP, e oferece opção Kubernetes auto-hospedada. O preço começa gratuito e escala por volume de requisições. Veja o detalhamento na &lt;a href="https://zuplo.com/pricing" rel="noopener noreferrer"&gt;página de preços do Zuplo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fchc3a093df7p7muegdtm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fchc3a093df7p7muegdtm.png" alt="Exemplo de interface Zuplo" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que desenvolvedores escolhem o Zuplo em vez de Kong, Apigee e AWS API Gateway
&lt;/h2&gt;

&lt;p&gt;Cada gateway tem seu perfil. &lt;a href="http://apidog.com/blog/apigee-vs-kong/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Kong&lt;/a&gt; oferece controle máximo e exige experiência em Lua. &lt;a href="http://apidog.com/blog/apigee-vs-kong/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apigee&lt;/a&gt; é corporativo, mas complexo. O AWS API Gateway é padrão se você está na AWS, mas carece de portal do dev e as integrações Lambda têm inicializações a frio.&lt;/p&gt;

&lt;p&gt;O Zuplo foca em equipes pequenas que querem recursos empresariais sem a necessidade de um time de plataforma dedicado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Destaques práticos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Código, não YAML:&lt;/strong&gt; Políticas como limitação de taxa são três linhas de TypeScript. No Kong, são quinze linhas de YAML. Se você programa em TypeScript ou JavaScript, o Zuplo é direto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portal do desenvolvedor incluído:&lt;/strong&gt; Portal gerado direto da OpenAPI, mesmo no plano gratuito.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitOps por padrão:&lt;/strong&gt; Cada mudança é um pull request. Você tem histórico, auditoria e rollback via &lt;code&gt;git revert&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nativo da borda, sem inicializações a frio:&lt;/strong&gt; Zuplo roda em Cloudflare Workers. Cada requisição atinge o datacenter mais próximo e começa em milissegundos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se sua equipe já usa Kong ou Apigee e está satisfeita, migrar não faz sentido. Se está começando ou sofrendo com o gateway atual, o Zuplo é muito mais simples de operar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos principais do gateway de API Zuplo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Programabilidade com prioridade a TypeScript
&lt;/h3&gt;

&lt;p&gt;O Zuplo define o comportamento do gateway em arquivos TypeScript, lado a lado com as rotas. Políticas personalizadas são funções que recebem a requisição, modificam/validam e retornam o resultado. Você ganha tipos, autocompletar, refatoração e testes.&lt;/p&gt;

&lt;p&gt;Exemplo de política de saída que remove um cabeçalho interno:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@zuplo/runtime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-internal-trace-id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Coloque em &lt;code&gt;modules/strip-internal-header.ts&lt;/code&gt;, referencie na rota, envie para o Git, e está implantado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mais de 60 políticas pré-construídas
&lt;/h3&gt;

&lt;p&gt;O Zuplo inclui mais de 60 políticas prontas: autenticação por chave de API, JWT, OAuth2, limitação de taxa (fixed window, sliding window, token bucket), validação OpenAPI, CORS, listas de IP, transformação de requests e integrações. Basta editar a definição da rota (JSON); não precisa de código para casos comuns.&lt;/p&gt;

&lt;h3&gt;
  
  
  Portal do desenvolvedor gerado automaticamente
&lt;/h3&gt;

&lt;p&gt;Aponte para sua OpenAPI e obtenha documentação hospedada, consoles interativos, exemplos em cURL/JS/Python/Go, e emissão de chaves de API self-service. Usuários registram, geram chaves e já podem chamar a API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monetização de API integrada
&lt;/h3&gt;

&lt;p&gt;Integração com Stripe para vender acesso à API. Defina planos, conecte o Stripe, e o portal faz checkout, assinatura e cobrança. Isso elimina semanas de desenvolvimento se você quer monetizar.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP Server Handler para agentes de IA
&lt;/h3&gt;

&lt;p&gt;O MCP Server Handler transforma sua API em um endpoint MCP. Basta apontar para sua OpenAPI e escolher as operações. APIs ficam acessíveis para Claude Code, OpenAI Codex, Cursor e clientes MCP. &lt;a href="https://zuplo.com/docs/mcp-server/introduction" rel="noopener noreferrer"&gt;Veja o tutorial do Zuplo&lt;/a&gt; para detalhes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implantação na borda, latência inferior a 50ms
&lt;/h3&gt;

&lt;p&gt;Cada gateway é implantado em 300+ locais Cloudflare. Latência real abaixo de 50ms, sem cold start. O usuário sempre atinge o ponto mais próximo do planeta, sem configuração manual.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como o Zuplo funciona por baixo dos panos
&lt;/h2&gt;

&lt;p&gt;O pipeline de uma requisição:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Correspondência de rota:&lt;/strong&gt; URL/método são casados com o &lt;code&gt;routes.oas.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Políticas de entrada:&lt;/strong&gt; Autenticação, validação, limites de taxa, etc., são executados em ordem. Falha? Resposta é enviada e o pipeline termina.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handler:&lt;/strong&gt; Proxy para origem, retorno estático, código TypeScript ou MCP Handler.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Políticas de saída:&lt;/strong&gt; Transformações finais e remoção de cabeçalhos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resposta:&lt;/strong&gt; Enviada ao cliente; logs e métricas vão para observabilidade (Zuplo ou integrações externas).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tudo roda em Cloudflare Workers — por isso a latência é baixa e você não paga por capacidade ociosa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando seu primeiro gateway Zuplo
&lt;/h2&gt;

&lt;p&gt;Monte um gateway funcional em ~30 minutos. Fluxo prático:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cadastre-se em &lt;a href="https://zuplo.com" rel="noopener noreferrer"&gt;zuplo.com&lt;/a&gt;:&lt;/strong&gt; Crie projeto e integre ao GitHub.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Importe uma especificação OpenAPI:&lt;/strong&gt; Se já tiver, importe. Cada operação vira uma rota. Se não, esboce na UI e exporte depois.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adicione autenticação por chave de API:&lt;/strong&gt; No editor de rotas, inclua a política &lt;code&gt;api-key-inbound&lt;/code&gt;. O Zuplo monta banco de consumidores e UI de chaves automaticamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configure limite de taxa:&lt;/strong&gt; Insira &lt;code&gt;rate-limit-inbound&lt;/code&gt; com orçamento (ex: 100 req/min/chave). Isso é um bloco JSON.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implante:&lt;/strong&gt; Faça push para a branch. O Zuplo gera ambiente de preview com URL única. Faça merge para produção.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teste o gateway:&lt;/strong&gt; Use &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para testar endpoints, chaves válidas/invalidas, limites e payloads. O inspetor visual facilita a validação das políticas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O setup inicial leva minutos. O maior trabalho é nomear rotas e decidir onde aplicar lógica customizada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escrevendo políticas personalizadas em TypeScript
&lt;/h2&gt;

&lt;p&gt;Para necessidades específicas, escreva políticas customizadas. Exemplo: enriquecer a requisição com dados de um serviço interno.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@zuplo/runtime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;UserContext&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;free&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pro&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;enterprise&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ZuploRequest&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Unauthorized&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;401&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lookupUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://internal.example.com/users/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lookupUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;INTERNAL_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;userResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User lookup failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;502&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;userResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;UserContext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-user-id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-user-plan&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Dicas práticas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A política é uma função assíncrona testável via unit test.&lt;/li&gt;
&lt;li&gt;Variáveis de ambiente vêm de &lt;code&gt;context.environment&lt;/code&gt; (tipado, seguro).&lt;/li&gt;
&lt;li&gt;Retornar uma &lt;code&gt;Response&lt;/code&gt; encerra o pipeline (bom para autenticação ou erros upstream).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preços do Zuplo em 2026
&lt;/h2&gt;

&lt;p&gt;Três planos objetivos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Grátis (US$0/mês):&lt;/strong&gt; 100 mil requisições/mês, ambientes e chaves ilimitadas, 1GB de egresso, 2 devs, todos os 300+ pontos de borda. Tráfego real.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builder (US$25/mês):&lt;/strong&gt; Até 1 milhão de requisições, domínios personalizados, egresso ampliado, requisições extras a US$100/100mil.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise (personalizado, a partir de US$1.000/mês):&lt;/strong&gt; Requisições/domínios ilimitados, SLA de 99,5% a 99,999%, integrações corporativas, suporte 24/7, SSO, RBAC.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Produtos AI Gateway e Developer Portal têm níveis separados e opção de portal auto-hospedado open source a US$0. Veja detalhes atualizados na &lt;a href="https://zuplo.com/pricing" rel="noopener noreferrer"&gt;página de preços do Zuplo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Comparando: AWS API Gateway cobra US$3,50/milhão de requisições REST, mais transferência de dados e custos Lambda. Kong Enterprise geralmente é mais caro que o piso do Zuplo. O plano gratuito do Zuplo já é competitivo para projetos novos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando o Zuplo é a escolha certa (e quando não é)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use Zuplo se:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quer um gateway gerenciado (sem manter Kong/K8s).&lt;/li&gt;
&lt;li&gt;Sua equipe domina TypeScript/JavaScript.&lt;/li&gt;
&lt;li&gt;Precisa de portal de desenvolvedores integrado.&lt;/li&gt;
&lt;li&gt;Vai monetizar a API com Stripe.&lt;/li&gt;
&lt;li&gt;Quer expor API para agentes de IA com MCP sem código extra.&lt;/li&gt;
&lt;li&gt;Tem tráfego global e precisa de latência mínima.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Evite Zuplo se:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Precisa de controle total open source (Kong é melhor).&lt;/li&gt;
&lt;li&gt;Stack 100% on-premise sem saída internet (Kong/Tyk auto-hospedados).&lt;/li&gt;
&lt;li&gt;Precisa mexer nos internos do NGINX.&lt;/li&gt;
&lt;li&gt;Já investiu pesado em Apigee/MuleSoft (alto custo de migração).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testando seu gateway Zuplo com o Apidog
&lt;/h2&gt;

&lt;p&gt;Com o ambiente de preview ativo, teste todas as rotas, políticas e casos de borda antes de promover para produção. Um cliente dedicado é essencial.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; importa sua OpenAPI direto, então a mesma especificação usada nas rotas alimenta sua suíte de testes. Com Apidog, você pode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chamar rotas com chaves válidas/invalidas para checar autenticação.&lt;/li&gt;
&lt;li&gt;Enviar payloads malformados para conferir rejeição correta.&lt;/li&gt;
&lt;li&gt;Simular excesso de chamadas para validar limites de taxa.&lt;/li&gt;
&lt;li&gt;Salvar variáveis de ambiente (preview, produção, chaves) e alternar rapidamente.&lt;/li&gt;
&lt;li&gt;Gerar exemplos de código (cURL, JS, Python, Go) para sua equipe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Execute cenários automatizados no Apidog — mais rápido que scripts únicos. Se for a primeira vez, veja a &lt;a href="http://apidog.com/blog/how-to-use-apidog-inside-vscode?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;extensão VS Code do Apidog&lt;/a&gt; e o &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia de migração sem Postman&lt;/a&gt;. &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Baixe o Apidog&lt;/a&gt; e teste agora.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perguntas frequentes sobre o gateway de API Zuplo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O Zuplo é de código aberto?
&lt;/h3&gt;

&lt;p&gt;O runtime do gateway é fechado, mas o portal do desenvolvedor e várias libs de suporte são open source no GitHub. Precisa auto-hospedar? O portal open source + Zuplo em Kubernetes cobre boa parte dos casos.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Zuplo pode rodar na minha própria infraestrutura?
&lt;/h3&gt;

&lt;p&gt;Sim, no plano Enterprise há opção Kubernetes auto-hospedado. Você perde a borda global e assume operações do cluster. Para requisitos rígidos de residência, é o caminho.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como o Zuplo se compara ao Cloudflare API Shield?
&lt;/h3&gt;

&lt;p&gt;API Shield é segurança (validação, abuso, mTLS). Zuplo é gestão de API completa: roteamento, políticas, portal, monetização, MCP. Podem coexistir. Se só precisa de segurança, API Shield basta. Para ciclo completo, use Zuplo.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Zuplo funciona com minha especificação OpenAPI existente?
&lt;/h3&gt;

&lt;p&gt;Sim. A OpenAPI é a fonte central no Zuplo. Importe, as rotas aparecem, o portal é gerado, e as políticas usam os mesmos esquemas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Posso expor meu gateway Zuplo a agentes de IA como Claude ou Codex?
&lt;/h3&gt;

&lt;p&gt;Sim, via MCP Server Handler. Basta apontar para sua OpenAPI, escolher operações, e o gateway fica disponível para clientes MCP. Políticas de autenticação/limite valem para humanos e agentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quanto tempo leva uma implantação do Zuplo?
&lt;/h3&gt;

&lt;p&gt;Push-to-deploy leva menos de 60 segundos para preview. Promoção para produção é ainda mais rápida (artefato já construído). Não há janela de manutenção.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que acontece se a Cloudflare cair?
&lt;/h3&gt;

&lt;p&gt;Como roda na borda da Cloudflare, quedas regionais afetam aquela região. O plano Enterprise oferece failover multi-nuvem. A maioria aceita a dependência pelo histórico de confiabilidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O Zuplo entrega recursos empresariais sem peso operacional: políticas TypeScript, GitOps, portal de desenvolvedor automático, monetização integrada e suporte MCP para IA. O plano gratuito cobre uso real; o Enterprise cuida do resto.&lt;/p&gt;

&lt;p&gt;Avalie: faça o setup de 30 minutos com uma API real, teste cada política no &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; e decida com base em evidências técnicas. A combinação de gateway gerenciado e cliente de testes robusto é o caminho mais rápido de "temos uma API" para "temos um produto". &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Baixe o Apidog&lt;/a&gt; e comece a testar.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como Usar DeepSeek V4 Grátis: Guia Completo</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:48:54 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/como-usar-deepseek-v4-gratis-guia-completo-4m80</link>
      <guid>https://dev.to/lucas_ferreira/como-usar-deepseek-v4-gratis-guia-completo-4m80</guid>
      <description>&lt;p&gt;DeepSeek V4 foi lançado em 23 de abril de 2026 e, ao contrário da maioria dos lançamentos de ponta, os caminhos gratuitos são reais. O chat web oficial executa o V4-Pro sem necessidade de cartão de crédito. Os pesos são licenciados pelo MIT e estão disponíveis para download hoje. Agregadores como OpenRouter e Chutes geralmente expõem camadas gratuitas poucos dias após um lançamento do DeepSeek. Somando tudo, você pode executar cargas de trabalho sérias do V4 a custo zero antes mesmo de decidir se deseja recarregar uma conta.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Este guia detalha todos os caminhos sem custo que podemos verificar, qual se adapta a cada caso de uso e como configurar uma coleção pronta para produção no &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para que a transição para a cobrança paga seja suave quando o uso aumentar.&lt;/p&gt;

&lt;p&gt;Para uma visão geral do produto, consulte &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;o que é DeepSeek V4&lt;/a&gt;. Para o guia completo da API, confira &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como usar a API do DeepSeek V4&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt;&lt;/strong&gt; — chat web gratuito no V4-Pro com alternadores Think High e Think Max. Sem cartão. Funciona hoje.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pesos do Hugging Face + sua própria GPU&lt;/strong&gt; — Licença MIT, V4-Flash roda em 2 a 4 H100s, V4-Pro precisa de um cluster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camadas gratuitas do OpenRouter e Chutes&lt;/strong&gt; — gateways de terceiros que geralmente abrem cota gratuita em modelos DeepSeek dentro de uma semana após o lançamento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provedores de Inferência Hugging Face&lt;/strong&gt; — um endpoint compartilhado e com limite de taxa que expõe o V4 para experimentação inicial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Créditos de teste do Kaggle, Colab e RunPod&lt;/strong&gt; — computação gratuita para execuções únicas quando você quiser testar a auto-hospedagem.&lt;/li&gt;
&lt;li&gt;Todo caminho gratuito limita o uso. Para cargas de trabalho de produção, passe para a cobrança paga antes que o limite seja atingido.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1pwj8dblm7dbxk7xooey.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1pwj8dblm7dbxk7xooey.png" alt="DeepSeek V4 Caminhos Gratuitos" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Caminho 1: chat.deepseek.com (o caminho gratuito padrão)
&lt;/h2&gt;

&lt;p&gt;O caminho gratuito mais rápido e confiável é a interface de chat oficial. O V4-Pro é o modelo padrão; o botão na parte superior do compositor alterna entre os modos de raciocínio Non-Think, Think High e Think Max.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fod1zc2ye1qsto7o0xxbc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fod1zc2ye1qsto7o0xxbc.png" alt="Interface chat.deepseek.com" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuração
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Abra &lt;a href="https://chat.deepseek.com/" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Faça login com e-mail, Google ou WeChat.&lt;/li&gt;
&lt;li&gt;Confirme que o modelo ativo é V4-Pro.&lt;/li&gt;
&lt;li&gt;Comece a digitar.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  O que você obtém
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Janela de contexto completa de 1M tokens.&lt;/li&gt;
&lt;li&gt;Upload de arquivos para PDFs, imagens e pacotes de código.&lt;/li&gt;
&lt;li&gt;Pesquisa web sob demanda.&lt;/li&gt;
&lt;li&gt;Todos os três modos de raciocínio, incluindo Think Max.&lt;/li&gt;
&lt;li&gt;Histórico de conversas e pastas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Como são os limites
&lt;/h3&gt;

&lt;p&gt;O DeepSeek não publica um limite rígido de mensagens por dia; o nível gratuito é suavizado sob carga. O uso intenso pode atrasar respostas ou enfileirar solicitações, mas raramente bloqueia totalmente. Caso veja limites de taxa persistentes, diminua a cadência ou mude para a API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bons usos:&lt;/strong&gt; comparar V4 com Claude em prompts difíceis, revisão arquitetônica colando um tarball, rodar Think Max em um contrato complexo.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Maus usos:&lt;/strong&gt; automação, tarefas que precisam ser reproduzidas.&lt;/p&gt;
&lt;h2&gt;
  
  
  Caminho 2: Auto-hospede o V4-Flash na sua própria GPU
&lt;/h2&gt;

&lt;p&gt;O V4-Flash é a variante licenciada pelo MIT que você pode auto-hospedar. Com 284B no total e 13B ativos, uma multi-H100 roda em FP8; quantização INT4 permite executar em uma única placa de 80GB.&lt;/p&gt;

&lt;p&gt;O custo aqui é hardware, não licença. Se já possui GPU, é o caminho gratuito mais durável.&lt;/p&gt;
&lt;h3&gt;
  
  
  Baixe os pesos
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-U&lt;/span&gt; &lt;span class="s2"&gt;"huggingface_hub[cli]"&lt;/span&gt;
huggingface-cli login
huggingface-cli download deepseek-ai/DeepSeek-V4-Flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--local-dir&lt;/span&gt; ./models/deepseek-v4-flash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Aproximadamente 500GB em FP8 – reserve espaço em disco.&lt;/p&gt;
&lt;h3&gt;
  
  
  Sirva com vLLM
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"vllm&amp;gt;=0.9.0"&lt;/span&gt;

vllm serve deepseek-ai/DeepSeek-V4-Flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tensor-parallel-size&lt;/span&gt; 4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-model-len&lt;/span&gt; 1048576 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dtype&lt;/span&gt; auto &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Com o serviço ativo, aponte qualquer cliente compatível com OpenAI para &lt;code&gt;http://localhost:8000/v1&lt;/code&gt;. O endpoint aceita o mesmo formato da API paga do DeepSeek; o &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; trata como outra URL base, e todas suas coleções salvas funcionam sem alterações.&lt;/p&gt;
&lt;h3&gt;
  
  
  Verificação da realidade do hardware
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variante&lt;/th&gt;
&lt;th&gt;Placas mínimas (FP8)&lt;/th&gt;
&lt;th&gt;Placas mínimas (INT4)&lt;/th&gt;
&lt;th&gt;Taxa de transferência realista&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V4-Flash&lt;/td&gt;
&lt;td&gt;2 × H100 80GB&lt;/td&gt;
&lt;td&gt;1 × H100 80GB&lt;/td&gt;
&lt;td&gt;50 a 150 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4-Pro&lt;/td&gt;
&lt;td&gt;16 × H100 80GB&lt;/td&gt;
&lt;td&gt;8 × H100 80GB&lt;/td&gt;
&lt;td&gt;dependente do cluster&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Se não tem placas ociosas, geralmente vale mais a pena usar a API do que alugar GPUs. Auto-hospedagem serve melhor equipes com hardware próprio ou requisitos regulatórios.&lt;/p&gt;
&lt;h2&gt;
  
  
  Caminho 3: Nível gratuito do OpenRouter
&lt;/h2&gt;

&lt;p&gt;OpenRouter é um gateway que agrega modelos abertos e fechados via uma única API. Normalmente libera nível gratuito em lançamentos DeepSeek; padrão válido desde V3.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbir19t7193o5qk1c978b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbir19t7193o5qk1c978b.png" alt="OpenRouter Free Tier" width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Configuração
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Cadastre-se em &lt;a href="https://openrouter.ai/" rel="noopener noreferrer"&gt;openrouter.ai&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Gere uma chave de API.&lt;/li&gt;
&lt;li&gt;No catálogo de modelos, busque &lt;code&gt;deepseek/deepseek-v4-pro&lt;/code&gt; ou &lt;code&gt;deepseek/deepseek-v4-flash&lt;/code&gt;. Variantes gratuitas costumam vir com &lt;code&gt;:free&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Consuma via SDK compatível com OpenAI.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OPENROUTER_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://openrouter.ai/api/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek/deepseek-v4-flash:free&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Escreva uma CLI Python para aumento de versão semver.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Limites
&lt;/h3&gt;

&lt;p&gt;Em geral, algumas centenas de solicitações por dia por chave, com prioridade reduzida sob carga. Ótimo para prototipar, não para produção.&lt;/p&gt;
&lt;h2&gt;
  
  
  Caminho 4: Provedores de Inferência Hugging Face
&lt;/h2&gt;

&lt;p&gt;Hugging Face oferece inferência hospedada dos checkpoints V4 logo após o lançamento. Limites de taxa são rigorosos e latência pode variar, mas é gratuito.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;huggingface_hub&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;InferenceClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;InferenceClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-ai/DeepSeek-V4-Flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat_completion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Resuma o relatório técnico do V4 em 5 pontos.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O token HF é gratuito. Para cargas mais intensas, contas Pro oferecem limites mais flexíveis, ainda muito abaixo do custo da API oficial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caminho 5: Créditos de teste no Colab, Kaggle, RunPod e Lambda
&lt;/h2&gt;

&lt;p&gt;Provedores de GPU oferecem créditos de teste que permitem experimentos pontuais com V4-Flash sem custo real.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Colab.&lt;/strong&gt; Nível gratuito T4 é pequeno para V4. Colab Pro+ oferece 500 unidades/mês, suficiente para alguns testes com V4-Flash em A100.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kaggle.&lt;/strong&gt; Oferece horas semanais gratuitas em T4 e P100; suficiente apenas para experimentos pequenos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RunPod.&lt;/strong&gt; US$ 10 de crédito cobre algumas horas em H100 – suficiente para rodar benchmarks e desligar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lambda.&lt;/strong&gt; Ofertas promocionais de horas grátis em H100/H200 – confira sempre a página de cadastro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;São caminhos para experimentos curtos, não uso contínuo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Crie uma coleção Apidog agnóstica de provedor
&lt;/h2&gt;

&lt;p&gt;A vantagem dos caminhos gratuitos é testar o mesmo prompt em todos, sem retrabalho. Siga este fluxo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Baixe o Apidog.&lt;/li&gt;
&lt;li&gt;Crie uma coleção com quatro ambientes: &lt;code&gt;chat&lt;/code&gt; (placeholder), &lt;code&gt;deepseek&lt;/code&gt; (&lt;code&gt;https://api.deepseek.com/v1&lt;/code&gt;), &lt;code&gt;openrouter&lt;/code&gt; (&lt;code&gt;https://openrouter.ai/api/v1&lt;/code&gt;), &lt;code&gt;self-hosted&lt;/code&gt; (&lt;code&gt;http://localhost:8000/v1&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Salve uma requisição POST para &lt;code&gt;{{BASE_URL}}/chat/completions&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Guarde a chave de cada provedor como variável secreta; o corpo da requisição fica idêntico em todos os ambientes.&lt;/li&gt;
&lt;li&gt;Alterne entre ambientes para testar o mesmo prompt em cada backend.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esse padrão é o mesmo da &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;coleção gratuita do GPT-5.5&lt;/a&gt;: uma ferramenta, vários provedores, sem duplicação de trabalho.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qual caminho gratuito escolher?
&lt;/h2&gt;

&lt;p&gt;Siga estas heurísticas para decidir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quero formar uma opinião em cinco minutos:&lt;/strong&gt; use &lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quero prototipar um produto:&lt;/strong&gt; use o nível gratuito do OpenRouter até atingir o limite, então recarregue no DeepSeek.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tenho GPUs e histórico de conformidade:&lt;/strong&gt; auto-hospede o V4-Flash no vLLM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preciso de uso gratuito a longo prazo:&lt;/strong&gt; não existe. Combine &lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt; para uso interativo com recarga paga para automação.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quando sair do nível gratuito
&lt;/h2&gt;

&lt;p&gt;Troque para o pago quando:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Limite de taxa diário recorrente:&lt;/strong&gt; sua carga já justifica orçamento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Precisa de SLA:&lt;/strong&gt; só disponível na API oficial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exige logging, auditoria ou compliance:&lt;/strong&gt; só a API paga garante registros claros.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Quando chegar nesses pontos, migre para a &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API oficial&lt;/a&gt;. Mínimo de recarga: US$ 2, preço por token mais baixo da categoria.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;O &lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt; é realmente gratuito?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim. Sem cartão, sem tempo de teste. O serviço é suavizado, mas sem paywall.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Preciso de conta Hugging Face para baixar pesos?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tecnicamente não, mas na prática sim — logado, você tem limites de taxa melhores.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Qual caminho gratuito roda o V4-Pro real?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt; executa o V4-Pro completo. OpenRouter costuma liberar V4-Flash. Precisa do V4-Pro sem pagar? Use o chat web.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Posso colocar um nível gratuito por trás de um produto?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não de forma responsável. Limites de taxa mudam e podem sumir. Para entregar V4 a clientes, use API paga ou auto-hospede.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auto-hospedagem é realmente gratuita?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Licença sim, hardware não. Se já possui GPU, custo marginal é eletricidade. Alugando, normalmente sai mais caro que API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Haverá nível gratuito Apidog para testes?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
O &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; é gratuito para design e teste de API; só cobra créditos ao acessar APIs pagas. Então, sim: você pode ter workspace Apidog gratuito combinando com &lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt; ou OpenRouter para fluxo 100% gratuito.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Como Executar o DeepSeek V4 Localmente?</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:35:43 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/como-executar-o-deepseek-v4-localmente-4mcp</link>
      <guid>https://dev.to/lucas_ferreira/como-executar-o-deepseek-v4-localmente-4mcp</guid>
      <description>&lt;p&gt;O DeepSeek V4 foi lançado em 23 de abril de 2026 com pesos licenciados pelo MIT no Hugging Face. Essa escolha de licença facilita para equipes que querem IA de ponta rodando em hardware próprio. O V4-Flash (284B total, 13B ativo) roda em dois H100s em FP8; o V4-Pro (1.6T total, 49B ativo) exige um cluster, mas compete com GPT-5.5 e Claude Opus 4.6 em tarefas de código e raciocínio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Este guia é um passo a passo para implantação local: requisitos de hardware, quantização, configurações de vLLM e SGLang, uso de ferramentas, e como validar seu servidor local usando o Apidog antes de redirecionar tráfego de produção.&lt;/p&gt;

&lt;p&gt;Para uma visão geral do produto, veja &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;o que é DeepSeek V4&lt;/a&gt;. Para integração via API hospedada, confira &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como usar a API DeepSeek V4&lt;/a&gt;. Para custos, veja &lt;a href="http://apidog.com/blog/deepseek-v4-api-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;preços da API DeepSeek V4&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;V4-Flash&lt;/strong&gt; roda em 2 × H100 80GB em FP8, ou 1 × H100 em INT4 (~500GB de pesos em FP8).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V4-Pro&lt;/strong&gt; precisa de 16+ H100s em FP8 para produção; não recomendado para laptops.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;vLLM&lt;/strong&gt; é o caminho mais rápido para um servidor compatível com OpenAI (&lt;code&gt;vllm&amp;gt;=0.9.0&lt;/code&gt; já suporta o V4).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SGLang&lt;/strong&gt; é a alternativa para equipes que focam em ferramentas e saída estruturada.&lt;/li&gt;
&lt;li&gt;Quantização para &lt;strong&gt;AWQ INT4&lt;/strong&gt; ou &lt;strong&gt;GPTQ INT4&lt;/strong&gt; permite rodar o V4-Flash em uma única GPU de 80GB com ~5% de perda de qualidade.&lt;/li&gt;
&lt;li&gt;Use o &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para testar seu endpoint local em &lt;code&gt;http://localhost:8000/v1&lt;/code&gt; usando a mesma coleção da API hospedada.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quem deve hospedar por conta própria
&lt;/h2&gt;

&lt;p&gt;Hospede o V4 localmente se sua equipe:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Precisa de conformidade&lt;/strong&gt;: setores como saúde, finanças, jurídico ou defesa, onde dados não podem sair da rede. Licença MIT → sem acordos extras ou transferência internacional de dados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tem grandes cargas de trabalho estáveis&lt;/strong&gt;: Acima de 200 bilhões de tokens/mês, hardware próprio compensa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Precisa de ajuste fino e pesquisa&lt;/strong&gt;: Checkpoints Base servem para pré-treinamento contínuo e adaptação de domínio. MIT permite redistribuição comercial.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Quem não deve hospedar:&lt;/strong&gt; prototipadores, equipes sem experiência em operações de GPU, ou workloads abaixo de US$ 200/mês em API hospedada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requisitos de hardware
&lt;/h2&gt;

&lt;p&gt;O DeepSeek V4 usa precisão mista FP4 + FP8. Isso reduz o uso de memória real comparado ao número bruto de parâmetros.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variante&lt;/th&gt;
&lt;th&gt;Total de parâmetros&lt;/th&gt;
&lt;th&gt;Parâmetros ativos&lt;/th&gt;
&lt;th&gt;VRAM FP8&lt;/th&gt;
&lt;th&gt;VRAM INT4&lt;/th&gt;
&lt;th&gt;Placas mínimas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V4-Flash&lt;/td&gt;
&lt;td&gt;284B&lt;/td&gt;
&lt;td&gt;13B&lt;/td&gt;
&lt;td&gt;~500GB&lt;/td&gt;
&lt;td&gt;~140GB&lt;/td&gt;
&lt;td&gt;2 × H100 80GB (FP8) ou 1 × H100 (INT4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4-Pro&lt;/td&gt;
&lt;td&gt;1.6T&lt;/td&gt;
&lt;td&gt;49B&lt;/td&gt;
&lt;td&gt;~2.4TB&lt;/td&gt;
&lt;td&gt;~700GB&lt;/td&gt;
&lt;td&gt;16 × H100 80GB (FP8) ou 8 × H100 (INT4)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Notas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memória MoE é o total, não apenas ativa.&lt;/li&gt;
&lt;li&gt;H200 e MI300X são mais eficientes (mais VRAM/placa).&lt;/li&gt;
&lt;li&gt;GPUs de consumidor não servem (nem RTX 5090).&lt;/li&gt;
&lt;li&gt;Apple Silicon (M3/M4 Max) roda com quantização pesada, mas apenas para desenvolvimento/testes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Etapa 1: Baixar os pesos
&lt;/h2&gt;

&lt;p&gt;Repositórios oficiais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash" rel="noopener noreferrer"&gt;deepseek-ai/DeepSeek-V4-Flash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Pro" rel="noopener noreferrer"&gt;deepseek-ai/DeepSeek-V4-Pro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;deepseek-ai/DeepSeek-V4-Flash-Base&lt;/code&gt; e &lt;code&gt;DeepSeek-V4-Pro-Base&lt;/code&gt; para ajuste fino.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instale o CLI e baixe os pesos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-U&lt;/span&gt; &lt;span class="s2"&gt;"huggingface_hub[cli]"&lt;/span&gt;
huggingface-cli login

huggingface-cli download deepseek-ai/DeepSeek-V4-Flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--local-dir&lt;/span&gt; ./models/deepseek-v4-flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--local-dir-use-symlinks&lt;/span&gt; False
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reserve ~500GB para o V4-Flash, vários TBs para o V4-Pro. Usuários na China: &lt;a href="https://modelscope.cn/models/deepseek-ai/DeepSeek-V4-Flash" rel="noopener noreferrer"&gt;modelscope.cn&lt;/a&gt; é mais rápido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Etapa 2: Escolha um mecanismo de serviço
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;vLLM&lt;/strong&gt;: melhor taxa de transferência, interface compatível com OpenAI, comunidade maior. Recomendado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SGLang&lt;/strong&gt;: melhores recursos para ferramentas e saída estruturada; útil se depende de chamadas de funções.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ambos já suportam DeepSeek V4.&lt;/p&gt;

&lt;h2&gt;
  
  
  Etapa 3: Sirva V4-Flash com vLLM
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"vllm&amp;gt;=0.9.0"&lt;/span&gt;

vllm serve deepseek-ai/DeepSeek-V4-Flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tensor-parallel-size&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-model-len&lt;/span&gt; 1048576 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dtype&lt;/span&gt; auto &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enable-prefix-caching&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Sinalizadores úteis:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--tensor-parallel-size 2&lt;/code&gt;: divide entre 2 H100s.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--max-model-len 1048576&lt;/code&gt;: ativa contexto de 1M tokens; reduza para liberar VRAM.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--enable-prefix-caching&lt;/code&gt;: ativa cache de prefixo, acelerando prompts repetidos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--dtype auto&lt;/code&gt;: usa FP8 automaticamente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clientes OpenAI funcionam em &lt;code&gt;http://localhost:8000/v1&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Etapa 4: Sirva V4-Pro com vLLM
&lt;/h2&gt;

&lt;p&gt;V4-Pro exige cluster; ajuste os parâmetros de paralelismo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vllm serve deepseek-ai/DeepSeek-V4-Pro &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tensor-parallel-size&lt;/span&gt; 8 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--pipeline-parallel-size&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-model-len&lt;/span&gt; 524288 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enable-prefix-caching&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ajuste &lt;code&gt;--max-model-len&lt;/code&gt; conforme a VRAM disponível.&lt;/p&gt;

&lt;h2&gt;
  
  
  Etapa 5: Sirva com SGLang (alternativa para uso de ferramentas)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"sglang[all]&amp;gt;=0.4.0"&lt;/span&gt;

python &lt;span class="nt"&gt;-m&lt;/span&gt; sglang.launch_server &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--model-path&lt;/span&gt; deepseek-ai/DeepSeek-V4-Flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tp&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--context-length&lt;/span&gt; 1048576 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 30000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SGLang expõe &lt;code&gt;/v1&lt;/code&gt; compatível com OpenAI em &lt;code&gt;http://localhost:30000/v1&lt;/code&gt;. O DSL &lt;code&gt;lang&lt;/code&gt; facilita chamadas de função e saída JSON.&lt;/p&gt;

&lt;h2&gt;
  
  
  Etapa 6: Quantize para uma GPU única
&lt;/h2&gt;

&lt;p&gt;Quantização INT4 permite rodar o V4-Flash em uma H100 de 80GB com perda mínima de qualidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWQ (recomendado)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;autoawq

python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer

model_path = './models/deepseek-v4-flash'
out_path = './models/deepseek-v4-flash-awq'
model = AutoAWQForCausalLM.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)
model.quantize(tokenizer, quant_config={'w_bit': 4, 'q_group_size': 128})
model.save_quantized(out_path)
tokenizer.save_pretrained(out_path)
"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  GPTQ
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;auto-gptq
&lt;span class="c"&gt;# Siga a receita de quantização GPTQ; processo semelhante ao AWQ.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sirva o checkpoint quantizado com vLLM usando &lt;code&gt;--quantization awq&lt;/code&gt; ou &lt;code&gt;--quantization gptq&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Etapa 7: Teste com Apidog
&lt;/h2&gt;

&lt;p&gt;Não envie produção direto para o novo servidor. Valide antes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-228.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-228.png" alt="Captura de tela do Apidog mostrando como testar a API DeepSeek V4 localmente." width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Baixe o &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Crie uma coleção apontando para &lt;code&gt;http://localhost:8000/v1/chat/completions&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use o mesmo prompt de teste que na API hospedada e compare as respostas.&lt;/li&gt;
&lt;li&gt;Faça teste com contexto de 500K tokens para validar o cache KV.&lt;/li&gt;
&lt;li&gt;Execute um fluxo de chamada de ferramentas antes de conectar automações.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A coleção usada na &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API hospedada DeepSeek V4&lt;/a&gt; funciona localmente mudando só o URL base.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observabilidade e monitoramento
&lt;/h2&gt;

&lt;p&gt;Monitore estas métricas desde o início:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tokens por segundo&lt;/strong&gt; (prompt e geração) — vLLM expõe em &lt;code&gt;/metrics&lt;/code&gt; formato Prometheus.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Utilização da GPU&lt;/strong&gt; — &lt;code&gt;nvidia-smi&lt;/code&gt; ou DCGM; taxa &amp;lt;70% indica batch size subótimo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Taxa de acerto do cache KV&lt;/strong&gt; — vLLM mostra; queda sinaliza prompts não otimizados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latência p50/p95/p99&lt;/strong&gt; — rastreamento padrão; p99 alto com p50 estável indica requisições problemáticas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Envie todas para Grafana ou sua stack de observabilidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ajuste fino dos checkpoints Base do V4
&lt;/h2&gt;

&lt;p&gt;Checkpoints Base servem para pré-treinamento contínuo e SFT (fine-tuning supervisionado):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"torch&amp;gt;=2.6"&lt;/span&gt; transformers accelerate peft trl

&lt;span class="c"&gt;# SFT padrão com LoRA no V4-Flash-Base&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; trl sft &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--model_name_or_path&lt;/span&gt; deepseek-ai/DeepSeek-V4-Flash-Base &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dataset_name&lt;/span&gt; your-org/your-sft-set &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output_dir&lt;/span&gt; ./models/v4-flash-custom &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--per_device_train_batch_size&lt;/span&gt; 1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--gradient_accumulation_steps&lt;/span&gt; 16 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--learning_rate&lt;/span&gt; 2e-5 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bf16&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--use_peft&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--lora_r&lt;/span&gt; 64 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--lora_alpha&lt;/span&gt; 128
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full fine-tuning no V4-Pro é tarefa de pesquisa. LoRA adapters no V4-Flash-Base são o caminho prático para a maioria.&lt;/p&gt;

&lt;h2&gt;
  
  
  Armadilhas comuns
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;OOM (Out Of Memory) na inicialização:&lt;/strong&gt; contexto alto demais ou paralelismo baixo. Diminua &lt;code&gt;--max-model-len&lt;/code&gt; ou aumente &lt;code&gt;--tensor-parallel-size&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Primeira requisição lenta:&lt;/strong&gt; vLLM compila kernels sob demanda; aqueça com request dummy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Erros de parsing em uso de ferramentas:&lt;/strong&gt; DeepSeek difere levemente do OpenAI; use SDKs com suporte explícito ao V4.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Erros FP8 em GPUs antigas:&lt;/strong&gt; A100 não suporta FP8. Use BF16 e espere dobrar a necessidade de VRAM.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Quando a hospedagem própria compensa
&lt;/h2&gt;

&lt;p&gt;Cálculo de breakeven, usando os &lt;a href="http://apidog.com/blog/deepseek-v4-api-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;preços da API DeepSeek V4&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;V4-Flash com 200B tokens in / 20B out/mês:&lt;/strong&gt; ~$33,6K pela API. Uma máquina com 8 × H100 custa ~$20K/mês. Economia de ~40%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V4-Pro com 500B in / 50B out/mês:&lt;/strong&gt; ~$1,04M na API. Cluster de 16 × H100 sai por ~$35K/mês. Economia &amp;gt;95%.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O ponto crítico para V4-Flash é em ~100B tokens/mês. Abaixo disso, a API hospedada é mais barata.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Posso executar V4-Flash em uma A100?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Com quantização pesada e contexto reduzido, sim, mas é lento (5-15 tok/s). H100 é o hardware ideal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O V4 suporta fine-tuning com LoRA?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim. Use checkpoints Base e pipelines TRL ou Axolotl. MoE não afeta o LoRA.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O servidor local é compatível com OpenAI?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim. vLLM e SGLang expõem &lt;code&gt;/v1/chat/completions&lt;/code&gt; e &lt;code&gt;/v1/completions&lt;/code&gt;. O &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia da API hospedada&lt;/a&gt; funciona com localhost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como habilito modo de pensamento ("thinking mode")?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Inclua &lt;code&gt;thinking_mode: "thinking"&lt;/code&gt; ou &lt;code&gt;"thinking_max"&lt;/code&gt; na requisição. vLLM e SGLang encaminham ao modelo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consigo fazer streaming do servidor V4 local?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim. Use &lt;code&gt;stream: true&lt;/code&gt; igual ao OpenAI ou API DeepSeek.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forma mais barata de testar antes de comprar hardware?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Alugue uma H100 no RunPod ou Lambda, rode V4-Flash em INT4 e meça throughput real. Teste de $10–$30 resolve rápido.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como Usar a API DeepSeek V4 Gratuitamente?</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:23:57 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/como-usar-a-api-deepseek-v4-gratuitamente-2j7l</link>
      <guid>https://dev.to/lucas_ferreira/como-usar-a-api-deepseek-v4-gratuitamente-2j7l</guid>
      <description>&lt;p&gt;O DeepSeek V4 foi lançado em 23 de abril de 2026, trazendo uma API com preço tão baixo que muitas equipes ignoram camadas gratuitas. Porém, existe um caminho realmente gratuito para desenvolvedores que querem integrar o V4 programaticamente antes de adicionar um cartão. Gateways agregadores oferecem variantes &lt;code&gt;:free&lt;/code&gt;, o Hugging Face tem endpoint aberto, e a API oficial concede crédito de teste para novas contas. Neste artigo, você verá como combinar os três em uma cadeia de fallback no Apidog para prototipar produtos baseados em V4 sem gastar nada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Este guia mostra o caminho gratuito para a API. Para um tutorial mais amplo cobrindo chat web e auto-hospedagem, acesse &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como usar o DeepSeek V4 gratuitamente&lt;/a&gt;. Se quiser um passo a passo pago, veja &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como usar a API DeepSeek V4&lt;/a&gt;. Para visão geral do produto, confira &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;o que é DeepSeek V4&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="em-resumo"&gt;EM RESUMO&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Camada gratuita do OpenRouter&lt;/strong&gt; — &lt;code&gt;deepseek/deepseek-v4-flash:free&lt;/code&gt; e, às vezes, &lt;code&gt;deepseek-v4-pro:free&lt;/code&gt;. Compatível com OpenAI, centenas de requisições/dia por chave.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provedores de Inferência Hugging Face&lt;/strong&gt; — endpoint gratuito em &lt;code&gt;https://router.huggingface.co/hf-inference&lt;/code&gt;; limitado por taxa, útil para protótipos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camada gratuita do Chutes&lt;/strong&gt; — rede de GPU comunitária que geralmente libera endpoints DeepSeek gratuitos logo após o lançamento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crédito de teste do DeepSeek&lt;/strong&gt; — novas contas em &lt;code&gt;platform.deepseek.com&lt;/code&gt; podem receber saldo inicial.&lt;/li&gt;
&lt;li&gt;O V4-Flash auto-hospedado em GPU própria é gratuito na licença; veja &lt;a href="http://apidog.com/blog/how-to-run-deepseek-v4-locally?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como rodar o DeepSeek V4 localmente&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Monte uma cadeia de fallback no &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para manter o formato da requisição idêntico em todos os provedores.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-227.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-227.png" alt="" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="por-que-o-caminho-gratuito-da-api-existe"&gt;Por que o caminho gratuito da API existe&lt;/h2&gt;

&lt;p&gt;Mesmo com as taxas pagas do DeepSeek sendo baixíssimas, há motivos práticos para buscar opções gratuitas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prototipagem antes de cadastrar cartão:&lt;/strong&gt; Teste integrações reais sem precisar de pagamento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Projetos acadêmicos, pesquisa e open source:&lt;/strong&gt; Permite acesso a tecnologia de ponta mesmo sem orçamento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparação de provedores:&lt;/strong&gt; Execute o mesmo prompt em três endpoints gratuitos, avaliando latência, qualidade e confiabilidade.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Se você está nesse perfil, siga o passo a passo abaixo. Caso precise de uso contínuo e SLAs, considere a &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API paga&lt;/a&gt; — a recarga mínima de US$2 na API oficial é mais prática do que lutar contra limites gratuitos.&lt;/p&gt;

&lt;h2 id="caminho-1-camada-gratuita-do-openrouter"&gt;Caminho 1: Camada gratuita do OpenRouter&lt;/h2&gt;

&lt;p&gt;O OpenRouter agrega modelos de ponta com API compatível OpenAI. Em todos os lançamentos DeepSeek, libera variantes gratuitas.&lt;/p&gt;

&lt;h3 id="configuração"&gt;Configuração&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Cadastre-se em &lt;a href="https://openrouter.ai/" rel="noopener noreferrer"&gt;openrouter.ai&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Crie sua chave API em &lt;strong&gt;Configurações → Chaves&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Cheque o catálogo de modelos por entradas com &lt;code&gt;:free&lt;/code&gt; (ex: &lt;code&gt;deepseek/deepseek-v4-flash:free&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Chame o endpoint com qualquer SDK compatível com OpenAI.&lt;/li&gt;
&lt;/ol&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OPENROUTER_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://openrouter.ai/api/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek/deepseek-v4-flash:free&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Refactor this Go function to use channels.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3 id="como-são-os-limites"&gt;Como são os limites&lt;/h3&gt;

&lt;p&gt;Requisições gratuitas entram na fila atrás do tráfego pago. Limite típico: 50–200 requisições/dia/chave, concorrência baixa. A variante pode ser removida a qualquer momento — use só para prototipagem.&lt;/p&gt;

&lt;h3 id="versão-node"&gt;Versão Node&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OPENROUTER_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://openrouter.ai/api/v1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deepseek/deepseek-v4-flash:free&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain MoE routing like I'm 12.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2 id="caminho-2-provedores-de-inferência-hugging-face"&gt;Caminho 2: Provedores de Inferência Hugging Face&lt;/h2&gt;

&lt;p&gt;O Hugging Face disponibiliza endpoint de inferência compartilhado com checkpoints V4 após o lançamento. É só usar o token HF logado — os limites são rigorosos para uso gratuito.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;huggingface_hub&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;InferenceClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;InferenceClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-ai/DeepSeek-V4-Flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HF_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat_completion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a Python decorator that retries with jitter.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Token gratuito em &lt;a href="https://huggingface.co/settings/tokens" rel="noopener noreferrer"&gt;huggingface.co/settings/tokens&lt;/a&gt;. Latência varia conforme carga, e o limite é diário por conta. Para limites maiores, só com HF Pro.&lt;/p&gt;

&lt;h2 id="caminho-3-chutes-e-gateways-da-comunidade"&gt;Caminho 3: Chutes e gateways da comunidade&lt;/h2&gt;

&lt;p&gt;Chutes é uma rede descentralizada de GPU que frequentemente libera modelos DeepSeek gratuitos. O endpoint compatível OpenAI é &lt;code&gt;https://llm.chutes.ai/v1&lt;/code&gt;:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CHUTES_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://llm.chutes.ai/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-ai/DeepSeek-V4-Flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Compare CSA and HCA attention in two sentences.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Disponibilidade muda rápido — sempre confira ID do modelo e custo no painel do provedor antes de depender dele.&lt;/p&gt;

&lt;h2 id="caminho-4-crédito-de-teste-do-deepseek"&gt;Caminho 4: Crédito de teste do DeepSeek&lt;/h2&gt;

&lt;p&gt;Novas contas DeepSeek frequentemente recebem pequeno crédito inicial (ex: US$1), válido após verificação de e-mail. Cheque seu painel em &lt;a href="https://platform.deepseek.com/" rel="noopener noreferrer"&gt;platform.deepseek.com&lt;/a&gt; após o cadastro.&lt;/p&gt;

&lt;p&gt;US$1 cobre cerca de 7 milhões de tokens no V4-Flash ou 570 mil no V4-Pro — suficiente para centenas de chamadas de protótipo.&lt;/p&gt;

&lt;h2 id="construa-uma-cadeia-gratuita-agnóstica-de-provedores-no-apidog"&gt;Construa uma cadeia gratuita agnóstica de provedores no Apidog&lt;/h2&gt;

&lt;p&gt;Ao integrar múltiplos caminhos gratuitos, seu protótipo se torna resiliente. Siga:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Baixe o Apidog&lt;/a&gt; e crie um projeto.&lt;/li&gt;
&lt;li&gt;Crie quatro ambientes: &lt;code&gt;openrouter&lt;/code&gt;, &lt;code&gt;huggingface&lt;/code&gt;, &lt;code&gt;chutes&lt;/code&gt;, &lt;code&gt;deepseek-trial&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Em cada ambiente, armazene a chave de API como variável secreta e defina &lt;code&gt;BASE_URL&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Salve uma requisição POST para &lt;code&gt;{{BASE_URL}}/chat/completions&lt;/code&gt; com campo &lt;code&gt;model&lt;/code&gt; parametrizado.&lt;/li&gt;
&lt;li&gt;Alterne o ambiente para rodar o mesmo prompt em todos os provedores sem mexer no código.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Essa abordagem também serve para &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;caminhos gratuitos do GPT-5.5&lt;/a&gt;: só troque os provedores.&lt;/p&gt;

&lt;h3 id="monte-uma-cadeia-de-fallback-no-código"&gt;Monte uma cadeia de fallback no código&lt;/h3&gt;

&lt;p&gt;Implemente fallback automático para garantir resposta mesmo com limites atingidos:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RateLimitError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APIError&lt;/span&gt;

&lt;span class="n"&gt;PROVIDERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;base_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://openrouter.ai/api/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENROUTER_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek/deepseek-v4-flash:free&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;base_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://llm.chutes.ai/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CHUTES_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-ai/DeepSeek-V4-Flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;base_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.deepseek.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DEEPSEEK_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-v4-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_v4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;PROVIDERS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;base_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RateLimitError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APIError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;base_url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; failed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;all providers exhausted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2 id="para-que-cada-caminho-gratuito-realmente-serve"&gt;Para que cada caminho gratuito realmente serve&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Caminho&lt;/th&gt;
&lt;th&gt;Melhor para&lt;/th&gt;
&lt;th&gt;Pior para&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenRouter gratuito&lt;/td&gt;
&lt;td&gt;Prototipagem, desenvolvimento diário&lt;/td&gt;
&lt;td&gt;Qualquer coisa com SLAs rigorosos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inferência HF&lt;/td&gt;
&lt;td&gt;Chamadas exploratórias, notebooks&lt;/td&gt;
&lt;td&gt;Cargas de trabalho de baixa latência&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chutes&lt;/td&gt;
&lt;td&gt;Trabalho experimental da comunidade&lt;/td&gt;
&lt;td&gt;Dependências de longo prazo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teste DeepSeek&lt;/td&gt;
&lt;td&gt;Testes de fidelidade total&lt;/td&gt;
&lt;td&gt;Produção contínua&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4-Flash auto-hospedado&lt;/td&gt;
&lt;td&gt;Trabalho vinculado à conformidade&lt;/td&gt;
&lt;td&gt;Equipes sem capacidade de GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2 id="matemática-de-cota-que-importa"&gt;Matemática de cota que importa&lt;/h2&gt;

&lt;p&gt;Antes de decidir, avalie quanto cada caminho gratuito entrega:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenRouter gratuito:&lt;/strong&gt; ~100 requisições/dia/chave, ~50K tokens cada. Útil para 30–50 chamadas reais/dia.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inferência HF gratuita:&lt;/strong&gt; ~1.000 requisições/dia por conta. Latência pode ser alta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chutes:&lt;/strong&gt; variável; trate como "best effort".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teste DeepSeek (US$1):&lt;/strong&gt; ~700 chamadas de 10K tokens cada no V4-Flash.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V4-Flash auto-hospedado:&lt;/strong&gt; limitado ao seu hardware. Uma máquina 4 × H100 faz 50–150 tok/s.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se precisar de mais, a economia muda. Com V4-Flash a US$ 0,14/M, 10.000 chamadas com 2K contexto + 500 tokens de saída custam só US$2,80. Após o protótipo, a API paga geralmente é melhor.&lt;/p&gt;

&lt;h2 id="quando-mudar-para-a-api-paga"&gt;Quando mudar para a API paga&lt;/h2&gt;

&lt;p&gt;Pare de usar apenas camadas gratuitas quando:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Você atinge limites de taxa mais de uma vez por dia;&lt;/li&gt;
&lt;li&gt;Precisa encadear vários provedores só para atender uma carga básica;&lt;/li&gt;
&lt;li&gt;Exige latência previsível ou SLA.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A recarga mínima em &lt;code&gt;platform.deepseek.com&lt;/code&gt; é US$2. Um dia inteiro em camadas gratuitas pode custar mais tempo de dev do que a API paga. Veja &lt;a href="http://apidog.com/blog/deepseek-v4-api-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia de preços DeepSeek V4&lt;/a&gt; para detalhes.&lt;/p&gt;

&lt;h2 id="perguntas-frequentes"&gt;PERGUNTAS FREQUENTES&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Algum desses caminhos é permanentemente gratuito?&lt;/strong&gt; Não. As camadas gratuitas mudam sem aviso. Use só para prototipagem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O OpenRouter &lt;code&gt;:free&lt;/code&gt; executa o V4 real?&lt;/strong&gt; Sim, mas em infraestrutura compartilhada e com taxa limitada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Posso usar saída de caminho gratuito em produto lançado?&lt;/strong&gt; Veja os termos de cada provedor. OpenRouter permite uso comercial dentro do limite. HF permite, mas limita. O crédito de teste do próprio DeepSeek segue os termos principais.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qual caminho gratuito tem melhor latência?&lt;/strong&gt; O crédito de teste DeepSeek (infraestrutura de produção). OpenRouter é o segundo. HF e Chutes variam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Posso auto-hospedar o V4 gratuitamente?&lt;/strong&gt; Sim, a licença é MIT. Só o hardware é custo. Veja &lt;a href="http://apidog.com/blog/how-to-run-deepseek-v4-locally?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como rodar o DeepSeek V4 localmente&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como rastrear consumo dos caminhos gratuitos?&lt;/strong&gt; Use &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; e fixe &lt;code&gt;usage&lt;/code&gt; no visualizador de respostas. A maioria dos gateways tem painel de uso no console.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Preços da API DeepSeek V4</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:22:49 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/precos-da-api-deepseek-v4-31j5</link>
      <guid>https://dev.to/lucas_ferreira/precos-da-api-deepseek-v4-31j5</guid>
      <description>&lt;p&gt;DeepSeek publicou os preços do V4 no mesmo dia em que os modelos foram lançados, 23 de abril de 2026, redefinindo o patamar para IA de ponta. O V4-Flash opera a &lt;strong&gt;$0.14 por milhão de tokens de entrada e $0.28 por milhão de tokens de saída&lt;/strong&gt;, enquanto o V4-Pro opera a &lt;strong&gt;$1.74 de entrada e $3.48 de saída&lt;/strong&gt;. Ambos oferecem uma janela de contexto de 1M de tokens e até 384K tokens de saída, além de desconto agressivo por acerto de cache que reduz os custos de entrada em 80% a 90% em prompts repetidos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Este guia mostra a tabela completa de preços, como o cache de contexto altera o custo real por chamada, comparação com GPT-5.5 e Claude Opus, e quatro práticas para manter os gastos previsíveis usando o Apidog.&lt;/p&gt;

&lt;p&gt;Para visão geral do produto, veja &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;o que é DeepSeek V4&lt;/a&gt;. Para guia do desenvolvedor, veja &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como usar a API DeepSeek V4&lt;/a&gt;. Para caminhos gratuitos, veja &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como usar o DeepSeek V4 gratuitamente&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;V4-Flash:&lt;/strong&gt; $0.14 / M de entrada (cache miss), $0.028 / M de entrada (cache hit), $0.28 / M de saída.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V4-Pro:&lt;/strong&gt; $1.74 / M de entrada (cache miss), $0.145 / M de entrada (cache hit), $3.48 / M de saída.&lt;/li&gt;
&lt;li&gt;Janela de contexto: &lt;strong&gt;1M de tokens&lt;/strong&gt; de entrada, &lt;strong&gt;384K de tokens&lt;/strong&gt; de saída.&lt;/li&gt;
&lt;li&gt;Desconto por acerto de cache: aproximadamente &lt;strong&gt;80% de desconto no Flash&lt;/strong&gt;, &lt;strong&gt;92% de desconto no Pro&lt;/strong&gt; em prefixos repetidos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;deepseek-chat&lt;/code&gt; e &lt;code&gt;deepseek-reasoner&lt;/code&gt; serão descontinuados em &lt;strong&gt;24 de julho de 2026&lt;/strong&gt;; cobrança mapeia para V4-Flash.&lt;/li&gt;
&lt;li&gt;Com taxas de cache miss, o V4-Pro é &lt;strong&gt;~2.9x mais barato que o GPT-5.5&lt;/strong&gt; na entrada e &lt;strong&gt;~8.6x mais barato&lt;/strong&gt; na saída.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A tabela de preços completa
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modelo&lt;/th&gt;
&lt;th&gt;Entrada (cache miss)&lt;/th&gt;
&lt;th&gt;Entrada (cache hit)&lt;/th&gt;
&lt;th&gt;Saída&lt;/th&gt;
&lt;th&gt;Contexto&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;deepseek-v4-flash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.14 / M&lt;/td&gt;
&lt;td&gt;$0.028 / M&lt;/td&gt;
&lt;td&gt;$0.28 / M&lt;/td&gt;
&lt;td&gt;1M / 384K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;deepseek-v4-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$1.74 / M&lt;/td&gt;
&lt;td&gt;$0.145 / M&lt;/td&gt;
&lt;td&gt;$3.48 / M&lt;/td&gt;
&lt;td&gt;1M / 384K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;deepseek-chat&lt;/code&gt; (descontinuado em 24/07/2026)&lt;/td&gt;
&lt;td&gt;mapeia para V4-Flash sem raciocínio&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;deepseek-reasoner&lt;/code&gt; (descontinuado em 24/07/2026)&lt;/td&gt;
&lt;td&gt;mapeia para V4-Flash com raciocínio&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Três pontos práticos sobre a precificação:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Os preços são iguais, independentemente do uso de raciocínio. O ID do modelo define a taxa; o modo de raciocínio só altera o volume de tokens.&lt;/li&gt;
&lt;li&gt;O desconto por acerto de cache é automático: qualquer chamada com prefixo repetido (mínimo 1.024 tokens, byte a byte) na mesma conta já obtém o desconto, sem necessidade de configuração.&lt;/li&gt;
&lt;li&gt;Os IDs antigos &lt;code&gt;deepseek-chat&lt;/code&gt; e &lt;code&gt;deepseek-reasoner&lt;/code&gt; agora são aliases do V4-Flash. Se você não migrou, já está usando V4-Flash com os mesmos preços.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Cache de contexto na prática
&lt;/h2&gt;

&lt;p&gt;O cache é a principal ferramenta para redução de custo no DeepSeek V4. Qualquer trecho repetido entre chamadas (prompts de sistema, esquemas de ferramentas, contexto RAG) paga só uma fração do valor nas execuções seguintes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompt de sistema fixo: 20.000 tokens&lt;/li&gt;
&lt;li&gt;100 perguntas de usuário (200 tokens cada)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sem cache:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Entrada: 100 × 20.200 × $1.74 / M = $3.52
Saída: 100 × 500 × $3.48 / M = $0.17
Total: $3.69
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Com cache (após a primeira chamada):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Entrada da primeira chamada: 20.200 × $1.74 / M = $0.035
Próximos 99 prefixos com cache hit: 99 × 20.000 × $0.145 / M = $0.287
Turnos de usuário (cache miss): 99 × 200 × $1.74 / M = $0.034
Saída: 100 × 500 × $3.48 / M = $0.174
Total: $0.53
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ganho: &lt;strong&gt;7x mais barato&lt;/strong&gt;. No V4-Flash, o efeito é ainda mais expressivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparação com GPT-5.5 e Claude
&lt;/h2&gt;

&lt;p&gt;A tabela abaixo facilita a comparação direta:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modelo&lt;/th&gt;
&lt;th&gt;Entrada (padrão)&lt;/th&gt;
&lt;th&gt;Entrada (em cache)&lt;/th&gt;
&lt;th&gt;Saída&lt;/th&gt;
&lt;th&gt;Contexto&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4-Flash&lt;/td&gt;
&lt;td&gt;$0.14 / M&lt;/td&gt;
&lt;td&gt;$0.028 / M&lt;/td&gt;
&lt;td&gt;$0.28 / M&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4-Pro&lt;/td&gt;
&lt;td&gt;$1.74 / M&lt;/td&gt;
&lt;td&gt;$0.145 / M&lt;/td&gt;
&lt;td&gt;$3.48 / M&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;$5 / M&lt;/td&gt;
&lt;td&gt;$1.25 / M&lt;/td&gt;
&lt;td&gt;$30 / M&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5 Pro&lt;/td&gt;
&lt;td&gt;$30 / M&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;$180 / M&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.6&lt;/td&gt;
&lt;td&gt;$15 / M&lt;/td&gt;
&lt;td&gt;$1.50 / M&lt;/td&gt;
&lt;td&gt;$75 / M&lt;/td&gt;
&lt;td&gt;200K&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Destaques práticos:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;V4-Pro é ~8.6x mais barato que GPT-5.5&lt;/strong&gt; em tokens de saída e &lt;strong&gt;21x mais barato que Claude Opus 4.6&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Em entrada cacheada, V4-Pro é ~10x mais barato que GPT-5.5/Claude&lt;/strong&gt; para prompts longos e contextos repetidos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance:&lt;/strong&gt; V4-Pro alcança ou supera GPT-5.5 em benchmarks de código (LiveCodeBench e Codeforces), custando uma fração do preço.

&lt;ul&gt;
&lt;li&gt;Veja &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;benchmarks completos&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Atenção:&lt;/strong&gt; Claude ainda vence em recuperação de contexto longo e Gemini 3.1 Pro lidera o MMLU-Pro. Se sua aplicação depende de recuperação avançada em contexto extenso, teste antes de migrar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modelagem de custos para workloads comuns
&lt;/h2&gt;

&lt;p&gt;Quatro padrões cobrem a maioria dos casos de uso. Veja o cálculo prático no V4-Pro (sem cache):&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Loop de codificação de agente (50K contexto, 2K saída, 20 execuções)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Entrada: 50.000 × 20 × $1.74 / M = $1.74
Saída: 2.000 × 20 × $3.48 / M = $0.14
Custo por tarefa: ~$1.88
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No GPT-5.5: ~$6.20 por tarefa.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Perguntas e Respostas em documentos longos (500K contexto, 1K saída)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Entrada: 500.000 × $1.74 / M = $0.87
Saída: 1.000 × $3.48 / M = $0.003
Custo por chamada: ~$0.87
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No GPT-5.5: ~$2.53 por chamada.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Classificação de alto volume (2K contexto, 200 saída, 10.000 execuções)
&lt;/h3&gt;

&lt;p&gt;Use V4-Flash para este caso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Entrada: 2.000 × 10.000 × $0.14 / M = $2.80
Saída: 200 × 10.000 × $0.28 / M = $0.56
Custo total: ~$3.36
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No GPT-5.5: ~$110.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Chatbot com prompt repetido (10K prompt, 500 tokens usuário, 1K saída, 1.000 sessões)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Entrada da primeira chamada: 10.500 × $1.74 / M = $0.018
Entrada com cache: 999 × 10.000 × $0.145 / M = $1.45
Usuário (cache miss): 999 × 500 × $1.74 / M = $0.87
Saída: 1.000 × 1.000 × $3.48 / M = $3.48
Custo total: ~$5.82
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No GPT-5.5 com cache: ~$26.35.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custos ocultos: o que monitorar
&lt;/h2&gt;

&lt;p&gt;Após o primeiro mês, quatro fatores impactam o orçamento:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inflação de tokens em raciocínio:&lt;/strong&gt; &lt;code&gt;thinking_max&lt;/code&gt; pode consumir de 3x a 10x mais tokens de saída. Controle via flag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crescimento silencioso do contexto:&lt;/strong&gt; Loops de agente realimentam toda a conversa. Trunque ou resuma agressivamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tempestades de retry:&lt;/strong&gt; Bugs podem dobrar custos rapidamente. Implemente backoff exponencial e limite de tentativas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotatividade de desenvolvimento:&lt;/strong&gt; Testar prompts via curl reenvia todo o contexto. Com &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, variáveis e reexecuções são gratuitas.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Como monitorar custos no Apidog
&lt;/h2&gt;

&lt;p&gt;Fluxo de trabalho recomendado:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Baixe o Apidog&lt;/a&gt; e armazene &lt;code&gt;DEEPSEEK_API_KEY&lt;/code&gt; como variável secreta.&lt;/li&gt;
&lt;li&gt;Salve uma requisição POST para &lt;code&gt;https://api.deepseek.com/v1/chat/completions&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;No painel de resposta, fixe &lt;code&gt;usage.prompt_tokens&lt;/code&gt;, &lt;code&gt;usage.completion_tokens&lt;/code&gt; e &lt;code&gt;usage.reasoning_tokens&lt;/code&gt;. Veja o custo direto em cada chamada.&lt;/li&gt;
&lt;li&gt;Parametrize &lt;code&gt;model&lt;/code&gt; e &lt;code&gt;thinking_mode&lt;/code&gt; para comparar V4-Flash vs V4-Pro e diferentes modos de raciocínio sem duplicar requests.&lt;/li&gt;
&lt;li&gt;Espelhe a coleção para GPT-5.5 (veja o &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia da API GPT-5.5&lt;/a&gt;). Assim, você compara ambos os provedores lado a lado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esse fluxo detecta cerca de 80% das surpresas de custo antes de chegarem na fatura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quatro regras para manter os gastos previsíveis
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use V4-Flash por padrão.&lt;/strong&gt; Só migre ao V4-Pro quando a diferença de qualidade justificar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefira Non-Think.&lt;/strong&gt; Escale para Think High em tarefas complexas. Reserve Think Max para casos críticos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Defina um limite para &lt;code&gt;max_tokens&lt;/code&gt;.&lt;/strong&gt; O teto de 384K é segurança, não objetivo. 2K atende a maioria das respostas reais.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log de uso.&lt;/strong&gt; Registre &lt;code&gt;prompt_tokens&lt;/code&gt;, &lt;code&gt;completion_tokens&lt;/code&gt; e &lt;code&gt;reasoning_tokens&lt;/code&gt; por chamada. Alerta em picos de tokens de raciocínio previne custos inesperados.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Existe um nível gratuito?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não há API gratuita, mas novas contas podem receber crédito de teste. Para alternativas grátis, veja &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como usar o DeepSeek V4 gratuitamente&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como funciona o desconto de cache?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Prefixos a partir de 1.024 tokens repetidos entre solicitações na mesma conta pagam a taxa reduzida. O cache é automático.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modos de raciocínio custam mais?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A taxa por token é igual, mas modos de raciocínio consomem mais tokens. Monitore &lt;code&gt;reasoning_tokens&lt;/code&gt; no retorno da API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Os preços são estáveis?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
DeepSeek pode alterar valores. Confira sempre a &lt;a href="https://api-docs.deepseek.com/quick_start/pricing" rel="noopener noreferrer"&gt;página oficial de preços&lt;/a&gt; antes de orçar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A taxa de saída é igual entre V4-Pro e V4-Flash?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não. V4-Pro cobra $3.48 / M na saída; V4-Flash $0.28 / M. O gap de 12.4x é a principal razão para usar o Flash padrão.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O endpoint Anthropic muda o preço?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não. Tanto &lt;code&gt;https://api.deepseek.com/anthropic&lt;/code&gt; quanto o endpoint OpenAI cobram as mesmas taxas.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como Usar a API DeepSeek V4? Guia Completo</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:16:06 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/como-usar-a-api-deepseek-v4-guia-completo-acb</link>
      <guid>https://dev.to/lucas_ferreira/como-usar-a-api-deepseek-v4-guia-completo-acb</guid>
      <description>&lt;p&gt;DeepSeek V4 foi lançado com suporte imediato à API. Os IDs dos modelos são &lt;code&gt;deepseek-v4-pro&lt;/code&gt; e &lt;code&gt;deepseek-v4-flash&lt;/code&gt;. O endpoint segue o padrão OpenAI, com URL base &lt;code&gt;https://api.deepseek.com&lt;/code&gt;. Basta trocar a URL base para começar a usar o V4 com qualquer cliente compatível com GPT-5.5 ou OpenAI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-222.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-222.png" alt="" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste guia, você vai implementar autenticação, configurar parâmetros essenciais, rodar exemplos em Python e Node, ativar matemática com raciocínio, chamar ferramentas, usar streaming e montar um fluxo no &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para acompanhar custos enquanto testa.&lt;/p&gt;

&lt;p&gt;Veja a visão geral em &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;o que é DeepSeek V4&lt;/a&gt; e para experimentar sem custo, confira &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como usar o DeepSeek V4 gratuitamente&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="tldr-resumo"&gt;TL;DR (Resumo)&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Endpoint OpenAI: &lt;code&gt;https://api.deepseek.com/v1/chat/completions&lt;/code&gt;. Endpoint Anthropic: &lt;code&gt;https://api.deepseek.com/anthropic&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Modelos: &lt;code&gt;deepseek-v4-pro&lt;/code&gt; (1.6T total, 49B ativos) e &lt;code&gt;deepseek-v4-flash&lt;/code&gt; (284B total, 13B ativos).&lt;/li&gt;
&lt;li&gt;Contexto de 1 milhão de tokens e três modos de raciocínio: &lt;code&gt;non-thinking&lt;/code&gt;, &lt;code&gt;thinking&lt;/code&gt;, &lt;code&gt;thinking_max&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;temperature=1.0, top_p=1.0&lt;/code&gt; como padrão (não use padrões do GPT-5.5/Claude).&lt;/li&gt;
&lt;li&gt;IDs &lt;code&gt;deepseek-chat&lt;/code&gt; e &lt;code&gt;deepseek-reasoner&lt;/code&gt; expiram em &lt;strong&gt;24/07/2026&lt;/strong&gt;; migre antes disso.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Baixe o Apidog&lt;/a&gt; para reproduzir requisições, comparar modos de raciocínio e manter a chave protegida.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-223.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-223.png" alt="" width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="pr%C3%A9-requisitos"&gt;Pré-requisitos&lt;/h2&gt;

&lt;p&gt;Antes de começar, prepare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conta DeepSeek em &lt;a href="https://platform.deepseek.com/" rel="noopener noreferrer"&gt;platform.deepseek.com&lt;/a&gt; com saldo de pelo menos $2.&lt;/li&gt;
&lt;li&gt;Chave de API com escopo de projeto.&lt;/li&gt;
&lt;li&gt;SDK compatível com OpenAI: Python &lt;code&gt;openai&amp;gt;=1.30.0&lt;/code&gt; ou Node &lt;code&gt;openai@4.x&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cliente de API para testar requisições. Use &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para repetir e comparar chamadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Defina sua chave no ambiente:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;export DEEPSEEK_API_KEY="sk-..."
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="endpoint-e-autentica%C3%A7%C3%A3o"&gt;Endpoint e autenticação&lt;/h2&gt;

&lt;p&gt;Dois formatos:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;POST https://api.deepseek.com/v1/chat/completions    # OpenAI
POST https://api.deepseek.com/anthropic/v1/messages  # Anthropic
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Prefira OpenAI se não tiver legado Anthropic. O padrão deste guia é OpenAI.&lt;/p&gt;

&lt;p&gt;Envie o token Bearer no cabeçalho &lt;code&gt;Authorization&lt;/code&gt;. Exemplo de chamada mínima:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl https://api.deepseek.com/v1/chat/completions \
  -H "Authorization: Bearer $DEEPSEEK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-v4-pro",
    "messages": [
      {"role": "user", "content": "Explique o roteamento MoE em duas frases."}
    ]
  }'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Respostas incluem &lt;code&gt;choices&lt;/code&gt;, &lt;code&gt;usage&lt;/code&gt; detalhado e &lt;code&gt;id&lt;/code&gt; para rastreamento. Erros seguem o padrão OpenAI.&lt;/p&gt;

&lt;h2 id="par%C3%A2metros-da-requisi%C3%A7%C3%A3o"&gt;Parâmetros da requisição&lt;/h2&gt;

&lt;p&gt;Configure cada campo para ajustar custo e comportamento:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parâmetro&lt;/th&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Valores&lt;/th&gt;
&lt;th&gt;Notas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;deepseek-v4-pro&lt;/code&gt;, &lt;code&gt;deepseek-v4-flash&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Obrigatório.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;messages&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;array&lt;/td&gt;
&lt;td&gt;pares role/content&lt;/td&gt;
&lt;td&gt;Obrigatório. Mesmo esquema do OpenAI.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thinking_mode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;non-thinking&lt;/code&gt;, &lt;code&gt;thinking&lt;/code&gt;, &lt;code&gt;thinking_max&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;O padrão é &lt;code&gt;non-thinking&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;temperature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;0 a 2&lt;/td&gt;
&lt;td&gt;DeepSeek recomenda 1.0.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;top_p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;0 a 1&lt;/td&gt;
&lt;td&gt;DeepSeek recomenda 1.0.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;1 a 131.072&lt;/td&gt;
&lt;td&gt;Limita o comprimento da saída.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stream&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;bool&lt;/td&gt;
&lt;td&gt;true ou false&lt;/td&gt;
&lt;td&gt;Habilita streaming SSE.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;array&lt;/td&gt;
&lt;td&gt;Especificação de ferramenta OpenAI&lt;/td&gt;
&lt;td&gt;Para chamada de função.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tool_choice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string ou objeto&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;auto&lt;/code&gt;, &lt;code&gt;required&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;, ou ferramenta específica&lt;/td&gt;
&lt;td&gt;Controla o uso da ferramenta.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;response_format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;objeto&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"type": "json_object"}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Saída em modo JSON.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;qualquer int&lt;/td&gt;
&lt;td&gt;Para reprodutibilidade.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;presence_penalty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;-2 a 2&lt;/td&gt;
&lt;td&gt;Penaliza tópicos repetidos.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;frequency_penalty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;-2 a 2&lt;/td&gt;
&lt;td&gt;Penaliza tokens repetidos.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;thinking_mode&lt;/code&gt; é o principal driver de custo. Use &lt;code&gt;non-thinking&lt;/code&gt; para performance, &lt;code&gt;thinking&lt;/code&gt; para precisão em código/matemática, e &lt;code&gt;thinking_max&lt;/code&gt; para máxima qualidade (usa mais tokens, requer contexto grande).&lt;/p&gt;

&lt;h2 id="cliente-python"&gt;Cliente Python&lt;/h2&gt;

&lt;p&gt;O SDK &lt;code&gt;openai&lt;/code&gt; funciona direto, só alterando a base URL:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["DEEPSEEK_API_KEY"],
    base_url="https://api.deepseek.com/v1",
)

response = client.chat.completions.create(
    model="deepseek-v4-pro",
    messages=[
        {"role": "system", "content": "Responda apenas em código."},
        {"role": "user", "content": "Escreva uma função Rust que faça 'debounce' de eventos."},
    ],
    extra_body={"thinking_mode": "thinking"},
    temperature=1.0,
    top_p=1.0,
    max_tokens=2048,
)

choice = response.choices[0]
print("Conteúdo:", choice.message.content)
print("Tokens de raciocínio:", response.usage.reasoning_tokens)
print("Total de tokens:", response.usage.total_tokens)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Passe parâmetros DeepSeek extras via &lt;code&gt;extra_body&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="cliente-node"&gt;Cliente Node&lt;/h2&gt;

&lt;p&gt;No Node, basta ajustar &lt;code&gt;baseURL&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.DEEPSEEK_API_KEY,
  baseURL: "https://api.deepseek.com/v1",
});

const response = await client.chat.completions.create({
  model: "deepseek-v4-flash",
  messages: [
    { role: "user", content: "Explique o otimizador Muon em linguagem simples." },
  ],
  thinking_mode: "thinking",
  temperature: 1.0,
  top_p: 1.0,
});

console.log(response.choices[0].message.content);
console.log("Uso:", response.usage);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;No Node, &lt;code&gt;thinking_mode&lt;/code&gt; pode ir direto.&lt;/p&gt;

&lt;h2 id="respostas-em-streaming"&gt;Respostas em Streaming&lt;/h2&gt;

&lt;p&gt;Para streaming, use &lt;code&gt;stream=True&lt;/code&gt; e consuma os chunks:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;stream = client.chat.completions.create(
    model="deepseek-v4-pro",
    messages=[{"role": "user", "content": "Transmita um ensaio de 300 palavras sobre MoE."}],
    stream=True,
    extra_body={"thinking_mode": "non-thinking"},
)

for chunk in stream:
    delta = chunk.choices[0].delta.content or ""
    print(delta, end="", flush=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Se usar raciocínio, monitore &lt;code&gt;delta.reasoning_content&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="chamada-de-ferramentas"&gt;Chamada de Ferramentas&lt;/h2&gt;

&lt;p&gt;Implemente funções conforme esquema OpenAI:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Retorna o clima atual de uma cidade.",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {"type": "string"},
                "unit": {"type": "string", "enum": ["c", "f"]},
            },
            "required": ["city"],
        },
    },
}]

response = client.chat.completions.create(
    model="deepseek-v4-pro",
    messages=[{"role": "user", "content": "Clima em Lagos em Celsius?"}],
    tools=tools,
    tool_choice="auto",
    extra_body={"thinking_mode": "thinking"},
)

tool_call = response.choices[0].message.tool_calls[0]
print(tool_call.function.name, tool_call.function.arguments)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Chame a função, retorne o resultado como &lt;code&gt;role: "tool"&lt;/code&gt;, e continue o ciclo.&lt;/p&gt;

&lt;h2 id="modo-json"&gt;Modo JSON&lt;/h2&gt;

&lt;p&gt;Peça saída JSON válida assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;response = client.chat.completions.create(
    model="deepseek-v4-flash",
    messages=[
        {"role": "system", "content": "Responda com um único objeto JSON."},
        {"role": "user", "content": "Resuma esta nota de lançamento como {título, data, marcadores}: ..."},
    ],
    response_format={"type": "json_object"},
    extra_body={"thinking_mode": "non-thinking"},
)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Combine com validação usando Pydantic ou Zod no cliente.&lt;/p&gt;

&lt;h2 id="construa-a-cole%C3%A7%C3%A3o-no-apidog"&gt;Construa a coleção no Apidog&lt;/h2&gt;

&lt;p&gt;Para controle e repetição:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Baixe o Apidog&lt;/a&gt; e crie um projeto.&lt;/li&gt;
&lt;li&gt;Adicione ambiente com &lt;code&gt;{{DEEPSEEK_API_KEY}}&lt;/code&gt; como variável secreta.&lt;/li&gt;
&lt;li&gt;Salve requisição POST para &lt;code&gt;{{BASE_URL}}/chat/completions&lt;/code&gt; e cabeçalho &lt;code&gt;Authorization: Bearer {{DEEPSEEK_API_KEY}}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Parametrize &lt;code&gt;model&lt;/code&gt; e &lt;code&gt;thinking_mode&lt;/code&gt; para testes A/B.&lt;/li&gt;
&lt;li&gt;Use o visualizador para inspecionar &lt;code&gt;usage.reasoning_tokens&lt;/code&gt; e evitar custos desnecessários.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Se já usa a &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;coleção GPT-5.5 do Apidog&lt;/a&gt;, basta duplicar, trocar base URL/modelo e rodar comparações.&lt;/p&gt;

&lt;h2 id="tratamento-de-erros"&gt;Tratamento de Erros&lt;/h2&gt;

&lt;p&gt;Principais códigos e ações:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Código&lt;/th&gt;
&lt;th&gt;Significado&lt;/th&gt;
&lt;th&gt;Solução&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;Requisição inválida&lt;/td&gt;
&lt;td&gt;Verifique JSON, &lt;code&gt;messages&lt;/code&gt; e &lt;code&gt;tools&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;401&lt;/td&gt;
&lt;td&gt;Chave inválida&lt;/td&gt;
&lt;td&gt;Regenere em &lt;a href="https://platform.deepseek.com/" rel="noopener noreferrer"&gt;platform.deepseek.com&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;402&lt;/td&gt;
&lt;td&gt;Saldo insuficiente&lt;/td&gt;
&lt;td&gt;Recarregue a conta.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;403&lt;/td&gt;
&lt;td&gt;Modelo não permitido&lt;/td&gt;
&lt;td&gt;Verifique escopo da chave e nome do modelo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;422&lt;/td&gt;
&lt;td&gt;Parâmetro fora do intervalo&lt;/td&gt;
&lt;td&gt;Confira &lt;code&gt;max_tokens&lt;/code&gt; e &lt;code&gt;thinking_mode&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;429&lt;/td&gt;
&lt;td&gt;Limite de taxa&lt;/td&gt;
&lt;td&gt;Espere e tente novamente com jitter exponencial.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;Erro do servidor&lt;/td&gt;
&lt;td&gt;Tente novamente; se persistir, veja a página de status.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;503&lt;/td&gt;
&lt;td&gt;Sobrecarga&lt;/td&gt;
&lt;td&gt;Tente V4-Flash ou aguarde 30 segundos.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Implemente retentativa para erros 429/5xx com recuo exponencial. Erros 4xx são bugs de lógica, ajuste antes de tentar novamente.&lt;/p&gt;

&lt;h2 id="padr%C3%B5es-de-controle-de-custo"&gt;Padrões de Controle de Custo&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use V4-Flash como padrão.&lt;/strong&gt; Só mude para V4-Pro quando comprovar aumento de qualidade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Controle &lt;code&gt;thinking_max&lt;/code&gt; via flag.&lt;/strong&gt; Só ative quando precisão máxima for necessária.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limite &lt;code&gt;max_tokens&lt;/code&gt;.&lt;/strong&gt; 2.000 tokens de saída bastam para a maioria dos casos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registre &lt;code&gt;usage&lt;/code&gt; toda chamada.&lt;/strong&gt; Monitore picos de tokens de raciocínio para detectar desvios de prompt.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id="migrando-de-modelos-deepseek-mais-antigos"&gt;Migrando de modelos DeepSeek mais antigos&lt;/h2&gt;

&lt;p&gt;Mude apenas o ID do modelo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-  model="deepseek-chat"
+  model="deepseek-v4-pro"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Compare respostas no Apidog antes de aplicar em produção.&lt;/p&gt;

&lt;h2 id="faq-perguntas-frequentes"&gt;FAQ (Perguntas Frequentes)&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A API DeepSeek V4 está pronta para produção?&lt;/strong&gt; Sim. Desde 23/04/2026, baseada na mesma infraestrutura robusta dos modelos anteriores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O V4 suporta formato Anthropic?&lt;/strong&gt; Sim. Use &lt;code&gt;https://api.deepseek.com/anthropic/v1/messages&lt;/code&gt; com payload Anthropic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qual o contexto máximo?&lt;/strong&gt; 1 milhão de tokens nos dois modelos; &lt;code&gt;thinking_max&lt;/code&gt; requer pelo menos 384K.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Como contar tokens antes de enviar?&lt;/strong&gt; Use o tokenizador OpenAI para estimar, mas confie na contagem &lt;code&gt;usage&lt;/code&gt; da resposta para produção.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fine-tuning via API?&lt;/strong&gt; Não disponível via API no lançamento. Faça fine-tuning apenas via checkpoints no Hugging Face.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Existe trial/gratuito?&lt;/strong&gt; Não há tier gratuito fixo, mas novos registros podem receber crédito de teste.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
  </channel>
</rss>
