<?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>10 Mejores Herramientas de Documentación API REST 2026</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Wed, 08 Apr 2026 08:47:30 +0000</pubDate>
      <link>https://forem.com/roobia/10-mejores-herramientas-de-documentacion-api-rest-2026-2hem</link>
      <guid>https://forem.com/roobia/10-mejores-herramientas-de-documentacion-api-rest-2026-2hem</guid>
      <description>&lt;p&gt;¡Hola, entusiastas y desarrolladores de tecnología! 👋 ¿Alguna vez se han encontrado perdidos en el laberinto de las APIs? ¿O tal vez están creando una API y quieren asegurarse de que su documentación sea lo más clara posible? Hoy nos sumergiremos en el mundo de las herramientas de documentación de API REST. Ya seas experimentado o principiante, esta guía te mostrará cómo implementar documentación profesional usando las mejores herramientas disponibles.&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 mismo&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;¡Muy bien, empecemos!&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Apidog
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Su herramienta API todo en uno
&lt;/h3&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; es mucho más que una herramienta de documentación; es una plataforma API todo en uno. Con Apidog puedes diseñar, probar y documentar tus APIs de forma centralizada, lo que facilita el flujo de trabajo y reduce la complejidad técnica.&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%2Fjp9en84kgrmapijj4w6y.webp" 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%2Fjp9en84kgrmapijj4w6y.webp" alt="Interfaz principal de Apidog" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué implementar Apidog?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Funciones completas:&lt;/strong&gt; Utiliza &lt;a href="https://apidog.com/api-design/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;diseño&lt;/a&gt;, &lt;a href="https://apidog.com/api-testing/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pruebas&lt;/a&gt; y &lt;a href="https://apidog.com/api-doc/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;documentación&lt;/a&gt; de API en una sola interfaz.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fácil de usar:&lt;/strong&gt; Interfaz intuitiva, ideal para quienes buscan comenzar rápido sin curva de aprendizaje pronunciada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gratis:&lt;/strong&gt; Descarga gratuita y sin restricciones para comenzar de inmediato.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;¿Sabías que Apidog es &lt;a href="http://apidog.com/blog/apidog-ultimate-postman-alternative/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;la mejor alternativa a Postman&lt;/a&gt;? Instálalo y empieza a documentar tu API en minutos.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. SwaggerHub
&lt;/h2&gt;

&lt;h3&gt;
  
  
  La potencia de la documentación de API
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://swagger.io/tools/swaggerhub/why-swaggerhub/" rel="noopener noreferrer"&gt;SwaggerHub&lt;/a&gt; es estándar para crear, compartir y colaborar en diseños de API usando OpenAPI Specification. Si necesitas documentación interactiva, sigue estos pasos básicos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Crea tu especificación OpenAPI&lt;/strong&gt; directamente en SwaggerHub.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparte la documentación&lt;/strong&gt; generada automáticamente con tu equipo o clientes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permite probar endpoints&lt;/strong&gt; directamente desde la interfaz de SwaggerHub.&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%2Feovkjxizbcnirw09frf3.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%2Feovkjxizbcnirw09frf3.png" alt="SwaggerHub" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Ventajas clave
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Documentación interactiva:&lt;/strong&gt; Permite probar endpoints en vivo desde la documentación.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Colaboración:&lt;/strong&gt; Varios desarrolladores pueden editar y revisar la API en simultáneo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integraciones:&lt;/strong&gt; Se conecta con herramientas como GitHub y Jira.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ideal para equipos que buscan estandarizar y profesionalizar la documentación de sus APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Postman
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Más allá de las pruebas: Postman para la documentación
&lt;/h3&gt;

&lt;p&gt;Postman es conocido por las pruebas de API, pero también permite documentar de manera eficiente. Para sacarle provecho:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Crea colecciones de solicitudes&lt;/strong&gt; en Postman.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agrega descripciones detalladas&lt;/strong&gt; y ejemplos de respuestas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publica documentación&lt;/strong&gt; con un clic para compartirla con tu equipo o clientes.&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%2Fyxjl2sd9oaigfeprkb8k.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%2Fyxjl2sd9oaigfeprkb8k.png" alt="Postman" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Ventajas clave
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interfaz intuitiva:&lt;/strong&gt; Documenta y prueba en un solo lugar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentación en vivo:&lt;/strong&gt; Actualizaciones automáticas cuando cambias las requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comunidad:&lt;/strong&gt; Recursos y soporte disponibles para resolver cualquier duda.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfecto para quienes buscan una herramienta integral para pruebas y documentación.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Redoc
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Documentación de API limpia y elegante
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://redocly.com/" rel="noopener noreferrer"&gt;Redoc&lt;/a&gt; destaca por su diseño minimalista orientado a la experiencia del usuario. Para empezar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Escribe tu especificación OpenAPI en YAML o JSON.&lt;/li&gt;
&lt;li&gt;Utiliza Redoc para renderizar la documentación automáticamente.&lt;/li&gt;
&lt;li&gt;Personaliza el tema según tu marca mediante configuración sencilla.&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%2Fffkgker403u9zs22skea.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%2Fffkgker403u9zs22skea.png" alt="Redoc" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Puntos destacados
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Personalizable:&lt;/strong&gt; Cambia colores, logos y fuentes fácilmente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Soporte de Markdown:&lt;/strong&gt; Agrega información adicional para mayor claridad.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diseño responsive:&lt;/strong&gt; Documentación optimizada para todos los dispositivos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ideal para proyectos donde la presentación visual es clave.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. DapperDox
&lt;/h2&gt;

&lt;h3&gt;
  
  
  La elección colaborativa
&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://dapperdox.io/" rel="noopener noreferrer"&gt;DapperDox&lt;/a&gt; está pensado para equipos que requieren colaboración y control de versiones en la documentació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%2Fyg86o53t7d0vro1qiuwb.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%2Fyg86o53t7d0vro1qiuwb.png" alt="DapperDox" width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Características clave
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Edición multiusuario:&lt;/strong&gt; Trabaja simultáneamente con varios miembros del equipo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diagramas integrados:&lt;/strong&gt; Añade diagramas explicativos para mejorar la comprensión.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control de versiones:&lt;/strong&gt; Administra fácilmente distintas versiones de tu API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recomendado para equipos grandes y flujos de trabajo colaborativos.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Slate
&lt;/h2&gt;

&lt;h3&gt;
  
  
  El favorito del desarrollador
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://slatedocs.github.io/slate/#introduction" rel="noopener noreferrer"&gt;Slate&lt;/a&gt; es open source y permite generar documentación atractiva a partir de archivos Markdown.&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%2Fsdec2o8y94r38zejo941.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%2Fsdec2o8y94r38zejo941.png" alt="Slate" width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Ventajas clave
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Basado en Markdown:&lt;/strong&gt; Edición sencilla y rápida.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generador de sitios estáticos:&lt;/strong&gt; Hospeda la documentación como HTML estático.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diseño responsive:&lt;/strong&gt; Tu documentación se adapta a cualquier dispositivo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ideal para quienes prefieren flujo de trabajo basado en Markdown y despliegue estático.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. ReadMe
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Documentación de API centrada en el usuario
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.readme.com/" rel="noopener noreferrer"&gt;ReadMe&lt;/a&gt; permite crear documentación interactiva enfocada en la experiencia del usuario final.&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%2Fkjt9tlveurcz1k0qm88n.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%2Fkjt9tlveurcz1k0qm88n.png" alt="ReadMe" width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Características principales
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Documentación interactiva:&lt;/strong&gt; Prueba endpoints desde la misma documentación.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personalización visual:&lt;/strong&gt; Ajusta fácilmente la apariencia.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analíticas:&lt;/strong&gt; Monitorea cómo los usuarios interactúan con tu documentación.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfecto para APIs públicas donde la usabilidad es prioritaria.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. DocFX
&lt;/h2&gt;

&lt;h3&gt;
  
  
  La herramienta de documentación versátil
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://dotnet.github.io/docfx/index.html" rel="noopener noreferrer"&gt;DocFX&lt;/a&gt; es ideal para proyectos que requieren manejar varios tipos de documentación, no solo APIs.&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%2Fvcoxli2m73msotu8yhj2.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%2Fvcoxli2m73msotu8yhj2.png" alt="DocFX" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Características
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Soporte multilingüe:&lt;/strong&gt; Documenta tus APIs en varios idiomas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plantillas personalizables:&lt;/strong&gt; Ajusta el diseño según tu marca.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integración sencilla:&lt;/strong&gt; Conéctalo con otros servicios y flujos de trabajo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recomendado para proyectos complejos con necesidades de documentación mixtas.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. GitBook
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Documentación como código
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.gitbook.com/" rel="noopener noreferrer"&gt;GitBook&lt;/a&gt; es una plataforma moderna que facilita escribir, versionar y colaborar en documentación técnica.&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%2Ftpkeye5ro4k2bumqzy2e.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%2Ftpkeye5ro4k2bumqzy2e.png" alt="GitBook" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Ventajas clave
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Soporte de Markdown:&lt;/strong&gt; Flujo ágil con sintaxis sencilla.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control de versiones:&lt;/strong&gt; Integración con Git para historial de cambios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Colaboración:&lt;/strong&gt; Edición simultánea para equipos distribuidos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ideal para equipos que gestionan la documentación como parte del ciclo de desarrollo.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Stoplight
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Documentación de API con enfoque en el diseño
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://stoplight.io/" rel="noopener noreferrer"&gt;Stoplight&lt;/a&gt; facilita el diseño visual de APIs y la generación de documentación estructurada.&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%2F74rsa48a9c3p7hlygizy.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%2F74rsa48a9c3p7hlygizy.png" alt="Stoplight" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Puntos destacados
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Editor visual:&lt;/strong&gt; Diseña y documenta APIs de forma gráfica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Servidores simulados:&lt;/strong&gt; Prueba tus endpoints antes del despliegue real.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Colaboración:&lt;/strong&gt; Todo tu equipo puede participar en tiempo real.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfecto para quienes priorizan el diseño y la validación temprana de APIs.&lt;/p&gt;

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

&lt;p&gt;Estas son las 10 mejores herramientas para documentar APIs REST de manera profesional y eficiente. Tanto si trabajas solo como en equipo, elegir la herramienta adecuada optimizará tu flujo de desarrollo y la experiencia de quienes consumen tus APIs. Recuerda: la documentación es clave para el éxito de cualquier API.&lt;/p&gt;

&lt;p&gt;💡¿Listo para llevar tu documentación al siguiente nivel? Descarga Apidog gratis hoy mismo y explora todas sus funciones. ¡Haz la prueba y mejora tu flujo de trabajo API!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Mitos de Claude: Anthropic dice que este modelo es demasiado peligroso para lanzarlo</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Wed, 08 Apr 2026 06:43:14 +0000</pubDate>
      <link>https://forem.com/roobia/mitos-de-claude-anthropic-dice-que-este-modelo-es-demasiado-peligroso-para-lanzarlo-337o</link>
      <guid>https://forem.com/roobia/mitos-de-claude-anthropic-dice-que-este-modelo-es-demasiado-peligroso-para-lanzarlo-337o</guid>
      <description>&lt;h2&gt;
  
  
  En resumen
&lt;/h2&gt;

&lt;p&gt;Claude Mythos Preview parece ser un modelo restringido de Anthropic que se está probando a través del Proyecto Glasswing, un programa de vista previa enfocado en ciberseguridad y no en un lanzamiento público. Los números de referencia reportados sugieren que podría ser mucho más fuerte que Claude Opus 4.6 en tareas de ingeniería de software, pero Anthropic aún no lo ha lanzado ampliamente. La razón probable es el riesgo de doble uso: un modelo que ayuda a los defensores también puede ayudar a los atacantes.&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;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;Cada laboratorio de IA importante afirma priorizar la seguridad, pero pocos lo demuestran reteniendo un modelo potente en vez de lanzarlo al mercado rápidamente.&lt;/p&gt;

&lt;p&gt;Eso es lo que hace interesante a &lt;a href="https://www-cdn.anthropic.com/8b8380204f74670be75e81c820ca8dda846ab289.pdf" rel="noopener noreferrer"&gt;Claude Mythos Preview&lt;/a&gt;. Anthropic no lo ha anunciado como un lanzamiento convencional de Claude. No hay una API pública general, ni producto de chat estándar, ni página de "pruébalo ahora" para todos. En cambio, el modelo apareció en informes relacionados con el Proyecto Glasswing, un programa restringido centrado en ciberseguridad defensiva.&lt;/p&gt;

&lt;p&gt;Lo relevante no es solo el acceso restringido, sino que los números de referencia publicados para Claude Mythos Preview apuntan a un salto considerable respecto a Claude Opus 4.6 en tareas como SWE-Bench, relacionadas con la codificación. Si se confirman esos datos, Anthropic podría tener un modelo que cambie el equilibrio entre la ciberseguridad ofensiva y defensiva.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; Si construyes herramientas sobre APIs de modelos de IA, aquí es donde importa una estrategia API-first. Los laboratorios pueden exponer un modelo a socios restringidos mucho antes de un lanzamiento público. &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 modelar futuros flujos de API, simular endpoints restringidos y probar integraciones antes de que el acceso se abra. Úsalo para prototipar integraciones de modelos de IA sin depender del lanzamiento público.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es Claude Mythos Preview?
&lt;/h2&gt;

&lt;p&gt;Según reportes actuales, &lt;a href="https://www-cdn.anthropic.com/8b8380204f74670be75e81c820ca8dda846ab289.pdf" rel="noopener noreferrer"&gt;Claude Mythos Preview&lt;/a&gt; es un modelo de Anthropic no lanzado públicamente y disponible solo para socios e investigadores seleccionados de ciberseguridad defensiva.&lt;/p&gt;

&lt;p&gt;Esto no es un lanzamiento estándar como Sonnet u Opus, sino un acceso controlado y restringido a un caso de uso específico. Reuters reporta que Anthropic trabaja con socios como Amazon, Microsoft, Apple, Google, Nvidia, CrowdStrike y Palo Alto Networks en el Proyecto Glasswing, con el foco en investigación de ciberseguridad defensiva, no en consumidores masivos.&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%2Fu5segp8y06r03jd8kb4p.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%2Fu5segp8y06r03jd8kb4p.png" alt="image-88" width="800" height="268"&gt;&lt;/a&gt;&lt;br&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%2Fthydb0n6dkd5qaehqg1g.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%2Fthydb0n6dkd5qaehqg1g.png" alt="image-89" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En resumen: Claude Mythos Preview es un modelo de Anthropic de acceso restringido para seguridad defensiva, no un nuevo nivel público de Claude.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué el modelo está causando tanta atención
&lt;/h2&gt;

&lt;p&gt;La razón es directa: los números de referencia reportados son excepcionalmente altos.&lt;/p&gt;

&lt;p&gt;Según la cobertura reciente, Claude Mythos Preview logró:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Referencia&lt;/th&gt;
&lt;th&gt;Claude Mythos Preview&lt;/th&gt;
&lt;th&gt;Claude Opus 4.6&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SWE-Bench Verificado&lt;/td&gt;
&lt;td&gt;93.9%&lt;/td&gt;
&lt;td&gt;80.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SWE-Bench Pro&lt;/td&gt;
&lt;td&gt;77.8%&lt;/td&gt;
&lt;td&gt;53.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Si estos datos son correctos, el avance es significativo.&lt;/p&gt;

&lt;p&gt;SWE-Bench es una referencia pública clara de habilidad en ingeniería de software: evalúa si el modelo puede leer un repo, entender bugs, modificar código correctamente y resolver tareas bajo restricciones realistas. Mejorar tanto sobre Opus 4.6 sugiere un salto importante en capacidades agénticas y de codificación.&lt;/p&gt;

&lt;p&gt;Esto implica que Anthropic podría tener un modelo mucho más fuerte que el público y, aun así, decide no lanzarlo ampliamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué Anthropic podría estar manteniendo Claude Mythos en privado
&lt;/h2&gt;

&lt;p&gt;La explicación más probable: riesgo de doble uso.&lt;/p&gt;

&lt;p&gt;Un modelo capaz de ayudar a defensores a encontrar vulnerabilidades, analizar ataques, revisar código inseguro y automatizar remediaciones puede también facilitar flujos ofensivos. La capacidad que ayuda a un equipo azul a parchear, puede ayudar a un equipo rojo o atacante a moverse más rápido.&lt;/p&gt;

&lt;p&gt;Esto se agrava cuando el modelo:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comprende código a escala de repositorio
&lt;/li&gt;
&lt;li&gt;Usa herramientas autónomamente
&lt;/li&gt;
&lt;li&gt;Reproduce vulnerabilidades
&lt;/li&gt;
&lt;li&gt;Resuelve problemas de largo plazo
&lt;/li&gt;
&lt;li&gt;Encadena acciones sin perder contexto&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estas son justo las habilidades buscadas para agentes de código, y también las que preocupan en ciberseguridad.&lt;/p&gt;

&lt;p&gt;Anthropic ya había sugerido que los modelos frontera requieren estrategias de despliegue más específicas. Claude Mythos Preview es el ejemplo más claro: "Restringe primero, aprende de usuarios verificados y luego decide el siguiente paso", en vez de "lanza y parchea después".&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué parece significar el Proyecto Glasswing
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.anthropic.com/glasswing" rel="noopener noreferrer"&gt;El Proyecto Glasswing&lt;/a&gt; es el marco que contextualiza Mythos.&lt;/p&gt;

&lt;p&gt;No es simplemente "un modelo mejor". Es "un modelo mejor, pero solo socios defensivos de confianza pueden usarlo". Esto cambia la narrativa del producto.&lt;/p&gt;

&lt;p&gt;No hay un lanzamiento para consumidores; es un programa de vista previa de seguridad. El KPI no es el crecimiento masivo, sino la evaluación controlada: entender qué puede hacer el modelo, qué riesgos aparecen y si las salvaguardas son suficientes.&lt;/p&gt;

&lt;p&gt;Esto es un cambio relevante: las compañías de IA han buscado acceso público masivo mientras hablan de seguridad. Glasswing sugiere lo contrario: los sistemas más potentes pueden primero ir a implementaciones sectoriales limitadas bajo pruebas reales.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Es Claude Mythos más fuerte que Opus 4.6?
&lt;/h2&gt;

&lt;p&gt;Según los números reportados, podría serlo.&lt;/p&gt;

&lt;p&gt;Concretamente:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Los números sugieren que Claude Mythos Preview supera a Opus 4.6 en tareas de SWE-Bench
&lt;/li&gt;
&lt;li&gt;Anthropic lo trata como modelo de mayor riesgo
&lt;/li&gt;
&lt;li&gt;No hay implementación pública estándar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pero no se puede afirmar con certeza:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Que sea más fuerte en &lt;em&gt;todas&lt;/em&gt; las categorías
&lt;/li&gt;
&lt;li&gt;Que las condiciones de comparación fueran idénticas
&lt;/li&gt;
&lt;li&gt;Que usuarios públicos verían las mismas mejoras&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La versión cauta: Claude Mythos Preview parece significativamente más fuerte que Opus 4.6 en benchmarks clave de codificación, y tan capaz que Anthropic restringe el acceso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué podría significar esto para los desarrolladores
&lt;/h2&gt;

&lt;p&gt;Para la mayoría, Claude Mythos no está disponible hoy, pero es relevante porque apunta al futuro de los modelos de codificación.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tres implicaciones clave:&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Los modelos públicos de Claude pueden no reflejar el límite de Anthropic
&lt;/h3&gt;

&lt;p&gt;El mejor modelo público de Claude puede estar muy lejos de la mejor capacidad interna. Mythos Preview sugiere que la brecha puede ser mayor de lo que muchos asumían.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. La capacidad cibernética podría ser el principal cuello de botella para el lanzamiento
&lt;/h3&gt;

&lt;p&gt;La restricción principal ya no es la calidad, sino si el modelo supera el umbral de riesgo de uso indebido ofensivo.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Los mejores modelos pueden llegar primero a través de programas empresariales restringidos
&lt;/h3&gt;

&lt;p&gt;En vez de lanzamientos públicos, los sistemas más potentes pueden aparecer primero en redes de socios, pilotos industriales y vistas previas controladas.&lt;/p&gt;

&lt;p&gt;Esto impacta cómo los desarrolladores planifican su hoja de ruta, evalúan proveedores y consideran el riesgo de acceso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué podría significar esto para la industria de la IA
&lt;/h2&gt;

&lt;p&gt;Claude Mythos Preview puede ser más relevante como señal que como producto.&lt;/p&gt;

&lt;p&gt;Si Anthropic retiene un modelo por riesgo cibernético, otros laboratorios podrían hacer lo mismo. Eso crearía un mercado dual:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modelos públicos con acceso amplio y restricciones
&lt;/li&gt;
&lt;li&gt;Modelos restringidos con más capacidades y acceso controlado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto afecta la evaluación comparativa: un laboratorio puede tener un sistema mucho más potente que el público, mientras compite con un lanzamiento más seguro y débil. También dificulta juzgar la frontera real solo por las APIs públicas.&lt;/p&gt;

&lt;p&gt;Políticamente, este es el caso que legisladores y expertos de seguridad anticipaban: ¿pueden los laboratorios lanzar modelos que ayuden defensivamente sin facilitar el uso ofensivo? Claude Mythos Preview es un ejemplo de un laboratorio enfrentando este dilema en tiempo real.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Deberían los desarrolladores preocuparse ahora mismo?
&lt;/h2&gt;

&lt;p&gt;Sí, pero no porque debas cambiar de herramientas hoy.&lt;/p&gt;

&lt;p&gt;La preocupación está en cómo interpretar los anuncios:&lt;br&gt;&lt;br&gt;
Cuando un laboratorio dice que su modelo público es el "mejor disponible", puede que no sea su modelo más potente, solo el más potente que están dispuestos a lanzar abiertamente. Eso cambia la perspectiva.&lt;/p&gt;

&lt;p&gt;También afecta el posicionamiento competitivo: si Anthropic retiene un modelo de codificación más fuerte, las comparaciones entre Claude, GPT, Gemini, GLM y open weights pueden subestimar el poder real de los sistemas privados.&lt;/p&gt;

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

&lt;p&gt;Claude Mythos Preview no es un producto normal. Es un modelo restringido de Anthropic que puede ser mucho más fuerte que Claude Opus 4.6 en ingeniería de software, y lo bastante delicado como para que Anthropic decida no lanzarlo ampliamente.&lt;/p&gt;

&lt;p&gt;Eso lo convierte en una de las historias más relevantes de IA del momento.&lt;/p&gt;

&lt;p&gt;Si los benchmarks reportados son precisos, el titular no es solo que Anthropic haya creado un modelo mejor, sino que ya podría estar operando en un entorno donde algunos modelos frontera son demasiado capaces, o demasiado riesgosos, para un lanzamiento inmediato.&lt;/p&gt;

&lt;p&gt;Esto marcaría un cambio en cómo los sistemas avanzados de IA llegan al mercado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas Frecuentes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;¿Qué es Claude Mythos Preview?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Según reportes actuales, es un modelo de vista previa restringido de Anthropic, probado con socios seleccionados de ciberseguridad defensiva, no lanzado públicamente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Está Claude Mythos disponible para el público?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No hay lanzamiento público anunciado. Los reportes indican acceso restringido vía Proyecto Glasswing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Es Claude Mythos más fuerte que Claude Opus 4.6?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Los benchmarks reportados indican que podría ser significativamente más fuerte en tareas de codificación tipo SWE-Bench, aunque no necesariamente en todas las categorías.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué es el Proyecto Glasswing?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
El Proyecto Glasswing es el programa de acceso restringido de Anthropic para evaluar Claude Mythos Preview en entornos de ciberseguridad defensiva.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Por qué Anthropic retendría un modelo más fuerte?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Probablemente por riesgo de doble uso: un modelo que ayuda a defensores también puede facilitar el uso ofensivo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Pueden los desarrolladores usar Claude Mythos hoy?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No de forma general. Por ahora, el acceso parece limitado a socios e investigadores seleccionados, no usuarios públicos de API.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo usar GLM-5.1 con Claude Code: Guía completa de configuración</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Wed, 08 Apr 2026 06:12:12 +0000</pubDate>
      <link>https://forem.com/roobia/como-usar-glm-51-con-claude-code-guia-completa-de-configuracion-4m5n</link>
      <guid>https://forem.com/roobia/como-usar-glm-51-con-claude-code-guia-completa-de-configuracion-4m5n</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Puedes usar GLM-5.1 con Claude Code enrutando Claude Code a través de la API compatible con OpenAI de BigModel. Configura la URL base en &lt;code&gt;https://open.bigmodel.cn/api/paas/v4/&lt;/code&gt;, usa el nombre del modelo &lt;code&gt;glm-5.1&lt;/code&gt; y autentícate con tu clave API de BigModel. Una vez configurado, Claude Code puede usar GLM-5.1 para tareas de codificación, exploración de repositorios, refactorización y flujos de trabajo de agente más largos.&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;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;Claude Code es una de las mejores interfaces para la codificación asistida por IA, pero la interfaz y el modelo son dos cosas separadas. Si tu configuración de Claude Code admite proveedores compatibles con OpenAI, puedes intercambiar el modelo de backend y probar un motor de codificación diferente sin cambiar demasiado tu flujo de trabajo.&lt;/p&gt;

&lt;p&gt;Eso hace que GLM-5.1 sea interesante. Z.AI lanzó GLM-5.1 como su modelo estrella para ingeniería de agentes, y los resultados publicados son sólidos: #1 en SWE-Bench Pro, un gran salto sobre GLM-5 en Terminal-Bench 2.0 y un comportamiento mucho mejor a largo plazo en tareas de codificación que se ejecutan durante muchas iteraciones. Si te gusta cómo Claude Code maneja las herramientas, los archivos y la codificación iterativa, vale la pena probar GLM-5.1 detrás de esa misma interfaz.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Si estás comparando backends de modelos para un flujo de trabajo de codificación, Apidog te ayuda con la parte de la API. Puedes documentar el endpoint de BigModel, simular respuestas compatibles con OpenAI y probar cómo tus herramientas internas manejan diferentes proveedores antes de conectarlos a sistemas de producción. Descarga Apidog gratis si quieres comparar APIs de modelos lado a lado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esta guía muestra la configuración completa, cómo funciona la ruta de solicitud, qué esperar de GLM-5.1 en Claude Code, problemas comunes y cómo decidir si este cambio vale la pena para tu flujo de trabajo.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué usar GLM-5.1 con Claude Code?
&lt;/h2&gt;

&lt;p&gt;Hay tres razones principales:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Quieres el flujo de trabajo de Claude Code, pero un modelo diferente
&lt;/h3&gt;

&lt;p&gt;Claude Code es útil por cómo funciona: puede inspeccionar archivos, proponer ediciones, iterar sobre errores y permanecer dentro de un bucle de codificación. Si tu configuración permite proveedores personalizados compatibles con OpenAI, puedes mantener ese flujo de trabajo mientras cambias el modelo subyacente.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. GLM-5.1 está diseñado para sesiones de codificación largas
&lt;/h3&gt;

&lt;p&gt;GLM-5.1 destaca en mantenerse útil en ejecuciones largas. Z.AI mostró que mejoraba a través de cientos de iteraciones y miles de llamadas a herramientas en tareas de optimización. Eso se adapta bien al uso de estilo Claude Code donde no sólo haces una pregunta, sino ejecutas una sesión de codificación completa.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Quieres otra opción de costo/rendimiento
&lt;/h3&gt;

&lt;p&gt;GLM-5.1 puede ser una alternativa práctica para sesiones de mucha codificación. La API de BigModel usa cuota en vez de precios por token, por lo que para algunos equipos puede ser mejor que pagar por sesión directamente a Anthropic u OpenAI.&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%2Fwsk0rku7nw47otcpnfxo.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%2Fwsk0rku7nw47otcpnfxo.png" alt="Un gráfico de flujo de trabajo de una aplicación de IA, que muestra cómo la interfaz de usuario se conecta a la API, que luego enruta a los modelos de IA de BigModel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para una descripción general completa del modelo y el contexto de los benchmarks, consulta &lt;a href="http://apidog.com/blog/glm-5-1/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;qué es GLM-5.1&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lo que necesitas antes de la configuración
&lt;/h2&gt;

&lt;p&gt;Asegúrate de tener lo siguiente:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Una cuenta de BigModel en &lt;code&gt;https://bigmodel.cn&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Una clave API de BigModel&lt;/li&gt;
&lt;li&gt;Claude Code instalado localmente&lt;/li&gt;
&lt;li&gt;Una versión o ruta de configuración de Claude Code que admita proveedores personalizados compatibles con OpenAI&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El punto clave es el último. GLM-5.1 no se conecta a Claude Code con un SDK especial, sino porque la API de BigModel es compatible con OpenAI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Los valores exactos que necesitas
&lt;/h2&gt;

&lt;p&gt;Solo necesitas estos tres valores para que el enrutamiento funcione:&lt;/p&gt;

&lt;h3&gt;
  
  
  URL base
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://open.bigmodel.cn/api/paas/v4/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Nombre del modelo
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Encabezado de autorización
&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;Authorization: Bearer TU_CLAVE_API_DE_BIGMODEL
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eso es todo lo esencial. El resto es dónde colocar estos valores en Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 1: crea y almacena tu clave API de BigModel
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Abre la consola de desarrolladores de BigModel y genera una clave API.&lt;/li&gt;
&lt;li&gt;Guárdala como variable de entorno:
&lt;/li&gt;
&lt;/ol&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;BIGMODEL_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"tu_clave_api_aquí"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Si usas &lt;code&gt;zsh&lt;/code&gt;, pon esa línea en &lt;code&gt;~/.zshrc&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Si usas &lt;code&gt;bash&lt;/code&gt;, ponla en &lt;code&gt;~/.bashrc&lt;/code&gt; o &lt;code&gt;~/.bash_profile&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recarga tu shell:&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;source&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifica que se cargó:&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;$BIGMODEL_API_KEY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deberías ver la clave impresa. Si no aparece nada, Claude Code no podrá autenticarse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consejo:&lt;/strong&gt; Usar variables de entorno es más seguro y fácil de rotar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 2: actualiza la configuración de Claude Code
&lt;/h2&gt;

&lt;p&gt;La configuración suele estar en:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Ejemplo mínimo compatible con 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;"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;"glm-5.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;"baseURL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://open.bigmodel.cn/api/paas/v4/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"apiKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tu_clave_api_de_bigmodel"&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;Si tu versión admite variables de entorno:&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;"glm-5.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;"baseURL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://open.bigmodel.cn/api/paas/v4/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"apiKeyEnv"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BIGMODEL_API_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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Revisa los nombres de los campos según tu versión. El patrón siempre es:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proveedor compatible con OpenAI&lt;/li&gt;
&lt;li&gt;URL base: BigModel&lt;/li&gt;
&lt;li&gt;Modelo: &lt;code&gt;glm-5.1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Autenticación: tu clave&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si ya usabas otro proveedor compatible OpenAI, este cambio es rápido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 3: entiende lo que Claude Code está haciendo entre bastidores
&lt;/h2&gt;

&lt;p&gt;Claude Code envía solicitudes de completado de chat al estilo OpenAI a BigModel.&lt;/p&gt;

&lt;p&gt;Solicitud 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://open.bigmodel.cn/api/paas/v4/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;$BIGMODEL_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": "glm-5.1",
    "messages": [
      {
        "role": "user",
        "content": "Escribe una función en Python que elimine las líneas duplicadas de un archivo."
      }
    ],
    "max_tokens": 2048,
    "temperature": 0.7
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por eso funciona la integración: Claude Code sólo necesita un backend que hable el formato OpenAI.&lt;/p&gt;

&lt;p&gt;Para ejemplos de Python y Node, revisa &lt;a href="http://apidog.com/blog/how-to-use-glm-5-1-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo usar la API de GLM-5.1&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 4: ejecuta primero una pequeña tarea de validación
&lt;/h2&gt;

&lt;p&gt;Antes de usar un repositorio grande, prueba una tarea sencilla como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Escribe un script de Python que escanee una carpeta en busca de archivos JSON e imprima los inválidos.
&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;Refactoriza esta función para mejorar la legibilidad y añade pruebas.
&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;Lee este archivo, explica qué hace y sugiere dos mejoras seguras.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifica:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Claude Code acepta la configuración&lt;/li&gt;
&lt;li&gt;La autenticación de BigModel funciona&lt;/li&gt;
&lt;li&gt;GLM-5.1 devuelve respuestas correctas&lt;/li&gt;
&lt;li&gt;El uso de herramientas en Claude Code funciona bien&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si todo pasa, puedes probar con un repositorio real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mejores tareas para GLM-5.1 dentro de Claude Code
&lt;/h2&gt;

&lt;p&gt;GLM-5.1 es más fuerte en sesiones de codificación iterativas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Buenas opciones:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Corrección de errores en varios archivos&lt;/li&gt;
&lt;li&gt;Exploración y resumen de repositorios&lt;/li&gt;
&lt;li&gt;Generación y reparación de pruebas&lt;/li&gt;
&lt;li&gt;Refactorización iterativa&lt;/li&gt;
&lt;li&gt;Ajuste de rendimiento&lt;/li&gt;
&lt;li&gt;Bucles de agente largos&lt;/li&gt;
&lt;li&gt;Mejoras basadas en benchmarks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Opciones menos ideales:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Escritura pura de texto&lt;/li&gt;
&lt;li&gt;Preguntas cortas&lt;/li&gt;
&lt;li&gt;Ediciones muy pequeñas&lt;/li&gt;
&lt;li&gt;Flujos donde el estilo nativo de Claude es más valioso que el backend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El mejor uso es cuando quieres productividad sostenida en sesiones largas.&lt;/p&gt;

&lt;h2&gt;
  
  
  GLM-5.1 vs Claude dentro de Claude Code
&lt;/h2&gt;

&lt;p&gt;No hay un ganador absoluto. Claude destaca en ediciones que requieren mucho razonamiento y navegación compleja. GLM-5.1 es competitivo en tareas de tipo SWE-Bench y sesiones impulsadas por herramientas.&lt;/p&gt;

&lt;p&gt;Haz pruebas en la misma tarea y compara:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calidad del código&lt;/li&gt;
&lt;li&gt;Número de turnos requeridos&lt;/li&gt;
&lt;li&gt;Tasa de aprobación de pruebas&lt;/li&gt;
&lt;li&gt;Uso de herramientas&lt;/li&gt;
&lt;li&gt;Latencia&lt;/li&gt;
&lt;li&gt;Costo/cuota&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si GLM-5.1 logra buena calidad y menor costo, puede ser tu backend ideal. Si Claude sigue siendo mejor para tu flujo, mantente con él.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problemas comunes y soluciones
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Autenticación fallida
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Verifica la clave en una solicitud &lt;code&gt;curl&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Asegúrate de que la variable de entorno esté cargada&lt;/li&gt;
&lt;li&gt;El archivo de configuración debe apuntar al campo correcto&lt;/li&gt;
&lt;li&gt;Revisa espacios y comillas&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Modelo no encontrado
&lt;/h3&gt;

&lt;p&gt;El nombre debe ser &lt;strong&gt;exactamente&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Claude Code ignora el proveedor personalizado
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Guarda la configuración&lt;/li&gt;
&lt;li&gt;Reinicia Claude Code&lt;/li&gt;
&lt;li&gt;Haz primero una prueba pequeña&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Solicitudes OK pero mala calidad de salida
&lt;/h3&gt;

&lt;p&gt;GLM-5.1 es más fuerte en sesiones largas, no en prompts simples.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduce la temperatura&lt;/li&gt;
&lt;li&gt;Da instrucciones claras y específicas&lt;/li&gt;
&lt;li&gt;Úsalo en tareas iterativas&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  La cuota se agota muy rápido
&lt;/h3&gt;

&lt;p&gt;Las horas pico cuestan más en BigModel. Si puedes, programa sesiones largas en horas de menor actividad.&lt;/p&gt;

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

&lt;p&gt;Para validar la configuración, usa Apidog para probar el endpoint de BigModel antes o junto con Claude Code.&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%2Fweca3nc8eqwzzeqiufy2.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%2Fweca3nc8eqwzzeqiufy2.png" alt="Captura de pantalla de la interfaz de Apidog que muestra un endpoint de API para chat/completions con una solicitud de GLM-5.1"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Define el endpoint de completación de chat de BigModel en Apidog&lt;/li&gt;
&lt;li&gt;Guarda una solicitud con el modelo &lt;code&gt;glm-5.1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Prueba una respuesta normal&lt;/li&gt;
&lt;li&gt;Prueba errores como autenticación inválida o límites de velocidad&lt;/li&gt;
&lt;li&gt;Simula el endpoint para pruebas internas sin consumir cuota&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esto es útil si construyes envoltorios alrededor de herramientas de IA o enrutamiento entre modelos. Con Smart Mock y Test Scenarios de Apidog puedes validar la API sin depender del editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Deberías usar GLM-5.1 con Claude Code?
&lt;/h2&gt;

&lt;p&gt;Sí, si quieres probar un modelo fuerte sin perder el flujo de Claude Code.&lt;/p&gt;

&lt;p&gt;Vale la pena intentarlo si:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usas Claude Code a diario&lt;/li&gt;
&lt;li&gt;Haces sesiones de codificación de varios pasos&lt;/li&gt;
&lt;li&gt;Buscas otra opción de backend&lt;/li&gt;
&lt;li&gt;Eres sensible al costo&lt;/li&gt;
&lt;li&gt;Quieres comparar varios modelos en el mismo flujo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si tu trabajo es más de edición corta y razonamiento, Claude sigue siendo excelente. Pero si buscas productividad sostenida, GLM-5.1 es un buen candidato.&lt;/p&gt;

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

&lt;p&gt;Usar GLM-5.1 con Claude Code es más sencillo de lo que parece. Sólo necesitas la clave API de BigModel, la URL base y el modelo &lt;code&gt;glm-5.1&lt;/code&gt;. La API compatible con OpenAI hace que el enrutamiento sea familiar y fácil de probar.&lt;/p&gt;

&lt;p&gt;La razón real para hacerlo es comprobar si GLM-5.1 es suficientemente bueno en tu flujo real de Claude Code como para justificarlo como backend. Si haces codificación larga, correcciones iterativas y flujos intensivos en herramientas, vale la pena probarlo.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;¿Puede Claude Code usar GLM-5.1 directamente?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí, si tu configuración admite proveedores personalizados compatibles con OpenAI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué URL base debo usar?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;https://open.bigmodel.cn/api/paas/v4/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué nombre de modelo debo introducir?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;glm-5.1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Necesito un SDK GLM especial?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. GLM-5.1 funciona vía la API de BigModel compatible con OpenAI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo usar GLM-5.1 con otras herramientas de codificación también?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí. El mismo patrón funciona para herramientas como Cline, Roo Code y OpenCode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Es GLM-5.1 mejor que Claude para todas las tareas de codificación?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. Depende del flujo de trabajo; prueba ambos en tus tareas reales y compara resultados.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo usar la API GLM-5.1: guía completa con ejemplos de código</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Wed, 08 Apr 2026 05:50:14 +0000</pubDate>
      <link>https://forem.com/roobia/como-usar-la-api-glm-51-guia-completa-con-ejemplos-de-codigo-o4o</link>
      <guid>https://forem.com/roobia/como-usar-la-api-glm-51-guia-completa-con-ejemplos-de-codigo-o4o</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;GLM-5.1 está disponible vía la API de BigModel en &lt;code&gt;https://open.bigmodel.cn/api/paas/v4/&lt;/code&gt;. La API es compatible con OpenAI: misma estructura de endpoint, formato de solicitud y patrón de streaming. Solo necesitas una cuenta de BigModel, una clave API y el nombre del modelo &lt;code&gt;glm-5.1&lt;/code&gt;. Esta guía muestra autenticación, primera solicitud, streaming, llamada a herramientas y cómo probar tu integración con 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%2Frwj1xywo0a4e75uuhqi6.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%2Frwj1xywo0a4e75uuhqi6.png" alt="Cómo usar la API de GLM-5.1 de Z.AI"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

&lt;p&gt;&lt;a href="http://apidog.com/blog/glm-5-1/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GLM-5.1 es el modelo agéntico insignia de Z.AI&lt;/a&gt;, lanzado en abril de 2026. Es #1 en SWE-Bench Pro y supera a GLM-5 en los principales benchmarks de codificación. Si desarrollas asistentes de codificación IA, agentes autónomos o apps que requieren tareas de larga duración, integra GLM-5.1.&lt;/p&gt;

&lt;p&gt;La API es 100% compatible con OpenAI. Si ya usas GPT-4 o Claude, cambia solo la URL base y el nombre del modelo. No necesitas aprender un nuevo SDK ni lidiar con formatos de respuesta diferentes.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; El mayor reto con APIs agénticas es la prueba. Los agentes pueden ejecutar cientos de llamadas a herramientas en minutos, difícil de testear sin consumir cuota. Apidog soluciona esto: define toda la secuencia de solicitudes, simula respuestas para cada estado y verifica que tu integración maneje correctamente streaming, llamadas a herramientas y errores antes de producción. &lt;/p&gt;

&lt;h2&gt;
  
  
  Requisitos previos
&lt;/h2&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cuenta en BigModel&lt;/strong&gt; en &lt;a href="https://bigmodel.cn" rel="noopener noreferrer"&gt;bigmodel.cn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clave API&lt;/strong&gt; desde la consola de BigModel, sección “API Keys”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python 3.8+&lt;/strong&gt; o &lt;strong&gt;Node.js 18+&lt;/strong&gt; (los ejemplos cubren ambos)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SDK de OpenAI&lt;/strong&gt; o librerías estándar &lt;code&gt;requests&lt;/code&gt;/&lt;code&gt;fetch&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Configura la clave API 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;BIGMODEL_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"tu_clave_api_aquí"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nunca incluyas claves API en el código fuente.&lt;/p&gt;

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

&lt;p&gt;Cada solicitud requiere este encabezado:&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 TU_CLAVE_API
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La clave API de BigModel tiene formato &lt;code&gt;xxxxxxxx.xxxxxxxxxxxxxxxx&lt;/code&gt; (dos bloques separados por punto). No uses el prefijo &lt;code&gt;sk-&lt;/code&gt;, pero funciona igual en el header.&lt;/p&gt;

&lt;h3&gt;
  
  
  URL base
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://open.bigmodel.cn/api/paas/v4/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El endpoint de chat:&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://open.bigmodel.cn/api/paas/v4/chat/completions
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tu primera solicitud
&lt;/h2&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://open.bigmodel.cn/api/paas/v4/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;$BIGMODEL_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": "glm-5.1",
    "messages": [
      {
        "role": "user",
        "content": "Escribe una función en Python que encuentre todos los números primos hasta n usando la Criba de Eratóstenes."
      }
    ],
    "max_tokens": 1024,
    "temperature": 0.7
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usando Python (requests)
&lt;/h3&gt;



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

&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BIGMODEL_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://open.bigmodel.cn/api/paas/v4/chat/completions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;glm-5.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Escribe una función en Python que encuentre todos los números primos hasta n usando la Criba de Eratóstenes.&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;max_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usando el SDK de OpenAI (recomendado)
&lt;/h3&gt;

&lt;p&gt;Puedes usar el SDK oficial de OpenAI para Python con URL base personalizada:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BIGMODEL_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://open.bigmodel.cn/api/paas/v4/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="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;glm-5.1&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;Escribe una función en Python que encuentre todos los números primos hasta n usando la Criba de Eratóstenes.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1024&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.7&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;Este método es ideal: el SDK maneja reintentos, timeouts y parsing de respuestas automáticamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Formato de respuesta
&lt;/h2&gt;

&lt;p&gt;La estructura es idéntica a 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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chatcmpl-abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chat.completion"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1744000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"glm-5.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;"choices"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"assistant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"def sieve_of_eratosthenes(n):&lt;/span&gt;&lt;span class="se"&gt;\n&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="nl"&gt;"finish_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stop"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="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;32&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;215&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;247&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;Accede al texto con: &lt;code&gt;result["choices"][0]["message"]["content"]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;El campo &lt;code&gt;usage&lt;/code&gt; muestra el conteo de tokens. Monitorea esto para controlar tu consumo, ya que GLM-5.1 cobra 3x cuota durante horas pico (14:00-18:00 UTC+8).&lt;/p&gt;

&lt;h2&gt;
  
  
  Respuestas en streaming
&lt;/h2&gt;

&lt;p&gt;Para peticiones largas (por ejemplo, generación de código), habilita streaming para recibir tokens conforme se generan.&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BIGMODEL_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://open.bigmodel.cn/api/paas/v4/&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="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;glm-5.1&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;Explica cómo funciona un índice B-tree en una base de datos, con un ejemplo de código.&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;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&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;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Nueva línea al finalizar
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada chunk contiene solo los nuevos tokens. El último chunk tiene &lt;code&gt;finish_reason: "stop"&lt;/code&gt; (o &lt;code&gt;"length"&lt;/code&gt; si se alcanza el límite).&lt;/p&gt;

&lt;h3&gt;
  
  
  Streaming con requests raw
&lt;/h3&gt;



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

&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BIGMODEL_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://open.bigmodel.cn/api/paas/v4/chat/completions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;glm-5.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="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;Escribe una ordenación por mezcla en Python.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iter_lines&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;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[DONE]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;
            &lt;span class="n"&gt;chunk&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;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;choices&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;delta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="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="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;delta&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="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;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Llamada a herramientas
&lt;/h2&gt;

&lt;p&gt;GLM-5.1 soporta llamada a herramientas: permite que el modelo solicite ejecución de funciones durante la conversación. Es clave para flujos agénticos (ejecutar código, buscar en bases de datos, llamar APIs externas, etc).&lt;/p&gt;

&lt;h3&gt;
  
  
  Definiendo herramientas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&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;BIGMODEL_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://open.bigmodel.cn/api/paas/v4/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;run_python&lt;/span&gt;&lt;span class="sh"&gt;"&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;Ejecuta código Python y devuelve la salida. Usa esto para probar, perfilar o comparar código.&lt;/span&gt;&lt;span class="sh"&gt;"&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;code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;El código Python a ejecutar&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;code&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="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;read_file&lt;/span&gt;&lt;span class="sh"&gt;"&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;Lee el contenido de un archivo&lt;/span&gt;&lt;span class="sh"&gt;"&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;path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ruta del archivo a leer&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;path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;glm-5.1&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;Escribe una función para calcular números de Fibonacci, pruébala para n=10 y muéstrame la salida.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tool_choice&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Razón de finalización: &lt;/span&gt;&lt;span class="si"&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;finish_reason&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tool_call&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Herramienta llamada: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Argumentos: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Manejo de las respuestas de llamadas a herramientas
&lt;/h3&gt;

&lt;p&gt;Cuando GLM-5.1 solicita una herramienta, ejecuta la función y retorna el resultado en el siguiente mensaje:&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;subprocess&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Ejecuta la herramienta y devuelve el resultado.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
    &lt;span class="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;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&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;run_python&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&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="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-c&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="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;code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt;
            &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;

    &lt;span class="k"&gt;elif&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;read_file&lt;/span&gt;&lt;span class="sh"&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;with&lt;/span&gt; &lt;span class="nf"&gt;open&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;path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;FileNotFoundError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error: archivo &lt;/span&gt;&lt;span class="si"&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;path&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; no encontrado&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Herramienta desconocida: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_agent_loop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_iterations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Ejecuta un bucle completo de agente con llamadas a herramientas.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_message&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;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_iterations&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;glm-5.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;tool_choice&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4096&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;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model_dump&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;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;finish_reason&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;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;finish_reason&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_calls&lt;/span&gt;&lt;span class="sh"&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;tool_call&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;tool_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;execute_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_call_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tool_result&lt;/span&gt;
                &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Se alcanzó el número máximo de iteraciones&lt;/span&gt;&lt;span class="sh"&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;run_agent_loop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Escribe una implementación de Quicksort, pruébala con una lista aleatoria de 1000 enteros y reporta el tiempo.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este patrón explota la fortaleza agéntica de GLM-5.1: el modelo decide cuándo llamar herramientas y sigue hasta terminar o encontrar solución.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parámetros clave
&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;Predeterminado&lt;/th&gt;
&lt;th&gt;Descripción&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;cadena&lt;/td&gt;
&lt;td&gt;requerido&lt;/td&gt;
&lt;td&gt;Usa &lt;code&gt;"glm-5.1"&lt;/code&gt;
&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;requerido&lt;/td&gt;
&lt;td&gt;Historial de conversación&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;entero&lt;/td&gt;
&lt;td&gt;1024&lt;/td&gt;
&lt;td&gt;Tokens a generar (hasta 163.840)&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;flotante&lt;/td&gt;
&lt;td&gt;0.95&lt;/td&gt;
&lt;td&gt;Aleatoriedad (0.0-1.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;top_p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;flotante&lt;/td&gt;
&lt;td&gt;0.7&lt;/td&gt;
&lt;td&gt;Muestreo de núcleo (recom. 0.7 para codificación)&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;booleano&lt;/td&gt;
&lt;td&gt;falso&lt;/td&gt;
&lt;td&gt;Habilitar streaming&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;nulo&lt;/td&gt;
&lt;td&gt;Definiciones de funciones para llamada a herramientas&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;cadena/objeto&lt;/td&gt;
&lt;td&gt;"auto"&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;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;cadena/array&lt;/td&gt;
&lt;td&gt;nulo&lt;/td&gt;
&lt;td&gt;Secuencias de detención personalizadas&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Configuración recomendada para tareas de codificación:&lt;/strong&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="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;glm-5.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;top_p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;163840&lt;/span&gt;  &lt;span class="c1"&gt;# contexto completo para ejecuciones agénticas largas
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para generación determinista, baja la temperatura a 0.2-0.4.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usando GLM-5.1 con asistentes de codificación
&lt;/h2&gt;

&lt;p&gt;Puedes enrutar Claude Code, Cline, Kilo Code y otros asistentes IA vía la API de BigModel para usar GLM-5.1 como backend de codificación.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuración de Claude Code
&lt;/h3&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;"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;"glm-5.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;"baseURL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://open.bigmodel.cn/api/paas/v4/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"apiKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tu_clave_api_de_bigmodel"&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 de Cline / Roo Code
&lt;/h3&gt;

&lt;p&gt;En la configuración de VS Code o la extensión Cline:&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;"cline.apiProvider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openai"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cline.openAIBaseURL"&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://open.bigmodel.cn/api/paas/v4/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cline.openAIApiKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tu_clave_api_de_bigmodel"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cline.openAIModelId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"glm-5.1"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Consumo de cuota
&lt;/h3&gt;

&lt;p&gt;GLM-5.1 usa sistema de cuotas Z.AI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Horas pico (14:00-18:00 UTC+8): 3x cuota&lt;/li&gt;
&lt;li&gt;Fuera de pico: 2x cuota&lt;/li&gt;
&lt;li&gt;Promoción hasta abril 2026: 1x fuera de pico&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para cargas pesadas, programa tareas largas fuera de horas pico.&lt;/p&gt;

&lt;h2&gt;
  
  
  Probando la API de GLM-5.1 con Apidog
&lt;/h2&gt;

&lt;p&gt;Testear integraciones agénticas requiere simular múltiples tipos de respuesta: normal, streaming, llamadas a herramientas, errores, etc. Hacerlo contra la API real gasta cuota y depende de conexión activa.&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%2Fzxt99yzuso3v67x35fnz.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%2Fzxt99yzuso3v67x35fnz.png" alt="Prueba la API de GLM-5.1 de Z.AI con Apidog"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Smart Mock de Apidog permite definir estos estados y probar sin tocar la API real.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configurando el endpoint mock
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;En Apidog, crea un endpoint: &lt;code&gt;POST https://open.bigmodel.cn/api/paas/v4/chat/completions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Añade una expectativa de mock para respuesta estándar:
&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chatcmpl-test123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chat.completion"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1744000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"glm-5.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;"choices"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"assistant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"def sieve(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;span class="nl"&gt;"finish_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stop"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="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;32&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;120&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;152&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;ol&gt;
&lt;li&gt;Añade expectativa para llamada a herramienta:
&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chatcmpl-tool456"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chat.completion"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1744000001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"glm-5.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;"choices"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"assistant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"tool_calls"&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;"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;"call_abc"&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;"function"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"function"&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;"run_python"&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="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;code&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;print(2+2)&lt;/span&gt;&lt;span class="se"&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="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"finish_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tool_calls"&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;48&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;35&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;83&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;ol&gt;
&lt;li&gt;Añade respuesta de límite de tasa (HTTP 429):
&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;"error"&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="s2"&gt;"Límite de tasa excedido. Inténtalo de nuevo después de 60 segundos."&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;"rate_limit_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate_limit_exceeded"&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;
  
  
  Probando el bucle completo del agente
&lt;/h3&gt;

&lt;p&gt;Usa los Escenarios de Prueba de Apidog para encadenar solicitudes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Paso 1:&lt;/strong&gt; POST a &lt;code&gt;/chat/completions&lt;/code&gt; con el mensaje inicial, verifica &lt;code&gt;200&lt;/code&gt; y &lt;code&gt;finish_reason == "tool_calls"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paso 2:&lt;/strong&gt; POST con el resultado de la herramienta, verifica &lt;code&gt;200&lt;/code&gt; y &lt;code&gt;finish_reason == "stop"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paso 3:&lt;/strong&gt; Extrae el contenido final y verifica que incluye el código esperado&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Así pruebas todo el ciclo agéntico sin consumir cuota. Para manejo de errores, simula mocks que devuelvan 429 y verifica el reintento.&lt;/p&gt;

&lt;p&gt;Con Escenarios de Prueba puedes pasar variables entre pasos (por ejemplo, IDs de llamada a herramienta) y simular el flujo real de un agente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manejo de errores
&lt;/h2&gt;

&lt;p&gt;La API usa códigos HTTP estándar:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Estado&lt;/th&gt;
&lt;th&gt;Significado&lt;/th&gt;
&lt;th&gt;Acción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;Éxito&lt;/td&gt;
&lt;td&gt;Procesa la respuesta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;Solicitud incorrecta&lt;/td&gt;
&lt;td&gt;Revisa el formato de tu solicitud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;401&lt;/td&gt;
&lt;td&gt;No autorizado&lt;/td&gt;
&lt;td&gt;Verifica tu clave API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;429&lt;/td&gt;
&lt;td&gt;Límite de tasa&lt;/td&gt;
&lt;td&gt;Reintenta tras el valor del header &lt;code&gt;Retry-After&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;Error servidor&lt;/td&gt;
&lt;td&gt;Reintenta con retroceso exponencial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;503&lt;/td&gt;
&lt;td&gt;Servicio no disp.&lt;/td&gt;
&lt;td&gt;Reintenta con retroceso exponencial&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

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

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_with_retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_retries&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;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://open.bigmodel.cn/api/paas/v4/chat/completions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;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;BIGMODEL_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                         &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&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="n"&gt;retry_after&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&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;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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Retry-After&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Límite de tasa. Esperando &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;retry_after&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;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;retry_after&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;

            &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Timeout&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tiempo de espera en el intento &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. Reintentando en &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Número máximo de reintentos excedido&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;Para ejecuciones largas, usa un timeout alto (120-300s). El modelo puede requerir ese tiempo para generar un archivo de código o analizar benchmarks.&lt;/p&gt;

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

&lt;p&gt;La API compatible con OpenAI de GLM-5.1 permite integraciones rápidas si ya usas GPT o Claude. La diferencia es el endpoint (&lt;code&gt;open.bigmodel.cn&lt;/code&gt;) y el sistema de cuotas en vez de tokens.&lt;/p&gt;

&lt;p&gt;Para aplicaciones agénticas con muchas llamadas a herramientas, la optimización a largo plazo de GLM-5.1 es clave. Combínalo con pruebas robustas usando Smart Mock y Escenarios de Prueba de Apidog para asegurar que tu integración cubre todos los casos antes de producción.&lt;/p&gt;

&lt;p&gt;Consulta más detalles sobre GLM-5.1 y benchmarks en la &lt;a href="http://apidog.com/blog/what-is-glm-5-1/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descripción general del modelo GLM-5.1&lt;/a&gt;. Aprende sobre flujos de trabajo de agentes IA y pruebas en &lt;a href="http://apidog.com/blog/how-ai-agent-memory-works/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo funciona la memoria del agente de IA&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;¿La API de GLM-5.1 es compatible con OpenAI?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí. El formato de solicitud, respuesta, streaming y llamadas a herramientas es igual que OpenAI. Usa el SDK oficial de OpenAI apuntando a &lt;code&gt;https://open.bigmodel.cn/api/paas/v4/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cuál es el nombre del modelo?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Usa &lt;code&gt;"glm-5.1"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo funciona el precio?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
GLM-5.1 usa cuotas: 3x durante horas pico (14:00-18:00 UTC+8), 2x fuera de pico, 1x promocional fuera de pico hasta abril 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cuál es la longitud máxima de contexto?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
200.000 tokens de entrada; salida máxima: 163.840 tokens. Para tareas largas, usa &lt;code&gt;max_tokens&lt;/code&gt; grande (32.768+).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Soporta llamadas a funciones/herramientas?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí. Especifica herramientas con esquema &lt;code&gt;type: "function"&lt;/code&gt; en el array &lt;code&gt;tools&lt;/code&gt; y maneja respuestas con &lt;code&gt;finish_reason: "tool_calls"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo pruebo la API sin gastar cuota?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Usa Smart Mock de Apidog para simular respuestas de éxito, herramienta, límite de tasa y errores. Ejecuta tu suite de pruebas contra el mock y solo valida con la API real al final.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Dónde están los pesos del modelo GLM-5.1?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
En HuggingFace bajo &lt;code&gt;zai-org/GLM-5.1&lt;/code&gt;, licencia MIT, compatibles con vLLM y SGLang para inferencia local.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Las 8 Mejores Herramientas Gratuitas para Documentación de APIs (2026)</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Wed, 08 Apr 2026 04:27:07 +0000</pubDate>
      <link>https://forem.com/roobia/las-8-mejores-herramientas-gratuitas-para-documentacion-de-apis-2026-1559</link>
      <guid>https://forem.com/roobia/las-8-mejores-herramientas-gratuitas-para-documentacion-de-apis-2026-1559</guid>
      <description>&lt;p&gt;Si eres un desarrollador, sabes que la documentación de tus APIs es fundamental. La &lt;a href="https://apidog.com/api-doc/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;documentación de API&lt;/a&gt; conecta tu código con los usuarios y puede definir el éxito o fracaso de tu proyecto. Documentar bien una API atrae clientes, mejora la satisfacción del usuario, reduce el soporte y optimiza la colaboració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;Sin embargo, crear documentación de API de calidad puede ser tedioso y propenso a errores si lo haces manualmente. Es esencial mantener la documentación actualizada, clara, precisa y fácil de usar para el equipo y los usuarios. Además, debe estar bien estructurada y ser interactiva para facilitar la adopción y el uso.&lt;/p&gt;

&lt;p&gt;Por eso es clave elegir una herramienta de documentación de API que te permita generar, gestionar y publicar documentación de manera eficiente. Usar la solución adecuada te ahorra tiempo, esfuerzo y recursos, y mejora la experiencia de desarrollo y el resultado final para tus usuarios.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;¿Buscas una forma sencilla de crear, gestionar y compartir documentación de API?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
La plataforma todo en uno de Apidog permite generar documentación clara y completa para mantener a tu equipo sincronizado y tus APIs accesibles. Convierte especificaciones en documentación interactiva de forma instantánea, facilitando la colaboración y la incorporación de usuarios.&lt;/p&gt;

&lt;p&gt;Pero, ¿cómo elegir la herramienta de documentación de API adecuada para tu proyecto? Hay muchas opciones, cada una con características, ventajas y limitaciones distintas. Aquí tienes una comparativa práctica de las 8 mejores herramientas gratuitas para documentación de API, evaluadas bajo estos criterios clave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Facilidad de uso:&lt;/strong&gt; ¿Qué tan sencillo es crear y mantener la documentación?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Funcionalidad:&lt;/strong&gt; ¿Qué herramientas ofrece para mejorar la documentación?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personalización:&lt;/strong&gt; ¿Qué control tienes sobre el diseño y el contenido?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integración:&lt;/strong&gt; ¿Se integra bien con tus flujos y herramientas actuales?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Soporte:&lt;/strong&gt; ¿La comunidad y el soporte son confiables?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Herramienta de Documentación de API Top 1: Apidog
&lt;/h2&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; es una de las herramientas más completas para documentar APIs. Su enfoque está en la rapidez y la facilidad de uso. Puedes crear y compartir documentación profesional y moderna en minutos, usando Markdown o el panel visual para diseñar endpoints.&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%2Fzght98rqly4kuecut9tg.ico" 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%2Fzght98rqly4kuecut9tg.ico" alt="Apidog logo" width="128" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apidog está optimizado para la &lt;a href="https://apidog.com/api-doc/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;documentación de API&lt;/a&gt;, permitiendo agregar ejemplos de código, búsqueda, feedback, y analítica sin complicaciones. El editor inteligente mantiene la documentación clara y estructurada, y las opciones de personalización y exportación son muy flexibles. Puedes ver un &lt;a href="https://apidog.com/apihub/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ejemplo de documentación creada con Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5z5hzx7uhd11tvdahznq.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%2F5z5hzx7uhd11tvdahznq.png" alt="Documentación de API creada por Apidog" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ventajas prácticas de Apidog:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Velocidad:&lt;/strong&gt; Documentación lista en minutos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactividad:&lt;/strong&gt; Ejemplos de código, búsqueda y feedback integrados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Soporte activo:&lt;/strong&gt; Comunidad y equipo de soporte receptivos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gratis para empezar:&lt;/strong&gt; Prueba todas las funciones sin coste inicial.&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%2Feyitbgiu3h0pxhkyhd7u.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%2Feyitbgiu3h0pxhkyhd7u.png" alt="Interfaz de producto Apidog" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Herramienta de Documentación de API Top 2: Apiary
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apiary.io/" rel="noopener noreferrer"&gt;Apiary&lt;/a&gt; permite diseñar, prototipar, testear y documentar APIs de forma colaborativa. Usa API Blueprint o Swagger para escribir la documentación y genera automáticamente un sitio web interactivo. Además, simula respuestas, valida solicitudes y monitoriza el rendimiento de tus APIs.&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%2Fi85v0n2evatrjsjt35yj.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%2Fi85v0n2evatrjsjt35yj.png" alt="Sitio web oficial de Apiary" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A tener en cuenta:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solo un proyecto API en el plan gratuito y debe ser público.&lt;/li&gt;
&lt;li&gt;Personalización y exportación limitadas.&lt;/li&gt;
&lt;li&gt;Comunidad activa, pero soporte oficial mejorable.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Herramienta de Documentación de API Top 3: Slate
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/slatedocs/slate" rel="noopener noreferrer"&gt;Slate&lt;/a&gt; es open source y permite documentar APIs en Markdown para generar una web elegante y responsiva. Admite navegación tipo sidebar, ejemplos de código y búsqueda, y puedes personalizar con HTML, CSS y JS.&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%2Fztzkwyaopjiyq6y5sxhw.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%2Fztzkwyaopjiyq6y5sxhw.png" alt="Slate" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consideraciones técnicas:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Necesitas instalar, mantener y desplegar Slate por tu cuenta.&lt;/li&gt;
&lt;li&gt;No tiene soporte oficial, solo comunidad en GitHub.&lt;/li&gt;
&lt;li&gt;Requiere conocimientos técnicos para personalización avanzada.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Herramienta de Documentación de API Top 4: Postman
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://apidog.com/blog/what-is-postman/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Postman&lt;/a&gt; es una suite completa para desarrollo, testeo y documentación de APIs. Organiza requests en colecciones y genera documentación a partir de ellas, con opciones de compartir y testeo automatizado.&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%2Frc2mofxgt1uwrj9h6znh.ico" 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%2Frc2mofxgt1uwrj9h6znh.ico" alt="Postman" width="128" height="128"&gt;&lt;/a&gt;&lt;br&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%2Fwyv81nac6jh71ghyjmvf.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%2Fwyv81nac6jh71ghyjmvf.png" alt="Postman UI" width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Documentación menos intuitiva, requiere actualización manual.&lt;/li&gt;
&lt;li&gt;Opciones de personalización y exportación limitadas.&lt;/li&gt;
&lt;li&gt;Comunidad activa, soporte oficial mejorable.&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%2Fh2xnxq9ax93m6if97p1x.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%2Fh2xnxq9ax93m6if97p1x.png" alt="Apidog logo" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Herramienta de Documentación de API Top 5: Docusaurus
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/facebook/docusaurus" rel="noopener noreferrer"&gt;Docusaurus&lt;/a&gt; es open source y permite crear sitios de documentación en Markdown, con control de versiones, búsqueda, localización y blog.&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%2Fzght98rqly4kuecut9tg.ico" 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%2Fzght98rqly4kuecut9tg.ico" alt="Docusaurus" width="128" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Detalles técnicos:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No enfocada a APIs, requiere escribir documentación manualmente o con herramientas externas.&lt;/li&gt;
&lt;li&gt;Necesita instalación y despliegue propio.&lt;/li&gt;
&lt;li&gt;Comunidad en GitHub, sin soporte oficial.&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%2Fztzkwyaopjiyq6y5sxhw.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%2Fztzkwyaopjiyq6y5sxhw.png" alt="Docusaurus" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Herramienta de Documentación de API Top 6: Read the Docs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://about.readthedocs.com/?ref=readthedocs.com" rel="noopener noreferrer"&gt;Read the Docs&lt;/a&gt; es una plataforma para alojar documentación escrita en Markdown, reStructuredText o AsciiDoc. Genera y publica webs de documentación automáticamente, con búsqueda y control de versiones.&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%2Fxpqe2f5ncyoykxob75j4.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%2Fxpqe2f5ncyoykxob75j4.png" alt="Read the Docs" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aspectos prácticos:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No especializada en APIs.&lt;/li&gt;
&lt;li&gt;Personalización y exportación limitadas.&lt;/li&gt;
&lt;li&gt;Comunidad activa, soporte mejorable.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Herramienta de Documentación de API Top 7: Swagger UI
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://swagger.io/" rel="noopener noreferrer"&gt;Swagger UI&lt;/a&gt; facilita la visualización e interacción con tus APIs usando especificaciones OpenAPI o Swagger. Permite probar endpoints y generar ejemplos de código desde la misma interfaz.&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%2Fzght98rqly4kuecut9tg.ico" 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%2Fzght98rqly4kuecut9tg.ico" alt="Swagger UI" width="128" height="128"&gt;&lt;/a&gt;&lt;br&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%2Ft9tt5who5xg4no6w2mxc.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%2Ft9tt5who5xg4no6w2mxc.png" alt="Swagger UI" width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;El editor requiere formato específico y no es muy intuitivo.&lt;/li&gt;
&lt;li&gt;Opciones de personalización y exportación limitadas.&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%2Fh2xnxq9ax93m6if97p1x.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%2Fh2xnxq9ax93m6if97p1x.png" alt="Apidog logo" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Herramienta de Documentación de API Top 8: Document360
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://document360.com/" rel="noopener noreferrer"&gt;Document360&lt;/a&gt; es una herramienta intuitiva para documentar APIs y guías técnicas. Permite cargar OpenAPI, validar y mantener la documentación automáticamente al cambiar la especificación. Ofrece control de versiones similar a GitHub, edición colaborativa y evita sobrescritura de trabajos.&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%2Fyjgbon422nl3kq5s9xgb.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%2Fyjgbon422nl3kq5s9xgb.png" alt="Document360" width="800" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Permite personalizar la documentación según la marca, incluir tutoriales y guías, y ofrece búsqueda con IA para encontrar endpoints rápidamente. Los desarrolladores pueden generar ejemplos de código y mostrar logs paso a paso con detalles de fuente, fecha y estado.&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%2Fzght98rqly4kuecut9tg.ico" 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%2Fzght98rqly4kuecut9tg.ico" alt="Document360" width="128" height="128"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;La documentación de API es esencial para cualquier proyecto y puede marcar la diferencia entre el éxito y el fracaso. Elegir la herramienta adecuada facilita la creación, gestión y publicación de documentación profesional y útil.&lt;/p&gt;

&lt;p&gt;En este artículo, exploraste las 8 mejores opciones gratuitas para documentar APIs, comparadas según facilidad de uso, funcionalidad, personalización, integración y soporte. Elige la que mejor se adapte a las necesidades técnicas de tu equipo y flujo de trabajo para optimizar resultados.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>¿Qué es GLM-5.1? Explicación del nuevo modelo agente insignia de Z.AI</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Wed, 08 Apr 2026 04:07:10 +0000</pubDate>
      <link>https://forem.com/roobia/que-es-glm-51-explicacion-del-nuevo-modelo-agente-insignia-de-zai-d39</link>
      <guid>https://forem.com/roobia/que-es-glm-51-explicacion-del-nuevo-modelo-agente-insignia-de-zai-d39</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;GLM-5.1 es el modelo insignia de próxima generación de Z.AI, lanzado en abril de 2026. Está optimizado para ingeniería agentica: tareas de codificación de larga duración, bucles de optimización autónomos y proyectos de software complejos que requieren cientos de iteraciones. Es #1 en SWE-Bench Pro (58.4), lidera en Terminal-Bench 2.0 (69.0) y supera a GLM-5 en todos los principales benchmarks de codificación. Los pesos abiertos están disponibles bajo la Licencia MIT.&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;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;La mayoría de modelos de IA se estancan tras unas pocas docenas de llamadas a herramientas. Hacen progreso rápido al inicio en tareas de codificación, pero luego producen rendimientos decrecientes, forzando supervisión manual o resultados subóptimos.&lt;/p&gt;

&lt;p&gt;GLM-5.1 rompe ese patrón. Fue lanzado por Zhipu AI (Z.AI) en abril de 2026, pensado para tareas agenticas exigentes. Su punto fuerte no es solo el rendimiento en benchmarks a una pasada, sino la capacidad de mantener mejoras significativas durante más de 600 iteraciones, 8 horas y miles de llamadas a herramientas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; Si trabajas con APIs de IA o flujos de agentes multi-paso, testear exhaustivamente GLM-5.1 es esencial. Los Escenarios de Prueba de Apidog te permiten definir cadenas de llamadas API que simulan flujos reales, verificando manejo correcto de salidas asíncronas, secuencias de herramientas y streaming desde GLM-5.1 antes de producción. Descarga Apidog gratis para seguir las pruebas de esta guía.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ¿Qué es GLM-5.1?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://z.ai/blog/glm-5.1" rel="noopener noreferrer"&gt;GLM-5.1&lt;/a&gt; es un modelo de lenguaje grande de Zhipu AI, lanzado en su plataforma de desarrolladores Z.AI en abril de 2026. "GLM" significa General Language Model, arquitectura desarrollada desde 2021.&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%2F9dbj8zl7bxs4u8n8lazz.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%2F9dbj8zl7bxs4u8n8lazz.png" alt="GLM-5.1" width="800" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GLM-5.1, sucesor de GLM-5 (2025), se centra casi exclusivamente en capacidades agenticas: trabajar de forma autónoma en tareas largas sin intervención humana frecuente ni estancamientos de rendimiento.&lt;/p&gt;

&lt;p&gt;No es un modelo de razonamiento general, escritura creativa o chatbot multipropósito. Z.AI lo posiciona específicamente para ingeniería agentica: construir software, ejecutar bucles de optimización, iterar código y resolver problemas que requieren esfuerzo sostenido.&lt;/p&gt;

&lt;p&gt;Los pesos están disponibles en Hugging Face bajo Licencia MIT. Puedes correrlo localmente con vLLM o SGLang, o acceder vía API BigModel o la plataforma Z.AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rendimiento de GLM-5.1 en benchmarks
&lt;/h2&gt;

&lt;p&gt;Z.AI publicó benchmarks comparativos con GLM-5, GPT-5.4, Claude Opus 4.6 y Gemini 3.1 Pro en ingeniería de software, razonamiento y tareas agenticas.&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%2F10v32gw9h4v2fheo2ko0.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%2F10v32gw9h4v2fheo2ko0.png" alt="Benchmarks" width="800" height="670"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Ingeniería de software
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;GLM-5.1&lt;/th&gt;
&lt;th&gt;GLM-5&lt;/th&gt;
&lt;th&gt;GPT-5.4&lt;/th&gt;
&lt;th&gt;Opus 4.6&lt;/th&gt;
&lt;th&gt;Gemini 3.1 Pro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SWE-Bench Pro&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;58.4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;55.1&lt;/td&gt;
&lt;td&gt;57.7&lt;/td&gt;
&lt;td&gt;57.3&lt;/td&gt;
&lt;td&gt;54.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NL2Repo&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;42.7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;35.9&lt;/td&gt;
&lt;td&gt;41.3&lt;/td&gt;
&lt;td&gt;49.8&lt;/td&gt;
&lt;td&gt;33.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal-Bench 2.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;69.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;56.2&lt;/td&gt;
&lt;td&gt;75.1&lt;/td&gt;
&lt;td&gt;65.4&lt;/td&gt;
&lt;td&gt;68.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CyberGym&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;68.7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;48.3&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;66.6&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GLM-5.1 es #1 en SWE-Bench Pro, el estándar para tareas autónomas de ingeniería de software. En Terminal-Bench 2.0, GPT-5.4 tiene mejor puntuación, pero GLM-5.1 supera ampliamente a GLM-5.&lt;/p&gt;

&lt;p&gt;NL2Repo mide generación de repositorios a largo plazo: Claude Opus lidera, pero GLM-5.1 mejora claramente respecto a GLM-5.&lt;/p&gt;

&lt;h3&gt;
  
  
  Razonamiento
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;GLM-5.1&lt;/th&gt;
&lt;th&gt;GLM-5&lt;/th&gt;
&lt;th&gt;GPT-5.4&lt;/th&gt;
&lt;th&gt;Opus 4.6&lt;/th&gt;
&lt;th&gt;Gemini 3.1 Pro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HLE (con herramientas)&lt;/td&gt;
&lt;td&gt;52.3&lt;/td&gt;
&lt;td&gt;50.4&lt;/td&gt;
&lt;td&gt;52.1*&lt;/td&gt;
&lt;td&gt;53.1*&lt;/td&gt;
&lt;td&gt;51.4*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AIME 2026&lt;/td&gt;
&lt;td&gt;95.3&lt;/td&gt;
&lt;td&gt;95.4&lt;/td&gt;
&lt;td&gt;98.7&lt;/td&gt;
&lt;td&gt;95.6&lt;/td&gt;
&lt;td&gt;98.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HMMT Nov. 2025&lt;/td&gt;
&lt;td&gt;94.0&lt;/td&gt;
&lt;td&gt;96.9&lt;/td&gt;
&lt;td&gt;95.8&lt;/td&gt;
&lt;td&gt;96.3&lt;/td&gt;
&lt;td&gt;94.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPQA-Diamond&lt;/td&gt;
&lt;td&gt;86.2&lt;/td&gt;
&lt;td&gt;86.0&lt;/td&gt;
&lt;td&gt;92.0&lt;/td&gt;
&lt;td&gt;91.3&lt;/td&gt;
&lt;td&gt;94.3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GLM-5.1 es competitivo pero no líder en razonamiento; GPT-5.4 y Gemini 3.1 Pro destacan en AIME 2026 y GPQA-Diamond. Su fortaleza es la codificación y tareas agenticas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tareas agenticas
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;GLM-5.1&lt;/th&gt;
&lt;th&gt;GLM-5&lt;/th&gt;
&lt;th&gt;GPT-5.4&lt;/th&gt;
&lt;th&gt;Opus 4.6&lt;/th&gt;
&lt;th&gt;Gemini 3.1 Pro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BrowseComp (contexto)&lt;/td&gt;
&lt;td&gt;79.3&lt;/td&gt;
&lt;td&gt;75.9&lt;/td&gt;
&lt;td&gt;82.7&lt;/td&gt;
&lt;td&gt;84.0&lt;/td&gt;
&lt;td&gt;85.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP-Atlas (Público)&lt;/td&gt;
&lt;td&gt;71.8&lt;/td&gt;
&lt;td&gt;69.2&lt;/td&gt;
&lt;td&gt;67.2&lt;/td&gt;
&lt;td&gt;73.8&lt;/td&gt;
&lt;td&gt;69.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool-Decathlon&lt;/td&gt;
&lt;td&gt;40.7&lt;/td&gt;
&lt;td&gt;38.0&lt;/td&gt;
&lt;td&gt;54.6&lt;/td&gt;
&lt;td&gt;47.2&lt;/td&gt;
&lt;td&gt;48.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agentic&lt;/td&gt;
&lt;td&gt;68.0&lt;/td&gt;
&lt;td&gt;62.0&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;En MCP-Atlas, GLM-5.1 es líder (71.8). En BrowseComp y Tool-Decathlon obtiene resultados medios. El benchmark Agentic muestra una mejora clara respecto a GLM-5.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lo que hace diferente a GLM-5.1: optimización a largo plazo
&lt;/h2&gt;

&lt;p&gt;Más allá de los benchmarks a una pasada, GLM-5.1 está diseñado para mantener mejoras sostenidas en ejecuciones largas, evitando el estancamiento típico de otros modelos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Escenario 1: optimización de base de datos vectorial en +600 iteraciones
&lt;/h3&gt;

&lt;p&gt;Z.AI probó GLM-5.1 optimizando búsqueda vectorial sobre SIFT-1M. El modelo partió de un esqueleto en Rust y debía maximizar QPS (&amp;gt;95% recuperación), sin límite de iteraciones.&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%2Fe0d8c6n9553olcwe2d16.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%2Fe0d8c6n9553olcwe2d16.png" alt="Vector DB" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resultados: el mejor otro modelo logró 3,547 QPS (Claude Opus 4.6). GLM-5.1, tras 600+ iteraciones y 6,000+ llamadas a herramientas, alcanzó 21,500 QPS (~6x más).&lt;/p&gt;

&lt;p&gt;La mejora fue por transiciones estructurales, no solo tweaks superficiales. Ejemplo: en la iteración 90 cambió de escaneo completo a cluster IVF con compresión, saltando de ~3,500 a 6,400 QPS; en la 240, pipeline de dos etapas, subiendo a 13,400 QPS. Estas transiciones se dispararon tras analizar registros y cuellos de botella.&lt;/p&gt;

&lt;h3&gt;
  
  
  Escenario 2: optimización de kernel GPU en +1,000 turnos
&lt;/h3&gt;

&lt;p&gt;Z.AI comparó GLM-5.1, GLM-5 y Claude Opus 4.6 optimizando kernels CUDA desde código PyTorch.&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%2F6hi93errrsc8ygq1cl1m.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%2F6hi93errrsc8ygq1cl1m.png" alt="GPU Kernel" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GLM-5.1 logró un speedup de 3.6x. Claude Opus 4.6 lideró con 4.2x y mostró margen de mejora al final. GLM-5 se estancó antes y más bajo. De nuevo, GLM-5.1 mantiene progreso durante más turnos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ventana de contexto y especificaciones técnicas
&lt;/h2&gt;

&lt;p&gt;GLM-5.1 soporta ventana de contexto de 200K tokens, ideal para agentes que acumulan historial de herramientas, archivos, logs y errores en sesiones largas.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Especificación&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;Ventana de contexto&lt;/td&gt;
&lt;td&gt;200,000 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Salida máxima&lt;/td&gt;
&lt;td&gt;163,840 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arquitectura&lt;/td&gt;
&lt;td&gt;Transformador autorregresivo (GLM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Licencia&lt;/td&gt;
&lt;td&gt;MIT (pesos abiertos)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marcos de inferencia&lt;/td&gt;
&lt;td&gt;vLLM, SGLang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pesos del modelo&lt;/td&gt;
&lt;td&gt;HuggingFace (zai-org)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Disponibilidad y precios
&lt;/h2&gt;

&lt;p&gt;GLM-5.1 se puede usar de tres maneras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API BigModel (bigmodel.cn):&lt;/strong&gt; API principal para desarrolladores (&lt;code&gt;glm-5.1&lt;/code&gt;). Sistema de cuotas. Durante horas pico (14:00-18:00 UTC+8) consume 3x cuota, no pico 2x (promoción 1x hasta fin de abril 2026).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan de Codificación GLM (Z.AI):&lt;/strong&gt; &lt;a href="https://z.ai/subscribe" rel="noopener noreferrer"&gt;Plan de suscripción&lt;/a&gt; para asistentes de codificación IA. GLM-5.1 está disponible para todos los suscriptores; solo cambia el nombre del modelo en la config. Compatible con Claude Code, Cline, Kilo Code, Roo Code, OpenCode, Droid. Desde $10/mes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Despliegue local:&lt;/strong&gt; Pesos en HuggingFace &lt;code&gt;zai-org/GLM-5.1&lt;/code&gt;. Correr con vLLM o SGLang. Documentación en GitHub.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  GLM-5.1 vs GLM-5: qué realmente cambia
&lt;/h2&gt;

&lt;p&gt;GLM-5 ya era potente en codificación. GLM-5.1 amplía la ventana útil de trabajo.&lt;/p&gt;

&lt;p&gt;No es solo mejor en la primera pasada (+3-7 puntos en benchmarks), sino que sigue progresando en tareas largas donde GLM-5 se estanca. Ejemplo: en búsqueda vectorial, GLM-5 quedó en 8-10K QPS, GLM-5.1 llegó a 21.5K. En optimización GPU, GLM-5 terminó más bajo y antes. En tareas complejas, GLM-5 produce un esqueleto y se detiene.&lt;/p&gt;

&lt;p&gt;Claude Opus 4.6 aún lidera en optimización GPU kernel y BrowseComp.&lt;/p&gt;

&lt;h2&gt;
  
  
  GLM-5.1 vs competidores
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GLM-5.1 vs Claude Opus 4.6
&lt;/h3&gt;

&lt;p&gt;GLM-5.1 lidera en SWE-Bench Pro (58.4 vs 57.3) y CyberGym (68.7 vs 66.6). Claude Opus 4.6 lidera en NL2Repo, optimización GPU y BrowseComp. El acceso API de Claude es más caro; GLM-5.1 es más accesible para bucles de agente de alto volumen.&lt;/p&gt;

&lt;h3&gt;
  
  
  GLM-5.1 vs GPT-5.4
&lt;/h3&gt;

&lt;p&gt;GPT-5.4 es mejor en Terminal-Bench 2.0 y razonamiento. GLM-5.1 lidera en SWE-Bench Pro y MCP-Atlas. Para desarrolladores en China o usando infraestructura china, acceder a BigModel con GLM-5.1 es más sencillo que obtener acceso a GPT-5.4.&lt;/p&gt;

&lt;h3&gt;
  
  
  GLM-5.1 vs Gemini 3.1 Pro
&lt;/h3&gt;

&lt;p&gt;Gemini 3.1 Pro lidera en razonamiento y BrowseComp. GLM-5.1 lidera en SWE-Bench Pro, Terminal-Bench 2.0 y CyberGym. Para código, GLM-5.1 es más fuerte; para razonamiento general, Gemini tiene ventaja.&lt;/p&gt;

&lt;h2&gt;
  
  
  Casos de uso óptimos para GLM-5.1
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agentes de codificación autónomos:&lt;/strong&gt; Tareas largas donde el modelo decide qué probar, ejecuta tests, analiza resultados y sigue sin checkpoints humanos frecuentes. Para detalles sobre gestión de memoria de agentes, revisa &lt;a href="http://apidog.com/blog/how-ai-agent-memory-works/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo funciona la memoria del agente de IA&lt;/a&gt;. La ventana de 200K tokens y la optimización sostenida lo hacen ideal aquí.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Asistentes de codificación IA (Claude Code, Cline, Cursor):&lt;/strong&gt; GLM-5.1 es compatible con el Plan de Codificación de Z.AI y herramientas como Claude Code, Kilo Code, Roo Code, etc. Si buscas un modelo potente sin el coste por token de Claude o GPT, usa BigModel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automatización de ingeniería de software (tipo SWE-Bench):&lt;/strong&gt; Resolución de issues en GitHub, generación de PRs, automatización de bugs. El #1 en SWE-Bench Pro lo hace creíble para pipelines automatizadas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Programación competitiva y optimización:&lt;/strong&gt; Ajuste de kernels GPU, benchmarking de rendimiento, optimización de algoritmos donde el modelo puede experimentar y ajustar estrategias en base a resultados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No recomendado para:&lt;/strong&gt; Chatbots generales, escritura creativa, preguntas sobre documentos donde el razonamiento puro es más importante que la generación de código. Para esos casos, Gemini y GPT-5.4 son mejores.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cómo probar GLM-5.1 hoy
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Interfaz web:&lt;/strong&gt; Usa el chat de Z.AI en &lt;a href="https://z.ai" rel="noopener noreferrer"&gt;z.ai&lt;/a&gt;, ya ejecuta GLM-5.1 por defecto. No necesitas clave API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API:&lt;/strong&gt; Crea cuenta en &lt;a href="https://bigmodel.cn" rel="noopener noreferrer"&gt;bigmodel.cn&lt;/a&gt;, genera tu clave API. La API es compatible con OpenAI, así que cualquier cliente GPT funciona. Usa el modelo &lt;code&gt;glm-5.1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Despliegue local:&lt;/strong&gt; Pesos disponibles en &lt;code&gt;huggingface.co/zai-org&lt;/code&gt;. Guía completa en el repo oficial: &lt;code&gt;github.com/zai-org/GLM-5.1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentación API y ejemplos:&lt;/strong&gt; Consulta la &lt;a href="http://apidog.com/blog/how-to-use-glm-5-1-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de la API de GLM-5.1&lt;/a&gt; para autenticación, ejemplos de código y tests.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;GLM-5.1 supone un avance real respecto a GLM-5, especialmente en tareas agenticas de larga duración. Su #1 en SWE-Bench Pro y la demo de 600+ iteraciones en búsqueda vectorial lo posicionan como el modelo de pesos abiertos más sólido para flujos de codificación autónomos hoy.&lt;/p&gt;

&lt;p&gt;No es el mejor en todo: Claude Opus 4.6 y GPT-5.4 lideran en razonamiento y algunas tareas agenticas, pero si quieres ejecutar agentes autónomos sin pagar precios de modelos cerrados, GLM-5.1 bajo Licencia MIT y API BigModel es una opción seria.&lt;/p&gt;

&lt;p&gt;La combinación de pesos abiertos y licencia MIT permite ejecutarlo localmente, afinarlo y desplegarlo en tu infraestructura sin restricciones de uso.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;¿Qué significa GLM?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
General Language Model, arquitectura desarrollada por Zhipu AI desde 2021, basada en relleno de espacios en blanco autorregresivo en vez del enfoque solo decodificador de GPT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Es GLM-5.1 open source?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí. Pesos bajo Licencia MIT en HuggingFace &lt;code&gt;zai-org/GLM-5.1&lt;/code&gt;. Puedes usarlo comercialmente, afinarlo y redistribuirlo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué ventana de contexto soporta GLM-5.1?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
200,000 tokens (~150,000 palabras), salida máxima 163,840 tokens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo se compara GLM-5.1 con DeepSeek-V3.2?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
GLM-5.1 lidera en ingeniería de software según benchmarks de Z.AI. DeepSeek-V3.2 es competitivo en razonamiento. Para agentes de codificación, GLM-5.1 es el más fuerte según datos publicados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo usar GLM-5.1 con Claude Code o Cursor?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí. El Plan de Codificación de Z.AI soporta Claude Code, Cline, Kilo Code, Roo Code y OpenCode vía API BigModel. Actualiza el nombre del modelo en la config de tu asistente. Desde $10/mes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo accedo a GLM-5.1 por API?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Crea cuenta en bigmodel.cn, genera clave, usa modelo &lt;code&gt;glm-5.1&lt;/code&gt; en &lt;code&gt;https://open.bigmodel.cn/api/paas/v4/chat/completions&lt;/code&gt;. Tutorial completo en la &lt;a href="http://apidog.com/blog/how-to-use-glm-5-1-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de la API de GLM-5.1&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿GLM-5.1 es gratuito?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
El chat de Z.AI (z.ai) es gratis. El acceso API usa sistema de cuotas con planes de pago. Uso fuera de horas pico facturado a 1x hasta fin de abril 2026 como promoción.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Grok Imagine sin restricciones: qué cambió y qué funciona realmente</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Wed, 08 Apr 2026 03:23:23 +0000</pubDate>
      <link>https://forem.com/roobia/grok-imagine-sin-restricciones-que-cambio-y-que-funciona-realmente-dgp</link>
      <guid>https://forem.com/roobia/grok-imagine-sin-restricciones-que-cambio-y-que-funciona-realmente-dgp</guid>
      <description>&lt;h2&gt;
  
  
  En pocas palabras
&lt;/h2&gt;

&lt;p&gt;Grok Imagine eliminó su nivel gratuito el 19 de marzo de 2026 y endureció los filtros de contenido después de una controversia por deepfakes en enero. Los usuarios gratuitos ahora no obtienen ninguna generación de imágenes. SuperGrok (30 $/mes) restaura el acceso con límites más altos, pero el filtro NSFW sigue siendo aplicado. La API de xAI (&lt;code&gt;grok-imagine-image&lt;/code&gt;) ofrece el acceso más flexible para desarrolladores. Si quieres una generación de imágenes local genuinamente sin censura, Stable Diffusion y FLUX son tus mejores opciones.&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;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;Durante unos meses a finales de 2025, Grok Imagine fue el generador de imágenes más comentado en internet. Era gratuito. Era rápido. Y estaba notablemente menos filtrado que DALL-E o Midjourney. Eso cambió el 9 de enero de 2026, cuando xAI restringió la generación de imágenes a los suscriptores de pago después de que una ola de contenido deepfake se hiciera viral. Luego, el 19 de marzo de 2026, el nivel gratuito fue eliminado por completo.&lt;/p&gt;

&lt;p&gt;Si buscas "Grok Imagine sin restricciones", probablemente quieras una de tres cosas: saber exactamente cuáles son los límites actuales, si puedes eludirlos o qué usar en su lugar. Este artículo cubre las tres.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Desarrollo sobre la API de xAI:&lt;/strong&gt; Si eres desarrollador y necesitas probar tu flujo de generación de imágenes sin gastar créditos en cada ejecución, usa Smart Mock de Apidog para simular la respuesta a &lt;code&gt;POST /v1/images/generations&lt;/code&gt;. Así, podrás manejar estados de éxito, error y límite de velocidad en tu frontend sin tocar la API real. Descarga Apidog gratis para seguir la sección de pruebas más adelante en esta guía.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué pasó con el nivel gratuito de Grok Imagine
&lt;/h2&gt;

&lt;p&gt;La cronología es importante porque la situación cambió tres veces en menos de tres meses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Noviembre de 2025:&lt;/strong&gt; xAI lanza Grok Imagine como parte del nivel gratuito de Grok en X (anteriormente Twitter). Usuarios gratuitos obtienen generaciones de imágenes limitadas por día usando el modelo &lt;code&gt;aurora&lt;/code&gt;, que se posicionó alto en benchmarks de texto a imagen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;9 de enero de 2026:&lt;/strong&gt; Tras un informe sobre imágenes deepfake explícitas de figuras públicas, xAI restringe la generación de imágenes a suscriptores de pago. Se añaden filtros de seguridad al modelo y los usuarios gratuitos pierden acceso. El cambio no se anunció públicamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;19 de marzo de 2026:&lt;/strong&gt; Se elimina el acceso gratuito por completo. Grok Imagine pasa a ser solo de pago.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En resumen: Grok Imagine era gratuito, fue abusado y xAI eliminó el nivel gratuito.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuáles son realmente los límites actuales (abril de 2026)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Grok Gratuito
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No hay generación de imágenes.&lt;/strong&gt; Si estás en el nivel gratuito, la pestaña Imaginar aparece en la UI, pero se bloquea al intentar generar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SuperGrok (30 $/mes)
&lt;/h3&gt;

&lt;p&gt;SuperGrok habilita la generación de imágenes con estos límites:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;Límite&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Generaciones de imágenes&lt;/td&gt;
&lt;td&gt;~100/mes (no publicado oficialmente)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generaciones de vídeo&lt;/td&gt;
&lt;td&gt;Limitado a través de &lt;code&gt;grok-imagine-video&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contenido NSFW&lt;/td&gt;
&lt;td&gt;Bloqueado por filtro de seguridad&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caras humanas realistas&lt;/td&gt;
&lt;td&gt;Parcialmente restringido&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Figuras públicas&lt;/td&gt;
&lt;td&gt;Restringido&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Acceso a la API&lt;/td&gt;
&lt;td&gt;No incluido (facturación separada)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;El filtro de contenido en SuperGrok se aplica a nivel de modelo. xAI implementó un sistema de dos capas tras la controversia de enero: un protector de indicaciones (que analiza palabras clave y contexto) y un clasificador post-generación. Ambos se ejecutan en cada generación.&lt;/p&gt;

&lt;h3&gt;
  
  
  SuperGrok Heavy (300 $/mes)
&lt;/h3&gt;

&lt;p&gt;Dirigido a usuarios intensivos y equipos. Más generaciones y menor latencia, pero la política de contenido es igual a la de SuperGrok. El precio más alto &lt;strong&gt;no&lt;/strong&gt; implica menos restricciones.&lt;/p&gt;

&lt;h3&gt;
  
  
  API de xAI (acceso para desarrolladores)
&lt;/h3&gt;

&lt;p&gt;La API es la vía más flexible. Haz un &lt;code&gt;POST https://api.x.ai/v1/images/generations&lt;/code&gt; usando el modelo &lt;code&gt;grok-imagine-image&lt;/code&gt; a 0,02 $ por imagen.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El filtro de contenido sigue activo vía API.&lt;/li&gt;
&lt;li&gt;La política de uso prohíbe contenido sexual, deepfakes de personas reales y violaciones a sus términos.&lt;/li&gt;
&lt;li&gt;El filtro es más permisivo para prompts artísticos/creativos que la UI de consumidor.&lt;/li&gt;
&lt;li&gt;Tienes control programático total sobre lo que envías.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  El filtro de contenido: qué bloquea y qué no
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bloquea:&lt;/strong&gt; contenido sexual explícito, deepfakes de personas reales, violencia gráfica y contenido que involucre a menores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permite:&lt;/strong&gt; la mayoría del arte y contenido creativo. Violencia estilizada, contenido sugerente no explícito, imágenes abstractas y surrealistas suelen pasar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El filtro usa evaluación semántica, no solo palabras clave. Los prompts con lenguaje clínico, artístico o indirecto pueden obtener resultados diferentes frente a los directos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Técnica de reformulación de la indicación
&lt;/h3&gt;

&lt;p&gt;La principal técnica alternativa documentada es la &lt;strong&gt;reformulación artística&lt;/strong&gt;. Describir una escena como pintura, escultura o arte en vez de explícitamente suele ser evaluado distinto. Esto puede mover contenido borderline de "bloqueado" a "permitido", pero &lt;strong&gt;no sirve para contenido explícitamente prohibido&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Grok Imagine vs otros generadores de imágenes: ¿qué es realmente menos restringido?
&lt;/h2&gt;

&lt;p&gt;Si buscas menos restricciones, así se comparan las opciones principales:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Generador&lt;/th&gt;
&lt;th&gt;Restricciones&lt;/th&gt;
&lt;th&gt;Costo&lt;/th&gt;
&lt;th&gt;¿Local?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Grok Imagine (SuperGrok)&lt;/td&gt;
&lt;td&gt;Moderadas — bloquea lo explícito, permite lo artístico&lt;/td&gt;
&lt;td&gt;30 $/mes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DALL-E 3 (ChatGPT Plus)&lt;/td&gt;
&lt;td&gt;Estrictas — rechaza la violencia estilizada y la desnudez parcial&lt;/td&gt;
&lt;td&gt;20 $/mes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Midjourney&lt;/td&gt;
&lt;td&gt;Moderadas — similar a Grok, fuerte en lo artístico&lt;/td&gt;
&lt;td&gt;10-120 $/mes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adobe Firefly&lt;/td&gt;
&lt;td&gt;Estrictas — solo seguro para uso comercial&lt;/td&gt;
&lt;td&gt;5-55 $/mes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stable Diffusion (local)&lt;/td&gt;
&lt;td&gt;Ninguna — tú controlas todo&lt;/td&gt;
&lt;td&gt;Costo del hardware&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FLUX.1 (local)&lt;/td&gt;
&lt;td&gt;Ninguna — tú controlas todo&lt;/td&gt;
&lt;td&gt;Costo del hardware&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ComfyUI + cualquier modelo&lt;/td&gt;
&lt;td&gt;Ninguna — depende del modelo&lt;/td&gt;
&lt;td&gt;Costo del hardware&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Conclusión:&lt;/strong&gt; Ningún generador en la nube es realmente "sin restricciones". Todos aplican políticas de contenido a nivel de API. Grok fue el menos filtrado a finales de 2025, pero ya no tras los cambios de enero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ejecutando la generación de imágenes localmente: la opción real sin restricciones
&lt;/h2&gt;

&lt;p&gt;La generación local implica instalar el modelo en tu hardware y ejecutarlo, sin depender de una API externa. Sin política de contenido: lo que generas es solo tuyo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stable Diffusion
&lt;/h3&gt;

&lt;p&gt;Stable Diffusion es el estándar. Los modelos SDXL y SD 3.5 tienen pesos abiertos y pueden ejecutarse en una GPU de consumidor.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hardware mínimo:&lt;/strong&gt; GPU con 8 GB de VRAM (ej. NVIDIA RTX 3060). En Mac, puede usarse CPU (más lento).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opciones de interfaz:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AUTOMATIC1111 (WebUI):&lt;/strong&gt; basada en navegador. Fácil para principiantes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ComfyUI:&lt;/strong&gt; editor de nodos, más control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invoke AI:&lt;/strong&gt; UI pulida, ideal para iterar.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Los modelos sin censura están disponibles en Hugging Face y CivitAI. Se cargan en cualquiera de las interfaces anteriores.&lt;/p&gt;

&lt;h3&gt;
  
  
  FLUX.1
&lt;/h3&gt;

&lt;p&gt;FLUX de Black Forest Labs es más nuevo y produce imágenes más nítidas y realistas. FLUX.1-dev es gratis para uso no comercial; FLUX.1-schnell es totalmente abierto.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Corre en el mismo hardware que Stable Diffusion, pero usa más VRAM para imágenes grandes (idealmente 12 GB de VRAM).&lt;/li&gt;
&lt;li&gt;Puede usarse vía ComfyUI o la librería Python &lt;code&gt;diffusers&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&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;diffusers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FluxPipeline&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;

&lt;span class="n"&gt;pipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FluxPipeline&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;black-forest-labs/FLUX.1-schnell&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;torch_dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bfloat16&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cuda&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your prompt here&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;num_inference_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_sequence_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;images&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;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output.png&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;Sin clave de API. Sin filtro de contenido. El único límite es tu GPU.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uso de la API de xAI para la generación de imágenes (guía para desarrolladores)
&lt;/h2&gt;

&lt;p&gt;¿Quieres generación en la nube con más control que la UI? La API de xAI es el camino. Sigue filtrado, pero soporta acceso programático, procesamiento por lotes e integración con tus apps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Autenticación
&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;XAI_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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obtén tu clave en &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt;. Necesitas método de pago antes de que funcione la generación de imágenes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tu primera solicitud de generación de imágenes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.x.ai/v1/images/generations &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-image",
    "prompt": "a photorealistic mountain lake at sunrise, mist over the water",
    "n": 1,
    "response_format": "url"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La respuesta es sincrónica, con una URL:&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;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1744123456&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="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://..."&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;A diferencia de la API de vídeo (que es asíncrona), la de imágenes es síncrona: POST y recibes la URL en la misma respuesta (usualmente en 3-5 segundos).&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;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai/v1/images/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a cyberpunk city street at night, neon reflections in rain puddles&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response_format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;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="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;image_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Image URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;image_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Parámetros
&lt;/h3&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;Descripción&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;Debe ser &lt;code&gt;"grok-imagine-image"&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prompt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;Tu descripción de texto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;integer&lt;/td&gt;
&lt;td&gt;Número de imágenes (1-4)&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;string&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;"url"&lt;/code&gt; o &lt;code&gt;"b64_json"&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Probando la API de imágenes de xAI con Apidog
&lt;/h2&gt;

&lt;p&gt;Si tu app depende de Grok Imagine, necesitas manejar correctamente estos estados: generación exitosa, rechazos por política de contenido (HTTP 400), respuestas por límite de velocidad (HTTP 429) y tiempos de espera.&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%2Fzmc9jct1xhtmp55nmgj1.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%2Fzmc9jct1xhtmp55nmgj1.png" alt="API Test" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Probar esto en la API real cuesta 0,02 $ por llamada y requiere internet. Úsalo solo para integraciones finales, no para desarrollo de frontend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solución:&lt;/strong&gt; Usa Smart Mock de Apidog. Así configuras el endpoint &lt;code&gt;POST /v1/images/generations&lt;/code&gt;, defines respuestas simuladas para cada estado y haces que tu frontend consuma la simulación.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configura la simulación de error de política de contenido:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;En Apidog, crea un nuevo endpoint: &lt;code&gt;POST https://api.x.ai/v1/images/generations&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Añade una Expectativa de Simulación con condición en el cuerpo de solicitud.&lt;/li&gt;
&lt;li&gt;Devuelve una respuesta 400 así cuando el prompt tenga contenido marcado:
&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;"error"&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="s2"&gt;"Your request was rejected as a result of our safety 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;"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;"invalid_request_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"content_policy_violation"&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;ol&gt;
&lt;li&gt;Añade una segunda expectativa para respuestas 200 en prompts normales.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ahora puedes probar tu código de manejo de errores &lt;strong&gt;sin&lt;/strong&gt; activar el filtro real. Esto es clave para mostrar mensajes de error claros a los usuarios cuando sus prompts sean rechazados.&lt;/p&gt;

&lt;p&gt;Para la configuración completa de pruebas en la API de generación de video, revisa la &lt;a href="http://apidog.com/blog/grok-image-to-video-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de la API de imagen a video de Grok&lt;/a&gt; y la &lt;a href="http://apidog.com/blog/grok-text-to-video-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de la API de texto a video de Grok&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué es el modelo grok-companion-ani (y por qué es diferente)
&lt;/h2&gt;

&lt;p&gt;El modelo &lt;code&gt;grok-companion-ani&lt;/code&gt; aparece en la documentación de xAI. Es &lt;strong&gt;diferente&lt;/strong&gt; de &lt;code&gt;grok-imagine-image&lt;/code&gt;, y está diseñado para animación de personajes e interacciones tipo compañero, no para generación general de imágenes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tiene precios y filtros de contenido diferentes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No&lt;/strong&gt; es una versión menos filtrada del generador de imágenes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Alternativas a Grok Imagine que vale la pena conocer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Generación en la nube con menos restricciones que DALL-E:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Midjourney:&lt;/strong&gt; Es la opción más fuerte para arte y creatividad. El filtro es similar al de Grok tras enero, pero la calidad en prompts complejos es superior. Desde 10 $/mes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leonardo AI:&lt;/strong&gt; Política de contenido más permisiva que la mayoría para arte. El nivel gratuito es limitado pero útil para pruebas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ideogram:&lt;/strong&gt; Ideal para texto en imagen, buen nivel gratuito. Menos relevante si buscas fotorrealismo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Generación local:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FLUX.1-schnell:&lt;/strong&gt; Para iterar rápido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FLUX.1-dev:&lt;/strong&gt; Para máxima calidad.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SDXL Turbo:&lt;/strong&gt; Generación en tiempo real.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Todos pueden correr en hardware de consumidor y &lt;strong&gt;sin restricciones de contenido&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;Grok Imagine tuvo una ventana breve como generador menos filtrado y gratuito. Esa ventana se cerró en enero de 2026 y finalizó en marzo cuando xAI eliminó el nivel gratuito.&lt;/p&gt;

&lt;p&gt;Situación actual:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SuperGrok&lt;/strong&gt;: Generación de imágenes en la nube con filtro moderado, 30 $/mes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API de xAI&lt;/strong&gt;: Acceso programático, 0,02 $ por imagen, mismo filtro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generación sin restricciones:&lt;/strong&gt; Solo es posible localmente, ejecutando Stable Diffusion o FLUX en tu hardware.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La nube cambia sus filtros cada pocos meses. La generación local te da control total: tu hardware, tus modelos, tu salida.&lt;/p&gt;

&lt;p&gt;Para una lista completa de modelos de IA gratuitos y abiertos que puedes ejecutar sin restricciones, revisa la &lt;a href="http://apidog.com/blog/free-ai-models/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de modelos de IA gratuitos&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;¿Grok Imagine todavía tiene un nivel gratuito?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. Desde el 19 de marzo de 2026, necesitas suscripción de pago (SuperGrok 30 $/mes) para generar imágenes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Se puede eludir el filtro de contenido de Grok Imagine?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No para contenido explícitamente prohibido (sexual, menores, violencia gráfica). Reformulación artística solo cambia el resultado para prompts borderline, pero no para violaciones claras de política.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Está Grok Imagine disponible vía API?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí. El modelo &lt;code&gt;grok-imagine-image&lt;/code&gt; está en &lt;code&gt;POST https://api.x.ai/v1/images/generations&lt;/code&gt; a 0,02 $ por imagen. Necesitas clave de API y método de pago.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Diferencia entre Grok Imagine y Grok imagen-a-vídeo?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Grok Imagine (&lt;code&gt;grok-imagine-image&lt;/code&gt;) genera imágenes estáticas a partir de texto. Grok imagen-a-vídeo (&lt;code&gt;grok-imagine-video&lt;/code&gt;) anima una imagen en un video corto. Son modelos, precios y endpoints distintos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿El mejor generador sin restricciones en 2026?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Para generación local: FLUX.1-schnell o SDXL. Ambos corren en GPUs de consumidor (8 GB+ VRAM), pesos abiertos y sin filtros de contenido.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué generador en la nube tiene menos restricciones?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tras la actualización de Grok en enero 2026, el panorama es parejo. Midjourney y Leonardo AI son más permisivos que DALL-E o Adobe Firefly para arte. Ninguno permite contenido sexual explícito o deepfakes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo se compara Grok Imagine con Midjourney?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Después de enero 2026, políticas de contenido similares. Grok Imagine es más fotorrealista; Midjourney destaca en arte y prompts complejos. Midjourney desde 10 $/mes; Grok desde 30 $/mes (SuperGrok).&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo Automatizar tu Búsqueda de Empleo con Inteligencia Artificial Open Source (Guía Career-Ops)</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Tue, 07 Apr 2026 10:01:13 +0000</pubDate>
      <link>https://forem.com/roobia/como-automatizar-tu-busqueda-de-empleo-con-inteligencia-artificial-open-source-guia-career-ops-168p</link>
      <guid>https://forem.com/roobia/como-automatizar-tu-busqueda-de-empleo-con-inteligencia-artificial-open-source-guia-career-ops-168p</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Career-Ops es un boilerplate gratuito y open source que convierte Claude Code en un sistema completo para automatizar la búsqueda de empleo técnico. Evalúa ofertas con puntuaciones A-F, genera CVs personalizados y optimizados para ATS, escanea automáticamente más de 45 portales de empresas y lleva el seguimiento en un panel tipo terminal. Su creador evaluó más de 740 ofertas y consiguió un puesto de Head of Applied AI usándolo.&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;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;El seguimiento tradicional de solicitudes de empleo con hojas de cálculo es ineficiente y manual. Career-Ops automatiza el proceso: pegas una URL o descripción de puesto, el sistema evalúa la oferta, puntúa 10 dimensiones, genera un PDF personalizado y registra el resultado. Tú decides si aplicar.&lt;/p&gt;

&lt;p&gt;Career-Ops no es un bot de aplicación masiva; su filosofía es filtrar y priorizar. Solo recomienda ofertas que realmente valen tu tiempo (puntuación &amp;gt;4.0/5). El proyecto alcanzó 11.9k estrellas en GitHub en menos de una semana.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Consejo:&lt;/strong&gt; Si necesitas probar endpoints de tus APIs en cada etapa de tu pipeline, los Escenarios de Prueba 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; permiten verificar cada llamada HTTP que Career-Ops hace a APIs de portales de empleo antes de pasar a producción. Más info en [internal: api-testing-tutorial].&lt;/p&gt;




&lt;h2&gt;
  
  
  ¿Qué hace Career-Ops?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/santifer/career-ops" rel="noopener noreferrer"&gt;Career-Ops&lt;/a&gt; es un boilerplate para Claude Code. Clona el repo, añade tu CV en markdown, configura tu perfil YAML y abre Claude Code en ese directorio. Ejecuta comandos de barra para automatizar toda la pipeline.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Flujo principal:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pegas una URL o descripción del puesto
        |
        v
Detección de arquetipo
(LLMOps / Agéntico / PM / SA / FDE / Transformación)
        |
        v
Motor de Evaluación A-F
(lee tu cv.md, puntúa 10 dimensiones)
        |
   +----+----+
   v    v    v
Informe  PDF  Seguimiento
 .md   .pdf  .tsv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Todo corre sobre Claude Code, que puede modificar sus propios scripts, pesos y modos bajo demanda.&lt;/p&gt;




&lt;h2&gt;
  
  
  Comandos principales
&lt;/h2&gt;

&lt;p&gt;El punto de entrada es &lt;code&gt;/career-ops&lt;/code&gt; con 14 modos clave:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/career-ops                      → Lista todos los comandos
/career-ops &lt;span class="o"&gt;{&lt;/span&gt;descripción&lt;span class="o"&gt;}&lt;/span&gt;        → Pipeline completa: evalúa + PDF + tracking
/career-ops scan                 → Escanea +45 portales para nuevas ofertas
/career-ops pdf                  → Genera CV optimizado para ATS para una oferta
/career-ops batch                → Evalúa 10+ ofertas en paralelo
/career-ops tracker              → Estado de la pipeline
/career-ops apply                → Rellena formularios de solicitud vía IA
/career-ops pipeline             → Procesa una cola de URLs
/career-ops contacto             → Redacta mensajes de contacto &lt;span class="o"&gt;(&lt;/span&gt;ej. LinkedIn&lt;span class="o"&gt;)&lt;/span&gt;
/career-ops deep                 → Investigación de empresa objetivo
/career-ops training             → Evalúa un curso/certificación
/career-ops project              → Evalúa un proyecto de portafolio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El flujo más usado es el auto-pipeline: pega cualquier URL de empleo y Career-Ops hace el resto. No necesitas elegir modo: pega la descripción, ejecuta, recibe evaluación y recursos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Motor de puntuación A-F
&lt;/h2&gt;

&lt;p&gt;El corazón de Career-Ops es su sistema de scoring, estructurado en 6 bloques:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A: Resumen del rol&lt;/strong&gt; — Extrae título, equipo, antigüedad, skills. Clasifica arquetipo para aplicar la rúbrica adecuada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;B: Coincidencia de CV&lt;/strong&gt; — Compara tu CV real con el puesto, razona sobre experiencia y gaps. Identifica dealbreakers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C: Compensación&lt;/strong&gt; — Investiga benchmarks salariales y arma argumentos de negociación.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D: Personalización&lt;/strong&gt; — Redacta mensajes personalizados para carta de presentación/contacto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E: Puntuación final (A-F)&lt;/strong&gt; — Agrega los bloques previos y recomienda solo las ofertas &amp;gt;4.0/5.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;F: Preparación para entrevistas (STAR+R)&lt;/strong&gt; — Genera historias de tu CV en formato STAR con reflexión (“+R”) y las almacena en &lt;code&gt;story-bank.md&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;También genera scripts de negociación y estrategias para rechazar descuentos geográficos o usar ofertas competidoras.&lt;/p&gt;




&lt;h2&gt;
  
  
  Generación de PDF optimizado para ATS
&lt;/h2&gt;

&lt;p&gt;El generador de PDF adapta tu CV a cada oferta. ¿Cómo funciona?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lee la descripción y extrae los requisitos y keywords clave.&lt;/li&gt;
&lt;li&gt;Reescribe tu experiencia para resaltar esas keywords (sin inventar nada).&lt;/li&gt;
&lt;li&gt;Renderiza a PDF vía Playwright/Puppeteer usando plantilla HTML (Space Grotesk, DM Sans).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La plantilla es MIT, editable y forkeable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Genera CV personalizado para una oferta&lt;/span&gt;
/career-ops pdf

&lt;span class="c"&gt;# O en pipeline completa&lt;/span&gt;
/career-ops &lt;span class="o"&gt;{&lt;/span&gt;URL o descripción&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La salida va a &lt;code&gt;output/&lt;/code&gt;, ignorado por Git para proteger tus datos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Escaneo de portales a escala
&lt;/h2&gt;

&lt;p&gt;Career-Ops incluye +45 empresas preconfiguradas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Laboratorios de IA:&lt;/strong&gt; Anthropic, OpenAI, Mistral, Cohere, LangChain, Pinecone&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IA de Voz:&lt;/strong&gt; ElevenLabs, PolyAI, Parloa, Hume AI, Deepgram, Vapi, Bland AI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plataformas de IA:&lt;/strong&gt; Retool, Airtable, Vercel, Temporal, Glean, Arize AI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLMOps:&lt;/strong&gt; Langfuse, Weights &amp;amp; Biases, Lindy, Cognigy, Speechmatics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Empresas:&lt;/strong&gt; Salesforce, Twilio, Gong, Dialpad&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatización:&lt;/strong&gt; n8n, Zapier, Make.com&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Europeas (DACH):&lt;/strong&gt; Factorial, Attio, Tinybird, Clarity AI, Travelperk, +31 empresas DACH aportadas por la comunidad&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El escáner usa Playwright para navegar páginas de empleo y consulta APIs de Greenhouse, Ashby, Lever y Wellfound. Ajusta empresas objetivo en &lt;code&gt;portals.yml&lt;/code&gt; y ejecuta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/career-ops scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las nuevas ofertas se agregan automáticamente a tu pipeline.&lt;/p&gt;




&lt;h2&gt;
  
  
  Procesamiento por lotes
&lt;/h2&gt;

&lt;p&gt;Si tienes varias URLs para evaluar, usa el modo batch para procesarlas en paralelo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Coloca las URLs en jds/&lt;/span&gt;
&lt;span class="c"&gt;# Luego ejecuta:&lt;/span&gt;
career-ops batch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto lanza workers &lt;code&gt;claude -p&lt;/code&gt; en paralelo, cada uno evaluando una oferta. Los resultados se deduplican y fusionan en el tracking. El runner &lt;code&gt;batch/batch-runner.sh&lt;/code&gt; maneja fallos y orquesta los trabajadores.&lt;/p&gt;

&lt;p&gt;Procesar 20 ofertas manualmente puede llevar un día; en batch, menos de una hora.&lt;/p&gt;




&lt;h2&gt;
  
  
  Panel de control TUI (Go)
&lt;/h2&gt;

&lt;p&gt;El tracking se guarda en &lt;code&gt;data/applications.md&lt;/code&gt; (markdown table). El dashboard TUI (Go + Bubble Tea) muestra visualmente tu pipeline:&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;cd &lt;/span&gt;dashboard
go build &lt;span class="nt"&gt;-o&lt;/span&gt; career-dashboard &lt;span class="nb"&gt;.&lt;/span&gt;
./career-dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Funciones: 6 pestañas de filtro, 4 modos de orden, agrupaciones, previsualización de informes y cambios de estado inline. Actualiza estados desde la TUI sin editar archivos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Configuración en 15 minutos
&lt;/h2&gt;

&lt;p&gt;Pasos rápidos para implementarlo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Clona e instala&lt;/span&gt;
git clone https://github.com/santifer/career-ops.git
&lt;span class="nb"&gt;cd &lt;/span&gt;career-ops &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install
&lt;/span&gt;npx playwright &lt;span class="nb"&gt;install &lt;/span&gt;chromium

&lt;span class="c"&gt;# 2. Configura tu perfil&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;config/profile.example.yml config/profile.yml
&lt;span class="c"&gt;# Edita profile.yml: nombre, ubicación, rol, salario, preferencias&lt;/span&gt;

&lt;span class="c"&gt;# 3. Empresas objetivo&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;templates/portals.example.yml portals.yml
&lt;span class="c"&gt;# Añade/elimina empresas&lt;/span&gt;

&lt;span class="c"&gt;# 4. Añade tu CV&lt;/span&gt;
&lt;span class="c"&gt;# Crea cv.md en la raíz y pega CV en markdown&lt;/span&gt;

&lt;span class="c"&gt;# 5. Abre Claude Code&lt;/span&gt;
claude
&lt;span class="c"&gt;# Ejemplos de prompts:&lt;/span&gt;
&lt;span class="c"&gt;# "Cambia los arquetipos a roles de ingeniería backend"&lt;/span&gt;
&lt;span class="c"&gt;# "Añade estas 5 empresas a portals.yml"&lt;/span&gt;
&lt;span class="c"&gt;# "Actualiza mi perfil con este CV"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude puede modificar pesos, scripts y arquetipos editando los mismos archivos que usa el sistema.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sistema de auto-actualización
&lt;/h2&gt;

&lt;p&gt;Desde la v1.1.0, los archivos de sistema y usuario están separados. Las actualizaciones afectan solo a la capa de sistema; tus datos permanecen intactos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Buscar updates (se ejecuta al iniciar sesión)&lt;/span&gt;
node update-system.mjs check

&lt;span class="c"&gt;# Aplicar actualización&lt;/span&gt;
node update-system.mjs apply

&lt;span class="c"&gt;# Revertir si falla&lt;/span&gt;
node update-system.mjs rollback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se crea una rama de backup antes de actualizar y se valida que tus archivos no se alteren.&lt;/p&gt;




&lt;h2&gt;
  
  
  Diferencias clave frente a otras herramientas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No es un bot de aplicación masiva ni solo un generador de CVs.&lt;/strong&gt; Es un sistema de toma de decisión: te ayuda a decir NO y filtra ofertas que no encajan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Razona sobre idoneidad real, no solo keywords.&lt;/strong&gt; Compara tu experiencia de manera semántica, no por coincidencia de palabras.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mejora con contexto.&lt;/strong&gt; Cuanto más personalices tu perfil y añadas historias, más precisas son las evaluaciones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Todo es local.&lt;/strong&gt; Tus datos, CVs y PDFs nunca salen de tu máquina (excepto llamadas de API a Anthropic).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Limitaciones a considerar
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Requiere Claude Code:&lt;/strong&gt; Solo funciona con Claude Code y una cuenta de Anthropic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playwright no es infalible:&lt;/strong&gt; Algunos portales cambian su HTML, lo que puede romper el scrapping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Necesita calibración inicial:&lt;/strong&gt; La primera configuración requiere dedicar ~1 hora a tu perfil.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;El batch puede consumir créditos:&lt;/strong&gt; Procesar muchos puestos en paralelo usa más tokens. Monitorea tu uso antes de lanzar lotes grandes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consulta [internal: how-ai-agent-memory-works] para entender la importancia del contexto y calibración en sistemas de IA.&lt;/p&gt;




&lt;h2&gt;
  
  
  ¿Para quién es Career-Ops?
&lt;/h2&gt;

&lt;p&gt;Está orientado a desarrolladores y técnicos que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buscan empleo activamente y quieren automatizar el seguimiento.&lt;/li&gt;
&lt;li&gt;Aplican principalmente a empresas de IA y tecnología.&lt;/li&gt;
&lt;li&gt;Valoran la evaluación inteligente por IA antes de aplicar.&lt;/li&gt;
&lt;li&gt;Se sienten cómodos con la línea de comandos y edición de YAML.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No es ideal para usuarios no técnicos ni para quienes buscan una GUI o envío automatizado de solicitudes. Siempre decides tú si aplicar.&lt;/p&gt;




&lt;h2&gt;
  
  
  Primeros pasos
&lt;/h2&gt;

&lt;p&gt;Clona el repo, añade tu CV y dedica una hora a configurar tu perfil con Claude. Ejecuta tu primera evaluación en una oferta relevante y ajusta tu perfil según resultados.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/santifer/career-ops" rel="noopener noreferrer"&gt;github.com/santifer/career-ops&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Licencia MIT. Contribuciones bienvenidas: abre un issue antes de enviar PRs.&lt;/p&gt;




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

&lt;p&gt;Career-Ops es la pipeline de búsqueda de empleo open source más completa para desarrolladores. El motor de puntuación A-F, la generación automática de CVs, el procesamiento masivo en paralelo y el panel TUI en Go ofrecen un flujo de trabajo eficiente y enfocado.&lt;/p&gt;

&lt;p&gt;La búsqueda de empleo es un problema de información, no de volumen. Career-Ops te ayuda a filtrar y priorizar donde realmente vale la pena aplicar.&lt;/p&gt;




&lt;h2&gt;
  
  
  Preguntas Frecuentes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;¿Career-Ops cuesta algo?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Es gratis y MIT. Solo pagas por el uso de la API de Claude (evaluación completa ≈ $0.05 usando Claude 3.5 Haiku).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Se puede usar con otros modelos?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No directamente. Está construido para Claude Code; portarlo requiere reescribir definiciones de habilidades.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo optimiza para ATS?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Extrae keywords de la oferta y reescribe tu experiencia para resaltar esas palabras en tu CV PDF, sin inventar experiencia. Usa fuentes seguras para ATS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué portales soporta el escáner?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Greenhouse, Ashby, Lever, Wellfound, Workable, RemoteFront y páginas personalizadas via Playwright. +31 empresas DACH añadidas por la comunidad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Mis datos están seguros?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí, todo es local y está ignorado por Git. Solo se envían datos a la API de Anthropic cuando se evalúa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo añadir mis propias empresas?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí, edita &lt;code&gt;portals.yml&lt;/code&gt;. Si usan Greenhouse, Ashby o Lever, el escáner las detecta automáticamente. Para páginas personalizadas, define selectores de Playwright.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cuánto tarda una evaluación?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
2-4 minutos por oferta con PDF. En batch, 10 ofertas se procesan en paralelo y tardan sobre lo mismo que 1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué es STAR+R?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Formato de entrevista (Situación, Tarea, Acción, Resultado + Reflexión). Career-Ops añade la columna de Reflexión para mostrar seniority.&lt;/p&gt;




&lt;p&gt;¿Listo para profesionalizar tu búsqueda de empleo?&lt;br&gt;&lt;br&gt;
Implementa Career-Ops y automatiza tu pipeline hoy mismo.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Mejores Asistentes de Codificación Open Source en 2026: Alternativas Gratis a Cursor</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Tue, 07 Apr 2026 09:55:56 +0000</pubDate>
      <link>https://forem.com/roobia/mejores-asistentes-de-codificacion-open-source-en-2026-alternativas-gratis-a-cursor-1fnp</link>
      <guid>https://forem.com/roobia/mejores-asistentes-de-codificacion-open-source-en-2026-alternativas-gratis-a-cursor-1fnp</guid>
      <description>&lt;h2&gt;
  
  
  En resumen
&lt;/h2&gt;

&lt;p&gt;Cursor cuesta 20 $/mes. Windsurf cuesta 15 $/mes. Cinco alternativas de código abierto ahora igualan el 80% de la funcionalidad de forma gratuita, incluyendo la codificación agéntica, ediciones de múltiples archivos y flexibilidad para usar tu propio modelo. Esta guía cubre las mejores, para qué sirve cada una y cómo elegir.&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;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;Hace un año, "asistente de codificación de código abierto" significaba un complemento de autocompletado de código que sugería la siguiente línea. Hoy significa un entorno de codificación agéntico completo que puede leer tu base de código, escribir pruebas, ejecutar comandos de terminal e iterar sobre su propia salida.&lt;/p&gt;

&lt;p&gt;La brecha entre las herramientas de pago y las alternativas gratuitas se ha cerrado drásticamente. Cursor sigue siendo el estándar de oro para la codificación agéntica, pero a 20 $/mes por desarrollador, se suma rápidamente para los equipos. Windsurf, a 15 $/mes, es una alternativa sólida. GitHub Copilot, a 10 $/mes, tiene la mayor adopción. Las tres son propietarias. No puedes auditar el código, no puedes autoalojarlas y estás limitado a sus elecciones de modelo.&lt;/p&gt;

&lt;p&gt;Las herramientas de código abierto de este artículo te ofrecen flexibilidad de modelo, auditabilidad completa y cero tarifas de suscripción. La contrapartida es el tiempo de configuración y, en algunos casos, una experiencia de usuario más tosca.&lt;/p&gt;

&lt;p&gt;💡Una cosa que ninguna de estas herramientas hace: probar las API que invoca tu código generado por IA. Ahí es donde entra Apidog. Una vez que un asistente de codificación de IA escribe un cliente REST o genera puntos finales con especificaciones OpenAPI, los escenarios de prueba de Apidog te permiten verificar esas integraciones antes de que lleguen a producción. Consulta [internal: api-testing-tutorial] para el flujo de trabajo de pruebas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué los asistentes de codificación de código abierto son viables en 2026
&lt;/h2&gt;

&lt;p&gt;Tres cosas cambiaron.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acceso a modelos&lt;/strong&gt;: OpenAI, Anthropic y Google ofrecen acceso a la API de sus modelos de vanguardia. Una herramienta de código abierto con buena UX puede ofrecer el mismo modelo subyacente que Cursor; simplemente no viene con el envoltorio propietario. Herramientas como Continue.dev y Cline te permiten conectar directamente Claude 3.5 Sonnet, GPT-4o o Gemini 1.5 Pro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modelos locales&lt;/strong&gt;: Ollama facilitó la ejecución de Qwen2.5-Coder, DeepSeek-Coder-V2 y Code Llama localmente. Para bases de código sensibles donde no puedes enviar código a una API externa, los modelos locales ahora son realmente utilizables para tareas de codificación.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arquitectura de agente&lt;/strong&gt;: la API de uso de herramientas de Claude y la llamada de funciones de GPT-4o estandarizaron cómo funcionan los agentes de codificación. Los frameworks de código abierto pueden replicar el mismo bucle de leer-archivo/escribir-archivo/ejecutar-terminal que impulsa el modo de agente de Cursor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Los 5 mejores asistentes de codificación de código abierto
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Continue.dev
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Qué es&lt;/strong&gt;: una extensión de VS Code y JetBrains que añade barra lateral de chat, ediciones en línea y preguntas y respuestas con conocimiento de la base de código. Es la &lt;a href="https://github.com/continuedev/continue" rel="noopener noreferrer"&gt;opción de código abierto&lt;/a&gt; más madura.&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%2Fnub0gbftgsmggqyy4qzm.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%2Fnub0gbftgsmggqyy4qzm.png" alt="Continue.dev" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ideal para&lt;/strong&gt;: desarrolladores que desean una experiencia similar a Cursor en VS Code sin abandonar su configuración existente. Ideal para equipos que quieren controlar qué modelo utilizan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuración rápida&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Instala Continue.dev desde el marketplace de VS Code.&lt;/li&gt;
&lt;li&gt;Añade tu clave API de OpenAI, Anthropic, Gemini o instancia local de Ollama.&lt;/li&gt;
&lt;li&gt;Comienza a usarlo inmediatamente; no requiere cuenta.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Lo que puedes hacer&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat con contexto e indexación completa de la base de código.&lt;/li&gt;
&lt;li&gt;Ediciones en línea con &lt;code&gt;Ctrl+I&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Búsqueda &lt;code&gt;@codebase&lt;/code&gt; en todo el repositorio.&lt;/li&gt;
&lt;li&gt;Comandos de barra y proveedores de contexto personalizados.&lt;/li&gt;
&lt;li&gt;Compatible con más de 20 proveedores de modelos.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;No tiene ejecución de terminal incorporada ni bucle de agente autónomo.&lt;/li&gt;
&lt;li&gt;Es un asistente, no un agente. Apruebas manualmente cada cambio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Costo&lt;/strong&gt;: gratuito. Autoalojamiento o uso de tus propias claves API.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Cursor&lt;/th&gt;
&lt;th&gt;Continue.dev&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Precio&lt;/td&gt;
&lt;td&gt;20 $/mes&lt;/td&gt;
&lt;td&gt;Gratuito&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Soporte VS Code&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Soporte JetBrains&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexibilidad modelo&lt;/td&gt;
&lt;td&gt;Limitada&lt;/td&gt;
&lt;td&gt;Completa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modo agente&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Parcial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ideal para&lt;/td&gt;
&lt;td&gt;Codificación agéntica completa&lt;/td&gt;
&lt;td&gt;Edición asistida con control de modelo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  2. Aider
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Qué es&lt;/strong&gt;: un agente de codificación basado en terminal que utiliza git como su interfaz principal. Describe lo que quieres, &lt;a href="http://apidog.com/blog/aider-ai/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Aider&lt;/a&gt; lee los archivos relevantes, realiza cambios y los commitea.&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%2F3kbw9saep1ohti5vp3ld.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%2F3kbw9saep1ohti5vp3ld.png" alt="Aider" width="800" height="651"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ideal para&lt;/strong&gt;: ingenieros de backend que trabajan en la terminal y desean un agente autónomo ejecutable en CI o servidores remotos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuración rápida&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Instala con:
&lt;/li&gt;
&lt;/ol&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;aider-chat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Inicia desde la raíz de tu proyecto:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   aider &lt;span class="nt"&gt;--model&lt;/span&gt; claude-3-5-sonnet-20241022
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lo que puedes hacer&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ediciones autónomas de múltiples archivos con commits de git.&lt;/li&gt;
&lt;li&gt;Soporte para Claude, GPT-4o, Gemini y modelos locales.&lt;/li&gt;
&lt;li&gt;Ejecuta en modo totalmente automático con el flag &lt;code&gt;--yes&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Lee la estructura del repositorio para entender el código.&lt;/li&gt;
&lt;li&gt;Entrada de voz y benchmarking integrado (&lt;code&gt;aider-bench&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Solo terminal, sin integración IDE.&lt;/li&gt;
&lt;li&gt;Revisar cambios grandes puede ser incómodo por falta de vista visual de diferencias.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Costo&lt;/strong&gt;: gratuito. Solo pagas el uso de la API del modelo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo práctico (automatiza fixing de tests fallidos en CI):&lt;/strong&gt;&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="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ejecutar Aider para arreglar pruebas&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;aider --model gpt-4o \&lt;/span&gt;
          &lt;span class="s"&gt;--message "Arreglar las pruebas fallidas en test_api.py" \&lt;/span&gt;
          &lt;span class="s"&gt;--yes \&lt;/span&gt;
          &lt;span class="s"&gt;--no-git&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Cline
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Qué es&lt;/strong&gt;: extensión de VS Code que ejecuta un ciclo de agente completo con uso de herramientas. &lt;a href="http://apidog.com/blog/what-is-cline/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cline&lt;/a&gt; puede leer y escribir archivos, ejecutar comandos de terminal, navegar por la web y controlar tu navegador. Es el equivalente más cercano al modo agente completo de Cursor.&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%2Fzmnd03117g9cnqchczkq.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%2Fzmnd03117g9cnqchczkq.png" alt="Cline" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ideal para&lt;/strong&gt;: desarrolladores que buscan tareas autónomas y de varios pasos gestionadas dentro de VS Code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuración rápida&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Instala desde el marketplace de VS Code.&lt;/li&gt;
&lt;li&gt;Añade tu clave API.&lt;/li&gt;
&lt;li&gt;Inicia nueva tarea.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Lo que puedes hacer&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ciclo agéntico completo: leer, escribir, ejecutar, navegar.&lt;/li&gt;
&lt;li&gt;Modo de aprobación: aprueba cada acción antes de ejecutarse, o activa aprobación automática.&lt;/li&gt;
&lt;li&gt;Flexibilidad de modelo: Claude, GPT-4o, Gemini, Bedrock, Vertex, Ollama local.&lt;/li&gt;
&lt;li&gt;Seguimiento de costos por tarea.&lt;/li&gt;
&lt;li&gt;Inyección de prompt de sistema personalizado.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Puede resultar costoso con modelos premium en tareas largas porque cada paso envía el contexto completo.&lt;/li&gt;
&lt;li&gt;Vigila tus costos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Costo&lt;/strong&gt;: gratuito. Pagas al proveedor del modelo.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Modo
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Qué es&lt;/strong&gt;: IDE de código abierto (lanzado en abril de 2026), alternativo a Cursor, Kiro y Windsurf. IDE completo sobre el núcleo de VS Code con IA integrada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ideal para&lt;/strong&gt;: desarrolladores que quieren un IDE dedicado con IA sin suscripción. Proyecto joven, pero prometedor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuración rápida&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clona desde GitHub:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git clone https://github.com/mohshomis/modo.git
   &lt;span class="nb"&gt;cd &lt;/span&gt;modo
   npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lo que puedes hacer&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compatibilidad total con el ecosistema de extensiones de VS Code.&lt;/li&gt;
&lt;li&gt;Chat de IA y autocompletado integrados.&lt;/li&gt;
&lt;li&gt;Agnóstico de modelo.&lt;/li&gt;
&lt;li&gt;Código abierto y autoalojable.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Proyecto reciente, menos probado que Continue o Cline.&lt;/li&gt;
&lt;li&gt;Solo instalación manual; aún no está en el Marketplace de VS Code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Costo&lt;/strong&gt;: gratuito.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Void editor
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Qué es&lt;/strong&gt;: fork de VS Code que añade capacidades nativas de IA sin extensiones. Aspira a ser el &lt;a href="https://github.com/voideditor/void" rel="noopener noreferrer"&gt;"Cursor de código abierto"&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%2Fpdpkvyrfe5l015d6t29e.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%2Fpdpkvyrfe5l015d6t29e.png" alt="Void editor" width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ideal para&lt;/strong&gt;: quienes buscan la experiencia completa de Cursor sin suscripción y prefieren un fork en vez de una extensión.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuración rápida&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Descarga desde voideditor.com.&lt;/li&gt;
&lt;li&gt;Abre tu proyecto.&lt;/li&gt;
&lt;li&gt;Configura tu modelo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Lo que puedes hacer&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat e indexación nativos.&lt;/li&gt;
&lt;li&gt;Edición de diferencias en línea.&lt;/li&gt;
&lt;li&gt;Sistema de checkpoints (deshacer sesiones completas de IA).&lt;/li&gt;
&lt;li&gt;Soporte para modelos locales vía Ollama.&lt;/li&gt;
&lt;li&gt;Compatibilidad con extensiones de VS Code.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Los forks se quedan atrás respecto a actualizaciones oficiales de VS Code.&lt;/li&gt;
&lt;li&gt;Algunas extensiones pueden ser incompatibles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Costo&lt;/strong&gt;: gratuito.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabla comparativa
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Herramienta&lt;/th&gt;
&lt;th&gt;Soporte IDE&lt;/th&gt;
&lt;th&gt;Flexibilidad de modelo&lt;/th&gt;
&lt;th&gt;Modo agente&lt;/th&gt;
&lt;th&gt;Ideal para&lt;/th&gt;
&lt;th&gt;Costo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Continue.dev&lt;/td&gt;
&lt;td&gt;VS Code, JetBrains&lt;/td&gt;
&lt;td&gt;Completa (más de 20 proveedores)&lt;/td&gt;
&lt;td&gt;Parcial&lt;/td&gt;
&lt;td&gt;Edición asistida, control de modelo en equipo&lt;/td&gt;
&lt;td&gt;Gratuito&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aider&lt;/td&gt;
&lt;td&gt;Terminal&lt;/td&gt;
&lt;td&gt;Completa&lt;/td&gt;
&lt;td&gt;Completo (agente de terminal)&lt;/td&gt;
&lt;td&gt;Ingenieros de backend, automatización CI/CD&lt;/td&gt;
&lt;td&gt;Gratuito&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cline&lt;/td&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;Completa (Claude, GPT, Gemini, local)&lt;/td&gt;
&lt;td&gt;Completo&lt;/td&gt;
&lt;td&gt;Tareas autónomas de varios pasos en VS Code&lt;/td&gt;
&lt;td&gt;Gratuito&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modo&lt;/td&gt;
&lt;td&gt;IDE basado en VS Code&lt;/td&gt;
&lt;td&gt;Completa&lt;/td&gt;
&lt;td&gt;En desarrollo&lt;/td&gt;
&lt;td&gt;IDE con IA primero sin suscripción&lt;/td&gt;
&lt;td&gt;Gratuito&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Void editor&lt;/td&gt;
&lt;td&gt;Fork de VS Code&lt;/td&gt;
&lt;td&gt;Completa&lt;/td&gt;
&lt;td&gt;Parcial&lt;/td&gt;
&lt;td&gt;UX similar a Cursor, código abierto&lt;/td&gt;
&lt;td&gt;Gratuito&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Cómo elegir el correcto
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Usas VS Code y quieres chat tipo Cursor sin pagar&lt;/strong&gt;: empieza con Continue.dev. Es el más pulido y con la comunidad más activa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desarrollador backend en terminal&lt;/strong&gt;: usa Aider. Integración nativa con git, ideal para flujos CI/CD. Consulta [internal: how-to-build-tiny-llm-from-scratch] si estás creando backends IA.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buscas un agente autónomo de varios pasos&lt;/strong&gt;: Cline. Es el agente de código abierto más avanzado, ideal para automatización compleja.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quieres un IDE de IA dedicado sin extensiones&lt;/strong&gt;: prueba Void editor. Observa la evolución de Modo para el futuro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacidad total del código (sin API externa)&lt;/strong&gt;: usa cualquiera con Ollama como backend. Qwen2.5-Coder-32B funciona bien en máquinas con &amp;gt;24 GB de VRAM y produce código de calidad.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Para equipos&lt;/strong&gt;: Continue.dev y Cline permiten configuración compartida vía archivos versionados. Consulta [internal: rest-api-best-practices] para pruebas de API consistentes junto a tu stack de codificación.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cómo Apidog encaja con los flujos de trabajo de codificación con IA
&lt;/h2&gt;

&lt;p&gt;Los asistentes de codificación con IA generan código rápido, pero no verifican que las APIs funcionen realmente.&lt;/p&gt;

&lt;p&gt;Por ejemplo: Continue.dev o Cline generan un cliente REST. Puede verse correcto sintácticamente, pero puede tener rutas incorrectas, encabezados faltantes o manejar solo casos de éxito. Estos errores solo aparecen al ejecutar contra APIs reales.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Soluciona esto con Apidog:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Importa el endpoint generado en Apidog (URL+metodo, o desde especificación OpenAPI).&lt;/li&gt;
&lt;li&gt;Crea un Escenario de Prueba: encadena autenticación, request principal, aserción sobre respuesta.&lt;/li&gt;
&lt;li&gt;Añade casos negativos: token caducado, cuerpo mal formado, límite de tasa.&lt;/li&gt;
&lt;li&gt;Usa Smart Mock para simular APIs si no tienes entorno de staging.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Así obtienes velocidad de IA sin sacrificar pruebas de integración.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo concreto:&lt;/strong&gt; le pides a Cline que escriba un cliente de la API de GitHub. Genera una clase &lt;code&gt;GitHubClient&lt;/code&gt; con métodos CRUD. En Apidog:&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;"escenario"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Verificación de cliente de API de GitHub"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pasos"&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;"nombre"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Crear issue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"método"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POST"&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://api.github.com/repos/{owner}/{repo}/issues"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"cabeceras"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Autorización"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer {{token}}"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"cuerpo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"título"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Issue de prueba"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"cuerpo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Creado por escenario de prueba"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"aserciones"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"campo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"estado"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"operador"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"igual a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"valor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"campo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"respuesta.número"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"operador"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"existe"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"nombre"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Listar issues (verificar que aparece el issue creado)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"método"&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;"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://api.github.com/repos/{owner}/{repo}/issues"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"aserciones"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"campo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"respuesta[0].número"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"operador"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"igual a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"valor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{steps[0].response.number}}"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto toma 5 minutos y detecta errores comunes de generación de código IA: método HTTP incorrecto, campos faltantes, paginación no manejada. Consulta [internal: how-ai-agent-memory-works] para probar APIs de agentes con estado.&lt;/p&gt;

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

&lt;p&gt;El ecosistema de asistentes de codificación de código abierto es legítimamente bueno en 2026. No necesitas suscripción a Cursor para tener codificación agéntica, chat con contexto de la base de código y edición de múltiples archivos. Continue.dev, Aider y Cline cubren distintos flujos; Modo y Void editor valen la pena observarlos.&lt;/p&gt;

&lt;p&gt;La pieza faltante son las pruebas. El código IA es rápido de escribir y fácil de romper. Combina tu asistente de código abierto con Apidog para verificar las integraciones de API generadas.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;¿Es Continue.dev tan bueno como Cursor?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Para chat y ediciones en línea, está cerca. Para tareas de agente autónomo (desarrollo completo sin intervención), el modo agente de Cursor sigue estando por delante. Si configuras Continue.dev con Claude 3.5 Sonnet o GPT-4o, la brecha se reduce.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo usar asistentes de código abierto solo con modelos locales?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí. Todas las herramientas aquí son compatibles con Ollama, para modelos como Qwen2.5-Coder, DeepSeek-Coder-V2 o Code Llama. La calidad de modelos locales es menor en tareas complejas, pero suficiente para código repetitivo y refactorizaciones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo elijo un modelo para asistentes de código abierto?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Claude 3.5 Sonnet es mejor en tareas complejas y multi-step. GPT-4o es fuerte generando código y soporta llamadas de funciones. DeepSeek-Coder-V2 es la mejor alternativa open weight para código y se ejecuta localmente. Usa Claude o GPT-4o si el costo no es problema; DeepSeek si priorizas privacidad o volumen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Es seguro usar Aider con el modo &lt;code&gt;--yes&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Úsalo con precaución: aprueba automáticamente todos los cambios y commits. Ejecútalo en una rama, nunca en main, y revisa los diffs antes de fusionar. Útil en CI, pero no recomendado para desarrollo interactivo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué es Kiro?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Kiro es un IDE de IA de AWS, anunciado en 2025. Basado en VS Code, como Cursor, pero con integración profunda con AWS. No es open source. Modo lo menciona como objetivo a reemplazar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Pueden los equipos compartir la configuración de estas herramientas?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí. Continue.dev lee de &lt;code&gt;.continue/config.json&lt;/code&gt;, Cline desde &lt;code&gt;settings.json&lt;/code&gt; de VS Code, Aider desde &lt;code&gt;.aider.conf.yml&lt;/code&gt;. Todo puede versionarse y estandarizarse en equipo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Funcionan estas herramientas sin conexión?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Con modelos locales vía Ollama: sí, completamente offline. Con modelos vía API (Claude, GPT-4o): requieren internet. Void editor y Modo pueden configurarse para uso sin conexión con modelos locales.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo construir un LLM desde cero: guía y aprendizaje</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Tue, 07 Apr 2026 04:32:46 +0000</pubDate>
      <link>https://forem.com/roobia/como-construir-un-llm-desde-cero-guia-y-aprendizaje-2gph</link>
      <guid>https://forem.com/roobia/como-construir-un-llm-desde-cero-guia-y-aprendizaje-2gph</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Construir un modelo de lenguaje mínimo desde cero requiere menos de 300 líneas de Python. El proceso revela exactamente cómo funcionan la tokenización, la atención y la inferencia, lo que te convierte en un consumidor de API mucho mejor cuando integras LLMs de producción en tus aplicaciones.&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;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;La mayoría de los desarrolladores tratan los modelos de lenguaje como cajas negras: envías texto, salen tokens y, en algún punto intermedio, ocurre la magia. Este enfoque es suficiente hasta que necesitas depurar una integración de API defectuosa, ajustar parámetros de muestreo o entender por qué tu modelo sigue alucinando datos estructurados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=40229753" rel="noopener noreferrer"&gt;GuppyLM&lt;/a&gt;, un proyecto que destacó en HackerNews, hace visibles los internos de los LLM. Es un transformador de 8.7M de parámetros escrito desde cero en Python, entrenable en menos de una hora en una GPU de consumo, y cuyo código cabe en un solo archivo. Su objetivo no es competir con GPT-4, sino desmitificar cómo funcionan realmente los LLM.&lt;/p&gt;

&lt;p&gt;En este artículo verás cómo construir un pequeño LLM, qué hace cada componente y qué te aporta comprender los detalles internos cuando trabajas con APIs de IA.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Si estás probando integraciones de API de IA, los Escenarios de prueba de Apidog te permiten verificar respuestas en streaming, afirmar la estructura de los tokens y simular finalizaciones de casos extremos sin consumir créditos de producción. Más sobre esto más adelante.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué hace que un modelo de lenguaje sea "pequeño"?
&lt;/h2&gt;

&lt;p&gt;Un LLM de producción como GPT-4 tiene cientos de miles de millones de parámetros. Un LLM "pequeño" trabaja en el rango de 1M a 25M de parámetros. Ejemplos: GuppyLM (8.7M), nanoGPT de Karpathy (124M), MicroLM (1-2M).&lt;/p&gt;

&lt;p&gt;Ventajas de los LLM pequeños:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se entrenan en un portátil o Google Colab.&lt;/li&gt;
&lt;li&gt;Caben en la memoria de la CPU.&lt;/li&gt;
&lt;li&gt;Se pueden inspeccionar, modificar y depurar a nivel de pesos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Limitaciones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No manejan razonamientos complejos.&lt;/li&gt;
&lt;li&gt;No generan texto coherente de formato largo de manera fiable.&lt;/li&gt;
&lt;li&gt;No igualan la profundidad factual de los modelos de producción.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El valor está en comprender su funcionamiento, no en el resultado final.&lt;/p&gt;

&lt;h2&gt;
  
  
  Componentes principales: cómo funciona realmente un LLM
&lt;/h2&gt;

&lt;p&gt;Antes de escribir código, debes conocer estos cuatro componentes principales:&lt;/p&gt;

&lt;h3&gt;
  
  
  Tokenizador
&lt;/h3&gt;

&lt;p&gt;Convierte texto sin procesar a IDs de enteros. Por ejemplo, &lt;code&gt;"Hello, world!"&lt;/code&gt; se convierte en &lt;code&gt;[15496, 11, 995, 0]&lt;/code&gt;. Cada entero representa una subpalabra de un vocabulario fijo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relevancia en APIs:&lt;/strong&gt; el conteo de tokens afecta latencia y costo. Entender cómo los tokenizadores dividen el texto ayuda a escribir prompts que se ajusten a la ventana de contexto y evitar truncamientos.&lt;/p&gt;

&lt;p&gt;GuppyLM usa un tokenizador a nivel de caracteres. Modelos de producción usan BPE (Byte Pair Encoding) con vocabularios de 50K-100K tokens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Capa de incrustación (Embedding layer)
&lt;/h3&gt;

&lt;p&gt;Convierte IDs de tokens en vectores densos aprendidos (por ejemplo, 384 dimensiones en GuppyLM). Los tokens similares terminan agrupados en el espacio vectorial. Se añaden incrustaciones de posición para que el modelo conozca el orden de los tokens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bloques de transformador
&lt;/h3&gt;

&lt;p&gt;Cálculo central del modelo. Cada bloque contiene:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Autoatención (Self-attention):&lt;/strong&gt; cada token atiende a todos los demás en la secuencia para decidir cuáles son importantes para predecir el siguiente token. GuppyLM usa 6 cabezas de atención en 6 capas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Red de avance (Feed-forward network):&lt;/strong&gt; una MLP de dos capas con activación ReLU.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cabezal de salida
&lt;/h3&gt;

&lt;p&gt;Tras el bloque final, una capa lineal proyecta la representación de cada token al tamaño del vocabulario. Softmax convierte a probabilidades, se elige (o muestrea) el siguiente token y se repite el proceso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Construyendo un LLM mínimo en Python
&lt;/h2&gt;

&lt;p&gt;A continuación, un LLM mínimo funcional siguiendo el enfoque de GuppyLM, usando PyTorch.&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;torch&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch.nn&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch.nn.functional&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;

&lt;span class="c1"&gt;# Hiperparámetros
&lt;/span&gt;&lt;span class="n"&gt;VOCAB_SIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;     &lt;span class="c1"&gt;# nivel de caracteres ASCII
&lt;/span&gt;&lt;span class="n"&gt;D_MODEL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt;        &lt;span class="c1"&gt;# dimensión de embedding
&lt;/span&gt;&lt;span class="n"&gt;N_HEADS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;          &lt;span class="c1"&gt;# cabezas de atención
&lt;/span&gt;&lt;span class="n"&gt;N_LAYERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;         &lt;span class="c1"&gt;# bloques transformador
&lt;/span&gt;&lt;span class="n"&gt;SEQ_LEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;         &lt;span class="c1"&gt;# ventana de contexto
&lt;/span&gt;&lt;span class="n"&gt;DROPOUT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SelfAttention&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_heads&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;n_heads&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n_heads&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head_dim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;n_heads&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;qkv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;proj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dropout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Dropout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DROPOUT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;
        &lt;span class="n"&gt;qkv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;qkv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;n_heads&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head_dim&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qkv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unbind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dim&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="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Máscara causal: cada token solo atiende a tokens previos
&lt;/span&gt;        &lt;span class="n"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head_dim&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;
        &lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transpose&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="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="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;
        &lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;triu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;diagonal&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="nf"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;attn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;masked_fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-inf&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;softmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dim&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="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dropout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;proj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TransformerBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_heads&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SelfAttention&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_heads&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Sequential&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ReLU&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Dropout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DROPOUT&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ln1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LayerNorm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ln2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LayerNorm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ln1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ln2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TinyLLM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;VOCAB_SIZE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;D_MODEL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pos_embed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SEQ_LEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;D_MODEL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ModuleList&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="nc"&gt;TransformerBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;D_MODEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;N_HEADS&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;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N_LAYERS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ln_f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LayerNorm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;D_MODEL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;D_MODEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;VOCAB_SIZE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;
        &lt;span class="n"&gt;tok_emb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pos_emb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pos_embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tok_emb&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;pos_emb&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;block&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ln_f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;logits&lt;/span&gt;

&lt;span class="c1"&gt;# Inicializa y cuenta parámetros
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TinyLLM&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;total_params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;numel&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;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Model size: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total_params&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; parameters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# ~1.2M
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Bucle de entrenamiento
&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;torch.optim&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;optim&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;train&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;epochs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3e-4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;optimizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;optim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AdamW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;lr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;train&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;epoch&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;epochs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# data: tensor de IDs de tokens, shape [batch, seq_len+1]
&lt;/span&gt;        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="p"&gt;:&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="c1"&gt;# entrada: todos menos el último
&lt;/span&gt;        &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;    &lt;span class="c1"&gt;# objetivo: desplazado por 1
&lt;/span&gt;        &lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;loss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cross_entropy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&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="n"&gt;VOCAB_SIZE&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&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="n"&gt;optimizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zero_grad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;backward&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;optimizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;step&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;epoch&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;10&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Epoch &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;epoch&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, loss: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;item&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Inferencia (generación de texto)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@torch.no_grad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_new_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&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;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;prompt_ids&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;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_new_tokens&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;idx_cond&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;SEQ_LEN&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;  &lt;span class="c1"&gt;# recorta a ventana de contexto
&lt;/span&gt;        &lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idx_cond&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;[:,&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="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;temperature&lt;/span&gt;  &lt;span class="c1"&gt;# solo último token
&lt;/span&gt;        &lt;span class="c1"&gt;# top-k sampling
&lt;/span&gt;        &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;topk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(&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="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&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;1&lt;/span&gt;&lt;span class="p"&gt;]]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-inf&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;probs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;softmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dim&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="n"&gt;next_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;multinomial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;probs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_samples&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="n"&gt;ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next_id&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Lo que esto te enseña sobre el comportamiento de las APIs de IA
&lt;/h2&gt;

&lt;p&gt;Construir un LLM mínimo da claridad sobre varios aspectos de consumo de APIs:&lt;/p&gt;

&lt;h3&gt;
  
  
  La temperatura y el muestreo son mecánicos, no mágicos
&lt;/h3&gt;

&lt;p&gt;La temperatura divide los logits antes del softmax. Temperatura alta = salida más aleatoria; temperatura baja = salida más determinista. Si una API devuelve resultados inconsistentes con &lt;code&gt;temperature=0.0&lt;/code&gt;, no es un bug: la temperatura cero real es un argmax codicioso, pero muchas APIs la redondean para evitar salidas degeneradas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Las ventanas de contexto son límites estrictos
&lt;/h3&gt;

&lt;p&gt;La línea &lt;code&gt;idx_cond = ids[:, -SEQ_LEN:]&lt;/code&gt; muestra que al alcanzar el límite, el modelo descarta silenciosamente los tokens más antiguos. No asumas que la API recuerda todo el historial de conversación. Para más detalles, consulta [interno: cómo-funciona-la-memoria-del-agente-de-IA].&lt;/p&gt;

&lt;h3&gt;
  
  
  Los tokens de streaming son solo pasos de inferencia expuestos
&lt;/h3&gt;

&lt;p&gt;Las APIs de streaming simplemente ejecutan el bucle de inferencia y envían cada token al flujo conforme se genera. Si el flujo se interrumpe, no se puede reanudar: hay que reiniciar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Los logits explican por qué la salida estructurada es difícil
&lt;/h3&gt;

&lt;p&gt;El modelo asigna probabilidad a cada token del vocabulario en cada paso. Generar JSON válido implica que cada token correcto gane en cada posición. Herramientas como Outlines y Guidance restringen la distribución de logits para imponer gramática. Cuando una API de IA ofrece "salida estructurada", internamente está haciendo esto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo probar integraciones de API de IA con Apidog
&lt;/h2&gt;

&lt;p&gt;Comprender la inferencia de LLM permite escribir mejores pruebas de API. Los Escenarios de prueba 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; te permiten encadenar llamadas y afirmar la estructura de las respuestas.&lt;/p&gt;

&lt;p&gt;Ejemplo para una API de chat en streaming:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crea un Escenario de prueba en Apidog con el endpoint &lt;code&gt;/v1/chat/completions&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Añade aserciones para la estructura de la respuesta:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;response.choices[0].finish_reason == "stop"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;response.usage.total_tokens &amp;lt; 4096&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Agrega un paso que envíe la respuesta como contexto al siguiente turno, simulando conversación multi-turno.&lt;/li&gt;
&lt;li&gt;Usa Smart Mock de Apidog para simular el endpoint de IA y probar el manejo de errores:

&lt;ul&gt;
&lt;li&gt;simula &lt;code&gt;finish_reason: "length"&lt;/code&gt; (truncamiento),
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;finish_reason: "content_filter"&lt;/code&gt;,
&lt;/li&gt;
&lt;li&gt;y un timeout de red a mitad de transmisión.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;De esta forma, puedes probar integraciones de IA sin consumir créditos de API en cada ejecución de CI. Consulta [interno: tutorial-de-pruebas-de-api] para más detalles sobre pruebas de API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Probando aserciones de recuento de tokens
&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;"assertions"&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;"field"&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.usage.completion_tokens"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"less_than"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;512&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;"field"&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.choices[0].finish_reason"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"equals"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stop"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"field"&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.choices[0].message.content"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_empty"&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;Ejecuta esto en varios modelos (GPT-4o, Claude 3.5 Sonnet, Gemini 1.5 Pro) en un solo escenario de prueba para detectar diferencias de esquema antes de pasar a producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avanzado: cuantificación y optimización de inferencia
&lt;/h2&gt;

&lt;p&gt;Al tener un LLM pequeño en marcha, es útil entender dos técnicas usadas en producción.&lt;/p&gt;

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

&lt;p&gt;Por defecto, los pesos del modelo son float de 32 bits. La cuantificación los reduce a INT8 o INT4, disminuyendo el uso de memoria 4-8x con poca pérdida de precisión.&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="c1"&gt;# Ejemplo: cuantificación dinámica INT8 en PyTorch
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch.quantization&lt;/span&gt;
&lt;span class="n"&gt;quantized_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quantization&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quantize_dynamic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;qint8&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las APIs de producción ejecutan modelos cuantificados. Cambios en la calidad de salida entre "versiones" de un mismo modelo suelen deberse a esto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Caché KV
&lt;/h3&gt;

&lt;p&gt;En el bucle de inferencia, recalculamos la atención para toda la secuencia. Los sistemas de producción almacenan en caché los pares clave-valor (KV) de los tokens previos para que cada token nuevo solo calcule atención sobre el último. Por eso el primer token de una respuesta streaming tarda más.&lt;/p&gt;

&lt;h2&gt;
  
  
  LLM pequeño vs. API de producción: ¿cuándo usar cada uno?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Caso de uso&lt;/th&gt;
&lt;th&gt;LLM pequeño&lt;/th&gt;
&lt;th&gt;API de producción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Aprendizaje de los internos&lt;/td&gt;
&lt;td&gt;Lo mejor para&lt;/td&gt;
&lt;td&gt;Excesivo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prototipado de aplicación&lt;/td&gt;
&lt;td&gt;Calidad insuficiente&lt;/td&gt;
&lt;td&gt;Lo mejor para&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Datos privados/sensibles&lt;/td&gt;
&lt;td&gt;Buena opción&lt;/td&gt;
&lt;td&gt;Depende del proveedor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Despliegue offline/en el borde&lt;/td&gt;
&lt;td&gt;Viable&lt;/td&gt;
&lt;td&gt;No posible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sensible al costo, alto volumen&lt;/td&gt;
&lt;td&gt;Posible con tradeoffs&lt;/td&gt;
&lt;td&gt;Caro a escala&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tareas de alto razonamiento&lt;/td&gt;
&lt;td&gt;No viable&lt;/td&gt;
&lt;td&gt;Requerido&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;En la práctica: usa la API de producción para tu app, pero ejecuta un modelo pequeño para entender lo que sucede bajo el capó. No compiten. Consulta [interno: asistentes-de-codificación-de-código-abierto-2026] para herramientas que permiten "traer tu propio modelo".&lt;/p&gt;

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

&lt;p&gt;Construir un LLM pequeño desde cero es cosa de un fin de semana. No es para producción, pero te da un modelo mental funcional sobre cómo opera cada modelo de lenguaje, desde GuppyLM hasta GPT-4o. Esa comprensión te ayuda a depurar integraciones de streaming, ajustar parámetros de muestreo y diseñar aserciones para tus pruebas de API de IA.&lt;/p&gt;

&lt;p&gt;GuppyLM es un buen inicio: clónalo, entrénalo con cualquier dataset de texto y revisa el bucle de inferencia. Luego vuelve a tus integraciones de API de producción y las verás de otra manera.&lt;/p&gt;

&lt;p&gt;Prueba los Escenarios de prueba 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; para llevar el mismo rigor a tus pruebas de API de IA que a cualquier backend.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;¿Cuántos parámetros necesita un LLM "pequeño" para generar texto coherente?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Alrededor de 10M-50M de parámetros con buen dataset pueden producir oraciones localmente coherentes. Por debajo de 1M, suele generar galimatías. GuppyLM (8.7M) funciona para conversaciones cortas en su dominio de entrenamiento (60 temas).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo ejecutar un LLM pequeño sin GPU?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí. Modelos con menos de 100M de parámetros funcionan bien en CPU, aunque la inferencia es más lenta. El ejemplo anterior (1.2M) genera tokens en milisegundos en una laptop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿En qué dataset debo entrenar?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Modelos a nivel de caracteres funcionan bien con textos de Proyecto Gutenberg, Wikipedia o cualquier corpus plano. GuppyLM usa un dataset conversacional de 60K entradas en HuggingFace (&lt;code&gt;arman-bd/guppylm-60k-generic&lt;/code&gt;). Para código, usa The Stack o CodeParrot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Diferencia entre temperatura y muestreo top-k?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
La temperatura escala la distribución de logits (aleatoriedad global). Top-k restringe el muestreo a los k tokens más probables antes de aplicar la temperatura. Se usan juntos: primero top-k filtra candidatos, luego la temperatura ajusta probabilidades.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Por qué mi LLM a veces se repite?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
La repetición ocurre cuando el modelo asigna alta probabilidad a los tokens recién generados porque aparecen en el contexto. Las APIs suelen usar penalizaciones por repetición (&lt;code&gt;repetition_penalty=1.1&lt;/code&gt;) para reducir esto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cuánto tiempo lleva entrenar un LLM pequeño?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
El ejemplo anterior entrena para salida coherente en menos de 2 horas en una sola GPU (RTX 3060). GuppyLM entrena en Colab en similar tiempo. Modelos mayores (100M+) requieren multi-GPU y días de entrenamiento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo pasar de LLM pequeño a endpoint de API real rápido?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Exporta a formato GGUF con el script de llama.cpp y sírvelo con llama-server. Obtendrás un endpoint compatible con OpenAI localmente; apunta Apidog para pruebas. Consulta [interno: mejores-prácticas-de-rest-api].&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo manejan los LLM de producción el contexto más largo que su ventana de entrenamiento?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Técnicas como RoPE escalado, atención de ventana y generación aumentada por recuperación extienden el contexto efectivo. La arquitectura central no cambia; se modifican la codificación posicional y la ventana de atención.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo Usar la API Seedance 2.0 en 2026</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Sat, 04 Apr 2026 12:59:45 +0000</pubDate>
      <link>https://forem.com/roobia/como-usar-la-api-seedance-20-en-2026-2gab</link>
      <guid>https://forem.com/roobia/como-usar-la-api-seedance-20-en-2026-2gab</guid>
      <description>&lt;h2&gt;
  
  
  En resumen
&lt;/h2&gt;

&lt;p&gt;La API de Seedance 2.0 se lanzó el 2 de abril de 2026 a través de Volcengine Ark. Para generar un video, envía una tarea con una solicitud POST y luego consulta un endpoint GET hasta que el estado sea "succeeded". La API soporta texto a video, imagen a video, control de primer y último fotograma, referencias multimodales y generación de audio nativo. Un video de 5 segundos en 1080p cuesta aproximadamente $0.93. Descargue el video en las primeras 24 horas: la URL caduca después de ese tiempo.&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;blockquote&gt;
&lt;p&gt;&lt;a href="https://hypereal.cloud" rel="noopener noreferrer"&gt;Hypereal AI&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://hypereal.cloud/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9no1b7kwev33vq2bcepw.png" alt="Hypereal AI"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

&lt;p&gt;El 2 de abril de 2026, la plataforma Volcengine Ark de ByteDance lanzó la API oficial de Seedance 2.0. Antes solo podía usarse desde la consola web. Si has visto tutoriales previos, probablemente muestran la interfaz gráfica. Este artículo aborda la API real para automatizar la generación de video desde código.&lt;/p&gt;

&lt;p&gt;💡La API sigue el patrón de tarea asíncrona: POST para crear, obtienes un ID, luego haces polling con GET hasta terminar. Es recomendable probar este flujo de punta a punta antes de integrarlo en producción. Los escenarios de prueba de Apidog permiten encadenar el envío POST, extraer el ID, hacer polling con GET y validar que la respuesta final tenga la URL de video. Instala Apidog gratis para seguir los ejemplos de la sección correspondiente.&lt;/p&gt;

&lt;p&gt;Este artículo cubre entradas soportadas, cómo leer el costo desde la respuesta y cómo manejar errores comunes en producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es Seedance 2.0?
&lt;/h2&gt;

&lt;p&gt;Seedance 2.0 es el modelo de generación de video de ByteDance en Volcengine Ark bajo los IDs &lt;code&gt;doubao-seedance-2-0-260128&lt;/code&gt; (estándar) y &lt;code&gt;doubao-seedance-2-0-fast-260128&lt;/code&gt; (rápido, menor calidad).&lt;/p&gt;

&lt;p&gt;Novedades respecto a la v1.5:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Control de primer y último fotograma (proporciona imagen inicial y final)&lt;/li&gt;
&lt;li&gt;Entradas multimodales: puedes enviar imágenes, videoclips y audio en la misma solicitud&lt;/li&gt;
&lt;li&gt;Generación de audio nativo: diálogos, efectos, música, sonido ambiente&lt;/li&gt;
&lt;li&gt;Sincronización labial en 8+ idiomas&lt;/li&gt;
&lt;li&gt;Control de movimiento de cámara vía prompt (dolly, tracking, grúa)&lt;/li&gt;
&lt;li&gt;Salida de hasta 15s, hasta 2K&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Produce videos a 24 fps, con relación de aspecto 1:1 a 21:9 y resolución configurable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué cambió: guía vs API oficial
&lt;/h2&gt;

&lt;p&gt;Guías anteriores, como la &lt;a href="http://apidog.com/blog/how-to-use-seedance-2-0/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;de febrero 2026&lt;/a&gt;, explicaban la consola web. Desde abril 2026, puedes llamar la API desde cualquier lenguaje, automatizar pipelines y conectar Seedance con tus propias apps. Esta guía reemplaza el flujo manual de la interfaz para desarrolladores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requisitos previos
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Abre una cuenta en &lt;a href="https://www.volcengine.com/" rel="noopener noreferrer"&gt;volcengine.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Desde la consola de Ark, genera una clave API en:
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Exporta tu clave como variable de entorno:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ARK_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"tu-api-key-aquí"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Usa la clave como Bearer Token en cada solicitud:
&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 YOUR_ARK_API_KEY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las cuentas nuevas reciben créditos gratuitos (alcanza para unas 8 generaciones de 15s a 1080p).&lt;/p&gt;

&lt;h2&gt;
  
  
  Texto a video: su primera solicitud
&lt;/h2&gt;

&lt;p&gt;La URL base de la API es:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Para enviar una tarea T2V, haz un POST a &lt;code&gt;/v1/contents/generations/tasks&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejemplo cURL
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;p&gt;La API responde con un ID de tarea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cgt-2025xxxxxxxx-xxxx"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ejemplo en Python (SDK oficial)
&lt;/h3&gt;

&lt;p&gt;Instala el SDK:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Envia una tarea:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Ark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ARK_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A golden retriever running through a sunlit wheat field, wide tracking shot, cinematic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1080p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Guarda el ID para el polling.&lt;/p&gt;

&lt;h2&gt;
  
  
  El patrón de tarea asíncrona: enviar, sondear, descargar
&lt;/h2&gt;

&lt;p&gt;La generación toma entre 60 y 120 segundos para un video de 5s a 1080p. El ciclo de vida de la tarea es:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Haz polling al endpoint GET hasta que el estado cambie.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bucle de polling completo 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;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;volcenginesdkarkruntime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Ark&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Ark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ARK_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Paso 1: Enviar tarea
&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Aerial shot of a mountain lake at sunrise, slow dolly forward&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1080p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;task_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Task submitted: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Paso 2: Polling con backoff exponencial
&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;succeeded&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;expired&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cancelled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Task ended with status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;

    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# máximo 60s
&lt;/span&gt;
&lt;span class="c1"&gt;# Paso 3: Descargar el video
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;succeeded&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iter_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8192&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Downloaded: output.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El backoff exponencial evita saturar la API; el límite de 60s mantiene el flujo práctico.&lt;/p&gt;

&lt;h2&gt;
  
  
  Imagen a video (I2V): animando una imagen estática
&lt;/h2&gt;

&lt;p&gt;Para animar una 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;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The woman slowly turns her head and smiles at the camera&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/portrait.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;adaptive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usa &lt;code&gt;ratio: "adaptive"&lt;/code&gt; para conservar la relación de aspecto de la imagen. Máximo 30 MB por imagen y hasta 9 imágenes por solicitud.&lt;/p&gt;

&lt;h2&gt;
  
  
  Primer y último fotograma: controlando los puntos de inicio y fin
&lt;/h2&gt;

&lt;p&gt;Seedance 2.0 soporta control de fotogramas de inicio y fin. Proporciona ambas imágenes y un prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The flower blooms from bud to full open, macro lens, soft light&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/flower-bud.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/flower-open.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;adaptive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Incluye las imágenes en orden: primera, luego última. Usa &lt;code&gt;return_last_frame: true&lt;/code&gt; para obtener el último fotograma y encadenar secuencias.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencia multimodal: combinando imágenes, video y audio
&lt;/h2&gt;

&lt;p&gt;Puedes enviar múltiples tipos de entrada en el array &lt;code&gt;content&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{"type": "text", "text": "..."}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{"type": "image_url", "image_url": {"url": "..."}}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{"type": "video_url", "video_url": {"url": "..."}}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{"type": "audio_url", "audio_url": {"url": "..."}}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Límites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hasta 9 imágenes (≤30MB c/u)&lt;/li&gt;
&lt;li&gt;Hasta 3 videos (2–15s, ≤50MB c/u)&lt;/li&gt;
&lt;li&gt;Hasta 3 audios (MP3, ≤15MB c/u)&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 python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Match the visual style of the reference clip and add the provided background audio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/style-reference.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/motion-reference.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;audio_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;audio_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/background-music.mp3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si incluyes referencia de video la tarifa baja a V2V (~$3.90/millón tokens).&lt;/p&gt;

&lt;h2&gt;
  
  
  Generación de audio nativo
&lt;/h2&gt;

&lt;p&gt;Para que Seedance genere audio junto con el video:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A street musician plays guitar outside a cafe in Paris, crowds passing by, city sounds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1080p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;generate_audio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La generación conjunta de audio y video incrementa ligeramente el consumo de tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controlando la resolución, la relación de aspecto y la duración
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;resolution&lt;/strong&gt;: &lt;code&gt;"480p"&lt;/code&gt;, &lt;code&gt;"720p"&lt;/code&gt;, &lt;code&gt;"1080p"&lt;/code&gt;, &lt;code&gt;"2K"&lt;/code&gt; (default: &lt;code&gt;"1080p"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ratio&lt;/strong&gt;: &lt;code&gt;"16:9"&lt;/code&gt;, &lt;code&gt;"9:16"&lt;/code&gt;, &lt;code&gt;"4:3"&lt;/code&gt;, &lt;code&gt;"3:4"&lt;/code&gt;, &lt;code&gt;"21:9"&lt;/code&gt;, &lt;code&gt;"1:1"&lt;/code&gt;, &lt;code&gt;"adaptive"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;duration&lt;/strong&gt;: entero de 4 a 15 (segundos, default: 5)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El modelo rápido (&lt;code&gt;doubao-seedance-2-0-fast-260128&lt;/code&gt;) es útil para pruebas rápidas con menor calidad.&lt;/p&gt;

&lt;p&gt;Elige Seedance 2.0 si necesitas audio+video nativo, control de fotogramas o entradas multimodales. Para tareas simples y bajo costo, usa el modelo rápido a 480p.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leyendo el costo de la respuesta
&lt;/h2&gt;

&lt;p&gt;Cuando una tarea termina, la respuesta incluye el campo &lt;code&gt;usage&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;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"completion_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;246840&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;246840&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;15s 1080p ≈ 308,880 tokens&lt;/li&gt;
&lt;li&gt;5s 1080p ≈ 102,960 tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Precios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;T2V/I2V 1080p: 46 yuanes/millón tokens (~$6.40)&lt;/li&gt;
&lt;li&gt;V2V: 28 yuanes/millón tokens (~$3.90)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Calcula tu costo multiplicando &lt;code&gt;completion_tokens&lt;/code&gt; por la tarifa correspondiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Importante: descargue el video en un plazo de 24 horas
&lt;/h2&gt;

&lt;p&gt;La &lt;code&gt;video_url&lt;/code&gt; caduca a las 24h de completada la tarea. Después, devuelve error 403 y el archivo se elimina. Descarga el archivo tan pronto como el estado sea "succeeded".&lt;/p&gt;

&lt;p&gt;El campo &lt;code&gt;execution_expires_after&lt;/code&gt; indica la expiración en segundos (registro de tarea: hasta 48h, pero la URL del video solo 24h). El historial de tareas está limitado a 7 días.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo probar la API de Seedance con Apidog
&lt;/h2&gt;

&lt;p&gt;El flujo asíncrono requiere múltiples pasos encadenados. Los escenarios de prueba de Apidog permiten automatizar todo el ciclo:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Paso 1: Crea un escenario de prueba&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En Apidog, abre el módulo Pruebas y crea un escenario "Seedance 2.0 video generation".&lt;/li&gt;
&lt;li&gt;Define &lt;code&gt;ARK_API_KEY&lt;/code&gt; como variable de entorno.&lt;/li&gt;
&lt;li&gt;Usa &lt;code&gt;{{ARK_API_KEY}}&lt;/code&gt; donde corresponda.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Paso 2: Agrega la solicitud de envío&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;POST a &lt;code&gt;https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks&lt;/code&gt; con el Bearer Token y el JSON del modelo.&lt;/li&gt;
&lt;li&gt;Extrae el ID usando JSONPath &lt;code&gt;$.id&lt;/code&gt; y guárdalo en &lt;code&gt;TASK_ID&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Paso 3: Agrega un procesador de Espera&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Añade un delay de 30s para dar tiempo al modelo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Paso 4: Agrega la solicitud de polling en bucle For&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crea un bucle de máximo 20 iteraciones.

&lt;ol&gt;
&lt;li&gt;GET a &lt;code&gt;/api/v3/contents/generations/tasks/{{TASK_ID}}&lt;/code&gt; con autorización.&lt;/li&gt;
&lt;li&gt;Espera 10s.&lt;/li&gt;
&lt;li&gt;Condición de ruptura: &lt;code&gt;$.status == "succeeded"&lt;/code&gt; o &lt;code&gt;$.status == "failed"&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Paso 5: Agrega afirmaciones&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verifica que &lt;code&gt;$.status&lt;/code&gt; sea &lt;code&gt;"succeeded"&lt;/code&gt; y que &lt;code&gt;$.content.video_url&lt;/code&gt; no esté vacío.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Al ejecutar el escenario, Apidog muestra cada paso, el ID, los estados y si las afirmaciones pasaron. Puedes importar endpoints Seedance desde un comando cURL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Desglose de precios: lo que cuesta un video de 10 segundos
&lt;/h2&gt;

&lt;p&gt;Seedance usa un modelo de pago por tokens. No hay mensualidades, solo pagas según consumo.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo de tarea&lt;/th&gt;
&lt;th&gt;Tarifa (por 1M tokens)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T2V / I2V a 1080p&lt;/td&gt;
&lt;td&gt;46 yuanes (~$6.40)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V2V (referencia video)&lt;/td&gt;
&lt;td&gt;28 yuanes (~$3.90)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Costos aproximados a 1080p:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Duración&lt;/th&gt;
&lt;th&gt;Tokens aprox.&lt;/th&gt;
&lt;th&gt;Costo (T2V/I2V)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5 segundos&lt;/td&gt;
&lt;td&gt;~103,000&lt;/td&gt;
&lt;td&gt;~0.66 yuanes / ~$0.93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 segundos&lt;/td&gt;
&lt;td&gt;~206,000&lt;/td&gt;
&lt;td&gt;~9.48 yuanes / ~$1.32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 segundos&lt;/td&gt;
&lt;td&gt;~309,000&lt;/td&gt;
&lt;td&gt;~14.21 yuanes / ~$1.97&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Las cuentas nuevas tienen créditos de prueba para unos 8 videos de 15s. Usa esta cuota para experimentar. Menor resolución reduce mucho el consumo de tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Errores comunes y soluciones
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;429 Demasiadas Solicitudes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Es límite de concurrencia, no de requests/minuto. Usa backoff exponencial (espera 10s, duplica en cada intento, máximo 60s).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Prompt prohibido, imagen dañada, archivo demasiado grande o parámetros inválidos. Revisa entradas y vuelve a enviar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;estado: "expired"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La tarea estuvo en cola demasiado tiempo. Reenvía la tarea.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;403 en video_url&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La URL caducó (más de 24h). El registro aún existe, pero debes regenerar el video.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Reproducibilidad de la semilla&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si guardas el parámetro &lt;code&gt;seed&lt;/code&gt;, úsalo para intentar reproducir el mismo resultado.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;La API de Seedance 2.0 permite automatizar generación de video avanzada: POST para crear tarea, polling hasta éxito, descarga inmediata. Entradas multimodales, audio nativo y control de fotogramas son ventajas clave. Configura tus tests en Apidog para detectar errores de lógica, extracción o expiración antes de ir a producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas Frecuentes (FAQ)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;P: ¿Cuál es la diferencia entre doubao-seedance-2-0-260128 y doubao-seedance-2-0-fast-260128?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El modelo estándar da mayor calidad, recomendado para producción. El rápido es más veloz pero con menor calidad, ideal para iterar prompts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;P: ¿Puedo usar Seedance 2.0 fuera de China?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El endpoint está en Beijing. Puedes llamarlo desde fuera, pero la latencia será mayor. Revisa restricciones de tu cuenta Volcengine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;P: ¿Cómo encadeno varios clips en un video largo?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usa &lt;code&gt;return_last_frame: true&lt;/code&gt; para obtener el último fotograma y pásalo como primer fotograma de la siguiente solicitud. Une los clips con una herramienta de edición.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;P: ¿La generación de audio nativo cuesta más?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sí, incrementa ligeramente el consumo de tokens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;P: ¿Puedo establecer un webhook en lugar de polling?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sí, proporciona &lt;code&gt;callback_url&lt;/code&gt; en la solicitud. El API enviará el resultado cuando cambie el estado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;P: ¿Qué pasa si envío más de 9 imágenes?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recibirás un error 400 de validación.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;P: ¿La semilla garantiza reproducción exacta?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acerca la salida, pero no es 100% garantizado si cambian parámetros o versión del modelo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;P: ¿Cómo hago seguimiento de gasto en varias tareas?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lee &lt;code&gt;completion_tokens&lt;/code&gt; en cada respuesta, multiplícalo por la tarifa y almacena el dato. No hay panel de costos, así que gestiona el seguimiento en tu app.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Cómo usar la API de texto a video de Grok: guía completa</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 03 Apr 2026 08:43:20 +0000</pubDate>
      <link>https://forem.com/roobia/como-usar-la-api-de-texto-a-video-de-grok-guia-completa-3hpk</link>
      <guid>https://forem.com/roobia/como-usar-la-api-de-texto-a-video-de-grok-guia-completa-3hpk</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;La API de texto a video de Grok convierte un prompt de texto en un video. Llama a &lt;code&gt;POST /v1/videos/generations&lt;/code&gt; para iniciar la generación y recibe un &lt;code&gt;request_id&lt;/code&gt; de inmediato. Luego, haz polling con &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; hasta que el estado sea &lt;code&gt;"done"&lt;/code&gt;. El modelo es &lt;code&gt;grok-imagine-video&lt;/code&gt;, con precios desde $0.05 por segundo a 480p. El SDK de Python de xAI automatiza el polling.&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;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;xAI generó 1.2 mil millones de videos en enero de 2026, el primer mes tras el lanzamiento de la API de texto a video de Grok (28 de enero de 2026). El modelo lideró el ranking de Artificial Analysis de ese mes, demostrando que la infraestructura escala.&lt;br&gt;&lt;br&gt;
Esta guía cubre cómo hacer tu primera solicitud, hacer polling, ajustar parámetros, escribir mejores prompts, usar imágenes de referencia, extender o editar videos y cuándo elegir texto a video.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;La API es asíncrona.&lt;/strong&gt; Tu frontend no puede esperar el video antes de renderizar. Si construyes una UI para generación de video, necesitas mockear el flujo de polling sin gastar créditos. &lt;strong&gt;Smart Mock de Apidog&lt;/strong&gt; permite simular tanto el endpoint de generación como el de polling. Así tu equipo puede avanzar en la UI mientras el backend está en desarrollo. Descarga Apidog gratis para seguir la sección de pruebas más adelante.&lt;/p&gt;
&lt;/blockquote&gt;




        
        



&lt;h2&gt;
  
  
  ¿Qué es la API de texto a video de Grok?
&lt;/h2&gt;

&lt;p&gt;La API de texto a video de Grok es parte del paquete de generación de medios de xAI en &lt;code&gt;https://api.x.ai&lt;/code&gt;. Envía un prompt de texto y el modelo &lt;code&gt;grok-imagine-video&lt;/code&gt; genera un clip de video desde cero, sin requerir imagen de origen.&lt;/p&gt;

&lt;p&gt;Comparte espacio con el endpoint de generación de imágenes síncrono (&lt;code&gt;POST /v1/images/generations&lt;/code&gt;, modelo &lt;code&gt;grok-imagine-image&lt;/code&gt;, $0.02 por imagen) y endpoints para extender o editar videos.&lt;/p&gt;

&lt;p&gt;La diferencia clave con imagen a video: aquí solo envías texto, y el modelo crea la escena, movimiento y estilo desde tu descripción. Si tienes una imagen de origen y quieres animarla, consulta la &lt;a href="http://apidog.com/blog/grok-image-to-video-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de la API de imagen a video de Grok&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cómo funciona la generación de texto a video (patrón asíncrono)
&lt;/h2&gt;

&lt;p&gt;La mayoría de APIs esperan la respuesta antes de continuar. Para video, la generación puede tardar de segundos a minutos, así que Grok usa un flujo asíncrono:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Envía un POST con tu prompt.&lt;/li&gt;
&lt;li&gt;Recibes un &lt;code&gt;request_id&lt;/code&gt; (en menos de 1 segundo).&lt;/li&gt;
&lt;li&gt;El video se genera en los servidores de xAI.&lt;/li&gt;
&lt;li&gt;Haz polling con GET usando ese &lt;code&gt;request_id&lt;/code&gt; repetidamente.&lt;/li&gt;
&lt;li&gt;Cuando el estado sea &lt;code&gt;"done"&lt;/code&gt;, la respuesta trae la URL del video.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este patrón mantiene conexiones HTTP cortas y permite verificar progreso a tu ritmo. Tu frontend debe manejar el estado intermedio y mostrar un loading hasta que llegue la URL.&lt;/p&gt;
&lt;h2&gt;
  
  
  Requisitos previos
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cuenta xAI:&lt;/strong&gt; Regístrate en &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt;. Agrega facturación para habilitar la generación.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clave API:&lt;/strong&gt; En la consola, ve a Claves API y crea una. Guárdala de forma segura. Úsala como token Bearer en el header de cada request.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_api_key_here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Opcional: instala el SDK de Python de xAI para integración rápida:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&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%2Fvi4f1gdevs2pth1c3l0f.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%2Fvi4f1gdevs2pth1c3l0f.png" alt="Captura de pantalla de la consola de xAI mostrando la generación de claves API"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tu primera solicitud de texto a video
&lt;/h2&gt;

&lt;p&gt;El endpoint es &lt;code&gt;POST https://api.x.ai/v1/videos/generations&lt;/code&gt;. Solo necesitas los campos &lt;code&gt;model&lt;/code&gt; y &lt;code&gt;prompt&lt;/code&gt;.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/generations &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "prompt": "A golden retriever running through autumn leaves in slow motion, cinematic lighting"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Respuesta inmediata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ese UUID sirve para consultar el video cuando esté listo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usando Python y requests
&lt;/h3&gt;



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

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A golden retriever running through autumn leaves in slow motion, cinematic lighting&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Generación iniciada. ID de solicitud: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sondeo para el resultado del video
&lt;/h2&gt;

&lt;p&gt;Con tu &lt;code&gt;request_id&lt;/code&gt;, haz polling a &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; hasta que el estado sea &lt;code&gt;"done"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Estados posibles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;"processing"&lt;/code&gt;: generando&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"done"&lt;/code&gt;: completo, URL disponible&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"failed"&lt;/code&gt;: error&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bucle de polling en Python:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Sondea hasta que la generación de video esté completa.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;progress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;progress&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Intento &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: estado=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, progreso=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;progress&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;done&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;La generación de video falló: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TimeoutError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video no listo después de &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; intentos&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="c1"&gt;# Flujo de trabajo completo: generar y luego sondear
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Genera un video y devuelve su URL.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ID de solicitud: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video listo: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;video_url&lt;/span&gt;


&lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A timelapse of a city skyline at sunset transitioning to night, aerial view&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;Respuesta de polling cuando está listo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vidgen.x.ai/....mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"respect_moderation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500000000&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usando el SDK de Python de xAI
&lt;/h2&gt;

&lt;p&gt;El SDK gestiona el polling automáticamente. El método &lt;code&gt;client.video.generate()&lt;/code&gt; espera hasta que el video esté listo.&lt;br&gt;
&lt;/p&gt;

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

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

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A golden retriever running through autumn leaves in slow motion&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;720p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;aspect_ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Duration: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El SDK es la vía más rápida para prototipos funcionales. Usa requests manuales solo si necesitas controlar lógica de reintentos o intervalos personalizados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escribiendo prompts efectivos para video
&lt;/h2&gt;

&lt;p&gt;El prompt es la clave para resultados óptimos. Sé específico y estructurado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Descripción de la escena
&lt;/h3&gt;

&lt;p&gt;Incluye sujeto y entorno:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Una taza de café de cerámica blanca sobre una mesa de madera junto a una ventana empapada por la lluvia"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Movimiento
&lt;/h3&gt;

&lt;p&gt;Indica qué se mueve y cómo:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"La cámara orbita lentamente la taza mientras el vapor se eleva"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Estilo de cámara
&lt;/h3&gt;

&lt;p&gt;Usa términos de cine:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"primer plano", "plano de seguimiento", "vista de dron aérea", "cámara en mano", "dolly zoom"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Iluminación y ambiente
&lt;/h3&gt;

&lt;p&gt;Ejemplos útiles:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"hora dorada", "nublado", "iluminado con neones", "atmósfera melancólica"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Referencias de estilo
&lt;/h3&gt;

&lt;p&gt;Nombra estilos visuales:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"cinemático", "documental", "anime", "stop-motion", "hyperlapse"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Estructura recomendada de prompt
&lt;/h3&gt;

&lt;p&gt;Empieza con el sujeto, añade movimiento, describe la cámara, termina con el estilo y el ambiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A lone astronaut floats past the International Space Station,
tether drifting behind them. The camera tracks slowly
alongside, showing Earth below. Cinematic, IMAX quality,
warm sunrise light reflecting off the visor.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Controlando resolución, duración y relación de aspecto
&lt;/h2&gt;

&lt;p&gt;El endpoint acepta parámetros opcionales para controlar salida, duración y calidad.&lt;/p&gt;

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



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

&lt;/div&gt;



&lt;p&gt;Rango: 1–15 segundos. Default: 6s. Más segundos = mayor costo.&lt;/p&gt;

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



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

&lt;/div&gt;



&lt;p&gt;Opciones: &lt;code&gt;"480p"&lt;/code&gt; (default), &lt;code&gt;"720p"&lt;/code&gt;. Usa 480p para pruebas y 720p para producción.&lt;/p&gt;

&lt;h3&gt;
  
  
  Relación de aspecto
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;p&gt;Relaciones válidas:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Relación&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;16:9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Escritorio, YouTube (default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;9:16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TikTok, Instagram Reels, móvil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1:1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Instagram feed, tarjetas sociales&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;4:3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Video clásico, presentaciones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3:4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Contenido móvil vertical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3:2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Foto estándar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2:3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fotografía vertical&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Ejemplo completo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/generations &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "prompt": "A coastal town at dawn, waves breaking gently on a rocky shore",
    "duration": 10,
    "resolution": "720p",
    "aspect_ratio": "16:9"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usando imágenes de referencia para guiar el estilo
&lt;/h2&gt;

&lt;p&gt;El parámetro &lt;code&gt;reference_images&lt;/code&gt; acepta hasta 7 URLs de imágenes. No se usan como sujeto, sino para guiar el estilo visual del video.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"grok-imagine-video"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A coastal town at dawn, waves breaking gently on a rocky shore"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reference_images"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/my-style-reference.jpg"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/color-palette-reference.jpg"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usa imágenes de referencia con estética coherente para influir fuertemente en el resultado. No es lo mismo que imagen a video: aquí el prompt sigue dirigiendo la escena.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extendiendo y editando videos generados
&lt;/h2&gt;

&lt;p&gt;xAI ofrece dos endpoints extra:&lt;/p&gt;

&lt;h3&gt;
  
  
  Extender un video
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;POST /v1/videos/extensions&lt;/code&gt; agrega más duración a un video ya generado. Envía el &lt;code&gt;request_id&lt;/code&gt; original y un nuevo prompt para continuar la animación.&lt;/p&gt;

&lt;h3&gt;
  
  
  Editar un video
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;POST /v1/videos/edits&lt;/code&gt; modifica un video existente según una instrucción de texto: cambia el estilo, efectos o la escena.&lt;/p&gt;

&lt;p&gt;Ambos endpoints usan el mismo patrón asíncrono: devuelven un &lt;code&gt;request_id&lt;/code&gt; y haces polling con &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leyendo el costo en la respuesta de la API
&lt;/h2&gt;

&lt;p&gt;El campo &lt;code&gt;usage&lt;/code&gt; en la respuesta incluye el costo en ticks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500000000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Divide entre 10,000,000 para convertir a dólares:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;cost_in_usd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost_in_usd_ticks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10_000_000&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Costo: $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cost_in_usd&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Ejemplo de salida: Costo: $0.0500
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Referencia de precios
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resolución&lt;/th&gt;
&lt;th&gt;Precio por segundo&lt;/th&gt;
&lt;th&gt;10s de video&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;480p&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;720p&lt;/td&gt;
&lt;td&gt;$0.07&lt;/td&gt;
&lt;td&gt;$0.70&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Controla tus costos leyendo el campo &lt;code&gt;cost_in_usd_ticks&lt;/code&gt; de cada respuesta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo probar tu API de video de Grok con Apidog
&lt;/h2&gt;

&lt;p&gt;El polling asíncrono requiere que tu frontend maneje tres estados: cargando, éxito y error. Simular este flujo con la API real es costoso y lento. &lt;strong&gt;Smart Mock de Apidog&lt;/strong&gt; lo resuelve simulando ambos endpoints.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmit5bu2s8zqtmpzxfpbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmit5bu2s8zqtmpzxfpbs.png" alt="Configuración de Apidog Smart Mock para la API de video de Grok"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Con &lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Smart Mock de Apidog&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simula POST /v1/videos/generations:&lt;/strong&gt; Define el esquema de respuesta con un campo &lt;code&gt;request_id&lt;/code&gt; tipo string. Apidog genera un UUID falso automáticamente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo de respuesta mock:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"request_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simula GET /v1/videos/{request_id}:&lt;/strong&gt; Define el esquema completo con &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;video.url&lt;/code&gt;, &lt;code&gt;video.duration&lt;/code&gt;, &lt;code&gt;progress&lt;/code&gt; y &lt;code&gt;usage.cost_in_usd_ticks&lt;/code&gt;. Configura una respuesta mock personalizada con &lt;code&gt;"status": "done"&lt;/code&gt; y una URL de MP4 genérica.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo de respuesta mock:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"video"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vidgen.x.ai/mock-video-12345.mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"respect_moderation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;400000000&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Los desarrolladores frontend pueden construir y probar toda la UI del reproductor de video contra este servidor mock. Pueden simular estados de carga, éxito y error modificando el mock. No se gastan créditos reales de la API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Caso de uso 2: Escenarios de prueba para el bucle de polling
&lt;/h3&gt;

&lt;p&gt;Con los Escenarios de Prueba de Apidog automatiza la validación:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paso 1:&lt;/strong&gt; Añade la solicitud POST &lt;code&gt;/v1/videos/generations&lt;/code&gt;. Usa una Variable de Extracción para capturar el &lt;code&gt;request_id&lt;/code&gt; con JSONPath (&lt;code&gt;$.request_id&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paso 2:&lt;/strong&gt; Añade el GET &lt;code&gt;/v1/videos/{{videoRequestId}}&lt;/code&gt; en un bucle For, con condición de salida: &lt;code&gt;response.body.status == "done"&lt;/code&gt;. Añade un delay de 5s entre iteraciones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paso 3:&lt;/strong&gt; Agrega una aserción para que &lt;code&gt;$.video.url&lt;/code&gt; no esté vacío en la última respuesta.&lt;/p&gt;

&lt;p&gt;Esto asegura una cobertura repetible del flujo asíncrono y ayuda a detectar regresiones en tu lógica de polling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Texto a video vs imagen a video: ¿cuándo usar cada uno?
&lt;/h2&gt;

&lt;p&gt;Ambos usan &lt;code&gt;grok-imagine-video&lt;/code&gt;, pero tienen usos distintos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Texto a video:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Genera contenido original desde un prompt/concepto.&lt;/li&gt;
&lt;li&gt;El modelo tiene control creativo total.&lt;/li&gt;
&lt;li&gt;Útil para herramientas donde el usuario solo escribe un prompt.&lt;/li&gt;
&lt;li&gt;No tienes una imagen fuente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Imagen a video:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tienes una imagen/ilustración/foto de producto a animar.&lt;/li&gt;
&lt;li&gt;Necesitas preservar detalles visuales exactos.&lt;/li&gt;
&lt;li&gt;Quieres animaciones consistentes desde varias imágenes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Texto a video crea la escena desde cero; imagen a video anima una imagen existente. Para una guía completa de imagen a video, revisa la &lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de la API de imagen a video de Grok&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;En productos que soportan ambos modos, decide en tiempo de ejecución: si el usuario sube una imagen, usa &lt;code&gt;/v1/images/generations&lt;/code&gt;; si solo escribe texto, usa &lt;code&gt;/v1/videos/generations&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Errores comunes y cómo solucionarlos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;401 No Autorizado:&lt;/strong&gt; Falta la clave API, está caducada o mal formateada. Verifica el header &lt;code&gt;Authorization: Bearer YOUR_XAI_API_KEY&lt;/code&gt; y que la clave esté activa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;429 Too Many Requests:&lt;/strong&gt; Excediste el rate limit (60 req/min, 1 req/seg). Espacia tus llamadas, especialmente en polling (mínimo 5s entre requests).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;status: "failed"&lt;/code&gt; en polling:&lt;/strong&gt; El prompt fue rechazado por moderación. El campo &lt;code&gt;respect_moderation&lt;/code&gt; será &lt;code&gt;true&lt;/code&gt;. Revisa y ajusta el prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;La URL del video arroja 404:&lt;/strong&gt; Las URLs caducan. Descarga el video apenas recibas la URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video vacío o congelado:&lt;/strong&gt; Prompts vagos o sin instrucciones de movimiento. Sé explícito sobre qué se mueve y cómo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polling lento:&lt;/strong&gt; 720p y duraciones largas tardan más. Usa 480p y clips cortos para desarrollo y prototipado.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;La API de texto a video de Grok es directa: envías un prompt, recibes un &lt;code&gt;request_id&lt;/code&gt;, haces polling y descargas tu MP4. Domina el patrón asíncrono y el resto (duración, resolución, relación de aspecto, imágenes de referencia) es parametrizable.&lt;/p&gt;

&lt;p&gt;Para producción, monitorea el costo leyendo &lt;code&gt;cost_in_usd_ticks&lt;/code&gt; tras cada generación. Simula endpoints en Apidog para que el frontend avance sin bloqueos. Usa Escenarios de Prueba para mantener fiable tu lógica de polling.&lt;/p&gt;

&lt;p&gt;Descarga Apidog gratis para configurar mocks y escenarios de prueba para la API de video de Grok.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas Frecuentes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;¿Qué nombre de modelo uso para la generación de texto a video?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Usa &lt;code&gt;grok-imagine-video&lt;/code&gt; como valor de &lt;code&gt;model&lt;/code&gt; en tu POST a &lt;code&gt;/v1/videos/generations&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cuánto tarda la generación de video?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Depende de duración y resolución. 480p corto: &amp;lt;30s. 720p largo: varios minutos. Haz polling cada 5-10s.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo generar videos de más de 15 segundos?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No en una sola solicitud. &lt;code&gt;duration&lt;/code&gt; máximo: 15s. Para videos más largos, encadena clips y usa &lt;code&gt;POST /v1/videos/extensions&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo descargo el video generado?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Usa la URL &lt;code&gt;result.video.url&lt;/code&gt; del polling. Descarga el MP4 de inmediato; la URL caduca.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué sucede si mi prompt viola la moderación de contenido?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
El estado será &lt;code&gt;"failed"&lt;/code&gt;. &lt;code&gt;respect_moderation&lt;/code&gt; indicará si hubo moderación. Ajusta el prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Hay un nivel gratuito para la API de video?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No hay free tier específico para video. Consulta &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt; para créditos de bienvenida.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿En qué se diferencian las &lt;code&gt;reference_images&lt;/code&gt; de una imagen de origen?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;reference_images&lt;/code&gt; guían el estilo visual del video generado desde texto. Una imagen de origen en imagen a video se convierte en el primer fotograma real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo pruebo el bucle de polling sin gastar créditos?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Usa Smart Mock de Apidog para simular los endpoints de generación y polling. Define los esquemas y estados mock para cubrir todos los casos en tus test.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
