<?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>Forem: Roobia</title>
    <description>The latest articles on Forem by Roobia (@roobia).</description>
    <link>https://forem.com/roobia</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%2F2197084%2F1d72640c-64d4-4f30-a828-302a9e3360b0.jpg</url>
      <title>Forem: Roobia</title>
      <link>https://forem.com/roobia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/roobia"/>
    <language>en</language>
    <item>
      <title>Guía para Pruebas de Servidor MCP: Manuales y Automatizadas con Apidog</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Mon, 11 May 2026 08:54:38 +0000</pubDate>
      <link>https://forem.com/roobia/guia-para-pruebas-de-servidor-mcp-manuales-y-automatizadas-con-apidog-493i</link>
      <guid>https://forem.com/roobia/guia-para-pruebas-de-servidor-mcp-manuales-y-automatizadas-con-apidog-493i</guid>
      <description>&lt;p&gt;Una publicación de Show HN titulada “Ableton Live MCP” alcanzó 118 puntos y 78 comentarios a principios de esta semana. El patrón ya es familiar: alguien escribió un servidor de Protocolo de Contexto de Modelo (MCP) para una herramienta poco probable, la comunidad de Claude Desktop lo probó y aparecieron más preguntas del tipo “¿debería escribir uno para X?”. MCP pasó de ser un experimento de Anthropic a una capa de integración de agentes en menos de un añ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" class="crayons-btn crayons-btn--primary"&gt;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Ese crecimiento deja un problema práctico: probar servidores MCP sigue siendo incómodo. Ejecutar JSON-RPC sobre &lt;code&gt;stdio&lt;/code&gt; a mano funciona para un “hola mundo”, pero se rompe cuando el servidor tiene 12 herramientas, 3 prompts y una API ascendente inestable. Esta guía muestra cómo probar servidores MCP manualmente y cómo automatizar esas pruebas con &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;, tratando el servidor como cualquier otra API: con contrato, mocks y regresión en CI.&lt;/p&gt;

&lt;p&gt;Si viene de un contexto de agentes más general, nuestra &lt;a href="http://apidog.com/blog/how-to-write-agents-md-files?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía agents.md&lt;/a&gt; combina bien con esto; las convenciones allí facilitan comunicar contratos de servidores MCP dentro del equipo.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; es el Protocolo de Contexto de Modelo de Anthropic. Usa JSON-RPC 2.0 sobre &lt;code&gt;stdio&lt;/code&gt; o HTTP y expone herramientas, recursos y prompts.&lt;/li&gt;
&lt;li&gt;Probar un servidor MCP implica verificar llamadas como &lt;code&gt;initialize&lt;/code&gt;, &lt;code&gt;tools/list&lt;/code&gt;, &lt;code&gt;tools/call&lt;/code&gt;, &lt;code&gt;resources/read&lt;/code&gt; y &lt;code&gt;prompts/get&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Empiece manualmente: ejecute el servidor desde la terminal, confirme respuestas y corrija errores de forma.&lt;/li&gt;
&lt;li&gt;Automatice después: capture tráfico JSON-RPC en &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;, guarde cada llamada, añada aserciones y ejecute el conjunto en CI.&lt;/li&gt;
&lt;li&gt;Use mocks de Apidog para simular APIs ascendentes y mantener pruebas deterministas.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descargue Apidog&lt;/a&gt; para centralizar solicitudes, mocks y ejecución de pruebas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué es MCP realmente
&lt;/h2&gt;

&lt;p&gt;La &lt;a href="https://spec.modelcontextprotocol.io/" rel="noopener noreferrer"&gt;especificación del Protocolo de Contexto de Modelo&lt;/a&gt; define una interfaz JSON-RPC 2.0. Un cliente, como Claude Desktop, Cursor o un agente propio, inicia un servidor MCP, ejecuta un handshake &lt;code&gt;initialize&lt;/code&gt; y luego envía llamadas.&lt;/p&gt;

&lt;p&gt;Las llamadas que más debería probar son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;initialize&lt;/code&gt;: negocia versión y capacidades.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/list&lt;/code&gt;: devuelve herramientas disponibles y sus argumentos mediante JSON Schema.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/call&lt;/code&gt;: invoca una herramienta por nombre.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resources/list&lt;/code&gt; y &lt;code&gt;resources/read&lt;/code&gt;: exponen contenido direccionable por URI.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prompts/list&lt;/code&gt; y &lt;code&gt;prompts/get&lt;/code&gt;: exponen plantillas de prompts renderizables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El transporte puede ser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;stdio&lt;/code&gt;: tramas JSON-RPC delimitadas por nueva línea en &lt;code&gt;stdin&lt;/code&gt;/&lt;code&gt;stdout&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;HTTP transmitible: normalmente &lt;code&gt;POST /&lt;/code&gt; con SSE para streaming.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La mayoría de servidores locales usan &lt;code&gt;stdio&lt;/code&gt;; los remotos suelen usar HTTP.&lt;/p&gt;

&lt;p&gt;El motivo para probarlo bien es simple: si &lt;code&gt;tools/list&lt;/code&gt; cambia de forma o devuelve un esquema inválido, todos los clientes MCP pueden romperse al mismo tiempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué debería probar en un servidor MCP
&lt;/h2&gt;

&lt;p&gt;Un conjunto de pruebas útil cubre seis áreas.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Conformidad del protocolo
&lt;/h3&gt;

&lt;p&gt;Verifique que &lt;code&gt;initialize&lt;/code&gt; devuelve el &lt;code&gt;protocolVersion&lt;/code&gt; esperado y que las capacidades anunciadas coinciden con lo que el servidor soporta.&lt;/p&gt;

&lt;p&gt;Ejemplo de aspectos a validar:&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;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&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;"protocolVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&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;h3&gt;
  
  
  2. Corrección del esquema
&lt;/h3&gt;

&lt;p&gt;Para cada herramienta en &lt;code&gt;tools/list&lt;/code&gt;, valide que exista:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;description&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;inputSchema&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;También confirme que &lt;code&gt;inputSchema&lt;/code&gt; sea JSON Schema válido y que los campos requeridos estén definidos correctamente.&lt;/p&gt;

&lt;p&gt;Las descripciones vacías o demasiado genéricas dificultan la selección de herramientas por parte de clientes como Claude.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Comportamiento de herramientas
&lt;/h3&gt;

&lt;p&gt;Para cada &lt;code&gt;tools/call&lt;/code&gt;, valide que la respuesta tenga bloques de contenido correctos:&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;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Resultado"&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;También pruebe errores esperados. En MCP, un fallo de ejecución de herramienta debería devolver un resultado normal con &lt;code&gt;isError: true&lt;/code&gt;, no un error JSON-RPC de protocolo.&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;"isError"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Falta el argumento requerido: city"&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;h3&gt;
  
  
  4. Acceso a recursos
&lt;/h3&gt;

&lt;p&gt;Compruebe que cada URI devuelta por &lt;code&gt;resources/list&lt;/code&gt; se puede leer con &lt;code&gt;resources/read&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;También pruebe paginación si su servidor devuelve recursos en varias páginas.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Renderizado de prompts
&lt;/h3&gt;

&lt;p&gt;Valide que &lt;code&gt;prompts/get&lt;/code&gt; devuelve arrays &lt;code&gt;messages&lt;/code&gt; bien formados y que los argumentos se sustituyen en el lugar correcto.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Modos de fallo
&lt;/h3&gt;

&lt;p&gt;Pruebe escenarios que ocurren en producción:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API ascendente caída.&lt;/li&gt;
&lt;li&gt;Argumento requerido ausente.&lt;/li&gt;
&lt;li&gt;Tipo de argumento inválido.&lt;/li&gt;
&lt;li&gt;Timeout.&lt;/li&gt;
&lt;li&gt;Respuestas incompletas.&lt;/li&gt;
&lt;li&gt;Errores concurrentes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pruebas manuales con &lt;code&gt;stdio&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Empiece con la ruta más simple: terminal, binario del servidor y JSON-RPC.&lt;/p&gt;

&lt;p&gt;Si todavía no tiene un servidor, puede crear uno con el &lt;a href="https://modelcontextprotocol.io/quickstart" rel="noopener noreferrer"&gt;inicio rápido oficial del SDK de MCP&lt;/a&gt; en Python o TypeScript. El ejemplo de clima con dos herramientas es suficiente para practicar.&lt;/p&gt;

&lt;p&gt;Ejecute el servidor con el inspector oficial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @modelcontextprotocol/inspector node your-server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El inspector abre una UI local que habla con su servidor vía MCP. Úselo para confirmar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El proceso arranca.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;initialize&lt;/code&gt; responde.&lt;/li&gt;
&lt;li&gt;Las capacidades se anuncian.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/list&lt;/code&gt; devuelve herramientas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/call&lt;/code&gt; responde con contenido válido.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cuando el flujo funcione en el inspector, capture llamadas JSON-RPC sin procesar.&lt;/p&gt;

&lt;p&gt;Ejemplo con &lt;code&gt;stdio&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2026-04-01","capabilities":{}}}'&lt;/span&gt; | node your-server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Guarde la solicitud y la respuesta. Repita con:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tools/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/call&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/get&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Al final tendrá entre 6 y 12 pares solicitud-respuesta que definen el contrato básico de su servidor MCP.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dos detalles importantes
&lt;/h3&gt;

&lt;p&gt;Primero, los bloques de contenido pueden mezclar tipos:&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;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Resumen"&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;"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;"image"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"mimeType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image/png"&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;Segundo, no confunda errores de herramienta con errores de protocolo. Si una herramienta falla por un input inválido, devuelva &lt;code&gt;isError: true&lt;/code&gt;. Reserve errores JSON-RPC para fallos del protocolo.&lt;/p&gt;

&lt;h2&gt;
  
  
  De manual a automatizado con Apidog
&lt;/h2&gt;

&lt;p&gt;Las pruebas manuales sirven para encontrar errores obvios. La automatización sirve para responder: “¿mi último cambio rompió el contrato?”.&lt;/p&gt;

&lt;p&gt;El flujo recomendado:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Capture solicitudes y respuestas MCP.&lt;/li&gt;
&lt;li&gt;Cree un proyecto en &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;li&gt;Guarde cada llamada JSON-RPC como una solicitud.&lt;/li&gt;
&lt;li&gt;Añada aserciones.&lt;/li&gt;
&lt;li&gt;Simule APIs ascendentes con mocks.&lt;/li&gt;
&lt;li&gt;Ejecute el conjunto en CI.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Cree un proyecto de Apidog para su servidor MCP
&lt;/h2&gt;

&lt;p&gt;Abra Apidog y cree un proyecto nuevo.&lt;/p&gt;

&lt;p&gt;Si su servidor MCP expone HTTP, configure la URL base del endpoint MCP.&lt;/p&gt;

&lt;p&gt;Si su servidor usa solo &lt;code&gt;stdio&lt;/code&gt;, ejecútelo detrás de un wrapper HTTP ligero durante pruebas. El inspector oficial incluye opciones para este flujo. También puede crear un script Node que reciba JSON-RPC por HTTP y lo reenvíe al proceso por &lt;code&gt;stdio&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;El mismo patrón se usa en &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pruebas de API sin Postman en 2026&lt;/a&gt; para backends no HTTP.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Guarde solicitudes canónicas
&lt;/h2&gt;

&lt;p&gt;Cree una solicitud guardada por cada llamada relevante:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;initialize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/call&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/get&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo de cuerpo para &lt;code&gt;tools/call&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tools/call"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"params"&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;"get_weather"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&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;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tokyo"&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;Mantenga IDs estables en pruebas para facilitar depuración.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Añada aserciones
&lt;/h2&gt;

&lt;p&gt;La parte importante no es enviar la solicitud, sino validar la respuesta.&lt;/p&gt;

&lt;p&gt;Para &lt;code&gt;tools/list&lt;/code&gt;, añada aserciones como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$.result.tools&lt;/code&gt; existe.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.tools.length&lt;/code&gt; es mayor que &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cada herramienta tiene &lt;code&gt;name&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cada herramienta tiene &lt;code&gt;description&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cada herramienta tiene &lt;code&gt;inputSchema&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cada &lt;code&gt;inputSchema&lt;/code&gt; es válido.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para &lt;code&gt;tools/call&lt;/code&gt; con entrada correcta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$.result.isError&lt;/code&gt; es &lt;code&gt;false&lt;/code&gt; o no existe.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.content&lt;/code&gt; es un array.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.content[0].type&lt;/code&gt; tiene el valor esperado.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.content[0].text&lt;/code&gt; existe si el tipo es &lt;code&gt;text&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para &lt;code&gt;tools/call&lt;/code&gt; con entrada inválida:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$.result.isError&lt;/code&gt; es &lt;code&gt;true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.content[0].text&lt;/code&gt; contiene un mensaje útil.&lt;/li&gt;
&lt;li&gt;No se devuelve un error JSON-RPC de protocolo si el fallo es de validación de herramienta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo de respuesta esperada para entrada inválida:&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;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&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;"isError"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Falta el argumento requerido: city"&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;Apidog almacena las aserciones por solicitud y muestra los fallos en el reporte de ejecución.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Simule APIs ascendentes con mocks
&lt;/h2&gt;

&lt;p&gt;Muchos servidores MCP envuelven APIs externas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clima.&lt;/li&gt;
&lt;li&gt;GitHub.&lt;/li&gt;
&lt;li&gt;Linear.&lt;/li&gt;
&lt;li&gt;Notion.&lt;/li&gt;
&lt;li&gt;Bases de datos internas.&lt;/li&gt;
&lt;li&gt;Servicios internos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No conviene que CI golpee esas APIs en cada commit. Introduce latencia, límites de uso y fallos no deterministas.&lt;/p&gt;

&lt;p&gt;Con el servidor de mocks de Apidog puede definir endpoints ascendentes simulados y devolver respuestas JSON realistas.&lt;/p&gt;

&lt;p&gt;Flujo práctico:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Defina cada endpoint ascendente como una ruta mock.&lt;/li&gt;
&lt;li&gt;Configure el servidor MCP para usar la URL del mock en pruebas.&lt;/li&gt;
&lt;li&gt;Mantenga la URL real solo para staging o producción.&lt;/li&gt;
&lt;li&gt;Regrabe fixtures cuando la API real cambie.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este enfoque se cubre también en &lt;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;desarrollo de API contract-first&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Resultado: pruebas rápidas, sin red externa y con fallos reproducibles.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Ejecute el conjunto en CI
&lt;/h2&gt;

&lt;p&gt;Los proyectos de Apidog se pueden ejecutar desde CLI. El comando &lt;code&gt;apidog run&lt;/code&gt; ejecuta solicitudes guardadas, evalúa aserciones y devuelve un código distinto de cero si algo falla.&lt;/p&gt;

&lt;p&gt;Ejemplo mínimo con GitHub Actions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MCP server tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;22&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Start MCP HTTP wrapper&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node test/wrapper.js &amp;amp;&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Apidog suite&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx apidog run --project-id $APIDOG_PROJECT --env ci&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;APIDOG_PROJECT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.APIDOG_PROJECT }}&lt;/span&gt;
          &lt;span class="na"&gt;APIDOG_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.APIDOG_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto, cada push ejecuta el contrato MCP completo. Si una herramienta cambia su esquema, CI lo detecta antes del merge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo se ve una buena cobertura
&lt;/h2&gt;

&lt;p&gt;Un plan de pruebas para un servidor MCP en &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; suele incluir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 solicitud &lt;code&gt;initialize&lt;/code&gt; con aserciones de versión y capacidades.&lt;/li&gt;
&lt;li&gt;1 solicitud &lt;code&gt;tools/list&lt;/code&gt; con aserciones de forma y JSON Schema.&lt;/li&gt;
&lt;li&gt;De 2 a 4 solicitudes &lt;code&gt;tools/call&lt;/code&gt; por herramienta:

&lt;ul&gt;
&lt;li&gt;ruta feliz;&lt;/li&gt;
&lt;li&gt;argumento faltante;&lt;/li&gt;
&lt;li&gt;tipo inválido;&lt;/li&gt;
&lt;li&gt;error ascendente.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;1 &lt;code&gt;resources/list&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;1 &lt;code&gt;resources/read&lt;/code&gt; por familia de recursos.&lt;/li&gt;

&lt;li&gt;1 &lt;code&gt;prompts/list&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;1 &lt;code&gt;prompts/get&lt;/code&gt; por plantilla.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Para un servidor con 10 herramientas, 3 recursos y 4 prompts, el conjunto puede tener entre 50 y 70 solicitudes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Errores comunes al probar MCP
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Saltarse &lt;code&gt;initialize&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Algunos servidores construyen el registro de herramientas durante &lt;code&gt;initialize&lt;/code&gt;. Si ejecuta &lt;code&gt;tools/list&lt;/code&gt; directamente, puede obtener falsos negativos.&lt;/p&gt;

&lt;p&gt;Ejecute siempre:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;initialize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;llamadas específicas&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Afirmar cadenas de error exactas
&lt;/h3&gt;

&lt;p&gt;Los mensajes de error cambian. Es mejor afirmar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;isError: true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;un código estable, si existe;&lt;/li&gt;
&lt;li&gt;una expresión regular;&lt;/li&gt;
&lt;li&gt;la presencia de campos clave.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dejar que el mock se desvíe de producción
&lt;/h3&gt;

&lt;p&gt;Un mock incorrecto produce pruebas verdes para una integración rota. Regrabe fixtures a partir de respuestas reales cuando cambie la API ascendente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Olvidar streaming
&lt;/h3&gt;

&lt;p&gt;Los servidores MCP por HTTP pueden transmitir resultados mediante SSE. Si su endpoint usa streaming, habilítelo en la solicitud de prueba y valide el flujo ensamblado.&lt;/p&gt;

&lt;h3&gt;
  
  
  No probar concurrencia
&lt;/h3&gt;

&lt;p&gt;Los clientes MCP pueden enviar varias llamadas &lt;code&gt;tools/call&lt;/code&gt; en paralelo. Si su servidor comparte estado mutable, una prueba secuencial puede pasar mientras producción falla.&lt;/p&gt;

&lt;p&gt;Añada pruebas paralelas para herramientas críticas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mezclar errores de protocolo y de herramienta
&lt;/h3&gt;

&lt;p&gt;MCP separa esos errores a propósito. Si una herramienta falla, devuelva &lt;code&gt;isError: true&lt;/code&gt;. Si el mensaje JSON-RPC está mal formado, use error de protocolo.&lt;/p&gt;

&lt;p&gt;Este tipo de problema de contrato también aparece en &lt;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;desarrollo contract-first de plataforma API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Casos de uso reales
&lt;/h2&gt;

&lt;p&gt;Un equipo que construía un servidor MCP interno para una API de gestión de incidentes detectó tres regresiones en una semana usando aserciones sobre &lt;code&gt;tools/list&lt;/code&gt;. Sin esas pruebas, los errores habrían llegado a todos los usuarios internos de Claude Desktop al mismo tiempo.&lt;/p&gt;

&lt;p&gt;Un desarrollador que mantiene un servidor MCP open source para Notion usa mocks de Apidog para ejecutar pruebas sin alcanzar límites de velocidad durante CI. El conjunto se ejecuta en cada PR, tarda pocos segundos y permite colaborar sin acceso directo a la API real.&lt;/p&gt;

&lt;p&gt;Un equipo de plataforma con 14 servidores MCP internos creó un workspace compartido en Apidog. Cada contrato vive en el mismo lugar, los servidores nuevos heredan una base de pruebas y los revisores comparan cambios de esquema antes de fusionar.&lt;/p&gt;

&lt;p&gt;Otro equipo que construye un servidor MCP para una plataforma interna de observabilidad usa entornos de Apidog para ejecutar el mismo conjunto contra staging y producción. Cambia fixtures y URLs por entorno, pero conserva las mismas aserciones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;MCP creció rápido, pero las pruebas todavía suelen ser manuales y frágiles. La solución es tratar su servidor MCP como una API JSON-RPC: definir contrato, simular dependencias y ejecutar regresión en CI.&lt;/p&gt;

&lt;p&gt;Puntos clave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un servidor MCP es una API JSON-RPC; pruébelo con el mismo rigor que una API REST.&lt;/li&gt;
&lt;li&gt;Empiece con el inspector oficial y capture solicitudes canónicas.&lt;/li&gt;
&lt;li&gt;Automatice en &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; con solicitudes guardadas, aserciones, mocks y CI.&lt;/li&gt;
&lt;li&gt;Cubra protocolo, esquema, herramientas, recursos, prompts y fallos.&lt;/li&gt;
&lt;li&gt;Use mocks para mantener pruebas rápidas y deterministas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Siguiente paso: abra &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;, cree un proyecto, pegue las solicitudes MCP capturadas, añada aserciones JSONPath para &lt;code&gt;tools/list&lt;/code&gt; y ejecute el conjunto. En menos de una hora sabrá si el contrato de su servidor está listo para enviarse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Qué es MCP?
&lt;/h3&gt;

&lt;p&gt;MCP, el Protocolo de Contexto de Modelo, es la especificación abierta de Anthropic para que clientes de IA, como Claude Desktop, llamen herramientas, recursos y prompts externos. Usa JSON-RPC 2.0 sobre &lt;code&gt;stdio&lt;/code&gt; o HTTP transmitible. La &lt;a href="https://spec.modelcontextprotocol.io/" rel="noopener noreferrer"&gt;especificación completa de MCP&lt;/a&gt; está publicada en &lt;a href="http://modelcontextprotocol.io" rel="noopener noreferrer"&gt;modelcontextprotocol.io&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo probar un servidor MCP sin wrapper HTTP?
&lt;/h3&gt;

&lt;p&gt;Sí. El &lt;a href="https://github.com/modelcontextprotocol/inspector" rel="noopener noreferrer"&gt;inspector oficial de MCP&lt;/a&gt; se comunica directamente con &lt;code&gt;stdio&lt;/code&gt; y ofrece una UI para pruebas manuales.&lt;/p&gt;

&lt;p&gt;Para automatizar en &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;, use un wrapper HTTP ligero durante CI. El tráfico de producción puede seguir usando &lt;code&gt;stdio&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo simulo APIs ascendentes?
&lt;/h3&gt;

&lt;p&gt;Defina cada endpoint ascendente como un mock en Apidog, configure el servidor MCP para apuntar al mock durante pruebas y cambie a URLs reales en producción. El mismo patrón se explica en &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;herramientas de prueba de API para ingenieros de control de calidad&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué pasa con resultados de herramientas en streaming?
&lt;/h3&gt;

&lt;p&gt;Los servidores MCP HTTP pueden transmitir resultados mediante Server-Sent Events (SSE). Apidog admite SSE en solicitudes guardadas; actívelo en la configuración de la solicitud y valide el flujo ensamblado.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Debo probar la versión del protocolo?
&lt;/h3&gt;

&lt;p&gt;Sí. Fije el &lt;code&gt;protocolVersion&lt;/code&gt; soportado en &lt;code&gt;initialize&lt;/code&gt; y añada una aserción. Las discrepancias pueden causar incompatibilidades silenciosas con clientes MCP.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo probar con Claude Desktop real?
&lt;/h3&gt;

&lt;p&gt;Sí, y debería hacerlo como prueba de humo antes de cada lanzamiento. Pero no lo use como bucle principal de regresión: es manual, lento y no determinista. Use &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para automatización y Claude Desktop para validación final.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Dónde puedo ver ejemplos reales de servidores MCP?
&lt;/h3&gt;

&lt;p&gt;El &lt;a href="https://github.com/modelcontextprotocol/servers" rel="noopener noreferrer"&gt;repositorio oficial de servidores MCP&lt;/a&gt; incluye implementaciones para sistemas de archivos, GitHub, Slack, Postgres y más. Revise sus definiciones de herramientas para entender cómo debería verse una forma MCP bien diseñada.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Qué es Maigret: Escáner OSINT Que No Se Rompe</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Mon, 11 May 2026 06:09:51 +0000</pubDate>
      <link>https://forem.com/roobia/que-es-maigret-escaner-osint-que-no-se-rompe-1j9h</link>
      <guid>https://forem.com/roobia/que-es-maigret-escaner-osint-que-no-se-rompe-1j9h</guid>
      <description>&lt;p&gt;La mayoría de las herramientas OSINT envejecen rápido: la web cambia, los sitios mueven rutas, los captchas evolucionan y muchas herramientas dejan de funcionar en pocos años. &lt;a href="https://github.com/soxoj/maigret" rel="noopener noreferrer"&gt;Maigret&lt;/a&gt; es una excepción: lleva años funcionando, soporta más de 3.000 sitios, ofrece paquete de Python, bot de Telegram e interfaz web. Más importante aún: su arquitectura muestra cómo construir un escáner basado en firmas que resiste cambios constantes en sitios externos.&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;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Esta guía está pensada para ingenieros. Verás qué hace Maigret, cuándo tiene sentido usarlo de forma legítima, cómo escala a miles de sitios y cómo aplicar sus patrones —firmas, aserciones multi-señal, detección de deriva y verificación recurrente— a pruebas de API con &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;Si aún no lo has leído, nuestra publicación &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Pruebas de API sin Postman en 2026&lt;/a&gt; cubre ideas similares de coincidencia de patrones y detección de desviación en un ámbito más amigable.&lt;/p&gt;

&lt;h2&gt;
  
  
  En resumen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Maigret busca cuentas públicas asociadas a un nombre de usuario en más de 3.000 sitios.&lt;/li&gt;
&lt;li&gt;Su arquitectura se basa en una base de datos de firmas versionada, búsqueda recursiva, detección de deriva y manejo parcial de captchas.&lt;/li&gt;
&lt;li&gt;Sus usos legítimos incluyen OSINT autorizado, recuperación de cuentas propias, auditorías de seguridad, protección de marca y apoyo a investigaciones formales.&lt;/li&gt;
&lt;li&gt;Usarlo contra personas privadas sin consentimiento puede constituir acoso o acecho según la jurisdicción.&lt;/li&gt;
&lt;li&gt;Los mismos patrones técnicos se aplican directamente a pruebas de API: contratos, fixtures, aserciones multi-señal y monitoreo programado.&lt;/li&gt;
&lt;li&gt;Puedes implementar estos patrones en &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 validar APIs de forma más robusta.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué es y qué no es Maigret
&lt;/h2&gt;

&lt;p&gt;Maigret es una herramienta de Python con licencia MIT mantenida por &lt;a href="https://github.com/soxoj" rel="noopener noreferrer"&gt;soxoj&lt;/a&gt;. Su objetivo, según el README, es recopilar un expediente público sobre una persona a partir de un nombre de usuario en más de 3.000 sitios.&lt;/p&gt;

&lt;p&gt;Instalación básica:&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;maigret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejecución mínima:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret nombre_usuario
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto consulta los sitios definidos en su base de datos, detecta posibles perfiles públicos y genera un informe con los datos encontrados.&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%2Fpc1p0grz3hi19mncedf5.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%2Fpc1p0grz3hi19mncedf5.png" alt="Interfaz de línea de comandos de Maigret en funcionamiento." width="800" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tres puntos importantes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Solo usa datos públicos.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No inicia sesión, no reutiliza credenciales y no usa claves privadas. Si un perfil es visible para visitantes anónimos, Maigret puede leerlo. Si no, devuelve un resultado negativo, desconocido o bloqueado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Se usa en contextos legítimos.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Periodistas, equipos antifraude, equipos de protección de marca, investigadores OSINT y equipos de red-team autorizados lo utilizan como parte de flujos de trabajo formales.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Puede ser mal utilizado.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ejecutarlo contra una persona privada sin consentimiento puede cruzar límites éticos y legales. Antes de usarlo, valida autorización, jurisdicción y alcance.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este artículo se centra en la ingeniería detrás de Maigret y en cómo reutilizar sus patrones en pruebas de API.&lt;/p&gt;

&lt;h2&gt;
  
  
  La base de datos de firmas de sitios
&lt;/h2&gt;

&lt;p&gt;La parte más interesante de Maigret es su base de datos de firmas. Cada entrada describe cómo validar un sitio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL base del perfil.&lt;/li&gt;
&lt;li&gt;Patrón de URL del usuario.&lt;/li&gt;
&lt;li&gt;Cadenas que indican que el perfil existe.&lt;/li&gt;
&lt;li&gt;Cadenas que indican que el perfil no existe.&lt;/li&gt;
&lt;li&gt;Reglas de extracción de datos.&lt;/li&gt;
&lt;li&gt;Cabeceras opcionales.&lt;/li&gt;
&lt;li&gt;Etiquetas de país, categoría o comportamiento.&lt;/li&gt;
&lt;li&gt;Señales de captcha o limitación de tasa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La base de datos está en JSON, versionada en GitHub y se actualiza automáticamente cada 24 horas cuando se ejecuta la herramienta. Si un sitio cambia y los mantenedores corrigen la firma, las instalaciones activas reciben la actualización sin reinstalar.&lt;/p&gt;

&lt;p&gt;El patrón es aplicable directamente a APIs.&lt;/p&gt;

&lt;p&gt;En vez de codificar pruebas aisladas por endpoint, define firmas de comportamiento:&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;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET /users/{id}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expectedStatus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requiredHeaders"&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;"content-type"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bodyMustContain"&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;"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;"email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"createdAt"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bodyMustNotContain"&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;"password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"internalToken"&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 un proyecto con decenas o cientos de endpoints, este enfoque permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validar contratos como datos.&lt;/li&gt;
&lt;li&gt;Versionar expectativas.&lt;/li&gt;
&lt;li&gt;Compartir reglas entre equipos.&lt;/li&gt;
&lt;li&gt;Detectar cambios de forma más rápido.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;También es la base del &lt;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;desarrollo de API contract-first&lt;/a&gt; y del &lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;libro de jugadas de pruebas de servidor MCP&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo Maigret detecta “usuario encontrado” vs. “usuario no encontrado”
&lt;/h2&gt;

&lt;p&gt;Un escáner simple haría esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET https://example.com/user/&amp;lt;username&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y después comprobaría el código de estado.&lt;/p&gt;

&lt;p&gt;Eso falla con frecuencia porque muchos sitios devuelven &lt;code&gt;200 OK&lt;/code&gt; incluso cuando el usuario no existe. Otros devuelven páginas genéricas, páginas cacheadas o desafíos de captcha.&lt;/p&gt;

&lt;p&gt;Maigret usa reglas más específicas por sitio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;urlMain&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;presenseStrs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;absenceStrs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;expresiones regulares de extracción&lt;/li&gt;
&lt;li&gt;cabeceras personalizadas&lt;/li&gt;
&lt;li&gt;etiquetas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un resultado “encontrado” requiere que las cadenas de presencia aparezcan y que las cadenas de ausencia no aparezcan. Un resultado “no encontrado” requiere lo contrario. Si las señales no son concluyentes, el resultado queda como desconocido.&lt;/p&gt;

&lt;p&gt;Ejemplo conceptual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ExampleSite"&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/{username}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"presenseStrs"&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;"Profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Followers"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"absenceStrs"&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;"User not found"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"This account does not exist"&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;El equivalente en pruebas de API es no confiar solo en el status code.&lt;/p&gt;

&lt;p&gt;Una prueba más robusta debe validar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;código HTTP;&lt;/li&gt;
&lt;li&gt;estructura del cuerpo;&lt;/li&gt;
&lt;li&gt;campos obligatorios;&lt;/li&gt;
&lt;li&gt;ausencia de campos sensibles;&lt;/li&gt;
&lt;li&gt;cabeceras esperadas;&lt;/li&gt;
&lt;li&gt;valores de error.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo:&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="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"body"&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usr_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev@example.com"&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;Aserciones recomendadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;status == 200
body.id exists
body.email matches email format
body.password does not exist
headers.content-type contains application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; permite combinar aserciones de estado, cuerpo y cabeceras en una misma solicitud, equivalente a las señales de presencia y ausencia que usa Maigret.&lt;/p&gt;

&lt;h2&gt;
  
  
  Búsqueda recursiva y extracción de información
&lt;/h2&gt;

&lt;p&gt;Cuando Maigret encuentra una cuenta, no se detiene ahí. También intenta extraer identificadores públicos adicionales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;correos electrónicos;&lt;/li&gt;
&lt;li&gt;teléfonos;&lt;/li&gt;
&lt;li&gt;nombres reales;&lt;/li&gt;
&lt;li&gt;otros nombres de usuario;&lt;/li&gt;
&lt;li&gt;enlaces a perfiles externos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Después puede reutilizar esos identificadores como nuevas entradas de búsqueda. Ese flujo convierte una coincidencia inicial en una exploración recursiva de perfiles relacionados.&lt;/p&gt;

&lt;p&gt;En APIs ocurre algo similar.&lt;/p&gt;

&lt;p&gt;Si un endpoint devuelve un campo no documentado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ord_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cus_456"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"paymentIntentId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pi_789"&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;Ese campo puede indicar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;un endpoint relacionado;&lt;/li&gt;
&lt;li&gt;una dependencia descendente;&lt;/li&gt;
&lt;li&gt;una entidad no documentada;&lt;/li&gt;
&lt;li&gt;un caso de prueba faltante.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flujo práctico:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ejecuta una solicitud base.&lt;/li&gt;
&lt;li&gt;Detecta campos nuevos o no documentados.&lt;/li&gt;
&lt;li&gt;Busca endpoints que consumen esos campos.&lt;/li&gt;
&lt;li&gt;Añade casos de prueba para esos endpoints.&lt;/li&gt;
&lt;li&gt;Actualiza el contrato.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este patrón convierte las respuestas reales en entradas para ampliar la cobertura de pruebas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manejo de captcha y límite de tasa
&lt;/h2&gt;

&lt;p&gt;Maigret no intenta romper defensas agresivas. Detecta señales de captcha o rate limiting y actúa de forma conservadora.&lt;/p&gt;

&lt;p&gt;Sus estrategias incluyen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rotar user agents;&lt;/li&gt;
&lt;li&gt;respetar cabeceras de reintento;&lt;/li&gt;
&lt;li&gt;usar dominios móviles o simplificados cuando existen;&lt;/li&gt;
&lt;li&gt;enrutar mediante Tor o I2P cuando el sitio lo permite;&lt;/li&gt;
&lt;li&gt;marcar resultados como “captcha detectado” cuando no puede continuar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La lección para APIs es clara: tus pruebas no deben forzar sistemas externos.&lt;/p&gt;

&lt;p&gt;Implementa clientes de prueba que detecten:&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="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;429&lt;/span&gt; &lt;span class="ne"&gt;Too Many Requests&lt;/span&gt;
&lt;span class="na"&gt;Retry-After&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;60&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y respondan con backoff:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;requestWithBackoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;retries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&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;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fn&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;retryAfter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&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="s2"&gt;retry-after&lt;/span&gt;&lt;span class="dl"&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;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;retryAfter&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rate limit exceeded after retries&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto evita falsos negativos, bloqueos de IP y ruido en proveedores externos.&lt;/p&gt;

&lt;h2&gt;
  
  
  El problema de la deriva de firmas
&lt;/h2&gt;

&lt;p&gt;Una base de datos de 3.000 sitios solo sirve si se mantiene actualizada. Los sitios cambian:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rutas de perfil;&lt;/li&gt;
&lt;li&gt;HTML;&lt;/li&gt;
&lt;li&gt;textos de error;&lt;/li&gt;
&lt;li&gt;reglas anti-bot;&lt;/li&gt;
&lt;li&gt;nombres de marca;&lt;/li&gt;
&lt;li&gt;dominios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una firma obsoleta produce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;falsos negativos;&lt;/li&gt;
&lt;li&gt;falsos positivos;&lt;/li&gt;
&lt;li&gt;resultados desconocidos;&lt;/li&gt;
&lt;li&gt;pérdida de confianza en la herramienta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maigret mitiga esto con varias capas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;actualización automática desde GitHub cada 24 horas;&lt;/li&gt;
&lt;li&gt;contribuciones de la comunidad;&lt;/li&gt;
&lt;li&gt;bandera manual &lt;code&gt;--update&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;pruebas de firmas contra usuarios conocidos y autorizados.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret &lt;span class="nt"&gt;--update&lt;/span&gt; nombre_usuario
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El punto más importante es el arnés de pruebas: para cada sitio, Maigret puede validar una firma contra un usuario existente conocido. Si esa validación falla, la firma probablemente derivó.&lt;/p&gt;

&lt;p&gt;En pruebas de API, el equivalente es guardar una respuesta buena conocida como fixture y compararla periódicamente contra el endpoint real.&lt;/p&gt;

&lt;p&gt;Flujo recomendado:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define el contrato esperado.&lt;/li&gt;
&lt;li&gt;Guarda una respuesta válida conocida.&lt;/li&gt;
&lt;li&gt;Ejecuta la prueba de forma programada.&lt;/li&gt;
&lt;li&gt;Compara estructura, tipos y campos.&lt;/li&gt;
&lt;li&gt;Alerta si aparece deriva.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; soporta este patrón: puedes guardar respuestas, ejecutar pruebas programadas y detectar cambios en endpoints. Nuestra &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de la API DeepSeek V4&lt;/a&gt; muestra el lado manual para un proveedor específico.&lt;/p&gt;

&lt;h2&gt;
  
  
  El modo de resumen opcional con IA
&lt;/h2&gt;

&lt;p&gt;Maigret incluye la bandera &lt;code&gt;--ai&lt;/code&gt;, que usa un endpoint LLM compatible con OpenAI para resumir los hallazgos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret nombre_usuario &lt;span class="nt"&gt;--ai&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La arquitectura es correcta porque separa responsabilidades:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;las reglas deterministas deciden si una cuenta coincide;&lt;/li&gt;
&lt;li&gt;el LLM solo resume resultados;&lt;/li&gt;
&lt;li&gt;la entrada al modelo está restringida;&lt;/li&gt;
&lt;li&gt;el modelo no decide el veredicto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ese patrón también funciona para reportes de pruebas de API.&lt;/p&gt;

&lt;p&gt;Arquitectura recomendada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pruebas deterministas → Resultado estructurado → Resumen LLM → Slack / email / reporte
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No uses el LLM para decidir si una prueba pasa o falla. Usa reglas explícitas para eso. El modelo puede ayudar a convertir una salida técnica en un resumen legible para equipos no técnicos.&lt;/p&gt;

&lt;p&gt;Nuestra publicación sobre &lt;a href="http://apidog.com/blog/computer-use-vs-structured-apis?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;uso de computadoras vs APIs estructuradas&lt;/a&gt; explica por qué la capa estructurada debe ir primero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Casos de uso legítimos
&lt;/h2&gt;

&lt;p&gt;Estos son escenarios donde Maigret puede usarse de forma apropiada si existe autorización y alcance claro.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Recuperación de cuentas propias
&lt;/h3&gt;

&lt;p&gt;Puedes buscar cuentas antiguas asociadas a un nombre de usuario que usabas años atrás.&lt;/p&gt;

&lt;p&gt;Útil para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;auditorías de privacidad;&lt;/li&gt;
&lt;li&gt;cierre de cuentas abandonadas;&lt;/li&gt;
&lt;li&gt;reducción de huella digital;&lt;/li&gt;
&lt;li&gt;limpieza antes de cambios laborales.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Monitoreo de abuso de marca
&lt;/h3&gt;

&lt;p&gt;Empresas pueden buscar nombres de marca, productos o dominios para detectar cuentas falsas o suplantación.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret nombre_marca
maigret producto_empresa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Búsqueda de personas desaparecidas
&lt;/h3&gt;

&lt;p&gt;Organizaciones autorizadas pueden usar OSINT con consentimiento familiar y coordinación con autoridades. El trabajo independiente sin coordinación puede perjudicar una investigación.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Red-team autorizado
&lt;/h3&gt;

&lt;p&gt;Equipos de pentesting pueden usar Maigret para mapear exposición pública de una organización dentro del alcance definido por contrato.&lt;/p&gt;

&lt;p&gt;Regla práctica: si no está en el alcance, no se prueba.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Periodismo de investigación
&lt;/h3&gt;

&lt;p&gt;Reporteros pueden usar herramientas OSINT en investigaciones de fraude, crimen organizado o figuras públicas, bajo revisión editorial y legal.&lt;/p&gt;

&lt;p&gt;Lo que no entra en esta lista:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;buscar a una persona por curiosidad;&lt;/li&gt;
&lt;li&gt;vigilar a una expareja;&lt;/li&gt;
&lt;li&gt;perfilar a desconocidos;&lt;/li&gt;
&lt;li&gt;crear datasets de personas sin consentimiento.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Patrones de Maigret aplicables a pruebas de API
&lt;/h2&gt;

&lt;p&gt;Estos patrones son transferibles a cualquier suite de pruebas de API.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Firmas como datos, no como código
&lt;/h3&gt;

&lt;p&gt;Evita codificar todas las expectativas dentro de scripts. Modela el comportamiento esperado como datos versionados.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Get user by ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/users/{id}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expected"&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"requiredFields"&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;"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;"email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"createdAt"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"forbiddenFields"&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;"passwordHash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"internalNotes"&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;
  
  
  2. Aserciones multi-señal
&lt;/h3&gt;

&lt;p&gt;No aceptes una respuesta como válida solo porque devuelve &lt;code&gt;200&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Valida:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;status code;&lt;/li&gt;
&lt;li&gt;esquema;&lt;/li&gt;
&lt;li&gt;campos obligatorios;&lt;/li&gt;
&lt;li&gt;campos prohibidos;&lt;/li&gt;
&lt;li&gt;cabeceras;&lt;/li&gt;
&lt;li&gt;tipos;&lt;/li&gt;
&lt;li&gt;valores de negocio.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Firmas sincronizadas
&lt;/h3&gt;

&lt;p&gt;Maigret actualiza firmas desde un repositorio central. En APIs, el equivalente es sincronizar documentación, contratos y pruebas desde una fuente compartida.&lt;/p&gt;

&lt;p&gt;Los proyectos de Apidog soportan sincronización en la nube. El flujo completo se cubre en &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Pruebas de API sin Postman&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%2Fokopqqrevpf1iclqlvqp.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%2Fokopqqrevpf1iclqlvqp.png" alt="Pruebas programadas en Apidog." width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Detección de desviaciones
&lt;/h3&gt;

&lt;p&gt;Programa ejecuciones periódicas contra endpoints críticos. Compara la respuesta actual contra una respuesta conocida buena.&lt;/p&gt;

&lt;p&gt;Ejemplo de diferencia que debería alertar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt; {
   "id": "usr_123",
&lt;span class="gd"&gt;-  "email": "dev@example.com",
&lt;/span&gt;&lt;span class="gi"&gt;+  "contactEmail": "dev@example.com",
&lt;/span&gt;   "createdAt": "2026-05-01T10:00:00Z"
 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ese cambio puede parecer pequeño, pero rompe clientes que esperan &lt;code&gt;email&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. LLM como postprocesador
&lt;/h3&gt;

&lt;p&gt;Usa reglas deterministas para aprobar o fallar. Usa IA solo para explicar.&lt;/p&gt;

&lt;p&gt;Ejemplo de salida estructurada:&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;"failedTests"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"breakingChanges"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Field email renamed to contactEmail"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Endpoint /users/{id} no longer returns createdAt"&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;Después, un LLM puede convertirlo en:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;La API de usuarios introdujo dos cambios incompatibles: el campo email fue renombrado y createdAt ya no aparece en la respuesta. Revisa clientes que consumen GET /users/{id}.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Errores comunes al ejecutar Maigret
&lt;/h2&gt;

&lt;p&gt;Si vas a experimentar con Maigret en entornos autorizados, evita estos errores.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejecutar sin &lt;code&gt;-a&lt;/code&gt; y asumir que el escaneo fue completo
&lt;/h3&gt;

&lt;p&gt;Por defecto, Maigret puede escanear un subconjunto de sitios principales. Para consultar la base completa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret nombre_usuario &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto tarda más, pero cubre la cola larga.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ignorar etiquetas
&lt;/h3&gt;

&lt;p&gt;Puedes filtrar por país o categoría:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret nombre_usuario &lt;span class="nt"&gt;--tags&lt;/span&gt; jp
maigret nombre_usuario &lt;span class="nt"&gt;--tags&lt;/span&gt; social
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto ayuda cuando el objetivo autorizado tiene contexto regional específico.&lt;/p&gt;

&lt;h3&gt;
  
  
  No actualizar firmas
&lt;/h3&gt;

&lt;p&gt;Antes de una investigación seria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret &lt;span class="nt"&gt;--update&lt;/span&gt; nombre_usuario
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las firmas antiguas aumentan falsos positivos y falsos negativos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usar Tor sin interpretar bloqueos correctamente
&lt;/h3&gt;

&lt;p&gt;Algunos sitios bloquean nodos de salida Tor. Un bloqueo no significa que el usuario exista o no exista. Solo significa que el sitio bloqueó esa ruta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tratar los hallazgos como prueba final
&lt;/h3&gt;

&lt;p&gt;Maigret extrae datos públicos. Las páginas pueden contener información falsa, abandonada o fabricada. Trata los resultados como pistas que requieren verificación.&lt;/p&gt;

&lt;h2&gt;
  
  
  Casos de uso en el mundo real
&lt;/h2&gt;

&lt;p&gt;Una consultora de seguridad puede usar Maigret como primer paso en un ejercicio de red-team autorizado. El resultado ayuda al cliente a visualizar su superficie pública antes de pruebas más profundas.&lt;/p&gt;

&lt;p&gt;Un investigador antifraude puede usar &lt;code&gt;--ai&lt;/code&gt; para convertir un escaneo amplio en un resumen breve para clientes no técnicos. La búsqueda sigue siendo determinista; el LLM solo redacta.&lt;/p&gt;

&lt;p&gt;Un equipo de ingeniería puede aplicar los mismos principios —firmas, fixtures, ejecución programada y detección de deriva— para mantener una suite de pruebas de API en cientos de microservicios usando &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Maigret es un buen ejemplo de cómo diseñar una herramienta que escala a miles de reglas sin romperse cada vez que cambia una superficie externa. Incluso si nunca haces OSINT, su arquitectura es útil para pruebas de API.&lt;/p&gt;

&lt;p&gt;Ideas clave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maigret usa una base de datos de firmas versionada y autoactualizable.&lt;/li&gt;
&lt;li&gt;La detección multi-señal es más fiable que validar solo códigos de estado.&lt;/li&gt;
&lt;li&gt;La deriva rompe herramientas y suites de pruebas si no se monitorea.&lt;/li&gt;
&lt;li&gt;Los fixtures conocidos permiten detectar cambios temprano.&lt;/li&gt;
&lt;li&gt;Los LLM funcionan mejor como capa de resumen, no como juez.&lt;/li&gt;
&lt;li&gt;Los mismos patrones se pueden aplicar en &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;

&lt;p&gt;Siguiente paso práctico: revisa el formato de firmas de Maigret y luego modela un endpoint de tu proyecto de la misma forma en &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;: firma explícita, aserciones multi-señal, fixture guardado y ejecución programada. La primera vez que un proveedor cambie un campo a las 2 a.m., tu suite lo detectará antes que tus usuarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;¿Es legal usar Maigret?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Depende de la jurisdicción y del objetivo. Usarlo en ti mismo, en cuentas que posees, en una empresa para la que tienes autorización escrita o como parte de periodismo autorizado suele ser aceptable. Usarlo contra una persona sin consentimiento puede cruzar leyes de acoso o acecho en la UE, EE. UU., Reino Unido y otras regiones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Funciona Maigret sin Python?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El paquete oficial requiere Python 3.10+. El autor también mantiene un &lt;a href="https://t.me/maigret_search_bot" rel="noopener noreferrer"&gt;bot de Telegram&lt;/a&gt; y una configuración de Cloud Shell para quienes no quieren instalarlo localmente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué tan precisa es la cifra de más de 3.000 sitios?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La base de datos lista más de 3.000 entradas, aunque no todas están activas o funcionales en todo momento. La actualización automática y las contribuciones de la comunidad mantienen un subconjunto útil y actualizado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué añade el modo IA?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La bandera &lt;code&gt;--ai&lt;/code&gt; usa un LLM compatible con OpenAI para resumir hallazgos deterministas. No cambia la búsqueda ni decide coincidencias. Debes proporcionar tu propia clave API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo usar Maigret en CI?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para investigaciones OSINT, normalmente no: es trabajo interactivo y dependiente de contexto. Lo que sí pertenece a CI son sus patrones arquitectónicos: firmas, fixtures, detección de deriva y reproducción programada. &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; implementa esos flujos para pruebas de API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿En qué se diferencia de Sherlock?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sherlock es más antiguo y simple. Maigret lo extiende con extracción de información, búsqueda recursiva, manejo parcial de captchas, modo de resumen con IA y una base de datos de sitios más rica. Ambos tienen licencia MIT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Dónde reporto una firma obsoleta?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En los issues o pull requests del repositorio de Maigret en GitHub. La base de datos se mantiene gracias a contribuciones de la comunidad; lo normal es enviar una corrección por sitio obsoleto.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo Solucionar Error 'Invalid custom3p enterprise config' en Código Claude</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Mon, 11 May 2026 03:31:31 +0000</pubDate>
      <link>https://forem.com/roobia/como-solucionar-error-invalid-custom3p-enterprise-config-en-codigo-claude-25ff</link>
      <guid>https://forem.com/roobia/como-solucionar-error-invalid-custom3p-enterprise-config-en-codigo-claude-25ff</guid>
      <description>&lt;p&gt;Si has intentado apuntar Claude Code a DeepSeek V4, OpenRouter u otro proveedor de modelos de terceros, es probable que hayas visto este error: &lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt;. El mensaje no explica qué validar ni dónde mirar, pero normalmente se resuelve corrigiendo la URL base, la variable de autenticación o el archivo de configuración.&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;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Esta guía explica qué significa &lt;code&gt;custom3p&lt;/code&gt;, cómo depurar el error y qué configuraciones usar para ejecutar el bucle de agente de Claude Code con OpenRouter, LiteLLM o un backend local como vLLM.&lt;/p&gt;

&lt;h2&gt;
  
  
  En resumen
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt; significa que Claude Code no puede validar la configuración de un proveedor de terceros.&lt;/p&gt;

&lt;p&gt;En Claude Code, &lt;code&gt;custom3p&lt;/code&gt; es la etiqueta interna para cualquier endpoint no-Anthropic configurado mediante:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Las causas más comunes son:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; termina en &lt;code&gt;/v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Estás usando la variable de credencial incorrecta&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~/.claude/settings.json&lt;/code&gt; tiene JSON inválido&lt;/li&gt;
&lt;li&gt;La instalación nueva no completó el onboarding&lt;/li&gt;
&lt;li&gt;La pasarela no reenvía encabezados requeridos&lt;/li&gt;
&lt;li&gt;Una política empresarial bloquea la configuración&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Empieza por la URL base: en la mayoría de casos, eliminar &lt;code&gt;/v1&lt;/code&gt; resuelve el problema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué significa realmente &lt;code&gt;custom3p&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Claude Code puede enrutar solicitudes en varios modos:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modo&lt;/th&gt;
&lt;th&gt;Cómo se activa&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API de Anthropic&lt;/td&gt;
&lt;td&gt;Sin anulación configurada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon Bedrock&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CLAUDE_CODE_USE_BEDROCK=1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Vertex AI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CLAUDE_CODE_USE_VERTEX=1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Foundry&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CLAUDE_CODE_USE_FOUNDRY=1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tercero personalizado&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; apunta a otro host&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;La última opción es &lt;code&gt;custom3p&lt;/code&gt;: “custom third-party provider”.&lt;/p&gt;

&lt;p&gt;Cuando &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; apunta a LiteLLM, OpenRouter, vLLM, una pasarela corporativa u otro endpoint no-Anthropic, Claude Code ejecuta una validación antes de enviar la primera solicitud real.&lt;/p&gt;

&lt;p&gt;Si esa validación falla, muestra:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invalid custom3p enterprise config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este error es de configuración. No significa necesariamente que el proveedor esté bloqueado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué aparece este error ahora
&lt;/h2&gt;

&lt;p&gt;En abril de 2026, Anthropic bloqueó el acceso a suscripciones Claude Pro y Max para herramientas de agentes de terceros que suplantaban la ID de cliente de Claude Code.&lt;/p&gt;

&lt;p&gt;Eso es diferente a usar el soporte oficial de Claude Code para proveedores personalizados.&lt;/p&gt;

&lt;p&gt;Después de ese cambio, muchos desarrolladores empezaron a enrutar Claude Code a backends más económicos mediante &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;. Por ejemplo, un hilo de Reddit documentó el uso de &lt;a href="https://openrouter.ai/deepseek/deepseek-v4-pro" rel="noopener noreferrer"&gt;DeepSeek V4 Pro a través de OpenRouter&lt;/a&gt;, con un coste menor por millón de tokens de salida frente a Anthropic. Proyectos como &lt;a href="https://github.com/aattaran/deepclaude" rel="noopener noreferrer"&gt;DeepClaude&lt;/a&gt; empaquetaron esta configuración en un flujo de un solo comando.&lt;/p&gt;

&lt;p&gt;El problema: Claude Code exige que la configuración de proveedor personalizado sea válida. Si falla una URL, una credencial o un encabezado, obtienes &lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Causa raíz 1: &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; termina en &lt;code&gt;/v1&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Este es el fallo más común.&lt;/p&gt;

&lt;p&gt;Claude Code añade automáticamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/v1/messages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;a la URL configurada en &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Si tu URL ya termina en &lt;code&gt;/v1&lt;/code&gt;, Claude Code termina llamando a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/v1/v1/messages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y la pasarela suele responder &lt;code&gt;404&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Incorrecto
&lt;/h3&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;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://api.openrouter.ai/api/v1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://litellm.yourcompany.com/v1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Correcto
&lt;/h3&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;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://api.openrouter.ai/api"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://litellm.yourcompany.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verifica el endpoint real
&lt;/h3&gt;

&lt;p&gt;Ejecuta:&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;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}"&lt;/span&gt; &lt;span class="se"&gt;\&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;$ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/messages"&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":"claude-sonnet-4-6","max_tokens":1,"messages":[{"role":"user","content":"hi"}]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Interpreta el resultado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;200&lt;/code&gt;: el endpoint existe y respondió correctamente&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;400&lt;/code&gt;: el endpoint existe, aunque el body no sea válido para esa pasarela&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;404&lt;/code&gt;: probablemente tienes un problema con &lt;code&gt;/v1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Causa raíz 2: variable de credencial incorrecta
&lt;/h2&gt;

&lt;p&gt;Claude Code puede enviar credenciales de dos formas distintas:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Encabezado enviado&lt;/th&gt;
&lt;th&gt;Cuándo usar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x-api-key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pasarelas compatibles con el formato Anthropic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Authorization: Bearer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LiteLLM, OpenRouter y pasarelas estilo OAuth&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Si usas la variable incorrecta, la pasarela puede rechazar la solicitud y Claude Code lo reportará como configuración inválida.&lt;/p&gt;

&lt;h3&gt;
  
  
  OpenRouter
&lt;/h3&gt;

&lt;p&gt;OpenRouter normalmente espera &lt;code&gt;Authorization: Bearer&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&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;&lt;span class="s2"&gt;"sk-or-your-openrouter-key"&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;&lt;span class="s2"&gt;"https://openrouter.ai/api"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No uses &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; para OpenRouter si tu configuración espera Bearer tokens.&lt;/p&gt;

&lt;h3&gt;
  
  
  LiteLLM
&lt;/h3&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;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-litellm-your-virtual-key"&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;&lt;span class="s2"&gt;"https://your-litellm-server:4000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pasarela DeepSeek o vLLM con API key
&lt;/h3&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;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-key-here"&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;&lt;span class="s2"&gt;"https://your-vllm-server"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Regla práctica: revisa la documentación de tu pasarela y confirma si espera &lt;code&gt;Authorization: Bearer&lt;/code&gt; o &lt;code&gt;x-api-key&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Causa raíz 3: &lt;code&gt;settings.json&lt;/code&gt; malformado
&lt;/h2&gt;

&lt;p&gt;Si configuras Claude Code desde:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.claude/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;un JSON inválido impide que Claude Code lea la configuración.&lt;/p&gt;

&lt;h3&gt;
  
  
  Error: coma final
&lt;/h3&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;"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;"ANTHROPIC_BASE_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://openrouter.ai/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_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;"sk-or-your-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;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;
  
  
  Error: comillas inteligentes
&lt;/h3&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;"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="err"&gt;“ANTHROPIC_BASE_URL”:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;“https://openrouter.ai/api”&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;
  
  
  Configuración válida
&lt;/h3&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;"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;"ANTHROPIC_BASE_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://openrouter.ai/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_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;"sk-or-your-openrouter-key"&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;
  
  
  Valida el archivo antes de iniciar Claude Code
&lt;/h3&gt;

&lt;p&gt;Con Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import json, os; json.load(open(os.path.expanduser('~/.claude/settings.json')))"&lt;/span&gt; &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;"Valid JSON"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O con &lt;code&gt;jq&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nb"&gt;.&lt;/span&gt; ~/.claude/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si alguno de estos comandos falla, Claude Code no podrá cargar la configuración.&lt;/p&gt;

&lt;h2&gt;
  
  
  Causa raíz 4: la instalación nueva no completó el onboarding
&lt;/h2&gt;

&lt;p&gt;Claude Code revisa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.claude.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y busca:&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;"hasCompletedOnboarding"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En una instalación nueva, si esa clave no existe o es &lt;code&gt;false&lt;/code&gt;, Claude Code puede omitir tu configuración personalizada y entrar en el flujo estándar de autenticación.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verifica el estado actual
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.claude.json | python3 &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep &lt;/span&gt;hasCompletedOnboarding
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Solución
&lt;/h3&gt;

&lt;p&gt;Edita &lt;code&gt;~/.claude.json&lt;/code&gt; y añade:&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;"hasCompletedOnboarding"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"primaryApiKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sk-placeholder"&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;code&gt;primaryApiKey&lt;/code&gt; funciona como marcador de posición. Tu configuración real vendrá de &lt;code&gt;settings.json&lt;/code&gt; o de variables de entorno.&lt;/p&gt;

&lt;p&gt;Después de guardar, reinicia Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Causa raíz 5: la pasarela no reenvía encabezados requeridos
&lt;/h2&gt;

&lt;p&gt;Claude Code envía encabezados adicionales durante la validación. Si tu proxy o pasarela los elimina, la validación puede fallar.&lt;/p&gt;

&lt;p&gt;Encabezados importantes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;anthropic-beta
anthropic-version
X-Claude-Code-Session-Id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;LiteLLM los maneja por defecto en versiones recientes. Si usas nginx u otro proxy personalizado, reenvíalos explícitamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejemplo con nginx
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/v1/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://backend&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;anthropic-beta&lt;/span&gt; &lt;span class="nv"&gt;$http_anthropic_beta&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;anthropic-version&lt;/span&gt; &lt;span class="nv"&gt;$http_anthropic_version&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Claude-Code-Session-Id&lt;/span&gt; &lt;span class="nv"&gt;$http_x_claude_code_session_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Si no puedes reenviar &lt;code&gt;anthropic-beta&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Configura:&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;CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto desactiva características experimentales que dependen del encabezado beta. El bucle principal de agente puede seguir funcionando, pero algunas capacidades avanzadas podrían no estar disponibles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Causa raíz 6: conflicto con política empresarial
&lt;/h2&gt;

&lt;p&gt;Si usas Claude Team o Enterprise, tu administrador puede haber aplicado configuraciones gestionadas. Estas pueden tener prioridad sobre:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variables de entorno&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.claude/settings.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;URLs base personalizadas&lt;/li&gt;
&lt;li&gt;Modelos disponibles&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Verifica si hay configuración gestionada
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; ~/.claude/managed-settings.json 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;"Managed settings found"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También puedes revisar desde Claude Code:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Si ves “Managed settings”, habla con tu administrador. Puede que necesites que habilite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El dominio de tu pasarela&lt;/li&gt;
&lt;li&gt;IDs de modelo específicos&lt;/li&gt;
&lt;li&gt;El uso de &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Excepciones para URLs personalizadas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En despliegues empresariales, estas configuraciones suelen estar en rutas como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/Library/Application Support/ClaudeCode/managed-settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;o su equivalente en Windows/Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuraciones completas y funcionales
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Claude Code + OpenRouter + DeepSeek V4 Pro
&lt;/h3&gt;

&lt;p&gt;OpenRouter expone una API compatible con Anthropic. Para enrutar Claude Code a DeepSeek V4 Pro, usa &lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt; y no incluyas &lt;code&gt;/v1&lt;/code&gt; al final de la URL.&lt;/p&gt;

&lt;p&gt;En &lt;code&gt;~/.claude/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"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;"ANTHROPIC_BASE_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://openrouter.ai/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_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;"sk-or-your-openrouter-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;"ANTHROPIC_DEFAULT_SONNET_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;"deepseek/deepseek-v4-pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_DEFAULT_OPUS_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;"deepseek/deepseek-v4-pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_DEFAULT_HAIKU_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;"deepseek/deepseek-v4-pro"&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;La anulación de modelos es importante porque Claude Code puede seguir enviando &lt;code&gt;claude-sonnet-4-6&lt;/code&gt; aunque cambies la URL base.&lt;/p&gt;

&lt;p&gt;Sin estos valores, la solicitud puede llegar a OpenRouter con un modelo diferente al que esperas.&lt;/p&gt;

&lt;p&gt;Nota: OpenRouter no implementa completamente la especificación de streaming de Anthropic para todas las llamadas a herramientas. El bucle principal funciona, pero cadenas complejas de herramientas pueden fallar en algunos casos. Revisa el &lt;a href="https://openrouter.ai/docs/guides/coding-agents/claude-code-integration" rel="noopener noreferrer"&gt;estado de compatibilidad de OpenRouter&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Code + LiteLLM
&lt;/h3&gt;

&lt;p&gt;LiteLLM es una opción práctica si quieres mapear los nombres de modelos que Claude Code envía por defecto a otros proveedores.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;config.yaml&lt;/code&gt; de LiteLLM
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;model_list&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;model_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude-sonnet-4-6&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deepseek/deepseek-v4&lt;/span&gt;
      &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-your-deepseek-key"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;model_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude-opus-4-7&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deepseek/deepseek-v4-pro&lt;/span&gt;
      &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-your-deepseek-key"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;code&gt;~/.claude/settings.json&lt;/code&gt;
&lt;/h4&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;"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;"ANTHROPIC_BASE_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;"http://localhost:4000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_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;"sk-litellm-your-key"&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;Con este enfoque, Claude Code envía &lt;code&gt;claude-sonnet-4-6&lt;/code&gt;, y LiteLLM lo enruta internamente a DeepSeek V4.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Code + vLLM local
&lt;/h3&gt;

&lt;p&gt;Para inferencia local con &lt;a href="https://docs.vllm.ai/en/stable/serving/integrations/claude_code/" rel="noopener noreferrer"&gt;vLLM&lt;/a&gt;, inicia el servidor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; vllm.entrypoints.openai.api_server &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--model&lt;/span&gt; deepseek-ai/DeepSeek-V3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dtype&lt;/span&gt; auto &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--api-key&lt;/span&gt; local-key &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego configura 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;&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;&lt;span class="s2"&gt;"http://localhost:8000"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"local-key"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"deepseek-ai/DeepSeek-V3"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cómo depurar el error paso a paso
&lt;/h2&gt;

&lt;p&gt;Si las configuraciones anteriores no funcionan, ejecuta Claude Code con logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--debug&lt;/span&gt; 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Busca estas líneas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Sending request to:&lt;/code&gt; confirma la URL final&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Response status:&lt;/code&gt; muestra el código HTTP de la pasarela&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;enterprise config error:&lt;/code&gt; muestra el error interno de validación&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;También puedes reproducir la solicitud manualmente:&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;-v&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/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;"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="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="k"&gt;}&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;"anthropic-version: 2023-06-01"&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;"anthropic-beta: max-tokens-3-5-sonnet-2024-07-15"&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": "claude-sonnet-4-6",
    "max_tokens": 10,
    "messages": [{"role": "user", "content": "hi"}]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Interpreta la respuesta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;200&lt;/code&gt;: la pasarela acepta la solicitud&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;401&lt;/code&gt;: credencial incorrecta o encabezado incorrecto&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;403&lt;/code&gt;: acceso bloqueado&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;404&lt;/code&gt;: URL base incorrecta&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;422&lt;/code&gt;: formato de body o modelo inválido&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Probando APIs con Apidog
&lt;/h2&gt;

&lt;p&gt;Cuando depuras proveedores de terceros, &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; te permite inspeccionar solicitudes y respuestas sin reiniciar Claude Code en cada intento.&lt;/p&gt;

&lt;p&gt;Un flujo práctico:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crea una colección para tu pasarela LLM.&lt;/li&gt;
&lt;li&gt;Añade una solicitud &lt;code&gt;POST /v1/messages&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Configura variables de colección para:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;anthropic-version&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;anthropic-beta&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Prueba la misma solicitud contra OpenRouter, LiteLLM o tu gateway interno.&lt;/li&gt;
&lt;li&gt;Compara encabezados, códigos HTTP y cuerpos de respuesta.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ejemplo de body:&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;"claude-sonnet-4-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;"max_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;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&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;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hi"&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;&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%2Fvfnjdxfx0c0r0pkrxfew.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%2Fvfnjdxfx0c0r0pkrxfew.png" alt="Apidog API testing" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto es útil para confirmar si tu pasarela está eliminando encabezados como &lt;code&gt;anthropic-beta&lt;/code&gt; o &lt;code&gt;X-Claude-Code-Session-Id&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuraciones de Claude Code relacionadas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Desactivar la dependencia del encabezado beta
&lt;/h3&gt;

&lt;p&gt;Si tu pasarela no puede reenviar encabezados personalizados:&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;CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto reduce la validación de características beta. El bucle de agente sigue funcionando, pero puedes perder funciones experimentales.&lt;/p&gt;

&lt;h3&gt;
  
  
  Activar descubrimiento de modelos de pasarela
&lt;/h3&gt;

&lt;p&gt;Desde Claude Code v2.1.129, puedes poblar el selector &lt;code&gt;/model&lt;/code&gt; desde el endpoint &lt;code&gt;/v1/models&lt;/code&gt; de la pasarela:&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;CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code consulta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/v1/models
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y añade modelos compatibles al selector.&lt;/p&gt;

&lt;p&gt;Ten en cuenta que solo se añaden automáticamente modelos cuyos IDs comienzan con &lt;code&gt;claude&lt;/code&gt; o &lt;code&gt;anthropic&lt;/code&gt;. Para modelos como DeepSeek, fija el modelo manualmente:&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;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"deepseek/deepseek-v4-pro"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Añadir un modelo personalizado al selector
&lt;/h3&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;ANTHROPIC_CUSTOM_MODEL_OPTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"deepseek/deepseek-v4-pro"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_CUSTOM_MODEL_OPTION_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"DeepSeek V4 Pro"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"17x más barato que Claude Opus"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto añade una opción al selector &lt;code&gt;/model&lt;/code&gt;, útil si alternas entre Claude y un modelo de pasarela.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist rápido de solución
&lt;/h2&gt;

&lt;p&gt;Antes de seguir depurando, revisa:&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;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Debe verse así:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;No así:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Luego valida credenciales:&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;env&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;ANTHROPIC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para OpenRouter o LiteLLM deberías usar normalmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para gateways compatibles con &lt;code&gt;x-api-key&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Valida JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nb"&gt;.&lt;/span&gt; ~/.claude/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y prueba la URL:&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;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/messages"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Guías relacionadas
&lt;/h2&gt;

&lt;p&gt;Si estás explorando Claude Code con backends personalizados, estas guías cubren temas cercanos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/how-to-write-agents-md-files?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo escribir archivos AGENTS.md para equipos de desarrollo de API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/ruflo-multi-agent-claude-code?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Ruflo: Orquestación Multi-Agente para Claude Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/get-free-unlimited-claude-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Obtén API Claude gratuita e ilimitada a través de Puter.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/best-local-llms-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Mejores LLM locales 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Usar un proveedor de terceros con Claude Code viola los términos de Anthropic?
&lt;/h3&gt;

&lt;p&gt;No necesariamente. Anthropic documenta el patrón &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; para enrutar a través de Bedrock, Vertex AI, Foundry y pasarelas personalizadas.&lt;/p&gt;

&lt;p&gt;Lo que Anthropic bloqueó fueron herramientas que suplantaban la ID de cliente de Claude Code para acceder a la API de Anthropic usando precios de suscripción.&lt;/p&gt;

&lt;p&gt;Usar tu propia pasarela o un proveedor como OpenRouter con tu propia clave API es un caso diferente.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Funciona el bucle de agente de Claude Code con DeepSeek V4 Pro?
&lt;/h3&gt;

&lt;p&gt;El bucle principal funciona: edición de archivos, comandos de shell y tareas de varios pasos.&lt;/p&gt;

&lt;p&gt;Las limitaciones principales a través de proveedores de terceros son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Herramientas de servidor MCP&lt;/li&gt;
&lt;li&gt;Entrada de imágenes o visión&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si dependes de esas capacidades, usa la API de Anthropic, Bedrock o Vertex.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué dice “configuración empresarial” si no tengo plan empresarial?
&lt;/h3&gt;

&lt;p&gt;Claude Code usa “enterprise config” como etiqueta interna para configuraciones de proveedor de terceros.&lt;/p&gt;

&lt;p&gt;No significa que necesites un plan Enterprise.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo cambiar entre Anthropic y un proveedor de terceros en la misma sesión?
&lt;/h3&gt;

&lt;p&gt;No. Claude Code lee la URL base al iniciar.&lt;/p&gt;

&lt;p&gt;Para cambiar proveedor:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cierra Claude Code.&lt;/li&gt;
&lt;li&gt;Cambia variables de entorno o &lt;code&gt;settings.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Inicia una nueva sesión.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Herramientas como &lt;a href="https://github.com/aattaran/deepclaude" rel="noopener noreferrer"&gt;DeepClaude&lt;/a&gt; encapsulan este cambio mediante flags como:&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="nt"&gt;--backend&lt;/span&gt; ds
&lt;span class="nt"&gt;--backend&lt;/span&gt; anthropic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mi pasarela está detrás de un firewall. ¿Claude Code soporta proxy?
&lt;/h3&gt;

&lt;p&gt;Sí. Configura &lt;code&gt;HTTPS_PROXY&lt;/code&gt; antes de iniciar:&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;HTTPS_PROXY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://your-proxy:8080"&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;&lt;span class="s2"&gt;"https://your-internal-gateway"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si tu proxy corporativo intercepta TLS, añade el certificado CA:&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;NODE_EXTRA_CA_CERTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/path/to/corporate-ca-bundle.pem"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mi &lt;code&gt;curl&lt;/code&gt; funciona, pero Claude Code falla. ¿Qué cambia?
&lt;/h3&gt;

&lt;p&gt;Claude Code hace una validación previa adicional. Esa solicitud puede incluir encabezados que tu prueba manual no envía.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--debug&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y compara:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL final&lt;/li&gt;
&lt;li&gt;Encabezados&lt;/li&gt;
&lt;li&gt;Modelo solicitado&lt;/li&gt;
&lt;li&gt;Body JSON&lt;/li&gt;
&lt;li&gt;Código HTTP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Diferencias comunes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Falta &lt;code&gt;anthropic-beta&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Falta &lt;code&gt;X-Claude-Code-Session-Id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Modelo no soportado por la pasarela&lt;/li&gt;
&lt;li&gt;Autenticación en encabezado incorrecto&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt; es un error de validación de configuración.&lt;/p&gt;

&lt;p&gt;La ruta de solución más rápida es:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Elimina &lt;code&gt;/v1&lt;/code&gt; de &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Usa la variable correcta: &lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt; o &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Valida &lt;code&gt;~/.claude/settings.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Confirma que el onboarding está completo&lt;/li&gt;
&lt;li&gt;Asegúrate de que tu pasarela reenvía encabezados requeridos&lt;/li&gt;
&lt;li&gt;Revisa políticas gestionadas si estás en un entorno empresarial&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cuando la configuración valida correctamente, Claude Code puede ejecutar su bucle de agente a través de OpenRouter, LiteLLM, vLLM u otra pasarela compatible. Las principales limitaciones al usar proveedores de terceros son MCP y entrada de visión, que pueden requerir la API de Anthropic o proveedores soportados oficialmente.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Obtén API Gemini Gratis e Ilimitada</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Sat, 09 May 2026 07:00:33 +0000</pubDate>
      <link>https://forem.com/roobia/obten-api-gemini-gratis-e-ilimitada-36dp</link>
      <guid>https://forem.com/roobia/obten-api-gemini-gratis-e-ilimitada-36dp</guid>
      <description>&lt;p&gt;Gemini de Google ofrece modelos potentes para cargas de trabajo de IA, pero en una aplicación pública gratuita, un prototipo o un proyecto de hackathon, el coste por token puede crecer rápido. Puter.js cambia el modelo de integración: permite usar Gemini y Gemma desde el navegador sin clave API de Google, sin proyecto de Google Cloud y sin backend. El uso se asocia al usuario final mediante su cuenta de Puter, mientras que tú integras el modelo desde JavaScript.&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;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Puter.js&lt;/strong&gt; permite acceder a modelos Gemini y Gemma sin clave API de Google.&lt;/li&gt;
&lt;li&gt;Modelos Gemini soportados: &lt;strong&gt;2.5 Pro, 2.5 Flash, 2.5 Flash Lite, 2.0 Flash, 2.0 Flash Lite, 3 Flash Preview&lt;/strong&gt; y vistas previas anteriores.&lt;/li&gt;
&lt;li&gt;Modelos Gemma soportados: &lt;strong&gt;Gemma 2, 3 y 4&lt;/strong&gt; en varios tamaños.&lt;/li&gt;
&lt;li&gt;La integración mínima requiere una etiqueta &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; y una llamada a &lt;code&gt;puter.ai.chat()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Soporta streaming, entrada de imagen, temperatura y conversaciones multiturno desde el navegador.&lt;/li&gt;
&lt;li&gt;El usuario final cubre su uso mediante una cuenta de Puter; tú no gestionas claves ni facturación de Google.&lt;/li&gt;
&lt;li&gt;Usa &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 comparar tu prototipo con la API oficial de Gemini antes de migrar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cómo funciona el modelo “gratuito e ilimitado”
&lt;/h2&gt;

&lt;p&gt;Con la API oficial de Gemini, normalmente tú creas un proyecto en Google Cloud o Google AI Studio, generas una clave API y pagas por el consumo de tokens.&lt;/p&gt;

&lt;p&gt;Con Puter.js, el flujo cambia:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;El usuario abre tu aplicación en el navegador.&lt;/li&gt;
&lt;li&gt;Tu aplicación carga Puter.js.&lt;/li&gt;
&lt;li&gt;El usuario inicia sesión en Puter o crea una cuenta.&lt;/li&gt;
&lt;li&gt;Las llamadas a Gemini se ejecutan a través de Puter.&lt;/li&gt;
&lt;li&gt;El uso se descuenta del saldo del usuario final.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para el desarrollador, esto implica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sin clave de Google AI Studio.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sin proyecto de Google Cloud.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sin gestión de cuotas ni rotación de claves.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sin backend obligatorio para llamar al modelo.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sin coste directo por token desde tu cuenta.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La limitación principal: Puter.js está pensado para aplicaciones de navegador. Si necesitas tareas programadas, webhooks, jobs batch o procesos de backend, la API oficial de Gemini sigue siendo la ruta adecuada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 1: Instalar Puter.js
&lt;/h2&gt;

&lt;p&gt;Para una página HTML estática, añade el script desde CDN:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Gemini con Puter.js&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"output"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Explica qué es una API REST en tres frases.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si trabajas en una aplicación empaquetada:&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; @heyputer/puter.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@heyputer/puter.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Paso 2: Elegir el modelo adecuado
&lt;/h2&gt;

&lt;p&gt;Usa el modelo según el tipo de tarea. Para la mayoría de aplicaciones, empieza con &lt;code&gt;google/gemini-2.5-flash&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID del modelo&lt;/th&gt;
&lt;th&gt;Cuándo usarlo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-2.5-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Razonamiento más profundo, análisis complejo y tareas de contexto largo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-2.5-flash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modelo por defecto para chat, Q&amp;amp;A, generación de contenido y prototipos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-2.5-flash-lite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clasificación, etiquetado y tareas simples de alto volumen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-2.0-flash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Base estable con comportamiento conocido&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-3-flash-preview&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Vista previa reciente para probar nuevas capacidades&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemma-3-27b-it&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modelo abierto Gemma ajustado por instrucciones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemma-4-31b-it&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Variante Gemma más grande disponible en Puter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Regla práctica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usa &lt;strong&gt;Flash&lt;/strong&gt; por defecto.&lt;/li&gt;
&lt;li&gt;Usa &lt;strong&gt;Pro&lt;/strong&gt; cuando el prompt requiera razonamiento más difícil.&lt;/li&gt;
&lt;li&gt;Usa &lt;strong&gt;Flash Lite&lt;/strong&gt; para tareas repetitivas, simples y de gran volumen.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Paso 3: Hacer una primera llamada a Gemini
&lt;/h2&gt;

&lt;p&gt;La llamada básica usa &lt;code&gt;puter.ai.chat()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Explain machine learning in three sentences&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;puter&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al abrir la página en el navegador:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Puter carga el SDK.&lt;/li&gt;
&lt;li&gt;El usuario inicia sesión si todavía no lo ha hecho.&lt;/li&gt;
&lt;li&gt;Se envía el prompt al modelo.&lt;/li&gt;
&lt;li&gt;La respuesta se imprime en la página.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No necesitas &lt;code&gt;.env&lt;/code&gt;, servidor ni clave API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 4: Mostrar respuestas en streaming
&lt;/h2&gt;

&lt;p&gt;Para interfaces de chat, usa streaming. Esto mejora la percepción de velocidad porque el usuario ve la respuesta mientras se genera.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputDiv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Explain photosynthesis in detail&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &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;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;outputDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&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;Un ejemplo de HTML completo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"run"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Preguntar&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;pre&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"output"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;run&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Resume qué es el patrón Repository en backend.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &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;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&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="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Paso 5: Usar visión con una imagen
&lt;/h2&gt;

&lt;p&gt;Gemini también puede analizar imágenes. Pasa la URL de la imagen como segundo argumento:&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;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;What do you see in this image? Describe colors, objects, and mood.&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="s1"&gt;https://assets.puter.site/doge.jpeg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;puter&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Casos de uso comunes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generación de texto alternativo.&lt;/li&gt;
&lt;li&gt;Análisis de capturas de pantalla.&lt;/li&gt;
&lt;li&gt;OCR básico.&lt;/li&gt;
&lt;li&gt;Revisión visual de productos.&lt;/li&gt;
&lt;li&gt;Herramientas de accesibilidad.&lt;/li&gt;
&lt;li&gt;Clasificación o etiquetado de imágenes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para imágenes naturales y diagramas, Gemini suele ofrecer buen rendimiento. Para capturas con texto muy denso, puede que otros modelos funcionen mejor según el caso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 6: Ajustar la temperatura
&lt;/h2&gt;

&lt;p&gt;Pasa parámetros en el objeto de opciones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Write a creative short story about a robot chef&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&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;Guía rápida:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Temperatura&lt;/th&gt;
&lt;th&gt;Uso recomendado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;0.0&lt;/code&gt; - &lt;code&gt;0.3&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Respuestas factuales, extracción de datos, clasificación&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;0.4&lt;/code&gt; - &lt;code&gt;0.7&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Chat general, explicaciones, asistencia técnica&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;0.8&lt;/code&gt; - &lt;code&gt;1.0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Escritura creativa, brainstorming, variaciones de estilo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Para la mayoría de casos de chat, &lt;code&gt;0.7&lt;/code&gt; funciona bien como punto de partida.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 7: Crear conversaciones multiturno
&lt;/h2&gt;

&lt;p&gt;Para mantener contexto entre mensajes, envía un array de mensajes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;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="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;I am building a Next.js app with Postgres.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Got it. What do you need help with?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;How should I structure migrations?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-pro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Patrón de implementación:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userInput&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes de cada nueva llamada, añade el mensaje del usuario y la respuesta anterior del asistente. Así el modelo recibe la transcripción completa disponible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparar Gemini con otros modelos usando el mismo prompt
&lt;/h2&gt;

&lt;p&gt;Puter expone varios proveedores mediante una interfaz similar. Puedes ejecutar el mismo prompt contra varios modelos y comparar latencia y calidad:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;models&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="s1"&gt;google/gemini-2.5-flash&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="s1"&gt;claude-sonnet-4-6&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="s1"&gt;gpt-5.5&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="s1"&gt;x-ai/grok-4.3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Refactor this React component to use hooks: ...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for &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;model&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;model&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;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;elapsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;ms`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;---&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usa este patrón para decidir con datos propios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Latencia percibida.&lt;/li&gt;
&lt;li&gt;Calidad de respuesta.&lt;/li&gt;
&lt;li&gt;Consistencia.&lt;/li&gt;
&lt;li&gt;Adecuación al tipo de prompt.&lt;/li&gt;
&lt;li&gt;Comportamiento en errores o entradas incompletas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lo que obtienes y lo que no
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Obtienes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Acceso a modelos Gemini 2.5, 2.0, 3 Flash Preview y 2.5 Pro.&lt;/li&gt;
&lt;li&gt;Acceso a la familia abierta Gemma 2/3/4.&lt;/li&gt;
&lt;li&gt;Conversaciones multiturno.&lt;/li&gt;
&lt;li&gt;Respuestas en streaming.&lt;/li&gt;
&lt;li&gt;Entrada de visión mediante URL de imagen.&lt;/li&gt;
&lt;li&gt;Parámetros como &lt;code&gt;temperature&lt;/code&gt;, &lt;code&gt;max_tokens&lt;/code&gt; y prompts de sistema.&lt;/li&gt;
&lt;li&gt;Integración directa en navegador.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Puede que no obtengas, según la versión de Puter
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Function calling nativo de Gemini.&lt;/li&gt;
&lt;li&gt;Herramienta de ejecución de código.&lt;/li&gt;
&lt;li&gt;Fundamentación en Google Search.&lt;/li&gt;
&lt;li&gt;Contexto completo de 2M tokens de Gemini.&lt;/li&gt;
&lt;li&gt;Uso limpio desde backend sin sesión de usuario.&lt;/li&gt;
&lt;li&gt;Visibilidad directa de los límites de velocidad de Google.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para agentes complejos, ejecución de código, fundamentación en Search o contexto máximo, usa la API oficial de Google AI Studio. Para chat, Q&amp;amp;A, generación de contenido, prototipos y tareas visuales desde navegador, Puter puede ser suficiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuándo usar Puter y cuándo usar la API oficial de Gemini
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Usa Puter cuando
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Estás creando una app pública gratuita y no quieres asumir facturación por tokens.&lt;/li&gt;
&lt;li&gt;Estás prototipando y quieres evitar configuración de Google Cloud.&lt;/li&gt;
&lt;li&gt;Quieres usar Gemini en un sitio estático.&lt;/li&gt;
&lt;li&gt;Estás construyendo una demo, hackathon o extensión de navegador.&lt;/li&gt;
&lt;li&gt;Tus usuarios pueden iniciar sesión en Puter.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Usa la API oficial de Gemini cuando
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Necesitas llamadas desde backend.&lt;/li&gt;
&lt;li&gt;Tienes jobs programados, webhooks, colas o procesos batch.&lt;/li&gt;
&lt;li&gt;Necesitas ejecución de código o fundamentación en Search.&lt;/li&gt;
&lt;li&gt;Necesitas el contexto completo de 2M tokens.&lt;/li&gt;
&lt;li&gt;Necesitas cumplimiento contractual directo con Google.&lt;/li&gt;
&lt;li&gt;Necesitas ajuste fino sobre tus propios datos.&lt;/li&gt;
&lt;li&gt;No puedes introducir un paso de inicio de sesión con Puter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para una guía específica sobre Gemini 3 Flash, consulta &lt;a href="http://apidog.com/blog/how-to-use-gemini-3-flash-preview-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de vista previa de Gemini 3 Flash&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Probar la integración con Apidog
&lt;/h2&gt;

&lt;p&gt;Las llamadas de Puter ocurren en el navegador, por lo que no se prueban igual que una API backend. Un flujo práctico es separar prototipo y producción:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crea una página estática con Puter.js.&lt;/li&gt;
&lt;li&gt;Añade un parámetro de consulta para enviar prompts de prueba.&lt;/li&gt;
&lt;li&gt;Usa Apidog para documentar y validar la API oficial de Gemini si después migras.&lt;/li&gt;
&lt;li&gt;Mantén dos entornos: uno para el prototipo con Puter y otro para la API oficial.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ejemplo de estructura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Entorno 1: puter-prototype
Base URL: http://localhost:3000

Entorno 2: gemini-prod
Base URL: https://generativelanguage.googleapis.com/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puedes &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descargar Apidog&lt;/a&gt; y configurar ambos entornos en una misma colección. Así puedes documentar el flujo, probar requests equivalentes y preparar la migración a la API oficial si tu proyecto lo requiere.&lt;/p&gt;

&lt;p&gt;Para patrones más amplios de testing de APIs, consulta &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Herramienta de prueba de API para ingenieros de control de calidad&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Otras rutas gratuitas de LLM a través de Puter
&lt;/h2&gt;

&lt;p&gt;El mismo patrón de integración funciona con otros modelos disponibles mediante Puter. Cambias el valor de &lt;code&gt;model&lt;/code&gt; y mantienes una interfaz similar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Resume este texto para un usuario técnico.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recursos relacionados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/get-free-unlimited-claude-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Obtén API de Claude ilimitada y gratuita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/get-free-unlimited-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Obtén API de GPT-5.5 ilimitada y gratuita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar Grok 4.3 gratis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/get-free-unlimited-deepseek-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Obtén API de DeepSeek ilimitada y gratuita&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Es realmente ilimitado?
&lt;/h3&gt;

&lt;p&gt;Desde tu lado como desarrollador, sí: no gestionas una cuota propia de Google ni pagas los tokens desde tu cuenta. El consumo depende del saldo disponible en la cuenta Puter del usuario final.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Necesito una cuenta de Google o un proyecto de Google Cloud?
&lt;/h3&gt;

&lt;p&gt;No. Puter gestiona la integración ascendente. Tu aplicación no necesita una clave API de Google.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo usar esto en producción?
&lt;/h3&gt;

&lt;p&gt;Sí, si tu aplicación está basada en navegador y el flujo de inicio de sesión de Puter encaja con tu producto. Para backend puro, usa la API oficial.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿El rendimiento es idéntico al de la API oficial de Gemini?
&lt;/h3&gt;

&lt;p&gt;El modelo subyacente es el mismo, pero puede existir una pequeña diferencia de latencia por la capa adicional de Puter. El comportamiento del modelo no debería cambiar por el hecho de llamarlo desde Puter.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué pasa con la ventana de contexto de 2M tokens?
&lt;/h3&gt;

&lt;p&gt;Puter puede no exponer el límite completo de 2M tokens en todas las variantes. Si tu caso depende de contextos extremadamente largos, usa la API oficial de Google AI Studio.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo usarlo en un bot de Discord o servicio backend?
&lt;/h3&gt;

&lt;p&gt;No de forma limpia. Puter está diseñado principalmente para navegador y asume una sesión de usuario. Para bots, workers, cron jobs o servicios backend, usa la API oficial de Gemini.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué modelo debería usar por defecto?
&lt;/h3&gt;

&lt;p&gt;Usa &lt;code&gt;google/gemini-2.5-flash&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cambia a &lt;code&gt;google/gemini-2.5-pro&lt;/code&gt; para tareas de razonamiento más difíciles y a &lt;code&gt;google/gemini-2.5-flash-lite&lt;/code&gt; para clasificación o etiquetado de alto volumen.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puter soporta generación de imágenes con Imagen?
&lt;/h3&gt;

&lt;p&gt;Actualmente, Puter expone generación de imágenes mediante &lt;code&gt;gpt-image-2&lt;/code&gt; y variantes de DALL-E de OpenAI, no Imagen. Para esa ruta, consulta &lt;a href="http://apidog.com/blog/get-free-unlimited-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Obtén API de GPT-5.5 ilimitada y gratuita&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Puter.js es una forma directa de usar Gemini desde el navegador sin clave API, sin backend y sin configurar Google Cloud. Para empezar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Añade &lt;code&gt;https://js.puter.com/v2/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Llama a &lt;code&gt;puter.ai.chat()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Usa &lt;code&gt;google/gemini-2.5-flash&lt;/code&gt; como modelo inicial.&lt;/li&gt;
&lt;li&gt;Añade streaming, visión o multiturno según tu caso.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para prototipos, sitios estáticos, hackathons y apps públicas gratuitas, Puter reduce la fricción de integración. Para backend, ajuste fino, ejecución de código o contexto máximo de Gemini, la API oficial sigue siendo la opción correcta.&lt;/p&gt;

&lt;p&gt;Crea tu solicitud una vez en &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;, compara el prototipo con Puter frente a la API oficial de Gemini y elige la ruta que encaje con tu arquitectura.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>API GPT-5.5 y Todos los Modelos OpenAI Gratis e Ilimitados</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Sat, 09 May 2026 02:37:25 +0000</pubDate>
      <link>https://forem.com/roobia/api-gpt-55-y-todos-los-modelos-openai-gratis-e-ilimitados-4lga</link>
      <guid>https://forem.com/roobia/api-gpt-55-y-todos-los-modelos-openai-gratis-e-ilimitados-4lga</guid>
      <description>&lt;p&gt;El GPT-5.5 de OpenAI se distribuye con una API de pago: $5 por millón de tokens de entrada y $30 por millón de tokens de salida. Si estás construyendo un proyecto secundario, una demo de hackathon o una aplicación pública gratuita, ese coste puede bloquear el lanzamiento antes de escribir la primera integración. Una alternativa práctica es usar Puter.js: expone modelos de OpenAI como GPT-5.5, GPT-5.5 Pro, variantes GPT-5.x, GPT-Image-2, DALL-E y OpenAI TTS sin que tengas que gestionar una clave de OpenAI. El uso se carga al usuario final mediante su cuenta de Puter; tú no pagas la factura de tokens.&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;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  En resumen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Puter.js&lt;/strong&gt; permite usar modelos de OpenAI desde el navegador sin clave API, sin cuenta de OpenAI y sin backend propio.&lt;/li&gt;
&lt;li&gt;Los modelos de texto compatibles incluyen &lt;strong&gt;gpt-5.5, gpt-5.5-pro, gpt-5.4, gpt-5, gpt-5-mini, o1, o3, gpt-4.1, gpt-4o&lt;/strong&gt;, además de variantes de chat y códec.&lt;/li&gt;
&lt;li&gt;Para imágenes puedes usar &lt;strong&gt;gpt-image-2, gpt-image-1.5, dall-e-3&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Para texto a voz puedes usar &lt;strong&gt;gpt-4o-mini-tts, tts-1, tts-1-hd&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;La integración mínima requiere una etiqueta &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; y una llamada a &lt;code&gt;puter.ai.chat&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Streaming, visión, generación de imágenes, texto a voz y llamada a funciones funcionan desde el navegador.&lt;/li&gt;
&lt;li&gt;El usuario final cubre su consumo desde Puter; tu aplicación evita exposición directa a la facturación de OpenAI.&lt;/li&gt;
&lt;li&gt;Usa &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 comparar prompts entre Puter y la API oficial de OpenAI cuando planifiques una migración.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cómo funciona lo de "gratis ilimitado"
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.puter.com/tutorials/free-unlimited-openai-api/" rel="noopener noreferrer"&gt;Puter.js&lt;/a&gt; cambia el modelo de facturación de los LLM. En vez de que tu aplicación use una clave de OpenAI y asuma cada coste de token, el usuario inicia sesión en Puter y el consumo se carga a su cuenta. Las cuentas nuevas de Puter obtienen crédito inicial; si el usuario necesita más uso, puede recargar.&lt;/p&gt;

&lt;p&gt;Para ti como desarrollador, esto implica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No gestionas claves de OpenAI.&lt;/strong&gt; No hay secretos en el repositorio, variables de entorno ni rotación de claves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No tienes límite de uso centralizado.&lt;/strong&gt; Cada usuario opera con su propia cuenta de Puter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No tienes exposición directa a la facturación.&lt;/strong&gt; No recibes una factura de OpenAI por el uso de tus usuarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La contrapartida importante: Puter.js está pensado para aplicaciones de navegador. Si necesitas ejecutar tareas en backend, workers, webhooks o procesamiento por lotes sin sesión de usuario, la API oficial de OpenAI sigue siendo la opción adecuada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 1: Instala Puter.js
&lt;/h2&gt;

&lt;p&gt;Para una página HTML, añade el script desde CDN:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"es"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si usas bundler, instala el paquete NPM:&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; @heyputer/puter.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Importa &lt;code&gt;puter&lt;/code&gt; en tu código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@heyputer/puter.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usa la versión CDN para prototipos, sitios estáticos, extensiones de navegador o demos rápidas. Usa NPM si tu aplicación ya tiene pipeline de build y quieres integrarlo con tu stack JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 2: Elige el modelo correcto
&lt;/h2&gt;

&lt;p&gt;Selecciona el modelo según la tarea. La elección afecta latencia, calidad y coste para el usuario.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID del modelo&lt;/th&gt;
&lt;th&gt;Cuándo usar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.5-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Razonamiento profundo, agentes de codificación, análisis complejo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Uso general diario; buen equilibrio entre calidad y coste&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.4-nano&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clasificación o texto de alto volumen con menor coste&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.4-mini&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Interfaces de chat y tareas intermedias&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.3-codex&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tareas específicas de código&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;o3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cadenas de razonamiento complejas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;o1-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Planificación agéntica de varios pasos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;gpt-4.1&lt;/code&gt;, &lt;code&gt;gpt-4o&lt;/code&gt;, &lt;code&gt;gpt-4o-mini&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Base estable y conocida&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Para generación de imágenes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gpt-image-2&lt;/code&gt;: modelo más reciente, rápido y con salida nítida.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gpt-image-1.5&lt;/code&gt;, &lt;code&gt;gpt-image-1&lt;/code&gt;, &lt;code&gt;dall-e-3&lt;/code&gt;, &lt;code&gt;dall-e-2&lt;/code&gt;: opciones anteriores pero estables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para texto a voz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gpt-4o-mini-tts&lt;/code&gt;: opción más reciente y natural.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tts-1&lt;/code&gt;, &lt;code&gt;tts-1-hd&lt;/code&gt;: TTS clásico con menor latencia.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Paso 3: Haz tu primera llamada a GPT-5.5
&lt;/h2&gt;

&lt;p&gt;La llamada mínima de chat se hace con &lt;code&gt;puter.ai.chat&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"es"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explica WebSockets en tres frases&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;puter&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abre el archivo en el navegador. Puter gestiona la autenticación del usuario y ejecuta la llamada al modelo. Si el usuario no tiene sesión iniciada, Puter le pedirá iniciar sesión o crear una cuenta gratuita.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Clave API de OpenAI.&lt;/li&gt;
&lt;li&gt;Backend intermedio.&lt;/li&gt;
&lt;li&gt;Variable de entorno.&lt;/li&gt;
&lt;li&gt;Endpoint propio para proxy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Paso 4: Usa streaming para interfaces de chat
&lt;/h2&gt;

&lt;p&gt;Para una UX de chat, no esperes a que termine toda la respuesta. Activa &lt;code&gt;stream: true&lt;/code&gt; y consume los fragmentos conforme llegan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explica la teoría de la relatividad en detalle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &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;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;puter&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="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&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;En una interfaz real, en vez de imprimir con &lt;code&gt;puter.print&lt;/code&gt;, añade cada fragmento a una burbuja de chat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bubble&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#assistant-message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &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;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;bubble&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&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;Esto permite que el usuario vea la respuesta aparecer progresivamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 5: Procesa imágenes con visión
&lt;/h2&gt;

&lt;p&gt;Puedes pasar una URL de imagen como segundo argumento. El modelo analizará la imagen y responderá según el prompt:&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;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;¿Qué ves en esta imagen? Describe colores, objetos y ambiente.&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;https://assets.puter.site/doge.jpeg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;puter&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Casos de uso prácticos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generación de texto alternativo.&lt;/li&gt;
&lt;li&gt;Análisis de capturas de pantalla.&lt;/li&gt;
&lt;li&gt;QA visual.&lt;/li&gt;
&lt;li&gt;OCR básico.&lt;/li&gt;
&lt;li&gt;Herramientas de accesibilidad.&lt;/li&gt;
&lt;li&gt;Clasificación de imágenes enviada por usuarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Paso 6: Genera imágenes desde texto
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;puter.ai.txt2img&lt;/code&gt; devuelve un elemento &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; con la imagen generada ya cargada:&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;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;txt2img&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Una ciudad futurista de noche, estilo cinematográfico, luces neón, lluvia&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-image-2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageElement&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;document&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="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageElement&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;Si quieres integrarlo en una UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"image-form"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"prompt"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Describe la imagen"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Generar&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"result"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#image-form&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#prompt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#result&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Generando imagen...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;txt2img&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-image-2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El coste de generación se carga al saldo de Puter del usuario. Para aplicaciones públicas, limita prompts vacíos, evita reintentos automáticos innecesarios y muestra al usuario cuándo una acción generará consumo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 7: Convierte texto a voz
&lt;/h2&gt;

&lt;p&gt;La línea TTS de OpenAI se expone mediante &lt;code&gt;puter.ai.txt2speech&lt;/code&gt;. La función devuelve un elemento &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&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;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;txt2speech&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bienvenido de nuevo. El saldo de tu cuenta es de $1,247.50.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-4o-mini-tts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audio&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;controls&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="p"&gt;);&lt;/span&gt;
  &lt;span class="nb"&gt;document&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="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audio&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;Úsalo para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Indicaciones de voz.&lt;/li&gt;
&lt;li&gt;Lectura de respuestas largas.&lt;/li&gt;
&lt;li&gt;Narración de accesibilidad.&lt;/li&gt;
&lt;li&gt;Onboarding de aplicaciones.&lt;/li&gt;
&lt;li&gt;Locuciones de prototipos o demos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Paso 8: Implementa llamada a funciones
&lt;/h2&gt;

&lt;p&gt;Puter usa un formato compatible con el patrón de herramientas de OpenAI. Defines herramientas, el modelo solicita una llamada y tú ejecutas la función en tu aplicación.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;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="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;function&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;get_weather&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Obtiene el clima actual de una ciudad.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;type&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="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Nombre de la ciudad&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&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;city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;¿Cuál es el clima en Tokio ahora mismo?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;tools&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toolCalls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tool_calls&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;toolCalls&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toolCall&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;toolCalls&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Función:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toolCall&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Argumentos:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toolCall&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Aquí ejecutas tu propia función:&lt;/span&gt;
  &lt;span class="c1"&gt;// const result = await getWeather(JSON.parse(toolCall.function.arguments));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La parte importante: el modelo no ejecuta tu función. Solo devuelve la intención estructurada. Tú decides qué hacer con esa solicitud, validas argumentos y ejecutas código propio.&lt;/p&gt;

&lt;p&gt;Para probar flujos basados en herramientas en entornos de producción, consulta &lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;las pruebas de servidor MCP en Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 9: Controla temperatura y &lt;code&gt;max_tokens&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Pasa los parámetros estándar en el objeto de opciones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Háblame de Marte&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&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;Guía rápida:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;temperature: 0.0&lt;/code&gt; a &lt;code&gt;0.3&lt;/code&gt;: respuestas más deterministas y factuales.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;temperature: 0.7&lt;/code&gt; a &lt;code&gt;1.0&lt;/code&gt;: escritura más creativa.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;max_tokens&lt;/code&gt;: límite máximo de salida.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para una aplicación pública, define &lt;code&gt;max_tokens&lt;/code&gt; por tipo de acción. Por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;LIMITS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;codeReview&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;userPrompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LIMITS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;summary&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;Esto mantiene el consumo del usuario más predecible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lo que obtienes y lo que no
&lt;/h2&gt;

&lt;p&gt;Puter.js cubre muchos casos de uso, pero no reemplaza toda la superficie de la API oficial de OpenAI.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Catálogo GPT-5.x, incluyendo 5.5, 5.5 Pro, 5.4 mini, nano y pro.&lt;/li&gt;
&lt;li&gt;Modelos anteriores como GPT-4.1, GPT-4o, o1 y o3.&lt;/li&gt;
&lt;li&gt;Generación de imágenes con GPT-Image-2 y DALL-E.&lt;/li&gt;
&lt;li&gt;Texto a voz con modelos TTS de OpenAI.&lt;/li&gt;
&lt;li&gt;Streaming.&lt;/li&gt;
&lt;li&gt;Entrada de imagen.&lt;/li&gt;
&lt;li&gt;Llamada a funciones.&lt;/li&gt;
&lt;li&gt;Parámetros como &lt;code&gt;temperature&lt;/code&gt; y &lt;code&gt;max_tokens&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Integración directa en navegador sin backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Puede que no obtengas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API de Responses.&lt;/li&gt;
&lt;li&gt;Reducción de coste por caché de prompts.&lt;/li&gt;
&lt;li&gt;API de Files para contexto de documentos subidos.&lt;/li&gt;
&lt;li&gt;Uso limpio del lado del servidor sin sesión de navegador.&lt;/li&gt;
&lt;li&gt;Cabeceras directas de rate limit de OpenAI.&lt;/li&gt;
&lt;li&gt;Modo completo de salida estructurada con validación de esquema JSON.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para flujos de producción avanzados, la API oficial de OpenAI sigue siendo la opción más completa. Para prototipos, sitios estáticos, extensiones y aplicaciones de navegador, Puter.js reduce mucha fricción inicial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuándo usar Puter vs. OpenAI oficial
&lt;/h2&gt;

&lt;p&gt;Usa Puter cuando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estás lanzando una aplicación pública gratuita.&lt;/li&gt;
&lt;li&gt;No quieres asumir la factura de tokens de tus usuarios.&lt;/li&gt;
&lt;li&gt;Estás prototipando y no quieres configurar facturación en OpenAI.&lt;/li&gt;
&lt;li&gt;Tu aplicación corre principalmente en navegador.&lt;/li&gt;
&lt;li&gt;No necesitas backend para ejecutar las llamadas.&lt;/li&gt;
&lt;li&gt;Tus usuarios pueden iniciar sesión en Puter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Usa la API oficial de OpenAI cuando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Necesitas llamadas del lado del servidor.&lt;/li&gt;
&lt;li&gt;Ejecutas tareas programadas, webhooks o procesamiento por lotes.&lt;/li&gt;
&lt;li&gt;Necesitas la API de Responses, Files o salidas estructuradas completas.&lt;/li&gt;
&lt;li&gt;Quieres aprovechar caché de prompts.&lt;/li&gt;
&lt;li&gt;Necesitas acuerdos contractuales o requisitos de cumplimiento.&lt;/li&gt;
&lt;li&gt;No quieres introducir un login adicional de Puter para tus usuarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una estrategia práctica es empezar con Puter para validar la experiencia de usuario y migrar a la API oficial cuando aparezca una necesidad clara de backend, cumplimiento o control avanzado.&lt;/p&gt;

&lt;p&gt;Para una configuración de producción de pago, consulta &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Probando la integración en Apidog
&lt;/h2&gt;

&lt;p&gt;Las llamadas de Puter ocurren en el navegador, por lo que no puedes ejecutarlas directamente como una prueba backend tradicional. Un flujo práctico es separar prototipo y producción:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crea una página estática que use Puter.js.&lt;/li&gt;
&lt;li&gt;Lee el prompt desde un parámetro de consulta o desde un formulario.&lt;/li&gt;
&lt;li&gt;Usa esa página para validar el comportamiento del frontend.&lt;/li&gt;
&lt;li&gt;Usa Apidog para preparar y probar la API oficial de OpenAI si luego migras.&lt;/li&gt;
&lt;li&gt;Mantén dos entornos separados: uno para Puter y otro para OpenAI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ejemplo de entornos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;puter-prototype&lt;/code&gt;: URL local de tu página con Puter, por ejemplo &lt;code&gt;http://localhost:5173&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;openai-prod&lt;/code&gt;: &lt;code&gt;https://api.openai.com/v1&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-29.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-29.png" alt="" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descarga Apidog&lt;/a&gt; y configura ambos entornos en la misma colección. Así puedes comparar el prompt, la estructura de mensajes y la respuesta antes de decidir si migras desde Puter a la API oficial.&lt;/p&gt;

&lt;p&gt;Para patrones de pruebas de API más amplios, consulta &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;herramienta de prueba de API para ingenieros de QA&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;¿Es realmente ilimitado?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Desde el lado del desarrollador, sí. No tienes un límite de uso centralizado asociado a tu cuenta de OpenAI porque no estás usando tu propia clave. El consumo depende del saldo de la cuenta de Puter de cada usuario.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Necesito una cuenta de OpenAI?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Puter gestiona la conexión con OpenAI. Tu aplicación no ve ni almacena una clave de OpenAI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo usar esto en producción?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sí, si tu aplicación está basada en navegador y el flujo de inicio de sesión en Puter encaja con tu producto. Si necesitas procesos backend sin usuario interactivo, usa la API oficial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿GPT-5.5 vía Puter funciona igual que la API oficial?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Puter llama a OpenAI en nombre del usuario. La salida del modelo debería mantener el mismo comportamiento del modelo, aunque puede existir latencia adicional por el salto intermedio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué pasa con el caché de prompts?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Puter no expone los controles de caché de prompts de OpenAI. Si tu aplicación depende de un prompt de sistema grande y estable para reducir coste, usa la API oficial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo usar Puter en un servicio backend?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No de forma limpia. Puter está diseñado para navegador y asume una sesión de usuario. Para backend, usa la API oficial de OpenAI. Para alternativas gratuitas del lado del servidor, consulta &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de GPT-5.5 gratis&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué modelo debería usar por defecto?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Usa &lt;code&gt;gpt-5.5&lt;/code&gt; para razonamiento general. Usa &lt;code&gt;gpt-5.4-nano&lt;/code&gt; para clasificación de alto volumen. Usa &lt;code&gt;gpt-5.5-pro&lt;/code&gt; para tareas difíciles. Usa &lt;code&gt;o3&lt;/code&gt; cuando necesites razonamiento largo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Se les cobrará mucho a mis usuarios?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Depende del uso. Las conversaciones de texto suelen tener costes bajos por sesión, pero la generación de imágenes puede consumir más saldo. Controla &lt;code&gt;max_tokens&lt;/code&gt;, evita llamadas duplicadas y muestra acciones explícitas para operaciones costosas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo generar imágenes gratis con Puter?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Puedes generar imágenes con &lt;code&gt;txt2img&lt;/code&gt; usando &lt;code&gt;gpt-image-2&lt;/code&gt; o DALL-E. El coste se carga al saldo de Puter del usuario. Para la guía de la API de pago, consulta &lt;a href="http://apidog.com/blog/how-to-use-gpt-image-2-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de GPT-Image-2&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Puter.js es una forma directa de integrar modelos de OpenAI en aplicaciones de navegador sin gestionar claves, backend ni facturación propia. Añades el script, eliges un modelo y llamas a &lt;code&gt;puter.ai.chat&lt;/code&gt;, &lt;code&gt;txt2img&lt;/code&gt; o &lt;code&gt;txt2speech&lt;/code&gt; según el caso.&lt;/p&gt;

&lt;p&gt;Para prototipos, hackathons, sitios estáticos y aplicaciones públicas gratuitas, este enfoque reduce mucha complejidad. Para backend, caché de prompts, API de Responses, Files o salidas estructuradas completas, la API oficial de OpenAI sigue siendo la opción correcta.&lt;/p&gt;

&lt;p&gt;Crea la solicitud una vez en &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;, compara Puter con la API oficial y elige el camino que mejor encaje con tu arquitectura.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Obtén API Claude Opus 4.7 Gratis e Ilimitada</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Sat, 09 May 2026 02:30:19 +0000</pubDate>
      <link>https://forem.com/roobia/obten-api-claude-opus-47-gratis-e-ilimitada-5g4f</link>
      <guid>https://forem.com/roobia/obten-api-claude-opus-47-gratis-e-ilimitada-5g4f</guid>
      <description>&lt;p&gt;La familia Claude de Anthropic es una de las líneas de modelos de código cerrado más capaces para codificación, agentes y razonamiento con contexto largo. El problema es el coste: Sonnet cuesta $3 / $15 por millón de tokens y Opus cuesta más. Puter.js cambia el modelo de facturación: expone modelos Claude como Opus 4.7, Sonnet 4.6 y Haiku 4.5 sin clave de Anthropic, y carga el uso al usuario final en lugar de al desarrollador.&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;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;En esta guía vas a implementar Claude en una app de navegador con Puter.js: instalación, selección de modelo, llamadas básicas, streaming, conversaciones multiturno, mensajes de sistema y criterios para decidir cuándo migrar a la API oficial de Anthropic.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Puter.js&lt;/strong&gt; permite usar Claude desde el navegador sin clave de API de Anthropic.&lt;/li&gt;
&lt;li&gt;El usuario final usa su propia cuenta de Puter; tú no gestionas facturación de Anthropic.&lt;/li&gt;
&lt;li&gt;Modelos compatibles mencionados: &lt;strong&gt;Opus 4.7, Opus 4.6, Opus 4.6 Fast, Opus 4.5, Opus 4.1, Opus 4, Sonnet 4.6, Sonnet 4.5, Sonnet 4, Haiku 4.5&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;La integración mínima requiere una etiqueta &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; y una llamada a &lt;code&gt;puter.ai.chat&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Soporta streaming, mensajes de sistema y conversaciones multiturno.&lt;/li&gt;
&lt;li&gt;Puedes usar &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 comparar el diseño de tus solicitudes cuando migres a la API oficial de Anthropic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cómo funciona el acceso gratuito para el desarrollador
&lt;/h2&gt;

&lt;p&gt;Puter.js es una biblioteca de IA y nube sin servidor que se ejecuta en el navegador.&lt;/p&gt;

&lt;p&gt;La diferencia clave está en la arquitectura:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tu aplicación carga Puter.js.&lt;/li&gt;
&lt;li&gt;El usuario inicia sesión en Puter.&lt;/li&gt;
&lt;li&gt;La llamada a Claude se ejecuta usando la cuenta del usuario.&lt;/li&gt;
&lt;li&gt;El consumo se carga al saldo del usuario en Puter.&lt;/li&gt;
&lt;li&gt;Tú no expones claves ni pagas la factura de Anthropic.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esto implica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No hay claves de API en el frontend ni en el repositorio.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No gestionas límites de uso por proyecto.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No necesitas una cuenta de Anthropic para este flujo.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La contrapartida: Puter.js está pensado principalmente para aplicaciones de navegador. Si necesitas ejecutar Claude desde backend, workers, cron jobs o procesamiento por lotes, la API oficial de Anthropic suele ser la opción correcta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 1: Instala Puter.js
&lt;/h2&gt;

&lt;p&gt;Para un prototipo o sitio estático, añade el script CDN:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejemplo HTML mínimo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"es"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si trabajas con una app empaquetada, puedes instalarlo con NPM:&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; @heyputer/puter.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E importarlo en tu código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@heyputer/puter.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usa el CDN si quieres validar rápido la integración. Usa NPM si estás en una aplicación con Vite, Webpack o TypeScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 2: Elige el modelo Claude
&lt;/h2&gt;

&lt;p&gt;Puter expone varios modelos Claude usando IDs compatibles con la nomenclatura de Anthropic.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID de modelo&lt;/th&gt;
&lt;th&gt;Cuándo usarlo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-7&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Razonamiento profundo, revisión compleja de código, agentes avanzados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Codificación robusta y tareas complejas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4.6-fast&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Variante Opus con menor latencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Agentes de producción y razonamiento estable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modelo heredado estable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Línea base de Opus 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4-6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modelo recomendado para uso diario&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Buen equilibrio para tareas generales&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Línea base de Sonnet 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-haiku-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clasificación rápida, alto volumen, baja latencia&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Recomendación práctica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usa &lt;code&gt;claude-sonnet-4-6&lt;/code&gt; por defecto.&lt;/li&gt;
&lt;li&gt;Usa &lt;code&gt;claude-haiku-4-5&lt;/code&gt; para tareas rápidas y repetitivas.&lt;/li&gt;
&lt;li&gt;Usa &lt;code&gt;claude-opus-4-7&lt;/code&gt; cuando la calidad de razonamiento sea más importante que la latencia.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Paso 3: Haz tu primera llamada a Claude
&lt;/h2&gt;

&lt;p&gt;La llamada mínima usa &lt;code&gt;puter.ai.chat&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"es"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explica la computación cuántica en términos simples&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;puter&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="nx"&gt;response&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Qué ocurre al abrir este archivo en el navegador:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Se carga Puter.js.&lt;/li&gt;
&lt;li&gt;El usuario inicia sesión o crea una cuenta de Puter.&lt;/li&gt;
&lt;li&gt;Puter envía el prompt a Claude.&lt;/li&gt;
&lt;li&gt;La respuesta se renderiza en la página.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La respuesta sigue una estructura similar a la API de mensajes de Anthropic:&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;response&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para respuestas de texto simple, normalmente lees el primer bloque. Si esperas contenido multiparte, itera sobre &lt;code&gt;response.message.content&lt;/code&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="k"&gt;for &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;block&lt;/span&gt; &lt;span class="k"&gt;of&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;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="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;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&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;h2&gt;
  
  
  Paso 4: Implementa streaming
&lt;/h2&gt;

&lt;p&gt;Para respuestas largas, activa &lt;code&gt;stream: true&lt;/code&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Escribe un análisis detallado sobre el impacto de la inteligencia artificial en la sociedad&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &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;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;puter&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="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&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;En una interfaz de chat, el patrón típico es acumular los fragmentos en un contenedor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"output"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Resume los riesgos de seguridad más comunes en APIs REST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &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;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto mejora la percepción de velocidad porque el usuario ve la respuesta mientras se genera.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 5: Crea conversaciones multiturno
&lt;/h2&gt;

&lt;p&gt;Para mantener contexto, pasa un array de mensajes en lugar de un string.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;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="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Estoy construyendo una app Next.js con Postgres.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Entendido. ¿En qué parte necesitas ayuda?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;¿Cómo debería estructurar la carpeta de migraciones?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&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;Para una app real, guarda el historial en memoria o en estado de UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userText&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assistantText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;assistantText&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;assistantText&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;Claude leerá la transcripción completa enviada en cada llamada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 6: Usa mensajes de sistema
&lt;/h2&gt;

&lt;p&gt;Los mensajes de sistema definen comportamiento, tono, restricciones y formato de salida.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;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="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Eres un ingeniero backend senior. Responde en viñetas numeradas y con un máximo de cinco puntos.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;¿Cómo prevengo SQL injection en una app Node.js?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&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;Úsalos para instrucciones persistentes como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;idioma de respuesta;&lt;/li&gt;
&lt;li&gt;formato JSON;&lt;/li&gt;
&lt;li&gt;longitud máxima;&lt;/li&gt;
&lt;li&gt;rol técnico;&lt;/li&gt;
&lt;li&gt;estilo de explicación;&lt;/li&gt;
&lt;li&gt;restricciones de seguridad.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo para salida JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;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="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Devuelve únicamente JSON válido. No incluyas Markdown.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Extrae el nombre, email y empresa de este texto: Ana Pérez, ana@example.com, Acme Inc.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-haiku-4-5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&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;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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Paso 7: Compara modelos con el mismo prompt
&lt;/h2&gt;

&lt;p&gt;Antes de elegir un modelo para producción, ejecuta el mismo prompt contra varios modelos y mide latencia y calidad.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;models&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;claude-haiku-4-5&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;claude-sonnet-4-6&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;claude-opus-4-7&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Refactoriza este componente React para usar hooks: ...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for &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;model&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;model&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;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;elapsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;ms`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;---&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Evalúa cada salida con criterios concretos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿Compila?&lt;/li&gt;
&lt;li&gt;¿Respeta las instrucciones?&lt;/li&gt;
&lt;li&gt;¿Reduce complejidad?&lt;/li&gt;
&lt;li&gt;¿Evita cambios innecesarios?&lt;/li&gt;
&lt;li&gt;¿Responde suficientemente rápido para tu UX?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como regla práctica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;claude-haiku-4-5&lt;/code&gt;: clasificación, extracción, respuestas cortas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;claude-sonnet-4-6&lt;/code&gt;: tareas generales de desarrollo.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;claude-opus-4-7&lt;/code&gt;: problemas difíciles, razonamiento largo, revisiones complejas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para comparar el flujo de Puter con la API oficial de Anthropic en &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;, mantén ambos proveedores como entornos separados y reutiliza prompts equivalentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lo que obtienes y lo que no
&lt;/h2&gt;

&lt;p&gt;Claude vía Puter.js es útil para apps de navegador, pero no sustituye todos los casos de uso de la API oficial.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;acceso a modelos Claude desde el navegador;&lt;/li&gt;
&lt;li&gt;conversaciones multiturno;&lt;/li&gt;
&lt;li&gt;mensajes de sistema;&lt;/li&gt;
&lt;li&gt;streaming;&lt;/li&gt;
&lt;li&gt;integración sin clave de Anthropic en tu app;&lt;/li&gt;
&lt;li&gt;cero exposición directa a facturación para el desarrollador.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Puede que no obtengas, según la versión de Puter:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;uso avanzado de herramientas o function calling;&lt;/li&gt;
&lt;li&gt;entrada de visión con adjuntos de imagen;&lt;/li&gt;
&lt;li&gt;controles de caché de prompts de Anthropic;&lt;/li&gt;
&lt;li&gt;ejecución limpia desde backend;&lt;/li&gt;
&lt;li&gt;visibilidad directa de headers, cuotas o límites de Anthropic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para flujos avanzados de herramientas, la API oficial de Anthropic o &lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;las pruebas de servidor MCP en Apidog&lt;/a&gt; ofrecen más control.&lt;/p&gt;

&lt;p&gt;Para un chatbot, una app de preguntas y respuestas, un generador de contenido o un prototipo público, Puter.js suele ser suficiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuándo usar Puter.js
&lt;/h2&gt;

&lt;p&gt;Usa Puter.js cuando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;estás construyendo una app de navegador;&lt;/li&gt;
&lt;li&gt;no quieres gestionar claves de Anthropic;&lt;/li&gt;
&lt;li&gt;estás prototipando;&lt;/li&gt;
&lt;li&gt;estás creando un proyecto de hackathon;&lt;/li&gt;
&lt;li&gt;quieres publicar una demo estática;&lt;/li&gt;
&lt;li&gt;tus usuarios pueden iniciar sesión en Puter;&lt;/li&gt;
&lt;li&gt;no necesitas procesamiento backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplos adecuados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chatbot embebido en una página;&lt;/li&gt;
&lt;li&gt;asistente para documentación;&lt;/li&gt;
&lt;li&gt;generador de snippets;&lt;/li&gt;
&lt;li&gt;clasificador de texto en frontend;&lt;/li&gt;
&lt;li&gt;demo interactiva de IA;&lt;/li&gt;
&lt;li&gt;extensión de navegador con interacción del usuario.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cuándo usar la API oficial de Anthropic
&lt;/h2&gt;

&lt;p&gt;Usa la API oficial cuando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;necesitas llamadas desde servidor;&lt;/li&gt;
&lt;li&gt;ejecutas tareas programadas;&lt;/li&gt;
&lt;li&gt;haces procesamiento por lotes;&lt;/li&gt;
&lt;li&gt;necesitas caché de prompts;&lt;/li&gt;
&lt;li&gt;necesitas control completo de herramientas;&lt;/li&gt;
&lt;li&gt;necesitas adjuntar imágenes o archivos;&lt;/li&gt;
&lt;li&gt;tienes requisitos de cumplimiento;&lt;/li&gt;
&lt;li&gt;no quieres depender de login de Puter para tus usuarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bot de Discord;&lt;/li&gt;
&lt;li&gt;pipeline de análisis de documentos;&lt;/li&gt;
&lt;li&gt;endpoint SaaS multiusuario;&lt;/li&gt;
&lt;li&gt;worker de cola;&lt;/li&gt;
&lt;li&gt;agente con herramientas internas;&lt;/li&gt;
&lt;li&gt;sistema con auditoría y control de facturación.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La migración conceptual es directa porque el formato de mensajes es similar: &lt;code&gt;role&lt;/code&gt;, &lt;code&gt;content&lt;/code&gt; y lista de turnos.&lt;/p&gt;

&lt;p&gt;Para el equivalente de GPT, consulta &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Probando la integración en Apidog
&lt;/h2&gt;

&lt;p&gt;Las llamadas de Puter ocurren en el navegador, así que no se prueban igual que un endpoint backend tradicional.&lt;/p&gt;

&lt;p&gt;Un flujo práctico es:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crear una página estática que reciba el prompt por query string.&lt;/li&gt;
&lt;li&gt;Ejecutar Puter.js desde esa página.&lt;/li&gt;
&lt;li&gt;Usar Apidog para diseñar y validar la futura integración con Anthropic.&lt;/li&gt;
&lt;li&gt;Mantener dos entornos separados: prototipo con Puter y producción con Anthropic.&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%2F12lw6kx5lwlbpc2qapvu.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%2F12lw6kx5lwlbpc2qapvu.png" alt="Captura de Apidog" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Configura dos entornos en &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;puter-prototype&lt;/code&gt;: apunta a tu página local o demo estática.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;anthropic-prod&lt;/code&gt;: apunta a &lt;code&gt;https://api.anthropic.com/v1&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Así puedes mantener el diseño de solicitudes, prompts y pruebas en una misma colección mientras decides cuándo migrar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;¿Esto es realmente ilimitado?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para el desarrollador, sí: no tienes una cuota de Anthropic asociada a tu proyecto. El uso depende del saldo de cada usuario en Puter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Necesito registrarme en Anthropic?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No para el flujo con Puter.js. Puter gestiona la relación con Anthropic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo usar esto en producción?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sí, si tu aplicación es de navegador y tus usuarios aceptan iniciar sesión en Puter. Si necesitas backend, usa la API oficial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Claude vía Puter responde igual que la API oficial?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El modelo subyacente es Claude. Puede haber diferencias operativas como latencia o superficie de API disponible, pero el modelo no cambia por el hecho de llamarlo desde Puter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo usar caché de prompts?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Puter no expone necesariamente los controles de caché de prompts de Anthropic. Si dependes de esa optimización, usa la API oficial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo usarlo en un bot de Discord?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No es el caso ideal. Puter.js está orientado a navegador y sesión de usuario. Para bots y servicios backend, usa Anthropic directamente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué modelo debería usar por defecto?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;claude-sonnet-4-6&lt;/code&gt;. Cambia a &lt;code&gt;claude-opus-4-7&lt;/code&gt; para tareas difíciles y a &lt;code&gt;claude-haiku-4-5&lt;/code&gt; para tareas rápidas o de alto volumen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumen
&lt;/h2&gt;

&lt;p&gt;Puter.js es una forma rápida de añadir Claude a una aplicación de navegador sin gestionar claves de Anthropic ni asumir facturación directa como desarrollador.&lt;/p&gt;

&lt;p&gt;El flujo mínimo es:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tu prompt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&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;Úsalo para prototipos, demos, sitios estáticos, hackathons y apps públicas donde el usuario pueda iniciar sesión en Puter.&lt;/p&gt;

&lt;p&gt;Para backend, caché de prompts, herramientas avanzadas o requisitos de cumplimiento, usa la API oficial de Anthropic.&lt;/p&gt;

&lt;p&gt;Crea la solicitud una vez en &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;, compara el flujo con Puter y la API oficial, y elige el camino que mejor encaje con tu arquitectura.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo Usar Grok 4.3 Gratis: 4 Métodos Funcionando en 2026</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Sat, 09 May 2026 02:26:10 +0000</pubDate>
      <link>https://forem.com/roobia/como-usar-grok-43-gratis-4-metodos-funcionando-en-2026-2595</link>
      <guid>https://forem.com/roobia/como-usar-grok-43-gratis-4-metodos-funcionando-en-2026-2595</guid>
      <description>&lt;p&gt;Grok 4.3 es el modelo insignia de xAI a mayo de 2026, con una ventana de contexto de 1M de tokens, entrada de video nativa y un precio de $1.25 / $2.50 por millón de tokens. Si estás prototipando, aprendiendo o construyendo un proyecto paralelo, puedes acceder a Grok 4.3 sin pagar a través de tres rutas creíbles: créditos promocionales de xAI Console, Puter.js —donde el usuario final cubre el uso— y las interfaces gratuitas de chat en grok.com y X.&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;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Esta guía explica cómo usar cada ruta, qué configurar, qué código ejecutar y cuándo conviene pasar a pago. Para la guía completa de la API de pago, consulta &lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de Grok 4.3&lt;/a&gt;. Para el equivalente de voz, consulta &lt;a href="http://apidog.com/blog/how-to-use-grok-voice-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar Grok Voice gratis&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  En resumen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tres caminos gratuitos a Grok 4.3:&lt;/strong&gt; xAI Console con créditos promocionales, Puter.js con pago por el usuario final, y las interfaces de chat en &lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt; y X.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mejor para desarrolladores:&lt;/strong&gt; Puter.js, porque puedes desplegar sin claves de facturación propias.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mejor para prototipos personales:&lt;/strong&gt; xAI Console con una cuenta nueva y créditos promocionales.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mejor para no desarrolladores:&lt;/strong&gt; &lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt; o la aplicación X.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ID del modelo en Puter:&lt;/strong&gt; &lt;code&gt;x-ai/grok-4.3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ID del modelo en xAI:&lt;/strong&gt; &lt;code&gt;grok-4.3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Usa &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 preparar la misma solicitud contra varios proveedores y comparar resultados.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ruta 1: Créditos promocionales de xAI Console
&lt;/h2&gt;

&lt;p&gt;Usa esta ruta si quieres probar la API real de producción de xAI sin pagar durante la fase inicial.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 1: Crea una cuenta
&lt;/h3&gt;

&lt;p&gt;Ve a &lt;code&gt;console.x.ai&lt;/code&gt; y crea una cuenta. El inicio de sesión se realiza con tu cuenta X.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 2: Revisa los créditos disponibles
&lt;/h3&gt;

&lt;p&gt;xAI ejecuta ventanas promocionales que otorgan créditos gratuitos a cuentas nuevas. La cantidad y la elegibilidad cambian con el tiempo, así que revisa la sección &lt;strong&gt;Billing / Facturación&lt;/strong&gt; después de registrarte.&lt;/p&gt;

&lt;p&gt;El patrón habitual es:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;recibes un pool de créditos inicial;&lt;/li&gt;
&lt;li&gt;el crédito no se renueva automáticamente;&lt;/li&gt;
&lt;li&gt;puedes usarlo para validar una integración completa;&lt;/li&gt;
&lt;li&gt;cuando se agota, debes pasar a pago o migrar a otra ruta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;xAI también ha ofrecido acceso promocional gratuito a modelos específicos en ventanas anteriores, como Grok 4.1 Fast y la API de Agent Tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 3: Llama a la API
&lt;/h3&gt;

&lt;p&gt;El endpoint es compatible con el formato de OpenAI:&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;"xai-..."&lt;/span&gt;

curl https://api.x.ai/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$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-4.3",
    "messages": [
      {
        "role": "user",
        "content": "Explain prompt caching in three sentences."
      }
    ],
    "reasoning_effort": "low"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Durante el prototipado, usa &lt;code&gt;reasoning_effort: "low"&lt;/code&gt; para consumir menos crédito. Los valores &lt;code&gt;medium&lt;/code&gt; y &lt;code&gt;high&lt;/code&gt; pueden agotar el crédito más rápido.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros y contras
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Contras&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Usas la superficie real de la API de producción&lt;/td&gt;
&lt;td&gt;El pool de créditos es finito&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Puedes probar contexto de 1M, video y llamada de funciones&lt;/td&gt;
&lt;td&gt;Los términos promocionales pueden cambiar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Migrar a pago no requiere cambiar el código principal&lt;/td&gt;
&lt;td&gt;Estás limitado al crédito disponible&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Recomendación:&lt;/strong&gt; empieza con xAI Console si necesitas saber cómo se comporta exactamente la API de producción. Para el esquema completo de solicitud, consulta &lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de Grok 4.3&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ruta 2: Puter.js: el usuario paga, el desarrollador no
&lt;/h2&gt;

&lt;p&gt;Puter.js es la ruta más práctica si quieres publicar una aplicación web sin asumir tú el coste de inferencia.&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%2F48utw9k2o2vpe8zkl3kx.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%2F48utw9k2o2vpe8zkl3kx.png" alt="Puter.js Grok 4.3" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Cómo funciona
&lt;/h3&gt;

&lt;p&gt;Puter.js expone un cliente JavaScript para llamar a varios LLMs, incluidos Grok, GPT, Claude, Gemini y DeepSeek.&lt;/p&gt;

&lt;p&gt;La diferencia está en la facturación:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;el usuario final paga desde su cuenta de Puter, no el desarrollador.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tú insertas el script, llamas al modelo y despliegas tu app. Cuando el usuario ejecuta una llamada, Puter gestiona su inicio de sesión y el consumo asociado a su cuenta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 1: Añade el script
&lt;/h3&gt;

&lt;p&gt;Incluye Puter.js en tu HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No necesitas clave API ni configurar facturación propia.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 2: Llama a Grok 4.3 desde el navegador
&lt;/h3&gt;

&lt;p&gt;Usa &lt;code&gt;puter.ai.chat()&lt;/code&gt; con el modelo &lt;code&gt;x-ai/grok-4.3&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Summarize the trade-offs between SQLite and Postgres in three bullets.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-ai/grok-4.3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;document&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;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;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="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La primera vez que el usuario ejecute la llamada, Puter le pedirá iniciar sesión o crear una cuenta. Después, las llamadas se cargan a su saldo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 3: Usa streaming
&lt;/h3&gt;

&lt;p&gt;Puter sigue un patrón similar al de OpenAI, por lo que puedes trabajar con streaming:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Walk me through migrating a React app to Next.js.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-ai/grok-4.3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;reasoning_effort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;medium&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &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;chunk&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdout&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="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;||&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pros y contras
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Contras&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;El desarrollador paga $0&lt;/td&gt;
&lt;td&gt;El usuario debe iniciar sesión en Puter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No hay claves API en el repositorio&lt;/td&gt;
&lt;td&gt;No es ideal para sistemas solo backend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;El mismo cliente permite acceder a varios LLMs&lt;/td&gt;
&lt;td&gt;Puede añadir algo de latencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encaja bien en apps web públicas&lt;/td&gt;
&lt;td&gt;Requiere contexto de navegador&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Recomendación:&lt;/strong&gt; usa Puter.js para herramientas web públicas, proyectos personales, demos gratuitas o apps donde el usuario final sea quien realiza las consultas.&lt;/p&gt;

&lt;p&gt;No es la mejor opción para automatizaciones internas, jobs backend o bots donde el usuario no está presente en el navegador.&lt;/p&gt;

&lt;p&gt;Para patrones similares con otros modelos, consulta &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de DeepSeek V4 gratis&lt;/a&gt; y &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de GPT-5.5 gratis&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ruta 3: grok.com y la aplicación X
&lt;/h2&gt;

&lt;p&gt;Si solo quieres hablar con Grok 4.3 y no necesitas integrarlo en código, usa las interfaces de chat.&lt;/p&gt;

&lt;p&gt;Opciones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt;:&lt;/strong&gt; chat web con inicio de sesión mediante X.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aplicación X:&lt;/strong&gt; Grok está disponible en las aplicaciones web y móviles de X bajo la pestaña Grok.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estas interfaces son útiles para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;validar prompts antes de llevarlos a la API;&lt;/li&gt;
&lt;li&gt;hacer preguntas puntuales;&lt;/li&gt;
&lt;li&gt;evaluar si el modelo encaja con tu caso de uso;&lt;/li&gt;
&lt;li&gt;comparar respuestas manualmente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Limitación principal: &lt;strong&gt;no puedes automatizar llamadas desde estas interfaces&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;El nivel gratuito en &lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt; usa por defecto una variante más pequeña de Grok, como Grok 4.1. Las suscripciones Premium en X desbloquean Grok 4.3 en la interfaz de chat con cuotas más altas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ruta 4: OpenRouter: barato, pero no gratis para Grok 4.3
&lt;/h2&gt;

&lt;p&gt;OpenRouter agrega múltiples proveedores detrás de una sola clave API y una superficie común.&lt;/p&gt;

&lt;p&gt;Grok 4.3 en OpenRouter cuesta lo mismo que xAI directo: &lt;strong&gt;$1.25 / $2.50 por 1M de tokens&lt;/strong&gt;. Por eso no es una ruta gratuita para Grok 4.3.&lt;/p&gt;

&lt;p&gt;Sin embargo, OpenRouter sí ofrece variantes gratuitas de algunos modelos de Grok, como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;grok-4-fast:free
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Úsalo si necesitas una salida de clase Grok sin pagar, pero no necesitas específicamente Grok 4.3.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://openrouter.ai/api/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$OPENROUTER_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": "x-ai/grok-4-fast:free",
    "messages": [
      {
        "role": "user",
        "content": "Hello!"
      }
    ]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Comparación rápida
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ruta&lt;/th&gt;
&lt;th&gt;Costo para el desarrollador&lt;/th&gt;
&lt;th&gt;Costo para el usuario final&lt;/th&gt;
&lt;th&gt;Ideal para&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;xAI Console con créditos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0 dentro del crédito&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;Prototipos y aprendizaje de la API real&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Puter.js&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Pocos céntimos por sesión&lt;/td&gt;
&lt;td&gt;Apps web públicas y herramientas gratuitas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt; / X&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;$0 con cuota&lt;/td&gt;
&lt;td&gt;Uso manual y preguntas puntuales&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenRouter con modelo gratuito&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;Salida tipo Grok, pero no Grok 4.3 específico&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Cómo probar proveedores con Apidog
&lt;/h2&gt;

&lt;p&gt;Cuando trabajas con varios proveedores, evita cambiar código a ciegas. Configura solicitudes equivalentes y compara respuestas, tokens y latencia.&lt;/p&gt;

&lt;p&gt;Flujo recomendado:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crea un entorno en Apidog.&lt;/li&gt;
&lt;li&gt;Define variables como:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;XAI_API_KEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OPENROUTER_API_KEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BASE_URL&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Crea una solicitud para xAI directo.&lt;/li&gt;
&lt;li&gt;Duplica la solicitud para OpenRouter.&lt;/li&gt;
&lt;li&gt;Cambia solo:

&lt;ul&gt;
&lt;li&gt;la URL base;&lt;/li&gt;
&lt;li&gt;el header de autorización;&lt;/li&gt;
&lt;li&gt;el valor de &lt;code&gt;model&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ejecuta ambas con el mismo prompt.&lt;/li&gt;
&lt;li&gt;Compara respuesta, latencia y consumo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ejemplo de cuerpo reutilizable:&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-4.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&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;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Explain prompt caching in three sentences."&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;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low"&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 xAI:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



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

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Puedes descargar Apidog&lt;/a&gt; y crear una colección con ambas variantes. Para más información sobre pruebas entre proveedores, consulta &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Herramienta de prueba de API para ingenieros de QA&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lo que pierdes al usar rutas gratuitas
&lt;/h2&gt;

&lt;p&gt;Las rutas gratuitas son suficientes para prototipos, pero tienen límites claros.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Límites de tasa más estrictos
&lt;/h3&gt;

&lt;p&gt;Los créditos promocionales no eliminan los límites por minuto. Si pruebas con muchas llamadas concurrentes, puedes recibir errores &lt;code&gt;429&lt;/code&gt; antes de agotar el crédito.&lt;/p&gt;

&lt;p&gt;Implementa backoff:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;requestWithRetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;retries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&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;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&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="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;retries&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&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;h3&gt;
  
  
  2. El ahorro por prompt caching pesa menos
&lt;/h3&gt;

&lt;p&gt;El almacenamiento en caché de prompts es útil en producción, especialmente con prompts de sistema grandes y repetidos. Pero si solo haces decenas de llamadas durante un prototipo, el ahorro será limitado.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. El soporte es limitado
&lt;/h3&gt;

&lt;p&gt;Las cuentas gratuitas suelen depender de soporte comunitario o best effort. Si estás depurando producción, necesitas un plan de pago.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuándo pasar a pago
&lt;/h2&gt;

&lt;p&gt;Considera pasar a una ruta de pago cuando ocurra cualquiera de estas señales:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Alcanzas límites de tasa de forma frecuente.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Si ves &lt;code&gt;429&lt;/code&gt; varias veces por semana, los créditos gratuitos ya no son suficientes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tienes prompts de sistema grandes y estables.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Si reutilizas prompts de más de 50k tokens, el prompt caching puede tener impacto real.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Necesitas requisitos de cumplimiento.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Auditorías, BAAs, residencia regional de datos o soporte empresarial no suelen estar incluidos en niveles gratuitos.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La migración suele ser simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;en xAI Console, cambias a una clave con facturación;&lt;/li&gt;
&lt;li&gt;en OpenRouter, cambias proveedor o modelo;&lt;/li&gt;
&lt;li&gt;en tu código, el esquema de Chat Completions puede mantenerse igual.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Grok 4.3 es realmente gratis o es una prueba?
&lt;/h3&gt;

&lt;p&gt;Depende de la ruta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En xAI Console, es una prueba financiada por créditos promocionales.&lt;/li&gt;
&lt;li&gt;En Puter.js, es gratis para el desarrollador porque paga el usuario final.&lt;/li&gt;
&lt;li&gt;En &lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt;, es una cuota diaria de mensajes en la interfaz de chat.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ¿Puedo usar Grok 4.3 desde backend sin pagar?
&lt;/h3&gt;

&lt;p&gt;Sí, mientras duren los créditos de xAI Console.&lt;/p&gt;

&lt;p&gt;Después de eso, debes pagar o mover el flujo a una ruta donde el usuario cubra el uso, como Puter.js en navegador.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puter.js funciona en Node.js?
&lt;/h3&gt;

&lt;p&gt;Puter.js está pensado principalmente para navegador. El modelo de pago por usuario depende del inicio de sesión del usuario final, por lo que encaja mejor en aplicaciones frontend.&lt;/p&gt;

&lt;p&gt;Para backend, la ruta gratuita más directa es xAI Console con créditos.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué ID de modelo uso en Puter?
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x-ai/grok-4.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ¿Qué ID de modelo uso directamente en xAI?
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;grok-4.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ¿Los créditos gratuitos cubren llamada de funciones y entrada de video?
&lt;/h3&gt;

&lt;p&gt;Sí. Los créditos se aplican al uso del modelo, incluidas capacidades como contexto largo, llamada de funciones, entrada de video y esfuerzo de razonamiento.&lt;/p&gt;

&lt;p&gt;Ten en cuenta que el video puede consumir contexto rápidamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo se compara esto con Grok Voice?
&lt;/h3&gt;

&lt;p&gt;Grok Voice tiene una estructura diferente y puede tener condiciones gratuitas propias. Para esa guía, consulta &lt;a href="http://apidog.com/blog/how-to-use-grok-voice-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar Grok Voice gratis&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Existe un Grok 4.3 mini gratuito?
&lt;/h3&gt;

&lt;p&gt;No hay un SKU mini separado para Grok 4.3. La alternativa gratuita más cercana mencionada es &lt;code&gt;grok-4-fast:free&lt;/code&gt; en OpenRouter, pero no es Grok 4.3.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Hay tres rutas prácticas para usar Grok 4.3 sin pagar durante la fase inicial:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;usa &lt;strong&gt;xAI Console&lt;/strong&gt; si quieres probar la API real de producción;&lt;/li&gt;
&lt;li&gt;usa &lt;strong&gt;Puter.js&lt;/strong&gt; si estás creando una app web pública y quieres que el usuario cubra su uso;&lt;/li&gt;
&lt;li&gt;usa &lt;strong&gt;&lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt;&lt;/strong&gt; o X si solo necesitas interacción manual sin código.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si ninguna encaja, Grok 4.3 sigue siendo relativamente económico a $1.25 / $2.50 por 1M de tokens. Para una implementación completa con la API de pago, consulta &lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de Grok 4.3&lt;/a&gt;. Para una comparación con OpenAI en voz, consulta &lt;a href="http://apidog.com/blog/grok-voice-vs-gpt-realtime-best-voice-model?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok Voice vs GPT-Realtime&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Crea la solicitud una vez en Apidog, cambia la URL base por proveedor y elige la ruta que mejor se adapte a tu carga de trabajo.&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%2Ft1j3kymdmi5tzgtqoo07.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%2Ft1j3kymdmi5tzgtqoo07.png" alt="Apidog API testing" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo Usar la API Grok 4.3: Guía y Tutorial</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 08 May 2026 07:42:41 +0000</pubDate>
      <link>https://forem.com/roobia/como-usar-la-api-grok-43-guia-y-tutorial-47dn</link>
      <guid>https://forem.com/roobia/como-usar-la-api-grok-43-guia-y-tutorial-47dn</guid>
      <description>&lt;p&gt;xAI lanzó Grok 4.3 en etapas: beta el 17 de abril de 2026, acceso a la API el 30 de abril y disponibilidad general completa el 6 de mayo. La propuesta para desarrolladores es clara: ventana de contexto de 1,000,000 de tokens, entrada de video nativa, razonamiento siempre activo y una reducción de precio de aproximadamente el 40% frente a Grok 4.20. Ocho modelos Grok heredados se retiran el 15 de mayo, así que si usa &lt;code&gt;grok-3&lt;/code&gt; o &lt;code&gt;grok-4&lt;/code&gt;, planifique la migración ahora.&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;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Esta guía muestra cómo llamar a Grok 4.3 desde código: endpoint, autenticación, URL base compatible con OpenAI, &lt;code&gt;reasoning_effort&lt;/code&gt;, entrada de video, llamada a funciones y una configuración reproducible en &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;Para el aspecto de voz de la misma versión, consulte &lt;a href="http://apidog.com/blog/how-to-use-grok-voice-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar Grok Voice gratis&lt;/a&gt;. Para la comparación directa con el modelo de voz insignia de OpenAI, consulte &lt;a href="http://apidog.com/blog/grok-voice-vs-gpt-realtime-best-voice-model?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok Voice vs GPT-Realtime&lt;/a&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Grok 4.3 tuvo disponibilidad general el &lt;strong&gt;6 de mayo de 2026&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ocho modelos heredados se retiran el &lt;strong&gt;15 de mayo de 2026&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Precios:

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$1.25 por 1M de tokens de entrada&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$2.50 por 1M de tokens de salida&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$0.20 por 1M de tokens de entrada en caché&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Ventana de contexto: &lt;strong&gt;1M de tokens&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;Soporta &lt;strong&gt;entrada de video nativa&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;El razonamiento está siempre activo.&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;reasoning_effort&lt;/code&gt;: &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;. Valor por defecto: &lt;code&gt;medium&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;Endpoint: &lt;code&gt;&lt;a href="https://api.x.ai/v1/chat/completions" rel="noopener noreferrer"&gt;https://api.x.ai/v1/chat/completions&lt;/a&gt;&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;URL base compatible con OpenAI: &lt;code&gt;&lt;a href="https://api.x.ai/v1" rel="noopener noreferrer"&gt;https://api.x.ai/v1&lt;/a&gt;&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;Rendimiento anunciado: ~159 tokens/segundo en niveles estándar.&lt;/li&gt;

&lt;li&gt;Índice de Inteligencia 53 según Análisis Artificial, puesto 10 de 146 modelos.&lt;/li&gt;

&lt;li&gt;Use &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para guardar variantes de solicitud, comparar latencia y reproducir pruebas con distintas configuraciones de razonamiento.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué cambió en Grok 4.3
&lt;/h2&gt;

&lt;p&gt;Las actualizaciones más relevantes para implementación son:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Precio más bajo&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entrada: baja un 37.5% frente a Grok 4.20.&lt;/li&gt;
&lt;li&gt;Salida: baja un 58.3%.&lt;/li&gt;
&lt;li&gt;Entrada en caché: &lt;code&gt;$0.20/1M&lt;/code&gt;, útil para prompts de sistema largos y estables.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contexto de 1M de tokens&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sube desde 256k en Grok 4.20.&lt;/li&gt;
&lt;li&gt;Permite enviar bases de código medianas, contratos extensos, transcripts largos o historiales completos de conversación.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Entrada de video nativa&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Primera vez en la línea Grok.&lt;/li&gt;
&lt;li&gt;Puede pasar una URL de video y pedir análisis sobre el contenido.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Razonamiento siempre activo&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cada solicitud incluye razonamiento base.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;reasoning_effort&lt;/code&gt; controla la profundidad, pero el modelo nunca baja de &lt;code&gt;low&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mejor comportamiento agéntico&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;+300 puntos Elo en GDPval-AA frente a Grok 4.20.&lt;/li&gt;
&lt;li&gt;Impacta especialmente en llamada a herramientas y flujos de varios pasos.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El Índice de Inteligencia de 53 según Análisis Artificial sitúa a Grok 4.3 por encima del promedio de 35 para su nivel de precio y en el décimo lugar de 146 modelos monitoreados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requisitos previos
&lt;/h2&gt;

&lt;p&gt;Antes de hacer la primera llamada, prepare lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Una cuenta en la consola de xAI: &lt;code&gt;console.x.ai&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Una clave API con facturación activa.&lt;/li&gt;
&lt;li&gt;El SDK de OpenAI o el SDK de xAI.&lt;/li&gt;
&lt;li&gt;Un cliente API para guardar y repetir solicitudes durante las pruebas.&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%2Fi98pls7kwujze1wffker.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%2Fi98pls7kwujze1wffker.png" alt="Captura de consola o configuración" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Exporte la clave API:&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;"xai-..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si usa Windows PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&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;"xai-..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Endpoint y autenticación
&lt;/h2&gt;

&lt;p&gt;Grok 4.3 usa la superficie de Chat Completions compatible con OpenAI.&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/chat/completions
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Encabezados requeridos:&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 $XAI_API_KEY
Content-Type: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La compatibilidad con OpenAI permite usar el SDK de OpenAI y cambiar solo la &lt;code&gt;base_url&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejemplo en 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;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;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/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-4.3&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;Resume las diferencias entre GraphQL y REST en tres puntos.&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;reasoning_effort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ejemplo en Node.js
&lt;/h3&gt;



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

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

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;grok-4.3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Resume las diferencias entre GraphQL y REST en tres puntos.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;reasoning_effort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;medium&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Parámetros de la solicitud
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parámetro&lt;/th&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Valores&lt;/th&gt;
&lt;th&gt;Notas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;&lt;code&gt;grok-4.3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Obligatorio.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;messages&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;array&lt;/td&gt;
&lt;td&gt;OpenAI message shape&lt;/td&gt;
&lt;td&gt;Obligatorio. Soporta &lt;code&gt;system&lt;/code&gt;, &lt;code&gt;user&lt;/code&gt; y &lt;code&gt;assistant&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reasoning_effort&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Opcional. Por defecto: &lt;code&gt;medium&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1–32768&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Limita la salida.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;temperature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.0–2.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Por defecto: &lt;code&gt;1.0&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;top_p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.0–1.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Muestreo de núcleo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stream&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;bool&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Activa streaming vía server-sent events.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;array&lt;/td&gt;
&lt;td&gt;OpenAI tool shape&lt;/td&gt;
&lt;td&gt;Para llamada a funciones.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tool_choice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string/object&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;auto&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt; o herramienta específica&lt;/td&gt;
&lt;td&gt;Semántica estándar de OpenAI.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;response_format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;object&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "type": "json_object" }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Salida estructurada.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;any&lt;/td&gt;
&lt;td&gt;Útil para reproducibilidad con &lt;code&gt;temperature: 0&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Primera solicitud con curl
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.x.ai/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$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-4.3",
    "messages": [
      {
        "role": "system",
        "content": "Eres un ingeniero backend senior."
      },
      {
        "role": "user",
        "content": "Revisa este plan de consulta y señala el cuello de botella."
      }
    ],
    "reasoning_effort": "high"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La respuesta mantiene la forma estándar de OpenAI:&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;"choices"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"assistant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"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;"prompt_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;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"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;456&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_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;78&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;657&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;
  
  
  Cómo elegir &lt;code&gt;reasoning_effort&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Use el parámetro según el tipo de carga:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;low&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Úselo para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clasificación.&lt;/li&gt;
&lt;li&gt;Extracción simple.&lt;/li&gt;
&lt;li&gt;Resúmenes cortos.&lt;/li&gt;
&lt;li&gt;Preguntas frecuentes.&lt;/li&gt;
&lt;li&gt;Reformateo de texto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo:&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-4.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&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;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Clasifica este ticket como billing, bug o feature request: ..."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low"&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;
  
  
  &lt;code&gt;medium&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Úselo para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Soporte al cliente.&lt;/li&gt;
&lt;li&gt;Llamada a funciones.&lt;/li&gt;
&lt;li&gt;Análisis de datos moderado.&lt;/li&gt;
&lt;li&gt;Flujos de una o dos herramientas.&lt;/li&gt;
&lt;li&gt;Tráfico general de producción.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es el valor por defecto.&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-4.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&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;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Analiza estos logs y sugiere la causa probable del error."&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;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&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;
  
  
  &lt;code&gt;high&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Úselo para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agentes de varios pasos.&lt;/li&gt;
&lt;li&gt;Revisión de código larga.&lt;/li&gt;
&lt;li&gt;Matemáticas complejas.&lt;/li&gt;
&lt;li&gt;Planificación.&lt;/li&gt;
&lt;li&gt;Decisiones donde el error es costoso.
&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="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-4.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&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;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Diseña un plan de migración de esta arquitectura monolítica a servicios separados."&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;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&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;El razonamiento siempre activo significa que no existe un modo “sin razonamiento”. Si necesita reducir latencia y tokens, use &lt;code&gt;low&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Llamada a funciones
&lt;/h2&gt;

&lt;p&gt;Grok 4.3 usa la forma estándar de herramientas compatible con OpenAI.&lt;/p&gt;

&lt;p&gt;Flujo básico:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Declare las herramientas en &lt;code&gt;tools&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Envíe la solicitud.&lt;/li&gt;
&lt;li&gt;Lea &lt;code&gt;tool_calls&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ejecute la función en su backend.&lt;/li&gt;
&lt;li&gt;Devuelva el resultado con un mensaje &lt;code&gt;role: "tool"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Pida al modelo la respuesta final.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Declarar una herramienta
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lookup_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;Busca un usuario por 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;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;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Solicitar una llamada a herramienta
&lt;/h3&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;grok-4.3&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;Busca el usuario u_42 y dime su último inicio de sesión.&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;reasoning_effort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&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;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;tool_calls&lt;/span&gt; &lt;span class="o"&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="nf"&gt;print&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ejecutar la herramienta y devolver el resultado
&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;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lookup_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_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="k"&gt;return&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="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;last_login&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-05-05T14:22:00Z&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;Busca el usuario u_42 y dime su último inicio de sesión.&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="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tool_calls&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;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="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lookup_user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;args&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;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="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;lookup_user&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="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="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_call_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;final_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="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;grok-4.3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reasoning_effort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;La mejora de 300 puntos Elo en GDPval-AA se nota especialmente en flujos de herramientas: mejor selección de funciones, menos llamadas redundantes y mejor recuperación ante errores. Si prueba flujos MCP, consulte &lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;las pruebas de servidor MCP en Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entrada de video
&lt;/h2&gt;

&lt;p&gt;Grok 4.3 es el primer modelo Grok con entrada de video nativa. Envíe una URL de video dentro de un bloque de contenido.&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;grok-4.3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Describe qué ocurre en este clip y señala anomalías.&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;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/clip.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="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;reasoning_effort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Notas prácticas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Los tokens de video cuentan como entrada.&lt;/li&gt;
&lt;li&gt;Los clips largos pueden consumir contexto rápidamente.&lt;/li&gt;
&lt;li&gt;Recorte o reduzca la muestra si el costo importa.&lt;/li&gt;
&lt;li&gt;No necesita extraer fotogramas clave manualmente; el modelo razona sobre el video de forma nativa.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Entrada de imágenes
&lt;/h2&gt;

&lt;p&gt;Grok 4.3 también soporta imágenes. Use un bloque de contenido con URL de imagen.&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;grok-4.3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Identifica posibles problemas de accesibilidad en esta interfaz.&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/screenshot.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Contexto de 1M de tokens
&lt;/h2&gt;

&lt;p&gt;La ventana de contexto de 1M permite patrones que antes requerían chunking agresivo.&lt;/p&gt;

&lt;p&gt;Casos comunes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Revisión de código amplia&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Envíe el diff, archivos modificados, salida del linter y notas de arquitectura.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;QA sobre documentos largos&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Inserte contratos, documentación técnica o transcripts completos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Memoria de agente&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Mantenga historiales largos de conversación para personalización.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Análisis de incidentes&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Combine logs, métricas, timeline y postmortems anteriores.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Ejemplo de prompt para revisión de código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Eres un revisor de código senior.

Contexto:
- Este cambio toca autenticación y facturación.
- Prioriza bugs de seguridad, condiciones de carrera y errores de compatibilidad.

Archivos:
&amp;lt;pegar diff completo aquí&amp;gt;

Salida del linter:
&amp;lt;pegar salida aquí&amp;gt;

Responde con:
1. Riesgos críticos
2. Riesgos medios
3. Sugerencias no bloqueantes
4. Pruebas que faltan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La entrada en caché a &lt;code&gt;$0.20/1M&lt;/code&gt; hace viable mantener prompts de sistema grandes. Por ejemplo, un prompt estable de 400k tokens cuesta &lt;code&gt;$0.08&lt;/code&gt; por llamada en caché frente a &lt;code&gt;$0.50&lt;/code&gt; si se procesa como entrada nueva.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migración desde modelos Grok heredados
&lt;/h2&gt;

&lt;p&gt;Ocho modelos Grok heredados se retiran el &lt;strong&gt;15 de mayo de 2026, 12:00 PM PT&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Si usa un modelo heredado, el cambio mínimo suele ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- model="grok-4"
&lt;/span&gt;&lt;span class="gi"&gt;+ model="grok-4.3"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O en JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;{
&lt;span class="gd"&gt;-  "model": "grok-4"
&lt;/span&gt;&lt;span class="gi"&gt;+  "model": "grok-4.3"
&lt;/span&gt;}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La mayoría de las llamadas siguen funcionando porque la forma de la solicitud no cambia.&lt;/p&gt;

&lt;h3&gt;
  
  
  Revise estos puntos antes de migrar
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Latencia&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grok 4.3 siempre razona.&lt;/li&gt;
&lt;li&gt;Si dependía de una ruta rápida sin razonamiento, pruebe &lt;code&gt;reasoning_effort: "low"&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Formato de salida&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grok 4.3 tiende a generar respuestas más estructuradas.&lt;/li&gt;
&lt;li&gt;Si usa regex para postprocesamiento, vuelva a probar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Costos&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El precio por token baja, pero el contexto más grande puede llevar a enviar más entrada.&lt;/li&gt;
&lt;li&gt;Mida &lt;code&gt;usage.prompt_tokens&lt;/code&gt;, &lt;code&gt;usage.completion_tokens&lt;/code&gt; y &lt;code&gt;usage.reasoning_tokens&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Herramientas&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si usa function calling, valide que las llamadas generadas siguen coincidiendo con su contrato interno.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para la comparación de precios completa de la línea OpenAI, consulte &lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Precios de GPT-5.5&lt;/a&gt;. Para modelos de razonamiento cara a cara, consulte &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pruebas en Apidog
&lt;/h2&gt;

&lt;p&gt;Una forma práctica de validar Grok 4.3 es crear una colección con variantes controladas.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Cree un entorno
&lt;/h3&gt;

&lt;p&gt;En &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, cree variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;XAI_API_KEY = xai-...
BASE_URL = https://api.x.ai/v1
MODEL = grok-4.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Cree la solicitud base
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST {{BASE_URL}}/chat/completions
Authorization: Bearer {{XAI_API_KEY}}
Content-Type: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Body:&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;"{{MODEL}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&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;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"system"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Eres un ingeniero backend senior."&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;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Analiza este error de producción y sugiere la causa raíz: {{incident_log}}"&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;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&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;
  
  
  3. Duplique la solicitud en tres variantes
&lt;/h3&gt;

&lt;p&gt;Cree tres copias con el mismo prompt:&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;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&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;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&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;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Latencia.&lt;/li&gt;
&lt;li&gt;Calidad de respuesta.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;usage.reasoning_tokens&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;usage.total_tokens&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Costo estimado.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Compare contra otro proveedor
&lt;/h3&gt;

&lt;p&gt;Puede crear otra variante cambiando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BASE_URL = https://api.openai.com/v1
MODEL = gpt-5.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Así mantiene la misma estructura de prueba y cambia solo proveedor/modelo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descargue Apidog&lt;/a&gt; para ejecutar la comparación. Para una estrategia más amplia de pruebas de API, consulte &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Herramienta de pruebas de API para ingenieros de QA&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%2Fgg8ipzrioxyp35igwy9z.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%2Fgg8ipzrioxyp35igwy9z.png" alt="Captura de Apidog" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Streaming
&lt;/h2&gt;

&lt;p&gt;Para respuestas largas, active &lt;code&gt;stream&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;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="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;grok-4.3&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;Genera un plan técnico para migrar este servicio a una arquitectura event-driven.&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;reasoning_effort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&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;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&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="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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use streaming cuando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La salida sea larga.&lt;/li&gt;
&lt;li&gt;La experiencia de usuario necesite respuesta progresiva.&lt;/li&gt;
&lt;li&gt;Quiera reducir tiempo percibido hasta el primer token.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Salida JSON estructurada
&lt;/h2&gt;

&lt;p&gt;Para integraciones backend, use &lt;code&gt;response_format&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="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;grok-4.3&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;Extrae prioridad, categoría y resumen de este ticket: ...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;response_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json_object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&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;Ejemplo de salida esperada:&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;"priority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"billing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"El usuario no puede completar el pago por un error de validación."&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;
  
  
  Límites de velocidad
&lt;/h2&gt;

&lt;p&gt;Los límites dependen del nivel configurado en la consola de xAI. Van desde unos pocos miles de solicitudes por minuto en niveles iniciales hasta cientos de miles en niveles empresariales.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Consulte los límites exactos en el panel de xAI.&lt;/li&gt;
&lt;li&gt;Los ~159 tokens/segundo son velocidad de salida por stream, no throughput agregado.&lt;/li&gt;
&lt;li&gt;Las solicitudes concurrentes escalan dentro del límite de su nivel.&lt;/li&gt;
&lt;li&gt;Si supera el límite, la API devuelve &lt;code&gt;429&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo de manejo básico con backoff:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;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;RateLimitError&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="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;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;grok-4.3&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;Resume este documento.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;RateLimitError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt;
        &lt;span class="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Checklist de producción
&lt;/h2&gt;

&lt;p&gt;Antes de mover tráfico real a Grok 4.3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Cambie &lt;code&gt;base_url&lt;/code&gt; a &lt;code&gt;https://api.x.ai/v1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;[ ] Cambie &lt;code&gt;model&lt;/code&gt; a &lt;code&gt;grok-4.3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;[ ] Defina &lt;code&gt;reasoning_effort&lt;/code&gt; explícitamente.&lt;/li&gt;
&lt;li&gt;[ ] Mida &lt;code&gt;usage.reasoning_tokens&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;[ ] Valide outputs si usa regex o parsers estrictos.&lt;/li&gt;
&lt;li&gt;[ ] Pruebe function calling con casos felices y errores.&lt;/li&gt;
&lt;li&gt;[ ] Active streaming para respuestas largas.&lt;/li&gt;
&lt;li&gt;[ ] Use caché cuando el prompt de sistema sea estable.&lt;/li&gt;
&lt;li&gt;[ ] Configure reintentos para &lt;code&gt;429&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;[ ] Migre antes del 15 de mayo si usa modelos heredados.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Grok 4.3 es compatible con OpenAI de principio a fin?
&lt;/h3&gt;

&lt;p&gt;Para Chat Completions, sí. Puede usar el SDK de OpenAI, cambiar &lt;code&gt;base_url&lt;/code&gt; y cambiar &lt;code&gt;model&lt;/code&gt;. Function calling, salida estructurada y streaming usan formas compatibles.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Soporta la API de Responses?
&lt;/h3&gt;

&lt;p&gt;La superficie de xAI es Chat Completions actualmente. La API de Responses es de OpenAI.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuál es el límite de contexto real?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;1,000,000&lt;/code&gt; de tokens. Aun con el precio reducido, las entradas largas cuestan dinero real. Use caché si su prompt es estable.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo afecta el razonamiento siempre activo a la latencia?
&lt;/h3&gt;

&lt;p&gt;La latencia hasta el primer token puede ser superior a modelos sin razonamiento. A cambio, Grok 4.3 transmite salida a ~159 tokens/segundo y mejora en cargas donde la precisión importa.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo usar Grok 4.3 con Grok Voice?
&lt;/h3&gt;

&lt;p&gt;Sí. El agente de voz &lt;code&gt;grok-voice-think-fast-1.0&lt;/code&gt; llama a Grok 4.3 internamente cuando razona. También puede llamar a Grok 4.3 directamente desde un loop de voz construido con TTS y STT.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué pasa con llamadas antiguas a Grok 3 o Grok 4 después del 15 de mayo?
&lt;/h3&gt;

&lt;p&gt;Fallarán con un &lt;code&gt;410&lt;/code&gt; por modelo retirado. Migre antes de la fecha límite.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Grok 4.3 soporta imágenes?
&lt;/h3&gt;

&lt;p&gt;Sí. Además de video, puede enviar imágenes usando un bloque &lt;code&gt;image_url&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Grok 4.3 combina menor precio, contexto de 1M, razonamiento siempre activo y video nativo. Para equipos que ya usan una interfaz compatible con OpenAI, la migración suele ser un cambio de &lt;code&gt;base_url&lt;/code&gt; y &lt;code&gt;model&lt;/code&gt;, no una reescritura completa.&lt;/p&gt;

&lt;p&gt;La ruta más rápida: cree tres variantes en &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; con &lt;code&gt;reasoning_effort&lt;/code&gt; en &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt; y &lt;code&gt;high&lt;/code&gt;, ejecute sus prompts reales, mida latencia y tokens, y migre antes del 15 de mayo.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Grok Voice vs GPT-Realtime: ¿Qué Modelo de Voz es Mejor en 2026?</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 08 May 2026 07:36:21 +0000</pubDate>
      <link>https://forem.com/roobia/grok-voice-vs-gpt-realtime-que-modelo-de-voz-es-mejor-en-2026-5dm8</link>
      <guid>https://forem.com/roobia/grok-voice-vs-gpt-realtime-que-modelo-de-voz-es-mejor-en-2026-5dm8</guid>
      <description>&lt;p&gt;xAI lanzó Grok Voice la misma semana que OpenAI presentó GPT-Realtime-2. Si estás eligiendo un modelo de voz para 2026, ahora tienes dos opciones creíbles: ambos son modelos voz-a-voz con razonamiento, funcionan por WebSocket, admiten herramientas y generan habla con inflexión humana. La decisión práctica se reduce a cinco variables: latencia, precio, catálogo de voces, profundidad de razonamiento y si necesitas SIP, entrada de imagen o clonación de voz.&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;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;En esta guía comparo ambos modelos desde el punto de vista de implementación: qué elegir, cuándo elegirlo y cómo probarlos lado a lado antes de comprometerte.&lt;/p&gt;

&lt;p&gt;Para guías independientes, consulta &lt;a href="http://apidog.com/blog/gpt-realtime-2-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar GPT-Realtime-2&lt;/a&gt; y &lt;a href="http://apidog.com/blog/how-to-use-grok-voice-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar Grok Voice gratis&lt;/a&gt;. Para pruebas de estrés con sesiones WebSocket, &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; gestiona conexiones WebSocket de forma nativa.&lt;/p&gt;

&lt;h2&gt;
  
  
  En resumen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Grok Voice (&lt;code&gt;grok-voice-think-fast-1.0&lt;/code&gt;)&lt;/strong&gt; gana en &lt;strong&gt;latencia&lt;/strong&gt;, &lt;strong&gt;acceso gratuito a la consola&lt;/strong&gt;, &lt;strong&gt;catálogo de voces&lt;/strong&gt; y &lt;strong&gt;clonación de voz&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-Realtime-2&lt;/strong&gt; gana en &lt;strong&gt;profundidad de razonamiento&lt;/strong&gt;, &lt;strong&gt;entrada de imagen&lt;/strong&gt;, &lt;strong&gt;SIP nativo&lt;/strong&gt;, &lt;strong&gt;MCP&lt;/strong&gt; y madurez para producción.&lt;/li&gt;
&lt;li&gt;Para uso de pago, GPT-Realtime-2 cuesta &lt;strong&gt;$32/$64 por 1M de tokens de audio&lt;/strong&gt;. Grok Voice no cobra audio por minuto en la consola; pagas el razonamiento de Grok 4.3 a &lt;strong&gt;$1.25/$2.50 por 1M de tokens&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Elige &lt;strong&gt;Grok Voice&lt;/strong&gt; para aplicaciones de consumo de alto volumen, baja latencia y clonación de voz.&lt;/li&gt;
&lt;li&gt;Elige &lt;strong&gt;GPT-Realtime-2&lt;/strong&gt; para razonamiento complejo, agentes multimodales y centros de llamadas con SIP.&lt;/li&gt;
&lt;li&gt;Puedes construir una comparación una vez con &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; y cambiar de modelo modificando la URL WebSocket.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Los dos modelos en una tabla
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capacidad&lt;/th&gt;
&lt;th&gt;Grok Voice (&lt;code&gt;grok-voice-think-fast-1.0&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;GPT-Realtime-2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tiempo hasta el primer audio&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;&amp;lt; 1 segundo&lt;/strong&gt;; xAI afirma ~5 veces más rápido que el competidor más cercano&lt;/td&gt;
&lt;td&gt;Sub-segundo con razonamiento &lt;code&gt;low&lt;/code&gt;; más lento en &lt;code&gt;high&lt;/code&gt; / &lt;code&gt;xhigh&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Niveles de razonamiento&lt;/td&gt;
&lt;td&gt;Bajo / medio / alto, con Grok 4.3 como base&lt;/td&gt;
&lt;td&gt;Mínimo / bajo / medio / alto / muy alto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inteligencia subyacente&lt;/td&gt;
&lt;td&gt;Grok 4.3, Índice de Inteligencia 53&lt;/td&gt;
&lt;td&gt;Clase GPT-5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ventana de contexto&lt;/td&gt;
&lt;td&gt;1.000.000 de tokens, vía Grok 4.3&lt;/td&gt;
&lt;td&gt;128.000 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voces preestablecidas&lt;/td&gt;
&lt;td&gt;80+; 5 personajes de agente: Eve, Ara, Rex, Sal, Leo&lt;/td&gt;
&lt;td&gt;10; Cedar, Marin y 8 voces reajustadas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Idiomas TTS&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;No contados oficialmente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Idiomas STT&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;Heredados de GPT-Realtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clonación de voz&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Sí&lt;/strong&gt;; muestra de 1 minuto, entrenamiento de &amp;lt;2 minutos&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entrada de imagen&lt;/td&gt;
&lt;td&gt;No; texto + audio&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Sí&lt;/strong&gt;; foto o captura de pantalla&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Servidores MCP remotos&lt;/td&gt;
&lt;td&gt;Herramientas sí; MCP nativo no anunciado&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Sí&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SIP nativo / llamadas telefónicas&lt;/td&gt;
&lt;td&gt;Requiere proveedor SIP propio&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Sí&lt;/strong&gt;, endpoint &lt;code&gt;?call_id={call_id}&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Formatos de audio&lt;/td&gt;
&lt;td&gt;PCM16, MP3, μ-law&lt;/td&gt;
&lt;td&gt;PCM16, G.711 μ-law, A-law&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo de precios&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Gratis en consola&lt;/strong&gt; para voz; pagas razonamiento de Grok 4.3&lt;/td&gt;
&lt;td&gt;$32/1M audio input, $64/1M audio output, $4/$24 por 1M de texto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cumplimiento&lt;/td&gt;
&lt;td&gt;SOC 2 Tipo II, elegible para HIPAA con BAA, GDPR&lt;/td&gt;
&lt;td&gt;SOC 2, GDPR según OpenAI Enterprise&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Latencia: Grok gana por un margen claro
&lt;/h2&gt;

&lt;p&gt;La afirmación de xAI de que &lt;code&gt;grok-voice-think-fast-1.0&lt;/code&gt; es "casi 5 veces más rápido que el competidor más cercano" viene de sus propios benchmarks, así que conviene tratar el multiplicador con cautela.&lt;/p&gt;

&lt;p&gt;Aun así, la dirección es clara: Grok suele entregar el primer audio por debajo de un segundo. GPT-Realtime-2 suele moverse entre 800 ms y 1500 ms, según el nivel de razonamiento.&lt;/p&gt;

&lt;p&gt;En una aplicación de voz, esta diferencia se nota. Entre 600 ms y 1200 ms hay una diferencia perceptible: el agente puede sentirse natural o puede sentirse como un bot esperando turno.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regla práctica:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si el usuario final está hablando desde un móvil y la experiencia debe sentirse instantánea, empieza con Grok Voice.&lt;/li&gt;
&lt;li&gt;Si el agente necesita razonar más antes de responder, acepta más latencia y prueba GPT-Realtime-2.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Precios: no comparan igual
&lt;/h2&gt;

&lt;p&gt;Aquí no basta con mirar una sola tabla de precios porque los modelos cobran de forma distinta.&lt;/p&gt;

&lt;h3&gt;
  
  
  GPT-Realtime-2
&lt;/h3&gt;

&lt;p&gt;GPT-Realtime-2 mide la voz como tokens de audio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audio de entrada: &lt;strong&gt;$32 por 1M de tokens&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Audio de salida: &lt;strong&gt;$64 por 1M de tokens&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Texto: &lt;strong&gt;$4/$24 por 1M de tokens&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un segundo de audio equivale aproximadamente a 50 tokens. Una conversación de 5 minutos con turnos equilibrados puede consumir unos 30.000 tokens de audio, lo que da un coste aproximado de &lt;strong&gt;$1.50&lt;/strong&gt; en entrada/salida de audio. La entrada en caché reduce el coste de prompts del sistema estables.&lt;/p&gt;

&lt;h3&gt;
  
  
  Grok Voice
&lt;/h3&gt;

&lt;p&gt;Grok Voice no cobra por minuto ni por token de voz en la Consola xAI para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TTS&lt;/li&gt;
&lt;li&gt;STT&lt;/li&gt;
&lt;li&gt;Agente de voz&lt;/li&gt;
&lt;li&gt;Voces personalizadas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pagas solo el razonamiento de Grok 4.3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entrada: &lt;strong&gt;$1.25 por 1M de tokens&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Salida: &lt;strong&gt;$2.50 por 1M de tokens&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para una llamada equivalente de 5 minutos, los tokens de razonamiento suelen ser mucho menos que los tokens de audio, por lo que el coste puede quedar por debajo de &lt;strong&gt;$0.10&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recomendación:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para más de 10.000 minutos/día, Grok Voice suele tener mejor economía unitaria.&lt;/li&gt;
&lt;li&gt;Para bajo volumen y alto valor por llamada, deja que decida la calidad de razonamiento, no el precio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Más detalles: &lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de Grok 4.3&lt;/a&gt; y &lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Precios de GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Profundidad de razonamiento: OpenAI gana
&lt;/h2&gt;

&lt;p&gt;GPT-Realtime-2 es el primer modelo voz-a-voz que OpenAI describe como clase GPT-5. En Big Bench Audio obtuvo 96.6%, frente al 81.4% del modelo anterior. En Audio MultiChallenge obtuvo 48.5%, frente al 34.7%.&lt;/p&gt;

&lt;p&gt;Además, ofrece cinco niveles de razonamiento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minimal
low
medium
high
xhigh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto permite controlar el intercambio entre latencia y calidad por solicitud.&lt;/p&gt;

&lt;p&gt;Grok Voice funciona sobre Grok 4.3. Grok 4.3 alcanzó Índice de Inteligencia 53 en Artificial Analysis, ocupando el puesto 10 de 146 modelos a nivel mundial. Es fuerte, especialmente en tareas de agente, pero los benchmarks publicados todavía favorecen a GPT-Realtime-2 en razonamiento voz-a-voz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementación recomendada:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usa GPT-Realtime-2 para flujos con desambiguación, múltiples herramientas o contexto largo.&lt;/li&gt;
&lt;li&gt;Usa Grok Voice para soporte directo, respuestas rápidas, flujos guiados y ventas con guion.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Catálogo de voces: Grok gana en cantidad, OpenAI en consistencia
&lt;/h2&gt;

&lt;p&gt;Grok ofrece más de 80 voces preestablecidas en 28 idiomas. El agente de voz usa cinco personajes curados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Eve
Ara
Rex
Sal
Leo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Además, Grok ofrece clonación de voz mediante voces personalizadas.&lt;/p&gt;

&lt;p&gt;GPT-Realtime-2 ofrece 10 voces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cedar
Marin
alloy
ash
ballad
coral
echo
sage
shimmer
verse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La biblioteca es más pequeña, pero la consistencia entre voces es alta. Todas usan la misma pila de audio y el control de entonación se comporta de forma más predecible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recomendación:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si necesitas una voz concreta, un acento regional o una voz de marca, prueba Grok.&lt;/li&gt;
&lt;li&gt;Si necesitas una voz de alta calidad y comportamiento uniforme, GPT-Realtime-2 es suficiente.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Clonación de voz: solo Grok la ofrece
&lt;/h2&gt;

&lt;p&gt;Las voces personalizadas de xAI permiten crear un &lt;code&gt;voice_id&lt;/code&gt; a partir de aproximadamente un minuto de habla limpia. El entrenamiento tarda menos de dos minutos y el mismo &lt;code&gt;voice_id&lt;/code&gt; funciona en TTS y en el agente de voz.&lt;/p&gt;

&lt;p&gt;OpenAI no expone clonación de voz en la API Realtime.&lt;/p&gt;

&lt;p&gt;Si tu caso de uso necesita clonación de voz, la decisión es directa: &lt;strong&gt;Grok Voice&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entrada de imagen: solo OpenAI la ofrece
&lt;/h2&gt;

&lt;p&gt;GPT-Realtime-2 acepta texto, audio e imágenes. Puedes enviar una captura de pantalla o una foto dentro de un turno de usuario y hacer que el agente responda en voz.&lt;/p&gt;

&lt;p&gt;Casos donde esto importa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Soporte técnico en campo&lt;/li&gt;
&lt;li&gt;QA por voz&lt;/li&gt;
&lt;li&gt;Accesibilidad&lt;/li&gt;
&lt;li&gt;Agentes que guían al usuario viendo la misma pantalla&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grok Voice no puede igualar esto hoy porque trabaja con texto y audio.&lt;/p&gt;

&lt;p&gt;Para más contexto sobre visión en OpenAI, consulta &lt;a href="http://apidog.com/blog/how-to-use-gpt-image-2-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de GPT-Image-2&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  SIP y telefonía: OpenAI lo trae nativo, Grok necesita puente
&lt;/h2&gt;

&lt;p&gt;La API Realtime de OpenAI tiene soporte SIP nativo. Puedes dirigir un troncal SIP a la puerta de enlace de OpenAI y abrir una sesión WebSocket con:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wss://api.openai.com/v1/realtime?call_id={call_id}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto elimina la necesidad de mantener tu propia capa de puente.&lt;/p&gt;

&lt;p&gt;Grok Voice admite salida μ-law para telefonía, pero necesitas traer tu proveedor SIP, por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Twilio
Telnyx
Plivo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después debes ejecutar el puente entre telefonía y WebSocket por tu cuenta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recomendación:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para un agente de centro de llamadas con integración rápida, GPT-Realtime-2 es más directo.&lt;/li&gt;
&lt;li&gt;Para un producto con infraestructura SIP propia, Grok sigue siendo viable, pero requiere más ingeniería.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  MCP y uso de herramientas
&lt;/h2&gt;

&lt;p&gt;Ambos modelos admiten invocación de funciones, pero no con el mismo nivel de integración.&lt;/p&gt;

&lt;h3&gt;
  
  
  GPT-Realtime-2
&lt;/h3&gt;

&lt;p&gt;GPT-Realtime-2 admite servidores MCP remotos de forma nativa. Configuras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL del servidor MCP&lt;/li&gt;
&lt;li&gt;Lista de herramientas permitidas&lt;/li&gt;
&lt;li&gt;Política de ejecución&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La API Realtime puede ejecutar las herramientas sin que tu servidor esté en el bucle crítico de cada llamada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Grok Voice
&lt;/h3&gt;

&lt;p&gt;Grok Voice admite invocación de funciones y ofrece una herramienta &lt;code&gt;web_search&lt;/code&gt; incorporada. MCP nativo todavía no está anunciado como primitiva de primera clase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regla práctica:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si tu agente usa más de 50 herramientas, GPT-Realtime-2 con MCP es más cómodo.&lt;/li&gt;
&lt;li&gt;Si tu agente usa 5 herramientas o menos, la invocación de funciones simple es suficiente en cualquiera de los dos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para probar servidores MCP por separado, consulta &lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Pruebas de servidor MCP en Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decisión rápida por caso de uso
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aplicación de voz para consumidores, alto volumen y latencia crítica:&lt;/strong&gt; Grok Voice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clonación de voz, voz de marca o voces de personajes:&lt;/strong&gt; Grok Voice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TTS multilingüe a escala con más de 10 idiomas:&lt;/strong&gt; Grok Voice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agente que necesita interpretar capturas de pantalla:&lt;/strong&gt; GPT-Realtime-2.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Centro de llamadas con SIP:&lt;/strong&gt; GPT-Realtime-2.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agente con razonamiento de múltiples pasos y más de 50 herramientas:&lt;/strong&gt; GPT-Realtime-2.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conversaciones con más de 50k tokens de historial:&lt;/strong&gt; GPT-Realtime-2 si priorizas Realtime; Grok 4.3 tiene contexto mayor si puedes asumir el coste del flujo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agente de voz de producción más barato:&lt;/strong&gt; Grok Voice en consola.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Razonamiento intensivo con benchmarks más fuertes:&lt;/strong&gt; GPT-Realtime-2 con &lt;code&gt;xhigh&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cómo probar ambos antes de comprometerte
&lt;/h2&gt;

&lt;p&gt;No elijas uno a ciegas. Construye una prueba reproducible y mide durante una semana.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Define una conversación de prueba
&lt;/h3&gt;

&lt;p&gt;Incluye como mínimo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10 turnos de diálogo&lt;/li&gt;
&lt;li&gt;1 llamada a herramienta&lt;/li&gt;
&lt;li&gt;1 caso de desambiguación&lt;/li&gt;
&lt;li&gt;1 respuesta larga&lt;/li&gt;
&lt;li&gt;Audio real de usuarios, no solo texto sintético&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo de flujo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Usuario: Tengo un problema con mi factura.
Agente: ¿Puedes confirmar el número de cuenta?
Usuario: Sí, es 12345.
Agente: Llama a herramienta get_invoice(account_id).
Agente: Explica el resultado y ofrece siguiente acción.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Configura variables de entorno
&lt;/h3&gt;

&lt;p&gt;Usa claves separadas para cada proveedor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Crea dos URLs WebSocket
&lt;/h3&gt;

&lt;p&gt;Para Grok Voice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wss://api.x.ai/v1/realtime?model=grok-voice-think-fast-1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para GPT-Realtime-2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wss://api.openai.com/v1/realtime?model=gpt-realtime-2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Ejecuta la misma secuencia de mensajes
&lt;/h3&gt;

&lt;p&gt;Mantén idénticos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompt del sistema&lt;/li&gt;
&lt;li&gt;Audio de entrada&lt;/li&gt;
&lt;li&gt;Herramientas disponibles&lt;/li&gt;
&lt;li&gt;Orden de turnos&lt;/li&gt;
&lt;li&gt;Métricas capturadas&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Mide resultados comparables
&lt;/h3&gt;

&lt;p&gt;Registra por ejecución:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tiempo hasta el primer audio&lt;/li&gt;
&lt;li&gt;Duración total de respuesta&lt;/li&gt;
&lt;li&gt;Errores WebSocket&lt;/li&gt;
&lt;li&gt;Interrupciones manejadas correctamente&lt;/li&gt;
&lt;li&gt;Tokens usados&lt;/li&gt;
&lt;li&gt;Coste estimado&lt;/li&gt;
&lt;li&gt;Calidad subjetiva de la respuesta&lt;/li&gt;
&lt;li&gt;Precisión en llamadas a herramientas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Puedes &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descargar Apidog&lt;/a&gt; para ejecutar la comparación lado a lado. El formato de colección es portátil, así que puedes versionar el artefacto de prueba junto al código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Puedo usar ambos modelos en la misma aplicación?
&lt;/h3&gt;

&lt;p&gt;Sí. Puedes enrutar en tiempo de ejecución según intención, idioma, coste o complejidad.&lt;/p&gt;

&lt;p&gt;Ejemplo de estrategia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Consulta simple + latencia crítica -&amp;gt; Grok Voice
Consulta compleja + muchas herramientas -&amp;gt; GPT-Realtime-2
Usuario envía imagen -&amp;gt; GPT-Realtime-2
Voz personalizada requerida -&amp;gt; Grok Voice
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El coste de una capa de enrutamiento suele ser pequeño comparado con el coste total de la conversación.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuál tiene mejor calidad de voz en idiomas no ingleses?
&lt;/h3&gt;

&lt;p&gt;Grok gana en cobertura: más de 80 voces y 28 idiomas en TTS. En idiomas que ambos cubren, la diferencia práctica depende del idioma, acento y tipo de conversación. Lo correcto es probar los idiomas específicos que necesitas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Vale la pena GPT-Realtime-2 si cuesta más?
&lt;/h3&gt;

&lt;p&gt;Depende del flujo.&lt;/p&gt;

&lt;p&gt;Para un agente de preguntas frecuentes, probablemente no. Para un agente de ventas o soporte que debe leer un CRM, llamar herramientas, recuperarse de interrupciones y razonar sobre contexto, la diferencia puede justificarse.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Alguno permite clonar voces de figuras públicas?
&lt;/h3&gt;

&lt;p&gt;No. Ambos proveedores filtran la clonación a muestras consentidas. Clonar una figura pública sin permiso viola los términos de servicio de ambas plataformas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo migro de uno a otro más tarde?
&lt;/h3&gt;

&lt;p&gt;Los nombres de eventos difieren, pero la estructura general es parecida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;session.update
user audio input
assistant audio output
tool call
tool result
session end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Planifica una migración de aproximadamente un día para ajustar payloads, eventos y controladores. Si construyes las pruebas con &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;, la colección de solicitudes se puede portar de forma limpia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;No hay una respuesta universal entre Grok Voice y GPT-Realtime-2. Hay una respuesta correcta por caso de uso.&lt;/p&gt;

&lt;p&gt;Elige &lt;strong&gt;Grok Voice&lt;/strong&gt; si estás construyendo una aplicación de voz rápida, de alto volumen, orientada al consumidor o con clonación de voz.&lt;/p&gt;

&lt;p&gt;Elige &lt;strong&gt;GPT-Realtime-2&lt;/strong&gt; si necesitas razonamiento más profundo, entrada de imagen, MCP, SIP nativo o una integración más directa para centros de llamadas.&lt;/p&gt;

&lt;p&gt;Para el resto de casos, construye una prueba reproducible en &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;, ejecuta ambos modelos durante una semana y decide con datos.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo Usar Grok Voice Gratis: Configuración, Clonación de Voz y Agentes de Voz en Tiempo Real</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 08 May 2026 07:31:26 +0000</pubDate>
      <link>https://forem.com/roobia/como-usar-grok-voice-gratis-configuracion-clonacion-de-voz-y-agentes-de-voz-en-tiempo-real-2n2n</link>
      <guid>https://forem.com/roobia/como-usar-grok-voice-gratis-configuracion-clonacion-de-voz-y-agentes-de-voz-en-tiempo-real-2n2n</guid>
      <description>&lt;p&gt;xAI lanzó Grok Voice con Grok 4.3, y lo importante para desarrolladores es directo: está disponible gratis desde la Consola xAI. No hay cargo por minuto ni por token para el agente de voz, texto a voz, voz a texto o Voces Personalizadas. El único recurso facturable es el uso subyacente de tokens de Grok 4.3 cuando el agente razona, y la consola incluye asignación gratuita para pruebas.&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;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;En esta guía vas a levantar Grok Voice sin costo, clonar una voz, abrir una sesión WebSocket y validar el flujo completo con &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; antes de integrarlo en una aplicación.&lt;/p&gt;

&lt;p&gt;Si también necesitas la &lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía completa de la API de Grok 4.3&lt;/a&gt;, o una comparación directa contra OpenAI en &lt;a href="http://apidog.com/blog/grok-voice-vs-gpt-realtime-best-voice-model?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok Voice vs GPT-Realtime&lt;/a&gt;, esas publicaciones cubren el resto de la superficie.&lt;/p&gt;

&lt;h2&gt;
  
  
  En resumen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Grok Voice es gratis para usuarios de la &lt;strong&gt;Consola xAI&lt;/strong&gt; (&lt;code&gt;console.x.ai&lt;/code&gt;): sin cargo por minuto ni por token para TTS, STT, agente de voz o Voces Personalizadas.&lt;/li&gt;
&lt;li&gt;Modelo principal: &lt;code&gt;grok-voice-think-fast-1.0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tiempo hasta el primer audio: menos de &lt;strong&gt;1 segundo&lt;/strong&gt;; xAI afirma que es aproximadamente &lt;strong&gt;5 veces más rápido&lt;/strong&gt; que el competidor más cercano.&lt;/li&gt;
&lt;li&gt;Más de 80 voces preestablecidas en &lt;strong&gt;28 idiomas&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;5 personas de agente de voz integradas: Eve, Ara, Rex, Sal y Leo.&lt;/li&gt;
&lt;li&gt;Clonación de voz personalizada desde aproximadamente &lt;strong&gt;1 minuto de habla&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Voz lista para producción en &lt;strong&gt;menos de 2 minutos&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Endpoint WebSocket:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wss://api.x.ai/v1/realtime?model=grok-voice-think-fast-1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Los endpoints REST para TTS, STT y Voces Personalizadas comparten una única superficie de API.&lt;/li&gt;
&lt;li&gt;Puedes usar &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para preparar, ejecutar y repetir sesiones WebSocket sin volver a grabar audio.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lo que Grok Voice ofrece gratis
&lt;/h2&gt;

&lt;p&gt;La Consola xAI es el punto de entrada. Inicia sesión en &lt;code&gt;console.x.ai&lt;/code&gt;, genera una clave de API y podrás llamar a estas cuatro superficies sin cargos asociados a las funciones de voz.&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%2Fzjkeqwamuyap7ndjjrwg.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%2Fzjkeqwamuyap7ndjjrwg.png" alt="Interfaz de la consola xAI" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Superficies disponibles
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agente de Voz&lt;/strong&gt;: conversación habla-a-habla en tiempo real, con uso de herramientas, detección de actividad de voz del lado del servidor y gestión de turnos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Texto a Voz&lt;/strong&gt;: más de 80 voces preestablecidas en 28 idiomas, con salida MP3 o μ-law para telefonía.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voz a Texto&lt;/strong&gt;: transcripción en streaming y por lotes en 25 idiomas de entrada, con marcas de tiempo por palabra y diarización de hablantes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voces Personalizadas&lt;/strong&gt;: clonación de voz desde una muestra corta; el &lt;code&gt;voice_id&lt;/code&gt; resultante funciona en TTS y en el agente de voz.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El único medidor que se activa es el uso de tokens de Grok 4.3 cuando el agente necesita razonar sobre una solicitud. La consola incluye crédito gratuito para probar esta parte, suficiente para validar flujos de extremo a extremo antes de pasar a producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 1: Obtén una clave de consola
&lt;/h2&gt;

&lt;p&gt;Ve a &lt;code&gt;console.x.ai&lt;/code&gt; e inicia sesión con tu cuenta de X. En la página &lt;strong&gt;API Keys&lt;/strong&gt;, crea una clave nueva con los alcances &lt;code&gt;voice&lt;/code&gt; y &lt;code&gt;chat&lt;/code&gt; habilitados.&lt;/p&gt;

&lt;p&gt;Exporta la clave como variable de entorno:&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;"xai-..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para verificar que tu entorno está configurado:&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;echo&lt;/span&gt; &lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si vas a construir una aplicación web, no expongas esta clave en el navegador. En su lugar, genera un &lt;strong&gt;token efímero&lt;/strong&gt; desde la configuración de la consola o desde el endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/v1/realtime/sessions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Los tokens efímeros tienen el mismo alcance, pero expiran en minutos. Úsalos para conectar clientes web sin filtrar la clave principal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 2: Elige una voz
&lt;/h2&gt;

&lt;p&gt;Tienes dos opciones: usar una voz preestablecida o clonar una voz personalizada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opción A: usar voces preestablecidas
&lt;/h3&gt;

&lt;p&gt;El agente de voz incluye cinco personas nombradas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eve&lt;/strong&gt;: femenina, enérgica. Útil para soporte con tono optimista.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ara&lt;/strong&gt;: femenina, cálida. Buena opción para asistencia general.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rex&lt;/strong&gt;: masculino, seguro. Útil para guiones comerciales.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sal&lt;/strong&gt;: neutral, suave. Adecuada para narración y lecturas largas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leo&lt;/strong&gt;: masculino, autoritario. Útil para cumplimiento y flujos formales.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para TTS, la biblioteca es mayor: más de 80 voces en 28 idiomas. Se seleccionan con el parámetro &lt;code&gt;voice&lt;/code&gt; en el endpoint de texto a voz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opción B: clonar una voz personalizada
&lt;/h3&gt;

&lt;p&gt;Prepara un archivo WAV con aproximadamente un minuto de habla limpia de un solo hablante. Luego súbelo al endpoint de Voces Personalizadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.x.ai/v1/custom-voices &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;-F&lt;/span&gt; &lt;span class="s2"&gt;"name=narrator-jane"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"language=en"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"audio=@sample.wav"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La respuesta incluye un &lt;code&gt;voice_id&lt;/code&gt;. Ese mismo ID puede usarse en TTS y en el agente de voz.&lt;/p&gt;

&lt;p&gt;Buenas prácticas para la muestra:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usa una habitación silenciosa.&lt;/li&gt;
&lt;li&gt;Graba una sola voz.&lt;/li&gt;
&lt;li&gt;Evita música o ruido de fondo.&lt;/li&gt;
&lt;li&gt;Mantén volumen y distancia constantes.&lt;/li&gt;
&lt;li&gt;No asumas que más duración mejora el resultado; el máximo es 120 segundos, pero una muestra limpia de 60 segundos suele ser más útil que una muestra larga con ruido.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Paso 3: Abre una sesión WebSocket
&lt;/h2&gt;

&lt;p&gt;El agente de voz funciona como una única sesión WebSocket:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abres la conexión.&lt;/li&gt;
&lt;li&gt;Configuras la sesión.&lt;/li&gt;
&lt;li&gt;Envías audio de entrada.&lt;/li&gt;
&lt;li&gt;Recibes audio de salida en streaming.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wss://api.x.ai/v1/realtime?model=grok-voice-think-fast-1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cliente mínimo en Node.js:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wss://api.x.ai/v1/realtime?model=grok-voice-think-fast-1.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;open&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="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session.update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;voice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ara&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are a friendly support agent. Keep replies under two sentences.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;input_audio_format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pcm16&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;output_audio_format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pcm16&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;turn_detection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;server_vad&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&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;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&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;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;response.audio.delta&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdout&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="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;response.audio.done&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Turno completado&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El audio del usuario se envía como eventos &lt;code&gt;input_audio_buffer.append&lt;/code&gt;, usando tramas PCM16 codificadas en base64. El servidor responde con eventos &lt;code&gt;response.audio.delta&lt;/code&gt; mientras genera audio, y con &lt;code&gt;response.audio.done&lt;/code&gt; cuando termina el turno.&lt;/p&gt;

&lt;p&gt;Formato recomendado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usa &lt;code&gt;pcm16&lt;/code&gt; a 24 kHz para navegador o escritorio.&lt;/li&gt;
&lt;li&gt;Usa &lt;code&gt;mulaw&lt;/code&gt; cuando conectes el flujo a telefonía.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Paso 4: Envía audio al WebSocket
&lt;/h2&gt;

&lt;p&gt;El patrón de envío es:&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;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input_audio_buffer.append&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;base64Pcm16Frame&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;Después de enviar suficiente audio, puedes pedir una respuesta:&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;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&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.create&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En una integración real, &lt;code&gt;base64Pcm16Frame&lt;/code&gt; vendrá del micrófono, de un archivo de prueba o de una capa de telefonía. Para pruebas automatizadas, conviene usar siempre el mismo fragmento de audio y comparar los eventos de salida entre ejecuciones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 5: Añade uso de herramientas
&lt;/h2&gt;

&lt;p&gt;El agente de voz soporta invocación de funciones. Esto permite que el modelo consulte tus APIs durante una conversación.&lt;/p&gt;

&lt;p&gt;Primero declara una herramienta en la sesión:&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;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session.update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;function&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lookup_order&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Look up the status of a customer order by order number.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;type&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="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&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;order_id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="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;Cuando el modelo quiera invocar la herramienta, emitirá un evento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;response.function_call_arguments.done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tu aplicación debe:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Leer los argumentos generados por el modelo.&lt;/li&gt;
&lt;li&gt;Ejecutar la función en tu backend.&lt;/li&gt;
&lt;li&gt;Enviar el resultado de vuelta con un &lt;code&gt;conversation.item.create&lt;/code&gt; de tipo &lt;code&gt;function_call_output&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Permitir que el modelo continúe y narre la respuesta al usuario.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;También existe una herramienta incorporada &lt;code&gt;web_search&lt;/code&gt;, útil cuando necesitas respuestas basadas en información reciente sin construir tu propia capa de recuperación.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 6: Usa TTS sin el agente de voz
&lt;/h2&gt;

&lt;p&gt;Si solo necesitas convertir texto a audio, no abras WebSocket. Usa el endpoint REST de TTS.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.x.ai/v1/tts &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-tts-1",
    "voice": "ara",
    "input": "Welcome back to your account. Your last login was Tuesday at 3pm.",
    "format": "mp3"
  }'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; greeting.mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Formatos disponibles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mp3&lt;/code&gt;: alta fidelidad.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mulaw&lt;/code&gt;: 8 kHz, útil para telefonía.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este endpoint es síncrono: envías texto y recibes bytes de audio. No necesitas streaming.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 7: Prueba el flujo completo en Apidog
&lt;/h2&gt;

&lt;p&gt;Depurar WebSockets desde la terminal es incómodo porque la conversación tiene estado. Un flujo más práctico es preparar una colección reproducible en Apidog.&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%2Fi62iow0zbhkz10jerr2c.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%2Fi62iow0zbhkz10jerr2c.png" alt="Prueba de WebSocket en Apidog" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Patrón recomendado:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crea una solicitud WebSocket con esta URL:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wss://api.x.ai/v1/realtime?model=grok-voice-think-fast-1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Guarda &lt;code&gt;XAI_API_KEY&lt;/code&gt; como variable de entorno.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Añade el header:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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 {{XAI_API_KEY}}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Prepara mensajes JSON en secuencia:
&lt;/li&gt;
&lt;/ol&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;"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;"session.update"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"session"&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;"voice"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ara"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"instructions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"You are a concise support agent."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"input_audio_format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pcm16"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"output_audio_format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pcm16"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"turn_detection"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"server_vad"&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;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;"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;"input_audio_buffer.append"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"audio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BASE64_PCM16_AUDIO_FRAME"&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;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;"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;"response.create"&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;p&gt;Ejecuta la sesión y captura los eventos del servidor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repite la misma sesión cambiando &lt;code&gt;voice&lt;/code&gt; o &lt;code&gt;instructions&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compara las salidas para detectar cambios en tono, latencia, turnos o comportamiento de herramientas.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descarga Apidog&lt;/a&gt;, crea una solicitud WebSocket y guarda la clave en variables de entorno. La misma colección puede incluir TTS y STT porque son endpoints REST simples. Para más patrones de prueba de APIs con estado, consulta &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Herramienta de pruebas de API para ingenieros de QA&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Límites de la capa gratuita
&lt;/h2&gt;

&lt;p&gt;La consola da acceso completo sin cargo por minuto ni por token para las funciones de voz. Los límites relevantes son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Límites de tasa&lt;/strong&gt;: la consola impone límites de solicitudes por minuto por endpoint para prevenir abusos. Sirven para construir y hacer demos, no para producción de alto volumen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cuota de Voces Personalizadas&lt;/strong&gt;: una cuenta puede mantener un número finito de clones personalizados a la vez. Puedes eliminar clones antiguos para liberar espacio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tokens de razonamiento&lt;/strong&gt;: cuando el agente usa Grok 4.3 para razonar, ese consumo se descuenta del crédito de consola. El crédito gratuito cubre prototipos; producción requiere plan de pago.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si recibes errores de límite de tasa, agrupa solicitudes, reduce concurrencia o cambia a un nivel de pago. El comportamiento de la API no cambia; solo cambian los límites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo comparar voces antes de producción
&lt;/h2&gt;

&lt;p&gt;Antes de elegir una voz, ejecuta la misma lista de frases con cada preset.&lt;/p&gt;

&lt;p&gt;Usa al menos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un saludo de dos frases.&lt;/li&gt;
&lt;li&gt;Una confirmación corta: “Entendido, todo listo”.&lt;/li&gt;
&lt;li&gt;Una frase larga con número, fecha y coma.&lt;/li&gt;
&lt;li&gt;Una respuesta de error.&lt;/li&gt;
&lt;li&gt;Una frase con tono urgente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo de texto de prueba:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hola, soy tu asistente de soporte. Puedo ayudarte a revisar el estado de tu pedido o actualizar la información de tu cuenta.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Entendido, todo listo.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tu pedido número 48291 fue actualizado el martes 14 de mayo, y debería llegar antes de las 5 de la tarde.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La prueba práctica es reproducir el mismo mensaje en tres estilos: calmado, normal y urgente. Escucha si la voz mantiene claridad, ritmo e intención. Las voces preestablecidas de Grok manejan bien estos cambios, pero conviene auditar antes de salir en vivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿La API es realmente gratuita?
&lt;/h3&gt;

&lt;p&gt;Las funciones de voz —TTS, STT, agente de voz y Voces Personalizadas— no tienen cargo por minuto ni por token en la consola. El modelo de razonamiento subyacente se factura contra el crédito de consola. La asignación gratuita es suficiente para prototipos.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Necesito una cuenta de X?
&lt;/h3&gt;

&lt;p&gt;Sí. El inicio de sesión en la consola utiliza una cuenta de X.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo usar Grok Voice desde un navegador?
&lt;/h3&gt;

&lt;p&gt;Sí. Usa un token efímero. Genéralo desde tu backend mediante &lt;code&gt;/v1/realtime/sessions&lt;/code&gt;, entrégalo al navegador y conecta el WebSocket directamente. La clave principal debe quedarse en tu servidor.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué calidad de audio puedo esperar?
&lt;/h3&gt;

&lt;p&gt;TTS puede devolver MP3 de alta fidelidad o μ-law de 8 kHz. El agente de voz usa PCM16 a 24 kHz internamente. La calidad está al nivel de motores comerciales de TTS; la latencia es el diferenciador.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Funciona con telefonía?
&lt;/h3&gt;

&lt;p&gt;Sí. La salida μ-law es estándar para puentes SIP y PSTN. Aun así, necesitas un proveedor SIP externo; xAI no ofrece actualmente una pasarela SIP propia.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo se compara la clonación con otras herramientas?
&lt;/h3&gt;

&lt;p&gt;La calidad depende más de la limpieza del audio de referencia que de la duración. Una muestra limpia de 60 segundos en una habitación silenciosa supera a una muestra ruidosa de 120 segundos. El &lt;code&gt;voice_id&lt;/code&gt; resultante funciona tanto en TTS como en el agente de voz.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo usar Grok Voice para personajes de IA en un juego?
&lt;/h3&gt;

&lt;p&gt;Sí. El endpoint TTS es lo suficientemente rápido para generación en tiempo de ejecución, y las Voces Personalizadas permiten que cada personaje tenga su propio clon. Para líneas largas, usa generación por fragmentos para controlar latencia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Grok Voice es una de las rutas más directas para prototipar agentes de voz en tiempo real en 2026: acceso gratuito desde la consola, baja latencia, WebSocket para conversación y clonación de voz integrada.&lt;/p&gt;

&lt;p&gt;La forma más rápida de validarlo es:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crear una clave en &lt;code&gt;console.x.ai&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Probar una voz preestablecida.&lt;/li&gt;
&lt;li&gt;Abrir una sesión WebSocket.&lt;/li&gt;
&lt;li&gt;Ejecutar el mismo flujo en Apidog con varias voces.&lt;/li&gt;
&lt;li&gt;Medir latencia, calidad y comportamiento de turnos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cuando quieras conectarlo con razonamiento más amplio, revisa la &lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de la API de Grok 4.3&lt;/a&gt;. Para comparar contra OpenAI, consulta &lt;a href="http://apidog.com/blog/grok-voice-vs-gpt-realtime-best-voice-model?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok Voice vs GPT-Realtime&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Qué es GPT-Realtime-2 y Cómo Usar la API de GPT-Realtime-2</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 08 May 2026 07:25:57 +0000</pubDate>
      <link>https://forem.com/roobia/que-es-gpt-realtime-2-y-como-usar-la-api-de-gpt-realtime-2-514o</link>
      <guid>https://forem.com/roobia/que-es-gpt-realtime-2-y-como-usar-la-api-de-gpt-realtime-2-514o</guid>
      <description>&lt;p&gt;OpenAI lanzó una nueva generación de modelos de voz el 6 de noviembre de 2026. El lanzamiento principal es &lt;strong&gt;GPT-Realtime-2&lt;/strong&gt;: un modelo voz a voz con razonamiento de clase GPT-5, ventana de contexto de 128,000 tokens y esfuerzo de razonamiento configurable para equilibrar latencia y calidad. Si ya usa &lt;code&gt;gpt-realtime&lt;/code&gt;, la migración consiste principalmente en cambiar el ID del modelo y ajustar algunos campos de sesión y herramientas.&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;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Esta guía explica qué es GPT-Realtime-2, qué cambió frente al modelo anterior, cómo se factura y cómo conectarlo por WebSocket o SIP. También incluye un flujo práctico con &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 reproducir sesiones en tiempo real sin volver a grabar audio en cada prueba.&lt;/p&gt;

&lt;p&gt;Para contexto sobre la línea de modelos de OpenAI para 2026, consulte &lt;a href="http://apidog.com/blog/what-is-gpt-5-5?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Qué es GPT-5.5&lt;/a&gt;. Para el modelo multimodal de imagen, consulte &lt;a href="http://apidog.com/blog/how-to-use-gpt-image-2-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de GPT-Image-2&lt;/a&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPT-Realtime-2&lt;/strong&gt; es el modelo voz a voz insignia de OpenAI con razonamiento de clase GPT-5, contexto de 128k y hasta 32k tokens de salida.&lt;/li&gt;
&lt;li&gt;El audio cuesta &lt;strong&gt;$32 por 1 millón de tokens de entrada&lt;/strong&gt; y &lt;strong&gt;$64 por 1 millón de tokens de salida&lt;/strong&gt;. La entrada en caché cuesta $0.40/1M.&lt;/li&gt;
&lt;li&gt;Hay dos voces nuevas exclusivas de Realtime: &lt;strong&gt;Cedar&lt;/strong&gt; y &lt;strong&gt;Marin&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Los niveles de razonamiento son &lt;code&gt;minimal&lt;/code&gt;, &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt; y &lt;code&gt;xhigh&lt;/code&gt;. El predeterminado es &lt;code&gt;low&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Para WebSocket use: &lt;code&gt;wss://api.openai.com/v1/realtime?model=gpt-realtime-2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;También puede recibir llamadas entrantes por SIP.&lt;/li&gt;
&lt;li&gt;Modelos relacionados:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPT-Realtime-Translate&lt;/strong&gt;: traducción en vivo, 70 idiomas de entrada, $0.034/min.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-Realtime-Whisper&lt;/strong&gt;: STT en streaming, $0.017/min.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Use &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para guardar sesiones WebSocket, reproducir eventos y comparar ejecuciones.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Qué es GPT-Realtime-2?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://openai.com/index/advancing-voice-intelligence-with-new-models-in-the-api/" rel="noopener noreferrer"&gt;GPT-Realtime-2&lt;/a&gt; es un modelo único de voz a voz. Recibe audio, texto o imágenes como entrada y genera texto o audio como salida.&lt;/p&gt;

&lt;p&gt;La diferencia clave es que no necesita una cadena separada de:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;STT → LLM → TTS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El modelo procesa la transcripción, el razonamiento, la selección de herramientas y la generación de voz en una sola sesión Realtime.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-18.png" alt="" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La nueva modalidad importante es la &lt;strong&gt;entrada de imagen&lt;/strong&gt;. Puede insertar una captura de pantalla o una foto durante una conversación de voz y pedirle al agente que explique lo que ve.&lt;/p&gt;

&lt;p&gt;Ejemplo de caso de uso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Usuario: “Estoy viendo este error en pantalla. ¿Qué significa?”
Agente: analiza la imagen, responde en voz y puede pedir más contexto.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto permite construir copilotos de voz que ven lo mismo que el usuario.&lt;/p&gt;

&lt;h3&gt;
  
  
  Especificaciones
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Atributo&lt;/th&gt;
&lt;th&gt;Valor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ID del modelo&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gpt-realtime-2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ventana de contexto&lt;/td&gt;
&lt;td&gt;128,000 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Salida máxima&lt;/td&gt;
&lt;td&gt;32,000 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modalidades de entrada&lt;/td&gt;
&lt;td&gt;texto, audio, imagen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modalidades de salida&lt;/td&gt;
&lt;td&gt;texto, audio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fecha límite de conocimiento&lt;/td&gt;
&lt;td&gt;2024-09-30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Niveles de razonamiento&lt;/td&gt;
&lt;td&gt;minimal, low, medium, high, xhigh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llamada a funciones&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Servidores MCP remotos&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entrada de imagen&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llamadas telefónicas SIP&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  ¿Qué cambió con respecto a &lt;code&gt;gpt-realtime&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Frente a &lt;code&gt;gpt-realtime-1.5&lt;/code&gt;, GPT-Realtime-2 mejora en benchmarks de audio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Big Bench Audio:&lt;/strong&gt; 81.4% → 96.6%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio MultiChallenge:&lt;/strong&gt; 34.7% → 48.5%.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estas puntuaciones se obtuvieron con razonamiento &lt;code&gt;high&lt;/code&gt; y &lt;code&gt;xhigh&lt;/code&gt;. En producción, el valor predeterminado es &lt;code&gt;low&lt;/code&gt; para reducir latencia.&lt;/p&gt;

&lt;p&gt;Cambios prácticos para implementar agentes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Preámbulos de voz&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
El modelo puede decir frases como “déjame verificar eso” mientras razona o espera resultados de herramientas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Llamadas de herramientas en paralelo&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Puede ejecutar varias funciones al mismo tiempo y narrar el progreso.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recuperación más robusta&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Maneja mejor turnos ambiguos, interrupciones o solicitudes incompletas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mejor control del tono&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Puede ajustar estilo, formalidad, velocidad y terminología durante la sesión.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-19.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-19.png" alt="" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El contexto también crece de 32k a 128k tokens, lo que permite sesiones largas para soporte, banca, tutorías o agentes telefónicos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Precios
&lt;/h2&gt;

&lt;p&gt;GPT-Realtime-2 se factura por token, con tarifas separadas por modalidad.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo de token&lt;/th&gt;
&lt;th&gt;Entrada&lt;/th&gt;
&lt;th&gt;Entrada en caché&lt;/th&gt;
&lt;th&gt;Salida&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Texto&lt;/td&gt;
&lt;td&gt;$4.00 / 1M&lt;/td&gt;
&lt;td&gt;$0.40 / 1M&lt;/td&gt;
&lt;td&gt;$24.00 / 1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audio&lt;/td&gt;
&lt;td&gt;$32.00 / 1M&lt;/td&gt;
&lt;td&gt;$0.40 / 1M&lt;/td&gt;
&lt;td&gt;$64.00 / 1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Imagen&lt;/td&gt;
&lt;td&gt;$5.00 / 1M&lt;/td&gt;
&lt;td&gt;$0.50 / 1M&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;La entrada en caché reduce el costo para contexto repetido, como prompts de sistema, documentos base o instrucciones estables. Si su agente reutiliza el mismo contexto en muchas sesiones, active caché siempre que sea posible.&lt;/p&gt;

&lt;p&gt;Para comparar con otros modelos, consulte &lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;precios de GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Modelos complementarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPT-Realtime-Translate:&lt;/strong&gt; $0.034 por minuto. Admite 70 idiomas de entrada y 13 de salida.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-Realtime-Whisper:&lt;/strong&gt; $0.017 por minuto. Voz a texto en streaming para subtítulos en vivo y transcripción continua.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPT-Realtime-2&lt;/strong&gt; si necesita razonamiento y generación de voz.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-Realtime-Translate&lt;/strong&gt; si necesita interpretación multilingüe en vivo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-Realtime-Whisper&lt;/strong&gt; si solo necesita transcripción.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Puntos finales y autenticación
&lt;/h2&gt;

&lt;p&gt;GPT-Realtime-2 está disponible en varias superficies de API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST https://api.openai.com/v1/chat/completions
POST https://api.openai.com/v1/responses
WSS  wss://api.openai.com/v1/realtime?model=gpt-realtime-2
WSS  wss://api.openai.com/v1/realtime?call_id={call_id}   # SIP
POST https://api.openai.com/v1/realtime/translations
POST https://api.openai.com/v1/realtime/transcription_sessions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para agentes de voz interactivos, use WebSocket:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wss://api.openai.com/v1/realtime?model=gpt-realtime-2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Autenticación:&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 $OPENAI_API_KEY
OpenAI-Beta: realtime=v1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure la variable de entorno:&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;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-proj-..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conexión por WebSocket
&lt;/h2&gt;

&lt;p&gt;Instale &lt;code&gt;ws&lt;/code&gt; en Node.js:&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;ws
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wss://api.openai.com/v1/realtime?model=gpt-realtime-2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;OpenAI-Beta&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;realtime=v1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;open&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="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session.update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;voice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cedar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are a friendly support agent for a fintech app.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;input_audio_format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pcm16&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;output_audio_format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pcm16&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;turn_detection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;server_vad&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;reasoning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;effort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;low&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&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;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&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;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;response.audio.delta&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="c1"&gt;// Fragmento de audio PCM16 en base64.&lt;/span&gt;
    &lt;span class="c1"&gt;// En producción, envíelo al speaker, navegador o pipeline de audio.&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdout&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="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;response.done&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Respuesta completada&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La sesión funciona por eventos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usted envía audio con &lt;code&gt;input_audio_buffer.append&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;El servidor responde con eventos como &lt;code&gt;response.audio.delta&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Puede usar &lt;code&gt;server_vad&lt;/code&gt; para detección de turnos del lado del servidor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Formato recomendado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PCM16 a 24 kHz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También se admiten G.711 mu-law y A-law, útiles para telefonía.&lt;/p&gt;

&lt;p&gt;Para comparar Realtime con Responses API, consulte &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurar la sesión
&lt;/h2&gt;

&lt;p&gt;Una configuración inicial práctica:&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;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session.update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;voice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cedar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
      Eres un agente de soporte técnico.
      Responde de forma breve.
      Si necesitas datos externos, usa herramientas.
      Si no estás seguro, pide aclaración.
    `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;input_audio_format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pcm16&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;output_audio_format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pcm16&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;turn_detection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;server_vad&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;reasoning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;effort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;low&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para cambiar el nivel de razonamiento durante una sesión:&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;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session.update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;reasoning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;effort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;medium&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;code&gt;low&lt;/code&gt; como valor inicial. Suba a &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt; o &lt;code&gt;xhigh&lt;/code&gt; solo si mide problemas reales de calidad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enviar audio al modelo
&lt;/h2&gt;

&lt;p&gt;El flujo típico es:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Capturar audio del micrófono.
2. Convertirlo a PCM16.
3. Codificar cada fragmento en base64.
4. Enviar input_audio_buffer.append.
5. Confirmar el turno con input_audio_buffer.commit si controla los turnos manualmente.
6. Crear respuesta con response.create.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejemplo de envío de un fragmento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendAudioChunk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pcm16Buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input_audio_buffer.append&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pcm16Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si no usa VAD del servidor, cierre el turno manualmente:&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;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input_audio_buffer.commit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&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.create&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Voces
&lt;/h2&gt;

&lt;p&gt;GPT-Realtime-2 incluye dos voces nuevas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cedar:&lt;/strong&gt; voz masculina cálida de rango medio. Buena opción predeterminada para agentes generales.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marin:&lt;/strong&gt; voz femenina brillante y clara. Útil para traducción y anuncios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;También siguen disponibles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alloy
ash
ballad
coral
echo
sage
shimmer
verse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para cambiar la voz durante una sesión:&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;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session.update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;voice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;marin&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Entrada de imagen
&lt;/h2&gt;

&lt;p&gt;Puede adjuntar una imagen en cualquier turno del usuario.&lt;/p&gt;

&lt;p&gt;Ejemplo:&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;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;conversation.item.create&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input_image&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;image_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com/screenshot.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input_text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;What does this error mean?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&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.create&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Patrones comunes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;QA por voz:&lt;/strong&gt; un tester muestra una UI con error y el agente dicta el reporte.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Soporte en campo:&lt;/strong&gt; un técnico envía una foto de un panel o equipo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accesibilidad:&lt;/strong&gt; el agente describe una pantalla durante una llamada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para más detalle sobre imágenes, consulte &lt;a href="http://apidog.com/blog/how-to-use-gpt-image-2-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de GPT-Image-2&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Llamada a funciones y MCP
&lt;/h2&gt;

&lt;p&gt;GPT-Realtime-2 admite herramientas de función y servidores MCP remotos en la misma sesión.&lt;/p&gt;

&lt;h3&gt;
  
  
  Llamada a funciones estándar
&lt;/h3&gt;

&lt;p&gt;El flujo es:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Declare herramientas en session.update.
2. El modelo emite argumentos de llamada.
3. Su aplicación ejecuta la función.
4. Usted devuelve function_call_output.
5. El modelo continúa la conversación.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejemplo de herramienta:&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;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session.update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;function&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lookup_account&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Busca información básica de una cuenta de usuario.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;account_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;type&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="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&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;account_id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="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;GPT-Realtime-2 puede ejecutar llamadas en paralelo y narrar el progreso mientras espera resultados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Servidores MCP remotos
&lt;/h3&gt;

&lt;p&gt;También puede configurar un servidor MCP remoto:&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;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session.update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mcp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;server_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://mcp.example.com/sse&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;allowed_tools&lt;/span&gt;&lt;span class="p"&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;lookup_account&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;list_transactions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;}],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto reduce la lógica que debe mantener en su cliente WebSocket, especialmente si su agente usa muchas herramientas.&lt;/p&gt;

&lt;p&gt;Para pruebas de MCP, consulte &lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pruebas de servidor MCP en Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Llamadas telefónicas SIP
&lt;/h2&gt;

&lt;p&gt;GPT-Realtime-2 también puede recibir llamadas telefónicas reales.&lt;/p&gt;

&lt;p&gt;Flujo general:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Configure su tronco SIP hacia la puerta de enlace SIP de OpenAI.
2. Una llamada entrante crea un call_id.
3. Su aplicación abre una conexión:
   wss://api.openai.com/v1/realtime?call_id={call_id}
4. El modelo procesa audio telefónico y responde en voz.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El modelo acepta G.711 mu-law y A-law directamente, por lo que no necesita transcodificación adicional en muchos sistemas telefónicos.&lt;/p&gt;

&lt;p&gt;Esto es especialmente útil para centros de llamadas, donde el agente suele necesitar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;responder en tiempo real,&lt;/li&gt;
&lt;li&gt;consultar herramientas,&lt;/li&gt;
&lt;li&gt;recuperar datos de cuenta,&lt;/li&gt;
&lt;li&gt;transferir o escalar casos,&lt;/li&gt;
&lt;li&gt;mantener contexto durante una llamada larga.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Niveles de razonamiento
&lt;/h2&gt;

&lt;p&gt;Los niveles controlan la relación entre latencia y calidad:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nivel&lt;/th&gt;
&lt;th&gt;Caso de uso&lt;/th&gt;
&lt;th&gt;Costo de latencia aprox.&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;minimal&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Respuestas simples de sí/no&lt;/td&gt;
&lt;td&gt;ninguno&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;low&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Soporte general y conversaciones diarias&lt;/td&gt;
&lt;td&gt;pequeño&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;medium&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Desambiguación y herramientas complejas&lt;/td&gt;
&lt;td&gt;moderado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;high&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Razonamiento multi-paso o revisión de código por voz&lt;/td&gt;
&lt;td&gt;alto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;xhigh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Preguntas analíticas difíciles y benchmarks&lt;/td&gt;
&lt;td&gt;más alto&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Recomendación práctica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Empiece con low.
Mida latencia, calidad y tasa de resolución.
Suba a medium o high solo en flujos donde low falle.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Probar la API de Realtime en Apidog
&lt;/h2&gt;

&lt;p&gt;Las sesiones WebSocket son difíciles de depurar porque tienen estado. Con Apidog puede guardar y reproducir una sesión completa.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-20.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-20.png" alt="" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flujo recomendado:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cree una nueva solicitud WebSocket.&lt;/li&gt;
&lt;li&gt;Use la URL:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   wss://api.openai.com/v1/realtime?model=gpt-realtime-2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Configure headers:
&lt;/li&gt;
&lt;/ol&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 {{OPENAI_API_KEY}}
   OpenAI-Beta: realtime=v1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Guarde un mensaje &lt;code&gt;session.update&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Añada mensajes &lt;code&gt;input_audio_buffer.append&lt;/code&gt; y &lt;code&gt;response.create&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ejecute la sesión y capture los eventos del servidor.&lt;/li&gt;
&lt;li&gt;Compare ejecuciones cambiando &lt;code&gt;reasoning.effort&lt;/code&gt;, &lt;code&gt;voice&lt;/code&gt; o herramientas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descargue Apidog&lt;/a&gt;, cree una solicitud WebSocket y guarde su token en un entorno. Puede usar variables como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{OPENAI_API_KEY}}
{{voice}}
{{reasoning_effort}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto facilita reproducir pruebas sin reescribir JSON en cada ejecución.&lt;/p&gt;

&lt;p&gt;Para comparar con otro modelo multimodal rápido, consulte &lt;a href="http://apidog.com/blog/how-to-use-gemini-3-flash-preview-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de Gemini 3 Flash Preview&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Qué ID de modelo debo usar?
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpt-realtime-2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El modelo anterior sigue disponible como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpt-realtime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También existe la versión ligera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpt-realtime-2-mini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ¿Puedo enviar audio mientras el modelo todavía habla?
&lt;/h3&gt;

&lt;p&gt;Sí. La API de Realtime usa VAD del lado del servidor por defecto, por lo que el modelo puede interrumpirse cuando el usuario empieza a hablar.&lt;/p&gt;

&lt;p&gt;También puede desactivar VAD y controlar los límites de turno desde el cliente.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿El contexto de 128k incluye audio?
&lt;/h3&gt;

&lt;p&gt;Sí. El audio se tokeniza. Un segundo de audio equivale aproximadamente a 50 tokens, según el formato.&lt;/p&gt;

&lt;p&gt;En llamadas largas, mida el uso real antes de asumir que 128k será suficiente.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Se admite fine-tuning?
&lt;/h3&gt;

&lt;p&gt;Todavía no. Según la tarjeta del modelo, GPT-Realtime-2 aún no admite fine-tuning, salidas predichas ni streaming de texto en Chat Completions.&lt;/p&gt;

&lt;p&gt;El punto final Realtime transmite audio de forma nativa.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo se compara con GPT-5.5 más TTS?
&lt;/h3&gt;

&lt;p&gt;GPT-5.5 con TTS no ofrece razonamiento de voz de extremo a extremo.&lt;/p&gt;

&lt;p&gt;Un modelo voz a voz puede reaccionar a tono, vacilación, énfasis e interrupciones. Para agentes que deben responder a &lt;em&gt;cómo&lt;/em&gt; habla el usuario, GPT-Realtime-2 es más adecuado.&lt;/p&gt;

&lt;p&gt;Para razonamiento textual, consulte &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cómo usar la API de GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué límites de tasa aplican?
&lt;/h3&gt;

&lt;p&gt;El Nivel 1 empieza en 40,000 tokens por minuto y escala hasta 15M TPM en el Nivel 5.&lt;/p&gt;

&lt;p&gt;Los límites son por modelo, por lo que la cuota existente de GPT-5 no se transfiere automáticamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumen
&lt;/h2&gt;

&lt;p&gt;GPT-Realtime-2 permite construir agentes de voz con contexto largo, razonamiento de clase GPT-5, entrada de imagen, herramientas, MCP y soporte SIP dentro de una sesión WebSocket.&lt;/p&gt;

&lt;p&gt;Ruta práctica para empezar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cree una conexión WebSocket a &lt;code&gt;gpt-realtime-2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Configure &lt;code&gt;session.update&lt;/code&gt; con voz, instrucciones, formato de audio y &lt;code&gt;reasoning.effort&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Empiece con &lt;code&gt;low&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Añada herramientas solo cuando tenga un flujo claro.&lt;/li&gt;
&lt;li&gt;Use Apidog para reproducir sesiones, capturar eventos y comparar cambios.&lt;/li&gt;
&lt;li&gt;Suba el razonamiento únicamente cuando mida una brecha de calidad.&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>Mejores LLMs Locales de 2026</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 08 May 2026 06:41:47 +0000</pubDate>
      <link>https://forem.com/roobia/mejores-llms-locales-de-2026-dcj</link>
      <guid>https://forem.com/roobia/mejores-llms-locales-de-2026-dcj</guid>
      <description>&lt;h2&gt;
  
  
  En resumen
&lt;/h2&gt;

&lt;p&gt;El “mejor” LLM local en 2026 depende de tres variables prácticas: VRAM disponible, latencia objetivo y caso de uso principal: codificación, razonamiento, multilingüe, visión o llamadas a herramientas.&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;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para GPUs de 24 GB, &lt;strong&gt;Qwen 3.6 32B&lt;/strong&gt; y &lt;strong&gt;DeepSeek V4 Flash&lt;/strong&gt; son los dos todoterrenos más potentes.&lt;/li&gt;
&lt;li&gt;Para 8 GB o menos, las opciones más razonables son &lt;strong&gt;Gemma 4 9B&lt;/strong&gt; y &lt;strong&gt;Llama 5.1 8B&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Para razonamiento o codificación puros, &lt;strong&gt;DeepSeek V4 Pro&lt;/strong&gt; cuantizado o &lt;strong&gt;GLM 5&lt;/strong&gt; lideran la clasificación abierta.&lt;/li&gt;
&lt;li&gt;Usa &lt;strong&gt;Ollama&lt;/strong&gt;, &lt;strong&gt;vLLM&lt;/strong&gt; o &lt;strong&gt;LM Studio&lt;/strong&gt; para exponer un endpoint HTTP compatible con OpenAI.&lt;/li&gt;
&lt;li&gt;Después, prueba ese endpoint local con &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; igual que probarías una API alojada.&lt;/li&gt;
&lt;li&gt;Descarga Apidog para simular, reproducir y comparar tráfico de modelos locales sin gastar tokens de tu presupuesto de LLM alojado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esta guía resume qué modelos locales vale la pena ejecutar en 2026, qué hardware necesitan y cómo probarlos como APIs HTTP. Si ya estás evaluando DeepSeek, revisa también la &lt;a href="http://apidog.com/blog/how-to-run-deepseek-v4-locally?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de instalación local de DeepSeek V4&lt;/a&gt; y la &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descripción general de DeepSeek V4&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué los LLM locales vuelven a ser importantes en 2026
&lt;/h2&gt;

&lt;p&gt;Hace tres años, ejecutar un LLM local implicaba aceptar una caída clara de calidad. Eso ya no es necesariamente cierto. Los modelos de peso abierto alcanzaron a muchos sistemas alojados de clase GPT-4 durante 2024 y mejoraron de forma importante el costo por token a mediados de 2025.&lt;/p&gt;

&lt;p&gt;Hoy, para tareas como extracción, clasificación, llamadas a herramientas y muchas cargas de trabajo de codificación, la diferencia práctica puede ser pequeña. La pregunta ya no es solo “¿el modelo es suficientemente bueno?”, sino:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;¿Cabe en mi hardware?&lt;/li&gt;
&lt;li&gt;¿Responde con la latencia que necesito?&lt;/li&gt;
&lt;li&gt;¿Puedo probarlo y cambiarlo sin romper mi aplicación?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El hardware también cambió. Una GPU de consumo de 24 GB puede ejecutar modelos de 32B parámetros con cuantificación de 4 bits y rendimiento usable. Un Mac Studio con memoria unificada suficiente puede servir modelos más grandes como DeepSeek V4 Flash a velocidades razonables.&lt;/p&gt;

&lt;p&gt;Para equipos que se preocupan por residencia de datos, bloqueo de proveedor o costos de inferencia altos, ejecutar modelos locales ya es una opción práctica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo seleccionamos estos modelos
&lt;/h2&gt;

&lt;p&gt;La lista no es un simple ranking. Los criterios usados fueron:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pesos abiertos con licencia permisiva o comunitaria usable en producción.&lt;/li&gt;
&lt;li&gt;Mantenimiento activo en 2026.&lt;/li&gt;
&lt;li&gt;Ruta de servicio compatible con OpenAI mediante Ollama, vLLM o LM Studio.&lt;/li&gt;
&lt;li&gt;Buen rendimiento real en al menos una categoría: razonamiento, código, multilingüe, visión, contexto largo o llamadas a herramientas.&lt;/li&gt;
&lt;li&gt;Requisitos de hardware razonables para desarrolladores y equipos pequeños.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;También se contrastaron los resultados con referencias públicas como &lt;a href="https://chat.lmsys.org/" rel="noopener noreferrer"&gt;LMSYS Chatbot Arena&lt;/a&gt; y el &lt;a href="https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard" rel="noopener noreferrer"&gt;Open LLM Leaderboard de Hugging Face&lt;/a&gt;, cuando aplicaba.&lt;/p&gt;

&lt;h2&gt;
  
  
  Los LLM locales que vale la pena ejecutar en 2026
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. DeepSeek V4 Pro
&lt;/h3&gt;

&lt;p&gt;DeepSeek V4 Pro es el modelo insignia de la familia DeepSeek V4. Está disponible como GGUF y AWQ de 4 bits en Hugging Face.&lt;/p&gt;

&lt;p&gt;El modelo completo tiene 1.6T parámetros con 49B activos, por lo que entra en territorio de centro de datos. Cuantizado a Q4, puede requerir hardware como dos H100 de 80 GB o un Mac Studio M3 Ultra con 192 GB de memoria unificada.&lt;/p&gt;

&lt;p&gt;Para la mayoría de desarrolladores, V4 Pro local será una opción exigente. Aun así, es relevante porque sus variantes y destilaciones más pequeñas heredan parte de su comportamiento de razonamiento.&lt;/p&gt;

&lt;p&gt;Si prefieres usar los mismos pesos mediante API alojada, consulta &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo usar la API de DeepSeek V4&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ideal para:&lt;/strong&gt; agentes con razonamiento pesado, investigación, workloads avanzados.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Hardware:&lt;/strong&gt; 192 GB de memoria unificada o 2 GPUs de 80 GB.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Dónde conseguirlo:&lt;/strong&gt; &lt;a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Pro" rel="noopener noreferrer"&gt;DeepSeek V4 Pro en Hugging Face&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. DeepSeek V4 Flash
&lt;/h3&gt;

&lt;p&gt;DeepSeek V4 Flash es la variante más pequeña de V4: 284B parámetros totales y 13B activos. Con cuantificación de 4 bits, cabe en 24 GB de VRAM con espacio para una ventana de contexto de 64K.&lt;/p&gt;

&lt;p&gt;En una RTX 4090, el rendimiento promedio observado fue de unos 28 tokens por segundo en generación de formato largo.&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%2Fi06uvwrpb8br1ylseq9h.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%2Fi06uvwrpb8br1ylseq9h.png" alt="DeepSeek V4 Flash" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;V4 Flash es probablemente el modelo que más equipos podrán ejecutar localmente. Su calidad de razonamiento quedó cerca de V4 Pro en los prompts probados, aunque la codificación se queda algo por detrás.&lt;/p&gt;

&lt;p&gt;La &lt;a href="http://apidog.com/blog/how-to-run-deepseek-v4-locally?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de instalación local de DeepSeek V4&lt;/a&gt; cubre la configuración con Ollama de principio a fin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ideal para:&lt;/strong&gt; agente local general, asistente de codificación, generador RAG.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Hardware:&lt;/strong&gt; 24 GB VRAM en Q4, 16 GB en Q3 con pérdida de calidad.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Dónde conseguirlo:&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;ollama pull deepseek-v4-flash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O desde &lt;a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash" rel="noopener noreferrer"&gt;DeepSeek V4 Flash en Hugging Face&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Qwen 3.6
&lt;/h3&gt;

&lt;p&gt;Qwen, de Alibaba, ha sido una de las familias de peso abierto más consistentes. Qwen 3.6 en Q4 cabe en 24 GB y supera a modelos Llama 3 70B más antiguos en varios benchmarks de razonamiento y llamadas a herramientas.&lt;/p&gt;

&lt;p&gt;Su punto fuerte es el soporte multilingüe. Qwen maneja chino, japonés, coreano y árabe con calidad alta, donde muchos modelos occidentales son menos consistentes.&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%2Fddpqlfd78fqtq9387yx2.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%2Fddpqlfd78fqtq9387yx2.png" alt="Qwen 3.6" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si tu producto opera fuera de EE. UU. o necesita un único modelo para razonamiento, herramientas y salida multilingüe, Qwen 3.6 32B es una opción fuerte.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ideal para:&lt;/strong&gt; productos multilingües, salida estructurada, llamadas a herramientas, costo equilibrado.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Hardware:&lt;/strong&gt; 24 GB VRAM en Q4.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Dónde conseguirlo:&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;ollama pull qwen3.6:32b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O desde &lt;a href="https://huggingface.co/Qwen/Qwen3.6-32B" rel="noopener noreferrer"&gt;Qwen 3.6 en Hugging Face&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. GLM 5.1
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://z.ai/blog/glm-5.1" rel="noopener noreferrer"&gt;GLM 5.1&lt;/a&gt; destaca especialmente en llamadas a herramientas. Se sitúa entre los modelos abiertos más fuertes para flujos agentic, extracción estructurada y seguimiento de esquemas JSON.&lt;/p&gt;

&lt;p&gt;La codificación no es su punto más fuerte. En cambio, razonamiento, clasificación y extracción estructurada son sus mejores áreas.&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%2Fllhaiswc3qyj6zu9nhmf.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%2Fllhaiswc3qyj6zu9nhmf.png" alt="GLM 5.1" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GLM 5.1 es una buena opción si tu carga de trabajo depende de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;llamadas a herramientas;&lt;/li&gt;
&lt;li&gt;workflows de agentes;&lt;/li&gt;
&lt;li&gt;extracción de datos;&lt;/li&gt;
&lt;li&gt;respuestas en JSON;&lt;/li&gt;
&lt;li&gt;validación contra esquemas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ideal para:&lt;/strong&gt; agentes con tool calling, extracción estructurada, pipelines JSON.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Servicio local:&lt;/strong&gt; Ollama o vLLM.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cómo servirlos como una API alojada
&lt;/h2&gt;

&lt;p&gt;Una vez que el modelo funciona, tu aplicación sigue necesitando un endpoint HTTP. Lo ideal es que el modelo local tenga la misma forma de API que un proveedor alojado.&lt;/p&gt;

&lt;p&gt;En 2026, las rutas más prácticas son:&lt;/p&gt;
&lt;h3&gt;
  
  
  Opción 1: Ollama
&lt;/h3&gt;

&lt;p&gt;Ollama es la forma más simple para empezar.&lt;br&gt;
&lt;/p&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;p&gt;Expone un endpoint compatible con OpenAI en:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:11434/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto permite cambiar de:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:11434/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;sin reescribir todo el cliente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opción 2: vLLM
&lt;/h3&gt;

&lt;p&gt;vLLM es mejor para producción. Ofrece mejor rendimiento, procesamiento por lotes continuo y un endpoint compatible con OpenAI normalmente expuesto en:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8000/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Úsalo cuando importen latencia, concurrencia y throughput.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opción 3: LM Studio
&lt;/h3&gt;

&lt;p&gt;LM Studio es útil si quieres una GUI. Permite descargar modelos, probarlos localmente y activar un servidor HTTP desde la configuración.&lt;/p&gt;

&lt;p&gt;Es una buena opción para desarrollo individual o prototipos rápidos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ejemplo: llamar un modelo local con el cliente de OpenAI
&lt;/h2&gt;

&lt;p&gt;Los tres enfoques anteriores pueden usar el formato OpenAI Chat Completions. Eso significa que el mismo cliente puede apuntar a un modelo alojado o local cambiando solo &lt;code&gt;base_url&lt;/code&gt; y &lt;code&gt;model&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="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="c1"&gt;# cualquier string; Ollama lo ignora
&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="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;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:32b&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;Resume las diferencias entre modelos MoE y dense en tres bullets.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="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="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 probar otro modelo, cambia solo el nombre:&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;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-v4-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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="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;llama5.1:8b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este patrón también se explica en &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo usar DeepSeek V4 gratis&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Probando modelos locales con Apidog
&lt;/h2&gt;

&lt;p&gt;La diferencia más importante entre un LLM alojado y uno local no es solo la calidad. Es la depuración.&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%2Fou3bxrkm26ig08d3q0jx.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%2Fou3bxrkm26ig08d3q0jx.png" alt="Probar modelos locales con Apidog" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cuando una API alojada falla, consultas su página de estado. Cuando Ollama, vLLM o tu GPU fallan, el problema es tuyo.&lt;/p&gt;

&lt;p&gt;Necesitas poder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inspeccionar la solicitud cruda;&lt;/li&gt;
&lt;li&gt;reproducir el mismo prompt;&lt;/li&gt;
&lt;li&gt;cambiar parámetros como &lt;code&gt;temperature&lt;/code&gt; o &lt;code&gt;max_tokens&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;comparar modelos;&lt;/li&gt;
&lt;li&gt;medir latencia;&lt;/li&gt;
&lt;li&gt;simular respuestas para CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; trata tu endpoint de Ollama o vLLM como cualquier otra API HTTP.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Guarda solicitudes canónicas
&lt;/h3&gt;

&lt;p&gt;Crea una colección por modelo con prompts realistas:&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;"qwen3.6:32b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&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;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Extrae los campos principales de este contrato y responde en JSON."&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;"temperature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"max_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;1024&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;Después de cambiar modelo, cuantización o hardware, reproduce la misma colección y compara resultados.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Compara salidas entre modelos
&lt;/h3&gt;

&lt;p&gt;Ejecuta el mismo prompt contra:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qwen 3.6;&lt;/li&gt;
&lt;li&gt;DeepSeek V4 Flash;&lt;/li&gt;
&lt;li&gt;Llama 5.1;&lt;/li&gt;
&lt;li&gt;Gemma 4;&lt;/li&gt;
&lt;li&gt;GLM 5.1.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto ayuda a detectar regresiones antes de mover tráfico real.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Simula el endpoint en CI
&lt;/h3&gt;

&lt;p&gt;No conviene que tus pipelines de CI dependan de una GPU local de 24 GB. Si el proceso cae por OOM o el driver falla, tus tests se vuelven inestables.&lt;/p&gt;

&lt;p&gt;Con Apidog puedes simular el endpoint con respuestas JSON realistas para que las pruebas unitarias sigan siendo deterministas.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Mide rendimiento
&lt;/h3&gt;

&lt;p&gt;Para modelos locales, mide al menos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;latencia total;&lt;/li&gt;
&lt;li&gt;tiempo hasta el primer token;&lt;/li&gt;
&lt;li&gt;tokens por segundo;&lt;/li&gt;
&lt;li&gt;variación entre Q4 y Q5;&lt;/li&gt;
&lt;li&gt;impacto del tamaño de contexto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto te permite decidir si un modelo más grande realmente compensa.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Documenta tu API local
&lt;/h3&gt;

&lt;p&gt;Los proyectos de Apidog pueden exportar OpenAPI 3.1. Así, cualquier compañero puede ver cómo llamar al modelo interno, qué formato acepta y qué respuesta debe esperar.&lt;/p&gt;

&lt;p&gt;Este flujo también se cubre en &lt;a href="http://apidog.com/blog/best-self-hosted-postman-alternatives-2026-2?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog como alternativa a Postman&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Errores comunes al ejecutar LLM locales
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Elegir el modelo más grande que cabe en la GPU
&lt;/h3&gt;

&lt;p&gt;Un modelo de 32B en Q3 puede comportarse peor que uno de 14B en Q5. La calidad de cuantización importa mucho una vez que trabajas en 4 bits o menos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Olvidar que el contexto consume VRAM
&lt;/h3&gt;

&lt;p&gt;Una ventana de 32K tokens en un modelo de 32B puede requerir varios GB adicionales para la caché KV. Reserva memoria para el contexto antes de cargar el modelo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejecutar fine-tunes desconocidos
&lt;/h3&gt;

&lt;p&gt;No ejecutes cualquier subida aleatoria de Hugging Face en producción. Usa modelos base oficiales o fine-tunes de autores conocidos. Un fine-tune envenenado es un riesgo real.&lt;/p&gt;

&lt;h3&gt;
  
  
  Saltarse la simulación
&lt;/h3&gt;

&lt;p&gt;Los modelos locales pueden fallar por drivers, OOM, procesos terminados o throttling de GPU. Si tus tests golpean directamente el modelo, CI se vuelve frágil.&lt;/p&gt;

&lt;p&gt;Simula el endpoint con &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para que las pruebas no dependan del estado del hardware.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ignorar diferencias en tool calling
&lt;/h3&gt;

&lt;p&gt;Llama 5.1, Qwen 3.6 y DeepSeek V4 pueden soportar llamadas a herramientas, pero no siempre emiten JSON con la misma forma exacta.&lt;/p&gt;

&lt;p&gt;Antes de cambiar modelos en producción, prueba:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nombres de herramientas;&lt;/li&gt;
&lt;li&gt;argumentos;&lt;/li&gt;
&lt;li&gt;schemas;&lt;/li&gt;
&lt;li&gt;errores de validación;&lt;/li&gt;
&lt;li&gt;streaming;&lt;/li&gt;
&lt;li&gt;respuestas parciales.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Casos de uso reales
&lt;/h2&gt;

&lt;p&gt;Una startup que ejecuta un agente de atención al cliente pasó de GPT-5.5 a Qwen 3.6 32B en una única 4090. La latencia se mantuvo por debajo de 800 ms, la factura mensual de inferencia bajó de $9,400 a $0 y el equipo usa simulaciones de Apidog para mantener CI determinista.&lt;/p&gt;

&lt;p&gt;Un desarrollador individual que construye un asistente de voz ejecuta Gemma 4 9B en un M2 Pro con 16 GB de memoria unificada. Los borradores de predicción multi-token le dan unos 60 tokens por segundo, suficiente para una experiencia que se siente nativa.&lt;/p&gt;

&lt;p&gt;Un equipo de investigación fintech ejecuta DeepSeek V4 Flash en dos 4090 para generar resúmenes nocturnos por lotes de documentos regulatorios. El costo por resumen es la electricidad más el mantenimiento del equipo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;El mejor LLM local en 2026 es el que encaja con tu VRAM, tu latencia objetivo y el estándar de calidad de tu producto.&lt;/p&gt;

&lt;p&gt;Como regla práctica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;usa &lt;strong&gt;Qwen 3.6 32B&lt;/strong&gt; o &lt;strong&gt;DeepSeek V4 Flash&lt;/strong&gt; si tienes 24 GB de VRAM;&lt;/li&gt;
&lt;li&gt;usa &lt;strong&gt;Llama 5.1 8B&lt;/strong&gt; o &lt;strong&gt;Gemma 4 9B&lt;/strong&gt; para hardware más pequeño;&lt;/li&gt;
&lt;li&gt;usa &lt;strong&gt;GLM 5.1&lt;/strong&gt; si tu carga principal son llamadas a herramientas;&lt;/li&gt;
&lt;li&gt;usa &lt;strong&gt;DeepSeek V4 Pro&lt;/strong&gt; si tienes hardware de gama alta y necesitas razonamiento fuerte.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cinco ideas clave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La calidad local ya es suficiente para muchas tareas de producción.&lt;/li&gt;
&lt;li&gt;Ollama más un cliente compatible con OpenAI es la ruta más rápida.&lt;/li&gt;
&lt;li&gt;La cuantización importa tanto como el tamaño del modelo.&lt;/li&gt;
&lt;li&gt;Trata el endpoint local como una API de producción.&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; ayuda a guardar, reproducir, simular, comparar y documentar esas llamadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Siguiente paso:&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 qwen3.6:32b
ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después apunta &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; a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:11434/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y empieza a comparar respuestas como si fuera una API alojada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Cuál es el mejor LLM local para una GPU de 24 GB en 2026?
&lt;/h3&gt;

&lt;p&gt;Para la mayoría de cargas de trabajo, Qwen 3.6 32B en Q4 o DeepSeek V4 Flash en Q4.&lt;/p&gt;

&lt;p&gt;Elige Qwen para tareas multilingües o con muchas herramientas. Elige DeepSeek V4 Flash para razonamiento y codificación. La configuración está cubierta en la &lt;a href="http://apidog.com/blog/how-to-run-deepseek-v4-locally?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía local de DeepSeek V4&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo ejecutar un LLM local en un Mac?
&lt;/h3&gt;

&lt;p&gt;Sí. Un Mac con Apple Silicon y 16 GB o más de memoria unificada puede ejecutar Llama 5.1 8B y Gemma 4 9B cómodamente. Un M3 Ultra con 192 GB puede ejecutar DeepSeek V4 Pro en Q4. Usa Ollama o LM Studio.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo pruebo un LLM local igual que OpenAI?
&lt;/h3&gt;

&lt;p&gt;Dirige tu cliente compatible con OpenAI y tu proyecto de &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; a la URL local.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:11434/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8000/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La forma de solicitud es la misma; cambia la URL base.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿La calidad local está realmente a la par con la alojada?
&lt;/h3&gt;

&lt;p&gt;En razonamiento, codificación, clasificación, extracción y llamadas a herramientas, los mejores modelos abiertos están cerca de los alojados en muchas tareas. En visión, QA de documentos de contexto largo y escritura creativa, los modelos alojados todavía pueden liderar por margen notable.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuánto cuesta ejecutar un LLM local?
&lt;/h3&gt;

&lt;p&gt;Una RTX 4090 puede ejecutar DeepSeek V4 Flash por el costo de la electricidad, aproximadamente $30 al mes con uso típico. Un equivalente alojado al mismo volumen puede costar cientos o miles al mes. El punto de equilibrio suele aparecer alrededor de 5 millones de tokens mensuales.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo cambio una app de producción entre un modelo alojado y uno local?
&lt;/h3&gt;

&lt;p&gt;Mantén el cliente de OpenAI y cambia:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;base_url&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;model&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;credenciales si aplica.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Antes de enviar tráfico real, reproduce prompts críticos y compara respuestas. Este enfoque también se cubre en &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pruebas de API sin Postman&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Dónde puedo ver clasificaciones actualizadas?
&lt;/h3&gt;

&lt;p&gt;Consulta el &lt;a href="https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard" rel="noopener noreferrer"&gt;Open LLM Leaderboard de Hugging Face&lt;/a&gt; y &lt;a href="https://chat.lmsys.org/" rel="noopener noreferrer"&gt;LMSYS Chatbot Arena&lt;/a&gt;. Usa ambos, porque miden cosas diferentes.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
