<?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>Como Usar a API Seedance 2.0 em 2026</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Sat, 04 Apr 2026 13:01:01 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/como-usar-a-api-seedance-20-em-2026-5d2b</link>
      <guid>https://dev.to/lucas_ferreira/como-usar-a-api-seedance-20-em-2026-5d2b</guid>
      <description>&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;p&gt;A API Seedance 2.0 foi lançada em 2 de abril de 2026, através da Volcengine Ark. Você envia uma tarefa de geração de vídeo com uma requisição POST e então consulta um endpoint GET até que o status atinja "succeeded" (bem-sucedido). A API suporta texto-para-vídeo, imagem-para-vídeo, controle de quadro inicial e final, referências multimodais e geração de áudio nativa. Um vídeo de 5 segundos em 1080p custa aproximadamente US$0,93. Faça o download do vídeo em até 24 horas. A URL expira depois disso.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://hypereal.cloud" rel="noopener noreferrer"&gt;Hypereal AI&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://hypereal.cloud/" rel="noopener noreferrer"&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%2F9no1b7kwev33vq2bcepw.png" alt="Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hypereal.cloud/" rel="noopener noreferrer"&gt;Experimente Hypereal AI&lt;/a&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;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Em 2 de abril de 2026, a plataforma Volcengine Ark da ByteDance lançou a API oficial do Seedance 2.0. Antes dessa data, a única forma de gerar vídeos Seedance 2.0 era através do console web. Se você viu tutoriais mostrando um passo a passo da interface do usuário, eles foram escritos para o console. Este guia cobre a API real que os desenvolvedores podem chamar programaticamente.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Dica:&lt;/strong&gt; A API segue um padrão de tarefa assíncrona: POST para criar a tarefa, receber o ID e então consultar um endpoint GET até que o trabalho termine. Este padrão deve ser testado de ponta a ponta antes de ir para produção. Os Cenários de Teste do Apidog permitem encadear o envio POST, extrair o ID, repetir consultas GET e afirmar que a resposta final contém uma URL de vídeo válida. Baixe o Apidog gratuitamente para seguir os passos de teste na seção sobre Apidog abaixo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Este artigo cobre tipos de entrada suportados, cálculo de preços com base na resposta e os erros mais comuns na produção.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Seedance 2.0?
&lt;/h2&gt;

&lt;p&gt;Seedance 2.0 é um modelo de geração de vídeo da ByteDance, operando na Volcengine Ark sob os IDs de modelo &lt;code&gt;doubao-seedance-2-0-260128&lt;/code&gt; (padrão) e &lt;code&gt;doubao-seedance-2-0-fast-260128&lt;/code&gt; (rápido, menor qualidade).&lt;/p&gt;

&lt;p&gt;Principais recursos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Texto-para-vídeo e imagem-para-vídeo&lt;/li&gt;
&lt;li&gt;Controle de quadro inicial e final (duas imagens)&lt;/li&gt;
&lt;li&gt;Entradas de referência multimodais: imagens, vídeos e áudio em uma requisição&lt;/li&gt;
&lt;li&gt;Geração de áudio nativa (diálogo, efeitos, música)&lt;/li&gt;
&lt;li&gt;Sincronização labial em 8+ idiomas&lt;/li&gt;
&lt;li&gt;Controle de movimento da câmera via prompt de linguagem natural&lt;/li&gt;
&lt;li&gt;Duração de até 15 segundos, resolução até 2K&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O modelo gera vídeos a 24fps, com proporções de 1:1 a 21:9. A resolução é configurável na requisição.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que mudou: guia vs. API oficial
&lt;/h2&gt;

&lt;p&gt;Guias anteriores, incluindo &lt;a href="http://apidog.com/blog/how-to-use-seedance-2-0/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;este guia de fevereiro de 2026&lt;/a&gt;, cobriam apenas o console web. Agora, com a API oficial, é possível integrar Seedance a pipelines automatizados e produtos próprios. Este artigo foca no uso direto via API, para desenvolvedores.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Crie uma conta em &lt;a href="https://www.volcengine.com/" rel="noopener noreferrer"&gt;volcengine.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Gere sua chave de API no console do Ark:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Exporte a chave como variável de ambiente:
&lt;/li&gt;
&lt;/ul&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;ARK_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-api-key-here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Use o token Bearer em cada requisição:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer YOUR_ARK_API_KEY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contas novas recebem créditos de teste (cobrem ~8 gerações de 15s em 1080p).&lt;/p&gt;

&lt;h2&gt;
  
  
  Texto-para-vídeo: sua primeira requisição
&lt;/h2&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://ark.cn-beijing.volces.com/api/v3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para criar uma tarefa texto-para-vídeo: POST em &lt;code&gt;/v1/contents/generations/tasks&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo de cURL
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks"&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;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ARK_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;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "doubao-seedance-2-0-260128",
    "content": [
      {
        "type": "text",
        "text": "A golden retriever running through a sunlit wheat field, wide tracking shot, cinematic"
      }
    ],
    "resolution": "1080p",
    "ratio": "16:9",
    "duration": 5,
    "watermark": false
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A resposta retorna o &lt;code&gt;id&lt;/code&gt; da tarefa:&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="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;"cgt-2025xxxxxxxx-xxxx"&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;h3&gt;
  
  
  Exemplo em Python (SDK oficial)
&lt;/h3&gt;

&lt;p&gt;Instale o SDK:&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;volcenginesdkarkruntime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Envie uma tarefa:&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;volcenginesdkarkruntime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Ark&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;Ark&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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ARK_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;resp&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;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&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;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&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;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;A golden retriever running through a sunlit wheat field, wide tracking shot, cinematic&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;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1080p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Guarde o &lt;code&gt;id&lt;/code&gt; para a etapa de consulta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Padrão de tarefa assíncrona: enviar, consultar, baixar
&lt;/h2&gt;

&lt;p&gt;A geração não é instantânea. Um vídeo de 5s em 1080p leva 1-2 minutos. O ciclo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;queued -&amp;gt; running -&amp;gt; succeeded
                -&amp;gt; failed
                -&amp;gt; expired
                -&amp;gt; cancelled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Consulte o endpoint GET até o status sair de &lt;code&gt;queued&lt;/code&gt;/&lt;code&gt;running&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Loop de consulta em Python
&lt;/h3&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;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;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;volcenginesdkarkruntime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Ark&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;Ark&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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ARK_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Passo 1: Enviar tarefa
&lt;/span&gt;&lt;span class="n"&gt;resp&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;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&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;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&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;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;Aerial shot of a mountain lake at sunrise, slow dolly forward&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;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1080p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&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="n"&gt;task_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&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="s"&gt;Tarefa enviada: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task_id&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="c1"&gt;# Passo 2: Consultar status com backoff exponencial
&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&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;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;task_id&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="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&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="s"&gt;Status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&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;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;succeeded&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&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="n"&gt;video_url&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="s"&gt;URL do vídeo: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video_url&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;break&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&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;expired&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;cancelled&lt;/span&gt;&lt;span class="sh"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tarefa terminou com status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&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;break&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;wait&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Passo 3: Baixar vídeo
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;succeeded&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;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&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;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output.mp4&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;wb&lt;/span&gt;&lt;span class="sh"&gt;"&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;f&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iter_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8192&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&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;Baixado: output.mp4&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;p&gt;Use backoff exponencial para evitar sobrecarregar a API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Imagem-para-vídeo (I2V): animando uma imagem
&lt;/h2&gt;

&lt;p&gt;Para animar uma imagem estática, adicione um objeto &lt;code&gt;image_url&lt;/code&gt; ao array &lt;code&gt;content&lt;/code&gt; junto ao prompt de texto. A imagem vira o quadro inicial.&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;resp&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;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&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;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&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;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;The woman slowly turns her head and smiles at the camera&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;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="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;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/portrait.jpg&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;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;adaptive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;ratio="adaptive"&lt;/code&gt; para manter a proporção da imagem.&lt;/li&gt;
&lt;li&gt;Imagens: até 30MB cada, máximo 9 por requisição.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quadro inicial e final: controlando pontos de início e fim
&lt;/h2&gt;

&lt;p&gt;Forneça duas imagens (primeiro e último quadro) mais o prompt de texto. O modelo faz a transição entre elas.&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;resp&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;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&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;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&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;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;The flower blooms from bud to full open, macro lens, soft light&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;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="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;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/flower-bud.jpg&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="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;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/flower-open.jpg&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;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;adaptive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inclua as imagens em ordem (primeiro depois último quadro). Para encadear clipes, use &lt;code&gt;return_last_frame: true&lt;/code&gt; para obter a imagem do último quadro e alimentar na próxima requisição.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referência multimodal: combinando imagens, vídeo e áudio
&lt;/h2&gt;

&lt;p&gt;Seedance 2.0 permite enviar imagens, vídeos e áudio como referência na mesma tarefa.&lt;/p&gt;

&lt;p&gt;Array de conteúdo pode conter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;{"type": "text", ...}&lt;/code&gt; para prompt&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{"type": "image_url", ...}&lt;/code&gt; para imagens&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{"type": "video_url", ...}&lt;/code&gt; para vídeos&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{"type": "audio_url", ...}&lt;/code&gt; para áudio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Limites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Até 9 imagens (&amp;lt;30MB cada)&lt;/li&gt;
&lt;li&gt;Até 3 vídeos (2-15s, &amp;lt;50MB cada)&lt;/li&gt;
&lt;li&gt;Até 3 áudios (MP3, &amp;lt;15MB cada)&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 python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&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;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&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;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&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;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;Match the visual style of the reference clip and add the provided background audio&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;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="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;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/style-reference.jpg&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;video_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;video_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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;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/motion-reference.mp4&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;audio_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;audio_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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;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/background-music.mp3&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;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com referência de vídeo, o custo por token cai (~US$3,90/M tokens).&lt;/p&gt;

&lt;h2&gt;
  
  
  Geração de áudio nativa
&lt;/h2&gt;

&lt;p&gt;Para gerar trilha de áudio junto ao vídeo, defina &lt;code&gt;generate_audio: true&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;resp&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;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&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;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&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;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;A street musician plays guitar outside a cafe in Paris, crowds passing by, city sounds&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;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1080p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;generate_audio&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;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A geração de áudio cobre diálogos, efeitos, ambiente e música, com sincronização labial em vários idiomas. Isso aumenta um pouco o consumo de tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controlando resolução, proporção e duração
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;resolução&lt;/strong&gt;: &lt;code&gt;"480p"&lt;/code&gt;, &lt;code&gt;"720p"&lt;/code&gt;, &lt;code&gt;"1080p"&lt;/code&gt;, &lt;code&gt;"2K"&lt;/code&gt;. Padrão: &lt;code&gt;"1080p"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;proporção&lt;/strong&gt;: &lt;code&gt;"16:9"&lt;/code&gt;, &lt;code&gt;"9:16"&lt;/code&gt;, &lt;code&gt;"4:3"&lt;/code&gt;, &lt;code&gt;"3:4"&lt;/code&gt;, &lt;code&gt;"21:9"&lt;/code&gt;, &lt;code&gt;"1:1"&lt;/code&gt;, &lt;code&gt;"adaptive"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;duração&lt;/strong&gt;: inteiro de 4 a 15 (segundos). Padrão: 5.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O modelo rápido (&lt;code&gt;doubao-seedance-2-0-fast-260128&lt;/code&gt;) é útil para prototipagem. Use o padrão para produção.&lt;/p&gt;

&lt;p&gt;Prefira Seedance 2.0 para geração áudio-vídeo conjunta, controle de quadros e referências multimodais. Para T2V simples e barato, use o modelo rápido em 480p.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lendo o custo da resposta
&lt;/h2&gt;

&lt;p&gt;Após sucesso, a resposta inclui:&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;"usage"&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;"completion_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;246840&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;246840&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;Referências:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;15s 1080p ≈ 308.880 tokens&lt;/li&gt;
&lt;li&gt;5s 1080p ≈ 102.960 tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Preço:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;T2V/I2V 1080p: 46 yuans/M tokens (~US$6,40/M tokens)&lt;/li&gt;
&lt;li&gt;V2V: 28 yuans/M tokens (~US$3,90/M tokens)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;5s 1080p: ≈ 102.960 tokens ≈ US$0,93&lt;/li&gt;
&lt;li&gt;10s 1080p: ≈ 205.920 tokens ≈ US$1,97&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Multiplique &lt;code&gt;completion_tokens&lt;/code&gt; pela taxa do tipo de tarefa para rastreamento de custos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Importante: baixe o vídeo em até 24 horas
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;video_url&lt;/code&gt; expira 24h após o status "succeeded". Após isso, retorna erro 403 e o arquivo é perdido.&lt;/p&gt;

&lt;p&gt;Baixe o arquivo imediatamente após sucesso. Consulte o campo &lt;code&gt;execution_expires_after&lt;/code&gt; para o tempo de expiração da tarefa (em segundos), mas a URL segue a regra das 24h.&lt;/p&gt;

&lt;p&gt;O histórico de tarefas só guarda os últimos 7 dias.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como testar a API Seedance com Apidog
&lt;/h2&gt;

&lt;p&gt;O padrão assíncrono envolve múltiplas chamadas dependentes. Use Cenários de Teste do Apidog para automatizar:&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%2Fr7qpzpmtge0bkzzppks6.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%2Fr7qpzpmtge0bkzzppks6.png" alt="Apidog Seedance Teste"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Passos práticos
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Crie um Cenário de Teste&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No módulo Testes do Apidog, crie o cenário "Geração de vídeo Seedance 2.0".&lt;/li&gt;
&lt;li&gt;Defina a variável de ambiente &lt;code&gt;ARK_API_KEY&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Adicione a requisição de envio&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;POST para &lt;code&gt;https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Cabeçalho: &lt;code&gt;Authorization: Bearer {{ARK_API_KEY}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Corpo JSON com modelo e conteúdo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após enviar, extraia o &lt;code&gt;id&lt;/code&gt; do corpo usando JSONPath &lt;code&gt;$.id&lt;/code&gt; e salve como variável &lt;code&gt;TASK_ID&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Adicione processador de Espera&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Processador "Wait" de 30s após extração do ID.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Adicione a consulta em loop&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bloco For (máx 20 iterações):

&lt;ol&gt;
&lt;li&gt;GET para &lt;code&gt;/contents/generations/tasks/{{TASK_ID}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;"Wait" de 10s após GET&lt;/li&gt;
&lt;li&gt;Quebre o loop se &lt;code&gt;$.status == "succeeded"&lt;/code&gt; ou &lt;code&gt;$.status == "failed"&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Adicione asserções&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Após o loop, afirme que:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$.status&lt;/code&gt; é &lt;code&gt;"succeeded"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.content.video_url&lt;/code&gt; não está vazio&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Execute o cenário. O Apidog mostra relatório detalhado de cada etapa, ID extraído, respostas e assertivas finais.&lt;/p&gt;

&lt;p&gt;Você pode importar endpoints Seedance por comando cURL para agilizar a criação do cenário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detalhamento de preços: quanto custa um vídeo de 10 segundos
&lt;/h2&gt;

&lt;p&gt;A cobrança é por uso (tokens):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo de tarefa&lt;/th&gt;
&lt;th&gt;Taxa (por 1M tokens)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T2V / I2V em 1080p&lt;/td&gt;
&lt;td&gt;46 yuans (~US$6,40)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V2V (referência de vídeo)&lt;/td&gt;
&lt;td&gt;28 yuans (~US$3,90)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Exemplos para 1080p:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Duração&lt;/th&gt;
&lt;th&gt;Tokens aprox.&lt;/th&gt;
&lt;th&gt;Custo (T2V/I2V)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5 segundos&lt;/td&gt;
&lt;td&gt;~103.000&lt;/td&gt;
&lt;td&gt;~$0,66 yuan / ~$0,93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 segundos&lt;/td&gt;
&lt;td&gt;~206.000&lt;/td&gt;
&lt;td&gt;~$9,48 yuan / ~$1,32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 segundos&lt;/td&gt;
&lt;td&gt;~309.000&lt;/td&gt;
&lt;td&gt;~$14,21 yuan / ~$1,97&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Contas novas recebem créditos de teste (~8 gerações de 15s). Use 720p no desenvolvimento para economizar tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Erros comuns e correções
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;429 Muitas Requisições&lt;/strong&gt;: Limite de concorrência. Use backoff exponencial (espere 10s, dobre, limite a 60s).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;status: "failed"&lt;/strong&gt;: Prompt violou filtros, imagem corrompida, parâmetros inválidos. Revise arquivos e tente novamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;status: "expired"&lt;/strong&gt;: Tarefa ficou muito tempo na fila. Reenvie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;403 na &lt;code&gt;video_url&lt;/code&gt;&lt;/strong&gt;: URL expirada. Geração antiga (&amp;gt;24h). Reenvie a tarefa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reprodutibilidade com &lt;code&gt;seed&lt;/code&gt;&lt;/strong&gt;: Salve o &lt;code&gt;seed&lt;/code&gt; da resposta e use para tentar gerar o mesmo vídeo novamente.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A API Seedance 2.0 permite automação completa de geração de vídeos avançados. O fluxo POST -&amp;gt; consulta -&amp;gt; download é simples de implementar. Suporte a multimodalidade, áudio nativo e controle de quadros habilita fluxos de trabalho impossíveis via console web.&lt;/p&gt;

&lt;p&gt;Implemente sua cobertura de testes no Apidog antes de ir para produção. O uso de Cenários de Teste identifica problemas de consulta, extração ou expiração de URL antes que impactem os usuários.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perguntas Frequentes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;P: Qual a diferença entre doubao-seedance-2-0-260128 e doubao-seedance-2-0-fast-260128?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O modelo padrão gera vídeos com qualidade superior, indicado para produção. O modelo rápido é útil para prototipagem, com menor qualidade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: Posso usar o Seedance 2.0 fora da China?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sim, mas o endpoint fica em Pequim. Fora da China, haverá maior latência. Confira os termos da Volcengine para restrições regionais.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: Como encadear vários clipes em um vídeo mais longo?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;return_last_frame: true&lt;/code&gt; para obter o último quadro. Passe como quadro inicial da próxima tarefa. Junte os clipes depois.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: A geração de áudio nativa custa mais?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sim, pois gera áudio e vídeo conjuntamente. Espere um aumento modesto em &lt;code&gt;completion_tokens&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: Posso definir um webhook em vez de polling?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sim. Passe &lt;code&gt;callback_url&lt;/code&gt; na requisição POST. A API fará POST para essa URL ao concluir a tarefa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: O que acontece se eu exceder 9 imagens?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A API retorna erro 400. Reduza para 9 ou menos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: O parâmetro seed garante reprodução idêntica?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ajuda a reproduzir a saída, mas não garante identidade se parâmetros ou versão do modelo mudarem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: Como rastrear gastos em várias tarefas?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Leia o campo &lt;code&gt;completion_tokens&lt;/code&gt; de cada resposta, multiplique pela taxa do seu tipo de tarefa e salve num banco de dados próprio. Não há painel integrado na API.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como Usar a API Grok Text to Video: Guia Completo</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Fri, 03 Apr 2026 08:44:33 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/como-usar-a-api-grok-text-to-video-guia-completo-i79</link>
      <guid>https://dev.to/lucas_ferreira/como-usar-a-api-grok-text-to-video-guia-completo-i79</guid>
      <description>&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;p&gt;A API de texto para vídeo Grok transforma prompts de texto em vídeos. Para utilizá-la, envie uma requisição &lt;code&gt;POST /v1/videos/generations&lt;/code&gt;, receba um &lt;code&gt;request_id&lt;/code&gt; imediatamente e consulte &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; até que o status seja &lt;code&gt;"done"&lt;/code&gt;. O modelo utilizado é o &lt;code&gt;grok-imagine-video&lt;/code&gt;, com preços a partir de US$0,05 por segundo em 480p. O SDK Python da xAI gerencia o polling automaticamente.&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 mesmo&lt;/a&gt;
&lt;/p&gt;

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

&lt;p&gt;Em janeiro de 2026, a xAI gerou 1,2 bilhão de vídeos apenas no primeiro mês após o lançamento da API de texto para vídeo Grok (28/01/2026). O modelo liderou o ranking da Artificial Analysis nesse período, comprovando sua robustez em escala.&lt;/p&gt;

&lt;p&gt;Este guia mostra como fazer sua primeira requisição, consultar o resultado, ajustar parâmetros, criar prompts melhores, usar imagens de referência, estender/editar vídeos e decidir quando usar texto para vídeo.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Dica importante:&lt;/strong&gt; A API é assíncrona. Seu frontend precisa lidar com polling para saber quando o vídeo está pronto. O Smart Mock da &lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; permite simular os endpoints de geração e consulta, acelerando o desenvolvimento do frontend antes do backend real.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é a API de texto para vídeo Grok?
&lt;/h2&gt;

&lt;p&gt;A API de texto para vídeo Grok integra o conjunto de geração de mídia da xAI (&lt;code&gt;https://api.x.ai&lt;/code&gt;). Basta enviar um prompt textual para o modelo &lt;code&gt;grok-imagine-video&lt;/code&gt; — ele cria um clipe do zero, sem exigir imagem de origem.&lt;/p&gt;

&lt;p&gt;Além disso, há um endpoint síncrono para geração de imagens (&lt;code&gt;POST /v1/images/generations&lt;/code&gt;, modelo &lt;code&gt;grok-imagine-image&lt;/code&gt;, US$0,02 por imagem), além de operações para estender ou editar vídeos.&lt;/p&gt;

&lt;p&gt;No endpoint de texto para vídeo, só o texto importa: a cena, o movimento e o visual são definidos pelo prompt. Se você quiser animar uma imagem específica, consulte o &lt;a href="http://apidog.com/blog/grok-image-to-video-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia da API de imagem para vídeo Grok&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona a geração de texto para vídeo (padrão assíncrono na prática)
&lt;/h2&gt;

&lt;p&gt;A geração de vídeo é assíncrona devido ao tempo de processamento (segundos a minutos). O fluxo padrão:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Envie um &lt;code&gt;POST&lt;/code&gt; com seu prompt.&lt;/li&gt;
&lt;li&gt;Receba um &lt;code&gt;request_id&lt;/code&gt; imediatamente.&lt;/li&gt;
&lt;li&gt;A geração ocorre nos servidores da xAI.&lt;/li&gt;
&lt;li&gt;Consulte &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; periodicamente.&lt;/li&gt;
&lt;li&gt;Quando o status for &lt;code&gt;"done"&lt;/code&gt;, a resposta traz a URL do vídeo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Seu frontend precisa exibir um estado de carregamento até receber a URL final.&lt;/p&gt;

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

&lt;p&gt;Antes de codificar:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Conta na xAI:&lt;/strong&gt; Cadastre-se em &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Chave de API:&lt;/strong&gt; No console, crie sua chave em "API Keys" e salve-a com segurança. Ela será usada como Bearer Token em todas as requisições.&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;XAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sua_api_key_aqui"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;(Opcional)&lt;/strong&gt; Instale o SDK Python da xAI:&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;xai-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sua primeira requisição de texto para vídeo
&lt;/h2&gt;

&lt;p&gt;Endpoint: &lt;code&gt;POST https://api.x.ai/v1/videos/generations&lt;/code&gt;. Campos obrigatórios: &lt;code&gt;model&lt;/code&gt; e &lt;code&gt;prompt&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usando curl
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/generations &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;$XAI_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": "grok-imagine-video",
    "prompt": "Um golden retriever correndo entre folhas de outono em câmera lenta, iluminação cinematográfica"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resposta imediata:&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;"request_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;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&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;h3&gt;
  
  
  Usando Python (requests)
&lt;/h3&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;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&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;XAI_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.x.ai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;headers&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;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&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="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-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;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;payload&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;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;grok-imagine-video&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;prompt&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;Um golden retriever correndo entre folhas de outono em câmera lenta, iluminação cinematográfica&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;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&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;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;data&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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Geração iniciada. ID da Requisição: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Consultando o resultado do vídeo
&lt;/h2&gt;

&lt;p&gt;Após obter o &lt;code&gt;request_id&lt;/code&gt;, faça polling em &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; até &lt;code&gt;status&lt;/code&gt; ser &lt;code&gt;"done"&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;"processing"&lt;/code&gt;: em geração&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"done"&lt;/code&gt;: vídeo pronto (URL disponível)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"failed"&lt;/code&gt;: erro na geração&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de loop de polling 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;requests&lt;/span&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;os&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;XAI_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.x.ai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;headers&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;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&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="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&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;def&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&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="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&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;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&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="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;data&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="nf"&gt;json&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="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&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&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;progress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;progress&lt;/span&gt;&lt;span class="sh"&gt;"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tentativa &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: status=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, progresso=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;progress&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&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;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;done&lt;/span&gt;&lt;span class="sh"&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;data&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Falha na geração do vídeo: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&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="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;interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TimeoutError&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="s"&gt;Vídeo não pronto após &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; tentativas&lt;/span&gt;&lt;span class="sh"&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;generate_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&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;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&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;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;headers&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-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;application/json&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="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;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;grok-imagine-video&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;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;request_id&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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ID da Requisição: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&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="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video&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;url&lt;/span&gt;&lt;span class="sh"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Vídeo pronto: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video_url&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;return&lt;/span&gt; &lt;span class="n"&gt;video_url&lt;/span&gt;

&lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Um timelapse de um horizonte urbano ao pôr do sol fazendo a transição para a noite, vista aérea&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;p&gt;Exemplo de resposta quando o vídeo está pronto:&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vidgen.x.ai/....mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"respect_moderation"&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="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;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&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;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500000000&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;h2&gt;
  
  
  Usando o SDK Python da xAI
&lt;/h2&gt;

&lt;p&gt;O SDK simplifica o processo — &lt;code&gt;client.video.generate()&lt;/code&gt; já faz o polling e bloqueia até a conclusão.&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;xai_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&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;Client&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;XAI_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;result&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;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&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;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Um golden retriever correndo entre folhas de outono em câmera lenta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;720p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;aspect_ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;URL do Vídeo: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&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="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="s"&gt;Duração: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&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;p&gt;Use o SDK para integração rápida. Para maior controle (intervalo de polling, lógica de retentativa), prefira requests diretas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escrevendo prompts eficazes para vídeo
&lt;/h2&gt;

&lt;p&gt;Prompts detalhados geram melhores resultados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Descrição da cena
&lt;/h3&gt;

&lt;p&gt;Seja específico. Exemplo:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Uma caneca de café de cerâmica branca em uma mesa de madeira ao lado de uma janela molhada pela chuva"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Movimento
&lt;/h3&gt;

&lt;p&gt;Explique o que se move e como:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A câmera orbita lentamente a caneca enquanto o vapor sobe em espiral"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Estilo de câmera
&lt;/h3&gt;

&lt;p&gt;Comandos como "close-up", "plano de acompanhamento", "vista aérea de drone", "câmera na mão", "dolly zoom" funcionam bem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Iluminação e humor
&lt;/h3&gt;

&lt;p&gt;Combine clima e iluminação:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"manhã enevoada, atmosfera melancólica"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Referências de estilo
&lt;/h3&gt;

&lt;p&gt;Cite estilos: "cinemático", "anime", "stop-motion", "documentário", etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Estrutura de prompt eficiente
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Um astronauta solitário flutua pela Estação Espacial Internacional,
com o cabo flutuando atrás dele. A câmera acompanha lentamente
ao lado, mostrando a Terra abaixo. Cinemático, qualidade IMAX,
luz quente do nascer do sol refletindo no visor.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Controlando resolução, duração e proporção
&lt;/h2&gt;

&lt;p&gt;Personalize os parâmetros de saída:&lt;/p&gt;

&lt;h3&gt;
  
  
  Duração
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;1 a 15 segundos (padrão: 6s). Quanto maior, maior o custo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resolução
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"720p"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Opções: &lt;code&gt;"480p"&lt;/code&gt; (padrão) e &lt;code&gt;"720p"&lt;/code&gt;. Use 480p para testes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Proporção de tela
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"aspect_ratio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"9:16"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Proporção&lt;/th&gt;
&lt;th&gt;Melhor uso&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;16:9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Desktop, YouTube, apresentações&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;9:16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TikTok, Reels, mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1:1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Instagram Feed, cartões sociais&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;4:3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Vídeo clássico, apresentações&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3:4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Conteúdo mobile vertical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3:2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Foto padrão&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2:3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fotografia em retrato&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Exemplo completo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/generations &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;$XAI_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": "grok-imagine-video",
    "prompt": "Uma cidade costeira ao amanhecer, ondas quebrando suavemente em uma costa rochosa",
    "duration": 10,
    "resolution": "720p",
    "aspect_ratio": "16:9"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usando imagens de referência para guiar o estilo
&lt;/h2&gt;

&lt;p&gt;O parâmetro &lt;code&gt;reference_images&lt;/code&gt; recebe até 7 URLs de imagem. Elas influenciam a estética do vídeo.&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;"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;"grok-imagine-video"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Uma cidade costeira ao amanhecer, ondas quebrando suavemente em uma costa rochosa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reference_images"&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="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/my-style-reference.jpg"&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="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/color-palette-reference.jpg"&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;Para melhores resultados, use imagens com estética visual coesa.&lt;/p&gt;

&lt;p&gt;Diferencie:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Imagens de referência:&lt;/strong&gt; influenciam estilo (cor, textura).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Imagem para vídeo:&lt;/strong&gt; anima uma imagem de origem, que vira o primeiro frame.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Estendendo e editando vídeos gerados
&lt;/h2&gt;

&lt;p&gt;Dois endpoints extras:&lt;/p&gt;

&lt;h3&gt;
  
  
  Estender um vídeo
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;POST /v1/videos/extensions&lt;/code&gt; — passar o &lt;code&gt;request_id&lt;/code&gt; do vídeo original + novo prompt para gerar sequência adicional.&lt;/p&gt;

&lt;h3&gt;
  
  
  Editar um vídeo
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;POST /v1/videos/edits&lt;/code&gt; — modificar um vídeo existente via prompt textual (alterar estilo, efeitos, etc).&lt;/p&gt;

&lt;p&gt;Ambos seguem o mesmo padrão assíncrono: retornam &lt;code&gt;request_id&lt;/code&gt; e polling para resultado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lendo o custo da resposta da API
&lt;/h2&gt;

&lt;p&gt;No resultado da consulta:&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;"usage"&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;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500000000&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;Converta para dólares dividindo por 10.000.000:&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;cost_in_usd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&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;cost_in_usd_ticks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10_000_000&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="s"&gt;Custo: $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cost_in_usd&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&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="c1"&gt;# Saída: Custo: $0.0500
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Referência de Preços
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resolução&lt;/th&gt;
&lt;th&gt;Preço por segundo&lt;/th&gt;
&lt;th&gt;Clipe de 10s&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;480p&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;720p&lt;/td&gt;
&lt;td&gt;$0.07&lt;/td&gt;
&lt;td&gt;$0.70&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Monitore &lt;code&gt;cost_in_usd_ticks&lt;/code&gt; para construir dashboards de uso sem precisar das APIs de faturamento.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como testar sua API de vídeo Grok com Apidog
&lt;/h2&gt;

&lt;p&gt;O padrão assíncrono exige que o frontend trate três estados: carregando, sucesso e erro. Testar tudo isso com a API real é demorado e caro. O recurso Smart Mock do &lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; resolve esse problema.&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%2Fmit5bu2s8zqtmpzxfpbs.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%2Fmit5bu2s8zqtmpzxfpbs.png" alt="Apidog Mock Example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Caso de uso 1: Smart Mock para frontend
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Simule o endpoint de geração:&lt;/strong&gt;
Crie &lt;code&gt;POST /v1/videos/generations&lt;/code&gt; e defina o schema na Apidog, com campo &lt;code&gt;request_id&lt;/code&gt;. O Smart Mock retorna um UUID fake automaticamente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Exemplo de resposta:&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="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;"request_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;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&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;ol&gt;
&lt;li&gt;
&lt;strong&gt;Simule o endpoint de consulta:&lt;/strong&gt;
Crie &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; com todos os campos (&lt;code&gt;status&lt;/code&gt;, &lt;code&gt;video.url&lt;/code&gt;, etc). Configure mocks customizados para &lt;code&gt;"status": "done"&lt;/code&gt; e uma URL de vídeo fake.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Exemplo de resposta:&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="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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"video"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vidgen.x.ai/mock-video-12345.mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"respect_moderation"&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="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;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"usage"&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;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;400000000&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;Frontenders podem testar todos os estados sem consumir créditos reais.&lt;/p&gt;

&lt;h3&gt;
  
  
  Caso de uso 2: Cenários de Teste para o loop de polling
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adicione requisição de geração:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;POST /v1/videos/generations&lt;/code&gt;, extraia &lt;code&gt;request_id&lt;/code&gt; usando JSONPath.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adicione loop de consulta:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;GET /v1/videos/{{videoRequestId}}&lt;/code&gt; dentro de loop com condição: &lt;code&gt;response.body.status == "done"&lt;/code&gt;. Adicione espera de 5s entre as requisições.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Afirme o resultado:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Após o loop, afirme que &lt;code&gt;$.video.url&lt;/code&gt; não está vazio.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Automatize esses cenários para garantir confiabilidade contínua na sua integração.&lt;/p&gt;

&lt;h2&gt;
  
  
  Texto para vídeo vs imagem para vídeo: quando usar cada um
&lt;/h2&gt;

&lt;p&gt;Ambos usam &lt;code&gt;grok-imagine-video&lt;/code&gt;, mas para usos distintos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use texto para vídeo quando:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Precisa de conteúdo 100% original a partir de um conceito/roteiro&lt;/li&gt;
&lt;li&gt;Quer controle criativo total do modelo&lt;/li&gt;
&lt;li&gt;Usuários digitarão prompts&lt;/li&gt;
&lt;li&gt;Não tem imagem de origem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use imagem para vídeo quando:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quer animar uma foto, ilustração ou arte de marca&lt;/li&gt;
&lt;li&gt;Precisa manter detalhes visuais exatos&lt;/li&gt;
&lt;li&gt;Vai animar uma sequência de imagens relacionadas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Texto para vídeo cria do zero; imagem para vídeo parte de uma imagem. Para detalhes, veja o &lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia da API de imagem para vídeo Grok&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para apps híbridos: se usuário faz upload de imagem, use &lt;code&gt;POST /v1/images/generations&lt;/code&gt;. Se só texto, use &lt;code&gt;POST /v1/videos/generations&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Erros comuns e como corrigir
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;401 Não Autorizado:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verifique se o header Authorization está correto: &lt;code&gt;Bearer SUA_CHAVE_XAI&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Confirme se a chave está ativa&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;429 Muitas Requisições:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Respeite o limite: 60 por minuto, 1 por segundo&lt;/li&gt;
&lt;li&gt;Use delays de 5s no polling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;status: "failed":&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompt rejeitado pela moderação. Veja se &lt;code&gt;respect_moderation&lt;/code&gt; é &lt;code&gt;true&lt;/code&gt; e ajuste o texto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;URL retorna 404:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URLs de vídeo expiram. Baixe o arquivo assim que receber a URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vídeo vazio ou travado:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompts vagos geram vídeos sem movimento. Sempre inclua instruções de movimento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Polling lento:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;720p e durações maiores demoram mais. Para desenvolvimento, use &lt;code&gt;"resolution": "480p"&lt;/code&gt; e clipes curtos.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A API de texto para vídeo Grok permite ir do texto ao vídeo de forma simples: envie o prompt, obtenha o &lt;code&gt;request_id&lt;/code&gt;, faça polling até concluir e recupere o MP4. O fluxo assíncrono é o ponto central do processo. Uma vez automatizado o polling, ajustar os demais parâmetros é simples.&lt;/p&gt;

&lt;p&gt;Para produção, monitore custos via &lt;code&gt;cost_in_usd_ticks&lt;/code&gt; em cada resposta. Simule endpoints com Apidog para acelerar o desenvolvimento frontend e use Cenários de Teste para garantir confiabilidade.&lt;/p&gt;

&lt;p&gt;Experimente o Apidog hoje mesmo para configurar mocks e cenários de teste para a API de vídeo Grok.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Qual nome de modelo devo usar para geração de texto para vídeo?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use &lt;code&gt;grok-imagine-video&lt;/code&gt; no campo &lt;code&gt;model&lt;/code&gt; da requisição &lt;code&gt;POST&lt;/code&gt; para &lt;code&gt;/v1/videos/generations&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quanto tempo leva para gerar um vídeo?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Depende da duração e resolução. Em 480p, clipes curtos podem ficar prontos em menos de 30s. Em 720p e clipes longos, pode levar minutos. Faça polling a cada 5-10s.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Posso gerar vídeos com mais de 15 segundos?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não em uma única requisição (&lt;code&gt;duration&lt;/code&gt; máxima: 15s). Para vídeos maiores, gere um clipe e use &lt;code&gt;POST /v1/videos/extensions&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como baixar o vídeo gerado?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use a URL retornada em &lt;code&gt;result.video.url&lt;/code&gt; e baixe o MP4 imediatamente. A URL é temporária.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que acontece se meu prompt violar moderação?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
O status será &lt;code&gt;"failed"&lt;/code&gt;. Veja o campo &lt;code&gt;respect_moderation&lt;/code&gt;. Ajuste o prompt e tente novamente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Existe nível gratuito?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A xAI cobra por segundo gerado. Não há nível gratuito específico para vídeo, mas consulte &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt; para ofertas de crédito para novas contas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como &lt;code&gt;reference_images&lt;/code&gt; diferem de imagem de origem?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;reference_images&lt;/code&gt; apenas orientam o estilo; imagem de origem é o primeiro frame do vídeo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como testar o loop de polling sem gastar créditos?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use o Smart Mock da &lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para simular endpoints de geração e consulta, com respostas para &lt;code&gt;"processing"&lt;/code&gt; e &lt;code&gt;"done"&lt;/code&gt;. Assim, o frontend funciona sem consumir a API real.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como Usar a API de Imagem para Vídeo da Grok: Guia Passo a Passo</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Fri, 03 Apr 2026 08:39:21 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/como-usar-a-api-de-imagem-para-video-da-grok-guia-passo-a-passo-5473</link>
      <guid>https://dev.to/lucas_ferreira/como-usar-a-api-de-imagem-para-video-da-grok-guia-passo-a-passo-5473</guid>
      <description>&lt;h2&gt;
  
  
  Em Resumo
&lt;/h2&gt;

&lt;p&gt;A API Grok de imagem para vídeo utiliza o modelo &lt;code&gt;grok-imagine-video&lt;/code&gt; para animar uma imagem estática em um clipe de vídeo. Basta enviar um POST com a URL da sua imagem, um prompt e configurações para &lt;code&gt;https://api.x.ai/v1/videos/generations&lt;/code&gt;. O retorno inclui um &lt;code&gt;request_id&lt;/code&gt; para você consultar (polling) via &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; até que o &lt;code&gt;status&lt;/code&gt; seja &lt;code&gt;"done"&lt;/code&gt;. A geração leva de 1 a 15 segundos de vídeo, com preço a partir de US$ 0,05/seg para 480p.&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;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Em 28 de janeiro de 2026, a xAI lançou o modelo &lt;code&gt;grok-imagine-video&lt;/code&gt; para acesso público via API. No primeiro mês, o modelo gerou 1,2 bilhão de vídeos, liderando o ranking de texto para vídeo da Artificial Analysis. Com a funcionalidade de imagem para vídeo, você envia uma foto e um prompt descritivo via API, e recebe um vídeo animado pronto para download em MP4.&lt;/p&gt;

&lt;p&gt;O fluxo assíncrono, onde você envia a tarefa e faz polling até a conclusão, exige testes reais. A integração só está finalizada quando o seu loop de polling trata corretamente os estados &lt;code&gt;"processing"&lt;/code&gt;, &lt;code&gt;"done"&lt;/code&gt; e &lt;code&gt;"failed"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Os Cenários de Teste do Apidog resolvem esse fluxo: encadeie o POST para &lt;code&gt;/v1/videos/generations&lt;/code&gt;, extraia o &lt;code&gt;request_id&lt;/code&gt;, faça polling até &lt;code&gt;status == "done"&lt;/code&gt;, e afirme que a URL do vídeo foi retornada. Siga o passo a passo de teste mais abaixo neste guia.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é a API Grok de imagem para vídeo?
&lt;/h2&gt;

&lt;p&gt;A API Grok de imagem para vídeo é parte do produto de geração de vídeo da xAI, operando com o modelo &lt;code&gt;grok-imagine-video&lt;/code&gt;. Ela recebe uma imagem que se torna o quadro inicial do vídeo. O modelo analisa a imagem e o prompt de texto, gerando movimento natural na cena.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST https://api.x.ai/v1/videos/generations
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Autenticação:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer SUA_CHAVE_API_XAI
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sua chave está disponível no &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console da xAI&lt;/a&gt;. O mesmo endpoint suporta texto para vídeo (sem o parâmetro &lt;code&gt;image&lt;/code&gt;), extensão e edição de vídeo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona o processo de imagem para vídeo
&lt;/h2&gt;

&lt;p&gt;O parâmetro &lt;code&gt;image&lt;/code&gt; define o &lt;strong&gt;primeiro quadro&lt;/strong&gt; do vídeo. O modelo parte dessa imagem (não a substitui) e prevê como ela se moveria conforme o prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Imagem: lago ao nascer do sol&lt;br&gt;&lt;br&gt;
Prompt: &lt;code&gt;"ondulações suaves se espalham pela água enquanto a névoa matinal se move"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O primeiro quadro será a foto enviada; os quadros seguintes trazem a animação conforme o prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use imagem para vídeo quando:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Precisa animar fotos reais de produtos, paisagens ou retratos.&lt;/li&gt;
&lt;li&gt;Quer manter identidade visual no quadro inicial.&lt;/li&gt;
&lt;li&gt;Deseja movimento realista a partir de uma cena específica.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Prefira texto para vídeo quando:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Não tem imagem de referência.&lt;/li&gt;
&lt;li&gt;Quer liberdade total na composição.&lt;/li&gt;
&lt;li&gt;Precisa de iteração rápida.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;p&gt;Antes de começar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Conta xAI&lt;/strong&gt; no &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chave de API&lt;/strong&gt; do console xAI (mantenha em variável de ambiente)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python 3.8+&lt;/strong&gt; ou &lt;strong&gt;Node.js 18+&lt;/strong&gt; (exemplos para ambos)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Imagem publicamente acessível&lt;/strong&gt; (URL) ou codificada em base64 (data URI)&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%2Fozcnsdoclf1obpc6q6w3.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%2Fozcnsdoclf1obpc6q6w3.png" alt="Pré-requisitos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Defina a variável de ambiente:&lt;/strong&gt;&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;XAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sua_chave_aqui"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Instale o SDK Python:&lt;/strong&gt;&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;xai-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para HTTP direto, use apenas &lt;code&gt;requests&lt;/code&gt; (Python) ou &lt;code&gt;fetch&lt;/code&gt; (Node.js).&lt;/p&gt;

&lt;h2&gt;
  
  
  Fazendo a primeira requisição de imagem para vídeo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Usando curl
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/generations &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;$XAI_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": "grok-imagine-video",
    "prompt": "Gentle waves move across the surface, morning mist rises slowly",
    "image": {
      "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/24701-nature-natural-beauty.jpg/1280px-24701-nature-natural-beauty.jpg"
    },
    "duration": 6,
    "resolution": "720p",
    "aspect_ratio": "16:9"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resposta esperada:&lt;/strong&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;"request_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;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&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;A geração é assíncrona. Use o &lt;code&gt;request_id&lt;/code&gt; para polling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usando Python (requisições diretas)
&lt;/h3&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;import&lt;/span&gt; &lt;span class="n"&gt;requests&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;XAI_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;payload&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;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;grok-imagine-video&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;prompt&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;Gentle waves move across the surface, morning mist rises slowly&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&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;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://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/24701-nature-natural-beauty.jpg/1280px-24701-nature-natural-beauty.jpg&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;duration&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resolution&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;720p&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;aspect_ratio&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;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;headers&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;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&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="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-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;application/json&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;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&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.x.ai/v1/videos/generations&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="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;data&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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Job started: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usando uma imagem base64
&lt;/h3&gt;

&lt;p&gt;Se a imagem não estiver pública:&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;base64&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my_image.jpg&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;rb&lt;/span&gt;&lt;span class="sh"&gt;"&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;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;encoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;payload&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&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&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;url&lt;/span&gt;&lt;span class="sh"&gt;"&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="s"&gt;data:image/jpeg;base64,&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;encoded&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Consultando o resultado (Polling)
&lt;/h2&gt;

&lt;p&gt;A geração é assíncrona. Faça polling do status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://api.x.ai/v1/videos/{request_id}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Status possíveis:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Significado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"processing"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Vídeo sendo gerado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"done"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Vídeo pronto, URL disponível&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"failed"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Erro na geração&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Exemplo de resposta:&lt;/strong&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vidgen.x.ai/....mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&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;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&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;h3&gt;
  
  
  Loop de polling em Python
&lt;/h3&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai/v1/videos/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;headers&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;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&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="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&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;while&lt;/span&gt; &lt;span class="bp"&gt;True&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;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;data&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="nf"&gt;json&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="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&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&lt;/span&gt;&lt;span class="sh"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | Progress: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;progress&lt;/span&gt;&lt;span class="sh"&gt;'&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="si"&gt;}&lt;/span&gt;&lt;span class="s"&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;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;done&lt;/span&gt;&lt;span class="sh"&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;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video generation failed for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&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="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;interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Uso
&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&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="s"&gt;Video URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;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="sh"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Duration: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;duration&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;s&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;p&gt;&lt;strong&gt;Dica:&lt;/strong&gt; Use intervalo de polling ≥5s. A API limita a 60 requisições/minuto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usando o SDK Python da xAI
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;xai-sdk&lt;/code&gt; faz o polling automaticamente:&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;xai_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&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;Client&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;XAI_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;video&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;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&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;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gentle waves move across the surface, morning mist rises slowly&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;image&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;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/landscape.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;720p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;aspect_ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&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="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="s"&gt;Duration: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&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;p&gt;Prefira SDK para código limpo. Use HTTP direto para controle total de polling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controlando resolução, duração e proporção da tela
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Duração
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aceita 1 a 15 segundos. Quanto maior, maior o custo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resolução
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Valor&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"480p"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Padrão. Mais barato, mais rápido&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"720p"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Alta qualidade. US$ 0,07/seg&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"720p"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Proporção da tela (aspect_ratio)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Valor&lt;/th&gt;
&lt;th&gt;Uso&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"16:9"&lt;/td&gt;
&lt;td&gt;Padrão, paisagens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"9:16"&lt;/td&gt;
&lt;td&gt;Stories, vertical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"1:1"&lt;/td&gt;
&lt;td&gt;Instagram, miniatura&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"4:3"&lt;/td&gt;
&lt;td&gt;Fotografia, apresentação&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"3:4"&lt;/td&gt;
&lt;td&gt;Retrato&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"3:2"&lt;/td&gt;
&lt;td&gt;Fotografia padrão&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"2:3"&lt;/td&gt;
&lt;td&gt;Retrato alto&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Se enviar uma imagem, o padrão é a proporção da imagem. Defina explicitamente para cortar/padronizar.&lt;/p&gt;




&lt;h2&gt;
  
  
  Usando imagens de referência para estilo
&lt;/h2&gt;

&lt;p&gt;O parâmetro &lt;code&gt;reference_images&lt;/code&gt; é um array de até 7 imagens para guiar &lt;strong&gt;estilo, conteúdo ou contexto&lt;/strong&gt;. Não são quadros do vídeo, apenas referência visual.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo de uso:&lt;/strong&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;"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;"grok-imagine-video"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A product rotating slowly on a clean white surface"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"image"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/product-shot.jpg"&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;"reference_images"&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="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/brand-style-reference-1.jpg"&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="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/lighting-reference.jpg"&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;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"720p"&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;Você pode omitir &lt;code&gt;image&lt;/code&gt; e usar apenas &lt;code&gt;reference_images&lt;/code&gt; para guiar um texto para vídeo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estendendo e editando vídeos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Estender um vídeo
&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 http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /v1/videos/extensions
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione segundos a um vídeo existente (máx. 15s por chamada):&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;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/extensions &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;$XAI_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": "grok-imagine-video",
    "video_id": "seu_request_id_original",
    "prompt": "The mist continues to lift as sunlight breaks through",
    "duration": 5
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Faça polling do novo &lt;code&gt;request_id&lt;/code&gt; normalmente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Editar um vídeo
&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 http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /v1/videos/edits
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Altere conteúdo ou animação guiado por prompt:&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;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/edits &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;$XAI_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": "grok-imagine-video",
    "video_id": "seu_request_id_original",
    "prompt": "Change the sky to a dramatic sunset with deep orange tones"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Extensões e edições seguem o mesmo padrão assíncrono de polling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detalhes de preços: quanto custa um vídeo de 10 segundos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Componente&lt;/th&gt;
&lt;th&gt;Custo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Imagem de entrada&lt;/td&gt;
&lt;td&gt;US$ 0,002 por imagem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saída 480p&lt;/td&gt;
&lt;td&gt;US$ 0,05/seg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saída 720p&lt;/td&gt;
&lt;td&gt;US$ 0,07/seg&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;10s em 720p: Imagem = US$ 0,002; Saída = 10×US$ 0,07 = US$ 0,70.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Total:&lt;/strong&gt; US$ 0,702&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;6s em 480p: Imagem = US$ 0,002; Saída = 6×US$ 0,05 = US$ 0,30.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Total:&lt;/strong&gt; US$ 0,302&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A cobrança da imagem se aplica em toda geração, mesmo para a mesma imagem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como testar sua integração com a API Grok usando Apidog
&lt;/h2&gt;

&lt;p&gt;O padrão assíncrono exige testar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Requisição POST retorna &lt;code&gt;request_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Polling trata status &lt;code&gt;"processing"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Resposta final tem &lt;code&gt;status == "done"&lt;/code&gt; e URL de vídeo válida&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Cenários de Teste do Apidog&lt;/strong&gt; permitem automatizar esse fluxo:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passo 1:&lt;/strong&gt; Crie novo cenário de teste&lt;br&gt;&lt;br&gt;
No Apidog, acesse Testes &amp;gt; Novo cenário: "Fluxo assíncrono de imagem para vídeo Grok".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passo 2:&lt;/strong&gt; Adicione a requisição de geração  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL: &lt;code&gt;https://api.x.ai/v1/videos/generations&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Método: POST&lt;/li&gt;
&lt;li&gt;Header: &lt;code&gt;Authorization: Bearer {{xai_api_key}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Corpo:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&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;"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;"grok-imagine-video"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Gentle mist rises from the water as light filters through the trees"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"image"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/your-test-image.jpg"&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;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"480p"&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;&lt;strong&gt;Passo 3:&lt;/strong&gt; Extraia o &lt;code&gt;request_id&lt;/code&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Processador: Extrair Variável&lt;/li&gt;
&lt;li&gt;Nome: &lt;code&gt;video_request_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Origem: Corpo da resposta&lt;/li&gt;
&lt;li&gt;JSONPath: &lt;code&gt;$.request_id&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Passo 4:&lt;/strong&gt; Loop de polling  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Processador: Loop For&lt;/li&gt;
&lt;li&gt;Dentro do loop:

&lt;ul&gt;
&lt;li&gt;GET &lt;code&gt;https://api.x.ai/v1/videos/{{video_request_id}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Extrair variável: &lt;code&gt;video_status&lt;/code&gt; (&lt;code&gt;$.status&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Esperar: 5000ms&lt;/li&gt;
&lt;li&gt;Condição de parada: &lt;code&gt;{{video_status}} == "done"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Passo 5:&lt;/strong&gt; Afirmação da URL  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GET final&lt;/li&gt;
&lt;li&gt;Asserção: &lt;code&gt;$.video.url&lt;/code&gt; não está vazio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rodando o cenário&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Clique em Executar para rodar o fluxo. O Apidog executa POST, extrai ID, faz polling e verifica a URL do vídeo. O relatório mostra status e tempo de cada etapa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integre ao CI/CD:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--scenario&lt;/span&gt; grok-video-async-flow &lt;span class="nt"&gt;--env&lt;/span&gt; production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Erros comuns e soluções
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;401 Não Autorizado:&lt;/strong&gt; Cheque o header &lt;code&gt;Authorization&lt;/code&gt; e a chave no console xAI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;422 Entidade Não Processável:&lt;/strong&gt; Verifique se o corpo está correto, prompt não vazio, e imagem acessível.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Imagem não acessível:&lt;/strong&gt; Use uma URL pública ou base64; evite localhost e URLs privadas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status travado em "processing":&lt;/strong&gt; Pode levar até alguns minutos. Se passar de 10 minutos, tente novamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limite de taxa 429:&lt;/strong&gt; Respeite 60 req/minuto, 1 req/segundo. Use sleep(1) no polling paralelo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upload base64 rejeitado:&lt;/strong&gt; Confirme prefixo do data URI (ex: &lt;code&gt;data:image/jpeg;base64,&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aspect ratio incompatível:&lt;/strong&gt; Se diferente da imagem, pode haver corte/barras pretas. Ajuste para corresponder.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A API Grok de imagem para vídeo permite transformar fotos em clipes animados via POST + polling, baixando o MP4 ao final. O modelo &lt;code&gt;grok-imagine-video&lt;/code&gt; liderou em janeiro de 2026, com mais de 1 bilhão de vídeos gerados. O polling assíncrono é o maior desafio; use Cenários de Teste do Apidog para garantir robustez na integração (extração de variável, loop, asserção de URL).&lt;/p&gt;

&lt;p&gt;Comece a construir sua integração com Apidog gratuitamente. Não é necessário cartão de crédito.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ (Perguntas Frequentes)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Qual modelo utilizar?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;grok-imagine-video&lt;/code&gt; no campo &lt;code&gt;model&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Diferença entre &lt;code&gt;image&lt;/code&gt; e &lt;code&gt;reference_images&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;image&lt;/code&gt;: define o primeiro quadro.&lt;br&gt;&lt;br&gt;
&lt;code&gt;reference_images&lt;/code&gt;: guia estilo/tema, não é quadro do vídeo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tempo de geração?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
6s em 480p: 1~3 min.&lt;br&gt;&lt;br&gt;
15s em 720p: 4~8 min.&lt;br&gt;&lt;br&gt;
Poll a cada 5s.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Posso usar imagem local?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim, codifique como base64: &lt;code&gt;data:image/jpeg;base64,{bytes}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que acontece sem &lt;code&gt;aspect_ratio&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Com imagem, usa proporção da imagem. Sem imagem, padrão é &lt;code&gt;16:9&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preço de 10s em 720p?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Imagem: US$ 0,002; Saída: 10×US$ 0,07 = US$ 0,70.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Total:&lt;/strong&gt; US$ 0,702.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limites de taxa?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
60 requisições/minuto, 1 por segundo (POST e GET combinados).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Posso estender vídeos além de 15s?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim, usando &lt;code&gt;POST /v1/videos/extensions&lt;/code&gt; e múltiplas chamadas, sempre via polling.&lt;/p&gt;




&lt;p&gt;Links para &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; mantidos conforme solicitado.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Quanto custa a API SMS da Bird em 2026? Preços e custos</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Fri, 03 Apr 2026 07:09:24 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/quanto-custa-a-api-sms-da-bird-em-2026-precos-e-custos-12nn</link>
      <guid>https://dev.to/lucas_ferreira/quanto-custa-a-api-sms-da-bird-em-2026-precos-e-custos-12nn</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;A API Bird SMS começa em &lt;strong&gt;$0,00331 por mensagem enviada nos EUA&lt;/strong&gt; e &lt;strong&gt;$0,003 por mensagem recebida nos EUA&lt;/strong&gt;. É um dos preços iniciais mais baixos entre os principais provedores de API de SMS. Você pode usar o plano gratuito para testar com até 5 SMS/dia antes de se comprometer. O plano Pro, por $49/mês, inclui 1.000 créditos de SMS.&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;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;A MessageBird virou Bird em 2023, trazendo um foco maior em comunicação omnichannel com IA: SMS, WhatsApp, e-mail e voz em um só lugar. O modelo de precificação é transparente, com tarifas pay-as-you-go que deixam o custo base de SMS da Bird abaixo de Twilio, Vonage e outros grandes players.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Se você está construindo uma integração SMS, precisa de dados de precificação atualizados e uma forma ágil de testar suas chamadas de API antes de ir para produção. 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; cobre ambos: projete requisições, rode cenários de teste e valide respostas sem codar nada extra. Teste gratuitamente e valide sua integração Bird SMS em poucos minutos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Este artigo mostra em detalhes quanto custa o Bird SMS em 2025 e 2026, o que pode aumentar sua fatura e como ele se compara a alternativas do mercado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visão geral de preços do Bird SMS
&lt;/h2&gt;

&lt;p&gt;A precificação do Bird para SMS tem duas partes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Taxa de assinatura do plano de plataforma&lt;/strong&gt; (mensal)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Taxa por mensagem&lt;/strong&gt; (pay-as-you-go além do plano)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Os planos são:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plano&lt;/th&gt;
&lt;th&gt;Custo mensal&lt;/th&gt;
&lt;th&gt;SMS incluídos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Grátis&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;5 SMS/dia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$49&lt;/td&gt;
&lt;td&gt;1.000 SMS/mês&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Empresarial&lt;/td&gt;
&lt;td&gt;Personalizado&lt;/td&gt;
&lt;td&gt;Volume personalizado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Se passar do limite do plano, você paga por mensagem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SMS enviados (EUA)&lt;/strong&gt;: $0,00331 por mensagem&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SMS recebidos (EUA)&lt;/strong&gt;: $0,003 por mensagem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os preços de CRM/Automação de Marketing aparecem em EUR na página de taxas detalhadas, mas os valores em USD aqui são para o nível de API/desenvolvedor. Sempre confira a tabela atualizada em &lt;a href="https://bird.com/en/pricing/sms" rel="noopener noreferrer"&gt;bird.com/en/pricing/sms&lt;/a&gt;, porque taxas de operadora e câmbio podem variar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detalhes de preços: SMS, MMS, WhatsApp e e-mail
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SMS
&lt;/h3&gt;

&lt;p&gt;O SMS de saída dos EUA custa $0,00331/mensagem. Essa é a taxa base da infraestrutura da Bird, que conecta direto a operadoras em 150+ países. Os valores mudam bastante dependendo do país. Exemplos (aproximados):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;País&lt;/th&gt;
&lt;th&gt;Taxa de envio&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Estados Unidos&lt;/td&gt;
&lt;td&gt;~$0.00331&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reino Unido&lt;/td&gt;
&lt;td&gt;~€0.036&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Austrália&lt;/td&gt;
&lt;td&gt;~€0.009&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alemanha&lt;/td&gt;
&lt;td&gt;~€0.056&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Índia&lt;/td&gt;
&lt;td&gt;varia por rota&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brasil&lt;/td&gt;
&lt;td&gt;~€0.047&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Atenção:&lt;/strong&gt; Mensagens nos EUA e Canadá têm taxas extras de operadora (10DLC/toll-free), cobradas além do valor base.&lt;/p&gt;

&lt;h3&gt;
  
  
  MMS
&lt;/h3&gt;

&lt;p&gt;MMS (mensagens com imagem) custa mais caro que SMS. Suporte a MMS existe para números dos EUA/Canadá. O valor gira em torno de 3x a 5x o SMS, dependendo do plano. Consulte &lt;a href="https://bird.com/en/pricing/sms" rel="noopener noreferrer"&gt;bird.com/en/pricing/sms&lt;/a&gt; para tarifas MMS por país.&lt;/p&gt;

&lt;h3&gt;
  
  
  WhatsApp
&lt;/h3&gt;

&lt;p&gt;No WhatsApp, a cobrança tem dois componentes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Taxa de processamento Bird&lt;/strong&gt; (por 1.000 mensagens):&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;| Volume           | Taxa por 1.000 mensagens |&lt;br&gt;
   |------------------|-------------------------|&lt;br&gt;
   | 1 a 1.000        | $0.001                  |&lt;br&gt;
   | 1.001 a 100.000  | $0.005                  |&lt;br&gt;
   | 100.001 a 500.000| $0.0045                 |&lt;br&gt;
   | 500.001+         | $0.004                  |&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Taxa de repasse Meta&lt;/strong&gt; (por conversa, varia por país/tipo):&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Marketing: $0,0250&lt;/li&gt;
&lt;li&gt;Utilidade: $0,0034&lt;/li&gt;
&lt;li&gt;Autenticação: $0,0034&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Bird repassa as taxas da Meta sem acréscimo.&lt;/p&gt;

&lt;h3&gt;
  
  
  E-mail
&lt;/h3&gt;

&lt;p&gt;O envio de e-mails via API começa em $0,001 por mensagem para volumes baixos, reduzindo conforme o volume cresce. O plano Pro já traz 10.000 e-mails/mês. É o canal mais barato da plataforma.&lt;/p&gt;

&lt;h3&gt;
  
  
  Voz
&lt;/h3&gt;

&lt;p&gt;O preço da API de Voz é por uso e muda por país. Chamadas de saída dos EUA custam entre $0,013–$0,015/minuto. Chamadas de entrada são um pouco mais baratas. Para grandes volumes, negocie diretamente com vendas.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que afeta sua conta da Bird
&lt;/h2&gt;

&lt;p&gt;Veja os principais fatores que influenciam o custo final:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. País e roteamento da operadora
&lt;/h3&gt;

&lt;p&gt;O SMS nos EUA custa $0,00331, mas enviar para Alemanha (~€0,056), Bangladesh (~€0,208) ou Burundi (~€0,269) pode ficar 10-80x mais caro. Sempre consulte a tabela de preços por país antes de planejar envios internacionais.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tipo de número
&lt;/h3&gt;

&lt;p&gt;O tipo de número afeta o custo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Códigos longos (10DLC):&lt;/strong&gt; Números padrão EUA. Exigem registro de marca/campanha pelo The Campaign Registry (TCR).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Códigos curtos:&lt;/strong&gt; De 5-6 dígitos, throughput maior. Aluguel mensal elevado ($500–$1.000/mês).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Toll-free:&lt;/strong&gt; Intermediário, custo mensal baixo, throughput moderado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O aluguel do número é cobrado além das mensagens.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Comprimento da mensagem e codificação
&lt;/h3&gt;

&lt;p&gt;SMS padrão = 160 caracteres (GSM-7). Se passar disso, é segmentado e cada segmento é cobrado. Caracteres Unicode (emojis, acentos, scripts não latinos) limitam para 70 caracteres por segmento. Um emoji em mensagem longa pode gerar 3 cobranças em vez de 2.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Combinação de canais
&lt;/h3&gt;

&lt;p&gt;Se usar fallback via WhatsApp quando SMS falhar, você terá cobranças de WhatsApp. O Flow Builder facilita esses fluxos, mas simule os custos antes de ativar.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Volume
&lt;/h3&gt;

&lt;p&gt;A Bird não publica descontos por volume para SMS, mas o plano Enterprise oferece tarifas sob consulta para grandes volumes. Negocie conforme a necessidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custos e taxas ocultos
&lt;/h2&gt;

&lt;p&gt;Apesar do discurso de preços transparentes, fique atento a itens que podem aumentar a conta:&lt;/p&gt;

&lt;h3&gt;
  
  
  Taxas de operadora dos EUA (10DLC)
&lt;/h3&gt;

&lt;p&gt;O sistema 10DLC exige:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Registro de marca:&lt;/strong&gt; Taxa única ($4–$44)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registro de campanha:&lt;/strong&gt; Mensal (~$10/mês/campanha)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sobretaxa por mensagem:&lt;/strong&gt; Centavos extras por mensagem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses valores são definidos pelas operadoras, não pelo Bird.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aluguel de número de telefone
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Códigos longos (EUA):&lt;/strong&gt; $1–$2/mês&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Toll-free:&lt;/strong&gt; $2–$3/mês&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Códigos curtos:&lt;/strong&gt; $500–$1.000/mês&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Webhooks de entrada e processamento
&lt;/h3&gt;

&lt;p&gt;Receber SMS ativa a cobrança de entrada ($0,003/mensagem nos EUA). Se usar automações de opt-out ou palavras-chave, cada resposta conta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Assinatura da plataforma
&lt;/h3&gt;

&lt;p&gt;O plano Pro ($49/mês) é fixo. O excedente é cobrado por mensagem. Em alto volume, os 1.000 SMS incluídos podem ser pouca coisa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como a Bird se compara às alternativas
&lt;/h2&gt;

&lt;p&gt;Comparativo das taxas de SMS de saída nos EUA:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provedor&lt;/th&gt;
&lt;th&gt;SMS saída EUA&lt;/th&gt;
&lt;th&gt;SMS entrada EUA&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;strong&gt;Bird&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0,00331&lt;/td&gt;
&lt;td&gt;$0,003&lt;/td&gt;
&lt;td&gt;Taxa base mais baixa; plataforma omnichannel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;$0,0079&lt;/td&gt;
&lt;td&gt;$0,0079&lt;/td&gt;
&lt;td&gt;Base mais alta; ecossistema vasto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telnyx&lt;/td&gt;
&lt;td&gt;~$0,004&lt;/td&gt;
&lt;td&gt;~$0,001&lt;/td&gt;
&lt;td&gt;Competitiva; conexão direta com operadora&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plivo&lt;/td&gt;
&lt;td&gt;$0,0055&lt;/td&gt;
&lt;td&gt;$0,0005&lt;/td&gt;
&lt;td&gt;Menor entrada; plataforma mais simples&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A Bird lidera no custo base por mensagem de saída nos EUA. Twilio cobra mais que o dobro, mas oferece descontos em altíssimo volume. Telnyx é competitiva, com modelo direto operador-cliente. Bird se destaca para quem precisa SMS, WhatsApp e e-mail integrados e automação em uma única plataforma.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como começar com a Bird
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Crie uma conta gratuita:&lt;/strong&gt; Acesse &lt;a href="https://bird.com" rel="noopener noreferrer"&gt;bird.com&lt;/a&gt;. O plano gratuito libera 5 SMS/dia sem cartão de crédito.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registre sua marca/campanha:&lt;/strong&gt; Pelo painel da Bird, registre-se para conformidade 10DLC. O processo leva 1–3 dias úteis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Obtenha um número de telefone:&lt;/strong&gt; Provisione um número de código longo via API de Números ou painel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faça sua primeira chamada de API:&lt;/strong&gt; Use a API REST (JSON). Exemplo básico de envio via &lt;code&gt;curl&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://rest.bird.com/messages"&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;"Authorization: AccessKey SUA_CHAVE_DE_API"&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;'{
       "originator": "SEU_NUMERO",
       "recipients": ["+15551234567"],
       "body": "Seu código de verificação: 123456"
     }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A documentação completa (&lt;a href="https://docs.bird.com" rel="noopener noreferrer"&gt;docs.bird.com&lt;/a&gt;) cobre autenticação, SDKs (Node.js, Python, PHP, Go, Java, Ruby) e configuração de webhooks.&lt;/p&gt;

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

&lt;p&gt;A Bird SMS API oferece a menor taxa base entre os principais provedores: $0,00331 por mensagem enviada nos EUA. O plano gratuito permite testar sem cartão de crédito. O plano Pro ($49/mês) atende equipes que estão começando, com 1.000 SMS/mês inclusos.&lt;/p&gt;

&lt;p&gt;Fique atento a custos fora do preço por mensagem: taxas de operadora 10DLC, aluguel de número e tarifas internacionais (que podem ser 50x maiores que EUA). Modele seu custo desde o início.&lt;/p&gt;

&lt;p&gt;Se for avaliar a Bird, 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; para testar a integração ponta a ponta antes da produção. Ele cuida da montagem de requisições, variáveis de ambiente, encadeamento de testes e validações, tudo em um único lugar.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Qual é o preço por mensagem da API Bird SMS nos EUA?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
$0,00331 por SMS enviado; $0,003 por SMS recebido (nível API). Taxas adicionais de operadora (10DLC) se aplicam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bird é o mesmo que MessageBird?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim. MessageBird foi renomeada para Bird em 2023. A empresa existe desde 2011 (Holanda) e atende grandes clientes. Algumas documentações ainda referenciam MessageBird.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Bird cobra por SMS de entrada?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim, $0,003 por mensagem de entrada nos EUA. Respostas de opt-out e palavras-chave também contam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qual é o plano gratuito da Bird?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Inclui 5 SMS/dia, 10 e-mails/dia e 15 mensagens de agente IA/dia. API pública, sem cartão de crédito. Ideal para testar antes do upgrade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como o preço da Bird SMS se compara ao Twilio?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Bird: $0,00331 (saída EUA); Twilio: $0,0079. Para 100.000 mensagens, Bird = $331; Twilio = $790 (preços base). Twilio pode dar descontos em grandes volumes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Existem taxas ocultas no Bird SMS?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim: taxas de registro de marca/campanha 10DLC, sobretaxas de operadora por mensagem, aluguel de número ($1–$2/mês), tarifas internacionais mais altas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como testar a API Bird SMS sem enviar mensagens reais?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use o recurso Smart Mock 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; para simular respostas da API Bird durante o desenvolvimento. Também é possível enviar para número verificado usando sandbox da Bird. No Apidog, você pode encadear requisições e validar campos de resposta sem tocar em produção.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Preço SMS Twilio API: Análise Completa de Custos para 2026</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Fri, 03 Apr 2026 03:56:36 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/preco-sms-twilio-api-analise-completa-de-custos-para-2026-26c7</link>
      <guid>https://dev.to/lucas_ferreira/preco-sms-twilio-api-analise-completa-de-custos-para-2026-26c7</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SMS de código longo dos EUA (saída e entrada): &lt;strong&gt;$0,0083 por mensagem&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;MMS de saída: &lt;strong&gt;$0,022 por mensagem&lt;/strong&gt;; MMS de entrada: &lt;strong&gt;$0,0165 por mensagem&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;SMS gratuito (toll-free): &lt;strong&gt;$0,0083 por mensagem&lt;/strong&gt; mais sobretaxas da operadora&lt;/li&gt;
&lt;li&gt;Aluguel de código curto: &lt;strong&gt;$1.000/mês&lt;/strong&gt; para um código aleatório; &lt;strong&gt;$1.500/mês&lt;/strong&gt; para um código personalizado (vanity)&lt;/li&gt;
&lt;li&gt;Registro de marca 10DLC: &lt;strong&gt;$4,50 taxa única&lt;/strong&gt; (atualizado em agosto de 2025); campanhas de &lt;strong&gt;$1,50 a $10/mês&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Número de telefone (código longo): &lt;strong&gt;$1,15/mês&lt;/strong&gt;; gratuito (toll-free): &lt;strong&gt;$2,15/mês&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;As taxas da operadora se somam a todos os preços base&lt;/li&gt;
&lt;li&gt;Descontos por volume são aplicados automaticamente a partir de 150.000 mensagens por mês&lt;/li&gt;
&lt;li&gt;Teste gratuito disponível; não é necessário cartão de crédito para começar&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Twilio é a API de SMS padrão para a maioria das equipes de desenvolvedores. Sua documentação é completa, o tempo de atividade é confiável e a API REST é bem projetada. Mas, uma vez que você passa de um projeto paralelo para um aplicativo em produção, a fatura cresce rapidamente. Você não está pagando um preço único por mensagem. Você está pagando a taxa base do Twilio, uma taxa de operadora, uma taxa de número de telefone e, possivelmente, os custos de registro 10DLC adicionais.&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;Dica prática&lt;/strong&gt;: Antes de construir sua integração de SMS, teste-a adequadamente. 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; permite criar cenários de teste automatizados para validar respostas do webhook do Twilio conforme sua especificação OpenAPI. Confirme códigos de status, valide schemas de resposta e rode testes de contrato no CI/CD. Experimente o Apidog gratuitamente para garantir seus fluxos de SMS antes de irem para produção.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Este artigo detalha cada item na precificação do Twilio. Entenda o que compõe sua fatura, pontos fáceis de passar despercebidos e compare com alternativas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visão geral dos preços de SMS do Twilio
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.twilio.com/en-us/pricing/messaging" rel="noopener noreferrer"&gt;Twilio utiliza um modelo de preços pay-as-you-go (pague pelo que usar)&lt;/a&gt;. Você paga por segmento de mensagem, por número de telefone/mês e por recursos opcionais ou registros. Não há contratos ou mínimos obrigatórios, exceto se negociar desconto por uso comprometido.&lt;/p&gt;

&lt;p&gt;Taxa base para SMS nos EUA (código longo): &lt;strong&gt;$0,0083 por segmento de mensagem&lt;/strong&gt; (entrada e saída). Mas taxas de operadora, aluguel de número e registro de conformidade são adicionados a cada mês.&lt;/p&gt;

&lt;p&gt;Descontos por volume são automáticos a partir de 150.000 mensagens/mês por tipo de número.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detalhes da precificação: SMS, MMS, números gratuitos e códigos curtos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SMS de código longo (números de 10 dígitos)
&lt;/h3&gt;

&lt;p&gt;Códigos longos são os números padrão de 10 dígitos para mensagens A2P nos EUA.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo de mensagem&lt;/th&gt;
&lt;th&gt;Preço por segmento&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SMS de saída&lt;/td&gt;
&lt;td&gt;$0,0083&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS de entrada&lt;/td&gt;
&lt;td&gt;$0,0083&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMS de saída&lt;/td&gt;
&lt;td&gt;$0,022&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMS de entrada&lt;/td&gt;
&lt;td&gt;$0,0165&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Atenção ao cálculo:&lt;/strong&gt; O Twilio cobra por &lt;strong&gt;segmento de mensagem&lt;/strong&gt; (não por mensagem). Um segmento SMS padrão: 160 caracteres GSM-7. Com Unicode (emojis, acentos), 70 caracteres por segmento. Exemplo prático: mensagem de 200 caracteres = 2 segmentos cobrados.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Números gratuitos (Toll-free)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mesma taxa base de SMS dos códigos longos: $0,0083/segmento (entrada e saída).&lt;/li&gt;
&lt;li&gt;MMS de saída: $0,022; MMS de entrada: $0,02.&lt;/li&gt;
&lt;li&gt;Não requerem registro 10DLC, mas exigem verificação para throughput máximo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quando usar:&lt;/strong&gt; Para alto volume e envio unidirecional sem precisar de 10DLC.&lt;/p&gt;

&lt;h3&gt;
  
  
  Códigos curtos (números de 5-6 dígitos)
&lt;/h3&gt;

&lt;p&gt;Ideais para campanhas de alto volume. SMS: $0,0083/mensagem, porém custo fixo mensal elevado.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo de código curto&lt;/th&gt;
&lt;th&gt;Custo mensal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Código curto aleatório&lt;/td&gt;
&lt;td&gt;$1.000/mês (trimestral)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Código curto personalizado&lt;/td&gt;
&lt;td&gt;$1.500/mês (trimestral)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vanity próprio (BYOV)&lt;/td&gt;
&lt;td&gt;$500/mês (trimestral)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Taxa única de $500 para MMS habilitado em qualquer código curto.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Descontos por volume
&lt;/h3&gt;

&lt;p&gt;Descontos automáticos por faixa para códigos longos, toll-free e códigos curtos:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mensagens/mês&lt;/th&gt;
&lt;th&gt;Preço por segmento&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 a 150.000&lt;/td&gt;
&lt;td&gt;$0,0083&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;150.001 a 300.000&lt;/td&gt;
&lt;td&gt;$0,0081&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300.001 a 500.000&lt;/td&gt;
&lt;td&gt;$0,0079&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500.001 a 750.000&lt;/td&gt;
&lt;td&gt;$0,0077&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;750.001 a 1.000.000&lt;/td&gt;
&lt;td&gt;$0,0075&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.000.001+&lt;/td&gt;
&lt;td&gt;$0,0073&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;O volume é separado para cada tipo de número. Não é possível combinar códigos longos e toll-free para desconto.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O que afeta sua fatura do Twilio
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tipo de número de telefone
&lt;/h3&gt;

&lt;p&gt;A tabela de tarifas depende do tipo de número (código longo, toll-free, código curto). Dividir tráfego entre tipos pode impedir atingir descontos em qualquer faixa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Segmentos de mensagem
&lt;/h3&gt;

&lt;p&gt;Mensagens longas ou com Unicode geram múltiplos segmentos, aumentando o custo real.&lt;/p&gt;

&lt;h3&gt;
  
  
  Taxas de operadora
&lt;/h3&gt;

&lt;p&gt;Além da taxa base Twilio, cada grande operadora dos EUA acrescenta uma sobretaxa por mensagem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Taxas de operadora para código longo (SMS de saída):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operadora&lt;/th&gt;
&lt;th&gt;Taxa de saída&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AT&amp;amp;T&lt;/td&gt;
&lt;td&gt;$0,0035&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T-Mobile&lt;/td&gt;
&lt;td&gt;$0,0045&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verizon&lt;/td&gt;
&lt;td&gt;$0,004&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US Cellular&lt;/td&gt;
&lt;td&gt;$0,005&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outras&lt;/td&gt;
&lt;td&gt;$0,004&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Para MMS, taxas ainda maiores (AT&amp;amp;T: $0,009 por MMS; T-Mobile: $0,01).&lt;/li&gt;
&lt;li&gt;Exemplo: SMS de saída para AT&amp;amp;T = $0,0083 (Twilio) + $0,0035 (operadora) = &lt;strong&gt;$0,0118 por segmento&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  País de destino
&lt;/h3&gt;

&lt;p&gt;Preços internacionais variam bastante: Reino Unido $0,04/mensagem; Índia $0,0029; Brasil $0,075. Baixe a tabela completa no site Twilio.&lt;/p&gt;

&lt;h3&gt;
  
  
  Registro 10DLC
&lt;/h3&gt;

&lt;p&gt;Obrigatório para quem envia SMS A2P por código longo nos EUA. Sem registro, as mensagens podem ser bloqueadas pelas operadoras.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custos e taxas ocultos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Taxas de registro 10DLC
&lt;/h3&gt;

&lt;p&gt;Atualizadas em agosto de 2025 (TCR):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Marca Proprietário Individual/Low Volume:&lt;/strong&gt; $4,50 taxa única&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marca padrão:&lt;/strong&gt; $46 taxa única&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verificação padrão:&lt;/strong&gt; $41,50&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verificação adicional:&lt;/strong&gt; $11&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reenvio Authentication Plus:&lt;/strong&gt; $12,50 por tentativa&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Taxas de campanha:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo de campanha&lt;/th&gt;
&lt;th&gt;Mensal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Proprietário Individual&lt;/td&gt;
&lt;td&gt;$2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mista de baixo volume&lt;/td&gt;
&lt;td&gt;$1,50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Padrão&lt;/td&gt;
&lt;td&gt;$10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caridade/501(c)(3)&lt;/td&gt;
&lt;td&gt;$3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serviços de emergência&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Taxa de verificação única: $15/campanha&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Taxas de número de telefone
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Código longo: $1,15/mês&lt;/li&gt;
&lt;li&gt;Toll-free: $2,15/mês&lt;/li&gt;
&lt;li&gt;Provisione múltiplos números? Multiplique o custo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Taxa de processamento de mensagem falha
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;$0,001 por mensagem com status "Falha". Pode surpreender em testes ou alta filtragem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Add-ons opcionais
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Engagement Suite&lt;/strong&gt; (encurtamento de link/rastreamento): $0,015/mensagem saída após 1.000/mês gratuitos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance Toolkit&lt;/strong&gt; (conformidade via IA): $0,015/mensagem saída.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Planos de suporte
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gratuito é limitado.&lt;/li&gt;
&lt;li&gt;Planos pagos a partir de $250/mês ("Developer"). Necessário para produção crítica.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Como o Twilio se compara às alternativas
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provedor&lt;/th&gt;
&lt;th&gt;SMS saída (EUA)&lt;/th&gt;
&lt;th&gt;SMS entrada (EUA)&lt;/th&gt;
&lt;th&gt;Número de telefone&lt;/th&gt;
&lt;th&gt;10DLC exigido&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;$0,0083 + taxas operadora&lt;/td&gt;
&lt;td&gt;$0,0083 + taxas operadora&lt;/td&gt;
&lt;td&gt;$1,15/mês&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plivo&lt;/td&gt;
&lt;td&gt;$0,005&lt;/td&gt;
&lt;td&gt;$0,00035&lt;/td&gt;
&lt;td&gt;$0,80/mês&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telnyx&lt;/td&gt;
&lt;td&gt;$0,004&lt;/td&gt;
&lt;td&gt;$0,004&lt;/td&gt;
&lt;td&gt;$1,00/mês&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bird&lt;/td&gt;
&lt;td&gt;~$0,007&lt;/td&gt;
&lt;td&gt;~$0,007&lt;/td&gt;
&lt;td&gt;Varia&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Plivo e Telnyx normalmente mais baratos por mensagem.&lt;/li&gt;
&lt;li&gt;Twilio se destaca em documentação, experiência dev e integrações. Para uso intensivo e baixo custo, avalie Telnyx/Plivo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Como testar o Twilio gratuitamente
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Crie conta de teste no Twilio (sem cartão de crédito).&lt;/li&gt;
&lt;li&gt;Receba créditos gratuitos para testes reais.&lt;/li&gt;
&lt;li&gt;Mensagens para números não verificados exibem prefixo "Enviado de sua conta de teste Twilio".&lt;/li&gt;
&lt;li&gt;Upgrade remove o prefixo.&lt;/li&gt;
&lt;li&gt;Teste prático inclui:

&lt;ul&gt;
&lt;li&gt;Provisionamento de número de teste&lt;/li&gt;
&lt;li&gt;Envio/recebimento de SMS via API&lt;/li&gt;
&lt;li&gt;Teste de webhooks para mensagens de entrada&lt;/li&gt;
&lt;li&gt;Exploração do Console e logs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No upgrade, pague só o que usar. Não há mínimo mensal no pay-as-you-go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como testar sua integração SMS do Twilio com o Apidog
&lt;/h2&gt;

&lt;p&gt;Configure suas credenciais e webhooks Twilio, mas valide a integração com testes automatizados do Apidog para evitar erros de payload e inconsistências em produção.&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%2Fgcuec6nm1uksjpraul5p.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%2Fgcuec6nm1uksjpraul5p.png" alt="Interface do Apidog com um cenário de teste de API" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo a passo prático com Apidog
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Importe a especificação OpenAPI&lt;/strong&gt; do endpoint de webhook do Twilio para o Apidog.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monte o cenário de teste:&lt;/strong&gt; adicione etapas para envio de SMS, recebimento de callback, resposta de entrada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orquestre as etapas:&lt;/strong&gt; reordene e execute em sequência automatizada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encadeie dados:&lt;/strong&gt; use &lt;code&gt;{{$.stepId.response.body.field}}&lt;/code&gt; para passar SIDs entre etapas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Valide contratos:&lt;/strong&gt; defina o schema do payload do webhook e o Apidog compara automaticamente as respostas contra a especificação:

&lt;ul&gt;
&lt;li&gt;Confere códigos de status HTTP&lt;/li&gt;
&lt;li&gt;Verifica presença de campos obrigatórios&lt;/li&gt;
&lt;li&gt;Garante tipos corretos (SID como string, timestamps formatados)&lt;/li&gt;
&lt;li&gt;Bloqueia campos extras não permitidos&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tudo isso sem escrever scripts de asserção personalizados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Para começar:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Baixe o Apidog gratuitamente&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Importe a especificação da API do Twilio ou defina o schema do webhook.&lt;/li&gt;
&lt;li&gt;Crie um cenário de teste que simule o fluxo completo de SMS (envio e recebimento).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Os preços de SMS do Twilio iniciam em $0,0083 por segmento (código longo EUA), mas o custo real inclui taxas de operadora, aluguel de número e registro 10DLC. Um SMS para AT&amp;amp;T sai por cerca de $0,0118/segmento. Para campanhas 10DLC padrão, adicione $10/mês por campanha.&lt;/p&gt;

&lt;p&gt;A precificação é transparente e os descontos por volume são automáticos, mas é essencial considerar todos os itens e não só a taxa principal.&lt;/p&gt;

&lt;p&gt;Após modelar seus custos, implemente sua integração e teste de ponta a ponta. Os Cenários de Teste e o Teste de Contrato do Apidog validam seus webhooks Twilio e asseguram que as respostas estejam em conformidade com a especificação, sem necessidade de código de teste customizado.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;P: Qual é o preço base para um SMS de saída nos EUA no Twilio?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
R: A taxa base do Twilio é de $0,0083 por segmento de mensagem para SMS de saída de código longo dos EUA. As taxas da operadora são adicionadas. Uma mensagem da AT&amp;amp;T adiciona $0,0035, tornando o custo real $0,0118 por segmento para essa operadora.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: O Twilio cobra por SMS de entrada?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
R: Sim. O Twilio cobra $0,0083 por segmento para SMS de entrada em códigos longos e números gratuitos (toll-free). Taxas de operadora também podem ser aplicadas, dependendo da operadora de origem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: O que é 10DLC e eu preciso pagar por isso?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
R: 10DLC é o sistema de registro dos EUA para SMS A2P enviados de códigos longos de 10 dígitos. Se você está enviando mensagens geradas por aplicativo para consumidores dos EUA em um código longo, você deve se registrar. O registro da marca custa $4,50 (taxa única). As taxas de campanha variam de $1,50 a $10/mês, dependendo do tipo de campanha.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: Quanto custa um código curto do Twilio?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
R: Um código curto aleatório custa $1.000/mês, cobrado trimestralmente. Um código curto personalizado (um número que você escolhe) custa $1.500/mês. Ambos exigem uma taxa de configuração única de $500 se habilitados para MMS. Os códigos curtos usam a mesma taxa de SMS por mensagem de $0,0083.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: O Twilio oferece descontos por volume?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
R: Sim, automaticamente. As primeiras 150.000 mensagens por mês por tipo de número custam $0,0083 cada. A taxa cai por seis níveis até $0,0073 para mais de um milhão de mensagens por mês. Descontos por uso comprometido para empresas também estão disponíveis entrando em contato com as vendas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: Existe um teste gratuito para o Twilio?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
R: Sim. O Twilio oferece uma conta de teste gratuita com créditos incluídos. Não é necessário cartão de crédito para se inscrever. Contas de teste podem enviar e receber mensagens SMS reais, embora as mensagens de saída incluam um prefixo de teste até que você faça o upgrade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P: Qual é a alternativa mais barata ao Twilio para SMS?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
R: Plivo e Telnyx oferecem taxas por mensagem mais baixas que o Twilio. A taxa de saída de SMS dos EUA do Plivo é de $0,005 por mensagem e a de entrada é de $0,00035. O Telnyx cobra $0,004 por mensagem. Ambos exigem registro 10DLC para tráfego A2P nos EUA. O Twilio tende a oferecer melhor documentação, suporte e cobertura de recursos para casos de uso mais complexos.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Quanto Custa a API SMS da Vonage? Preços 2026</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Fri, 03 Apr 2026 03:50:13 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/quanto-custa-a-api-sms-da-vonage-precos-2026-42j5</link>
      <guid>https://dev.to/lucas_ferreira/quanto-custa-a-api-sms-da-vonage-precos-2026-42j5</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;O preço da API SMS da Vonage começa em &lt;strong&gt;US$ 0,00809 por mensagem de saída&lt;/strong&gt; e &lt;strong&gt;US$ 0,00649 por mensagem de entrada&lt;/strong&gt; nos EUA. Não há mínimo mensal: você paga apenas pelo que enviar e receber. Tarifas internacionais variam conforme o país e podem passar de US$ 1,00 por mensagem em alguns mercados. Se você está desenvolvendo ou testando integração SMS da Vonage, 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; facilita o envio de requisições de teste, validação de respostas e detecção de erros antes do deploy do seu código.&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;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Se você já ouviu falar da Nexmo, você já conhece a Vonage. Em 2016, a Vonage adquiriu a Nexmo, uma plataforma de API de SMS e comunicação voltada para desenvolvedores. A marca Nexmo permaneceu em uso e você ainda verá o &lt;a href="https://developer.vonage.com" rel="noopener noreferrer"&gt;developer.vonage.com&lt;/a&gt; (antigo nexmo.com/developers) como hub técnico. Em 2022, a Ericsson finalizou a aquisição da Vonage, mantendo a marca para o negócio de APIs.&lt;/p&gt;

&lt;p&gt;Hoje, a Vonage atende mais de 100.000 empresas e 1,6 milhão de desenvolvedores registrados. É uma plataforma madura, com modelo pay-as-you-go, sem contrato ou fidelidade, com cobertura em mais de 190 países.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Antes de avançar com sua integração, é fundamental contar com uma ferramenta eficiente de teste de API. O &lt;strong&gt;Apidog&lt;/strong&gt; permite criar cenários de teste para requisições SMS da Vonage, validar respostas, e encadear múltiplas chamadas de API em um fluxo de trabalho. Experimente gratuitamente, sem necessidade de cartão de crédito.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Visão geral de preços SMS da Vonage
&lt;/h2&gt;

&lt;p&gt;A Vonage opera com modelo pay-as-you-go para a API SMS. Não existe taxa de plataforma ou mensalidade, apenas cobrança por mensagem enviada ou recebida, variando conforme país e tipo de número.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Principais tarifas nos Estados Unidos:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo de mensagem&lt;/th&gt;
&lt;th&gt;Preço por mensagem&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SMS de saída (LVN EUA)&lt;/td&gt;
&lt;td&gt;$0.00809&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS de entrada (LVN EUA)&lt;/td&gt;
&lt;td&gt;$0.00649&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS de saída (Toll-Free EUA)&lt;/td&gt;
&lt;td&gt;Contatar vendas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS de entrada (Toll-Free EUA)&lt;/td&gt;
&lt;td&gt;Grátis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;LVN (Local Virtual Number) é o termo da Vonage para número virtual local (10DLC). As tarifas são por país e a plataforma calcula o valor em tempo real, conforme uso.&lt;/p&gt;

&lt;p&gt;A Vonage disponibiliza uma planilha global de preços, baixável pelo painel Nexmo/Vonage, cobrindo todos os países para planejamento de custos internacionais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detalhamento de preços: saída, entrada, MMS e WhatsApp
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SMS de saída
&lt;/h3&gt;

&lt;p&gt;Mensagens enviadas do seu app para o usuário final. Nos EUA, &lt;strong&gt;US$ 0,00809 por mensagem&lt;/strong&gt; usando número virtual local. Consulte sempre o painel oficial para tarifas atualizadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  SMS de entrada
&lt;/h3&gt;

&lt;p&gt;Mensagens recebidas em um número alugado na Vonage. Nos EUA, &lt;strong&gt;US$ 0,00649 por mensagem de entrada&lt;/strong&gt;. Alguns números Toll-Free recebem SMS gratuitamente, mas confirme no painel antes de depender disso.&lt;/p&gt;

&lt;h3&gt;
  
  
  Preços de MMS
&lt;/h3&gt;

&lt;p&gt;MMS é suportado via API de Mensagens, mas a Vonage não divulga tarifa fixa publicamente. É necessário contatar vendas, pois depende de acordos com operadoras.&lt;/p&gt;

&lt;h3&gt;
  
  
  WhatsApp via Vonage
&lt;/h3&gt;

&lt;p&gt;A Vonage oferece WhatsApp via API de Mensagens. Existem duas cobranças:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Taxa do WhatsApp&lt;/strong&gt;: Cobrança pelo Meta, variando conforme a categoria da conversa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Taxa da Vonage&lt;/strong&gt;: A partir de US$ 0,00015 por mensagem, variando conforme categoria e volume.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Facebook Messenger
&lt;/h3&gt;

&lt;p&gt;Mensagens do Facebook Messenger são &lt;strong&gt;US$ 0,0011 por mensagem entregue&lt;/strong&gt; via API de Mensagens.&lt;/p&gt;

&lt;h3&gt;
  
  
  RCS (Serviços de Comunicação Rica)
&lt;/h3&gt;

&lt;p&gt;A Vonage suporta RCS com tarifas por operadora nos EUA:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operadora&lt;/th&gt;
&lt;th&gt;RCS Rich (texto)&lt;/th&gt;
&lt;th&gt;RCS Rich Media&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T-Mobile&lt;/td&gt;
&lt;td&gt;$0.00620&lt;/td&gt;
&lt;td&gt;$0.01250&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verizon&lt;/td&gt;
&lt;td&gt;$0.00400&lt;/td&gt;
&lt;td&gt;$0.00600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AT&amp;amp;T&lt;/td&gt;
&lt;td&gt;$0.00450&lt;/td&gt;
&lt;td&gt;$0.01000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US Cellular&lt;/td&gt;
&lt;td&gt;$0.00620&lt;/td&gt;
&lt;td&gt;$0.01350&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Há taxa única de configuração de &lt;strong&gt;US$ 600&lt;/strong&gt; por país para RCS.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que afeta sua conta Vonage
&lt;/h2&gt;

&lt;p&gt;Conheça os principais fatores que alteram sua fatura mensal:&lt;/p&gt;

&lt;h3&gt;
  
  
  País de destino
&lt;/h3&gt;

&lt;p&gt;O país é o maior fator de custo. EUA tem tarifas baixas, mas mercados com menor conectividade podem custar US$ 0,50 ou mais por SMS. Sempre consulte a planilha global antes de enviar internacionalmente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tipo de número
&lt;/h3&gt;

&lt;p&gt;Nos EUA, existem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Código longo (10DLC)&lt;/strong&gt;: Local e acessível, bom para P2P e app-to-person.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Números Toll-Free&lt;/strong&gt;: Maior throughput para A2P, entrada geralmente gratuita.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Códigos curtos&lt;/strong&gt;: Alto volume, requer aprovação prévia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada tipo tem tarifas e custos de aluguel diferentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Taxas de aluguel de número
&lt;/h3&gt;

&lt;p&gt;Alugar um número virtual custa extra. Números locais iniciam em poucos dólares/mês; Toll-Free e short codes são mais caros.&lt;/p&gt;

&lt;h3&gt;
  
  
  Codificação de mensagem
&lt;/h3&gt;

&lt;p&gt;SMS padrão: 160 caracteres (GSM-7). Com Unicode (emoji, acentos), o limite cai para 70. Uma mensagem Unicode de 200 caracteres conta como três mensagens – atenção para não triplicar custos!&lt;/p&gt;

&lt;h3&gt;
  
  
  Sobretaxas de operadora
&lt;/h3&gt;

&lt;p&gt;Operadoras dos EUA aplicam sobretaxas, especialmente em mensagens A2P via 10DLC. A Vonage repassa essas taxas e elas aparecem detalhadas na fatura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custos ocultos a serem observados
&lt;/h2&gt;

&lt;p&gt;Além do custo por mensagem, fique atento a:&lt;/p&gt;

&lt;h3&gt;
  
  
  Níveis de suporte
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Grátis&lt;/strong&gt;: fóruns e docs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comercial&lt;/strong&gt;: plano pago.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Premium&lt;/strong&gt;: suporte 24/7 e gerente de conta por &lt;strong&gt;US$ 3.300/mês&lt;/strong&gt;. Necessário para operações críticas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  APIs complementares
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Complemento&lt;/th&gt;
&lt;th&gt;Custo mensal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Audit API&lt;/td&gt;
&lt;td&gt;$550/mês&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-redação (remoção de PII)&lt;/td&gt;
&lt;td&gt;$1.100/mês&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reports API&lt;/td&gt;
&lt;td&gt;$495/mês (ou $0.00049/CDR avulso)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A Audit API é essencial para compliance. Auto-redação remove PII dos logs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Custos da Verify API
&lt;/h3&gt;

&lt;p&gt;A autenticação 2FA via Verify API custa &lt;strong&gt;US$ 0,0572 por verificação bem-sucedida&lt;/strong&gt; (mais taxas de mensagens/voz). Verificações com falha ainda geram custos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Registro de número (10DLC EUA)
&lt;/h3&gt;

&lt;p&gt;Para SMS A2P nos EUA com códigos longos, é obrigatório registrar campanha no TCR. Custos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Taxa única de registro de marca&lt;/li&gt;
&lt;li&gt;Taxa mensal por campanha&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sem registro, as mensagens são filtradas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vonage vs. Alternativas
&lt;/h2&gt;

&lt;p&gt;Comparativo de preços de SMS de saída nos EUA:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provedor&lt;/th&gt;
&lt;th&gt;SMS saída EUA&lt;/th&gt;
&lt;th&gt;SMS entrada EUA&lt;/th&gt;
&lt;th&gt;Teste Grátis&lt;/th&gt;
&lt;th&gt;Suporte&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vonage&lt;/td&gt;
&lt;td&gt;$0.00809&lt;/td&gt;
&lt;td&gt;$0.00649&lt;/td&gt;
&lt;td&gt;Sim (só números verificados)&lt;/td&gt;
&lt;td&gt;Níveis pagos; $3.300/mês para 24/7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;$0.0079&lt;/td&gt;
&lt;td&gt;$0.0075&lt;/td&gt;
&lt;td&gt;Sim ($15 de crédito)&lt;/td&gt;
&lt;td&gt;Pago a partir de $250/mês&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plivo&lt;/td&gt;
&lt;td&gt;$0.0055&lt;/td&gt;
&lt;td&gt;$0.0005&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;Básico grátis; níveis pagos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telnyx&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;td&gt;$0.002&lt;/td&gt;
&lt;td&gt;Sim ($5 de crédito)&lt;/td&gt;
&lt;td&gt;Email 24/7 grátis; telefone pago&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Observações rápidas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Telnyx é a mais barata nos EUA, mas é uma plataforma mais recente.&lt;/li&gt;
&lt;li&gt;Plivo tem preços competitivos e boa reputação.&lt;/li&gt;
&lt;li&gt;Twilio lidera em ecossistema, integrações e documentação, mas é mais cara.&lt;/li&gt;
&lt;li&gt;Vonage tem preço intermediário, com respaldo e confiabilidade da Ericsson.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O preço por mensagem não é tudo: avalie taxas de entrega, compliance, ferramentas de desenvolvimento e qualidade do suporte.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como experimentar a Vonage gratuitamente
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.vonage.com/communications-apis/pricing/" rel="noopener noreferrer"&gt;A Vonage oferece conta de teste gratuita.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  O que você recebe
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Número virtual para testes de envio/recebimento&lt;/li&gt;
&lt;li&gt;Credenciais de API (key e secret)&lt;/li&gt;
&lt;li&gt;Acesso à documentação completa e SDKs&lt;/li&gt;
&lt;li&gt;Créditos de teste para envio limitado&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Restrições
&lt;/h3&gt;

&lt;p&gt;Durante o teste, só é possível enviar SMS para números cadastrados/verificados na conta, como prevenção a fraudes. O envio para números externos exige upgrade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo a passo para começar
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Acesse &lt;a href="https://dashboard.nexmo.com" rel="noopener noreferrer"&gt;dashboard.nexmo.com&lt;/a&gt; ou &lt;a href="https://www.vonage.com/communications-apis/" rel="noopener noreferrer"&gt;vonage.com/communications-apis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Crie uma conta gratuita via e-mail&lt;/li&gt;
&lt;li&gt;Verifique seu número de telefone&lt;/li&gt;
&lt;li&gt;Pegue a chave e segredo da API no painel&lt;/li&gt;
&lt;li&gt;Faça a primeira chamada de API usando a REST API ou SDK oficial&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%2F9ueumbyjp6vt2xicifxk.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%2F9ueumbyjp6vt2xicifxk.png" alt="Painel da Vonage com chave e segredo da API" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDKs disponíveis: Node.js, Python, PHP, Ruby, Java, .NET, Go. Ou use qualquer cliente HTTP para chamar a REST API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como testar sua integração SMS da Vonage com o Apidog
&lt;/h2&gt;

&lt;p&gt;Com chave e segredo da Vonage, utilize 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; para testar sua integração antes de ir para produção.&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%2Fi04oh5iormtlr02zuvt3.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%2Fi04oh5iormtlr02zuvt3.png" alt="Interface do Apidog mostrando um cenário de teste SMS" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O módulo de Cenários de Teste do Apidog permite encadear múltiplas requisições de API em um fluxo automatizado, simulando o ciclo real: envio de SMS, verificação de status, manipulação de erro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como configurar um cenário de teste
&lt;/h3&gt;

&lt;p&gt;No Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Acesse o módulo &lt;strong&gt;Testes&lt;/strong&gt; e crie um novo cenário.&lt;/li&gt;
&lt;li&gt;Adicione etapas:

&lt;ul&gt;
&lt;li&gt;Importe da especificação da sua API (OpenAPI)&lt;/li&gt;
&lt;li&gt;Adicione requisição personalizada para o endpoint REST da Vonage&lt;/li&gt;
&lt;li&gt;Importe comando cURL da documentação&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Exemplo de requisição básica de SMS:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST https://rest.nexmo.com/sms/json
Content-Type: application/x-www-form-urlencoded

api_key=SEU_API_KEY
api_secret=SEU_API_SECRET
from=REMETENTE
to=DESTINATARIO
text=Sua mensagem de teste
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Validando a resposta
&lt;/h3&gt;

&lt;p&gt;O Apidog valida automaticamente conforme o schema. Para a API SMS da Vonage, a resposta de sucesso inclui um array &lt;code&gt;messages&lt;/code&gt;. Cada item tem um campo &lt;code&gt;status&lt;/code&gt;. &lt;code&gt;status=0&lt;/code&gt; indica sucesso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adicione asserções para:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Código HTTP 200&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;messages[0].status&lt;/code&gt; igual a &lt;code&gt;"0"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;messages[0].message-id&lt;/code&gt; não vazio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se receber erro (status 1, 2, 4+), a asserção falha e o Apidog sinaliza em vermelho, exibindo o corpo da resposta para debug imediato.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passando dados entre requisições
&lt;/h3&gt;

&lt;p&gt;O Apidog permite passar dados entre etapas com a sintaxe &lt;code&gt;{{$.stepId.response.body.campo}}&lt;/code&gt;. Exemplo: extraia o &lt;code&gt;message-id&lt;/code&gt; da resposta do envio e injete na requisição de verificação de status.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testes automatizados via CI/CD
&lt;/h3&gt;

&lt;p&gt;Quando estiver pronto para automatizar, integre o Apidog com GitHub Actions, GitLab CI ou Jenkins. Exporte seu cenário e rode via Apidog CLI a cada pull request, detectando regressões antes de chegar à produção.&lt;/p&gt;

&lt;p&gt;Experimente grátis em &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;apidog.com&lt;/a&gt;. Sem necessidade de cartão.&lt;/p&gt;

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

&lt;p&gt;A API SMS da Vonage opera em esquema pay-as-you-go, sem mensalidade mínima. SMS de saída nos EUA: US$ 0,00809/mensagem; entrada: US$ 0,00649. Os custos variam conforme país, tipo de número e codificação. Recursos premium (Audit API, Auto-redação, suporte 24/7) aumentam o orçamento.&lt;/p&gt;

&lt;p&gt;No comparativo, Telnyx e Plivo têm preços menores; Twilio lidera em ecossistema. Vonage é indicada para quem precisa de confiabilidade e alcance global via Ericsson.&lt;/p&gt;

&lt;p&gt;Antes de ir para produção, use o Apidog para criar cenários de teste detalhados na integração Vonage. Valide fluxos, respostas e trate erros ainda em desenvolvimento — evite problemas na produção.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Vonage é o mesmo que Nexmo?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim. A Vonage adquiriu a Nexmo em 2016. O portal de desenvolvedores segue em &lt;a href="https://developer.vonage.com" rel="noopener noreferrer"&gt;developer.vonage.com&lt;/a&gt;, e muitos endpoints ainda usam &lt;code&gt;rest.nexmo.com&lt;/code&gt;. Ambas as marcas se referem ao mesmo produto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Vonage cobra mensalidade por SMS?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não. Você paga por mensagem enviada/recebida e aluguel de número virtual. APIs complementares (Audit API, Auto-redação) têm mensalidade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quanto custa um número Vonage?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Números locais (10DLC) EUA iniciam em poucos dólares por mês. Toll-Free e short codes custam mais. Consulte o painel para preços atualizados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quais países a Vonage SMS suporta?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Mais de 190 países. As tarifas variam bastante. Baixe a planilha global no painel para detalhes completos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Vonage oferece desconto por volume?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim. Para grandes volumes, negocie com o time de vendas. Até fechar acordo, valem as tarifas padrão pay-as-you-go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Posso receber SMS gratuitamente?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Números Toll-Free EUA geralmente recebem SMS de entrada sem custo. Código longo cobra US$ 0,00649/mensagem. Consulte tarifas por país na planilha.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como Vonage e Twilio se comparam para SMS?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A Vonage tem tarifa ligeiramente maior que a Twilio nos EUA. Twilio lidera em ecossistema e integrações. Vonage se destaca pela confiabilidade e alcance global via Ericsson. Na prática, a escolha depende mais da experiência do desenvolvedor e suporte do que do preço por mensagem.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cursor 3: O que significa para desenvolvedores de API?</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Fri, 03 Apr 2026 03:45:21 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/cursor-3-o-que-significa-para-desenvolvedores-de-api-3b6d</link>
      <guid>https://dev.to/lucas_ferreira/cursor-3-o-que-significa-para-desenvolvedores-de-api-3b6d</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; O Cursor 3 foi lançado em 2 de abril de 2026, substituindo a interface IDE-first por um workspace agent-first. Para desenvolvedores de API, as maiores mudanças são a execução paralela de agentes, saídas de ferramentas MCP mais ricas e uma transição da nuvem para o local que mantém seus fluxos de trabalho funcionando sem interrupção. Se você combinar o Cursor 3 com o MCP Server do Apidog, seus agentes de IA podem ler suas especificações de API ao vivo e gerar código preciso e consciente do esquema sem copiar e colar.&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;h2&gt;
  
  
  A mudança que você provavelmente sentiu que estava por vir
&lt;/h2&gt;

&lt;p&gt;Editores de código de IA vêm evoluindo rápido, mas o Cursor 3 não é só uma atualização incremental: é um redesenho completo do ambiente de desenvolvimento de IA.&lt;/p&gt;

&lt;p&gt;Antes do Cursor 3, você atuava como usuário tradicional de IDE: abria arquivos, pedia ajuda a um agente, revisava as sugestões e seguia em frente. Agentes eram assistentes sob demanda.&lt;/p&gt;

&lt;p&gt;O Cursor 3 muda a lógica: agentes passam a ser a unidade central de trabalho. Você gerencia vários agentes como abas no navegador, rodando em paralelo, monitorando saídas e promovendo as melhores soluções.&lt;/p&gt;

&lt;p&gt;Para quem desenvolve API, isso é ainda mais importante: seu trabalho é altamente paralelo — endpoints, contratos, docs, rastreamento de schema, tudo acontecendo ao mesmo tempo. Agora, suas ferramentas acompanham esse ritmo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Nota:&lt;/strong&gt; O Cursor 3 não conhece sua especificação de API sozinho. É aqui que entra o MCP Server do Apidog. Conecte uma vez, e os agentes do Cursor puxam seus schemas OpenAPI, definições de endpoint e cenários de teste direto do Apidog. Chega de agentes inventando nomes de campos: o código gerado já sai casando com sua spec.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Este artigo mostra o que mudou no Cursor 3, como isso impacta o seu fluxo de trabalho com APIs e um passo a passo para integrar Cursor 3 ao MCP Server do Apidog.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que há de novo no Cursor 3
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cursor.com/blog/cursor-3" rel="noopener noreferrer"&gt;O Cursor 3&lt;/a&gt; chegou com foco total em agentes. Veja os principais pontos para quem trabalha com API:&lt;/p&gt;

&lt;h3&gt;
  
  
  Agents Window
&lt;/h3&gt;

&lt;p&gt;A Agents Window é a nova interface central. Execute agentes em múltiplos repositórios ao mesmo tempo, seja local, por worktree, na nuvem do Cursor, ou via SSH remoto.&lt;/p&gt;

&lt;p&gt;Acesse via &lt;code&gt;Cmd+Shift+P -&amp;gt; Agents Window&lt;/code&gt;. Dá para manter o IDE aberto ou alternar entre eles.&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%2F4oyy02bv4kn9xdm2zubf.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%2F4oyy02bv4kn9xdm2zubf.png" alt="Agents Window" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Na prática:&lt;/strong&gt; Inicie um agente para criar um endpoint enquanto outro corrige bugs em uma lib compartilhada. Monitore ambos, intervenha ou aprove as diferenças quando necessário.&lt;/p&gt;

&lt;h3&gt;
  
  
  Modo Design
&lt;/h3&gt;

&lt;p&gt;No Agents Window, o Modo Design permite anotar a interface do navegador visualmente. Selecione elementos, destaque áreas, adicione ao contexto do agente — sem precisar descrever “o botão no canto direito”.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Cmd+Shift+D&lt;/code&gt; para alternar&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Shift+arrastar&lt;/code&gt; para selecionar área&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Cmd+L&lt;/code&gt; para adicionar elemento ao chat&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%2F6pfv5dbgfl43dnkza119.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%2F6pfv5dbgfl43dnkza119.png" alt="Modo Design" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP Apps: saída de conteúdo estruturado
&lt;/h3&gt;

&lt;p&gt;Agora, MCP Apps suportam saídas estruturadas, não só texto plano. Isso significa que respostas do MCP Server do Apidog (definições de endpoint, schemas, testes) chegam num formato que os agentes realmente entendem — sem precisar “interpretar” texto.&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%2F479ffyk6lfbdc6dsuua9.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%2F479ffyk6lfbdc6dsuua9.png" alt="MCP Apps" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Worktrees, best-of-n e isolamento
&lt;/h3&gt;

&lt;p&gt;Novos comandos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/worktree&lt;/code&gt;: cria um git worktree isolado para experimentar sem riscos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/best-of-n&lt;/code&gt;: executa a mesma tarefa em múltiplos modelos, cada um em seu próprio worktree, permitindo comparar abordagens (ex: Claude, GPT-4o, Gemini) e escolher o melhor resultado.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Transição da nuvem para o local
&lt;/h3&gt;

&lt;p&gt;Os agentes transitam entre nuvem e máquina local. Comece uma tarefa longa na nuvem, puxe para local para testar, ou envie para a nuvem quando for fechar o laptop.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que isso significa para o desenvolvimento de API
&lt;/h2&gt;

&lt;p&gt;Desenvolver API sempre foi trabalho de multitarefa. Você alterna entre especificação, cliente (&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;), editor, terminal, documentação. Cursor 3 começa a consolidar esse fluxo, tornando agentes persistentes e paralelos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Desenvolvimento paralelo de endpoints
&lt;/h3&gt;

&lt;p&gt;Construa múltiplos endpoints REST simultaneamente: atribua cada endpoint a um agente diferente, rode todos, revise as saídas e mescle os melhores. O tempo entre “preciso desses endpoints” e “tenho drafts para revisar” cai drasticamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Geração de código consciente do esquema
&lt;/h3&gt;

&lt;p&gt;Sem acesso à especificação OpenAPI, agentes chutam nomes de campos e estruturas. Com o MCP Server do Apidog, o agente lê o schema real (ex: &lt;code&gt;POST /orders&lt;/code&gt; exige &lt;code&gt;customerId&lt;/code&gt; e &lt;code&gt;items&lt;/code&gt; com &lt;code&gt;productId&lt;/code&gt;/&lt;code&gt;quantity&lt;/code&gt;). O código já sai alinhado, reduzindo correções.&lt;/p&gt;

&lt;h3&gt;
  
  
  Teste de contrato dentro do editor
&lt;/h3&gt;

&lt;p&gt;Agentes do Cursor 3 podem executar comandos de terminal. Combine com a CLI do Apidog para validar contratos no próprio editor.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Descreva o comportamento do endpoint.&lt;/li&gt;
&lt;li&gt;O agente gera o código.&lt;/li&gt;
&lt;li&gt;Ele executa &lt;code&gt;apidog run --scenario ...&lt;/code&gt; contra o servidor mock.&lt;/li&gt;
&lt;li&gt;Se o teste falhar, o agente itera até passar.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Documentação sempre sincronizada
&lt;/h3&gt;

&lt;p&gt;Agentes do Cursor 3 leem a documentação do Apidog via MCP Server e detectam divergências entre código e spec. Configurando o fluxo corretamente, manter a doc atualizada vira parte do ciclo de revisão.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que não mudou
&lt;/h3&gt;

&lt;p&gt;O Cursor 3 &lt;strong&gt;não&lt;/strong&gt; testa APIs automaticamente nem valida lógicas de autenticação ou rate limit. Ele é uma interface de agente, não uma plataforma de QA. Para saídas ricas no MCP, seu servidor MCP precisa suportar conteúdo estruturado (o do Apidog suporta).&lt;/p&gt;

&lt;h2&gt;
  
  
  Cursor 3 + Apidog MCP Server: fluxo de trabalho prático
&lt;/h2&gt;

&lt;p&gt;Veja como usar juntos Cursor 3 e MCP Server do Apidog, em um fluxo de automação real.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuração
&lt;/h3&gt;

&lt;p&gt;Conecte o MCP Server do Apidog ao Cursor. O server expõe endpoints, schemas, ambientes e cenários de teste como ferramentas MCP. Adicione nas configurações do Cursor:&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;"mcpServers"&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;"apidog"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@apidog/mcp-server@latest"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"APIDOG_ACCESS_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your_access_token"&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;O token de acesso você gera no Apidog, em Configurações da Conta &amp;gt; Token de Acesso à API. Assim, os agentes do Cursor acessam funções como &lt;code&gt;get_endpoint_detail&lt;/code&gt;, &lt;code&gt;list_endpoints&lt;/code&gt; e &lt;code&gt;get_schema&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow: criando um endpoint a partir da spec
&lt;/h3&gt;

&lt;p&gt;Suponha que você adicionou o endpoint &lt;code&gt;POST /invoices&lt;/code&gt; na sua spec Apidog, com request/response e cenário de teste. Para implementar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abra uma sessão de agente na Agents Window.&lt;/li&gt;
&lt;li&gt;Descreva:
&amp;gt; "Procure o endpoint POST /invoices no projeto Apidog. Leia seus schemas de request e response. Gere um handler Node.js/Express conforme a spec. Execute o cenário de teste para validar."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O agente:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Usa &lt;code&gt;get_endpoint_detail&lt;/code&gt; via MCP para buscar a spec.&lt;/li&gt;
&lt;li&gt;Gera o handler baseado no schema.&lt;/li&gt;
&lt;li&gt;Executa &lt;code&gt;apidog run --scenario invoice-creation-test --env staging&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Corrige o handler se o teste falhar.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Você só revisa e aprova a diferença. O código já nasce alinhado à spec real.&lt;/p&gt;

&lt;h3&gt;
  
  
  /best-of-n para endpoints complexos
&lt;/h3&gt;

&lt;p&gt;Para lógica complexa, use &lt;code&gt;/best-of-n&lt;/code&gt;: três agentes produzem implementações diferentes lendo a spec via MCP. Compare as soluções no worktree do Cursor, escolha a melhor abordagem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mantendo documentação sincronizada
&lt;/h3&gt;

&lt;p&gt;Depois de subir o endpoint, peça ao agente:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Verifique a doc do Apidog para POST /invoices. Compare com o código em invoices.js. Sinalize discrepâncias. Atualize a spec do Apidog se necessário."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O agente compara via MCP, propõe updates de spec ou código, e você aprova/rejeita. Divergência de doc vira parte do ciclo de revisão.&lt;/p&gt;

&lt;p&gt;Veja mais em [visão geral do servidor apidog mcp] e [primeiros passos com a CLI do Apidog].&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuração prática: primeiros passos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Passo 1: atualize o Cursor
&lt;/h3&gt;

&lt;p&gt;Baixe a versão mais recente em &lt;a href="https://cursor.com/" rel="noopener noreferrer"&gt;cursor.com&lt;/a&gt;. Após instalar, abra a paleta (&lt;code&gt;Cmd+Shift+P&lt;/code&gt;) e selecione "Agents Window" para garantir que está no Cursor 3.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 2: gere um token de acesso Apidog
&lt;/h3&gt;

&lt;p&gt;Faça login 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;. Em Configurações da Conta &amp;gt; Token de Acesso à API, gere um token com permissão de leitura para os projetos desejados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 3: adicione o Apidog MCP Server ao Cursor
&lt;/h3&gt;

&lt;p&gt;Em Configurações do Cursor &amp;gt; MCP, 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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&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;"apidog"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@apidog/mcp-server@latest"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"APIDOG_ACCESS_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your_token_here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"APIDOG_PROJECT_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;"your_project_id"&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;O ID do projeto aparece na URL do Apidog ao abrir o projeto. Salve e reinicie o Cursor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 4: verifique a conexão
&lt;/h3&gt;

&lt;p&gt;Abra a Agents Window e inicie uma nova sessão. Digite: "Liste os endpoints no meu projeto Apidog." Se o agente retornar os endpoints, está tudo certo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 5: instale e configure a CLI do Apidog
&lt;/h3&gt;

&lt;p&gt;Para rodar testes automatizados, instale a CLI:&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; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifique com &lt;code&gt;apidog -v&lt;/code&gt;. No Apidog, acesse um cenário de teste e a aba CI/CD. Copie o comando CLI já preenchido (com credenciais e ID de cenário). Execute pelo terminal integrado do Cursor ou peça para um agente rodar como parte do fluxo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 6: execute sua primeira tarefa de agente com MCP
&lt;/h3&gt;

&lt;p&gt;Na Agents Window, peça:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Procure o schema do objeto User no Apidog. Gere uma interface TypeScript que corresponda exatamente."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Compare a saída com seu schema real. Se estiver correta, integração concluída! Agora você pode criar fluxos mais avançados de leitura de spec, geração de código e execução de testes — tudo em uma sessão de agente.&lt;/p&gt;

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

&lt;p&gt;O Cursor 3 muda a forma de trabalhar com IA no desenvolvimento: sai o foco em editor, entra o foco em agentes — ideal para automação de APIs e trabalho paralelo. A saída estruturada do MCP, pouco destacada no changelog, é um dos recursos mais úteis para quem trabalha com API: agentes recebem dados tipados e precisos, o código gerado precisa de menos ajustes.&lt;/p&gt;

&lt;p&gt;Integrando Cursor 3 com MCP Server e CLI do Apidog, você monta um pipeline em que o agente realmente entende sua API: lê a spec, gera código alinhado, executa cenários de teste. Não é demonstração, é workflow utilizável no dia a dia.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;O Cursor 3 substitui a interface IDE existente?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Não. O Cursor 3 adiciona a Agents Window, mas o IDE continua disponível. Use ambos como preferir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qual a diferença entre o Cursor 3 e a versão anterior?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A arquitetura: agora o foco são os agentes, não o editor. Agents Window, execução paralela, transição nuvem-local, Modo Design e comandos &lt;code&gt;/worktree&lt;/code&gt; e &lt;code&gt;/best-of-n&lt;/code&gt; são as principais novidades.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como o MCP Server do Apidog se conecta ao Cursor 3?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Adicione o MCP Server nas configurações do Cursor. O server expõe as specs do projeto Apidog como ferramentas MCP. Agentes usam essas ferramentas para ler endpoints, schemas e cenários sem cópia manual. O suporte a conteúdo estruturado garante dados tipados, não só texto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agentes do Cursor 3 podem executar cenários de teste do Apidog automaticamente?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sim, via CLI do Apidog. Os agentes podem rodar comandos de terminal, executar cenários de teste, analisar saídas e ajustar o código conforme os resultados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preciso de plano pago do Cursor para usar Agents Window?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agents Window está disponível em todos os planos. Execução de agentes na nuvem exige assinatura, mas execução local funciona no plano gratuito. Confira &lt;a href="https://cursor.com/pricing" rel="noopener noreferrer"&gt;cursor.com/pricing&lt;/a&gt; para detalhes atualizados.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como Executar Gemma 4 Localmente com Ollama: Guia Completo</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Fri, 03 Apr 2026 02:50:16 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/como-executar-gemma-4-localmente-com-ollama-guia-completo-3389</link>
      <guid>https://dev.to/lucas_ferreira/como-executar-gemma-4-localmente-com-ollama-guia-completo-3389</guid>
      <description>&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;p&gt;Gemma 4 foi lançado em 3 de abril de 2026, e o Ollama v0.20.0 adicionou suporte no mesmo dia. Você pode baixar e executar o modelo padrão &lt;code&gt;gemma4:e4b&lt;/code&gt; em apenas dois comandos. Este guia apresenta todos os passos práticos para configurar, escolher variantes, usar a API e testar endpoints locais do Gemma 4 com o Apidog.&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;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://apidog.com/blog/gemma-4-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Google lançou o Gemma 4&lt;/a&gt; em 2 de abril de 2026. Em 24 horas, o Ollama lançou a v0.20.0 com suporte a todas as quatro variantes do modelo.&lt;/p&gt;

&lt;p&gt;Para desenvolvedores, isso é uma grande mudança: o Gemma 4 salta de 20,8% (Gemma 3) para 89,2% no AIME 2026, e de 110 para 2150 ELO no Codeforces. Ele oferece chamada de função nativa, modos de raciocínio configuráveis, contexto de 256K em variantes maiores — tudo rodando localmente.&lt;/p&gt;

&lt;p&gt;Se você está criando aplicações API-first, rodar o Gemma 4 localmente oferece uma camada de IA rápida e privada para gerar dados de mock, escrever cenários de teste e validar respostas sem expor dados a servidores remotos.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Dica:&lt;/strong&gt; Com o Gemma 4 rodando localmente, o Smart Mock do Apidog gera dados realistas para respostas de API usando inferência baseada em IA. Basta definir o schema da API e o Apidog gera mocks compatíveis — útil para testes consistentes sem fixtures manuais.&lt;/p&gt;

&lt;p&gt;Este guia cobre da instalação à sua primeira chamada de API local.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que há de novo no Gemma 4
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/gemma-4/" rel="noopener noreferrer"&gt;Gemma 4&lt;/a&gt; vem em quatro variantes, cada uma com capacidades distintas.&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%2Fsos2mixfbxq6ww8ghoy8.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%2Fsos2mixfbxq6ww8ghoy8.png" alt="Gráfico comparando o desempenho do Gemma 3 e Gemma 4 em vários benchmarks de IA."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Principais novidades:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Raciocínio e codificação:&lt;/strong&gt; O modelo 31B atinge 80% no LiveCodeBench v6 (vs. 29,1% do 27B anterior).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mixture-of-Experts (MoE):&lt;/strong&gt; A variante 26B usa apenas 4B de parâmetros ativos por inferência, entregando ótima qualidade com menor custo computacional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contexto longo:&lt;/strong&gt; Modelos E2B/E4B suportam 128K tokens; 26B/31B suportam 256K.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chamada de função nativa:&lt;/strong&gt; Todos os modelos aceitam schemas de função e retornam JSON válido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entrada multimodal:&lt;/strong&gt; E2B/E4B aceitam áudio e imagem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modos de raciocínio:&lt;/strong&gt; Ative/desative chain-of-thought por requisição.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Variantes do modelo Gemma 4 explicadas
&lt;/h2&gt;

&lt;p&gt;Escolha o modelo certo para seu hardware:&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;Tamanho em disco&lt;/th&gt;
&lt;th&gt;Contexto&lt;/th&gt;
&lt;th&gt;Arquitetura&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;gemma4:e2b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7.2 GB&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Densa&lt;/td&gt;
&lt;td&gt;Laptops, edge, áudio/imagem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4:e4b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9.6 GB&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Densa&lt;/td&gt;
&lt;td&gt;Maioria dos desenvolvedores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4:26b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;18 GB&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;MoE (4B)&lt;/td&gt;
&lt;td&gt;Qualidade por GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4:31b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;20 GB&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Densa&lt;/td&gt;
&lt;td&gt;Máxima qualidade&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;e4b&lt;/code&gt; é o modelo padrão ao rodar &lt;code&gt;ollama run gemma4&lt;/code&gt;. Cabe em GPUs com 10+ GB de VRAM ou memória unificada do Apple Silicon.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;26b&lt;/code&gt; (MoE) vale testar se você tem 20+ GB de RAM: qualidade próxima a modelos grandes com desempenho de 4B.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ollama v0.20.0 ou superior&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verifique:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;  ollama &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;ul&gt;
&lt;li&gt;Atualize se necessário:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="c"&gt;# macOS&lt;/span&gt;
  brew upgrade ollama

  &lt;span class="c"&gt;# Linux&lt;/span&gt;
  curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;



&lt;ul&gt;
&lt;li&gt;No Windows, baixe de &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;ollama.com&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Hardware mínimo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gemma4:e2b&lt;/code&gt;: 8 GB RAM (16 GB recomendado)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gemma4:e4b&lt;/code&gt;: 10 GB VRAM ou 16 GB unificada&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gemma4:26b&lt;/code&gt;: 20+ GB RAM/unificada&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gemma4:31b&lt;/code&gt;: 24 GB VRAM ou 32 GB unificada&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Instalando e executando o Gemma 4
&lt;/h2&gt;

&lt;p&gt;Execute o modelo padrão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama run gemma4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F8678q5cv6x7szg7u7lfq.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%2F8678q5cv6x7szg7u7lfq.png" alt="Captura de tela da execução do comando 'ollama run gemma4'."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na primeira execução, ~9,6 GB serão baixados. Você entra em uma shell interativa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; Quais são os códigos de status HTTP para erros de cliente?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para variantes específicas:&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="c"&gt;# Modelo edge, menor&lt;/span&gt;
ollama run gemma4:e2b

&lt;span class="c"&gt;# Modelo MoE&lt;/span&gt;
ollama run gemma4:26b

&lt;span class="c"&gt;# Flagship&lt;/span&gt;
ollama run gemma4:31b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para baixar sem rodar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma4
ollama pull gemma4:26b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Liste modelos baixados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usando a API Gemma 4 localmente
&lt;/h2&gt;

&lt;p&gt;Ollama expõe uma API REST em &lt;code&gt;http://localhost:11434&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gerar uma conclusão
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:11434/api/generate &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": "gemma4",
    "prompt": "Escreva uma resposta JSON para um endpoint de API de perfil de usuário",
    "stream": false
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Chat (endpoint OpenAI)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:11434/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;"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": "gemma4",
    "messages": [
      {
        "role": "user",
        "content": "Gere um mock JSON realista para uma resposta de API de pedido de e-commerce"
      }
    ]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cliente Python (requests)
&lt;/h3&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;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask_gemma4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma4&lt;/span&gt;&lt;span class="sh"&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="nb"&gt;str&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;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/api/generate&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="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;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;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&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&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="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&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;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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ask_gemma4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Liste os campos que uma resposta de API de pagamento deve incluir&lt;/span&gt;&lt;span class="sh"&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;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usando o SDK Python do OpenAI
&lt;/h3&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;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;http://localhost:11434/v1&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# requerido pelo SDK
&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;gemma4&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;Você gera dados de resposta de API realistas em formato JSON.&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;Gere uma resposta de exemplo para um endpoint GET /users/{id}&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;h2&gt;
  
  
  Usando chamada de função com o Gemma 4
&lt;/h2&gt;

&lt;p&gt;Gemma 4 suporta chamada de função nativa. Defina um schema e o modelo retornará JSON validado.&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 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;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;http://localhost:11434/v1&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama&lt;/span&gt;&lt;span class="sh"&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="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_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;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;Recuperar um usuário por ID da API&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;user_id&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;integer&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;O ID de usuário único&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;include_orders&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;boolean&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;Se deve incluir o histórico de pedidos&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;user_id&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="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;gemma4&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;Obter usuário 42 com seu histórico de pedidos&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;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="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="c1"&gt;# get_user
&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;span class="c1"&gt;# {"user_id": 42, "include_orders": true}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ativando o modo de raciocínio
&lt;/h2&gt;

&lt;p&gt;Para tarefas complexas (ex: testes, análise de specs), ative o raciocínio chain-of-thought:&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="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;gemma4&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;Projetar um cenário de teste completo para uma API de processamento de pagamentos com casos extremos&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;extra_body&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;think&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="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;Para prompts simples, desative para ganhar desempenho.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testando respostas da API Gemma 4 com Apidog
&lt;/h2&gt;

&lt;p&gt;Com o Gemma 4 rodando, teste seus endpoints via &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%2Fci3hhb0u9dmnzb9i72vs.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%2Fci3hhb0u9dmnzb9i72vs.png" alt="Captura de tela do Apidog mostrando um cenário de teste para API Ollama."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Passos práticos:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Importe a especificação da API do Ollama&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No Apidog, crie projeto e use a base &lt;code&gt;http://localhost:11434&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Defina endpoints&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;POST /api/generate&lt;/code&gt; (resposta única)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /v1/chat/completions&lt;/code&gt; (chat multi-turno)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /api/tags&lt;/code&gt; (listar modelos)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Cenário de Teste&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Passo 1: &lt;code&gt;GET /api/tags&lt;/code&gt; — afirme que &lt;code&gt;gemma4&lt;/code&gt; está na lista.&lt;/li&gt;
&lt;li&gt;Passo 2: &lt;code&gt;POST /api/generate&lt;/code&gt; — afirme que &lt;code&gt;response&lt;/code&gt; não está vazio.&lt;/li&gt;
&lt;li&gt;Passo 3: &lt;code&gt;POST /v1/chat/completions&lt;/code&gt; — valide formato da resposta.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Use o processador "Extrair Variável" para passar respostas entre passos e simular conversas multi-turno.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Valide esquemas de resposta&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ative o Teste de Contrato do Apidog para garantir aderência ao OpenAPI.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Smart Mock para dev paralelo&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gere respostas mock automáticas e compatíveis com o schema, sem precisar do modelo local rodando.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Entrada multimodal com o Gemma 4
&lt;/h2&gt;

&lt;p&gt;E2B/E4B aceitam imagens (base64) junto ao texto:&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;base64&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&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_diagram.png&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;rb&lt;/span&gt;&lt;span class="sh"&gt;"&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;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;image_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;decode&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;gemma4:e4b&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;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="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&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="s"&gt;data:image/png;base64,&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;image_data&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="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;Descreva o fluxo da API mostrado neste diagrama e identifique possíveis caminhos de erro&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use para analisar diagramas de arquitetura, capturas de documentação ou extrair dados de imagens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problemas comuns e soluções
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Modelo não encontrado:&lt;/strong&gt; Rode &lt;code&gt;ollama pull gemma4&lt;/code&gt; ou cheque com &lt;code&gt;ollama list&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inferência lenta na CPU:&lt;/strong&gt; Use &lt;code&gt;gemma4:e2b&lt;/code&gt; para melhor desempenho.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Erros de memória:&lt;/strong&gt; Veja VRAM/memória com &lt;code&gt;ollama ps&lt;/code&gt;. Se necessário, troque para modelo menor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple Silicon não carrega:&lt;/strong&gt; Atualize Ollama (v0.20.0+).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Porta 11434 ocupada:&lt;/strong&gt; Use porta customizada: &lt;code&gt;OLLAMA_HOST=0.0.0.0:11435 ollama serve&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respostas cortadas:&lt;/strong&gt; Aumente contexto com &lt;code&gt;"options": {"num_ctx": 8192}&lt;/code&gt; no corpo JSON.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gemma 4 vs outros modelos locais
&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;Melhor tamanho&lt;/th&gt;
&lt;th&gt;Contexto&lt;/th&gt;
&lt;th&gt;Chamada de função&lt;/th&gt;
&lt;th&gt;Codificação (benchmark)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4&lt;/td&gt;
&lt;td&gt;e4b (9.6 GB)&lt;/td&gt;
&lt;td&gt;128K-256K&lt;/td&gt;
&lt;td&gt;Nativa&lt;/td&gt;
&lt;td&gt;80% LiveCodeBench&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama 3.3&lt;/td&gt;
&lt;td&gt;70B-Q4 (40 GB)&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Nativa&lt;/td&gt;
&lt;td&gt;~60% LiveCodeBench&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.6-Plus&lt;/td&gt;
&lt;td&gt;72B-Q4 (44 GB)&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Nativa&lt;/td&gt;
&lt;td&gt;Forte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mistral Small&lt;/td&gt;
&lt;td&gt;24B (14 GB)&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Nativa&lt;/td&gt;
&lt;td&gt;Moderado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Destaque: O Gemma 4 26B MoE (18 GB) entrega tokens/s superiores aos modelos densos grandes, mantendo ótima qualidade.&lt;/p&gt;

&lt;p&gt;Para codificação, o 31B é competitivo com modelos maiores. Para edge/laptops, use o &lt;code&gt;e2b&lt;/code&gt; (&amp;lt;8 GB).&lt;/p&gt;

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

&lt;p&gt;Gemma 4 com Ollama entrega uma das melhores experiências locais para desenvolvedores hoje. Instalação rápida, roda na maioria das máquinas, e qualidade de raciocínio/codificação muito superior ao Gemma 3.&lt;/p&gt;

&lt;p&gt;Comece com &lt;code&gt;ollama run gemma4&lt;/code&gt;, teste a API com Apidog para validar endpoints, e escolha a variante ideal conforme sua carga de trabalho.&lt;/p&gt;

&lt;p&gt;Se sua equipe constrói features de API sobre o Gemma 4, combine inferência local com Smart Mock e Cenários de Teste do Apidog para um fluxo completo de desenvolvimento sem dependências remotas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perguntas Frequentes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Como atualizo o Gemma 4 no Ollama?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Rode &lt;code&gt;ollama pull gemma4&lt;/code&gt; — baixa só o que mudou.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Posso rodar o Gemma 4 sem GPU?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim, mas é lento (1-3 tokens/s). Use &lt;code&gt;e2b&lt;/code&gt; para CPUs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qual a diferença entre gemma4:e2b e gemma4:e4b?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ambos são densos para edge. E4B é maior e lida melhor com prompts complexos. E2B é menor e aceita áudio. Para texto, e4b é padrão.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Funciona com LangChain e LlamaIndex?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim. Configure o provider Ollama para &lt;code&gt;http://localhost:11434&lt;/code&gt; e use &lt;code&gt;gemma4&lt;/code&gt; como modelo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A API local é compatível com código OpenAI?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Quase sempre. Só mude o &lt;code&gt;base_url&lt;/code&gt; para &lt;code&gt;http://localhost:11434/v1&lt;/code&gt; e forneça qualquer &lt;code&gt;api_key&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como uso o modo de raciocínio?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Adicione &lt;code&gt;"think": true&lt;/code&gt; no &lt;code&gt;extra_body&lt;/code&gt; (SDK OpenAI) ou no JSON direto. Desative para tarefas simples.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Posso servir Gemma 4 para outras máquinas?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim. Use &lt;code&gt;OLLAMA_HOST=0.0.0.0:11434 ollama serve&lt;/code&gt; e acesse pelo IP da máquina.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qual o melhor modelo Gemma 4 para dev de API?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Para mocks e testes, &lt;code&gt;e4b&lt;/code&gt; equilibra velocidade e qualidade. Para análise complexa, &lt;code&gt;26b&lt;/code&gt; entrega melhor custo-benefício.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como Executar Gemma 4 como Backend de API</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Fri, 03 Apr 2026 02:37:01 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/como-executar-gemma-4-como-backend-de-api-3n74</link>
      <guid>https://dev.to/lucas_ferreira/como-executar-gemma-4-como-backend-de-api-3n74</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
O Google lançou o Gemma 4 em abril de 2026: uma família de quatro modelos abertos sob licença Apache 2.0 que supera modelos 20x maiores em benchmarks padrão. Você pode utilizar a API do Gemma 4 via Google AI Studio, Vertex AI ou rodar localmente com Ollama e vLLM. Combine com o Smart Mock do Apidog para gerar respostas de API realistas automaticamente a partir dos seus esquemas OpenAPI, sem escrever regras de mock.&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;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;A maioria dos modelos de IA de código aberto força você a escolher entre potência e facilidade de implantação: ou um modelo enorme que não roda no seu laptop, ou algo pequeno que não aguenta raciocínio multi-etapa. O Gemma 4 elimina essa escolha.&lt;/p&gt;

&lt;p&gt;O Gemma 4 é a linha mais avançada de modelos abertos do Google DeepMind. O modelo 31B Dense está em 3º lugar entre modelos abertos no Arena AI, superando concorrentes 20x maiores. O 26B MoE está em 6º, ambos rodando em uma única GPU de 80GB. Os modelos leves E2B e E4B rodam offline em dispositivos móveis.&lt;/p&gt;

&lt;p&gt;Para desenvolvedores de API, o Gemma 4 é especialmente relevante: suporta chamada de função nativa, saída JSON estruturada e contexto de até 256K tokens. Isso o torna ideal para automação de testes de API, mocks e análise de respostas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Se você está usando o Gemma 4 e precisa validar respostas geradas por IA contra sua especificação OpenAPI, o Smart Mock 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; gera respostas mock conformes ao esquema da definição de API automaticamente. Sem regras manuais: ele lê seu esquema e produz dados contextuais instantaneamente. Baixe o Apidog e integre ao seu fluxo de API Gemma 4.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  O que é o Gemma 4 e o que mudou
&lt;/h2&gt;

&lt;p&gt;Gemma 4 é a quarta geração de modelos de linguagem abertos do Google DeepMind. O nome vem do latim para “pedra preciosa”. Desde 2024, foram mais de 400 milhões de downloads e 100.000 variantes criadas pela comunidade – o chamado “Gemmaverse”.&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%2Fuzbpjh1grry85motv4r3.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%2Fuzbpjh1grry85motv4r3.png" alt="Tabela de variantes do Gemma 4" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O Gemma 4 é lançado sob &lt;a href="https://goo.gle/gemma-4-apache-2" rel="noopener noreferrer"&gt;licença Apache 2.0&lt;/a&gt;, diferente das versões anteriores, permitindo uso, modificação e distribuição comercial sem restrições – ótimo para empresas que precisam de controle total.&lt;/p&gt;

&lt;p&gt;O maior diferencial do Gemma 4 é a “inteligência por parâmetro”: o 31B Dense entrega desempenho de ponta a uma fração do custo de modelos como GPT-4 ou Claude 3 Sonnet. No Arena AI (abril/2026), o Gemma 4 31B supera modelos de até 600B parâmetros.&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%2F5l4n6u3rs2tmchuq8rcy.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%2F5l4n6u3rs2tmchuq8rcy.png" alt="Benchmarks Gemma 4" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Principais novidades em relação ao Gemma 3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Entrada multimodal nativa&lt;/strong&gt;: processa imagens e vídeos, modelos edge (E2B/E4B) também áudio. Não disponível no Gemma 3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Janelas de contexto maiores&lt;/strong&gt;: E2B/E4B suportam 128K tokens, 26B/31B vão até 256K tokens – suficiente para um repositório inteiro num prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suporte a fluxo agêntico&lt;/strong&gt;: chamada de função nativa, saída JSON estruturada, instruções de sistema – perfeito para agentes que orquestram APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Raciocínio avançado&lt;/strong&gt;: grandes ganhos em matemática e instruções multi-etapa vs. Gemma 3 – útil para gerar testes de API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;140+ idiomas nativamente&lt;/strong&gt;: treinado em múltiplos idiomas, pronto para produtos globais.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Licenciamento Apache 2.0&lt;/strong&gt;: uso comercial sem ambiguidade.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Variantes e capacidades do Gemma 4
&lt;/h2&gt;

&lt;p&gt;O Google lançou o Gemma 4 em quatro tamanhos, cada um otimizado para um tipo de hardware:&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;Parâmetros&lt;/th&gt;
&lt;th&gt;Parâmetros ativos&lt;/th&gt;
&lt;th&gt;Contexto&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;E2B&lt;/td&gt;
&lt;td&gt;2B efetivos&lt;/td&gt;
&lt;td&gt;~2B&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Mobile, IoT, borda offline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E4B&lt;/td&gt;
&lt;td&gt;4B efetivos&lt;/td&gt;
&lt;td&gt;~4B&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Celulares, Raspberry Pi, Jetson Orin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26B MoE&lt;/td&gt;
&lt;td&gt;26B total&lt;/td&gt;
&lt;td&gt;~3.8B ativos&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Backend sensível a latência&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31B Dense&lt;/td&gt;
&lt;td&gt;31B&lt;/td&gt;
&lt;td&gt;31B&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Qualidade máxima, pesquisa, fine-tuning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Os modelos E2B/E4B são Mixture of Experts, ativando só parte dos parâmetros por token. Isso economiza bateria e RAM em dispositivos limitados, rodando totalmente offline no Android via AICore Developer Preview.&lt;/p&gt;

&lt;p&gt;O 26B MoE ativa apenas 3.8B parâmetros na inferência, sendo rápido para backends. O 31B Dense é para máxima qualidade e domínio específico. Todos suportam ajuste por instrução (IT) e base.&lt;/p&gt;

&lt;p&gt;Para API, prefira o 26B MoE (equilíbrio velocidade/qualidade) ou 31B Dense (quando precisa de JSON estruturado ou lógica complexa).&lt;/p&gt;

&lt;p&gt;Todos suportam chamada de função e saída JSON – essenciais para automação de API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como configurar a API do Gemma 4: passo a passo
&lt;/h2&gt;

&lt;p&gt;Você pode usar o Gemma 4 via Google AI Studio (mais rápido), Vertex AI (empresarial) ou localmente (Ollama/vLLM). Veja como fazer em cada um:&lt;/p&gt;

&lt;h3&gt;
  
  
  Opção 1: Google AI Studio (prototipagem rápida)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Acesse &lt;a href="https://aistudio.google.com" rel="noopener noreferrer"&gt;Google AI Studio&lt;/a&gt; e crie uma conta gratuita.&lt;/li&gt;
&lt;li&gt;Gere sua chave de API.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instale o SDK:&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;google-genai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Primeira chamada:&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;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;

&lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_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;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&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;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Generate a JSON object for a user account with id, email, and created_at fields.&lt;/span&gt;&lt;span class="sh"&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;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída JSON estruturada:&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;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_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;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;generation_config&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;response_mime_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;application/json&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;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Generate 3 sample user objects for an e-commerce API. 
Each user should have: id (integer), email (string), username (string), 
created_at (ISO 8601 timestamp), and subscription_tier (free|pro|enterprise).
Return as a JSON array.
&lt;/span&gt;&lt;span class="sh"&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;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&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;loads&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;text&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;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;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Opção 2: Implantação local com Ollama
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Instale o Ollama em &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;ollama.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Baixe o modelo:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Rode o servidor:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Faça uma chamada compatível com a API 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;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&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;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/api/chat&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="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;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;gemma4&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;messages&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;Generate a valid JSON response for a REST API /products endpoint. Include id, name, price, and stock fields.&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;stream&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="n"&gt;result&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="nf"&gt;json&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;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Opção 3: Chamada de função nativa (orquestração de API)
&lt;/h3&gt;

&lt;p&gt;Use chamada de função nativa para definir ferramentas que o modelo pode acionar:&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;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;

&lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_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;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;function_declarations&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;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_api_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;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;Retrieve the OpenAPI schema for a given endpoint path&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;endpoint_path&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;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;The API endpoint path, e.g. /users/{id}&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;method&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;GET&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;POST&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;PUT&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;DELETE&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;PATCH&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;endpoint_path&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;method&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="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&lt;/span&gt;&lt;span class="sh"&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I need to test the GET /users/{id} endpoint. What schema should the response follow?&lt;/span&gt;&lt;span class="sh"&gt;"&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;candidates&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;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parts&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;function_call&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;fc&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;candidates&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;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parts&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;function_call&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="s"&gt;Model called function: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&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="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="s"&gt;With args: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse padrão é base para pipelines de teste de API agênticos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gerando mocks de API com IA (Gemma 4)
&lt;/h2&gt;

&lt;p&gt;Para prototipar frontends ou testar casos edge, gere dados mock realistas via Gemma 4 a partir do seu schema OpenAPI:&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;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_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;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;generation_config&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;response_mime_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;application/json&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;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;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;id&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;integer&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;order_number&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;pattern&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;^ORD-[0-9]{6}$&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;status&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;pending&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;shipped&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;delivered&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;cancelled&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;total&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;number&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;minimum&lt;/span&gt;&lt;span class="sh"&gt;"&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="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;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;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;product_id&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;integer&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;quantity&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;integer&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;minimum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&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_price&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;number&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;created_at&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;format&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-time&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;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Generate 5 realistic mock responses for an order management API.
Each response must conform exactly to this JSON Schema:
&lt;/span&gt;&lt;span class="si"&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;schema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Make the data realistic: use realistic prices, product IDs, and varied statuses.
Return as a JSON array of 5 order objects.
&lt;/span&gt;&lt;span class="sh"&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;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;mock_orders&lt;/span&gt; &lt;span class="o"&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;loads&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;text&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;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;mock_orders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Gemma 4 entende restrições do JSON Schema (enum, pattern, range), então entrega mocks compatíveis com seu contrato de API – não apenas dados aleatórios.&lt;/p&gt;

&lt;p&gt;Você pode aplicar esse padrão para qualquer endpoint: forneça o schema OpenAPI e obtenha dados de teste prontos.&lt;/p&gt;

&lt;p&gt;Para mocks avançados, combine com lógica condicional no prompt. Com contexto de 256K tokens, você pode passar toda a especificação OpenAPI para gerar mocks para múltiplos endpoints de uma vez.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dica prática:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Exporte sua coleção 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; como OpenAPI, cole no prompt e peça para o Gemma 4 gerar 10 casos de teste por endpoint – você terá um dataset mock completo em segundos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testando respostas do Gemma 4 com Apidog
&lt;/h2&gt;

&lt;p&gt;Depois de gerar dados ou integrar o Gemma 4 ao seu pipeline de API, valide as respostas contra o schema com o recurso Test Scenarios 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;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%2Fzuylv8atrfpes4nysaff.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%2Fzuylv8atrfpes4nysaff.png" alt="Test cenário Apidog" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workflow recomendado:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passo 1:&lt;/strong&gt; Importe seu endpoint Gemma 4 no Apidog.&lt;br&gt;&lt;br&gt;
No projeto, crie um endpoint com a URL do wrapper Gemma 4 (ou direto do Google AI Studio). Defina o schema de resposta esperado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passo 2:&lt;/strong&gt; Use Smart Mock para gerar respostas base.&lt;br&gt;&lt;br&gt;
O Smart Mock 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; gera exemplos realistas via nome e tipo dos campos. &lt;code&gt;email&lt;/code&gt; recebe e-mail válido, &lt;code&gt;created_at&lt;/code&gt; um timestamp, etc.&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%2F397ntwjhpdvd3crnuv5d.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%2F397ntwjhpdvd3crnuv5d.png" alt="Smart Mock Apidog" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O Smart Mock prioriza: campos mock customizados &amp;gt; nome de propriedade &amp;gt; padrão do JSON Schema. Você pode sobrescrever campos e deixar o resto para o motor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passo 3:&lt;/strong&gt; Crie um Cenário de Teste para a pipeline Gemma 4.&lt;br&gt;&lt;br&gt;
No módulo Testes, crie um cenário, adicione chamada ao Gemma 4 e passos de asserção.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Chame endpoint de autenticação&lt;/li&gt;
&lt;li&gt;Envie prompt ao Gemma 4 com o token&lt;/li&gt;
&lt;li&gt;Extraia JSON do corpo de resposta&lt;/li&gt;
&lt;li&gt;Valide o JSON contra o schema&lt;/li&gt;
&lt;li&gt;Encaminhe os dados para outro endpoint POST&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Passo 4:&lt;/strong&gt; Configure as asserções.&lt;br&gt;&lt;br&gt;
Valide status code, headers e campos JSON. Com o Gemma 4, geralmente assert que &lt;code&gt;candidates[0].content.parts[0].text&lt;/code&gt; existe e corresponde ao schema.&lt;/p&gt;

&lt;p&gt;Use o Extract Variable do Apidog para puxar a saída do Gemma 4 para variáveis, usando em requisições subsequentes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passo 5:&lt;/strong&gt; Execute com testes orientados a dados.&lt;br&gt;&lt;br&gt;
O Apidog suporta CSV e JSON com prompts variados. Importe 50 variações e rode todos os cenários com um clique – ideal para testar robustez frente a diferentes entradas.&lt;/p&gt;

&lt;p&gt;O fluxo completo (do schema ao teste automatizado) leva cerca de 15 minutos para configurar. Depois, execute via Apidog CLI em seu CI/CD.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Geração de dados de teste de API:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Com modo JSON do Gemma 4 + seu schema OpenAPI, gere centenas de registros realistas em minutos. Peça para cobrir casos edge e deixe o modelo gerar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mock inteligente de API:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ao invés de mocks estáticos, retorne respostas contextuais. Um mock de busca retorna produtos diferentes dependendo da query, sem codificar manualmente cada caso.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Geração de documentação de API:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Alimente o codebase inteiro (contexto 256K) e peça ao Gemma 4 para gerar docs OpenAPI de endpoints não documentados. Use chamada de função para um agente que lê rotas e escreve specs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Validação de schema de resposta:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ao consumir APIs de terceiros, valide se as respostas batem com o esperado. O Gemma 4 pode analisar e identificar campos ausentes, tipos errados, enums inválidos – melhor que validadores de JSON Schema básicos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Geração automatizada de testes de regressão:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Dê ao Gemma 4 sua spec de API + bugs conhecidos e peça para ele escrever casos de teste que teriam capturado cada bug, incluindo relações complexas de schema.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gemma 4 vs. outros modelos abertos para API
&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;Parâmetros&lt;/th&gt;
&lt;th&gt;Contexto&lt;/th&gt;
&lt;th&gt;Saída JSON&lt;/th&gt;
&lt;th&gt;Chamada de função&lt;/th&gt;
&lt;th&gt;Licença&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4 31B&lt;/td&gt;
&lt;td&gt;31B&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Nativa&lt;/td&gt;
&lt;td&gt;Nativa&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4 26B MoE&lt;/td&gt;
&lt;td&gt;26B (3.8B ativos)&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Nativa&lt;/td&gt;
&lt;td&gt;Nativa&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama 3.3 70B&lt;/td&gt;
&lt;td&gt;70B&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Via prompt&lt;/td&gt;
&lt;td&gt;Via prompt&lt;/td&gt;
&lt;td&gt;Llama Community&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mistral 7B&lt;/td&gt;
&lt;td&gt;7B&lt;/td&gt;
&lt;td&gt;32K&lt;/td&gt;
&lt;td&gt;Via prompt&lt;/td&gt;
&lt;td&gt;Limitada&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 2.5 72B&lt;/td&gt;
&lt;td&gt;72B&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Nativa&lt;/td&gt;
&lt;td&gt;Nativa&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Para API, foque em: saída JSON nativa, chamada de função e tamanho de contexto. Gemma 4 31B/26B entregam tudo.&lt;/p&gt;

&lt;p&gt;O Llama 3.3 70B é o principal concorrente, mas consome o dobro de GPU e fica atrás no ranking Arena AI. O Mistral 7B é rápido mas limitado em contexto/funções. Qwen 2.5 72B é forte, especialmente para multilinguismo, mas exige hardware pesado.&lt;/p&gt;

&lt;p&gt;A licença Apache 2.0 do Gemma 4 é diferencial: ao contrário da Llama Community License, não tem restrições comerciais.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recomendação:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Para desenvolvimento de API: use o Gemma 4 26B MoE (latência baixa) ou 31B (qualidade máxima).&lt;/p&gt;

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

&lt;p&gt;O Gemma 4 é uma alternativa aberta robusta a APIs proprietárias de IA para automação de API. A licença Apache 2.0 simplifica o uso comercial. Chamada de função e saída JSON nativas facilitam integração sem engenharia de prompt.&lt;/p&gt;

&lt;p&gt;Com quatro tamanhos, cobre de mobile a estações de trabalho. O 26B MoE é a opção ideal para a maioria dos devs de API: qualidade quase de ponta, custo de inferência baixo.&lt;/p&gt;

&lt;p&gt;Combine Gemma 4 e &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 fechar o ciclo: gere dados, prototipe mocks e valide tudo com cenários de teste automatizados.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;O que é o Gemma 4?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
O Gemma 4 é a última geração de modelos de linguagem abertos do Google DeepMind, lançada em abril de 2026, disponível em quatro tamanhos (E2B, E4B, 26B MoE, 31B Dense) sob Apache 2.0. O 31B está em 3º lugar no Arena AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Gemma 4 é gratuito?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Os pesos são gratuitos sob Apache 2.0. Você paga apenas pela infraestrutura de computação que usar. No Google AI Studio há camada gratuita com limites. Vertex AI cobra conforme o uso de cloud.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Gemma 4 gera JSON estruturado?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim, via parâmetro &lt;code&gt;response_mime_type: "application/json"&lt;/code&gt; no SDK Google Generative AI – retorna JSON válido sempre, essencial para integração programática.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como o Gemma 4 se compara ao GPT-4o para APIs?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
GPT-4o é proprietário, sem opção local e mais caro. O Gemma 4 31B é gratuito localmente e competitivo em benchmarks de raciocínio. Para times que precisam de privacidade ou controle de custo, avalie o Gemma 4.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Posso fazer fine-tuning do Gemma 4?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim, via Google AI Studio, Vertex AI e ferramentas como Hugging Face TRL. Fine-tuning em schemas e padrões de resposta pode melhorar a qualidade para casos específicos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Que hardware roda o Gemma 4 localmente?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
31B e 26B cabem em uma NVIDIA H100 80GB bfloat16. Versões quantizadas rodam em GPUs com 16-24GB VRAM. E4B/E2B rodam em smartphones, Raspberry Pi, Jetson, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Gemma 4 suporta chamada de função?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim, todos suportam chamada de função nativa. Defina ferramentas como objetos JSON, o modelo chama conforme necessário, passando argumentos estruturados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como testar respostas do Gemma 4 automaticamente?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use os Cenários de Teste 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;: importe seu endpoint, configure as etapas e asserções, e rode local ou no CI/CD a cada push.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Links úteis:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://aistudio.google.com" rel="noopener noreferrer"&gt;Gemma 4 no Google AI Studio&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;
&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>API Qwen3.6-Plus: Desempenho Superior ao Claude em Testes de Terminal</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Thu, 02 Apr 2026 09:29:59 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/api-qwen36-plus-desempenho-superior-ao-claude-em-testes-de-terminal-14ad</link>
      <guid>https://dev.to/lucas_ferreira/api-qwen36-plus-desempenho-superior-ao-claude-em-testes-de-terminal-14ad</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Qwen3.6-Plus foi lançado oficialmente. Ele atinge 78,8% no SWE-bench Verified e 61,6% no Terminal-Bench 2.0, superando o Claude Opus 4.5 nesse benchmark. Possui janela de contexto de 1M de tokens, novo parâmetro &lt;code&gt;preserve_thinking&lt;/code&gt; para loops de agente e integração direta com Claude Code, OpenClaw e Qwen Code via API compatível com 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;h2&gt;
  
  
  Da prévia ao lançamento
&lt;/h2&gt;

&lt;p&gt;Se você acompanhou nosso &lt;a href="http://apidog.com/blog/qwen-3-6-free-openrouter/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia anterior sobre o Qwen 3.6 Plus Preview no OpenRouter&lt;/a&gt;, já conhece o potencial do modelo. A prévia foi lançada em 30 de março, sem lista de espera e com acesso gratuito via OpenRouter. Nos dois primeiros dias, processou mais de 400 milhões de tokens em 400.000 requisições.&lt;/p&gt;

&lt;p&gt;Agora, o lançamento oficial traz a versão de produção: API estável, SLA garantido e o novo parâmetro de API para agentes multi-etapas.&lt;/p&gt;

&lt;p&gt;Este guia explica o que mudou, como integrar com a API e como validar tudo no Apidog antes do deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Qwen3.6-Plus
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://qwen.ai/blog?id=qwen3.6" rel="noopener noreferrer"&gt;Qwen3.6-Plus&lt;/a&gt; é um modelo MoE (mixture of experts) hospedado pela equipe Qwen da Alibaba. Utiliza ativação esparsa, ativando apenas parte dos parâmetros por token, garantindo desempenho forte com menor custo computacional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Principais especificações:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Janela de contexto: 1 milhão de tokens&lt;/li&gt;
&lt;li&gt;Raciocínio em cadeia de pensamento (CoT) obrigatório&lt;/li&gt;
&lt;li&gt;Novo parâmetro &lt;code&gt;preserve_thinking&lt;/code&gt; para agentes&lt;/li&gt;
&lt;li&gt;Suporte multimodal: visão, vídeo, documentos&lt;/li&gt;
&lt;li&gt;API compatível com OpenAI, Anthropic e OpenAI Responses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Versões menores open source serão lançadas em breve. Se você precisa dos pesos, fique atento.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resultados dos benchmarks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Agentes de codificação
&lt;/h3&gt;

&lt;p&gt;Qwen3.6-Plus fica um pouco atrás do Claude Opus 4.5 no SWE-bench, mas lidera nas operações de terminal.&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%2F56nehdw7rei6u9ghff6v.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%2F56nehdw7rei6u9ghff6v.png" alt="Gráfico de benchmarking de agentes de codificação. Qwen3.6-Plus vs Claude Opus 4.5 em SWE-bench Verified (78.8% vs 80.9%) e Terminal-Bench 2.0 (61.6% vs 59.3%)" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No Terminal-Bench 2.0 (operações reais de shell, múltiplas etapas, 3h de timeout, 32 CPUs), Qwen3.6-Plus faz 61,6% vs 59,3% do Claude Opus 4.5 — diferença relevante para automação de terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agentes gerais e uso de ferramentas
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;Claude Opus 4.5&lt;/th&gt;
&lt;th&gt;Qwen3.6-Plus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TAU3-Bench&lt;/td&gt;
&lt;td&gt;70.2%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;70.7%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepPlanning&lt;/td&gt;
&lt;td&gt;33.9%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;41.5%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCPMark&lt;/td&gt;
&lt;td&gt;42.3%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;48.2%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP-Atlas&lt;/td&gt;
&lt;td&gt;71.8%&lt;/td&gt;
&lt;td&gt;74.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WideSearch&lt;/td&gt;
&lt;td&gt;76.4%&lt;/td&gt;
&lt;td&gt;74.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Destaque para o MCPMark (integrações GitHub MCP) e DeepPlanning (tarefas de planejamento de longo prazo).&lt;/p&gt;

&lt;h3&gt;
  
  
  Raciocínio e conhecimento
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;Claude Opus 4.5&lt;/th&gt;
&lt;th&gt;Qwen3.6-Plus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPQA&lt;/td&gt;
&lt;td&gt;87.0%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;90.4%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiveCodeBench v6&lt;/td&gt;
&lt;td&gt;84.8%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;87.1%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IFEval strict&lt;/td&gt;
&lt;td&gt;90.9%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;94.3%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMLU-Pro&lt;/td&gt;
&lt;td&gt;89.5%&lt;/td&gt;
&lt;td&gt;88.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GPQA e IFEval são importantes para tarefas de raciocínio e instruções complexas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multimodal
&lt;/h3&gt;

&lt;p&gt;Qwen3.6-Plus é nativamente multimodal e lidera benchmarks de documentos, espaciais e contagem.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;Qwen3.6-Plus&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;OmniDocBench 1.5&lt;/td&gt;
&lt;td&gt;91.2%&lt;/td&gt;
&lt;td&gt;Líder na tabela&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RefCOCO avg&lt;/td&gt;
&lt;td&gt;93.5%&lt;/td&gt;
&lt;td&gt;Líder na tabela&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;We-Math&lt;/td&gt;
&lt;td&gt;89.0%&lt;/td&gt;
&lt;td&gt;Líder na tabela&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CountBench&lt;/td&gt;
&lt;td&gt;97.6%&lt;/td&gt;
&lt;td&gt;Líder na tabela&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OSWorld-Verified&lt;/td&gt;
&lt;td&gt;62.5%&lt;/td&gt;
&lt;td&gt;Atrás de Claude (66,3%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Em tarefas de compreensão de documentos e ancoragem espacial, Qwen3.6-Plus se destaca.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como chamar a API
&lt;/h2&gt;

&lt;p&gt;O Qwen3.6-Plus está disponível no Alibaba Cloud Model Studio. Pegue sua chave em modelstudio.alibabacloud.com.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;URLs regionais:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Singapura: &lt;code&gt;https://dashscope-intl.aliyuncs.com/compatible-mode/v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Pequim: &lt;code&gt;https://dashscope.aliyuncs.com/compatible-mode/v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Virgínia (EUA): &lt;code&gt;https://dashscope-us.aliyuncs.com/compatible-mode/v1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Chamada básica com streaming
&lt;/h3&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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&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;DASHSCOPE_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://dashscope-intl.aliyuncs.com/compatible-mode/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;completion&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;qwen3.6-plus&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;Review this Python function and find bugs.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;extra_body&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;enable_thinking&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="n"&gt;stream&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;span class="n"&gt;reasoning&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
&lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
&lt;span class="n"&gt;is_answering&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&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;completion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&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;choices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;continue&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;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="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reasoning_content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&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;reasoning_content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;is_answering&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;reasoning&lt;/span&gt; &lt;span class="o"&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;reasoning_content&lt;/span&gt;
    &lt;span class="k"&gt;if&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="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;is_answering&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;is_answering&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&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="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;content&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;h3&gt;
  
  
  O parâmetro &lt;code&gt;preserve_thinking&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Na prévia, só o raciocínio atual era mantido. Agora, com &lt;code&gt;preserve_thinking: true&lt;/code&gt;, o modelo retém toda a cadeia de pensamento da conversa — recomendado para loops de agente multi-etapas.&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;completion&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;qwen3.6-plus&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;conversation_history&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;extra_body&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;enable_thinking&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;preserve_thinking&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="c1"&gt;# mantém toda a cadeia de raciocínio
&lt;/span&gt;    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;stream&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;h3&gt;
  
  
  Use Qwen3.6-Plus com Claude Code
&lt;/h3&gt;

&lt;p&gt;A API Qwen é compatível com o protocolo Anthropic. Basta ajustar as variáveis de ambiente para usar com Claude Code:&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; &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic-ai/claude-code

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"qwen3.6-plus"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_SMALL_FAST_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"qwen3.6-plus"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://dashscope-intl.aliyuncs.com/apps/anthropic
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_dashscope_api_key

claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use Qwen3.6-Plus com OpenClaw
&lt;/h3&gt;

&lt;p&gt;OpenClaw é um agente de codificação open source auto-hospedado. Instale e aponte para o Model Studio:&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="c"&gt;# Instalar (Node.js 22+)&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://molt.bot/install.sh | bash

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DASHSCOPE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_key
openclaw dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Edite &lt;code&gt;~/.openclaw/openclaw.json&lt;/code&gt; e 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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"models"&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;"providers"&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="s2"&gt;"alibaba-coding-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;"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;"https://coding-intl.dashscope.aliyuncs.com/v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"apiKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${DASHSCOPE_API_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;"models"&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="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;"qwen3.6-plus"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"reasoning"&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="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;"agents"&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;"defaults"&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="nl"&gt;"models"&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;"qwen3.6-plus"&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;h3&gt;
  
  
  Use Qwen3.6-Plus com Qwen Code
&lt;/h3&gt;

&lt;p&gt;Qwen Code é o agente de terminal open source da Alibaba, com 1.000 chamadas de API gratuitas por dia via OAuth.&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; &lt;span class="nt"&gt;-g&lt;/span&gt; @qwen-code/qwen-code@latest
qwen
&lt;span class="c"&gt;# Digite /auth para ativar o nível gratuito&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Por que &lt;code&gt;preserve_thinking&lt;/code&gt; muda o comportamento do agente
&lt;/h2&gt;

&lt;p&gt;A maioria das APIs LLM descarta o raciocínio de etapas anteriores. Em agentes multi-turn, isso gera inconsistência: o modelo não lembra por que tomou decisões passadas.&lt;/p&gt;

&lt;p&gt;Com &lt;code&gt;preserve_thinking&lt;/code&gt;, toda a cadeia de raciocínio é mantida — essencial para tarefas complexas de múltiplas etapas.&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;conversation&lt;/span&gt; &lt;span class="o"&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;agent_step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;preserve&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;span class="n"&gt;conversation&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;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="n"&gt;user_message&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;qwen3.6-plus&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;conversation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;extra_body&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;enable_thinking&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;preserve_thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;preserve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;message&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="n"&gt;conversation&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;assistant&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="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="k"&gt;return&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="c1"&gt;# Exemplo: agente de revisão de código multi-etapas
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agent_step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Analyze the auth module for security issues.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agent_step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Now suggest fixes for the top 3 issues you found.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agent_step&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 tests that validate each fix.&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;p&gt;Sem &lt;code&gt;preserve_thinking&lt;/code&gt;, o modelo perde o histórico da análise. Com ele, a consistência aumenta e o raciocínio é compartilhado entre etapas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Para que é melhor
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Correção de bugs em nível de repositório&lt;/strong&gt;: SWE-bench Verified (78,8%) e SWE-bench Pro (56,6%) são altamente competitivos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automação de terminal&lt;/strong&gt;: Liderança no Terminal-Bench 2.0 para fluxos shell intensivos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chamada de ferramentas MCP&lt;/strong&gt;: Liderança no MCPMark (48,2%).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Análise de documentos longos&lt;/strong&gt;: Janela de 1M tokens, excelente para revisões extensas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geração de código frontend&lt;/strong&gt;: Empate técnico com Claude Opus 4.5 no QwenWebBench.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multilíngue&lt;/strong&gt;: WMT24++ (84,3%) e MAXIFE (88,2%) mostram força em vários idiomas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testando chamadas de API do Qwen3.6-Plus com Apidog
&lt;/h2&gt;

&lt;p&gt;O endpoint é compatível com OpenAI. Importe para 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; e teste como qualquer API.&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%2F3lln60azqwzlva81kvps.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%2F3lln60azqwzlva81kvps.png" alt="Captura de tela do Apidog mostrando configuração para Qwen3.6-Plus" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Configure uma requisição POST para &lt;code&gt;https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions&lt;/code&gt; e adicione sua chave de API como variável de ambiente: &lt;code&gt;Authorization: Bearer {{DASHSCOPE_API_KEY}}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Asserções de resposta:&lt;/strong&gt;&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="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Response contains choices&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;pm&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;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;choices&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;pm&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;body&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;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;and&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&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 empty reasoning when thinking enabled&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&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="nf"&gt;json&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;choice&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;reasoning_content&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&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;choice&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;reasoning_content&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;empty&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;Use o Smart Mock do Apidog para simular respostas durante o desenvolvimento — economize tokens e agilize testes.&lt;/p&gt;

&lt;p&gt;Para agentes multi-turn, crie Cenários de Teste encadeando múltiplas requisições e valide que o &lt;code&gt;preserve_thinking&lt;/code&gt; mantém o raciocínio entre etapas.&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;Baixe o Apidog gratuitamente&lt;/a&gt; para configurar esses testes.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que vem a seguir
&lt;/h2&gt;

&lt;p&gt;A equipe Qwen vai lançar variantes menores open source nos próximos dias — modelos MoE esparsos com pesos Apache 2.0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No roadmap:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tarefas de repositório com horizontes mais longos e múltiplos arquivos&lt;/li&gt;
&lt;li&gt;Agentes multimodais mais avançados (GUI, codificação visual nativa)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se seguir o padrão do Qwen3.5, essas variantes open source devem se tornar padrão para agentes de codificação auto-hospedados rapidamente.&lt;/p&gt;

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

&lt;p&gt;O Qwen3.6-Plus fecha a distância com Claude Opus 4.5 em codificação e lidera em operações de terminal, MCP e planejamento. Janela de 1M de tokens, protocolo Anthropic e &lt;code&gt;preserve_thinking&lt;/code&gt; tornam-no prático para agentes de produção.&lt;/p&gt;

&lt;p&gt;O período de prévia no OpenRouter foi útil para testes. A API oficial garante estabilidade, SLA e recursos avançados para fluxos multi-turn.&lt;/p&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; cuida dos testes: importe o endpoint OpenAI, escreva asserções, use mock, valide respostas e rode testes de regressão sempre que atualizar modelo ou API.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Qual a diferença entre Qwen3.6-Plus e a prévia?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A prévia (&lt;code&gt;qwen/qwen3.6-plus-preview&lt;/code&gt;) saiu no OpenRouter em 30 de março de 2026. O lançamento oficial adiciona o parâmetro &lt;code&gt;preserve_thinking&lt;/code&gt;, SLA garantido e suporte ao Model Studio. Variantes menores open source estão a caminho.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que é &lt;code&gt;preserve_thinking&lt;/code&gt; e quando devo usar?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Por padrão, só o raciocínio da interação atual é mantido. Com &lt;code&gt;preserve_thinking: true&lt;/code&gt;, o modelo guarda toda a cadeia de pensamento da conversa. Use em loops de agente multi-etapas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como o Qwen3.6-Plus se compara ao Claude Opus 4.5?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Claude lidera no SWE-bench Verified (80,9% vs 78,8%) e no OSWorld-Verified (66,3% vs 62,5%). Qwen3.6-Plus domina Terminal-Bench 2.0 (61,6% vs 59,3%), MCPMark (48,2% vs 42,3%), DeepPlanning (41,5% vs 33,9%) e GPQA (90,4% vs 87,0%).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Posso usar Qwen3.6-Plus com Claude Code?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim. Defina &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; para o endpoint Anthropic do Dashscope, &lt;code&gt;ANTHROPIC_MODEL&lt;/code&gt; para &lt;code&gt;qwen3.6-plus&lt;/code&gt; e &lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt; para sua chave de API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Qwen3.6-Plus é open source?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
O modelo hospedado não é, mas variantes menores com pesos públicos serão lançadas em dias.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como obtenho acesso gratuito?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Instale o Qwen Code (&lt;code&gt;npm install -g @qwen-code/qwen-code@latest&lt;/code&gt;), rode &lt;code&gt;qwen&lt;/code&gt; e use &lt;code&gt;/auth&lt;/code&gt; para ativar 1.000 chamadas diárias gratuitas via OAuth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qual janela de contexto ele suporta?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
1 milhão de tokens por padrão. Alguns benchmarks usaram 256K para comparação, mas a API suporta 1M.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como testo a integração da API antes do deploy?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Importe o endpoint no Apidog, adicione sua chave de API como variável de ambiente, escreva asserções e use o Smart Mock para testar offline. Encadeie requisições em Cenários de Teste para validar comportamento multi-turn de ponta a ponta.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>llm</category>
      <category>news</category>
    </item>
    <item>
      <title>Holo3: O Melhor Modelo de Uso do Computador?</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Thu, 02 Apr 2026 08:51:12 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/holo3-o-melhor-modelo-de-uso-do-computador-2imj</link>
      <guid>https://dev.to/lucas_ferreira/holo3-o-melhor-modelo-de-uso-do-computador-2imj</guid>
      <description>&lt;h2&gt;
  
  
  RESUMO
&lt;/h2&gt;

&lt;p&gt;A H Company lançou o Holo3 em 31 de março de 2026, um modelo de mistura de especialistas que alcançou 78,85% no OSWorld-Verified, a pontuação mais alta já registrada no principal benchmark de uso de computador desktop. Ele supera o GPT-5.4 e o Opus 4.6 por uma fração do custo. A API está ativa agora, e a variante 35B é de código aberto (open-weight) no HuggingFace sob a licença Apache 2.0.&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;h2&gt;
  
  
  A lacuna de uso de computador que a maioria dos desenvolvedores não resolveu
&lt;/h2&gt;

&lt;p&gt;Você já automatizou suas APIs e seu pipeline de CI/CD roda sem falhas, mas tarefas envolvendo software legado sem API, aplicativos desktop antigos ou operações multi-etapa cruzando várias interfaces de usuário continuam exigindo intervenção manual.&lt;/p&gt;

&lt;p&gt;Ferramentas tradicionais de RPA (UiPath, Automation Anywhere) dependem de scripts frágeis baseados em coordenadas de tela, que quebram com mudanças simples na UI. A alternativa era trabalho manual.&lt;/p&gt;

&lt;p&gt;A IA de uso de computador muda esse cenário. Modelos que visualizam capturas de tela e emitem comandos de clique, digitação e rolagem podem operar qualquer GUI sem necessidade de API. O Holo3, lançado pela H Company, é hoje o modelo mais forte disponível para esse tipo de automação.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Se você automatiza fluxos de trabalho ou pipelines de teste envolvendo software desktop, vale a pena conhecer a API do Holo3 agora. E, se utiliza o Apidog para projetar e testar APIs, veja abaixo como integrar chamadas do Holo3 ao seu fluxo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  O que é Holo3?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://hcompany.ai/holo3" rel="noopener noreferrer"&gt;Holo3&lt;/a&gt; é um modelo de uso de computador: você fornece uma captura de tela de um desktop ou navegador e uma tarefa; o modelo retorna ações (cliques, teclas, comandos de rolagem) para executar na tela. Você captura o resultado, envia nova captura, e repete até a tarefa terminar.&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%2F3aoh5dvl0jtpi764v8qu.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%2F3aoh5dvl0jtpi764v8qu.png" alt="Screenshot Holo3" width="800" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A H Company oferece duas versões:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Holo3-122B-A10B&lt;/strong&gt; – Principal modelo. 122B parâmetros totais, 10B ativos (MoE esparso). Disponível via API hospedada em hcompany.ai/holo-models-api. Recordista nos benchmarks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Holo3-35B-A3B&lt;/strong&gt; – 35B totais, 3B ativos. Open-weight no &lt;a href="https://huggingface.co/Hcompany/Holo3-35B-A3B" rel="noopener noreferrer"&gt;HuggingFace&lt;/a&gt;, licença Apache 2.0. Disponível no nível gratuito da API e self-hostable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A arquitetura MoE ativa só uma fração dos parâmetros por token, reduzindo custo de execução em relação ao total de parâmetros. Segundo a H Company, o Holo3-122B-A10B custa menos por tarefa que GPT-5.4 e Opus 4.6.&lt;/p&gt;

&lt;h2&gt;
  
  
  OSWorld-Verified: o que o benchmark realmente mede
&lt;/h2&gt;

&lt;p&gt;O OSWorld-Verified é o benchmark referência para IA de uso de computador. Ao invés de avaliar somente saída textual, testa a execução real: o agente deve completar tarefas em um desktop real, e o sucesso é verificado pelo estado do sistema após a execução.&lt;/p&gt;

&lt;p&gt;Tarefas avaliadas incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ações simples de aplicativo (abrir arquivo, preencher formulário)&lt;/li&gt;
&lt;li&gt;Fluxos entre aplicativos (extrair valor de PDF, atualizar planilha, enviar e-mail)&lt;/li&gt;
&lt;li&gt;Sequências multi-app de longo horizonte, exigindo raciocínio e manutenção de contexto&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Holo3-122B-A10B atinge &lt;strong&gt;78,85%&lt;/strong&gt; no OSWorld-Verified. Para comparação: até recentemente, 40% era considerado topo de linha; modelos anteriores de Anthropic e OpenAI ficavam entre 60-65%.&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%2F15te4auw5vh59u6lsyf9.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%2F15te4auw5vh59u6lsyf9.png" alt="Benchmark Holo3" width="800" height="631"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nos Benchmarks Corporativos Internos da H Company (486 tarefas em E-commerce, negócios, colaboração e multi-app), o Holo3 se destaca em fluxos multi-aplicativo — coordenando dados entre vários sistemas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como o Holo3 foi treinado: o Ciclo de Aprendizagem Agêntico
&lt;/h2&gt;

&lt;p&gt;Ao contrário de modelos baseados só em demonstrações estáticas, o Holo3 foi treinado num ciclo contínuo chamado Ciclo de Aprendizagem Agêntico:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dados de Navegação Sintéticos&lt;/strong&gt; – Instruções humanas e geradas criam exemplos específicos de navegação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aumento Fora do Domínio&lt;/strong&gt; – Os cenários são expandidos para cobrir estados de UI inesperados e casos de borda.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aprendizado por Reforço Curado&lt;/strong&gt; – Cada amostra é filtrada e usada em pipeline de RL para maximizar a taxa de conclusão de tarefas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O treinamento ocorre na &lt;strong&gt;Fábrica de Ambientes Sintéticos&lt;/strong&gt;: agentes criam apps web completos baseados em cenários, com tarefas verificáveis e validação ponta-a-ponta. Isso garante aprendizado em workflows realistas e não exemplos simplificados.&lt;/p&gt;

&lt;p&gt;O resultado: o Holo3 supera modelos Qwen3.5 com mais parâmetros nos mesmos benchmarks. A metodologia de treinamento é o diferencial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como chamar a API do Holo3
&lt;/h2&gt;

&lt;p&gt;A API do Holo3 segue o padrão de loop: captura de tela → ação → repetir. Veja como integrar:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Configurar autenticação
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Base URL da API H Company&lt;/span&gt;
https://api.hcompany.ai/v1

&lt;span class="c"&gt;# Headers&lt;/span&gt;
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obtenha sua chave de API em hcompany.ai/holo-models-api. O nível gratuito cobre o Holo3-35B-A3B.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Enviar uma captura de tela com tarefa
&lt;/h3&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;base64&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pyautogui&lt;/span&gt;

&lt;span class="n"&gt;screenshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pyautogui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/screen.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/screen.png&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;rb&lt;/span&gt;&lt;span class="sh"&gt;"&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;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;image_b64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;decode&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;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&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.hcompany.ai/v1/computer-use&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&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;Authorization&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;Bearer YOUR_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;json&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;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;holo3-122b-a10b&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;task&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;Open the invoice folder and find the most recent PDF&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;screenshot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;image_b64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;screen_width&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1920&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;screen_height&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1080&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;action&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="nf"&gt;json&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;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Analisar e executar a ação retornada
&lt;/h3&gt;

&lt;p&gt;A resposta traz ações estruturadas para executar na máquina host:&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;"action_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;"click"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"coordinate"&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="mi"&gt;245&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;380&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The invoice folder icon is visible at this position"&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;Tipos comuns: &lt;code&gt;click&lt;/code&gt;, &lt;code&gt;double_click&lt;/code&gt;, &lt;code&gt;right_click&lt;/code&gt;, &lt;code&gt;type&lt;/code&gt;, &lt;code&gt;key&lt;/code&gt;, &lt;code&gt;scroll&lt;/code&gt;, &lt;code&gt;screenshot_request&lt;/code&gt; (se o modelo precisar de nova visão), e &lt;code&gt;task_complete&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Repetir até a tarefa ser concluída
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_computer_use_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&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;step&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_steps&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;screenshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;capture_screen&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="nf"&gt;call_holo3_api&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;action&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&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;action&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;task_complete&lt;/span&gt;&lt;span class="sh"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Done in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; steps&lt;/span&gt;&lt;span class="sh"&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;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="nf"&gt;execute_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TimeoutError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Task not completed within step limit&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&gt;
  
  
  Testando chamadas da API do Holo3 com Apidog
&lt;/h2&gt;

&lt;p&gt;Ao integrar a API do Holo3, valide sua automação para garantir estabilidade. 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; facilita esse processo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Importar o endpoint:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No Apidog, crie uma requisição HTTP para &lt;code&gt;https://api.hcompany.ai/v1/computer-use&lt;/code&gt;. Use variáveis de ambiente para as chaves de autenticação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configurar validação de resposta:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Adicione asserções de teste no Apidog para checar a estrutura das respostas:&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="c1"&gt;// No script pós-resposta do Apidog&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Action type is valid&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;validActions&lt;/span&gt; &lt;span class="o"&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;click&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;type&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;key&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;scroll&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;task_complete&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;screenshot_request&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="nx"&gt;pm&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;validActions&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Coordinates are within screen bounds&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;action&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;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coordinate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;pm&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;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coordinate&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;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;within&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="mi"&gt;1920&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;pm&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;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coordinate&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;within&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="mi"&gt;1080&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;&lt;strong&gt;Simular a API durante o desenvolvimento:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use o Smart Mock do Apidog para gerar respostas realistas do Holo3 sem consumir créditos da API real. Isso permite desenvolver e testar o frontend ou orquestração em paralelo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Executar cenários de teste:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Encadeie múltiplas requisições do Holo3 em um Cenário de Teste do Apidog para simular fluxos multi-etapas. Assim, você valida a sequência de ações antes de rodar em ambiente real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Holo3 vs. Claude Computer Use vs. OpenAI Operator
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Holo3-122B&lt;/th&gt;
&lt;th&gt;Holo3-35B&lt;/th&gt;
&lt;th&gt;Claude Computer Use&lt;/th&gt;
&lt;th&gt;OpenAI Operator&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OSWorld-Verified&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;78,85%&lt;/td&gt;
&lt;td&gt;~55% (est.)&lt;/td&gt;
&lt;td&gt;~65%&lt;/td&gt;
&lt;td&gt;~62%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Acesso à API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;Sim (grátis)&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pesos abertos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;Sim (Apache 2.0)&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auto-hospedável&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custo vs. GPT-5.4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Menor&lt;/td&gt;
&lt;td&gt;Muito menor&lt;/td&gt;
&lt;td&gt;Comparável&lt;/td&gt;
&lt;td&gt;Preço do GPT-5.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Melhor para&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Produção&lt;/td&gt;
&lt;td&gt;Dev/teste/OSS&lt;/td&gt;
&lt;td&gt;Ecossistema Anthropic&lt;/td&gt;
&lt;td&gt;Ecossistema OpenAI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A escolha depende do seu stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Holo3-122B:&lt;/strong&gt; máxima precisão para produção crítica em fluxos multi-app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Holo3-35B:&lt;/strong&gt; ideal para desenvolvimento, testes, projetos open source, ou se quiser hospedar localmente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Computer Use:&lt;/strong&gt; integração direta no ecossistema Anthropic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Operator:&lt;/strong&gt; se já usa GPT-5.4 e quer unificar fornecedores.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Casos de uso empresariais
&lt;/h2&gt;

&lt;p&gt;O Holo3 resolve fluxos de trabalho que não têm integração limpa via API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Entrada de dados em sistemas legados:&lt;/strong&gt; ERPs ou CRMs antigos, sem API REST. O Holo3 interage direto na UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reconciliação entre plataformas:&lt;/strong&gt; Extrair dados de PDF, validar em planilha, atualizar painel externo — tudo autônomo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testes de regressão web:&lt;/strong&gt; Esqueça scripts Selenium frágeis. Descreva a tarefa em linguagem natural e o Holo3 executa, adaptando-se a mudanças na UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inteligência competitiva:&lt;/strong&gt; Extraia dados estruturados de sites que bloqueiam scraping tradicional.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Benchmarks internos mostram o Holo3 com desempenho consistente em E-commerce, Negócios, Colaboração e especialmente Multi-App, onde a metodologia de treinamento se destaca.&lt;/p&gt;

&lt;h2&gt;
  
  
  Próximos passos: Agência Adaptativa
&lt;/h2&gt;

&lt;p&gt;O próximo objetivo da H Company é a &lt;strong&gt;Agência Adaptativa&lt;/strong&gt; — modelos capazes de navegar em softwares empresariais inéditos, aprendendo a UI em tempo real, sem depender de dados prévios do ambiente.&lt;/p&gt;

&lt;p&gt;Os modelos atuais, incluindo o Holo3, ainda dependem de ambientes conhecidos para desempenho ideal. Com Agência Adaptativa, o modelo construiria um modelo funcional do software ao interagir pela primeira vez, eliminando a última limitação para automação IA total em empresas.&lt;/p&gt;

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

&lt;p&gt;O Holo3 eleva o padrão de automação desktop: atinge 78,85% no OSWorld-Verified e supera alternativas Claude e GPT em tarefas multi-etapas complexas. O modelo Holo3-35B-A3B é gratuito e open-weight (Apache 2.0), facilitando testes e validação por desenvolvedores.&lt;/p&gt;

&lt;p&gt;A integração é direta: capture a tela, envie via POST para a API, execute a ação recebida e repita. O Apidog torna esse ciclo confiável — validando respostas, simulando durante o desenvolvimento e encadeando cenários de teste.&lt;/p&gt;

&lt;p&gt;Se você constrói automação para GUIs de desktop, experimente o Apidog gratuitamente e valide sua integração Holo3 antes de entrar em produção.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;O que é Holo3?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
O Holo3 é um modelo de IA de uso de computador da H Company que recebe capturas de tela como entrada e retorna ações (cliques, toques de tecla, rolagens) para completar tarefas em um desktop ou navegador. Ele alcança 78,85% no benchmark OSWorld-Verified, o resultado mais alto registrado nesse teste.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Holo3 é de código aberto?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A variante menor, Holo3-35B-A3B, é open-weight (licença Apache 2.0) e disponível no HuggingFace. O Holo3-122B-A10B é apenas via API. Ambos estão acessíveis via API da H Company, com nível gratuito para o 35B.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como funciona o benchmark OSWorld?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
O OSWorld testa agentes de IA em tarefas reais: navegação web, gerenciamento de arquivos, fluxos multi-aplicativo. A verificação é feita pelo estado real do sistema após execução, não apenas saída textual.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como o Holo3 se compara ao Claude Computer Use?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
O Holo3-122B pontua mais alto no OSWorld-Verified (78,85% vs. ~65% para Claude) e tem custo menor por tarefa. Claude Computer Use é vantajoso para equipes já integradas ao ecossistema Anthropic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Posso executar o Holo3 localmente?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim, usando o Holo3-35B-A3B — pesos disponíveis no HuggingFace sob Apache 2.0. O 122B é apenas via API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Principais casos de uso para APIs de uso de computador?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Automação de sistemas legados, fluxos multi-app de dados, testes de regressão web sem seletores frágeis, inteligência competitiva e qualquer workflow desktop que hoje exige intervenção manual.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como testar minha integração da API do Holo3?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use o Apidog para importar endpoints, configurar validações de resposta, simular a API e encadear testes. Isso identifica problemas antes de rodar automação em produção.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que é "Agência Adaptativa" no roadmap do Holo3?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Modelos capazes de navegar em softwares empresariais inéditos, aprendendo a UI em tempo real, sem depender de dados de treinamento prévios — eliminando o maior gargalo da automação IA em empresas.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Ataque à cadeia de suprimentos axios@1.14.1: O que fazer agora</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Thu, 02 Apr 2026 08:47:54 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/ataque-a-cadeia-de-suprimentos-axios1141-o-que-fazer-agora-3gjg</link>
      <guid>https://dev.to/lucas_ferreira/ataque-a-cadeia-de-suprimentos-axios1141-o-que-fazer-agora-3gjg</guid>
      <description>&lt;h2&gt;
  
  
  Em resumo
&lt;/h2&gt;

&lt;p&gt;Em 30 e 31 de março de 2026, as versões 1.14.1 e 0.30.4 do axios foram comprometidas no npm com uma dependência maliciosa que instala um cavalo de Troia de acesso remoto (RAT) em máquinas infectadas. Ambas as versões foram despublicadas. A versão segura é a 1.14.0. Se você instalou &lt;a href="mailto:axios@1.14.1"&gt;axios@1.14.1&lt;/a&gt; ou 0.30.4, trate a máquina como comprometida e rotacione todas as credenciais imediatamente.&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;h2&gt;
  
  
  O que é axios e por que isso importa
&lt;/h2&gt;

&lt;p&gt;axios tem 100 milhões de downloads semanais no npm. É o cliente HTTP em inúmeros frameworks de frontend, serviços de backend Node.js e aplicações corporativas. Quando um pacote tão fundamental é comprometido, o raio de impacto é enorme — desenvolvedores que executaram &lt;code&gt;npm install&lt;/code&gt; em uma pequena janela de tempo entre 30 e 31 de março instalaram malware em suas máquinas sem saber.&lt;/p&gt;

&lt;p&gt;Este não é um risco hipotético de cadeia de suprimentos. Aconteceu, foi confirmado, e a carga útil (payload) era séria: um cavalo de Troia de acesso remoto em múltiplas etapas capaz de executar comandos arbitrários, exfiltrar dados do sistema e persistir em máquinas infectadas.&lt;/p&gt;

&lt;p&gt;Se sua equipe usa axios, e você utiliza o Apidog para projetar e testar suas integrações de cliente HTTP, leia isto antes do seu próximo deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cronologia do ataque
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;30 de março de 2026 — 23:59:12 UTC:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Um pacote malicioso chamado &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt; é publicado no npm por uma conta usando &lt;code&gt;nrwise@proton.me&lt;/code&gt;. Uma versão anterior limpa (&lt;code&gt;4.2.0&lt;/code&gt;) havia sido publicada 18 horas antes como um typosquat da biblioteca legítima &lt;code&gt;crypto-js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;31 de março de 2026 — 00:05:41 UTC:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A detecção automatizada de malware do Socket sinaliza &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt; como malicioso — seis minutos após ser publicado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;31 de março de 2026 — pouco depois da meia-noite:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;axios@1.14.1&lt;/code&gt; é publicado no npm, incluindo &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt; como uma dependência. O lançamento não aparece nas tags oficiais do repositório axios no GitHub. A tag legítima mais recente permanece &lt;code&gt;v1.14.0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;31 de março de 2026 — manhã:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A issue &lt;code&gt;#10604&lt;/code&gt; do GitHub é aberta publicamente, relatando que &lt;code&gt;axios@1.14.1&lt;/code&gt; e &lt;code&gt;axios@0.30.4&lt;/code&gt; foram comprometidos. Os mantenedores do Axios confirmam que inicialmente não conseguem revogar o acesso do invasor — a conta comprometida tem permissões npm superiores às dos mantenedores legítimos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;31 de março de 2026:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ambas as versões &lt;code&gt;axios@1.14.1&lt;/code&gt; e &lt;code&gt;axios@0.30.4&lt;/code&gt; são despublicadas do npm. Os mantenedores do Axios começam a revogar tokens, apertar os controles de publicação e investigar como um token npm de longa duração foi explorado para obter acesso de publicação não autorizado.&lt;/p&gt;
&lt;h2&gt;
  
  
  Como o ataque funcionou
&lt;/h2&gt;

&lt;p&gt;O ataque explorou uma falha no fluxo de trabalho de publicação do axios: um token npm de longa duração foi usado em conjunto com a publicação confiável. O invasor — provavelmente após comprometer as credenciais de um mantenedor — usou este token para publicar uma nova versão fora do processo de lançamento normal.&lt;/p&gt;

&lt;p&gt;A nova versão introduziu &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt; como uma dependência. O nome do pacote foi projetado para parecer um utilitário de criptografia legítimo; a versão limpa anterior &lt;code&gt;4.2.0&lt;/code&gt; estabeleceu um breve histórico para reduzir a suspeita.&lt;/p&gt;

&lt;p&gt;Dentro de &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt;, a análise do Socket encontrou uma &lt;strong&gt;carga útil multiestágio&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Estágio 1 — Execução:&lt;/strong&gt; O pacote executa código no momento da instalação (via scripts de ciclo de vida do npm) para instalar uma carga útil secundária.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estágio 2 — Implantação do RAT:&lt;/strong&gt; A carga útil instala um cavalo de Troia de acesso remoto que abre um backdoor persistente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estágio 3 — Exfiltração:&lt;/strong&gt; O RAT é capaz de executar comandos arbitrários de shell enviados de um servidor C2, ler variáveis de ambiente e segredos do sistema de arquivos e enviar dados do sistema pela rede.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O RAT persiste após reinicializações. Ou seja, mesmo após remover o pacote npm, a máquina segue em risco até que o RAT seja explicitamente identificado e removido.&lt;/p&gt;
&lt;h2&gt;
  
  
  Fui afetado?
&lt;/h2&gt;

&lt;p&gt;Você está potencialmente afetado se:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Executou &lt;code&gt;npm install axios&lt;/code&gt; ou &lt;code&gt;npm install&lt;/code&gt; (com axios em &lt;code&gt;package.json&lt;/code&gt;) entre &lt;strong&gt;30 de março, 23:59 UTC&lt;/strong&gt; e &lt;strong&gt;31 de março de 2026, meio-dia UTC&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Seu &lt;code&gt;node_modules/axios/package.json&lt;/code&gt; mostra a versão &lt;code&gt;1.14.1&lt;/code&gt; ou &lt;code&gt;0.30.4&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Seu &lt;code&gt;package-lock.json&lt;/code&gt; ou &lt;code&gt;yarn.lock&lt;/code&gt; resolve o axios para &lt;code&gt;1.14.1&lt;/code&gt; ou &lt;code&gt;0.30.4&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Verifique imediatamente:&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="c"&gt;# Verificar versão instalada&lt;/span&gt;
npm list axios

&lt;span class="c"&gt;# Checar lock file&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'"axios"'&lt;/span&gt; package-lock.json | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;

&lt;span class="c"&gt;# Checar presença do plain-crypto-js&lt;/span&gt;
npm list plain-crypto-js
&lt;span class="nb"&gt;ls &lt;/span&gt;node_modules/plain-crypto-js 2&amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"INFECTADO"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Não encontrado"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se &lt;code&gt;plain-crypto-js&lt;/code&gt; estiver presente em seu &lt;code&gt;node_modules&lt;/code&gt;, você executou a versão maliciosa.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que fazer agora
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Atualize o axios imediatamente
&lt;/h3&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;axios@1.14.0
&lt;span class="c"&gt;# ou pin para a versão segura mais recente&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;axios@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm list axios
&lt;span class="c"&gt;# Deve mostrar 1.14.0 ou superior (assim que uma 1.14.x limpa for publicada)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Se você instalou a versão comprometida
&lt;/h3&gt;

&lt;p&gt;Não trate isso como uma atualização de dependência rotineira. Trate a máquina como comprometida:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rotacione todos os segredos&lt;/strong&gt; acessíveis dessa máquina: chaves de API, credenciais de banco de dados, chaves SSH, tokens de provedores de nuvem, variáveis &lt;code&gt;.env&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifique suas variáveis de ambiente&lt;/strong&gt; — o RAT visa especificamente segredos no ambiente de processo e no sistema de arquivos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audite as conexões de rede de saída&lt;/strong&gt; do período afetado — procure por conexões para IPs desconhecidos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Procure por persistência&lt;/strong&gt; — verifique tarefas cron, scripts de inicialização e serviços systemd adicionados por volta do período do comprometimento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reinstale o sistema operacional da máquina&lt;/strong&gt; se for um CI runner ou servidor de produção que teve a versão comprometida instalada. Se for um laptop de desenvolvedor, considere as credenciais comprometidas e rotacione tudo antes de considerá-lo limpo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Audite seus pipelines de CI/CD
&lt;/h3&gt;

&lt;p&gt;Se o pipeline de build executou &lt;code&gt;npm install&lt;/code&gt; durante a janela de tempo, seu ambiente de CI pode ter sido comprometido. Verifique:&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="c"&gt;# Verificar logs de build do período afetado&lt;/span&gt;
&lt;span class="c"&gt;# Procure por axios@1.14.1 em qualquer saída de instalação&lt;/span&gt;

&lt;span class="c"&gt;# Verifique se o node_modules do CI está limpo&lt;/span&gt;
npm list axios plain-crypto-js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rotacione quaisquer segredos aos quais seu pipeline de CI tenha acesso: chaves de deploy, credenciais de provedores de nuvem, tokens de registro.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Verifique seu arquivo de lock
&lt;/h3&gt;

&lt;p&gt;Arquivos de lock (&lt;code&gt;package-lock.json&lt;/code&gt;, &lt;code&gt;yarn.lock&lt;/code&gt;) devem fixar versões exatas. Se o seu arquivo de lock tiver &lt;code&gt;1.14.1&lt;/code&gt;, regenere-o:&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="c"&gt;# Remover e regenerar&lt;/span&gt;
&lt;span class="nb"&gt;rm &lt;/span&gt;package-lock.json
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifique se o novo arquivo de lock resolve o axios para uma versão segura antes de commitar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usando Apidog para auditar suas chamadas de API do axios
&lt;/h2&gt;

&lt;p&gt;Se você usa o axios como seu cliente HTTP para fazer chamadas de API, 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; pode ajudá-lo a verificar se sua integração ainda está enviando as requisições corretas após a atualização da dependência.&lt;/p&gt;

&lt;p&gt;Após atualizar para &lt;a href="mailto:axios@1.14.0"&gt;axios@1.14.0&lt;/a&gt;, importe seus endpoints de API existentes para o Apidog e execute uma rápida verificação de regressão para confirmar que o comportamento não mudou. Isso é especialmente útil se você estiver preocupado que a versão maliciosa possa ter adulterado as cargas úteis de requisição ou resposta — as asserções de resposta do Apidog permitem que você valide valores de campo exatos, cabeçalhos e códigos de status:&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="c1"&gt;// Apidog post-response assertion&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Resposta limpa — sem campos injetados&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;pm&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;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;__injected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;pm&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;pm&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-Injected-Header&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kc"&gt;null&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;Executar sua suíte de testes completa contra a versão atualizada do axios no Apidog fornece uma linha de base limpa e documentada antes de enviar para produção.&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;Experimente o Apidog gratuitamente&lt;/a&gt; para configurar testes de regressão de cliente HTTP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que ataques de cadeia de suprimentos no npm são difíceis de parar
&lt;/h2&gt;

&lt;p&gt;O ataque ao axios não é uma anomalia. É um padrão:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;event-stream (2018):&lt;/strong&gt; Um mantenedor malicioso adicionou uma carga útil visando carteiras de bitcoin. 8 milhões de downloads semanais.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ua-parser-js (2021):&lt;/strong&gt; Comprometido para instalar um minerador de criptomoedas e um ladrão de senhas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;node-ipc (2022):&lt;/strong&gt; Mantenedor adicionou intencionalmente código destrutivo visando IPs russos/bielorrussos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;xz utils (2024):&lt;/strong&gt; Campanha de engenharia social de dois anos para criar um backdoor em uma biblioteca de compressão central do Linux.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;axios (2026):&lt;/strong&gt; Credenciais de mantenedor comprometidas usadas para publicar um RAT via uma dependência maliciosa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O ponto central: &lt;strong&gt;confiança na conta de publicação, não no código.&lt;/strong&gt; O modelo do npm concede acesso de publicação aos mantenedores, e se as credenciais de um mantenedor forem comprometidas, o invasor herda essa confiança.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Medida&lt;/th&gt;
&lt;th&gt;O que faz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Arquivos de lock (&lt;code&gt;package-lock.json&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Fixa versões exatas, previne atualizações silenciosas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;npm audit&lt;/code&gt; no CI&lt;/td&gt;
&lt;td&gt;Sinaliza vulnerabilidades conhecidas antes do deploy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Socket.dev / Snyk&lt;/td&gt;
&lt;td&gt;Análise comportamental — sinaliza pacotes suspeitos mesmo antes da existência de CVEs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autenticação de dois fatores no npm&lt;/td&gt;
&lt;td&gt;Torna o comprometimento de credenciais mais difícil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;npm publish&lt;/code&gt; com tokens de curta duração&lt;/td&gt;
&lt;td&gt;Limita a janela de exposição caso um token vaze&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ler arquivos de lock em PRs&lt;/td&gt;
&lt;td&gt;Detecta alterações inesperadas de dependência na revisão de código&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A equipe do axios já reconheceu que tokens npm de longa duração estavam no centro do problema e está adotando controles de publicação mais rigorosos. Mas a solução depende do ecossistema como um todo, não só de pacotes individuais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Indicadores de Comprometimento (IOCs)
&lt;/h2&gt;

&lt;p&gt;Conforme análise do Socket:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pacotes maliciosos:&lt;/strong&gt; &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt;, &lt;code&gt;axios@1.14.1&lt;/code&gt;, &lt;code&gt;axios@0.30.4&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E-mail do publicador:&lt;/strong&gt; &lt;code&gt;nrwise@proton.me&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comportamento:&lt;/strong&gt; Conexões de rede no momento da instalação do npm, persistência do RAT, exfiltração de variáveis de ambiente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Versões seguras do axios:&lt;/strong&gt; 1.14.0 e anteriores (exceto 0.30.4), 1.13.x, 1.12.x&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se suspeitar de infecção, registre um relatório com a segurança do npm em &lt;a href="mailto:security@npmjs.com"&gt;security@npmjs.com&lt;/a&gt; e preserve os logs.&lt;/p&gt;

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

&lt;p&gt;O comprometimento do axios 1.14.1 reforça que a segurança de dependências é um processo contínuo. Fixe suas versões, execute ferramentas de análise comportamental como o Socket no seu CI, rotacione credenciais diante de qualquer anomalia e mantenha seus arquivos de lock sob revisão.&lt;/p&gt;

&lt;p&gt;Se você precisa reconstruir a confiança na integração de API após atualizar o axios, 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; oferece os cenários de teste, asserções e ferramentas de mocking para validar o comportamento do seu cliente HTTP antes do deploy.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Quais versões do axios foram comprometidas?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;axios@1.14.1&lt;/code&gt; e &lt;code&gt;axios@0.30.4&lt;/code&gt;. Ambas foram despublicadas do npm. A versão segura é &lt;code&gt;1.14.0&lt;/code&gt; (ou qualquer versão das linhas 1.13.x, 1.12.x).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que a carga útil maliciosa do axios faz?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Inclui &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt;, que implanta uma carga útil multiestágio incluindo um cavalo de Troia de acesso remoto (RAT). O RAT pode executar comandos arbitrários de um servidor C2 remoto, exfiltrar variáveis de ambiente e segredos, e persistir após reinicializações.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como sei se instalei a versão comprometida?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Execute &lt;code&gt;npm list axios&lt;/code&gt; — se mostrar 1.14.1 ou 0.30.4, você está afetado. Verifique também &lt;code&gt;npm list plain-crypto-js&lt;/code&gt; — se esse pacote estiver presente, o código malicioso foi executado em sua máquina.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Basta apenas atualizar o axios?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não. A atualização remove a dependência maliciosa daqui para frente, mas o RAT já pode estar instalado e persistindo na máquina. Se você instalou a versão comprometida, rotacione todos os segredos e audite a máquina em busca de mecanismos de persistência.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como o invasor publicou no npm sem ser um mantenedor?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
O invasor provavelmente comprometeu as credenciais de um mantenedor e explorou um token npm de longa duração que tinha acesso de publicação. A equipe do axios está investigando e apertando os controles de publicação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qual a diferença entre isso e uma vulnerabilidade comum?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Uma vulnerabilidade é uma falha em um código legítimo. Um ataque à cadeia de suprimentos introduz código malicioso através de um canal de publicação confiável. O código comprometido nunca esteve no repositório GitHub do axios — ele foi injetado diretamente na publicação do npm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como posso proteger meus projetos de futuros ataques à cadeia de suprimentos?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use arquivos de lock, execute &lt;code&gt;npm audit&lt;/code&gt; no CI, adicione uma ferramenta como Socket.dev para análise comportamental, habilite 2FA em contas npm, use tokens de publicação de curta duração e audite as diferenças de seus arquivos de lock na revisão de código.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>javascript</category>
      <category>node</category>
      <category>security</category>
    </item>
  </channel>
</rss>
