<?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>Vibe Coding Forem: Roobia</title>
    <description>The latest articles on Vibe Coding Forem by Roobia (@roobia).</description>
    <link>https://vibe.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>Vibe Coding Forem: Roobia</title>
      <link>https://vibe.forem.com/roobia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://vibe.forem.com/feed/roobia"/>
    <language>en</language>
    <item>
      <title>Ghostty Deja GitHub: Implicaciones para Creadores de Herramientas de Desarrollo</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Thu, 30 Apr 2026 03:56:46 +0000</pubDate>
      <link>https://vibe.forem.com/roobia/ghostty-deja-github-implicaciones-para-creadores-de-herramientas-de-desarrollo-15n3</link>
      <guid>https://vibe.forem.com/roobia/ghostty-deja-github-implicaciones-para-creadores-de-herramientas-de-desarrollo-15n3</guid>
      <description>&lt;p&gt;El 28 de abril de 2026, Mitchell Hashimoto anunció que Ghostty, su emulador de terminal de código abierto, dejará GitHub. Hashimoto es el usuario 1299 de GitHub, se unió en febrero de 2008 y usó la plataforma casi todos los días durante más de 18 años. Pero el día del anuncio, una falla de GitHub Actions bloqueó sus revisiones de PR durante dos horas. Su conclusión fue directa: “Este ya no es un lugar para un trabajo serio si te bloquea durante horas al día, todos los días.”&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;Si desarrollas herramientas para desarrolladores, este anuncio merece una lectura operativa, no solo anecdótica. Hashimoto no es un usuario casual: cofundó HashiCorp sobre GitHub y lanzó Terraform, Vagrant, Vault, Consul y Boundary usando esa plataforma. Cuando un perfil así migra por fiabilidad, el problema no es solo “qué forja usará Ghostty”, sino cómo diseñar tu propia pila para no quedar bloqueado por un proveedor crítico.&lt;/p&gt;

&lt;p&gt;Para contexto adicional sobre flujos de trabajo de desarrollo en la era de la IA, consulta &lt;a href="http://apidog.com/blog/how-to-write-agents-md-files?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo escribir archivos AGENTS.md&lt;/a&gt;, &lt;a href="http://apidog.com/blog/github-copilot-usage-billing-api-teams?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;el uso de GitHub Copilot y la API de facturación para equipos&lt;/a&gt; y la &lt;a href="http://apidog.com/blog/clawsweeper-openclaw-github-triage-bot?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descripción del bot de triaje Clawsweeper&lt;/a&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Mitchell Hashimoto anunció el 28 de abril de 2026 que Ghostty dejará GitHub por una forja aún sin nombre.&lt;/li&gt;
&lt;li&gt;La razón principal fue la fiabilidad: interrupciones recurrentes de GitHub Actions y de la plataforma, documentadas por él en un diario donde “casi todos los días tienen una X”.&lt;/li&gt;
&lt;li&gt;El día del anuncio, una interrupción de Actions bloqueó sus revisiones de PR durante dos horas.&lt;/li&gt;
&lt;li&gt;El repositorio de Ghostty en GitHub seguirá como espejo de solo lectura.&lt;/li&gt;
&lt;li&gt;El desarrollo activo migrará de forma incremental a otra forja.&lt;/li&gt;
&lt;li&gt;Sus otros proyectos seguirán en GitHub por ahora.&lt;/li&gt;
&lt;li&gt;La lección para equipos de herramientas de desarrollo y APIs: desacopla proveedores, simula dependencias externas y prueba rutas de migración antes de necesitarlas.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; sigue ese patrón para flujos de trabajo de APIs: definición, pruebas, mocks y entornos separados.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lo que dijo Hashimoto
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mitchellh.com/writing/ghostty-leaving-github" rel="noopener noreferrer"&gt;La publicación del anuncio&lt;/a&gt; es breve y clara. No es un manifiesto contra Microsoft ni una promoción de otra forja. Hashimoto explica tres hechos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Empezó a registrar interrupciones de GitHub.&lt;/li&gt;
&lt;li&gt;El registro se llenó más rápido de lo esperado.&lt;/li&gt;
&lt;li&gt;Una falla de GitHub Actions bloqueó su trabajo el mismo día en que escribió la publicación.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La interrupción del 27 de abril de 2026 afectó Actions, paquetes y la superficie de la API. Según Hashimoto, el diario ya existía antes de ese incidente, por lo que la decisión no fue una reacción a un solo mal día. La interrupción influyó en el momento del anuncio, no en el motivo de fondo.&lt;/p&gt;

&lt;p&gt;También aclaró el alcance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ghostty migra.&lt;/li&gt;
&lt;li&gt;Sus otros proyectos permanecen en GitHub por ahora.&lt;/li&gt;
&lt;li&gt;El &lt;a href="https://github.com/ghostty-org/ghostty" rel="noopener noreferrer"&gt;repositorio de Ghostty&lt;/a&gt; seguirá disponible como espejo de solo lectura.&lt;/li&gt;
&lt;li&gt;Issues, PRs y CI se moverán a una nueva forja.&lt;/li&gt;
&lt;li&gt;La migración será incremental.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La parte importante: no se fue por características, precios o dirección de producto. Se fue porque la plataforma dejó de ser lo suficientemente fiable para su flujo de trabajo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué la fiabilidad importa más que la migración
&lt;/h2&gt;

&lt;p&gt;La pregunta útil no es “¿a dónde se va Ghostty?”. La pregunta útil es:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;¿Qué pasa cuando una herramienta crítica deja de funcionar durante las horas en que tus usuarios más productivos la necesitan?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para equipos que construyen herramientas de desarrollo, hay tres señales relevantes.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. El usuario que se va importa
&lt;/h3&gt;

&lt;p&gt;Hashimoto ha construido herramientas de infraestructura usadas en empresas grandes. Su opinión sobre fiabilidad llega a personas que toman decisiones sobre dónde alojar código, CI, issues y lanzamientos.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. La razón es difícil de rebatir
&lt;/h3&gt;

&lt;p&gt;No se trata de una discusión ideológica. La queja es operativa:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“No puedo trabajar porque la plataforma no responde.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Si tus usuarios empiezan a medir interrupciones por su cuenta, tu página de estado ya perdió autoridad.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. El tono es de post-mortem
&lt;/h3&gt;

&lt;p&gt;La publicación no es agresiva. Parece escrita por alguien que intentó quedarse y concluyó que el coste operativo ya no compensaba.&lt;/p&gt;

&lt;p&gt;Para un producto de desarrollo, ese es el peor escenario: un usuario experto que se va sin drama, con datos y sin necesidad de exagerar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo evaluar si tu herramienta está en la misma trayectoria
&lt;/h2&gt;

&lt;p&gt;Si tu producto está en la ruta crítica de otros desarrolladores, ejecuta esta revisión.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 1: calcula horas perdidas por cliente
&lt;/h3&gt;

&lt;p&gt;No mires solo disponibilidad global. Cruza incidentes con horas reales de uso.&lt;/p&gt;

&lt;p&gt;Ejemplo de tabla mínima:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Incidente&lt;/th&gt;
&lt;th&gt;Duración&lt;/th&gt;
&lt;th&gt;Componente&lt;/th&gt;
&lt;th&gt;Clientes afectados&lt;/th&gt;
&lt;th&gt;Horas de trabajo bloqueadas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CI degradado&lt;/td&gt;
&lt;td&gt;2 h&lt;/td&gt;
&lt;td&gt;Builds&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;24 h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API lenta&lt;/td&gt;
&lt;td&gt;45 min&lt;/td&gt;
&lt;td&gt;API pública&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;6 h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Login caído&lt;/td&gt;
&lt;td&gt;30 min&lt;/td&gt;
&lt;td&gt;Auth&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;10 h&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Si tus usuarios intensivos pierden tiempo todas las semanas, tienes un problema aunque tu SLA agregado se vea bien.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 2: mide tendencia, no solo uptime
&lt;/h3&gt;

&lt;p&gt;Un 99.9% estable puede ser aceptable. Un 99.95% que empeora mes a mes puede ser una alerta.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;componente: ci
slo: 99.9%
presupuesto_error_mensual: 43.2 min
incidentes_mes_actual: 68 min
estado: excedido
tendencia: peor que mes anterior
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si no tienes presupuesto de error por componente, no sabes si tu fiabilidad mejora o empeora.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 3: publica degradaciones parciales
&lt;/h3&gt;

&lt;p&gt;Una página de estado útil no debe limitarse a “operativo” o “caído”.&lt;/p&gt;

&lt;p&gt;Publica estados como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Builds con retraso.&lt;/li&gt;
&lt;li&gt;API con latencia elevada.&lt;/li&gt;
&lt;li&gt;Webhooks en cola.&lt;/li&gt;
&lt;li&gt;Región degradada.&lt;/li&gt;
&lt;li&gt;Autenticación intermitente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Los usuarios empiezan diarios privados cuando la señal pública no coincide con su experiencia.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 4: mide disponibilidad contra la curva de uso del cliente
&lt;/h3&gt;

&lt;p&gt;Dos horas de caída a las 03:00 pueden ser irrelevantes para algunos equipos. Dos horas durante revisión de PR, despliegue o release pueden bloquear todo el flujo.&lt;/p&gt;

&lt;p&gt;Mide fiabilidad así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;disponibilidad_global = tiempo_ok / tiempo_total

disponibilidad_ponderada =
  tiempo_ok_durante_uso_real / tiempo_total_durante_uso_real
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para herramientas de desarrollo, la segunda métrica suele ser más honesta.&lt;/p&gt;

&lt;h2&gt;
  
  
  El coste real del “siempre GitHub”
&lt;/h2&gt;

&lt;p&gt;Hashimoto escribió que para él “nunca fue una pregunta” dónde poner sus proyectos: siempre GitHub.&lt;/p&gt;

&lt;p&gt;Ese hábito tiene coste.&lt;/p&gt;

&lt;p&gt;Git es portable, pero el flujo de trabajo completo no lo es. Puedes clonar un repositorio, pero no migras con un solo comando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Issues.&lt;/li&gt;
&lt;li&gt;PRs.&lt;/li&gt;
&lt;li&gt;Reviews.&lt;/li&gt;
&lt;li&gt;Comentarios.&lt;/li&gt;
&lt;li&gt;Discusiones.&lt;/li&gt;
&lt;li&gt;Secrets.&lt;/li&gt;
&lt;li&gt;Workflows de GitHub Actions.&lt;/li&gt;
&lt;li&gt;Packages.&lt;/li&gt;
&lt;li&gt;Releases.&lt;/li&gt;
&lt;li&gt;CODEOWNERS.&lt;/li&gt;
&lt;li&gt;Permisos.&lt;/li&gt;
&lt;li&gt;OAuth apps.&lt;/li&gt;
&lt;li&gt;Integraciones del Marketplace.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El lock-in no está solo en el código. Está en todo lo que rodea al código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Patrón práctico: trata GitHub como proveedor, no como infraestructura única
&lt;/h2&gt;

&lt;p&gt;Si tu herramienta depende de GitHub, pon una capa de abstracción desde el inicio.&lt;/p&gt;

&lt;p&gt;Ejemplo simple en TypeScript:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GitHubClient&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;ForgeClient&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getPullRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// llamada a GitHub API&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

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

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;createComment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;issueId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// llamada a GitHub API&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ForgejoClient&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;ForgeClient&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getPullRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// llamada a Forgejo API&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;listIssues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// llamada a Forgejo API&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;createComment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;issueId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// llamada a Forgejo API&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;Luego selecciona el proveedor por configuración:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createForgeClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;ForgeClient&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;github&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GitHubClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;forgejo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ForgejoClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Proveedor no soportado: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El objetivo no es soportar todas las forjas desde el día uno. El objetivo es no acoplar todo tu producto a una API específica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternativas de forja mencionadas en el debate
&lt;/h2&gt;

&lt;p&gt;Hashimoto no anunció destino. Las alternativas creíbles a finales de abril de 2026 incluyen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Forgejo&lt;/strong&gt;: hard fork de Gitea, FOSS, mantenido por Codeberg e.V. La federación vía ActivityPub está en la hoja de ruta y parcialmente implementada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codeberg&lt;/strong&gt;: instancia gestionada de Forgejo, sin fines de lucro y gratuita para proyectos de código abierto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitLab&lt;/strong&gt;: CI/CD fuerte, amplia paridad funcional con GitHub y respaldo comercial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sourcehut&lt;/strong&gt;: flujo basado en correo, minimalista y rápido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forgejo o Gitea autoalojado&lt;/strong&gt;: máximo control, mayor carga operativa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Radicle&lt;/strong&gt;: enfoque peer-to-peer sin host central, aún temprano para muchos proyectos públicos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La señal importante es que ninguna opción reemplaza todo GitHub de forma perfecta. Esa es precisamente la consecuencia de concentrar repositorios, CI, issues, paquetes, identidad y releases en una sola plataforma.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lección para equipos de API
&lt;/h2&gt;

&lt;p&gt;Si trabajas con APIs, cambia los nombres:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“GitHub Actions” → “API ascendente de la que depende tu producto”.&lt;/li&gt;
&lt;li&gt;“Issues y PRs” → “canales donde tus clientes reportan problemas”.&lt;/li&gt;
&lt;li&gt;“Forja” → “proveedor externo crítico”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La pregunta es la misma:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;¿Qué puede seguir haciendo tu equipo cuando un servicio que no controlas falla durante cuatro horas?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tres patrones ayudan.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Simula todo proveedor crítico
&lt;/h2&gt;

&lt;p&gt;Tus tests y tu desarrollo local no deberían depender siempre de una llamada real a red.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Define el contrato de la API.&lt;/li&gt;
&lt;li&gt;Genera un mock server.&lt;/li&gt;
&lt;li&gt;Ejecuta tests contra el mock en local.&lt;/li&gt;
&lt;li&gt;Ejecuta tests de contrato contra el proveedor real en CI.&lt;/li&gt;
&lt;li&gt;Cambia de entorno sin modificar código.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ejemplo de configuración:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API_ENV=mock
API_BASE_URL=http://localhost:4010
API_KEY=test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API_ENV=staging
API_BASE_URL=https://sandbox.provider.com
API_KEY=${STAGING_API_KEY}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para producción:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API_ENV=prod
API_BASE_URL=https://api.provider.com
API_KEY=${PROD_API_KEY}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apidog permite definir APIs, generar mocks y reutilizar esas definiciones para pruebas. Para un ejemplo de ecosistema multiproveedor, consulta &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo usar la API GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Prueba contra múltiples proveedores
&lt;/h2&gt;

&lt;p&gt;Si tu producto depende de modelos o APIs con formas similares, evita diseñar solo para uno.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ChatProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ChatRequest&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ChatResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OpenAIProvider&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;ChatProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ChatRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// llamada a OpenAI&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AnthropicProvider&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;ChatProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ChatRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// llamada a Anthropic&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FallbackChatProvider&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;ChatProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ChatProvider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ChatProvider&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ChatRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El fallback no debe improvisarse durante un incidente. Debe estar probado antes.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Desacopla el pipeline de release
&lt;/h2&gt;

&lt;p&gt;Si tu release depende 100% de GitHub Actions, una caída de Actions bloquea tu entrega.&lt;/p&gt;

&lt;p&gt;Opciones prácticas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replica el pipeline crítico en otro runner.&lt;/li&gt;
&lt;li&gt;Mantén un flujo manual documentado.&lt;/li&gt;
&lt;li&gt;Autoaloja jobs críticos.&lt;/li&gt;
&lt;li&gt;Publica artefactos en más de un destino.&lt;/li&gt;
&lt;li&gt;Prueba el flujo alternativo cada trimestre.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo de checklist para release manual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ ] Ejecutar tests localmente
[ ] Construir artefactos
[ ] Firmar release
[ ] Publicar paquete
[ ] Crear tag
[ ] Actualizar changelog
[ ] Notificar canal interno
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si este procedimiento no existe, tu plan real durante una caída es esperar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flujo de trabajo resiliente con Apidog
&lt;/h2&gt;

&lt;p&gt;Un flujo práctico para equipos de API:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descarga Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Crea un proyecto por cada API ascendente crítica.&lt;/li&gt;
&lt;li&gt;Define esquemas de request y response una sola vez.&lt;/li&gt;
&lt;li&gt;Genera mocks desde esos esquemas.&lt;/li&gt;
&lt;li&gt;Crea entornos separados: &lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;mock&lt;/code&gt;, &lt;code&gt;staging&lt;/code&gt;, &lt;code&gt;prod&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Guarda credenciales como secretos por entorno.&lt;/li&gt;
&lt;li&gt;Escribe pruebas de contrato.&lt;/li&gt;
&lt;li&gt;Ejecuta las mismas pruebas contra mock, sandbox y proveedor real.&lt;/li&gt;
&lt;li&gt;Documenta cómo cambiar de proveedor o entorno durante una degradación.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dev
  base_url = http://localhost:4010
  auth = none

staging
  base_url = https://sandbox.api.example.com
  auth = staging_secret

prod
  base_url = https://api.example.com
  auth = prod_secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El punto no es eliminar dependencias externas. El punto es que tu equipo pueda seguir desarrollando, probando y entregando aunque una dependencia falle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué están leyendo los desarrolladores del anuncio
&lt;/h2&gt;

&lt;p&gt;Las reacciones se agrupan así:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;“Bien por él”&lt;/strong&gt;: usuarios avanzados que ya estaban frustrados con interrupciones y ven el anuncio como validación.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;“Es solo una interrupción”&lt;/strong&gt;: desarrolladores que comparan uptime agregado y recuerdan que toda plataforma grande tiene incidentes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;“Migrar es difícil”&lt;/strong&gt;: equipos que entienden que mover issues, PRs y CI cuesta más que clonar un repositorio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;“¿Qué pasa con mis repos?”&lt;/strong&gt;: mantenedores pequeños que evalúan si el riesgo aplica a su escala.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La conversación importante ocurre dentro de equipos de ingeniería:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿Tenemos espejo de repositorios?&lt;/li&gt;
&lt;li&gt;¿Podemos lanzar si GitHub Actions cae?&lt;/li&gt;
&lt;li&gt;¿Tenemos backup de issues?&lt;/li&gt;
&lt;li&gt;¿Qué integraciones dependen exclusivamente de GitHub?&lt;/li&gt;
&lt;li&gt;¿Cuál es nuestro plan de salida?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Checklist para reducir dependencia de una sola plataforma
&lt;/h2&gt;

&lt;p&gt;Usa esta lista como punto de partida.&lt;/p&gt;

&lt;h3&gt;
  
  
  Repositorios
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Crear espejo en una segunda forja.&lt;/li&gt;
&lt;li&gt;[ ] Automatizar sincronización semanal o diaria.&lt;/li&gt;
&lt;li&gt;[ ] Verificar que los tags también se sincronicen.&lt;/li&gt;
&lt;li&gt;[ ] Documentar cómo cambiar el remoto principal.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote add backup git@codeberg.org:org/repo.git
git push backup main &lt;span class="nt"&gt;--tags&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CI/CD
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Identificar jobs críticos.&lt;/li&gt;
&lt;li&gt;[ ] Separar build, test y publish.&lt;/li&gt;
&lt;li&gt;[ ] Replicar jobs críticos fuera de GitHub Actions.&lt;/li&gt;
&lt;li&gt;[ ] Documentar release manual.&lt;/li&gt;
&lt;li&gt;[ ] Probar el flujo alternativo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  APIs externas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Listar proveedores en ruta crítica.&lt;/li&gt;
&lt;li&gt;[ ] Definir mocks para cada API.&lt;/li&gt;
&lt;li&gt;[ ] Añadir timeouts explícitos.&lt;/li&gt;
&lt;li&gt;[ ] Añadir retries con backoff.&lt;/li&gt;
&lt;li&gt;[ ] Añadir fallback cuando tenga sentido.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AbortController&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;5000&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Observabilidad
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Medir errores por componente.&lt;/li&gt;
&lt;li&gt;[ ] Medir latencia por proveedor.&lt;/li&gt;
&lt;li&gt;[ ] Separar incidentes internos de incidentes de terceros.&lt;/li&gt;
&lt;li&gt;[ ] Publicar degradaciones parciales.&lt;/li&gt;
&lt;li&gt;[ ] Revisar tendencia mensual.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Producto
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Mostrar mensajes claros cuando un proveedor externo falla.&lt;/li&gt;
&lt;li&gt;[ ] Permitir modo degradado.&lt;/li&gt;
&lt;li&gt;[ ] Evitar que una falla externa bloquee todo el flujo.&lt;/li&gt;
&lt;li&gt;[ ] Cachear datos no críticos.&lt;/li&gt;
&lt;li&gt;[ ] Diseñar integraciones como adaptadores reemplazables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para un ejemplo aplicado a herramientas de API y proveedores de IA, consulta &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;la construcción de flujos de trabajo duraderos que sobreviven a las interrupciones del proveedor&lt;/a&gt;.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  ¿A dónde se muda Ghostty?
&lt;/h3&gt;

&lt;p&gt;Hashimoto no anunció destino. Dijo que está conversando con múltiples proveedores, comerciales y FOSS, y que la migración será incremental. El repositorio actual en GitHub seguirá como espejo de solo lectura.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿GitHub es tan poco fiable?
&lt;/h3&gt;

&lt;p&gt;GitHub mantiene números de disponibilidad competitivos frente a plataformas similares. El punto de Hashimoto no es solo el uptime agregado, sino el patrón de interrupciones parciales que bloquean trabajo real durante horas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Debería sacar mis repositorios de GitHub ahora?
&lt;/h3&gt;

&lt;p&gt;No necesariamente. Pero duplicarlos en una segunda forja es una medida barata y útil. Para muchos equipos, el primer paso no es migrar por completo, sino tener una copia funcional y un plan probado.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Esto afecta GitHub Copilot o GitHub Actions?
&lt;/h3&gt;

&lt;p&gt;La publicación no se centra en Copilot. El detonante inmediato fue una interrupción de GitHub Actions. Si tu equipo usa Copilot y necesita entender cambios de facturación, revisa &lt;a href="http://apidog.com/blog/github-copilot-usage-billing-api-teams?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;el uso de GitHub Copilot y la API de facturación para equipos&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué significa esto para herramientas de IA que dependen de GitHub?
&lt;/h3&gt;

&lt;p&gt;Bots de revisión, triage de issues, servidores MCP e integraciones similares heredan parte de la fiabilidad de GitHub. Mitigaciones básicas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cachear respuestas.&lt;/li&gt;
&lt;li&gt;Fallar en abierto cuando sea posible.&lt;/li&gt;
&lt;li&gt;Simular GitHub en tests.&lt;/li&gt;
&lt;li&gt;Separar lógica de negocio del cliente de GitHub.&lt;/li&gt;
&lt;li&gt;Preparar adaptadores para otras forjas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La &lt;a href="http://apidog.com/blog/clawsweeper-openclaw-github-triage-bot?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descripción del bot de triaje Clawsweeper&lt;/a&gt; muestra un ejemplo de este tipo de integración.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Es una tendencia de “abandonar GitHub”?
&lt;/h3&gt;

&lt;p&gt;Probablemente será lenta. Migrar un proyecto no trivial fuera de GitHub implica mover mucho más que código. Pero el anuncio cambia la conversación: si un usuario histórico decide que el coste de migrar es menor que el coste de seguir bloqueado, otros equipos empezarán a hacer el mismo cálculo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué significa “creador de herramientas para desarrolladores”?
&lt;/h3&gt;

&lt;p&gt;Cualquier persona que construye software usado por otros desarrolladores para entregar software. Incluye:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terminales.&lt;/li&gt;
&lt;li&gt;Editores.&lt;/li&gt;
&lt;li&gt;CI/CD.&lt;/li&gt;
&lt;li&gt;Clientes de API.&lt;/li&gt;
&lt;li&gt;Herramientas de monitoreo.&lt;/li&gt;
&lt;li&gt;Registros de paquetes.&lt;/li&gt;
&lt;li&gt;Bots de revisión.&lt;/li&gt;
&lt;li&gt;Asistentes de IA.&lt;/li&gt;
&lt;li&gt;Plataformas de documentación.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si tu herramienta está en la ruta crítica de un desarrollador, la fiabilidad no es una característica más. Es el producto.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>¿Cómo Usar la API de Mistral Medium 3.5?</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Thu, 30 Apr 2026 03:48:21 +0000</pubDate>
      <link>https://vibe.forem.com/roobia/como-usar-la-api-de-mistral-medium-35-48kf</link>
      <guid>https://vibe.forem.com/roobia/como-usar-la-api-de-mistral-medium-35-48kf</guid>
      <description>&lt;p&gt;Mistral lanzó Medium 3.5 el 29 de abril de 2026. El ID del modelo API es &lt;code&gt;mistral-medium-3.5&lt;/code&gt;, el endpoint es &lt;code&gt;https://api.mistral.ai/v1/chat/completions&lt;/code&gt;, y la estructura de la solicitud es suficientemente compatible con el estándar de OpenAI como para migrar cambiando la URL base y el nombre del modelo. Sus datos principales: ventana de contexto de 256K, visión nativa, llamada a funciones, soporte para 24 idiomas y 77.6% en SWE-Bench Verified. Para equipos que construyen agentes, revisores de código o flujos multimodales, Medium 3.5 entra en la misma categoría práctica que GPT-5.5 y DeepSeek V4.&lt;/p&gt;

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

&lt;p&gt;Esta guía muestra cómo autenticarte, configurar parámetros, llamar a la API desde Python y Node, usar visión, herramientas, JSON estructurado, streaming, manejo de errores y un flujo de trabajo con &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para iterar prompts sin perder visibilidad de costos. Para modelos comparables, revisa &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo usar la API de DeepSeek V4&lt;/a&gt; y &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo usar la API de GPT-5.5&lt;/a&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Endpoint: &lt;code&gt;POST https://api.mistral.ai/v1/chat/completions&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Autenticación: bearer token en el encabezado &lt;code&gt;Authorization&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Modelo: &lt;code&gt;mistral-medium-3.5&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Contexto: 256K tokens.&lt;/li&gt;
&lt;li&gt;Precios: $1.5 por millón de tokens de entrada y $7.5 por millón de tokens de salida.&lt;/li&gt;
&lt;li&gt;Capacidades: razonamiento, visión, llamada nativa a funciones, salida JSON estructurada y cobertura de 24 idiomas.&lt;/li&gt;
&lt;li&gt;Pesos abiertos: &lt;code&gt;mistralai/Mistral-Medium-3.5-128B&lt;/code&gt; en Hugging Face bajo una Licencia MIT Modificada con una excepción para grandes ingresos.&lt;/li&gt;
&lt;li&gt;Benchmarks destacados: 77.6% en SWE-Bench Verified y 91.4 en τ³-Telecom.&lt;/li&gt;
&lt;li&gt;Puedes &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descargar Apidog&lt;/a&gt; para comparar Medium 3.5 contra tu modelo actual, guardar la clave como variable secreta y calcular el costo por llamada.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Qué cambió en Medium 3.5?
&lt;/h2&gt;

&lt;p&gt;Medium 3 se lanzó como un modelo solo de texto con contexto de 128K. &lt;a href="https://mistral.ai/news/vibe-remote-agents-mistral-medium-3-5" rel="noopener noreferrer"&gt;Medium 3.5&lt;/a&gt; cambia el perfil: es el primer modelo insignia fusionado de Mistral. Seguimiento de instrucciones, razonamiento y codificación viven en un único conjunto de pesos, por lo que no tienes que elegir entre un checkpoint de chat y uno de razonamiento.&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%2Fw1gvxkk5hewmsinakjv3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw1gvxkk5hewmsinakjv3.png" alt="Mistral Medium 3.5" width="800" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Los cambios que más afectan a implementación:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contexto duplicado: de 128K a 256K.&lt;/li&gt;
&lt;li&gt;Visión nativa.&lt;/li&gt;
&lt;li&gt;Llamada a funciones integrada en el modelo.&lt;/li&gt;
&lt;li&gt;Mejor rendimiento en tareas de código: 77.6% en SWE-Bench Verified.&lt;/li&gt;
&lt;li&gt;Mejor rendimiento en flujos agénticos: 91.4 en τ³-Telecom.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El cambio de precio también importa. Medium 3 costaba $0.40 por millón de tokens de entrada y $2.00 por millón de salida. Medium 3.5 sube a $1.5 de entrada y $7.5 de salida. Úsalo como nivel de mayor precisión para tareas donde el razonamiento, el código, la visión o el contexto largo justifiquen el costo.&lt;/p&gt;

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

&lt;p&gt;Antes de hacer la primera llamada, prepara:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Una cuenta en &lt;a href="https://console.mistral.ai/" rel="noopener noreferrer"&gt;console.mistral.ai&lt;/a&gt; con método de pago. Sin saldo, la API puede devolver &lt;code&gt;402 Payment Required&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Una clave API asociada al proyecto que recibirá la facturación.&lt;/li&gt;
&lt;li&gt;Un SDK:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mistralai&lt;/code&gt; para Python o JavaScript.&lt;/li&gt;
&lt;li&gt;SDK de OpenAI si quieres reutilizar código compatible cambiando &lt;code&gt;base_url&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Un cliente API. &lt;code&gt;curl&lt;/code&gt; sirve para probar, pero para iterar prompts, guardar entornos y revisar costos por respuesta, usa &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Exporta la clave:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Endpoint y autenticación
&lt;/h2&gt;

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

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

&lt;/div&gt;



&lt;p&gt;La autenticación usa un bearer token:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Una respuesta correcta incluye:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;choices&lt;/code&gt;: respuestas generadas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;usage.prompt_tokens&lt;/code&gt;: tokens de entrada.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;usage.completion_tokens&lt;/code&gt;: tokens de salida.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;usage.total_tokens&lt;/code&gt;: total facturable.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt;: identificador útil para trazabilidad.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Los errores vienen en un objeto &lt;code&gt;error&lt;/code&gt; con &lt;code&gt;code&lt;/code&gt; y &lt;code&gt;message&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parámetros principales
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parámetro&lt;/th&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Valores&lt;/th&gt;
&lt;th&gt;Uso&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mistral-medium-3.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Requerido.&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;roles y contenido&lt;/td&gt;
&lt;td&gt;Requerido. Compatible con el esquema estilo OpenAI.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;temperature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0&lt;/code&gt; a &lt;code&gt;1.5&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Usa &lt;code&gt;0.3&lt;/code&gt; para código y &lt;code&gt;0.7&lt;/code&gt; para uso general.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;top_p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0&lt;/code&gt; a &lt;code&gt;1&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Muestreo nucleus. Por defecto &lt;code&gt;1.0&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;hasta el límite de contexto&lt;/td&gt;
&lt;td&gt;Limita la salida. Clave para controlar costos.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stream&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;bool&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;true&lt;/code&gt; / &lt;code&gt;false&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Activa streaming SSE.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;array&lt;/td&gt;
&lt;td&gt;especificación de funciones&lt;/td&gt;
&lt;td&gt;Define herramientas invocables.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tool_choice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string u objeto&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;auto&lt;/code&gt;, &lt;code&gt;any&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt; o herramienta específica&lt;/td&gt;
&lt;td&gt;En Mistral, &lt;code&gt;any&lt;/code&gt; fuerza una llamada a herramienta.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;response_format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;object&lt;/td&gt;
&lt;td&gt;JSON object o JSON schema&lt;/td&gt;
&lt;td&gt;Controla salida estructurada.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;random_seed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;entero&lt;/td&gt;
&lt;td&gt;Reproducibilidad.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;safe_prompt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;bool&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;true&lt;/code&gt; / &lt;code&gt;false&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Añade el preámbulo de seguridad de Mistral.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;presence_penalty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;-2&lt;/code&gt; a &lt;code&gt;2&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Penaliza repetición de temas.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;frequency_penalty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;-2&lt;/code&gt; a &lt;code&gt;2&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Penaliza repetición de tokens.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Dos diferencias al migrar desde OpenAI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenAI:  tool_choice="required"
Mistral: tool_choice="any"
&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;OpenAI:  seed
Mistral: random_seed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Instala el SDK oficial:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Ejemplo básico:&lt;br&gt;
&lt;/p&gt;

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

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

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

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

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

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Total tokens:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="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;Estimated cost USD:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt_cost&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;completion_cost&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si ya usas el SDK de OpenAI, cambia la URL base:&lt;br&gt;
&lt;/p&gt;

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

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

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

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

&lt;/div&gt;



&lt;p&gt;Usa el SDK nativo si quieres aprovechar características específicas de Mistral de forma más directa. Usa el SDK de OpenAI si tu código ya es agnóstico del proveedor.&lt;/p&gt;

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

&lt;p&gt;Instala el SDK nativo:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



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

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

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

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

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

&lt;/div&gt;



&lt;p&gt;Con el SDK de OpenAI:&lt;br&gt;
&lt;/p&gt;

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

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

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

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Streaming
&lt;/h2&gt;

&lt;p&gt;Activa &lt;code&gt;stream: true&lt;/code&gt; para recibir fragmentos SSE.&lt;br&gt;
&lt;/p&gt;

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

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

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

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

&lt;/div&gt;



&lt;p&gt;El contenido llega en &lt;code&gt;choices[].delta.content&lt;/code&gt;, con una forma compatible con el patrón de streaming de OpenAI.&lt;/p&gt;

&lt;p&gt;Para comparar latencia, tokens y costo por ejecución, puedes usar el visor de respuestas 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;.&lt;/p&gt;

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

&lt;p&gt;Medium 3.5 soporta llamada nativa a funciones mediante &lt;code&gt;tools&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

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

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

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

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

&lt;/div&gt;



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

&lt;ol&gt;
&lt;li&gt;Envía el prompt con &lt;code&gt;tools&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Lee &lt;code&gt;message.tool_calls&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ejecuta la función en tu backend.&lt;/li&gt;
&lt;li&gt;Añade el resultado como mensaje &lt;code&gt;role: "tool"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Llama de nuevo a la API para que el modelo continúe con contexto del resultado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El patrón es equivalente al bucle de herramientas de OpenAI, con la diferencia de &lt;code&gt;tool_choice="any"&lt;/code&gt; si quieres forzar una llamada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modo JSON y salida estructurada
&lt;/h2&gt;

&lt;p&gt;Para respuestas validadas por esquema, pasa &lt;code&gt;response_format&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

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

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

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

&lt;/div&gt;



&lt;p&gt;Para casos más simples, usa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response_format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json_object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego valida con Pydantic, Zod o tu validador preferido en el cliente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entrada de visión
&lt;/h2&gt;

&lt;p&gt;Medium 3.5 acepta imágenes junto con texto dentro de &lt;code&gt;messages&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Las imágenes se facturan como tokens de entrada a $1.5 por millón. El conteo exacto depende de la resolución y aparece en &lt;code&gt;usage.prompt_tokens&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para cargas multimodales de alto volumen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recorta la región relevante antes de enviar.&lt;/li&gt;
&lt;li&gt;Reduce resolución cuando sea posible.&lt;/li&gt;
&lt;li&gt;Registra &lt;code&gt;prompt_tokens&lt;/code&gt; por imagen.&lt;/li&gt;
&lt;li&gt;Evita enviar frames redundantes en video o capturas secuenciales.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Crea una colección en Apidog
&lt;/h2&gt;

&lt;p&gt;Para evitar prompts dispersos en terminal y tener costos visibles, crea una colección reutilizable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descarga Apidog&lt;/a&gt; y crea un proyecto.&lt;/li&gt;
&lt;li&gt;Crea un entorno con:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;BASE_URL=https://api.mistral.ai/v1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MISTRAL_API_KEY=...&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Guarda &lt;code&gt;MISTRAL_API_KEY&lt;/code&gt; como variable secreta.&lt;/li&gt;
&lt;li&gt;Crea una 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;   POST {{BASE_URL}}/chat/completions
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Añade encabezados:
&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 {{MISTRAL_API_KEY}}
   Content-Type: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Usa un body parametrizable:
&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;"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;"mistral-medium-3.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"temperature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"max_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Review this function and suggest improvements."&lt;/span&gt;&lt;span class="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;ol&gt;
&lt;li&gt;Revisa &lt;code&gt;usage&lt;/code&gt; en cada respuesta.&lt;/li&gt;
&lt;li&gt;Añade un cálculo de costo:
&lt;/li&gt;
&lt;/ol&gt;

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

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

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

&lt;/div&gt;



&lt;p&gt;Si ya tienes una colección para &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek V4&lt;/a&gt;, duplícala y cambia:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;El mismo patrón sirve para &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;comparar con GPT-5.5&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Errores frecuentes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Código&lt;/th&gt;
&lt;th&gt;Significado&lt;/th&gt;
&lt;th&gt;Acción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;400&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Solicitud incorrecta&lt;/td&gt;
&lt;td&gt;Valida &lt;code&gt;messages&lt;/code&gt;, &lt;code&gt;tools&lt;/code&gt; y el JSON enviado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;401&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clave inválida&lt;/td&gt;
&lt;td&gt;Regenera la clave en &lt;a href="https://console.mistral.ai/" rel="noopener noreferrer"&gt;console.mistral.ai&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;402&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pago requerido&lt;/td&gt;
&lt;td&gt;Añade saldo o método de pago.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;403&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modelo no permitido&lt;/td&gt;
&lt;td&gt;Revisa permisos del proyecto y el ID del modelo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;422&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Parámetro fuera de rango&lt;/td&gt;
&lt;td&gt;Revisa &lt;code&gt;max_tokens&lt;/code&gt;, &lt;code&gt;tool_choice&lt;/code&gt; o esquema JSON.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;429&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rate limit&lt;/td&gt;
&lt;td&gt;Reintenta con retroceso exponencial.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;500&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Error del servidor&lt;/td&gt;
&lt;td&gt;Reintenta una vez y registra el fallo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;503&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sobrecarga&lt;/td&gt;
&lt;td&gt;Espera o usa otro nivel temporalmente.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Implementa reintentos solo para &lt;code&gt;429&lt;/code&gt; y &lt;code&gt;5xx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

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

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

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;complete_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;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;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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&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="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status_code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

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

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

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

&lt;/div&gt;



&lt;p&gt;No reintentes automáticamente errores &lt;code&gt;4xx&lt;/code&gt; que no sean &lt;code&gt;429&lt;/code&gt;: normalmente indican un problema de payload, permisos o facturación.&lt;/p&gt;

&lt;h2&gt;
  
  
  Control de costos
&lt;/h2&gt;

&lt;p&gt;Medium 3.5 es más caro que Medium 3, así que evita enviarlo todo al modelo más potente por defecto.&lt;/p&gt;

&lt;p&gt;Patrones prácticos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Usa Medium 3 por defecto y escala a Medium 3.5 cuando haga falta.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Por ejemplo, usa Medium 3 para clasificación o borradores y Medium 3.5 cuando falle un validador o se requiera razonamiento más fuerte.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Limita &lt;code&gt;max_tokens&lt;/code&gt;.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
La salida cuesta $7.5 por millón. Si esperas respuestas cortas, no dejes el máximo abierto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reduce prompts de sistema largos.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Un preámbulo de 2K tokens se factura en cada llamada. Si puedes bajarlo a 500 tokens, reduces ese costo de entrada en 75%.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Registra &lt;code&gt;usage&lt;/code&gt; siempre.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Envía &lt;code&gt;prompt_tokens&lt;/code&gt;, &lt;code&gt;completion_tokens&lt;/code&gt;, &lt;code&gt;total_tokens&lt;/code&gt; y costo estimado a tu observabilidad.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Usa visión selectivamente.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Recorta o comprime imágenes antes de enviarlas. No mandes pantallas completas si solo necesitas una tabla o un diagrama.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ejemplo de cálculo:&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;estimate_cost_usd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;completion_tokens&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="n"&gt;completion_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;7.5&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Comparación con otros modelos de Mistral
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modelo&lt;/th&gt;
&lt;th&gt;Contexto&lt;/th&gt;
&lt;th&gt;Entrada $/M&lt;/th&gt;
&lt;th&gt;Salida $/M&lt;/th&gt;
&lt;th&gt;Visión&lt;/th&gt;
&lt;th&gt;Mejor para&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mistral-small&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;32K&lt;/td&gt;
&lt;td&gt;$0.10&lt;/td&gt;
&lt;td&gt;$0.30&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Clasificación de alto volumen, chat ligero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mistral-medium-3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;$0.40&lt;/td&gt;
&lt;td&gt;$2.00&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Rendimiento masivo, chat largo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mistral-medium-3.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;$1.5&lt;/td&gt;
&lt;td&gt;$7.5&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Razonamiento, código, visión, agentes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mistral-large&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;$2.00&lt;/td&gt;
&lt;td&gt;$6.00&lt;/td&gt;
&lt;td&gt;Limitada&lt;/td&gt;
&lt;td&gt;Razonamiento de texto de nivel frontera&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Medium 3.5 es el nivel que combina contexto largo, visión y razonamiento fusionado. No lo elijas solo por nombre: úsalo cuando esas capacidades sean necesarias para la tarea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migración desde otro proveedor
&lt;/h2&gt;

&lt;p&gt;La migración suele ser un cambio de URL base y modelo.&lt;/p&gt;

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

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

&lt;/div&gt;



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

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

&lt;/div&gt;



&lt;p&gt;Ajustes a revisar:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;





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

&lt;/div&gt;



&lt;p&gt;Antes de mover tráfico de producción:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ejecuta tu suite de pruebas actual.&lt;/li&gt;
&lt;li&gt;Compara respuestas para prompts críticos.&lt;/li&gt;
&lt;li&gt;Registra &lt;code&gt;usage&lt;/code&gt; y costo por llamada.&lt;/li&gt;
&lt;li&gt;Si es posible, ejecuta modo sombra durante un día y compara resultados en Apidog.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Medium 3.5 encaja especialmente bien en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Revisión de código a nivel PR.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
El contexto de 256K permite incluir diffs grandes y archivos relacionados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;QA sobre documentos largos.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Contratos, RFPs y políticas pueden procesarse en una sola llamada cuando caben en la ventana.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Extracción multimodal.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Puedes extraer campos estructurados desde recibos, capturas o diagramas sin encadenar OCR y otro modelo de texto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agentes con herramientas.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
La llamada nativa a funciones reduce fricción en flujos donde el modelo debe decidir entre responder, pedir información o invocar una herramienta.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  ¿Cuál es el ID del modelo?
&lt;/h3&gt;

&lt;p&gt;Para la API alojada:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;En Hugging Face:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Si sirves los pesos abiertos con vLLM o Unsloth, usa el ID del checkpoint de Hugging Face.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Medium 3.5 es compatible con OpenAI?
&lt;/h3&gt;

&lt;p&gt;Es compatible en la forma general del endpoint, encabezados y muchos parámetros. Los SDKs de OpenAI para Python y Node funcionan cambiando &lt;code&gt;base_url&lt;/code&gt;.&lt;/p&gt;

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

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

&lt;h3&gt;
  
  
  ¿Puedo ejecutar Medium 3.5 localmente?
&lt;/h3&gt;

&lt;p&gt;Sí. Los pesos están abiertos bajo una Licencia MIT Modificada con una excepción para grandes ingresos. El modelo tiene 128B parámetros, por lo que requiere memoria GPU significativa. Las builds GGUF cuantificadas de &lt;code&gt;unsloth/Mistral-Medium-3.5-128B-GGUF&lt;/code&gt; pueden ejecutarse en una tarjeta de consumo de gama alta.&lt;/p&gt;

&lt;p&gt;Los patrones de &lt;a href="http://apidog.com/blog/how-to-run-deepseek-v4-locally?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo ejecutar DeepSeek V4 localmente&lt;/a&gt; se aplican de forma similar.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Soporta streaming con herramientas?
&lt;/h3&gt;

&lt;p&gt;Sí. El streaming puede devolver fragmentos incrementales de llamadas a herramientas en &lt;code&gt;delta.tool_calls&lt;/code&gt;. Debes acumular esos fragmentos hasta formar el JSON completo antes de ejecutar la función.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo cuento tokens antes de enviar?
&lt;/h3&gt;

&lt;p&gt;Usa el tokenizador del paquete Python &lt;code&gt;mistral-common&lt;/code&gt;. Es el mismo tokenizador que usa la API, por lo que los conteos deberían alinearse con &lt;code&gt;usage.prompt_tokens&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué longitud de contexto debería usar en producción?
&lt;/h3&gt;

&lt;p&gt;256K es el límite, no el objetivo. Una llamada de 200K tokens cuesta $0.30 solo en entrada antes de generar salida. Para producción, intenta mantener la mayoría de las llamadas por debajo de 32K y usa contexto largo solo cuando la tarea lo requiera.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Hay un nivel gratuito?
&lt;/h3&gt;

&lt;p&gt;Mistral no anuncia un nivel gratuito permanente, aunque las cuentas nuevas pueden incluir crédito de prueba. Para experimentar con modelos comparables sin costo sostenido, revisa &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo usar la API de DeepSeek V4 de forma gratuita&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Plataforma API para Flujo de Trabajo API Design-First</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Thu, 30 Apr 2026 03:30:45 +0000</pubDate>
      <link>https://vibe.forem.com/roobia/plataforma-api-para-flujo-de-trabajo-api-design-first-550i</link>
      <guid>https://vibe.forem.com/roobia/plataforma-api-para-flujo-de-trabajo-api-design-first-550i</guid>
      <description>&lt;h2&gt;
  
  
  En resumen
&lt;/h2&gt;

&lt;p&gt;El enfoque de diseño-primero consiste en escribir la especificación de tu API antes del código de implementación. Esa especificación se convierte en la fuente de verdad para mocks, documentación, pruebas y stubs de cliente. Si eliges una plataforma que conecte todo el flujo, reduces la fricción de mantener código, contrato y documentación sincronizados. En este artículo verás cómo aplicar diseño-primero en la práctica y cómo encaja Apidog como plataforma completa para este flujo.&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;strong&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://apidog.com/download/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Prueba Apidog gratis&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;La mayoría de los desarrolladores empiezan creando APIs con un enfoque de código-primero:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Escribes una ruta.&lt;/li&gt;
&lt;li&gt;Añades anotaciones o decoradores.&lt;/li&gt;
&lt;li&gt;Ejecutas un generador.&lt;/li&gt;
&lt;li&gt;Obtienes documentación.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Funciona bien al principio. El problema aparece cuando la implementación cambia y la documentación no.&lt;/p&gt;

&lt;p&gt;Ejemplo típico:&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="s2"&gt;"foo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="s2"&gt;"bar"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La documentación dice que la API devuelve un array de strings, pero la implementación real termina devolviendo esto:&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="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;"foo"&lt;/span&gt;&lt;span class="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;"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;"bar"&lt;/span&gt;&lt;span class="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;Ese desajuste rompe integraciones, genera bugs en frontend y hace que los consumidores de la API pierdan confianza en la documentación.&lt;/p&gt;

&lt;p&gt;El diseño-primero invierte el flujo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Especificación OpenAPI
        ↓
Mocks
        ↓
Documentación
        ↓
Pruebas
        ↓
Implementación
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La especificación es la fuente de verdad. El código, los mocks y la documentación se derivan de ella o se validan contra ella.&lt;/p&gt;

&lt;p&gt;Esto no es una diferencia teórica. En equipos frontend/backend, el diseño-primero permite trabajar en paralelo desde el primer día: frontend consume mocks, backend implementa contra el contrato y las pruebas validan que ambos coincidan.&lt;/p&gt;

&lt;p&gt;La condición clave es que la herramienta haga que escribir la especificación sea rápido. Si definir un endpoint tarda más que implementarlo, el equipo terminará saltándose el diseño. Por eso una buena plataforma de diseño-primero debe hacer que la especificación sea fácil de crear, revisar y usar.&lt;/p&gt;




&lt;h2&gt;
  
  
  Qué significa diseño-primero en la práctica
&lt;/h2&gt;

&lt;p&gt;Diseño-primero no es una tecnología específica. Es un flujo de trabajo.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Antes de escribir código
&lt;/h3&gt;

&lt;p&gt;Primero defines el contrato de la API, normalmente como una especificación OpenAPI.&lt;/p&gt;

&lt;p&gt;Debe incluir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rutas y métodos HTTP.&lt;/li&gt;
&lt;li&gt;Parámetros de path, query y headers.&lt;/li&gt;
&lt;li&gt;Esquemas de request body para &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt; y &lt;code&gt;PATCH&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Esquemas de respuesta para códigos como &lt;code&gt;200&lt;/code&gt;, &lt;code&gt;400&lt;/code&gt;, &lt;code&gt;401&lt;/code&gt;, &lt;code&gt;422&lt;/code&gt; y &lt;code&gt;500&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Reglas de autenticación.&lt;/li&gt;
&lt;li&gt;Descripciones de campos.&lt;/li&gt;
&lt;li&gt;Ejemplos de request y response.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo simplificado de OpenAPI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/users/{id}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Obtener usuario por ID&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integer&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Usuario&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;encontrado"&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/UserProfile"&lt;/span&gt;
      &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;404"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Usuario&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;no&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;encontrado"&lt;/span&gt;

&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;UserProfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integer&lt;/span&gt;
          &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;123&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
          &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;user@example.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta fase es donde se toman decisiones importantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nombres de campos.&lt;/li&gt;
&lt;li&gt;Estructura de recursos.&lt;/li&gt;
&lt;li&gt;Formato de errores.&lt;/li&gt;
&lt;li&gt;Reglas de paginación.&lt;/li&gt;
&lt;li&gt;Códigos de estado.&lt;/li&gt;
&lt;li&gt;Compatibilidad hacia atrás.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Durante el desarrollo
&lt;/h3&gt;

&lt;p&gt;La especificación se publica en un servidor mock.&lt;/p&gt;

&lt;p&gt;El frontend puede consumir una URL simulada como si fuera la API real:&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Mientras tanto, backend implementa contra el contrato:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users/:id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;userRepository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&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="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USER_NOT_FOUND&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User not found&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&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="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&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;Frontend y backend ya no se bloquean mutuamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Después de implementar
&lt;/h3&gt;

&lt;p&gt;Las pruebas validan que la respuesta real coincida con la especificación.&lt;/p&gt;

&lt;p&gt;Por ejemplo, una prueba de contrato debería fallar si la API devuelve:&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="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emailAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user@example.com"&lt;/span&gt;&lt;span class="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;cuando la especificación exige:&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="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El objetivo no es solo comprobar que la API responde, sino que responde con el contrato correcto.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Cuando cambian los requisitos
&lt;/h3&gt;

&lt;p&gt;El cambio empieza en la especificación:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Se actualiza el contrato.&lt;/li&gt;
&lt;li&gt;El equipo revisa el cambio.&lt;/li&gt;
&lt;li&gt;Los mocks se actualizan.&lt;/li&gt;
&lt;li&gt;La documentación refleja la nueva versión.&lt;/li&gt;
&lt;li&gt;Backend ajusta la implementación.&lt;/li&gt;
&lt;li&gt;Las pruebas detectan cualquier desviación.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Así evitas que la implementación se convierta en una fuente de verdad oculta.&lt;/p&gt;




&lt;h2&gt;
  
  
  Qué necesita una plataforma de diseño-primero
&lt;/h2&gt;

&lt;p&gt;No todas las herramientas de API soportan bien este flujo. Una plataforma útil para diseño-primero debe cubrir estas piezas.&lt;/p&gt;

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

&lt;p&gt;Editar YAML manualmente puede ser lento y propenso a errores de indentación.&lt;/p&gt;

&lt;p&gt;Un buen editor visual debe permitir definir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Método HTTP.&lt;/li&gt;
&lt;li&gt;Ruta.&lt;/li&gt;
&lt;li&gt;Parámetros.&lt;/li&gt;
&lt;li&gt;Headers.&lt;/li&gt;
&lt;li&gt;Request body.&lt;/li&gt;
&lt;li&gt;Responses.&lt;/li&gt;
&lt;li&gt;Schemas reutilizables.&lt;/li&gt;
&lt;li&gt;Ejemplos.&lt;/li&gt;
&lt;li&gt;Reglas de validación.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;También debe generar OpenAPI válido y permitir reutilizar componentes.&lt;/p&gt;

&lt;p&gt;Ejemplo de componente reutilizable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;ErrorResponse&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;code&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;message&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
        &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego puedes usarlo en varios endpoints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;400"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Solicitud inválida&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/ErrorResponse"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Validación de OpenAPI
&lt;/h3&gt;

&lt;p&gt;La especificación debe validarse mientras la editas.&lt;/p&gt;

&lt;p&gt;La herramienta debería detectar errores como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Campos requeridos faltantes.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$ref&lt;/code&gt; rotos.&lt;/li&gt;
&lt;li&gt;Tipos inválidos.&lt;/li&gt;
&lt;li&gt;Responses sin descripción.&lt;/li&gt;
&lt;li&gt;Schemas mal estructurados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cuanto antes aparezca el error, más barato es corregirlo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generación automática de mocks
&lt;/h3&gt;

&lt;p&gt;El flujo ideal es:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Definir endpoint → Guardar especificación → Obtener mock funcional
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sin configuración manual adicional.&lt;/p&gt;

&lt;p&gt;El mock debe respetar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tipos de datos.&lt;/li&gt;
&lt;li&gt;Formatos (&lt;code&gt;email&lt;/code&gt;, &lt;code&gt;date-time&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;Enumeraciones.&lt;/li&gt;
&lt;li&gt;Rangos &lt;code&gt;minimum&lt;/code&gt; / &lt;code&gt;maximum&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Objetos anidados.&lt;/li&gt;
&lt;li&gt;Arrays.&lt;/li&gt;
&lt;li&gt;Referencias &lt;code&gt;$ref&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vista previa de documentación
&lt;/h3&gt;

&lt;p&gt;La especificación debe poder renderizarse como documentación legible.&lt;/p&gt;

&lt;p&gt;Esto permite revisar el contrato con:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend.&lt;/li&gt;
&lt;li&gt;Backend.&lt;/li&gt;
&lt;li&gt;QA.&lt;/li&gt;
&lt;li&gt;Product managers.&lt;/li&gt;
&lt;li&gt;Stakeholders no técnicos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una buena vista previa debe mostrar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Descripciones.&lt;/li&gt;
&lt;li&gt;Parámetros.&lt;/li&gt;
&lt;li&gt;Ejemplos.&lt;/li&gt;
&lt;li&gt;Schemas.&lt;/li&gt;
&lt;li&gt;Códigos de estado.&lt;/li&gt;
&lt;li&gt;Reglas de autenticación.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Flujo de revisión en equipo
&lt;/h3&gt;

&lt;p&gt;Los cambios en la especificación deben tratarse como cambios en código.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Alguien propone un cambio.&lt;/li&gt;
&lt;li&gt;El equipo comenta.&lt;/li&gt;
&lt;li&gt;Se ajusta la especificación.&lt;/li&gt;
&lt;li&gt;Se aprueba.&lt;/li&gt;
&lt;li&gt;Se implementa.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La plataforma debe soportar comentarios, historial y trazabilidad.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exportación a OpenAPI estándar
&lt;/h3&gt;

&lt;p&gt;La especificación tiene que ser portable.&lt;/p&gt;

&lt;p&gt;Debes poder exportarla como OpenAPI 3.x y usarla con otras herramientas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generadores de código.&lt;/li&gt;
&lt;li&gt;Gateways API.&lt;/li&gt;
&lt;li&gt;Frameworks de prueba.&lt;/li&gt;
&lt;li&gt;Validadores de contrato.&lt;/li&gt;
&lt;li&gt;Herramientas de documentación.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Apidog como plataforma de diseño-primero
&lt;/h2&gt;

&lt;p&gt;Apidog está organizado alrededor de la especificación como artefacto principal. La pestaña de diseño, el servidor mock, el ejecutor de pruebas y la documentación se conectan a la misma definición de API.&lt;/p&gt;

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

&lt;p&gt;La interfaz de diseño de Apidog usa edición basada en formularios.&lt;/p&gt;

&lt;p&gt;Para cada endpoint puedes definir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ruta.&lt;/li&gt;
&lt;li&gt;Método.&lt;/li&gt;
&lt;li&gt;Parámetros.&lt;/li&gt;
&lt;li&gt;Request body.&lt;/li&gt;
&lt;li&gt;Responses.&lt;/li&gt;
&lt;li&gt;Schemas.&lt;/li&gt;
&lt;li&gt;Descripciones.&lt;/li&gt;
&lt;li&gt;Reglas de validación.&lt;/li&gt;
&lt;li&gt;Datos de mock.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No necesitas escribir YAML si no quieres. También puedes abrir una vista raw para editar YAML o JSON directamente. Los cambios entre la vista visual y la vista raw se sincronizan.&lt;/p&gt;

&lt;p&gt;Los componentes de esquema son reutilizables. Puedes definir un esquema &lt;code&gt;UserProfile&lt;/code&gt; una vez y referenciarlo desde múltiples endpoints con &lt;code&gt;$ref&lt;/code&gt;.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;UserProfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integer&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
        &lt;span class="na"&gt;displayName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego lo reutilizas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/UserProfile"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si cambias &lt;code&gt;UserProfile&lt;/code&gt;, todos los endpoints que lo referencian reflejan ese cambio.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vista previa de documentación en tiempo real
&lt;/h3&gt;

&lt;p&gt;Mientras diseñas un endpoint, la documentación se actualiza en tiempo real.&lt;/p&gt;

&lt;p&gt;Esto te permite comprobar si el contrato es entendible antes de implementar.&lt;/p&gt;

&lt;p&gt;Revisa especialmente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si los nombres de campos son claros.&lt;/li&gt;
&lt;li&gt;Si las descripciones explican el comportamiento.&lt;/li&gt;
&lt;li&gt;Si los ejemplos son realistas.&lt;/li&gt;
&lt;li&gt;Si los errores están documentados.&lt;/li&gt;
&lt;li&gt;Si los códigos de estado son correctos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Puedes compartir un enlace de documentación con producto o frontend durante la fase de diseño. No necesitan instalar nada para revisarlo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Smart Mock: de especificación a mock funcional
&lt;/h3&gt;

&lt;p&gt;Cuando guardas un endpoint nuevo en Apidog, el servidor mock queda disponible de inmediato. La URL del mock aparece en la interfaz.&lt;/p&gt;

&lt;p&gt;El mock genera respuestas basadas en los schemas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Los strings con &lt;code&gt;format: email&lt;/code&gt; devuelven emails válidos.&lt;/li&gt;
&lt;li&gt;Los enteros con &lt;code&gt;minimum&lt;/code&gt; y &lt;code&gt;maximum&lt;/code&gt; devuelven valores dentro del rango.&lt;/li&gt;
&lt;li&gt;Los enums devuelven valores permitidos.&lt;/li&gt;
&lt;li&gt;Los objetos y arrays anidados siguen la estructura definida.&lt;/li&gt;
&lt;li&gt;Los componentes &lt;code&gt;$ref&lt;/code&gt; se resuelven correctamente.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;UserProfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
  &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integer&lt;/span&gt;
      &lt;span class="na"&gt;minimum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
      &lt;span class="na"&gt;maximum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;9999&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;enum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;admin&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;member&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;viewer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El mock puede devolver algo como:&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="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"member"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También puedes configurar reglas personalizadas. Por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Devolver &lt;code&gt;404&lt;/code&gt; cuando el parámetro &lt;code&gt;id&lt;/code&gt; sea &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Devolver una respuesta específica para &lt;code&gt;?status=inactive&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Simular errores de validación para pruebas de frontend.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Revisión en equipo y seguimiento de cambios
&lt;/h3&gt;

&lt;p&gt;En Apidog, los cambios en la especificación son visibles para los miembros del workspace.&lt;/p&gt;

&lt;p&gt;El equipo puede:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comentar endpoints.&lt;/li&gt;
&lt;li&gt;Comentar campos específicos.&lt;/li&gt;
&lt;li&gt;Revisar cambios.&lt;/li&gt;
&lt;li&gt;Ver quién modificó qué y cuándo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para diseño-primero, esto evita procesos paralelos. La revisión del contrato ocurre en la misma herramienta donde se diseña, documenta, prueba y simula la API.&lt;/p&gt;




&lt;h2&gt;
  
  
  Diseño-primero vs. código-primero: compensaciones reales
&lt;/h2&gt;

&lt;p&gt;Diseño-primero no siempre es la mejor opción. Depende del tipo de proyecto y del equipo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ventajas del diseño-primero
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Frontend y backend pueden trabajar en paralelo.&lt;/li&gt;
&lt;li&gt;La documentación es precisa porque nace del contrato.&lt;/li&gt;
&lt;li&gt;Los problemas de integración aparecen antes.&lt;/li&gt;
&lt;li&gt;El contrato de API es explícito y verificable.&lt;/li&gt;
&lt;li&gt;Los cambios pasan por revisión.&lt;/li&gt;
&lt;li&gt;Los mocks están disponibles desde el inicio.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desventajas del diseño-primero
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Requiere tiempo inicial para definir la especificación.&lt;/li&gt;
&lt;li&gt;La herramienta de especificación tiene curva de aprendizaje.&lt;/li&gt;
&lt;li&gt;Exige disciplina para mantener implementación y contrato sincronizados.&lt;/li&gt;
&lt;li&gt;Puede llevar a especificar demasiado pronto si el dominio aún no está claro.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ventajas del código-primero
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Más rápido para prototipos pequeños.&lt;/li&gt;
&lt;li&gt;Menos proceso para desarrolladores individuales.&lt;/li&gt;
&lt;li&gt;No necesitas aprender una herramienta adicional.&lt;/li&gt;
&lt;li&gt;Útil cuando la API cambia constantemente durante exploración.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desventajas del código-primero
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;La documentación es secundaria y puede quedar obsoleta.&lt;/li&gt;
&lt;li&gt;Frontend suele esperar a backend para integrar.&lt;/li&gt;
&lt;li&gt;El contrato es implícito.&lt;/li&gt;
&lt;li&gt;Los breaking changes son más difíciles de detectar.&lt;/li&gt;
&lt;li&gt;Refactorizar la API requiere actualizar documentación manualmente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para equipos con más de un ingeniero trabajando en una API, diseño-primero suele dar mejores resultados. La inversión inicial se compensa cuando hay coordinación real entre frontend, backend, QA y producto.&lt;/p&gt;




&lt;h2&gt;
  
  
  Herramientas que soportan flujos de diseño-primero
&lt;/h2&gt;

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

&lt;p&gt;Apidog ofrece una plataforma completa para diseño-primero: editor visual, mocks instantáneos, documentación, pruebas y revisión en equipo en una sola herramienta. El nivel gratuito cubre el conjunto completo de funciones. Su generación de mocks es uno de sus diferenciadores principales.&lt;/p&gt;

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

&lt;p&gt;Stoplight Studio es un editor OpenAPI sólido con linting Spectral para aplicar reglas de estilo. No incluye servidor mock ni ejecutor de pruebas incorporados. Es útil para organizaciones que necesitan gobernanza de APIs, aunque puede resultar caro para equipos pequeños.&lt;/p&gt;

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

&lt;p&gt;SwaggerHub es una plataforma madura para edición y colaboración sobre OpenAPI. Se usa mucho en empresas. Su capacidad de mock es limitada y no incluye pruebas. Encaja bien en organizaciones centradas en especificaciones dentro del ecosistema Swagger.&lt;/p&gt;

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

&lt;p&gt;Postman incluye una pestaña para diseño de APIs que genera especificaciones OpenAPI. Sin embargo, los flujos de diseño y colecciones pueden sentirse desconectados. El servidor mock requiere configuración manual a partir de colecciones, en lugar de generarse automáticamente desde la especificación. Funciona para equipos código-primero que quieren añadir documentación.&lt;/p&gt;

&lt;h3&gt;
  
  
  Insomnia con modo documento
&lt;/h3&gt;

&lt;p&gt;Insomnia soporta edición de especificaciones OpenAPI y proporciona mock básico. Es menos completo que herramientas dedicadas a diseño-primero, pero puede servir para desarrolladores individuales que buscan una opción ligera.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cómo configurar un flujo diseño-primero en Apidog
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Paso 1: Empieza con la especificación, no con una colección
&lt;/h3&gt;

&lt;p&gt;Crea un proyecto nuevo y abre la pestaña de diseño.&lt;/p&gt;

&lt;p&gt;Antes de enviar una sola request, define como mínimo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ruta.&lt;/li&gt;
&lt;li&gt;Método.&lt;/li&gt;
&lt;li&gt;Parámetros principales.&lt;/li&gt;
&lt;li&gt;Response esperado.&lt;/li&gt;
&lt;li&gt;Schema de error.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo de checklist para un endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ ] Método HTTP definido
[ ] Ruta definida
[ ] Parámetros documentados
[ ] Response 200 definido
[ ] Response de error definido
[ ] Schema reutilizable si aplica
[ ] Ejemplo de respuesta incluido
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Paso 2: Define componentes compartidos primero
&lt;/h3&gt;

&lt;p&gt;Antes de añadir muchos endpoints, define los schemas reutilizables.&lt;/p&gt;

&lt;p&gt;Por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ErrorResponse&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PaginationMeta&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UserProfile&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Address&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CreatedResourceResponse&lt;/code&gt;&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 yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;PaginationMeta&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;page&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integer&lt;/span&gt;
        &lt;span class="na"&gt;pageSize&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integer&lt;/span&gt;
        &lt;span class="na"&gt;total&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto evita que cada endpoint invente su propio formato de paginación.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 3: Obtén la URL del mock temprano
&lt;/h3&gt;

&lt;p&gt;Cuando guardes el endpoint, copia la URL del mock y compártela con frontend.&lt;/p&gt;

&lt;p&gt;Frontend puede empezar a integrar con algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;API_BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://mock.example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_BASE_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/users/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Failed to fetch user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cuando backend esté listo, solo se cambia el &lt;code&gt;API_BASE_URL&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 4: Revisa la documentación antes de implementar
&lt;/h3&gt;

&lt;p&gt;Abre la vista previa de documentación y valida:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿La descripción del endpoint explica qué hace?&lt;/li&gt;
&lt;li&gt;¿Los parámetros tienen significado claro?&lt;/li&gt;
&lt;li&gt;¿Los ejemplos ayudan a consumir la API?&lt;/li&gt;
&lt;li&gt;¿Los errores esperados están definidos?&lt;/li&gt;
&lt;li&gt;¿El schema refleja lo que frontend necesita?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si algo no se entiende en la documentación, tampoco será claro para quien consuma la API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 5: Bloquea la especificación para el sprint
&lt;/h3&gt;

&lt;p&gt;Cuando el diseño esté revisado, trata la especificación como bloqueada para ese sprint.&lt;/p&gt;

&lt;p&gt;Si backend descubre que necesita cambiar el contrato, el flujo debería ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Proponer cambio → Revisar con frontend/producto → Actualizar especificación → Implementar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No cambies silenciosamente la respuesta real.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 6: Ejecuta validación de schema en CI
&lt;/h3&gt;

&lt;p&gt;Configura pruebas para comprobar que la implementación real coincide con la especificación.&lt;/p&gt;

&lt;p&gt;El objetivo es detectar automáticamente cambios como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Campos faltantes.&lt;/li&gt;
&lt;li&gt;Tipos incorrectos.&lt;/li&gt;
&lt;li&gt;Códigos de estado no documentados.&lt;/li&gt;
&lt;li&gt;Estructuras de error inconsistentes.&lt;/li&gt;
&lt;li&gt;Responses incompatibles con el schema.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esta es la barrera que mantiene sincronizados contrato e implementación.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  ¿El diseño-primero es solo para APIs REST?
&lt;/h3&gt;

&lt;p&gt;No. El principio aplica a cualquier protocolo donde puedas definir un contrato:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST con OpenAPI.&lt;/li&gt;
&lt;li&gt;GraphQL con schema-first.&lt;/li&gt;
&lt;li&gt;gRPC con protobuf.&lt;/li&gt;
&lt;li&gt;Sistemas event-driven con AsyncAPI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apidog soporta diseño REST y GraphQL. Para gRPC, los archivos proto cumplen el mismo rol de contrato primero.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Tenemos que definir todos los endpoints antes de empezar?
&lt;/h3&gt;

&lt;p&gt;No. Puedes adoptar diseño-primero por funcionalidad.&lt;/p&gt;

&lt;p&gt;Por ejemplo, si vas a construir una nueva pantalla de perfil de usuario, define primero los endpoints necesarios para esa pantalla, aunque otras partes del sistema sigan siendo código-primero.&lt;/p&gt;

&lt;p&gt;La adopción incremental funciona bien.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo encaja diseño-primero con sprints ágiles?
&lt;/h3&gt;

&lt;p&gt;Al inicio del sprint, el equipo define el contrato de API para las funcionalidades planificadas.&lt;/p&gt;

&lt;p&gt;Luego:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend trabaja contra mocks.&lt;/li&gt;
&lt;li&gt;Backend implementa contra la especificación.&lt;/li&gt;
&lt;li&gt;QA revisa escenarios desde el contrato.&lt;/li&gt;
&lt;li&gt;La documentación queda lista como parte del flujo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La revisión de especificación pasa a formar parte de la planificación técnica del sprint.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué pasa si la implementación necesita diferir de la especificación original?
&lt;/h3&gt;

&lt;p&gt;Puede pasar.&lt;/p&gt;

&lt;p&gt;El proceso correcto es:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Actualizar la especificación.&lt;/li&gt;
&lt;li&gt;Revisar el cambio con los interesados.&lt;/li&gt;
&lt;li&gt;Actualizar mocks y documentación.&lt;/li&gt;
&lt;li&gt;Modificar la implementación.&lt;/li&gt;
&lt;li&gt;Ejecutar pruebas de contrato.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Así la especificación sigue siendo la fuente de verdad.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Podemos generar stubs de servidor desde la exportación OpenAPI de Apidog?
&lt;/h3&gt;

&lt;p&gt;Sí. Puedes exportar la especificación de Apidog como OpenAPI 3.x y usar generadores estándar para crear stubs de servidor.&lt;/p&gt;

&lt;p&gt;Por ejemplo, con &lt;code&gt;openapi-generator&lt;/code&gt; puedes generar código base para distintos lenguajes y frameworks.&lt;/p&gt;

&lt;p&gt;Flujo típico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Exportar OpenAPI → Ejecutar generador → Implementar handlers → Validar contra contrato
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ¿Cómo manejamos el versionado de la especificación?
&lt;/h3&gt;

&lt;p&gt;Apidog mantiene historial de cambios dentro del proyecto.&lt;/p&gt;

&lt;p&gt;Para versiones mayores que conviven en paralelo, como &lt;code&gt;v1&lt;/code&gt; y &lt;code&gt;v2&lt;/code&gt;, puedes usar proyectos o ramas separadas.&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;O bien:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;main
v2-design
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;según el flujo de trabajo del equipo.&lt;/p&gt;




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

&lt;p&gt;El diseño-primero exige una pequeña inversión inicial: definir el contrato antes de implementar. A cambio, reduce costos de integración, mejora la colaboración entre frontend y backend y mantiene la documentación alineada con la API real.&lt;/p&gt;

&lt;p&gt;La herramienta importa. Si escribir la especificación es lento o incómodo, el equipo la evitará. Un editor visual, mocks instantáneos, documentación en tiempo real y pruebas de contrato hacen que diseño-primero sea práctico.&lt;/p&gt;

&lt;p&gt;Apidog combina esas piezas en un flujo único, lo que ayuda a convertir la especificación en el centro del desarrollo de APIs, no en una tarea secundaria al final del sprint.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Actualizaciones de APIDOG Abril: Depurador de Agente IA, Depurador A2A y Migración Sencilla a Postman</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Wed, 29 Apr 2026 08:48:20 +0000</pubDate>
      <link>https://vibe.forem.com/roobia/actualizaciones-de-apidog-abril-depurador-de-agente-ia-depurador-a2a-y-migracion-sencilla-a-26nh</link>
      <guid>https://vibe.forem.com/roobia/actualizaciones-de-apidog-abril-depurador-de-agente-ia-depurador-a2a-y-migracion-sencilla-a-26nh</guid>
      <description>&lt;p&gt;El lanzamiento de abril se centra en un objetivo práctico: facilitar la inspección y depuración del desarrollo de Agentes de IA.&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;Si estás construyendo agentes, el problema no suele estar solo en la respuesta final. También necesitas entender qué ocurrió antes: qué interpretó el agente, qué herramienta llamó, qué devolvió esa herramienta y si el fallo estuvo en el prompt, en la configuración del modelo o en la lógica de negocio.&lt;/p&gt;

&lt;p&gt;Este mes, Apidog añade nuevas herramientas para ese flujo de trabajo: Depurador de Agentes de IA, Depurador A2A, importación de API de Postman para migraciones grandes, una mejor experiencia de “Preguntar a la IA” en documentos publicados y soporte para proveedores de modelos personalizados.&lt;/p&gt;

&lt;p&gt;Esto es lo que cambió 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  ⭐ Nuevas Actualizaciones
&lt;/h2&gt;

&lt;h2&gt;
  
  
  🔥 Depurador de Agentes de IA: inspecciona la ejecución completa del agente
&lt;/h2&gt;

&lt;p&gt;Apidog ya soportaba depuración visual para endpoints SSE, útil para respuestas en streaming, actualizaciones de progreso, notificaciones en tiempo real y otras APIs basadas en eventos.&lt;/p&gt;

&lt;p&gt;Pero depurar agentes requiere más que ver una transmisión.&lt;/p&gt;

&lt;p&gt;Una respuesta del modelo solo muestra dónde terminó el agente. Para depurar un sistema real, necesitas ver los pasos intermedios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Turnos de conversación.&lt;/li&gt;
&lt;li&gt;Llamadas al modelo.&lt;/li&gt;
&lt;li&gt;Llamadas a herramientas MCP.&lt;/li&gt;
&lt;li&gt;Ejecución de Habilidades personalizadas.&lt;/li&gt;
&lt;li&gt;Resultados devueltos por herramientas.&lt;/li&gt;
&lt;li&gt;Salida final.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El nuevo Depurador de Agentes de IA está diseñado para inspeccionar esa ruta de ejecución dentro de Apidog.&lt;/p&gt;

&lt;p&gt;En lugar de revisar únicamente la respuesta final, puedes seguir la ejecución completa del agente en un solo lugar. Esto ayuda a responder preguntas concretas de depuración:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿El prompt dio suficiente contexto al modelo?&lt;/li&gt;
&lt;li&gt;¿El agente eligió la herramienta correcta?&lt;/li&gt;
&lt;li&gt;¿La herramienta MCP devolvió el resultado esperado?&lt;/li&gt;
&lt;li&gt;¿El error viene de la configuración del modelo?&lt;/li&gt;
&lt;li&gt;¿El problema está en los parámetros de la herramienta?&lt;/li&gt;
&lt;li&gt;¿La lógica de negocio produjo una salida incorrecta?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un flujo típico de depuración puede verse así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Usuario
  ↓
Prompt del agente
  ↓
Llamada al modelo
  ↓
Selección de herramienta
  ↓
Llamada MCP o Habilidad personalizada
  ↓
Resultado de herramienta
  ↓
Respuesta final
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con el depurador, el objetivo es no tratar ese flujo como una caja negra. Puedes revisar cada paso y localizar en qué punto se desvió el comportamiento esperado.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤝 Depurador A2A: prueba la comunicación agente-a-agente
&lt;/h2&gt;

&lt;p&gt;Los sistemas multiagente son cada vez más comunes. Cuando varios agentes colaboran, necesitas validar que puedan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pasar tareas correctamente.&lt;/li&gt;
&lt;li&gt;Intercambiar mensajes.&lt;/li&gt;
&lt;li&gt;Recibir parámetros válidos.&lt;/li&gt;
&lt;li&gt;Devolver resultados interpretables.&lt;/li&gt;
&lt;li&gt;Manejar respuestas entre agentes sin romper el flujo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apidog ahora soporta depuración para el protocolo A2A de Google, es decir, Agent-to-Agent.&lt;/p&gt;

&lt;p&gt;Desde Apidog puedes enviar solicitudes A2A directamente, inspeccionar los parámetros de solicitud, revisar respuestas y validar el resultado de la interacción. Esto evita tener que alternar entre herramientas separadas o revisar manualmente los detalles del protocolo durante cada prueba.&lt;/p&gt;

&lt;p&gt;La diferencia entre las dos nuevas herramientas es directa:&lt;/p&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;Qué depura&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Depurador de Agentes de IA&lt;/td&gt;
&lt;td&gt;Lo que ocurre dentro de un agente durante una tarea&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Depurador A2A&lt;/td&gt;
&lt;td&gt;La comunicación entre un agente y otro agente&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;En la práctica, si estás construyendo agentes para producción, probablemente necesitarás ambas capacidades: una para entender el comportamiento interno y otra para validar la colaboración entre agentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Importa datos de Postman a través de la API de Postman
&lt;/h2&gt;

&lt;p&gt;La migración desde Postman ahora tiene una opción más cómoda para equipos grandes.&lt;/p&gt;

&lt;p&gt;Apidog ya soportaba la importación de archivos locales de Postman. Ahora también puedes importar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Workspaces.&lt;/li&gt;
&lt;li&gt;Collections.&lt;/li&gt;
&lt;li&gt;Environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Todo esto puede hacerse a través de la API de Postman.&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%2Fmwid60ncw5f2a04al02x.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwid60ncw5f2a04al02x.gif" alt="Apidog-02.gif" width="600" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este flujo está pensado para migraciones masivas al crear nuevos proyectos. En lugar de exportar archivos locales uno por uno, puedes mover una estructura más completa desde Postman hacia Apidog.&lt;/p&gt;

&lt;p&gt;Si tu cuenta de Postman tiene varios Workspaces, Apidog creará proyectos correspondientes después de la importación.&lt;/p&gt;

&lt;p&gt;Para migraciones pequeñas, los archivos locales siguen siendo una opción válida. Para migraciones grandes, la importación mediante API reduce pasos repetitivos como:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Exportar colecciones manualmente.&lt;/li&gt;
&lt;li&gt;Descargar entornos.&lt;/li&gt;
&lt;li&gt;Subir archivos uno por uno.&lt;/li&gt;
&lt;li&gt;Reorganizar proyectos después de la importación.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Un flujo de migración más práctico sería:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Postman Workspace
  ↓
API de Postman
  ↓
Importación en Apidog
  ↓
Proyecto correspondiente en Apidog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto hace que el proceso sea más manejable cuando el equipo trabaja con múltiples espacios, colecciones y entornos.&lt;/p&gt;

&lt;h2&gt;
  
  
  📄 “Preguntar a la IA” en documentos publicados ahora se abre en la barra lateral
&lt;/h2&gt;

&lt;p&gt;La función “Preguntar a la IA” en documentación publicada ahora se abre en una barra lateral.&lt;/p&gt;

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

&lt;p&gt;Esto mejora el flujo de lectura de documentación técnica porque puedes mantener la página actual abierta mientras haces preguntas sobre su contenido.&lt;/p&gt;

&lt;p&gt;Por ejemplo, puedes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Leer un endpoint en la documentación publicada.&lt;/li&gt;
&lt;li&gt;Abrir “Preguntar a la IA” en la barra lateral.&lt;/li&gt;
&lt;li&gt;Consultar detalles sobre parámetros, respuestas o uso esperado.&lt;/li&gt;
&lt;li&gt;Seguir leyendo sin perder tu posición en la página.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El cambio es pequeño a nivel de interfaz, pero útil en documentos largos. Evita alternar entre vistas y reduce el tiempo necesario para encontrar información específica dentro de una página extensa.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Proveedores de modelos de IA personalizados
&lt;/h2&gt;

&lt;p&gt;Los equipos ahora pueden conectar proveedores personalizados usando una URL Base personalizada.&lt;/p&gt;

&lt;p&gt;Esto resulta útil si tu organización ya trabaja con:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un servicio de modelo autoalojado.&lt;/li&gt;
&lt;li&gt;Una pasarela interna de modelos.&lt;/li&gt;
&lt;li&gt;Una configuración corporativa específica para IA.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En lugar de cambiar de herramienta cada vez que necesitas depurar un flujo relacionado con IA, puedes integrar esa configuración en Apidog y mantener el flujo de trabajo en el mismo entorno.&lt;/p&gt;

&lt;p&gt;Un caso típico sería:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Apidog
  ↓
URL Base personalizada
  ↓
Proveedor de modelo interno o autoalojado
  ↓
Respuesta del modelo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto da más flexibilidad a los equipos que no dependen exclusivamente de proveedores públicos o que necesitan trabajar con infraestructura interna.&lt;/p&gt;

&lt;h2&gt;
  
  
  🐞 Corrección de errores y pequeñas mejoras
&lt;/h2&gt;

&lt;p&gt;También se lanzaron varias correcciones y mejoras de calidad de vida este mes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se corrigió un problema donde la fusión inteligente de OpenAPI no mantenía los ejemplos de respuesta del endpoint.&lt;/li&gt;
&lt;li&gt;Se corrigió un problema donde la fusión de una rama secundaria a una rama principal protegida podía incluir endpoints que no estaban seleccionados.&lt;/li&gt;
&lt;li&gt;Se corrigió la visualización incorrecta del desplegable al crear versiones de endpoints desde ramas.&lt;/li&gt;
&lt;li&gt;Se corrigió un problema donde TestData y TestCases no funcionaban al ejecutar pruebas a través de la CLI.&lt;/li&gt;
&lt;li&gt;Se corrigió un problema donde la exportación de OpenAPI incluía componentes de respuesta de módulos no relacionados.&lt;/li&gt;
&lt;li&gt;Se corrigió el formato de exportación de Markdown para JSON con comentarios.&lt;/li&gt;
&lt;li&gt;Se corrigió un error de exportación de Word causado por &lt;code&gt;crypto is not defined&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Se corrigió un problema donde la importación de Knife4j con Basic Auth habilitado no mostraba los campos de nombre de usuario y contraseña.&lt;/li&gt;
&lt;li&gt;Se corrigió un error de filtrado de endpoints cuando las etiquetas eran números.&lt;/li&gt;
&lt;li&gt;Se corrigió un problema donde &lt;code&gt;apidog endpoint list --branch&lt;/code&gt; no devolvía datos para la rama especificada.&lt;/li&gt;
&lt;li&gt;Se corrigieron varios problemas de parámetros, filtrado y mensajes de error de la herramienta MCP.&lt;/li&gt;
&lt;li&gt;Se corrigió un problema donde el código generado no incluía la opción de configuración &lt;code&gt;typescriptThreePlus&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🌟 Qué significa esto para equipos que construyen agentes
&lt;/h2&gt;

&lt;p&gt;Este lanzamiento está orientado a flujos de trabajo reales de desarrollo de Agentes de IA.&lt;/p&gt;

&lt;p&gt;En resumen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usa el &lt;strong&gt;Depurador de Agentes de IA&lt;/strong&gt; para inspeccionar una ejecución completa de un agente.&lt;/li&gt;
&lt;li&gt;Usa el &lt;strong&gt;Depurador A2A&lt;/strong&gt; para validar comunicación entre agentes.&lt;/li&gt;
&lt;li&gt;Usa la &lt;strong&gt;importación mediante API de Postman&lt;/strong&gt; para migraciones grandes.&lt;/li&gt;
&lt;li&gt;Usa la barra lateral de &lt;strong&gt;“Preguntar a la IA”&lt;/strong&gt; para consultar documentación publicada sin perder contexto.&lt;/li&gt;
&lt;li&gt;Usa &lt;strong&gt;proveedores de modelos personalizados&lt;/strong&gt; si tu equipo trabaja con modelos internos o autoalojados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No son cambios pensados solo para demos. Son herramientas útiles cuando el desarrollo de agentes pasa a proyectos más complejos, donde necesitas trazabilidad, migración ordenada y depuración más precisa.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬 Únete a la conversación
&lt;/h2&gt;

&lt;p&gt;Conéctate con otros ingenieros de API y el equipo de Apidog:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Únete a nuestra comunidad de &lt;a href="https://discord.com/invite/ZBxrzyXfbJ" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; para discusiones y soporte en tiempo real.&lt;/li&gt;
&lt;li&gt;Participa en nuestra comunidad de &lt;a href="https://join.slack.com/t/apidogcommunity/shared_invite/zt-2neie4nh2-4_zhufuNBmCq4EtI6fZUwA" rel="noopener noreferrer"&gt;Slack&lt;/a&gt; para conversaciones técnicas.&lt;/li&gt;
&lt;li&gt;Síguenos en &lt;a href="https://x.com/ApidogHQ" rel="noopener noreferrer"&gt;X (Twitter)&lt;/a&gt; para las últimas actualizaciones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;P.D. Para todos los detalles sobre las actualizaciones, consulta el &lt;a href="https://apidog.canny.io/changelog/" rel="noopener noreferrer"&gt;Changelog de Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Saludos cordiales,&lt;br&gt;&lt;br&gt;
El equipo de Apidog&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Facturación del Uso de GitHub Copilot: Qué Esperar para Equipos API</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Wed, 29 Apr 2026 07:08:30 +0000</pubDate>
      <link>https://vibe.forem.com/roobia/facturacion-del-uso-de-github-copilot-que-esperar-para-equipos-api-7nk</link>
      <guid>https://vibe.forem.com/roobia/facturacion-del-uso-de-github-copilot-que-esperar-para-equipos-api-7nk</guid>
      <description>&lt;p&gt;El modelo de facturación de GitHub Copilot cambió dos veces el año pasado y volvió a cambiar este mes. Desde ahora, la revisión de código de Copilot en pull requests consume minutos de GitHub Actions de la cuenta de facturación propietaria del repositorio. Para equipos de API, esto significa gestionar tres medidores en paralelo: licencias de Copilot, solicitudes premium y minutos de Actions. Esta guía muestra qué mide cada uno, por qué los repositorios de API suelen consumir más y cómo estimar el costo antes de que aparezca en la factura.&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;Al final, lo conectamos con un flujo de trabajo en Apidog para mantener especificaciones de API, pruebas de contrato y revisión de IA en un solo pipeline, en lugar de repartir el control entre varios paneles de facturación.&lt;/p&gt;

&lt;p&gt;Si también está modelando los costos de las API que su equipo consume directamente, estas guías sobre &lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;precios de GPT-5.5&lt;/a&gt; y &lt;a href="http://apidog.com/blog/deepseek-v4-api-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;precios de DeepSeek V4&lt;/a&gt; cubren el lado por token de la misma conversación.&lt;/p&gt;

&lt;h2&gt;
  
  
  En resumen: TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Copilot ahora tiene tres medidores relevantes: licencia por usuario, solicitudes premium y minutos de Actions para la revisión de código.&lt;/li&gt;
&lt;li&gt;La revisión de código en PR se ejecuta internamente como una GitHub Action y consume minutos de la cuota normal de Actions de la organización.&lt;/li&gt;
&lt;li&gt;Los repositorios de API suelen consumir más porque las PR incluyen especificación, clientes generados, handlers y pruebas.&lt;/li&gt;
&lt;li&gt;Las solicitudes premium aplican a flujos como Workspace, modo agente, Copilot Spaces y selección de modelos.&lt;/li&gt;
&lt;li&gt;Configure límites de gasto antes del siguiente ciclo de facturación.&lt;/li&gt;
&lt;li&gt;Como punto inicial, presupueste entre 400 y 800 minutos de Actions al mes por repositorio de API activo y revise los datos después de 30 días.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Los tres medidores de Copilot
&lt;/h2&gt;

&lt;p&gt;Copilot dejó de ser una única línea de costo. Ahora conviene separarlo en tres partes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Medidor 1: licencia por usuario
&lt;/h2&gt;

&lt;p&gt;Este es el costo fijo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copilot Business: 10 USD por usuario al mes.&lt;/li&gt;
&lt;li&gt;Copilot Enterprise: 19 USD por usuario al mes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La licencia cubre chat, completions en línea, sugerencias multilínea, integraciones IDE y acceso al grupo de modelos estándar.&lt;/p&gt;

&lt;p&gt;Acción recomendada:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Exporte la lista de usuarios con licencia.&lt;/li&gt;
&lt;li&gt;Revise actividad real por usuario.&lt;/li&gt;
&lt;li&gt;Recupere licencias de usuarios inactivos.&lt;/li&gt;
&lt;li&gt;Repita la auditoría cada trimestre.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La licencia es el componente más fácil de estimar, pero también el más comúnmente sobredimensionado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Medidor 2: solicitudes premium
&lt;/h2&gt;

&lt;p&gt;Las solicitudes premium son la unidad de consumo para funciones más costosas de Copilot.&lt;/p&gt;

&lt;p&gt;Cuentan como solicitudes premium las operaciones en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modo agente.&lt;/li&gt;
&lt;li&gt;Workspace.&lt;/li&gt;
&lt;li&gt;Copilot Spaces.&lt;/li&gt;
&lt;li&gt;Selección de modelos fuera del predeterminado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tarifas actuales, sujetas a cambios:&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;Costo en solicitudes premium&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chat del modelo predeterminado&lt;/td&gt;
&lt;td&gt;Gratis para niveles de pago&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Completions en línea&lt;/td&gt;
&lt;td&gt;Gratis para niveles de pago&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modo agente con modelo predeterminado&lt;/td&gt;
&lt;td&gt;1 por solicitud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workspace con modelo predeterminado&lt;/td&gt;
&lt;td&gt;1 por solicitud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.5&lt;/td&gt;
&lt;td&gt;Multiplicador de 1.5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;Multiplicador de 2x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5 Pro&lt;/td&gt;
&lt;td&gt;Multiplicador de 6x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consulta de Copilot Spaces&lt;/td&gt;
&lt;td&gt;1 por consulta&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cuotas incluidas:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Solicitudes premium incluidas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Copilot Business&lt;/td&gt;
&lt;td&gt;300 por usuario/mes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copilot Enterprise&lt;/td&gt;
&lt;td&gt;1.000 por usuario/mes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;El exceso se factura a 0,04 USD por solicitud, hasta el límite de gasto configurado en la organización.&lt;/p&gt;

&lt;p&gt;En equipos de API, los prompts que más consumen suelen ser tareas como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Regenera el cliente OpenAPI para este cambio.
&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;Escribe una prueba de contrato para este nuevo endpoint.
&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;Actualiza el handler, la validación y los tests para esta ruta.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aunque el desarrollador envíe una sola instrucción, el flujo interno puede ejecutar varios pasos y consumir varias solicitudes premium.&lt;/p&gt;

&lt;h2&gt;
  
  
  Medidor 3: minutos de Actions para revisión de código
&lt;/h2&gt;

&lt;p&gt;Este es el cambio más importante para pipelines.&lt;/p&gt;

&lt;p&gt;Cuando Copilot revisa una pull request, esa revisión se ejecuta como una GitHub Action. Por lo tanto, consume minutos del mismo pool de Actions que usa su CI.&lt;/p&gt;

&lt;p&gt;Dos reglas prácticas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Los minutos se descuentan de la cuota normal de GitHub Actions del plan.&lt;/li&gt;
&lt;li&gt;En repositorios privados, esos minutos cuentan contra el presupuesto de Actions. En repositorios públicos, las Actions son gratuitas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una revisión típica de Copilot en una PR de API consume entre 2 y 6 minutos de Actions. Una revisión pesada, con diff grande y mucho contexto, puede llegar a 15 minutos.&lt;/p&gt;

&lt;p&gt;Fórmula rápida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minutos_revision = pull_requests_mes × minutos_promedio_por_revision
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;50 PR/mes × 4 min = 200 min/mes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En un único repositorio, eso puede parecer poco. En varios repositorios activos, empieza a competir con el presupuesto de CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué los repositorios de API consumen más
&lt;/h2&gt;

&lt;p&gt;Los repositorios de API suelen golpear estos medidores con más fuerza por tres motivos.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Las PR son más grandes
&lt;/h2&gt;

&lt;p&gt;Un cambio típico de API puede tocar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;openapi.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Clientes generados&lt;/li&gt;
&lt;li&gt;Handler o controlador del servidor&lt;/li&gt;
&lt;li&gt;Validaciones&lt;/li&gt;
&lt;li&gt;Tests unitarios&lt;/li&gt;
&lt;li&gt;Tests de contrato&lt;/li&gt;
&lt;li&gt;Documentación&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Copilot necesita leer más contexto, por lo que la revisión tarda más y consume más minutos de Actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. El código generado infla el diff
&lt;/h2&gt;

&lt;p&gt;Muchos equipos versionan clientes generados en varios lenguajes. Por ejemplo:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Si Copilot revisa esos archivos, paga el costo de procesar código que normalmente no requiere revisión humana ni IA.&lt;/p&gt;

&lt;p&gt;Acción recomendada: excluya clientes generados de la revisión.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Varias herramientas se ejecutan en la misma PR
&lt;/h2&gt;

&lt;p&gt;Una PR de API puede activar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copilot review.&lt;/li&gt;
&lt;li&gt;CodeQL.&lt;/li&gt;
&lt;li&gt;Snyk.&lt;/li&gt;
&lt;li&gt;Escáneres internos.&lt;/li&gt;
&lt;li&gt;Tests de contrato.&lt;/li&gt;
&lt;li&gt;Generación de clientes.&lt;/li&gt;
&lt;li&gt;Validación OpenAPI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada herramienta consume su propio tiempo de ejecución. Copilot no reemplaza esos costos; se suma a ellos.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;50 PR/mes × 4 min/revisión = 200 min/mes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con tres repositorios similares:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3 × 200 = 600 min/mes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y eso antes de contar builds, tests y despliegues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo estimar la factura mensual
&lt;/h2&gt;

&lt;p&gt;Use una estimación en tres pasos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 1: calcule licencias
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;costo_licencias_business = usuarios_activos × 10
costo_licencias_enterprise = usuarios_activos × 19
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10 usuarios × 19 USD = 190 USD/mes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Paso 2: calcule solicitudes premium
&lt;/h2&gt;

&lt;p&gt;Estime el consumo por perfil de usuario:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Perfil&lt;/th&gt;
&lt;th&gt;Uso mensual aproximado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Usuario principalmente de chat&lt;/td&gt;
&lt;td&gt;~150 solicitudes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usuario intensivo de Workspace/agente&lt;/td&gt;
&lt;td&gt;~600 a 800 solicitudes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exceso_premium = max(0, solicitudes_usadas - 300_por_usuario) × 0.04
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;solicitudes_usadas = 800
cuota_incluida = 300
exceso = 500

500 × 0.04 = 20 USD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Acción recomendada: configure un límite de gasto a nivel de organización. El valor predeterminado ilimitado no es seguro para equipos que aún no monitorean consumo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 3: calcule minutos de Actions para revisión
&lt;/h2&gt;

&lt;p&gt;Use el promedio real si ya tiene datos. Si no, empiece con 4 minutos por PR de API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minutos_revision = prs_mes × 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para repositorios privados en Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exceso_actions = max(0, minutos_revision - cuota_actions_disponible) × 0.008
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejemplo para un equipo de 10 desarrolladores en Enterprise que fusiona 200 PR al mes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Licencias:          10 × 19 = 190 USD
Exceso premium:    ~40 USD
Revisión Copilot:  200 × 4 = 800 min/mes
Exceso Actions:    0 USD si entra en cuota
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Total aproximado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;230 USD/mes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En equipos Business pequeños, el exceso puede aparecer antes porque las cuotas incluidas son más ajustadas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cambios recomendados en el pipeline de CI
&lt;/h2&gt;

&lt;p&gt;Estos ajustes reducen consumo sin eliminar la revisión cuando aporta valor.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Omita bots y PR automáticas
&lt;/h2&gt;

&lt;p&gt;No ejecute revisión de Copilot en PR de Dependabot, Renovate u otros automatizadores.&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Esto evita gastar minutos en actualizaciones de dependencias que ya tienen un patrón de revisión conocido.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Filtre archivos generados
&lt;/h2&gt;

&lt;p&gt;En repositorios de API, excluya clientes generados y artefactos derivados.&lt;/p&gt;

&lt;p&gt;Ejemplo de rutas que sí conviene revisar:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Evite rutas como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;clients/generated/**
sdk/**
dist/**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La revisión se concentra en lógica, contratos y tests, no en archivos generados.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Use validación barata antes de revisión cara
&lt;/h2&gt;

&lt;p&gt;Ordene el pipeline así:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Validar especificación OpenAPI.&lt;/li&gt;
&lt;li&gt;Ejecutar pruebas de contrato.&lt;/li&gt;
&lt;li&gt;Ejecutar tests rápidos.&lt;/li&gt;
&lt;li&gt;Solo si todo pasa, activar revisión de Copilot.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contract-tests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run contract validation&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apidog-cli test&lt;/span&gt;

  &lt;span class="na"&gt;copilot-review&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;contract-tests&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;needs.contract-tests.result == 'success'&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github/copilot-review@v1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La idea es simple: falle rápido con checks baratos y reserve Copilot para PR que ya pasaron validación básica.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Use activación por etiqueta
&lt;/h2&gt;

&lt;p&gt;En lugar de revisar cada PR, active Copilot solo cuando la PR tenga una etiqueta explícita.&lt;/p&gt;

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

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

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;PR pequeñas: revisión humana normal.&lt;/li&gt;
&lt;li&gt;PR de cambios de contrato: Copilot review.&lt;/li&gt;
&lt;li&gt;PR críticas o de seguridad: Copilot review + revisión humana obligatoria.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este patrón reduce costos sin perder cobertura en cambios importantes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gobernanza: controles mínimos
&lt;/h2&gt;

&lt;p&gt;Configure estos cuatro controles antes del próximo ciclo de facturación.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Límite de gasto
&lt;/h2&gt;

&lt;p&gt;Defínalo a nivel de organización.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;límite = presupuesto_mensual_esperado × 0.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si el presupuesto esperado es 500 USD:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;500 × 0.8 = 400 USD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Así fuerza una revisión antes de que el consumo se descontrole.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Alertas de solicitudes premium
&lt;/h2&gt;

&lt;p&gt;GitHub envía alertas al 50 %, 75 % y 90 % de la cuota incluida.&lt;/p&gt;

&lt;p&gt;No las deje solo en correo. Envíelas también a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slack.&lt;/li&gt;
&lt;li&gt;Microsoft Teams.&lt;/li&gt;
&lt;li&gt;PagerDuty.&lt;/li&gt;
&lt;li&gt;La herramienta interna de incidentes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Política de disparadores por repositorio
&lt;/h2&gt;

&lt;p&gt;Defina una regla clara:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copilot review en todas las PR.&lt;/li&gt;
&lt;li&gt;Copilot review solo con etiqueta.&lt;/li&gt;
&lt;li&gt;Copilot review solo en rutas específicas.&lt;/li&gt;
&lt;li&gt;Copilot review solo en repositorios críticos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para equipos de API, el modelo por etiqueta suele ser el más equilibrado.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Habilitación por equipo
&lt;/h2&gt;

&lt;p&gt;No active todas las funciones de Copilot Enterprise para toda la organización de una vez.&lt;/p&gt;

&lt;p&gt;Empiece con:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Equipo de plataforma.&lt;/li&gt;
&lt;li&gt;Equipo de API principal.&lt;/li&gt;
&lt;li&gt;Repositorios con mayor volumen de cambios.&lt;/li&gt;
&lt;li&gt;Expansión gradual tras 30 días de métricas.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Dónde encaja 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; no reemplaza Copilot. Sirve como capa para centralizar especificaciones, mocks y pruebas de contrato, de modo que la revisión de IA no tenga que resolver problemas que el pipeline puede detectar antes.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Mantenga la especificación y ejemplos de requests en la colección de Apidog junto al repositorio.&lt;/li&gt;
&lt;li&gt;Ejecute pruebas de contrato contra el mock server de Apidog.&lt;/li&gt;
&lt;li&gt;Valide contratos antes de activar revisión de Copilot.&lt;/li&gt;
&lt;li&gt;Use Copilot para revisar lógica de controladores, cobertura y cambios no triviales.&lt;/li&gt;
&lt;li&gt;Excluya clientes generados y artefactos derivados.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenAPI spec
   ↓
Apidog mock server
   ↓
Contract tests
   ↓
CI checks
   ↓
Copilot review
   ↓
Human review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto importa porque la revisión de Copilot es uno de los pasos más caros del pipeline. Si una PR falla por contrato, conviene detectarlo antes de gastar minutos de revisión.&lt;/p&gt;

&lt;p&gt;La &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de pruebas de API sin Postman&lt;/a&gt; cubre el flujo de simulación de Apidog. La &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de la API de DeepSeek V4&lt;/a&gt; muestra el patrón aplicado a una API de modelo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué revisar en el próximo ciclo de facturación
&lt;/h2&gt;

&lt;p&gt;Ponga estos hitos en el calendario.&lt;/p&gt;

&lt;h2&gt;
  
  
  Días 1 a 7
&lt;/h2&gt;

&lt;p&gt;Revise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usuarios activos.&lt;/li&gt;
&lt;li&gt;Solicitudes premium por usuario.&lt;/li&gt;
&lt;li&gt;Repositorios con Copilot review activado.&lt;/li&gt;
&lt;li&gt;Minutos de Actions usados por CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En esta etapa, la mayoría de equipos aún está dentro de la cuota incluida.&lt;/p&gt;

&lt;h2&gt;
  
  
  Días 14 a 21
&lt;/h2&gt;

&lt;p&gt;Aquí suelen aparecer los usuarios intensivos.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;solicitudes premium usadas / cuota incluida
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si configuró un límite de gasto, algunas solicitudes pueden empezar a fallar. Si no configuró límite, la factura seguirá creciendo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Días 28 a 30
&lt;/h2&gt;

&lt;p&gt;Compare contra el mes anterior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minutos de Actions totales.&lt;/li&gt;
&lt;li&gt;Minutos atribuidos a revisión.&lt;/li&gt;
&lt;li&gt;PR revisadas por Copilot.&lt;/li&gt;
&lt;li&gt;PR de bots revisadas por error.&lt;/li&gt;
&lt;li&gt;Rutas que dispararon revisiones innecesarias.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ajuste:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Filtros de ruta.&lt;/li&gt;
&lt;li&gt;Etiquetas.&lt;/li&gt;
&lt;li&gt;Repositorios habilitados.&lt;/li&gt;
&lt;li&gt;Licencias inactivas.&lt;/li&gt;
&lt;li&gt;Usuarios que deberían pasar a Enterprise por volumen.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Errores comunes
&lt;/h2&gt;

&lt;p&gt;Estos son los problemas que más suelen aparecer en auditorías de equipos de API.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. No configurar límite de gasto
&lt;/h2&gt;

&lt;p&gt;Un flujo de agente mal definido puede consumir durante horas. Siempre configure un límite.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Activar revisión en todos los repositorios
&lt;/h2&gt;

&lt;p&gt;No todos los repositorios necesitan revisión de Copilot. Priorice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APIs críticas.&lt;/li&gt;
&lt;li&gt;Servicios con alto volumen de cambios.&lt;/li&gt;
&lt;li&gt;Repositorios con lógica compleja.&lt;/li&gt;
&lt;li&gt;Cambios de contrato frecuentes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Revisar clientes generados
&lt;/h2&gt;

&lt;p&gt;Filtre rutas generadas. Es uno de los ahorros más rápidos.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Revisar PR de bots
&lt;/h2&gt;

&lt;p&gt;Excluya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dependabot[bot]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;renovate[bot]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Bots internos de actualización&lt;/li&gt;
&lt;li&gt;Automatizaciones de versionado&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. No guardar una línea base
&lt;/h2&gt;

&lt;p&gt;Sin una medición previa, no puede saber si un cambio ahorró dinero.&lt;/p&gt;

&lt;p&gt;Cada mes, exporte CSV desde facturación de GitHub y guarde:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mes
repositorio
minutos_actions
solicitudes_premium
usuarios_activos
prs_revisadas
costo_total
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h2&gt;
  
  
  ¿El precio por usuario sigue siendo de 10 USD?
&lt;/h2&gt;

&lt;p&gt;Copilot Business cuesta 10 USD por usuario al mes. Copilot Enterprise cuesta 19 USD por usuario al mes. Copilot Pro para individuos cuesta 10 USD al mes. El plan también determina la cuota incluida de solicitudes premium.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Las completions en línea ahora se miden?
&lt;/h2&gt;

&lt;p&gt;No. El chat con modelo predeterminado y las completions en línea no se miden para niveles de pago. Las solicitudes premium aplican a funciones más costosas y selección de modelos.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué pasa cuando se agota mi cuota premium?
&lt;/h2&gt;

&lt;p&gt;Por defecto, las solicitudes pueden fallar con error de cuota. También puede configurar un límite de gasto para permitir exceso a 0,04 USD por solicitud hasta el límite definido.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Los minutos de Actions para revisión se facturan por separado?
&lt;/h2&gt;

&lt;p&gt;No. Consumen el mismo grupo de minutos de GitHub Actions que usa el resto de su CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Puedo deshabilitar por completo la revisión de Copilot?
&lt;/h2&gt;

&lt;p&gt;Sí. El administrador de la organización puede excluir repositorios mediante políticas. También puede controlar la activación por equipo.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Copilot review funciona con especificaciones de API privadas?
&lt;/h2&gt;

&lt;p&gt;Sí. En repositorios privados, la revisión consume minutos de Actions. En repositorios públicos, las Actions son gratuitas.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿La revisión de Copilot también usa solicitudes premium?
&lt;/h2&gt;

&lt;p&gt;Actualmente consume minutos de Actions. El modelo usado por el revisor forma parte de la plataforma Copilot y no se factura por separado como solicitud premium. Esta parte podría cambiar, así que conviene seguir el changelog de GitHub.&lt;/p&gt;

&lt;p&gt;Para equipos que ejecutan revisión de Copilot y llamadas directas a APIs de modelos en CI, la &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-free-codex?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de GPT-5.5 free Codex&lt;/a&gt; cubre el lado por token. &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; ayuda a mantener la capa de mock y contrato antes de ejecutar revisiones de IA más costosas.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo Usar la API de Zuplo</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Mon, 27 Apr 2026 08:42:42 +0000</pubDate>
      <link>https://vibe.forem.com/roobia/como-usar-la-api-de-zuplo-4h8k</link>
      <guid>https://vibe.forem.com/roobia/como-usar-la-api-de-zuplo-4h8k</guid>
      <description>&lt;p&gt;Si has leído sobre Zuplo y quieres implementar algo real con él, esta es la publicación para ti. La plataforma es rápida de aprender, pero la documentación está dispersa en flujos del portal, comandos de CLI y artículos del centro de aprendizaje. Esta guía une las piezas en un solo tutorial: crear un proyecto, exponer una ruta, agregar autenticación con clave API y limitación de velocidad, escribir una política personalizada de TypeScript, desplegar en el edge y probar todo con Apidog.&lt;/p&gt;

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

&lt;p&gt;Al final, tendrás una puerta de enlace API funcional ejecutándose frente a tu origen, con autenticación, limitación de velocidad, un portal para desarrolladores autogenerado y un flujo de trabajo Git compatible con CI. Todo el recorrido te llevará unos treinta minutos.&lt;/p&gt;

&lt;p&gt;Si aún estás decidiendo si Zuplo es la herramienta adecuada, comienza con nuestra publicación complementaria: &lt;a href="http://apidog.com/blog/what-is-zuplo-api-gateway?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Qué es la puerta de enlace API de Zuplo&lt;/a&gt;. Para todo lo demás, la &lt;a href="https://zuplo.com/docs" rel="noopener noreferrer"&gt;documentación de Zuplo&lt;/a&gt; cubre casos especiales que esta guía omite.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Regístrate en &lt;a href="https://portal.zuplo.com" rel="noopener noreferrer"&gt;portal.zuplo.com&lt;/a&gt; o andamia un proyecto local con &lt;code&gt;npm create zuplo&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Define rutas en &lt;code&gt;config/routes.oas.json&lt;/code&gt; y reenvíalas a tu origen con el Manejador de Reenvío de URL (URL Forward Handler).&lt;/li&gt;
&lt;li&gt;Agrega políticas de entrada (autenticación con clave API, límite de velocidad, validación de esquema) editando el archivo de ruta o haciendo clic en el Diseñador de Rutas.&lt;/li&gt;
&lt;li&gt;Escribe lógica personalizada como módulos de TypeScript en &lt;code&gt;modules/&lt;/code&gt;; el tiempo de ejecución te da acceso tipado a la solicitud, el contexto y el entorno.&lt;/li&gt;
&lt;li&gt;Haz push a tu rama de Git vinculada para desplegar un entorno de vista previa; fusiona para enviar a producción en más de 300 ubicaciones edge.&lt;/li&gt;
&lt;li&gt;Prueba cada ruta con &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; antes de promover a producción.&lt;/li&gt;
&lt;li&gt;El precio comienza gratis con 100K solicitudes al mes; el plan Builder cuesta $25 al mes.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Necesitas tres cosas antes de empezar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Una cuenta de Zuplo&lt;/li&gt;
&lt;li&gt;Una API de origen para colocar la puerta de enlace delante. Si no tienes una, usa &lt;code&gt;https://echo.zuplo.io&lt;/code&gt;, que replica lo que le envíes.&lt;/li&gt;
&lt;li&gt;Node.js 18 o superior si planeas usar la CLI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para el desarrollo local también necesitas un editor de código. VS Code con la extensión de TypeScript es el camino de menor resistencia, y puedes combinarlo con la &lt;a href="http://apidog.com/blog/how-to-use-apidog-inside-vscode?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;extensión de Apidog para VS Code&lt;/a&gt; para enviar solicitudes sin salir de tu editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 1: Crea tu proyecto Zuplo
&lt;/h2&gt;

&lt;p&gt;Tienes dos formas de empezar: el portal web o la CLI. La mayoría de los equipos comienzan en el portal porque es más rápido para una demostración, y luego migran a la CLI una vez que desean CI/CD.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opción A: Primero el portal
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Inicia sesión en &lt;a href="https://portal.zuplo.com" rel="noopener noreferrer"&gt;portal.zuplo.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Haz clic en "New Project" (Nuevo Proyecto) y elige un nombre como &lt;code&gt;acme-gateway&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Elige "Empty Project" (Proyecto Vacío) para que no se cree nada automáticamente.&lt;/li&gt;
&lt;li&gt;La pestaña Código se abre a un árbol de archivos inicial.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;El portal vincula el proyecto a un repositorio Git gestionado por defecto. Puedes conectar tu propio repositorio de GitHub, GitLab, Bitbucket o Azure DevOps desde Configuración más tarde.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opción B: Primero la CLI
&lt;/h3&gt;

&lt;p&gt;La CLI andamia el mismo diseño de proyecto localmente para que puedas editar en tu IDE y usar Git desde el primer día.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;El servidor de desarrollo se inicia en el puerto 9000 y muestra un enlace al Diseñador de Rutas local en &lt;code&gt;http://localhost:9100&lt;/code&gt;. Cualquier cambio que realices en el editor o en el diseñador se recarga automáticamente de inmediato.&lt;/p&gt;

&lt;p&gt;Para vincular el proyecto local a tu cuenta Zuplo una vez que estés listo para desplegar:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Elige la cuenta y el entorno cuando se te solicite. Desde aquí, &lt;code&gt;npx zuplo deploy&lt;/code&gt; despliega la rama Git actual.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 2: Define tu primera ruta
&lt;/h2&gt;

&lt;p&gt;Abre &lt;code&gt;config/routes.oas.json&lt;/code&gt;. Este es un documento OpenAPI 3 con extensiones Zuplo para manejadores y políticas. Agrega una ruta que reenvíe &lt;code&gt;GET /v1/products&lt;/code&gt; a tu origen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"openapi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"info"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Acme Gateway"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"paths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"/v1/products"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"get"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"List products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"operationId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"list-products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"x-zuplo-route"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"corsPolicy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"anything-goes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"handler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"urlForwardHandler"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$import(@zuplo/runtime)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${env.ORIGIN_URL}"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"policies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"inbound"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"responses"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"200"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Success"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;La extensión &lt;code&gt;x-zuplo-route&lt;/code&gt; es donde Zuplo reside dentro de un archivo OpenAPI por lo demás estándar.&lt;/li&gt;
&lt;li&gt;El &lt;code&gt;handler&lt;/code&gt; describe lo que sucede cuando la ruta coincide; &lt;code&gt;urlForwardHandler&lt;/code&gt; es el proxy incorporado.&lt;/li&gt;
&lt;li&gt;La referencia &lt;code&gt;${env.ORIGIN_URL}&lt;/code&gt; extrae de las variables de entorno para que puedas apuntar a diferentes backends por entorno.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Establece &lt;code&gt;ORIGIN_URL&lt;/code&gt; desde Configuración &amp;gt; Variables de Entorno en el portal, o editando &lt;code&gt;config/.env&lt;/code&gt; localmente. Usa &lt;code&gt;https://echo.zuplo.io&lt;/code&gt; si aún no tienes un origen real.&lt;/p&gt;

&lt;p&gt;Guarda y el servidor de desarrollo local se recargará. Accede a &lt;code&gt;http://localhost:9000/v1/products&lt;/code&gt; y deberías ver la solicitud replicada. Las puertas de enlace desplegadas responderán desde el centro de datos edge más cercano en su lugar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 3: Agrega autenticación con clave API
&lt;/h2&gt;

&lt;p&gt;Las API públicas necesitan credenciales. Zuplo ofrece un servicio de claves API gestionado para que no tengas que construir un almacén de claves por tu cuenta.&lt;/p&gt;

&lt;p&gt;Edita la ruta para agregar la política de entrada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"policies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inbound"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"api-key-auth"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego, agrega la definición de la política a &lt;code&gt;config/policies.json&lt;/code&gt; (Zuplo crea este archivo la primera vez que agregas una política):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api-key-auth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policyType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api-key-inbound"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ApiKeyInboundPolicy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$import(@zuplo/runtime)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"allowUnauthenticatedRequests"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora crea un consumidor (la entidad que posee una o más claves API):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ve a Servicios &amp;gt; Servicio de Claves API en el portal.&lt;/li&gt;
&lt;li&gt;Haz clic en "Create Consumer" (Crear Consumidor).&lt;/li&gt;
&lt;li&gt;Establece el sujeto a un identificador estable como &lt;code&gt;acme-customer-1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Agrega el correo electrónico de quien deba gestionar la clave.&lt;/li&gt;
&lt;li&gt;Copia la clave API generada.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Prueba con curl. Sin la cabecera, deberías ver un 401:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; https://YOUR-PROJECT.zuplo.app/v1/products
&lt;span class="c"&gt;# HTTP/2 401&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con la cabecera, deberías ver la respuesta original 200:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; https://YOUR-PROJECT.zuplo.app/v1/products &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_API_KEY"&lt;/span&gt;
&lt;span class="c"&gt;# HTTP/2 200&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si prefieres manejar esto desde un cliente real, importa la especificación OpenAPI de la puerta de enlace en &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, establece una cabecera global para &lt;code&gt;Authorization: Bearer {{api_key}}&lt;/code&gt;, y vincula &lt;code&gt;api_key&lt;/code&gt; a una variable de entorno. Obtendrás una superficie de prueba limpia para cada ruta en segundos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 4: Limita la velocidad de la ruta
&lt;/h2&gt;

&lt;p&gt;Nunca lances una API pública sin límites de velocidad. La política predeterminada de límite de velocidad de Zuplo te ofrece limitación por IP, por clave o por atributo personalizado.&lt;/p&gt;

&lt;p&gt;Agrégala a la lista de entrada, después de la autenticación:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"policies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inbound"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"api-key-auth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate-limit-by-key"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Defínela en &lt;code&gt;config/policies.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate-limit-by-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policyType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate-limit-inbound"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RateLimitInboundPolicy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$import(@zuplo/runtime)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"rateLimitBy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sub"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"requestsAllowed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"timeWindowMinutes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;rateLimitBy: "sub"&lt;/code&gt; asocia el cubo al sujeto autenticado de la política de claves API, de modo que cada cliente obtiene su propio presupuesto de 60 por minuto. Reemplaza con &lt;code&gt;"ip"&lt;/code&gt; si quieres limitar el tráfico anónimo.&lt;/p&gt;

&lt;p&gt;La solicitud número 61 dentro de cualquier ventana de sesenta segundos devuelve un 429 con cabeceras de reintento adjuntas. Pruébalo enviando 70 solicitudes en un bucle y observando cómo cambian los códigos de respuesta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;1..70&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    https://YOUR-PROJECT.zuplo.app/v1/products &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_API_KEY"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deberías ver 60 líneas que indican &lt;code&gt;200&lt;/code&gt; y 10 que indican &lt;code&gt;429&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 5: Valida las cargas útiles de las solicitudes
&lt;/h2&gt;

&lt;p&gt;Si tienes una ruta &lt;code&gt;POST&lt;/code&gt; que acepta un cuerpo JSON, la política de validación de solicitudes detecta cargas útiles malformadas en la puerta de enlace en lugar de en tu origen. Utiliza el esquema JSON incrustado en tu operación OpenAPI, por lo que obtienes esto gratis si tu especificación es precisa.&lt;/p&gt;

&lt;p&gt;Agrega una ruta con un cuerpo de solicitud:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"/v1/products"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Create product"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"operationId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"create-product"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"requestBody"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"application/json"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"priceCents"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"minLength"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"priceCents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"integer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"minimum"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"enum"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"food"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"drink"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"x-zuplo-route"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"handler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mismo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;que&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;arriba&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;*/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"policies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"inbound"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"api-key-auth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"rate-limit-by-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"validate-request"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agrega la política:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"validate-request"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policyType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"open-api-request-validation-inbound"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OpenApiRequestValidationInboundPolicy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$import(@zuplo/runtime)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"validateBody"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reject"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora, una solicitud &lt;code&gt;POST&lt;/code&gt; con un campo faltante será rechazada con un 400 antes de que llegue a tu origen. Pruébalo con &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; guardando una solicitud de “ruta feliz”, una solicitud de “campo requerido faltante” y una solicitud de “valor de enumeración incorrecto” como ejemplos separados en el mismo grupo de solicitudes. Puedes ejecutar las tres con un solo clic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 6: Escribe una política personalizada de TypeScript
&lt;/h2&gt;

&lt;p&gt;Las políticas predefinidas cubren la mayoría de las necesidades de los equipos. El objetivo de Zuplo, sin embargo, es el momento en que necesitas algo personalizado. Aquí tienes una política de salida que agrega una cabecera &lt;code&gt;Cache-Control&lt;/code&gt; para clientes de pago y &lt;code&gt;no-store&lt;/code&gt; para los gratuitos.&lt;/p&gt;

&lt;p&gt;Crea &lt;code&gt;modules/tiered-cache.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;HttpProblems&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@zuplo/runtime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;PolicyOptions&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;paidPlanHeader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;paidMaxAge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PolicyOptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;free&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;free&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cache-Control&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;no-store&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cache-Control&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;`public, max-age=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;paidMaxAge&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Cache header set for plan=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conéctala en &lt;code&gt;config/policies.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tiered-cache"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policyType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"custom-code-outbound"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$import(./modules/tiered-cache)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"paidPlanHeader"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"x-plan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"paidMaxAge"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y referénciala desde la ruta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"policies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inbound"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"api-key-auth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate-limit-by-key"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"outbound"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"tiered-cache"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La política personalizada es solo una función. Puedes probarla unitariamente con Vitest o Jest pasando un &lt;code&gt;Response&lt;/code&gt; y &lt;code&gt;ZuploRequest&lt;/code&gt; sintéticos y haciendo aserciones sobre las cabeceras, sin necesidad de un arnés de integración.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 7: Despliega en el edge
&lt;/h2&gt;

&lt;p&gt;El despliegue es un &lt;code&gt;git push&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add products gateway with auth, rate limit, and tiered cache"&lt;/span&gt;
git push origin feature/products-gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zuplo construye un entorno de vista previa para cada rama e imprime la URL en el registro de compilación. La vista previa obtiene su propio subdominio como &lt;code&gt;https://acme-gateway-feature-products-gateway-abc123.zuplo.app&lt;/code&gt;, con todas tus políticas activas y apuntando a cualquier &lt;code&gt;ORIGIN_URL&lt;/code&gt; que esté configurado para ese entorno.&lt;/p&gt;

&lt;p&gt;Prueba la URL de vista previa con &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; configurándola como un nuevo entorno en tu proyecto. Ejecuta tu suite de pruebas completa contra ella. Si todo pasa, fusiona la rama.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout main
git merge feature/products-gateway
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La fusión dispara el despliegue a producción. En sesenta segundos, la nueva versión está activa en más de 300 ubicaciones edge. La promoción y la reversión son ambas operaciones &lt;code&gt;git push&lt;/code&gt;; no hay una interfaz de usuario separada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 8: Genera el portal para desarrolladores
&lt;/h2&gt;

&lt;p&gt;El portal se aloja en &lt;code&gt;https://YOUR-PROJECT.developers.zuplo.com&lt;/code&gt; y se reconstruye en cada despliegue. Incluye:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Una página por ruta, con el esquema, la descripción y una consola de prueba.&lt;/li&gt;
&lt;li&gt;Ejemplos de código en cURL, JavaScript, Python, Go y algunos otros.&lt;/li&gt;
&lt;li&gt;Emisión de claves API de autoservicio para cualquier visitante que se registre.&lt;/li&gt;
&lt;li&gt;Controles de marca en el portal bajo Portal para desarrolladores &amp;gt; Configuración.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si tu especificación OpenAPI tiene buenas descripciones y ejemplos, el portal parecerá terminado sin más trabajo. Si tu especificación es escasa, este es el momento en que lo descubrirás.&lt;/p&gt;

&lt;p&gt;Para personalizar, el código fuente del portal se envía como una aplicación Next.js separada que puedes bifurcar desde &lt;a href="https://github.com/zuplo/zudoku" rel="noopener noreferrer"&gt;el repositorio del portal para desarrolladores de Zuplo en GitHub&lt;/a&gt;. La mayoría de los equipos se mantienen en la versión alojada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 9: Prueba todo con Apidog
&lt;/h2&gt;

&lt;p&gt;Una vez que tu puerta de enlace esté activa, la disciplina que previene incidentes en producción es probar cada ruta, cada política y cada ruta de error. &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; lo hace rápido.&lt;/p&gt;

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

&lt;p&gt;El flujo de trabajo que funciona bien:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Importa la especificación OpenAPI de la puerta de enlace desde &lt;code&gt;https://YOUR-PROJECT.zuplo.app/openapi&lt;/code&gt;. Apidog convierte cada operación en una solicitud que puedes enviar.&lt;/li&gt;
&lt;li&gt;Crea entornos para &lt;code&gt;local&lt;/code&gt;, &lt;code&gt;preview&lt;/code&gt; y &lt;code&gt;production&lt;/code&gt;, cada uno con su propia &lt;code&gt;base_url&lt;/code&gt; y &lt;code&gt;api_key&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Guarda como mínimo tres solicitudes por ruta: ruta feliz, fallo de autenticación y activación del límite de velocidad. Ejecútalas como un grupo antes de cada despliegue.&lt;/li&gt;
&lt;li&gt;Usa los escenarios de prueba automatizados de Apidog para encadenar llamadas (crear un producto, listarlo, eliminarlo) y hacer aserciones sobre las formas de las respuestas.&lt;/li&gt;
&lt;li&gt;Genera ejemplos de código en el lenguaje principal de tu equipo y pégalos en tus manuales de operaciones.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si estás migrando desde Postman, la &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de prueba de API sin Postman&lt;/a&gt; te explica la importación. &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descarga Apidog&lt;/a&gt; si aún no lo has hecho.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes sobre el uso de Zuplo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Cómo cambio una ruta entre entornos sin modificar la especificación?
&lt;/h3&gt;

&lt;p&gt;Usa variables de entorno. Define &lt;code&gt;ORIGIN_URL&lt;/code&gt; por entorno en la Configuración del portal o en &lt;code&gt;config/.env&lt;/code&gt; localmente, y referénciala como &lt;code&gt;${env.ORIGIN_URL}&lt;/code&gt; dentro de las opciones del manejador. La ruta permanece idéntica; solo la variable cambia.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo ejecutar Zuplo sin conexión?
&lt;/h3&gt;

&lt;p&gt;Sí. &lt;code&gt;npm run dev&lt;/code&gt; inicia una puerta de enlace local en el puerto 9000 con el Diseñador de Rutas local en el 9100. Las políticas personalizadas, la validación y la limitación de velocidad funcionan todas localmente; lo único que requiere una conexión a Internet es el servicio gestionado de claves API, y puedes ejecutar &lt;code&gt;npx zuplo link&lt;/code&gt; para usar el servicio en la nube desde tu instancia local.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo revierto un despliegue defectuoso?
&lt;/h3&gt;

&lt;p&gt;Haz &lt;code&gt;git revert&lt;/code&gt; al commit de fusión y haz push. Zuplo redeploya el estado anterior. No hay un botón de “reversión” separado porque el historial de Git es la fuente de la verdad.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué sucede con las solicitudes en curso durante un despliegue?
&lt;/h3&gt;

&lt;p&gt;Los despliegues son atómicos en el edge; las solicitudes en curso terminan en la versión antigua y las nuevas solicitudes llegan a la nueva versión. No hay ventana de inactividad.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo usar Zuplo con gRPC o WebSockets?
&lt;/h3&gt;

&lt;p&gt;Sí. El &lt;code&gt;urlForwardHandler&lt;/code&gt; proxy las actualizaciones de WebSocket de forma transparente, y gRPC es compatible a través del manejador gRPC. REST y GraphQL son de primera clase y los casos más comunes.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo expongo mi API de Zuplo a agentes de IA?
&lt;/h3&gt;

&lt;p&gt;Agrega el Manejador del Servidor MCP a una ruta, apúntalo a tu especificación OpenAPI y elige las operaciones a exponer. Las mismas políticas de autenticación y límite de velocidad se aplican a las solicitudes MCP. La &lt;a href="https://zuplo.com/docs/mcp-server/introduction" rel="noopener noreferrer"&gt;documentación del Servidor MCP de Zuplo&lt;/a&gt; cubre la configuración.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuánto cuesta la puerta de enlace en producción?
&lt;/h3&gt;

&lt;p&gt;El nivel gratuito cubre 100K solicitudes por mes. El plan Builder agrega 1M de solicitudes por $25 al mes, y las solicitudes adicionales cuestan $100 por cada 100K. Los precios empresariales comienzan en $1,000 al mes con un contrato anual. Desglose completo en la &lt;a href="https://zuplo.com/pricing" rel="noopener noreferrer"&gt;página de precios de Zuplo&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Ahora tienes una puerta de enlace Zuplo funcional con autenticación de clave API, limitación de velocidad por clave, validación de solicitudes, una política de salida personalizada de TypeScript y un portal para desarrolladores, todo desplegado a través de Git al edge global. El mismo proyecto maneja entornos de vista previa, lanzamientos de producción y acceso de agentes de IA a través de MCP.&lt;/p&gt;

&lt;p&gt;La pieza que lo mantiene estable es el ciclo de pruebas. Usa &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; en cada vista previa antes de fusionarla, y detectarás las cabeceras de autenticación rotas, los campos de esquema faltantes y los límites de velocidad que fueron accidentalmente demasiado generosos antes de que se implementen. &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descarga Apidog&lt;/a&gt; y conéctalo a tu puerta de enlace hoy.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>¿Qué es el API Gateway de Zuplo?</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Mon, 27 Apr 2026 06:28:18 +0000</pubDate>
      <link>https://vibe.forem.com/roobia/que-es-el-api-gateway-de-zuplo-18e0</link>
      <guid>https://vibe.forem.com/roobia/que-es-el-api-gateway-de-zuplo-18e0</guid>
      <description>&lt;p&gt;La mayoría de los gateways API todavía parecen haber sido diseñados para un equipo de operaciones de 2014. Escribes YAML, luchas con un plano de control y esperas a que alguien con acceso al clúster impulse tus cambios. Zuplo cambia ese modelo. Es un gateway API programable y nativo de la periferia (edge-native) donde tus rutas residen en un repositorio Git, tus políticas son TypeScript y cada commit se despliega en más de 300 ubicaciones globales en segundos.&lt;/p&gt;

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

&lt;p&gt;Esta guía explica qué hace el gateway API de Zuplo, cómo se diferencia de Kong y AWS API Gateway, cuánto cuesta y cómo implementar tu primer gateway en menos de treinta minutos. Verás ejemplos de código para enrutamiento, autenticación y limitación de tasas, además de una sección sobre cómo probar cada endpoint con &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; antes de que llegue a producción.&lt;/p&gt;

&lt;p&gt;Zuplo se encuentra en una categoría que solía estar dominada por Kong, Apigee y AWS API Gateway. La propuesta es simple: los desarrolladores obtienen un lenguaje de programación real, las operaciones obtienen un servicio gestionado y el producto obtiene una capa de monetización incorporada. A continuación se detalla el flujo de trabajo real y los compromisos.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Zuplo es un gateway API totalmente gestionado y edge-native que ejecuta tus rutas en más de 300 centros de datos de Cloudflare con latencia &amp;lt;50ms y sin arranques en frío.&lt;/li&gt;
&lt;li&gt;Configuración GitOps-nativa: el gateway reside en un repositorio Git y se despliega vía CI/CD, no desde una UI.&lt;/li&gt;
&lt;li&gt;Políticas escritas en TypeScript con soporte de IDE completo, no YAML o Lua.&lt;/li&gt;
&lt;li&gt;El plan gratuito cubre 100K solicitudes/mes con entornos, claves API y portales ilimitados.&lt;/li&gt;
&lt;li&gt;Funciones integradas: autenticación por clave API, JWT, OAuth2, limitación de tasas, validación de solicitudes, portal autogenerado y monetización con Stripe.&lt;/li&gt;
&lt;li&gt;Incluye manejador de servidor MCP para exponer rutas a Claude, Codex, Cursor o cualquier cliente MCP.&lt;/li&gt;
&lt;li&gt;Prueba cualquier ruta Zuplo de extremo a extremo con &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; antes de pasar a producción.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Qué es Zuplo?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zuplo.com/docs/api-management/introduction" rel="noopener noreferrer"&gt;Zuplo es una plataforma de gestión de API&lt;/a&gt; construida sobre tres principios: código sobre configuración, edge sobre región, y Git sobre GUI. Funciona como un servicio gestionado en el edge de Cloudflare: un solo despliegue llega a más de 300 ubicaciones globales sin aprovisionamiento manual.&lt;/p&gt;

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

&lt;p&gt;En lugar de usar YAML almacenado en una base de datos de control, Zuplo trata tu gateway como un proyecto TypeScript. Tienes un archivo &lt;code&gt;routes.oas.json&lt;/code&gt; para endpoints, una carpeta de módulos TypeScript para lógica personalizada y un archivo de configuración para políticas. Haz push a GitHub: la plataforma compila, valida y despliega automáticamente.&lt;/p&gt;

&lt;p&gt;Soporta REST, GraphQL, gRPC, WebSockets y SOAP. Cumple SOC 2 Tipo II, funciona con AWS, Azure y GCP, y ofrece opción autoalojada en Kubernetes para requisitos estrictos. El modelo de precios es por volumen de solicitudes, no por usuario. Consulta el desglose en la &lt;a href="https://zuplo.com/pricing" rel="noopener noreferrer"&gt;página de precios de Zuplo&lt;/a&gt;.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Por qué elegir Zuplo frente a Kong, Apigee y AWS API Gateway
&lt;/h2&gt;

&lt;p&gt;Cada gateway tiene un enfoque distinto. &lt;a href="http://apidog.com/blog/apigee-vs-kong/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Kong&lt;/a&gt; prioriza el control y requiere experiencia en Lua. &lt;a href="http://apidog.com/blog/apigee-vs-kong/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apigee&lt;/a&gt; es empresarial, con analíticas profundas y curva de aprendizaje alta. AWS API Gateway es natural si ya usas AWS, pero carece de portal para desarrolladores y Lambda introduce latencias de arranque en frío.&lt;/p&gt;

&lt;p&gt;Zuplo apunta a equipos pequeños que quieren capacidades empresariales sin staff dedicado de platform engineering.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Código, no YAML:&lt;/strong&gt; Una política de limitación de tasas en Zuplo es TypeScript directo (3 líneas). En Kong, son ~15 líneas de YAML y plugins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portal para desarrolladores incluido:&lt;/strong&gt; Zuplo genera el portal desde tu OpenAPI, incluso en el plan gratuito. En Kong y Apigee, es complejo o solo empresarial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitOps por defecto:&lt;/strong&gt; Todo cambio es un pull request; tienes auditoría y &lt;code&gt;git revert&lt;/code&gt; gratis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge-native, sin arranques en frío:&lt;/strong&gt; Zuplo se ejecuta en Cloudflare Workers; cada solicitud llega al edge más cercano y arranca en milisegundos. AWS API Gateway + Lambda añade 100-800ms de arranque en frío.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si ya tienes Kong o Apigee y la operación está bajo control, cambiar rara vez compensa. Si partes de cero o tu gateway actual es un cuello de botella, el flujo de Zuplo es una mejora clara.&lt;/p&gt;

&lt;h2&gt;
  
  
  Características principales del gateway API de Zuplo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Programabilidad con TypeScript
&lt;/h3&gt;

&lt;p&gt;Define el comportamiento del gateway en archivos TypeScript junto a tus rutas. Las políticas son funciones que reciben la solicitud, procesan y devuelven la solicitud o respuesta modificada. Ejemplo para eliminar una cabecera interna:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@zuplo/runtime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-internal-trace-id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Guárdalo en &lt;code&gt;modules/strip-internal-header.ts&lt;/code&gt;, referencia en la ruta y haz push a Git para desplegar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Más de 60 políticas predefinidas
&lt;/h3&gt;

&lt;p&gt;No necesitas programar lo básico; Zuplo ofrece políticas listas para autenticación por clave API, JWT, OAuth2, limitación de tasas, validación OpenAPI, CORS, listas blancas de IP, transformación de solicitudes, etc. Solo edita la definición de la ruta; no hay que tocar código para los casos estándar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Portal para desarrolladores autogenerado
&lt;/h3&gt;

&lt;p&gt;El portal se genera automáticamente desde tu OpenAPI: documentación, consola interactiva, ejemplos en cURL/JS/Python/Go y emisión de claves API de autoservicio. Los desarrolladores pueden probar y consumir tu API sin intervención manual.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monetización de API integrada
&lt;/h3&gt;

&lt;p&gt;Define planes (gratuito, pro, enterprise), conecta Stripe y el portal gestiona pagos, suscripciones y facturación. Kong y AWS API Gateway no incluyen monetización directa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Manejador de servidor MCP para agentes de IA
&lt;/h3&gt;

&lt;p&gt;El nuevo manejador MCP permite exponer operaciones de tu OpenAPI para ser invocadas por Claude, Codex, Cursor y clientes MCP. Aplica las mismas políticas de autenticación y rate limiting. Consulta el &lt;a href="https://zuplo.com/docs/mcp-server/introduction" rel="noopener noreferrer"&gt;tutorial MCP&lt;/a&gt; para detalles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Despliegue en la periferia (edge): latencia &amp;lt;50ms
&lt;/h3&gt;

&lt;p&gt;Por defecto, cada gateway se despliega en más de 300 ubicaciones edge de Cloudflare. Esto significa baja latencia global sin configuración adicional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funciona Zuplo por dentro
&lt;/h2&gt;

&lt;p&gt;El flujo de una solicitud típica:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Coincidencia de ruta:&lt;/strong&gt; URL y método se emparejan con tu &lt;code&gt;routes.oas.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Políticas de entrada:&lt;/strong&gt; Se ejecuta autenticación, validación, rate limiting, etc. Si alguna falla, se detiene el flujo y responde al cliente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manejador:&lt;/strong&gt; Proxy al origen, respuesta estática, TypeScript personalizado o MCP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Políticas de salida:&lt;/strong&gt; Transformaciones de respuesta, eliminación de cabeceras, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respuesta:&lt;/strong&gt; Se envía la respuesta y se registran métricas/logs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Todo corre en un Cloudflare Worker, lo que permite latencia baja y no pagar por capacidad inactiva.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando tu primer gateway Zuplo
&lt;/h2&gt;

&lt;p&gt;Puedes tener un gateway funcional en media hora. Pasos prácticos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Regístrate en &lt;a href="https://zuplo.com" rel="noopener noreferrer"&gt;zuplo.com&lt;/a&gt;&lt;/strong&gt; y crea un proyecto nuevo. Usa integración con GitHub para sincronización automática.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Importa tu especificación OpenAPI.&lt;/strong&gt; Si tienes una, impórtala y Zuplo la convierte en rutas. Si no, puedes crear rutas en la UI y exportar la spec después.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agrega autenticación por clave API:&lt;/strong&gt; Añade la política &lt;code&gt;api-key-inbound&lt;/code&gt; en el editor de rutas. Zuplo maneja la base de consumidores y emisión de claves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agrega limitación de tasas:&lt;/strong&gt; Incluye la política &lt;code&gt;rate-limit-inbound&lt;/code&gt; con tu configuración (ej: 100 req/min por API key) como bloque JSON en la ruta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Despliega:&lt;/strong&gt; Haz push a tu rama; Zuplo construye un entorno de vista previa. Promociona a producción haciendo merge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prueba de extremo a extremo:&lt;/strong&gt; Usa &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para enviar solicitudes a la URL del gateway con claves válidas/erróneas, cargas inválidas, etc., y verifica visualmente el orden de ejecución de políticas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El proceso es rápido; lo más laborioso es decidir la estructura de rutas y la lógica personalizada, igual que en cualquier plataforma.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escribiendo políticas personalizadas en TypeScript
&lt;/h2&gt;

&lt;p&gt;Si necesitas lógica específica, escribe tu propia política. Ejemplo para enriquecer una solicitud con datos internos antes de llegar al backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@zuplo/runtime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;UserContext&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;free&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pro&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;enterprise&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ZuploRequest&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Unauthorized&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;401&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lookupUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://internal.example.com/users/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lookupUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;INTERNAL_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;userResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User lookup failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;502&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;userResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;UserContext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-user-id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-user-plan&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Es una función async estándar, fácil de testear con unit tests.&lt;/li&gt;
&lt;li&gt;Variables de entorno via &lt;code&gt;context.environment&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Devolver un &lt;code&gt;Response&lt;/code&gt; interrumpe la pipeline (útil para errores o autenticación).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Precios de Zuplo en 2026
&lt;/h2&gt;

&lt;p&gt;Tres planes claros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gratuito ($0/mes):&lt;/strong&gt; 100K solicitudes/mes, entornos, claves y portales ilimitados, 1GB salida, edge global, 2 desarrolladores. Tráfico de producción real.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builder ($25/mes):&lt;/strong&gt; 1M solicitudes/mes, 2 dominios personalizados, 1GB por cada 100K solicitudes, $100 por 100K adicionales, soporte comunitario.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise (desde $1,000/mes anual):&lt;/strong&gt; Solicitudes y dominios ilimitados, SLA 99.5%-99.999%, integración con GitHub Enterprise/GitLab/Azure DevOps, SSO, RBAC, soporte 24/7 opcional.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI Gateway y Developer Portal tienen planes separados (portal open source autoalojado gratis). Ve los detalles actualizados en la &lt;a href="https://zuplo.com/pricing" rel="noopener noreferrer"&gt;página de precios&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Comparativa: AWS API Gateway cobra $3.50/millón de solicitudes REST + transferencia + Lambda; Kong Enterprise suele superar los $1,000/mes. El plan gratuito de Zuplo es difícil de superar para proyectos iniciales.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuándo Zuplo es la opción correcta (y cuándo no)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Usa Zuplo si:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quieres un gateway gestionado sin operar Kong en Kubernetes.&lt;/li&gt;
&lt;li&gt;Tu equipo domina TypeScript/JavaScript.&lt;/li&gt;
&lt;li&gt;Necesitas portal para desarrolladores sin sistemas extra.&lt;/li&gt;
&lt;li&gt;Vas a monetizar la API y quieres Stripe integrado.&lt;/li&gt;
&lt;li&gt;Expondrás tu API a agentes IA y buscas soporte MCP rápido.&lt;/li&gt;
&lt;li&gt;El tráfico es global y la latencia edge importa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;No uses Zuplo si:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Necesitas control open source total (Kong es mejor).&lt;/li&gt;
&lt;li&gt;Usas solo infraestructura on-premise sin salida a internet.&lt;/li&gt;
&lt;li&gt;Requieres extensiones profundas sobre NGINX.&lt;/li&gt;
&lt;li&gt;Estás totalmente invertido en Apigee/MuleSoft y migrar no compensa.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Probando tu gateway Zuplo con Apidog
&lt;/h2&gt;

&lt;p&gt;Tras desplegar tu gateway, es fundamental testear cada ruta y política antes de pasar a producción. Un cliente API dedicado facilita este proceso.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; importa tu OpenAPI, la misma que usa Zuplo, y te permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Llamar a cada ruta con claves válidas/erróneas para validar autenticación.&lt;/li&gt;
&lt;li&gt;Enviar payloads incorrectos para probar validación de esquema.&lt;/li&gt;
&lt;li&gt;Bombardear endpoints para comprobar que rate limiting actúa en el umbral correcto.&lt;/li&gt;
&lt;li&gt;Guardar variables de entorno (preview/prod URL, claves API) para alternar entornos con un clic.&lt;/li&gt;
&lt;li&gt;Generar ejemplos de código en cURL, JS, Python, Go para tu documentación.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Puedes automatizar tests con los escenarios de Apidog, más rápido que scripts manuales. Si nunca lo usaste, la &lt;a href="http://apidog.com/blog/how-to-use-apidog-inside-vscode?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;extensión de Apidog para VS Code&lt;/a&gt; y la &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de pruebas API sin Postman&lt;/a&gt; te ayudarán a empezar. &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descarga Apidog&lt;/a&gt; y comienza a probar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes sobre el gateway API de Zuplo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Es Zuplo de código abierto?
&lt;/h3&gt;

&lt;p&gt;El runtime es cerrado, pero el portal y varias libs están en GitHub. Si necesitas autoalojado, puedes combinar el portal open source y despliegue Kubernetes propio.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puede Zuplo ejecutarse en mi infraestructura?
&lt;/h3&gt;

&lt;p&gt;Sí, el plan Enterprise ofrece despliegue autoalojado en Kubernetes (sin edge global ni operación gestionada). Es útil para requisitos estrictos de residencia de datos.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo se compara Zuplo con Cloudflare API Shield?
&lt;/h3&gt;

&lt;p&gt;API Shield es solo seguridad (validación, detección de abuso, mTLS). Zuplo es gestión completa: enrutamiento, políticas, portal, monetización, MCP. Pueden coexistir.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Funciona Zuplo con mi OpenAPI existente?
&lt;/h3&gt;

&lt;p&gt;Sí, OpenAPI es la fuente de verdad. Importa tu spec, las rutas y el portal se generan automáticamente; políticas de validación usan los mismos esquemas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo exponer Zuplo a agentes IA como Claude o Codex?
&lt;/h3&gt;

&lt;p&gt;Sí, vía el manejador MCP. Apunta a tu OpenAPI, elige operaciones y tu gateway queda listo para clientes MCP; se aplican las mismas políticas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuánto tarda un despliegue de Zuplo?
&lt;/h3&gt;

&lt;p&gt;Menos de 60 segundos para entornos de vista previa. Promociones a producción son aún más rápidas (artefacto ya construido). No hay ventanas de mantenimiento; despliegues atómicos.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué sucede si Cloudflare se cae?
&lt;/h3&gt;

&lt;p&gt;Zuplo depende de la red Cloudflare, así que caídas regionales pueden afectar esas zonas. El plan Enterprise ofrece failover multi-nube para 99.999% de disponibilidad.&lt;/p&gt;

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

&lt;p&gt;Zuplo es el gateway API para equipos que buscan características empresariales sin la carga operativa. Políticas en TypeScript, despliegues GitOps, portal autogenerado, monetización integrada y soporte MCP lo convierten en una plataforma completa. El plan gratuito cubre tráfico real; el plan Enterprise escala según tus necesidades.&lt;/p&gt;

&lt;p&gt;Evalúa Zuplo con una de tus APIs reales, pruébalo con &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para validar cada política y decide basado en evidencia, no en marketing. La combinación de gateway edge gestionado y cliente de pruebas potente es el camino rápido de "tenemos una API" a "tenemos un producto". &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descarga Apidog&lt;/a&gt; y comienza a probar.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo Usar DeepSeek V4 Gratis</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:38:11 +0000</pubDate>
      <link>https://vibe.forem.com/roobia/como-usar-deepseek-v4-gratis-22h2</link>
      <guid>https://vibe.forem.com/roobia/como-usar-deepseek-v4-gratis-22h2</guid>
      <description>&lt;p&gt;DeepSeek V4 se lanzó el 23 de abril de 2026 y, a diferencia de la mayoría de los modelos de vanguardia, las rutas gratuitas están disponibles desde el primer día. El chat web oficial ejecuta V4-Pro sin necesidad de tarjeta de crédito. Los pesos tienen licencia MIT y puedes descargarlos hoy mismo. Agregadores como OpenRouter y Chutes suelen ofrecer niveles gratuitos a los pocos días de cada lanzamiento de DeepSeek. En conjunto, puedes ejecutar cargas de trabajo serias en V4 sin costo antes de decidir si recargar una cuenta.&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;Esta guía detalla cada ruta sin costo verificada, cómo elegir la adecuada para tu caso de uso y cómo configurar una colección lista para producción en &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para que la transición al pago sea fluida cuando escales.&lt;/p&gt;

&lt;p&gt;Para una descripción general a nivel de producto, revisa &lt;a href="http://apidog.com/blog/what-is-deepseek-v4" rel="noopener noreferrer"&gt;qué es DeepSeek V4&lt;/a&gt;. Para un recorrido completo por la API, consulta &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api" rel="noopener noreferrer"&gt;cómo usar la API de DeepSeek V4&lt;/a&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt;&lt;/strong&gt; — chat web gratuito en V4-Pro con modos Think High y Think Max. Sin tarjeta. Funciona hoy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pesos de Hugging Face + tu propia GPU&lt;/strong&gt; — licencia MIT, V4-Flash funciona en 2 a 4 H100, V4-Pro necesita un clúster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Niveles gratuitos de OpenRouter y Chutes&lt;/strong&gt; — pasarelas de terceros que suelen abrir cuotas gratuitas en modelos DeepSeek dentro de una semana de su lanzamiento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proveedores de inferencia de Hugging Face&lt;/strong&gt; — endpoint compartido y con límite de tasa para experimentación temprana con V4.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Créditos de prueba de Kaggle, Colab y RunPod&lt;/strong&gt; — cómputo gratuito para pruebas puntuales si quieres experimentar con autoalojamiento.&lt;/li&gt;
&lt;li&gt;Todas las rutas gratuitas limitan el uso. Para producción, pasa a la facturación de pago antes de alcanzar los topes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1pwj8dblm7dbxk7xooey.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1pwj8dblm7dbxk7xooey.png" alt="Tabla comparativa de DeepSeek V4 con costos." width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ruta 1: chat.deepseek.com (la ruta gratuita predeterminada)
&lt;/h2&gt;

&lt;p&gt;La forma más rápida y estable de probar DeepSeek V4 es el chat web oficial. V4-Pro es el modelo principal; puedes alternar entre los modos Sin Pensar, Pensar Alto y Pensar Máximo desde el cuadro de redacció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%2Fod1zc2ye1qsto7o0xxbc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fod1zc2ye1qsto7o0xxbc.png" alt="Interfaz de chat de DeepSeek V4, mostrando la alternancia entre los modos de razonamiento Think High y Think Max." width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Abre &lt;a href="https://chat.deepseek.com/" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Inicia sesión con correo electrónico, Google o WeChat.&lt;/li&gt;
&lt;li&gt;Verifica que el modelo activo sea V4-Pro.&lt;/li&gt;
&lt;li&gt;Empieza a escribir y prueba prompts.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Lo que obtienes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Contexto completo de 1M de tokens.&lt;/li&gt;
&lt;li&gt;Carga de archivos: PDF, imágenes y paquetes de código.&lt;/li&gt;
&lt;li&gt;Búsqueda web bajo demanda.&lt;/li&gt;
&lt;li&gt;Tres modos de razonamiento, incluido Think Max.&lt;/li&gt;
&lt;li&gt;Historial de conversaciones y carpetas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Límites
&lt;/h3&gt;

&lt;p&gt;DeepSeek no publica un límite estricto por día; el nivel gratuito tiene un límite suave bajo carga. Un uso intensivo puede ralentizar respuestas o poner solicitudes en cola, pero rara vez bloquea el acceso. Si ves límites de tasa persistentes, reduce el ritmo o considera la API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Casos adecuados:&lt;/strong&gt; comparar prompts difíciles, revisión arquitectónica de repositorios, uso de Think Max para analizar contratos complejos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No adecuado para:&lt;/strong&gt; automatización o flujos reproducibles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ruta 2: Autoalojar V4-Flash en tu propia GPU
&lt;/h2&gt;

&lt;p&gt;V4-Flash es la variante con licencia MIT para autoalojamiento realista. Con 284B y 13B activos, una máquina multi-H100 lo ejecuta en FP8 con buen rendimiento; en INT4 cabe en una sola tarjeta de 80GB.&lt;/p&gt;

&lt;p&gt;El costo es solo el hardware. Si ya tienes GPUs, es la ruta gratuita más duradera y no está sujeta a límites de tasa ni retiros.&lt;/p&gt;

&lt;h3&gt;
  
  
  Descargar los pesos
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-U&lt;/span&gt; &lt;span class="s2"&gt;"huggingface_hub[cli]"&lt;/span&gt;
huggingface-cli login
huggingface-cli download deepseek-ai/DeepSeek-V4-Flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--local-dir&lt;/span&gt; ./models/deepseek-v4-flash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aproximadamente 500GB en FP8. Asegúrate de tener espacio.&lt;/p&gt;

&lt;h3&gt;
  
  
  Servir con vLLM
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"vllm&amp;gt;=0.9.0"&lt;/span&gt;

vllm serve deepseek-ai/DeepSeek-V4-Flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tensor-parallel-size&lt;/span&gt; 4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-model-len&lt;/span&gt; 1048576 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dtype&lt;/span&gt; auto &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cuando esté listo, apunta cualquier cliente OpenAI a &lt;code&gt;http://localhost:8000/v1&lt;/code&gt;. El endpoint acepta el mismo formato de solicitud que la API de DeepSeek; &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; lo detecta como otra base URL y tus colecciones funcionan igual.&lt;/p&gt;

&lt;h3&gt;
  
  
  Requisitos de hardware
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variante&lt;/th&gt;
&lt;th&gt;Tarjetas mínimas (FP8)&lt;/th&gt;
&lt;th&gt;Tarjetas mínimas (INT4)&lt;/th&gt;
&lt;th&gt;Rendimiento realista&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V4-Flash&lt;/td&gt;
&lt;td&gt;2 × H100 80GB&lt;/td&gt;
&lt;td&gt;1 × H100 80GB&lt;/td&gt;
&lt;td&gt;50 a 150 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4-Pro&lt;/td&gt;
&lt;td&gt;16 × H100 80GB&lt;/td&gt;
&lt;td&gt;8 × H100 80GB&lt;/td&gt;
&lt;td&gt;dependiente del clúster&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Si no tienes GPUs disponibles, suele ser más barato la API que alquilar hardware. Esta ruta es ideal para equipos con GPUs o necesidades de cumplimiento.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ruta 3: Nivel gratuito de OpenRouter
&lt;/h2&gt;

&lt;p&gt;OpenRouter agrega modelos de pesos abiertos y privados a través de una única API. Ofrece niveles gratuitos en nuevos lanzamientos de DeepSeek, patrón visto en V3, V3.1 y V3.2.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbir19t7193o5qk1c978b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbir19t7193o5qk1c978b.png" alt="Captura de pantalla de la interfaz de OpenRouter mostrando modelos DeepSeek" width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Regístrate en &lt;a href="https://openrouter.ai/" rel="noopener noreferrer"&gt;openrouter.ai&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Crea una clave API.&lt;/li&gt;
&lt;li&gt;Busca en el catálogo &lt;code&gt;deepseek/deepseek-v4-pro&lt;/code&gt; o &lt;code&gt;deepseek/deepseek-v4-flash&lt;/code&gt;. Las variantes gratuitas suelen tener el sufijo &lt;code&gt;:free&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Llama con el SDK OpenAI compatible.
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OPENROUTER_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://openrouter.ai/api/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek/deepseek-v4-flash:free&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a Python CLI for semver bumping.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Límites
&lt;/h3&gt;

&lt;p&gt;Niveles gratuitos limitados a cientos de solicitudes diarias por clave y menor prioridad bajo carga. Perfecto para prototipos, no fiable para producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ruta 4: Proveedores de inferencia de Hugging Face
&lt;/h2&gt;

&lt;p&gt;Hugging Face ofrece inferencia alojada con puntos de control V4 poco después del lanzamiento. Límites de tasa estrictos y latencia variable, pero gratuito.&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;InferenceClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-ai/DeepSeek-V4-Flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat_completion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize the V4 technical report in 5 bullets.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;El token de HF es gratuito. Para uso intensivo, actualiza a cuenta Pro para mejores límites; aún así, el costo es mucho menor que la API oficial en cargas equivalentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ruta 5: Créditos de prueba en Colab, Kaggle, RunPod y Lambda
&lt;/h2&gt;

&lt;p&gt;Los principales proveedores de GPUs ofrecen créditos de prueba. Bien gestionados, permiten experimentar con V4-Flash sin costo real.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Colab:&lt;/strong&gt; El nivel gratuito T4 no sirve para V4, pero Colab Pro+ ofrece 500 unidades/mes, suficiente para algunos experimentos en A100.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kaggle:&lt;/strong&gt; Horas de GPU semanales gratis en T4/P100. Limitado para V4-Pro, suficiente para V4-Flash cuantificado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RunPod:&lt;/strong&gt; $10 de crédito de prueba cubren horas en H100. Ideal para pruebas rápidas con vLLM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lambda:&lt;/strong&gt; Promociones ocasionales de horas gratuitas en H100 y H200; revisa su página de registro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No son rutas gratuitas a largo plazo, solo útiles para pruebas puntuales.&lt;/p&gt;

&lt;h2&gt;
  
  
  Construye una colección Apidog agnóstica al proveedor
&lt;/h2&gt;

&lt;p&gt;El beneficio de tantas rutas gratuitas es poder probar el mismo prompt en todas sin duplicar trabajo. Flujo recomendado:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Descarga Apidog.&lt;/li&gt;
&lt;li&gt;Crea una colección con cuatro entornos: &lt;code&gt;chat&lt;/code&gt; (placeholder), &lt;code&gt;deepseek&lt;/code&gt; (&lt;code&gt;https://api.deepseek.com/v1&lt;/code&gt;), &lt;code&gt;openrouter&lt;/code&gt; (&lt;code&gt;https://openrouter.ai/api/v1&lt;/code&gt;), &lt;code&gt;self-hosted&lt;/code&gt; (&lt;code&gt;http://localhost:8000/v1&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Guarda una única solicitud POST en &lt;code&gt;{{BASE_URL}}/chat/completions&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Almacena la clave de cada proveedor como variable secreta para que el cuerpo de la solicitud sea idéntico en todos los entornos.&lt;/li&gt;
&lt;li&gt;Cambia de entorno para pruebas A/B en cada backend.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este es el mismo patrón que la &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api-for-free" rel="noopener noreferrer"&gt;colección del nivel gratuito de GPT-5.5&lt;/a&gt;: una herramienta, todos los proveedores, sin duplicar trabajo.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué ruta gratuita deberías elegir?
&lt;/h2&gt;

&lt;p&gt;Cuatro heurísticas para decidir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quiero probar rápido:&lt;/strong&gt; Usa &lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quiero prototipar un producto:&lt;/strong&gt; Usa el nivel gratuito de OpenRouter y luego recarga en DeepSeek si es necesario.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tengo GPUs y necesito cumplimiento:&lt;/strong&gt; Autoalojar V4-Flash con vLLM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Busco uso gratuito a largo plazo:&lt;/strong&gt; No existe. Todos los niveles gratuitos tienen límites. Combina &lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt; para trabajo interactivo y recarga de pago para automatización.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cuándo dejar el uso gratuito
&lt;/h2&gt;

&lt;p&gt;Tres señales claras:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Te aplican límites de tasa más de una vez al día.&lt;/strong&gt; Es momento de presupuestar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Necesitas SLAs.&lt;/strong&gt; Solo la API oficial los ofrece.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Necesitas logs, auditoría o cumplimiento.&lt;/strong&gt; La API de pago entrega registros claros, los niveles gratuitos no.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cuando ocurra cualquiera de estos casos, pasa a la &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api" rel="noopener noreferrer"&gt;API oficial&lt;/a&gt;. La recarga mínima es de $2 y el precio por token es el menor en el segmento.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;¿Es &lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt; realmente gratuito?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí. Sin tarjeta, sin límite de tiempo. Límite suave bajo carga, pero no hay muro de pago.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Necesito cuenta de Hugging Face para descargar los pesos?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Técnicamente no; el repo es público. Prácticamente sí: una cuenta inicia mejores límites de tasa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué ruta gratuita ejecuta el verdadero V4-Pro?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt; usa V4-Pro. Los niveles gratuitos de OpenRouter suelen ser V4-Flash. Si quieres V4-Pro sin pagar, el chat web es la opción.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo usar un nivel gratuito para un producto?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No de manera responsable. Los gratuitos tienen límites de tasa, cambian términos y pueden desaparecer. Para productos, usa la API o autoalójalo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿El autoalojamiento es realmente gratuito?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
La licencia sí. El hardware no. Si tienes GPUs, el costo es electricidad. Si alquilas, suele ser más caro que la API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Habrá un nivel gratuito de Apidog para probar?&lt;/strong&gt;&lt;br&gt;&lt;br&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 gratuito para diseño y pruebas de API; solo cobra créditos al usar APIs de pago. Puedes combinar un workspace gratuito de Apidog con &lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt; u OpenRouter para un flujo 100% gratuito.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo Ejecutar DeepSeek V4 Localmente</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:35:02 +0000</pubDate>
      <link>https://vibe.forem.com/roobia/como-ejecutar-deepseek-v4-localmente-21mc</link>
      <guid>https://vibe.forem.com/roobia/como-ejecutar-deepseek-v4-localmente-21mc</guid>
      <description>&lt;p&gt;DeepSeek V4 se lanzó el 23 de abril de 2026 con pesos bajo licencia MIT en Hugging Face. Esa única elección de licencia cambia las reglas del juego para cualquier equipo que desee IA de vanguardia en su propio hardware. V4-Flash (284B total, 13B activo) cabe en un par de H100 a FP8. V4-Pro (1.6T total, 49B activo) necesita un clúster pero funciona competitivamente con GPT-5.5 y Claude Opus 4.6 en código y razonamiento.&lt;/p&gt;

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

&lt;p&gt;Esta guía es un tutorial de implementación local. Cubre los requisitos de hardware, las opciones de cuantificación, las configuraciones de vLLM y SGLang, la configuración de uso de herramientas y un flujo de trabajo de prueba en Apidog que valida el servidor local antes de dirigir el tráfico de producción hacia él.&lt;/p&gt;

&lt;p&gt;Para una descripción general del producto, consulte &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;qué es DeepSeek V4&lt;/a&gt;. Para la ruta de la API alojada, consulte &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo usar la API de DeepSeek V4&lt;/a&gt;. Para la comparación de costos, consulte &lt;a href="http://apidog.com/blog/deepseek-v4-api-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;precios de la API de DeepSeek V4&lt;/a&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;V4-Flash&lt;/strong&gt; se ejecuta en 2 × H100 de 80GB a FP8, o 1 × H100 a INT4. Los pesos son de ~500GB a FP8.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V4-Pro&lt;/strong&gt; necesita más de 16 H100 a FP8 para el rendimiento de producción; no es un modelo para portátiles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;vLLM&lt;/strong&gt; es el camino más rápido a un servidor compatible con OpenAI. &lt;code&gt;vllm&amp;gt;=0.9.0&lt;/code&gt; añade soporte para V4.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SGLang&lt;/strong&gt; es la alternativa para equipos que desean mejores características de uso de herramientas y salida estructurada.&lt;/li&gt;
&lt;li&gt;La cuantificación a &lt;strong&gt;AWQ INT4&lt;/strong&gt; o &lt;strong&gt;GPTQ INT4&lt;/strong&gt; permite que V4-Flash quepa en una única tarjeta de 80GB con una pérdida de calidad de ~5%.&lt;/li&gt;
&lt;li&gt;Use &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para apuntar a &lt;code&gt;http://localhost:8000/v1&lt;/code&gt; y reutilizar la colección exacta que usa con la API alojada.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quién debería autoalojarse
&lt;/h2&gt;

&lt;p&gt;El autoalojamiento de V4 es la decisión correcta para tres tipos de equipos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Con requisitos de cumplimiento.&lt;/strong&gt; Sectores como salud, finanzas, legal o defensa donde los datos no pueden salir de la red. La licencia MIT de pesos abiertos elimina acuerdos de uso y flujos de datos transfronterizos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cargas de trabajo grandes y estables.&lt;/strong&gt; A tasas de caché fallida, la API V4-Pro cuesta $1.74/M de entrada y $3.48/M de salida. Para cargas de trabajo de más de 200 mil millones de tokens/mes, el hardware dedicado comienza a ser más rentable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ajuste fino e investigación.&lt;/strong&gt; Los checkpoints Base existen para preentrenamiento continuo y adaptación de dominio. La licencia MIT permite redistribución comercial del modelo resultante.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Quién NO debería autoalojarse: prototipadores, equipos sin experiencia en operaciones de GPU y quienes consumen menos de $200/mes en la API alojada. Los gastos operativos superan el ahorro a pequeña escala.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requisitos de hardware
&lt;/h2&gt;

&lt;p&gt;DeepSeek V4 usa precisión mixta FP4 + FP8 de forma nativa, lo que mejora el uso de memoria respecto al conteo de parámetros.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variante&lt;/th&gt;
&lt;th&gt;Parámetros totales&lt;/th&gt;
&lt;th&gt;Parámetros activos&lt;/th&gt;
&lt;th&gt;VRAM FP8&lt;/th&gt;
&lt;th&gt;VRAM INT4&lt;/th&gt;
&lt;th&gt;Tarjetas mínimas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V4-Flash&lt;/td&gt;
&lt;td&gt;284B&lt;/td&gt;
&lt;td&gt;13B&lt;/td&gt;
&lt;td&gt;~500GB&lt;/td&gt;
&lt;td&gt;~140GB&lt;/td&gt;
&lt;td&gt;2 × H100 80GB (FP8) o 1 × H100 (INT4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4-Pro&lt;/td&gt;
&lt;td&gt;1.6T&lt;/td&gt;
&lt;td&gt;49B&lt;/td&gt;
&lt;td&gt;~2.4TB&lt;/td&gt;
&lt;td&gt;~700GB&lt;/td&gt;
&lt;td&gt;16 × H100 80GB (FP8) o 8 × H100 (INT4)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;La memoria de MoE es total, no activa.&lt;/strong&gt; Necesita suficiente VRAM para todos los expertos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;H200 y MI300X son alternativas válidas.&lt;/strong&gt; 141GB o 192GB por tarjeta permiten menos GPUs para el mismo modelo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU de consumo no sirven.&lt;/strong&gt; Ni V4-Flash en INT4 corre en una RTX 5090 de 24GB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple Silicon:&lt;/strong&gt; M3/M4 Max con 128GB pueden ejecutar V4-Flash (cuantificado, lento). Solo como entorno de desarrollo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Paso 1: Descargar los pesos
&lt;/h2&gt;

&lt;p&gt;Repositorios oficiales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash" rel="noopener noreferrer"&gt;deepseek-ai/DeepSeek-V4-Flash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Pro" rel="noopener noreferrer"&gt;deepseek-ai/DeepSeek-V4-Pro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;deepseek-ai/DeepSeek-V4-Flash-Base&lt;/code&gt; y &lt;code&gt;DeepSeek-V4-Pro-Base&lt;/code&gt; para ajuste fino.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Descargue usando la CLI de Hugging Face:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-U&lt;/span&gt; &lt;span class="s2"&gt;"huggingface_hub[cli]"&lt;/span&gt;
huggingface-cli login

huggingface-cli download deepseek-ai/DeepSeek-V4-Flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--local-dir&lt;/span&gt; ./models/deepseek-v4-flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--local-dir-use-symlinks&lt;/span&gt; False
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reserve ~500GB de disco para V4-Flash y varios TB para V4-Pro. &lt;a href="https://modelscope.cn/models/deepseek-ai/DeepSeek-V4-Flash" rel="noopener noreferrer"&gt;ModelScope&lt;/a&gt; es más rápido para usuarios en China.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 2: Elegir un motor de servicio
&lt;/h2&gt;

&lt;p&gt;Opciones principales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;vLLM:&lt;/strong&gt; Mejor rendimiento, interfaz OpenAI limpia, comunidad grande. Opción por defecto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SGLang:&lt;/strong&gt; Mejor uso de herramientas, salida estructurada, mejoras en contexto largo. Útil si depende de llamada a funciones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ambos soportan V4 desde versiones recientes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 3: Servir V4-Flash con vLLM
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"vllm&amp;gt;=0.9.0"&lt;/span&gt;

vllm serve deepseek-ai/DeepSeek-V4-Flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tensor-parallel-size&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-model-len&lt;/span&gt; 1048576 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dtype&lt;/span&gt; auto &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enable-prefix-caching&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parámetros clave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--tensor-parallel-size 2&lt;/code&gt;: Divide entre 2 H100. Aumente según tarjetas disponibles.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--max-model-len 1048576&lt;/code&gt;: Ventana de contexto completa (1M tokens). Reduzca para liberar VRAM.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--enable-prefix-caching&lt;/code&gt;: Acelera prompts repetidos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--dtype auto&lt;/code&gt;: Usa precisión mixta FP8 de V4.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con el servidor funcionando, cualquier cliente OpenAI apunta a &lt;code&gt;http://localhost:8000/v1&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 4: Servir V4-Pro con vLLM
&lt;/h2&gt;

&lt;p&gt;V4-Pro requiere clúster. Solo cambia el paralelismo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vllm serve deepseek-ai/DeepSeek-V4-Pro &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tensor-parallel-size&lt;/span&gt; 8 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--pipeline-parallel-size&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-model-len&lt;/span&gt; 524288 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enable-prefix-caching&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contexto de 512K para ajustarse a 16 H100; aumente si tiene más VRAM. Combine pipeline y tensor parallel para multinodo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 5: Servir con SGLang (alternativa para uso de herramientas)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"sglang[all]&amp;gt;=0.4.0"&lt;/span&gt;

python &lt;span class="nt"&gt;-m&lt;/span&gt; sglang.launch_server &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--model-path&lt;/span&gt; deepseek-ai/DeepSeek-V4-Flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tp&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--context-length&lt;/span&gt; 1048576 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 30000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SGLang expone la API OpenAI en &lt;code&gt;http://localhost:30000/v1&lt;/code&gt;. Su DSL &lt;code&gt;lang&lt;/code&gt; facilita la llamada a funciones y salida JSON.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 6: Cuantificar para una sola GPU
&lt;/h2&gt;

&lt;p&gt;Cuantificación INT4 permite correr V4-Flash en una sola H100 de 80GB con pérdida de calidad mínima.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWQ (recomendado)
&lt;/h3&gt;



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

python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer

model_path = './models/deepseek-v4-flash'
out_path = './models/deepseek-v4-flash-awq'
model = AutoAWQForCausalLM.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)
model.quantize(tokenizer, quant_config={'w_bit': 4, 'q_group_size': 128})
model.save_quantized(out_path)
tokenizer.save_pretrained(out_path)
"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  GPTQ
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;auto-gptq
&lt;span class="c"&gt;# Siga la receta de cuantificación GPTQ; similar a AWQ.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para servir, pase &lt;code&gt;--quantization awq&lt;/code&gt; o &lt;code&gt;--quantization gptq&lt;/code&gt; a vLLM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 7: Probar con Apidog
&lt;/h2&gt;

&lt;p&gt;No envíe tráfico de producción sin validar el servidor local.&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%2Fyhlube65mg8kn9sbhwv0.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%2Fyhlube65mg8kn9sbhwv0.png" alt="Una captura de pantalla de la interfaz de Apidog mostrando una solicitud a un servidor local de DeepSeek V4." width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Descargue Apidog.&lt;/li&gt;
&lt;li&gt;Cree una colección apuntando a &lt;code&gt;http://localhost:8000/v1/chat/completions&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Pegue el mismo prompt de prueba que usa en la API alojada. Compare respuestas.&lt;/li&gt;
&lt;li&gt;Pruebe con un contexto de 500K tokens para validar la caché KV.&lt;/li&gt;
&lt;li&gt;Ejecute un flujo de llamada a herramientas de extremo a extremo antes de conectar un agente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La colección de la &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API alojada de DeepSeek V4&lt;/a&gt; funciona igual con servidor local cambiando solo la base URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observabilidad y monitorización
&lt;/h2&gt;

&lt;p&gt;Cuatro métricas críticas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tokens por segundo:&lt;/strong&gt; Prompt y generación. vLLM expone &lt;code&gt;/metrics&lt;/code&gt; (Prometheus).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Utilización de GPU:&lt;/strong&gt; &lt;code&gt;nvidia-smi&lt;/code&gt; o DCGM. Uso &amp;lt;70% suele indicar batch size incorrecto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tasa de acierto de caché KV:&lt;/strong&gt; vLLM informa con &lt;code&gt;--enable-prefix-caching&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latencia de solicitud p50/p95/p99:&lt;/strong&gt; Use tracing estándar; p99 alto con p50 estable implica bloqueo en la cola.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Envíe todo a Grafana o su stack de observabilidad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ajuste fino de los puntos de control Base de V4
&lt;/h2&gt;

&lt;p&gt;Los checkpoints Base sirven para preentrenamiento continuo y SFT.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"torch&amp;gt;=2.6"&lt;/span&gt; transformers accelerate peft trl

&lt;span class="c"&gt;# SFT estándar con LoRA en V4-Flash-Base&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; trl sft &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--model_name_or_path&lt;/span&gt; deepseek-ai/DeepSeek-V4-Flash-Base &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dataset_name&lt;/span&gt; your-org/your-sft-set &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output_dir&lt;/span&gt; ./models/v4-flash-custom &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--per_device_train_batch_size&lt;/span&gt; 1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--gradient_accumulation_steps&lt;/span&gt; 16 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--learning_rate&lt;/span&gt; 2e-5 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bf16&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--use_peft&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--lora_r&lt;/span&gt; 64 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--lora_alpha&lt;/span&gt; 128
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ajuste fino completo en V4-Pro es un reto de investigación. Para la mayoría, LoRA sobre V4-Flash-Base ofrece gran mejora con bajo coste computacional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Errores comunes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;OOM al iniciar:&lt;/strong&gt; &lt;code&gt;--max-model-len&lt;/code&gt; demasiado alto o &lt;code&gt;--tensor-parallel-size&lt;/code&gt; bajo. Reduzca contexto o aumente paralelismo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Primera solicitud lenta:&lt;/strong&gt; vLLM compila kernels de forma perezosa. Haga un warmup con una solicitud dummy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Errores de análisis en uso de herramientas:&lt;/strong&gt; El esquema de DeepSeek difiere de OpenAI. Use SDKs compatibles con V4.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Errores FP8 en tarjetas antiguas:&lt;/strong&gt; A100 no soporta FP8. Use BF16 y espere el doble de VRAM.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Cuándo vale la pena el autoalojamiento
&lt;/h2&gt;

&lt;p&gt;Cálculo de punto de equilibrio (basado en &lt;a href="http://apidog.com/blog/deepseek-v4-api-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;precios de la API alojada&lt;/a&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;V4-Flash con 200B tokens de entrada/mes + 20B salida:&lt;/strong&gt; ~$33.6K en API alojada vs ~$20K/mes alquilando 8 × H100. Autoalojamiento ahorra ~40%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V4-Pro con 500B entrada + 50B salida/mes:&lt;/strong&gt; ~$1.04M en API alojada vs ~$35K/mes en 16 × H100. Autoalojamiento ahorra más del 95%.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El punto de equilibrio de V4-Flash es ~100B tokens/mes. Por debajo, la API alojada es más barata.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;¿Puedo ejecutar V4-Flash en una sola A100?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Con cuantificación fuerte y contexto más corto, sí, pero lento. INT4 en A100 80GB: 5–15 tok/s. H100 es la arquitectura ideal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;¿Soporta V4 el ajuste fino con LoRA?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí. Use los checkpoints Base y pipelines estándar de TRL o Axolotl. MoE no modifica la matemática de LoRA.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;¿El servidor local es compatible con OpenAI?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí. vLLM y SGLang exponen &lt;code&gt;/v1/chat/completions&lt;/code&gt; y &lt;code&gt;/v1/completions&lt;/code&gt; con formato OpenAI. La &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de la API alojada&lt;/a&gt; funciona sin cambios en localhost.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;¿Cómo habilito el modo de pensamiento localmente?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Pase &lt;code&gt;thinking_mode: "thinking"&lt;/code&gt; o &lt;code&gt;"thinking_max"&lt;/code&gt; en la solicitud. vLLM y SGLang reenvían el flag.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;¿Puedo hacer streaming desde un servidor V4 local?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí. Configure &lt;code&gt;stream: true&lt;/code&gt; igual que en OpenAI o la API alojada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;¿Forma más barata de experimentar antes de comprar hardware?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Alquile una H100 en RunPod o Lambda, ejecute V4-Flash a INT4 y mida el rendimiento real. Una prueba de $10–$30 responde más rápido que una semana de planeación.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Cómo Usar la API de DeepSeek V4 Gratis</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:23:07 +0000</pubDate>
      <link>https://vibe.forem.com/roobia/como-usar-la-api-de-deepseek-v4-gratis-30ff</link>
      <guid>https://vibe.forem.com/roobia/como-usar-la-api-de-deepseek-v4-gratis-30ff</guid>
      <description>&lt;p&gt;DeepSeek V4 se lanzó el 23 de abril de 2026 con una API de bajo costo, pero existen rutas realmente gratuitas para desarrolladores que desean automatizar pruebas o prototipos sin registrar una tarjeta. Varias pasarelas agregadas ofrecen variantes &lt;code&gt;:free&lt;/code&gt;, Hugging Face publica un endpoint de inferencia compartido, y la API oficial otorga crédito de prueba a cuentas nuevas. Si combinas estas rutas y configuras una cadena de respaldo en Apidog, puedes construir y probar productos con V4 sin gastar dinero.&lt;/p&gt;

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

&lt;p&gt;Esta guía explica el uso gratuito de la API. Para opciones que incluyen chat web y autoalojamiento, revisa &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo usar DeepSeek V4 gratis&lt;/a&gt;. Para el tutorial de pago, consulta &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo usar la API de DeepSeek V4&lt;/a&gt;. Para la descripción general del producto, ve a &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;qué es DeepSeek V4&lt;/a&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nivel gratuito de OpenRouter&lt;/strong&gt; — &lt;code&gt;deepseek/deepseek-v4-flash:free&lt;/code&gt; y a veces &lt;code&gt;deepseek-v4-pro:free&lt;/code&gt;. Compatible con OpenAI, permite cientos de solicitudes al día por clave.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proveedores de inferencia de Hugging Face&lt;/strong&gt; — endpoint gratuito en &lt;code&gt;&lt;a href="https://router.huggingface.co/hf-inference" rel="noopener noreferrer"&gt;https://router.huggingface.co/hf-inference&lt;/a&gt;&lt;/code&gt;. Útil para prototipos, con límite de velocidad.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nivel gratuito de Chutes&lt;/strong&gt; — red comunitaria de GPU que expone endpoints gratuitos de DeepSeek poco después del lanzamiento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crédito de prueba de DeepSeek&lt;/strong&gt; — cuentas nuevas en &lt;code&gt;platform.deepseek.com&lt;/code&gt; reciben saldo inicial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V4-Flash autoalojado&lt;/strong&gt; — ejecuta en tu propia GPU sin costo de licencia; consulta &lt;a href="http://apidog.com/blog/how-to-run-deepseek-v4-locally?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo ejecutar DeepSeek V4 localmente&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Crea una cadena de respaldo en &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para mantener la misma forma de solicitud en todos los proveedores.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h2&gt;
  
  
  Por qué existe la ruta gratuita de la API
&lt;/h2&gt;

&lt;p&gt;Aunque DeepSeek ya tiene precios bajos, las rutas gratuitas existen por tres motivos clave:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prototipado previo a la tarjeta:&lt;/strong&gt; Llama a V4 desde código sin registrar un método de pago.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trabajo estudiantil, investigación y open source:&lt;/strong&gt; Accede a calidad de vanguardia para proyectos sin presupuesto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparación de proveedores:&lt;/strong&gt; Ejecuta el mismo prompt en varios endpoints para comparar latencia, calidad y confiabilidad.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si alguno de estos casos aplica, sigue esta guía. Si vas a lanzar un producto, pasa a la &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de la API de pago&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ruta 1: Nivel gratuito de OpenRouter
&lt;/h2&gt;

&lt;p&gt;OpenRouter es una pasarela compatible con la API de OpenAI que agrega modelos de vanguardia, incluyendo variantes gratuitas de DeepSeek V4.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Regístrate en &lt;a href="https://openrouter.ai/" rel="noopener noreferrer"&gt;openrouter.ai&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Crea una clave API en &lt;strong&gt;Ajustes → Claves&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Busca modelos con sufijo &lt;code&gt;:free&lt;/code&gt;, por ejemplo &lt;code&gt;deepseek/deepseek-v4-flash:free&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Llama al endpoint con cualquier SDK compatible con OpenAI.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Ejemplo en Python
&lt;/h4&gt;



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

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OPENROUTER_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://openrouter.ai/api/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek/deepseek-v4-flash:free&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Refactoriza esta función Go para usar canales.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Límites
&lt;/h3&gt;

&lt;p&gt;Las solicitudes gratuitas se ponen en cola tras el tráfico de pago. Los límites suelen estar entre 50 y 200 solicitudes por día por clave, con concurrencia baja. Puede ralentizarse o desactivarse sin aviso.&lt;/p&gt;

&lt;h4&gt;
  
  
  Ejemplo en Node.js
&lt;/h4&gt;



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

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

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deepseek/deepseek-v4-flash:free&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explica el enrutamiento de MoE como si tuviera 12 años.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ruta 2: Proveedores de inferencia de Hugging Face
&lt;/h2&gt;

&lt;p&gt;Hugging Face ofrece un endpoint compartido para DeepSeek V4. Es gratuito con un token de HF, pero tiene límites estrictos de velocidad.&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;huggingface_hub&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;InferenceClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;InferenceClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-ai/DeepSeek-V4-Flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HF_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat_completion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Escribe un decorador de Python que reintente con jitter.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Obtén el token gratuito en &lt;a href="https://huggingface.co/settings/tokens" rel="noopener noreferrer"&gt;huggingface.co/settings/tokens&lt;/a&gt;. La latencia y el uso dependen de la carga. Para menos límites, actualiza a HF Pro o migra a la API de DeepSeek.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ruta 3: Chutes y pasarelas comunitarias
&lt;/h2&gt;

&lt;p&gt;Chutes es una red descentralizada de GPU que frecuentemente aloja variantes de DeepSeek V4 con endpoints compatibles con OpenAI, por ejemplo &lt;code&gt;&lt;a href="https://llm.chutes.ai/v1" rel="noopener noreferrer"&gt;https://llm.chutes.ai/v1&lt;/a&gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CHUTES_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://llm.chutes.ai/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-ai/DeepSeek-V4-Flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Compara la atención CSA y HCA en dos frases.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La disponibilidad y los modelos cambian rápido. Siempre valida el ID del modelo y el costo antes de depender de esta ruta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ruta 4: Crédito de prueba de DeepSeek
&lt;/h2&gt;

&lt;p&gt;DeepSeek otorga crédito de prueba a cuentas nuevas (por ejemplo, $1 tras verificar email). Revisa tu saldo tras registrarte en &lt;a href="https://platform.deepseek.com/" rel="noopener noreferrer"&gt;platform.deepseek.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Incluso $1 rinde mucho: ~7 millones de tokens de entrada en V4-Flash o 570,000 en V4-Pro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Crea una cadena gratuita agnóstica al proveedor en Apidog
&lt;/h2&gt;

&lt;p&gt;Para resiliencia, configura una cadena de respaldo en Apidog y alterna entre rutas gratuitas según disponibilidad:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descarga Apidog&lt;/a&gt; y crea un nuevo proyecto.&lt;/li&gt;
&lt;li&gt;Define cuatro entornos: &lt;code&gt;openrouter&lt;/code&gt;, &lt;code&gt;huggingface&lt;/code&gt;, &lt;code&gt;chutes&lt;/code&gt;, &lt;code&gt;deepseek-trial&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Guarda las claves API y &lt;code&gt;BASE_URL&lt;/code&gt; como variables en cada entorno.&lt;/li&gt;
&lt;li&gt;Crea una solicitud POST a &lt;code&gt;{{BASE_URL}}/chat/completions&lt;/code&gt; parametrizando &lt;code&gt;model&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cambia de entorno para reusar el mismo prompt en todos los proveedores.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este método también sirve para &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;rutas gratuitas de la API de GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementa una cadena de respaldo en código
&lt;/h3&gt;

&lt;p&gt;Automatiza la reserva de proveedor en Python con el SDK de OpenAI:&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="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RateLimitError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APIError&lt;/span&gt;

&lt;span class="n"&gt;PROVIDERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;base_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://openrouter.ai/api/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENROUTER_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek/deepseek-v4-flash:free&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;base_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://llm.chutes.ai/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CHUTES_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-ai/DeepSeek-V4-Flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;base_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.deepseek.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DEEPSEEK_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-v4-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_v4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;PROVIDERS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;base_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RateLimitError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APIError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;base_url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; falló: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;todos los proveedores agotados&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;
  
  
  Para qué sirve realmente cada ruta gratuita
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ruta&lt;/th&gt;
&lt;th&gt;Mejor para&lt;/th&gt;
&lt;th&gt;Peor para&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenRouter gratuito&lt;/td&gt;
&lt;td&gt;Prototipado, desarrollo diario&lt;/td&gt;
&lt;td&gt;Cualquier cosa con SLAs estrictos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inferencia HF&lt;/td&gt;
&lt;td&gt;Llamadas exploratorias, notebooks&lt;/td&gt;
&lt;td&gt;Cargas de trabajo de baja latencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chutes&lt;/td&gt;
&lt;td&gt;Trabajo comunitario experimental&lt;/td&gt;
&lt;td&gt;Dependencias a largo plazo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prueba de DeepSeek&lt;/td&gt;
&lt;td&gt;Pruebas de fidelidad total&lt;/td&gt;
&lt;td&gt;Producción sostenida&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4-Flash autoalojado&lt;/td&gt;
&lt;td&gt;Trabajo con requisitos de cumplimiento&lt;/td&gt;
&lt;td&gt;Equipos sin capacidad de GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Cálculo de cuotas que importa
&lt;/h2&gt;

&lt;p&gt;Ten en cuenta los límites diarios reales de cada ruta gratuita:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenRouter gratuito:&lt;/strong&gt; ~100 solicitudes/día/clave, ~50K tokens cada una. Útil para 30-50 llamadas de desarrollo por día.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inferencia HF gratuita:&lt;/strong&gt; límite compartido, ~1000 solicitudes/día por cuenta; puede ser lento bajo carga.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chutes:&lt;/strong&gt; variable; úsalo como mejor esfuerzo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prueba de DeepSeek ($1):&lt;/strong&gt; ~700 llamadas de 10K tokens cada una en V4-Flash.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V4-Flash autoalojado:&lt;/strong&gt; el límite es tu hardware (p.ej., 4 × H100 = 50-150 tok/s).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si tu prototipo supera estos límites, la API de pago es más eficiente. A $0.14/M en V4-Flash, 10,000 llamadas con 2K de contexto y 500 de salida cuestan ~$2.80.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuándo pasar a la API de pago
&lt;/h2&gt;

&lt;p&gt;Considera escalar cuando:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Alcanzas límites de velocidad varias veces al día.&lt;/li&gt;
&lt;li&gt;Encadenas varios proveedores gratuitos para cubrir la carga.&lt;/li&gt;
&lt;li&gt;Necesitas latencia predecible o SLAs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La recarga mínima en &lt;code&gt;platform.deepseek.com&lt;/code&gt; es de $2. Consulta la &lt;a href="http://apidog.com/blog/deepseek-v4-api-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de precios de DeepSeek V4&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;¿Alguna ruta es permanentemente gratuita?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. Los niveles gratuitos pueden cambiar o desaparecer. Úsalos solo para prototipos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿OpenRouter &lt;code&gt;:free&lt;/code&gt; ejecuta el V4 real?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí, con límites de velocidad estrictos. La calidad es igual, el rendimiento puede variar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo usar la salida gratuita en un producto comercial?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Revisa los términos de cada proveedor. OpenRouter permite uso comercial dentro del límite; HF también, pero más restringido. DeepSeek sigue sus propios términos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué ruta gratuita tiene la mejor latencia?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
El crédito de prueba de DeepSeek, seguido de OpenRouter. HF y Chutes varían.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo autoalojar V4 gratis?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí, la licencia es MIT. El costo es solo el hardware. Consulta &lt;a href="http://apidog.com/blog/how-to-run-deepseek-v4-locally?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo ejecutar DeepSeek V4 localmente&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo rastreo qué ruta gratuita usé hoy?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Usa &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; y activa &lt;code&gt;usage&lt;/code&gt; en el visor de respuestas. La mayoría de agregadores también tienen panel de uso.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Precios de la API DeepSeek V4</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:21:53 +0000</pubDate>
      <link>https://vibe.forem.com/roobia/precios-de-la-api-deepseek-v4-35ck</link>
      <guid>https://vibe.forem.com/roobia/precios-de-la-api-deepseek-v4-35ck</guid>
      <description>&lt;p&gt;DeepSeek publicó los precios de V4 el mismo día que lanzó los modelos, el 23 de abril de 2026, reajustando el punto de partida para la IA de frontera. V4-Flash opera a &lt;strong&gt;$0.14 por millón de tokens de entrada&lt;/strong&gt; y &lt;strong&gt;$0.28 por millón de tokens de salida&lt;/strong&gt;. V4-Pro a &lt;strong&gt;$1.74 de entrada&lt;/strong&gt; y &lt;strong&gt;$3.48 de salida&lt;/strong&gt;. Ambos admiten ventana de contexto de 1 millón de tokens y hasta 384 mil de salida. Además, ofrecen un agresivo descuento por acierto de caché, reduciendo los costos de entrada entre 80% y 90% en solicitudes repetidas.&lt;/p&gt;

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

&lt;p&gt;Esta guía explica la lista de precios completa, cómo el almacenamiento en caché de contexto modifica el costo real por llamada, una comparación técnica con GPT-5.5 y Claude Opus, y cuatro estrategias para controlar el gasto en Apidog.&lt;/p&gt;

&lt;p&gt;Para información general del producto, revisa &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;qué es DeepSeek V4&lt;/a&gt;. Para un tutorial de integración, consulta &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo usar la API de DeepSeek V4&lt;/a&gt;. Si buscas rutas sin costo, revisa &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo usar DeepSeek V4 gratis&lt;/a&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;V4-Flash:&lt;/strong&gt; $0.14 / M entrada (sin caché), $0.028 / M entrada (con caché), $0.28 / M salida.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V4-Pro:&lt;/strong&gt; $1.74 / M entrada (sin caché), $0.145 / M entrada (con caché), $3.48 / M salida.&lt;/li&gt;
&lt;li&gt;Ventana de contexto: &lt;strong&gt;1 millón de tokens&lt;/strong&gt; de entrada, &lt;strong&gt;384 mil tokens&lt;/strong&gt; de salida, ambas variantes.&lt;/li&gt;
&lt;li&gt;Descuento por acierto de caché: aprox. &lt;strong&gt;80% en Flash&lt;/strong&gt;, &lt;strong&gt;92% en Pro&lt;/strong&gt; en prefijos repetidos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;deepseek-chat&lt;/code&gt; y &lt;code&gt;deepseek-reasoner&lt;/code&gt; se deprecian el &lt;strong&gt;24 de julio de 2026&lt;/strong&gt;; la facturación se asigna a V4-Flash.&lt;/li&gt;
&lt;li&gt;Con tasas de caché fallido, V4-Pro es ~&lt;strong&gt;2.9 veces más barato que GPT-5.5&lt;/strong&gt; en entrada y &lt;strong&gt;~8.6 veces más barato&lt;/strong&gt; en salida.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  La lista de precios completa
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modelo&lt;/th&gt;
&lt;th&gt;Entrada (sin caché)&lt;/th&gt;
&lt;th&gt;Entrada (con caché)&lt;/th&gt;
&lt;th&gt;Salida&lt;/th&gt;
&lt;th&gt;Contexto&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;deepseek-v4-flash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.14 / M&lt;/td&gt;
&lt;td&gt;$0.028 / M&lt;/td&gt;
&lt;td&gt;$0.28 / M&lt;/td&gt;
&lt;td&gt;1M / 384K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;deepseek-v4-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$1.74 / M&lt;/td&gt;
&lt;td&gt;$0.145 / M&lt;/td&gt;
&lt;td&gt;$3.48 / M&lt;/td&gt;
&lt;td&gt;1M / 384K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;deepseek-chat&lt;/code&gt; (obsoleto 24-07-2026)&lt;/td&gt;
&lt;td&gt;se asigna a V4-Flash sin razonamiento&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;deepseek-reasoner&lt;/code&gt; (obsoleto 24-07-2026)&lt;/td&gt;
&lt;td&gt;se asigna a V4-Flash con razonamiento&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;&lt;strong&gt;Puntos clave:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El precio depende solamente del ID del modelo; el modo de razonamiento solo afecta la cantidad de tokens consumidos.&lt;/li&gt;
&lt;li&gt;El descuento por caché es automático: cualquier prefijo repetido de al menos 1,024 tokens (byte a byte) en la misma cuenta se factura al precio reducido.&lt;/li&gt;
&lt;li&gt;Los IDs antiguos (&lt;code&gt;deepseek-chat&lt;/code&gt;, &lt;code&gt;deepseek-reasoner&lt;/code&gt;) ya son alias de V4-Flash; la fecha límite es el 24 de julio de 2026.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Almacenamiento en caché de contexto explicado
&lt;/h2&gt;

&lt;p&gt;El almacenamiento en caché es la mayor herramienta de reducción de costos en DeepSeek V4. Todo lo que se repite entre llamadas, como prompts de sistema largos, esquemas de herramientas o contexto RAG, se factura a una fracción en las siguientes llamadas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo práctico:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Supón un agente con un prompt de sistema de 20,000 tokens (inalterable) y 100 preguntas de usuario de 200 tokens cada una.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sin caché:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entrada: 100 × 20,200 tokens × $1.74 / M = $3.52&lt;/li&gt;
&lt;li&gt;Salida: 100 × 500 tokens × $3.48 / M = $0.17&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total:&lt;/strong&gt; $3.69&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Con caché (1 fallo inicial, 99 aciertos):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entrada primera llamada: 20,200 × $1.74 / M = $0.035&lt;/li&gt;
&lt;li&gt;Siguientes 99 prefijos con caché: 99 × 20,000 × $0.145 / M = $0.287&lt;/li&gt;
&lt;li&gt;Siguientes 99 turnos de usuario sin caché: 99 × 200 × $1.74 / M = $0.034&lt;/li&gt;
&lt;li&gt;Salida: 100 × 500 × $3.48 / M = $0.174&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total:&lt;/strong&gt; $0.53&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resultado:&lt;/strong&gt; ~7 veces más barato. El efecto es aún mayor en V4-Flash.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparativa con GPT-5.5 y Claude
&lt;/h2&gt;

&lt;p&gt;La comparación relevante para equipos técnicos:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modelo&lt;/th&gt;
&lt;th&gt;Entrada (estándar)&lt;/th&gt;
&lt;th&gt;Entrada (en caché)&lt;/th&gt;
&lt;th&gt;Salida&lt;/th&gt;
&lt;th&gt;Contexto&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4-Flash&lt;/td&gt;
&lt;td&gt;$0.14 / M&lt;/td&gt;
&lt;td&gt;$0.028 / M&lt;/td&gt;
&lt;td&gt;$0.28 / M&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4-Pro&lt;/td&gt;
&lt;td&gt;$1.74 / M&lt;/td&gt;
&lt;td&gt;$0.145 / M&lt;/td&gt;
&lt;td&gt;$3.48 / M&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;$5 / M&lt;/td&gt;
&lt;td&gt;$1.25 / M&lt;/td&gt;
&lt;td&gt;$30 / M&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5 Pro&lt;/td&gt;
&lt;td&gt;$30 / M&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;$180 / M&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.6&lt;/td&gt;
&lt;td&gt;$15 / M&lt;/td&gt;
&lt;td&gt;$1.50 / M&lt;/td&gt;
&lt;td&gt;$75 / M&lt;/td&gt;
&lt;td&gt;200K&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;En salida&lt;/strong&gt;, V4-Pro es ~8.6 veces más barato que GPT-5.5 y 21 veces más barato que Claude Opus 4.6.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;En entrada con caché&lt;/strong&gt;, V4-Pro es ~10 veces más barato que GPT-5.5 y Claude Opus en escenarios repetitivos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;En rendimiento&lt;/strong&gt;, V4-Pro iguala o supera a GPT-5.5 en benchmarks de codificación (LiveCodeBench, Codeforces), costando solo una fracción. Más detalles en &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;qué es DeepSeek V4&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Advertencia:&lt;/strong&gt; Claude supera a V4-Pro en recuperación de contexto largo, y Gemini 3.1 Pro lidera MMLU-Pro. Si tu caso depende de recuperar información precisa en grandes contextos, evalúa la calidad antes del costo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modelado de costos para cargas de trabajo comunes
&lt;/h2&gt;

&lt;p&gt;Cuatro patrones cubren la mayoría de los casos en producción. Así se calculan en V4-Pro (sin caché; los ahorros por caché se suman):&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Bucle de codificación agéntico (50K de contexto, 2K de salida, 20 llamadas por tarea)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Entrada: 50,000 × 20 × $1.74 / M = $1.74&lt;/li&gt;
&lt;li&gt;Salida: 2,000 × 20 × $3.48 / M = $0.14&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Costo por tarea:&lt;/strong&gt; ~$1.88&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GPT-5.5:&lt;/strong&gt; ~$6.20 por tarea.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Q&amp;amp;A de documentos largos (500K de contexto, 1K de salida)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Entrada: 500,000 × $1.74 / M = $0.87&lt;/li&gt;
&lt;li&gt;Salida: 1,000 × $3.48 / M = $0.003&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Costo por llamada:&lt;/strong&gt; ~$0.87&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GPT-5.5:&lt;/strong&gt; ~$2.53 por llamada.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Clasificación de alto volumen (2K contexto, 200 salida, 10,000 llamadas)
&lt;/h3&gt;

&lt;p&gt;Usa V4-Flash para esto.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entrada: 2,000 × 10,000 × $0.14 / M = $2.80&lt;/li&gt;
&lt;li&gt;Salida: 200 × 10,000 × $0.28 / M = $0.56&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Costo total:&lt;/strong&gt; ~$3.36&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GPT-5.5:&lt;/strong&gt; ~$110 ejecutando lo mismo.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Chatbot con indicaciones repetidas (10K prompt sistema, 500 tokens usuario, 1K salida, 1,000 sesiones)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Entrada primera llamada: 10,500 × $1.74 / M = $0.018&lt;/li&gt;
&lt;li&gt;Entrada con caché: 999 × 10,000 × $0.145 / M = $1.45&lt;/li&gt;
&lt;li&gt;Turnos usuario sin caché: 999 × 500 × $1.74 / M = $0.87&lt;/li&gt;
&lt;li&gt;Salida: 1,000 × 1,000 × $3.48 / M = $3.48&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Costo total:&lt;/strong&gt; ~$5.82&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GPT-5.5 con caché:&lt;/strong&gt; ~$26.35 para la misma carga.&lt;/p&gt;

&lt;h2&gt;
  
  
  Costos ocultos a vigilar
&lt;/h2&gt;

&lt;p&gt;El precio listado no lo es todo. Ten en cuenta:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inflación de tokens en modo razonamiento:&lt;/strong&gt; &lt;code&gt;thinking_max&lt;/code&gt; puede consumir 3-10x más tokens de salida. Limita este modo con indicadores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crecimiento del contexto:&lt;/strong&gt; Los agentes suelen realimentar la conversación entera en cada turno. Trunca o resume agresivamente para evitar explosión de costos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tormentas de reintentos:&lt;/strong&gt; Un bug que reintenta en cada error 500 puede duplicar la factura. Implementa retroceso exponencial y límite de reintentos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iteraciones de desarrollo:&lt;/strong&gt; Probar prompts con curl vuelve a ejecutar todo el contexto. Usar &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; y variables parametrizadas reduce costos de iteración casi a cero.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Seguimiento de costos en Apidog
&lt;/h2&gt;

&lt;p&gt;Flujo recomendado para controlar costos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descarga Apidog&lt;/a&gt; y almacena &lt;code&gt;DEEPSEEK_API_KEY&lt;/code&gt; como variable secreta.&lt;/li&gt;
&lt;li&gt;Crea una solicitud POST a &lt;code&gt;https://api.deepseek.com/v1/chat/completions&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;En el panel de respuesta, ancla &lt;code&gt;usage.prompt_tokens&lt;/code&gt;, &lt;code&gt;usage.completion_tokens&lt;/code&gt; y &lt;code&gt;usage.reasoning_tokens&lt;/code&gt; para ver los costos en cada llamada.&lt;/li&gt;
&lt;li&gt;Parametriza &lt;code&gt;model&lt;/code&gt; y &lt;code&gt;thinking_mode&lt;/code&gt; para testear entre V4-Flash y V4-Pro, y entre Non-Think y Think Max.&lt;/li&gt;
&lt;li&gt;Replica la colección para GPT-5.5 (la &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de API de GPT-5.5&lt;/a&gt; explica la configuración).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este workflow detecta ~80% de sorpresas de costo antes de que lleguen a la factura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuatro reglas para mantener el gasto predecible
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Por defecto, usa V4-Flash.&lt;/strong&gt; Solo escala a V4-Pro si la mejora de calidad lo justifica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Por defecto, usa Non-Think.&lt;/strong&gt; Escala a Think High para tareas difíciles y Think Max solo para tareas críticas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limita &lt;code&gt;max_tokens&lt;/code&gt;.&lt;/strong&gt; El máximo de 384K es una protección, no un objetivo. La mayoría de respuestas caben en 2K.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Envía telemetría de uso.&lt;/strong&gt; Registra &lt;code&gt;prompt_tokens&lt;/code&gt;, &lt;code&gt;completion_tokens&lt;/code&gt; y &lt;code&gt;reasoning_tokens&lt;/code&gt;. Haz alertas sobre picos de tokens de razonamiento.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;&lt;strong&gt;¿Existe un nivel gratuito?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No hay API gratuita, pero a veces se otorga crédito de prueba. Para rutas sin costo, revisa &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo usar DeepSeek V4 gratis&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo funciona la tarificación por acierto de caché?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Prefijos de 1,024+ tokens repetidos en la misma cuenta se facturan al precio reducido. La primera llamada paga tarifa completa; posteriores con el mismo prefijo, tarifa con descuento. Es automático.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Los modos de razonamiento cuestan más?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
El precio por token es igual, pero los modos de razonamiento consumen más tokens. Monitorea &lt;code&gt;reasoning_tokens&lt;/code&gt; en el objeto &lt;code&gt;usage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Los precios son estables?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
DeepSeek puede cambiar precios. V3.2 fue estable en 2025; V4 no tiene fecha de fin publicada. Consulta la &lt;a href="https://api-docs.deepseek.com/quick_start/pricing" rel="noopener noreferrer"&gt;página de precios en vivo&lt;/a&gt; antes de presupuestar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿V4-Pro y V4-Flash tienen la misma tarifa de salida?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. V4-Pro salida: $3.48 / M; V4-Flash salida: $0.28 / M. Es la razón más fuerte para usar Flash por defecto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿El endpoint Anthropic cambia la tarifa?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. &lt;code&gt;https://api.deepseek.com/anthropic&lt;/code&gt; usa las mismas tarifas que el endpoint OpenAI. El formato no afecta la facturación.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo usar la API DeepSeek V4</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:15:03 +0000</pubDate>
      <link>https://vibe.forem.com/roobia/como-usar-la-api-deepseek-v4-941</link>
      <guid>https://vibe.forem.com/roobia/como-usar-la-api-deepseek-v4-941</guid>
      <description>&lt;p&gt;DeepSeek V4 se lanzó con API en vivo desde el primer día. Los ID de modelo son &lt;code&gt;deepseek-v4-pro&lt;/code&gt; y &lt;code&gt;deepseek-v4-flash&lt;/code&gt;, el endpoint es compatible con OpenAI y la URL base es &lt;code&gt;https://api.deepseek.com&lt;/code&gt;. Esto significa que cualquier cliente compatible con GPT-5.5 u otras APIs OpenAI puede usar V4 solo cambiando la URL base.&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;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-222.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-222.png" alt="Cómo empezar con DeepSeek V4" width="1200" height="825"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta guía cubre autenticación, parámetros clave, ejemplos en Python y Node, matemáticas en modo de pensamiento, llamadas a herramientas, streaming y un flujo de trabajo con &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para visualizar costos mientras iteras.&lt;/p&gt;

&lt;p&gt;Para una descripción general de producto, revisa &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;qué es DeepSeek V4&lt;/a&gt;. Para usar sin costo, consulta &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo usar DeepSeek V4 gratis&lt;/a&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;DeepSeek V4 expone dos endpoints: &lt;strong&gt;OpenAI-compatible&lt;/strong&gt; en &lt;code&gt;&lt;a href="https://api.deepseek.com/v1/chat/completions" rel="noopener noreferrer"&gt;https://api.deepseek.com/v1/chat/completions&lt;/a&gt;&lt;/code&gt; y &lt;strong&gt;Anthropic-compatible&lt;/strong&gt; en &lt;code&gt;&lt;a href="https://api.deepseek.com/anthropic" rel="noopener noreferrer"&gt;https://api.deepseek.com/anthropic&lt;/a&gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;IDs de modelo: &lt;code&gt;deepseek-v4-pro&lt;/code&gt; (1.6T total, 49B activos) y &lt;code&gt;deepseek-v4-flash&lt;/code&gt; (284B total, 13B activos).&lt;/li&gt;
&lt;li&gt;Ambos soportan &lt;strong&gt;contexto de 1M tokens&lt;/strong&gt; y tres modos de razonamiento: &lt;code&gt;non-thinking&lt;/code&gt;, &lt;code&gt;thinking&lt;/code&gt;, &lt;code&gt;thinking_max&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Usa &lt;code&gt;temperature=1.0, top_p=1.0&lt;/code&gt; como recomienda DeepSeek; no uses defaults de GPT-5.5 o Claude.&lt;/li&gt;
&lt;li&gt;Los IDs antiguos &lt;code&gt;deepseek-chat&lt;/code&gt; y &lt;code&gt;deepseek-reasoner&lt;/code&gt; se deprecian el &lt;strong&gt;24 de julio de 2026&lt;/strong&gt;; migra antes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descarga Apidog&lt;/a&gt; para reproducir solicitudes, comparar modos y mantener tu clave fuera del historial de shell.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-223.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-223.png" alt="Captura de pantalla de Apidog mostrando una configuración de solicitud HTTP para DeepSeek V4" width="1200" height="887"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Antes de tu primera solicitud, ten listos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cuenta de desarrollador DeepSeek en &lt;a href="https://platform.deepseek.com/" rel="noopener noreferrer"&gt;platform.deepseek.com&lt;/a&gt; y recarga de $2 mínimo (sin saldo, todas las llamadas devuelven &lt;code&gt;402 Insufficient Balance&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Clave API con alcance a proyecto (más seguro que clave general).&lt;/li&gt;
&lt;li&gt;SDK con soporte de URL base OpenAI (Python &lt;code&gt;openai&amp;gt;=1.30.0&lt;/code&gt;, Node &lt;code&gt;&lt;a href="mailto:openai@4.x"&gt;openai@4.x&lt;/a&gt;&lt;/code&gt; funcionan sin cambios).&lt;/li&gt;
&lt;li&gt;Cliente API que pueda repetir solicitudes fácilmente. Usa curl solo para pruebas rápidas; para iteraciones y comparación, usa &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exporta la clave:&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;DEEPSEEK_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Endpoint y autenticación
&lt;/h2&gt;

&lt;p&gt;Tienes dos URL base:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST https://api.deepseek.com/v1/chat/completions # Formato OpenAI
POST https://api.deepseek.com/anthropic/v1/messages # Formato Anthropic
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Elige OpenAI a menos que ya utilices Anthropic. El resto de ejemplos usa formato OpenAI.&lt;/p&gt;

&lt;p&gt;Autenticación: token tipo Bearer en el header &lt;code&gt;Authorization&lt;/code&gt;. Ejemplo mínimo viable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.deepseek.com/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$DEEPSEEK_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": "deepseek-v4-pro",
    "messages": [
      {"role": "user", "content": "Explain MoE routing in two sentences."}
    ]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Respuestas exitosas devuelven un JSON con &lt;code&gt;choices&lt;/code&gt;, &lt;code&gt;usage&lt;/code&gt; (tokens de entrada, salida y &lt;code&gt;reasoning_tokens&lt;/code&gt; si aplica), y &lt;code&gt;id&lt;/code&gt;. Errores usan el formato estándar OpenAI (&lt;code&gt;error.code&lt;/code&gt; y &lt;code&gt;error.message&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Parámetros de solicitud
&lt;/h2&gt;

&lt;p&gt;Cada campo impacta costo o comportamiento. Mapeo para &lt;code&gt;deepseek-v4-pro&lt;/code&gt; y &lt;code&gt;deepseek-v4-flash&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parámetro&lt;/th&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Valores&lt;/th&gt;
&lt;th&gt;Notas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;deepseek-v4-pro&lt;/code&gt;, &lt;code&gt;deepseek-v4-flash&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Obligatorio.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;messages&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;array&lt;/td&gt;
&lt;td&gt;pares rol/contenido&lt;/td&gt;
&lt;td&gt;Obligatorio. Mismo esquema que OpenAI.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thinking_mode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;non-thinking&lt;/code&gt;, &lt;code&gt;thinking&lt;/code&gt;, &lt;code&gt;thinking_max&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Default: &lt;code&gt;non-thinking&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;temperature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;0 a 2&lt;/td&gt;
&lt;td&gt;DeepSeek recomienda 1.0.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;top_p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;0 a 1&lt;/td&gt;
&lt;td&gt;DeepSeek recomienda 1.0.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;1 a 131072&lt;/td&gt;
&lt;td&gt;Límite de salida.&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;boolean&lt;/td&gt;
&lt;td&gt;true o false&lt;/td&gt;
&lt;td&gt;Activa streaming SSE.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;array&lt;/td&gt;
&lt;td&gt;especificación OpenAI&lt;/td&gt;
&lt;td&gt;Para llamada a funciones.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tool_choice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string/object&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;auto&lt;/code&gt;, &lt;code&gt;required&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;, o específica&lt;/td&gt;
&lt;td&gt;Controla uso de herramientas.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;response_format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;object&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"type": "json_object"}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Salida JSON.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;cualquier int&lt;/td&gt;
&lt;td&gt;Para reproducibilidad.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;presence_penalty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;-2 a 2&lt;/td&gt;
&lt;td&gt;Penaliza temas repetidos.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;frequency_penalty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;-2 a 2&lt;/td&gt;
&lt;td&gt;Penaliza tokens repetidos.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;thinking_mode&lt;/code&gt; es la palanca de costo más relevante. &lt;code&gt;non-thinking&lt;/code&gt; omite razonamiento y es más rápido/económico; &lt;code&gt;thinking&lt;/code&gt; agrega razonamiento útil en código/matemáticas a cambio de más tokens; &lt;code&gt;thinking_max&lt;/code&gt; maximiza precisión y costo (requiere contexto ≥384K).&lt;/p&gt;

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

&lt;p&gt;El SDK &lt;code&gt;openai&lt;/code&gt; funciona usando &lt;code&gt;base_url&lt;/code&gt;. Otros wrappers OpenAI (LangChain, LlamaIndex, DSPy) también funcionan.&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;DEEPSEEK_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="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.deepseek.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-v4-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reply in code only.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a Rust function that debounces events.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;thinking_mode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;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_p&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;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;choice&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="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;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;choice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reasoning tokens:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Total tokens:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pasa parámetros específicos de DeepSeek usando &lt;code&gt;extra_body&lt;/code&gt; sin modificar la librería.&lt;/p&gt;

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

&lt;p&gt;Estructura similar en Node:&lt;br&gt;
&lt;/p&gt;

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

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

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deepseek-v4-flash&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain the Muon optimizer in plain English.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;thinking_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;thinking&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;top_p&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="p"&gt;});&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;El SDK Node acepta campos adicionales directamente (no requiere &lt;code&gt;extra_body&lt;/code&gt;).&lt;/p&gt;

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

&lt;p&gt;Activa &lt;code&gt;stream: true&lt;/code&gt; y recorre los chunks SSE. Compatible con la forma OpenAI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-v4-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Stream a 300-word essay on MoE.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;thinking_mode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;non-thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Si usas modo de pensamiento, el razonamiento llega por &lt;code&gt;delta.reasoning_content&lt;/code&gt;. Puedes mostrarlo o ignorarlo.&lt;/p&gt;

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

&lt;p&gt;V4 soporta el esquema estándar OpenAI para funciones. Define funciones en &lt;code&gt;tools&lt;/code&gt;, el modelo decide cuándo invocarlas.&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-v4-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;¿Clima en Lagos en Celsius?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;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;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;thinking_mode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tool_call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después, llama la función, añade el output como &lt;code&gt;role: "tool"&lt;/code&gt; y reenvía a la API. El flujo es idéntico a OpenAI/Anthropic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modo JSON
&lt;/h2&gt;

&lt;p&gt;Para salida estructurada, fuerza formato JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-v4-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reply with a single JSON object.&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;Summarize this release note as {title, date, bullets}: ...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;response_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json_object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;thinking_mode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;non-thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto garantiza JSON válido, pero no esquema. Para validación estricta, usa Pydantic o Zod en cliente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Crea la colección en Apidog
&lt;/h2&gt;

&lt;p&gt;No repitas pruebas manuales en terminal; consume créditos y dificulta comparar. Hazlo así:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descarga Apidog&lt;/a&gt; y crea un proyecto.&lt;/li&gt;
&lt;li&gt;Crea un entorno con &lt;code&gt;{{DEEPSEEK_API_KEY}}&lt;/code&gt; como variable secreta.&lt;/li&gt;
&lt;li&gt;Guarda una solicitud POST a &lt;code&gt;{{BASE_URL}}/chat/completions&lt;/code&gt; con header &lt;code&gt;Authorization: Bearer {{DEEPSEEK_API_KEY}}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Parametriza &lt;code&gt;model&lt;/code&gt; y &lt;code&gt;thinking_mode&lt;/code&gt; para pruebas A/B de variantes.&lt;/li&gt;
&lt;li&gt;Usa el visor de respuestas para monitorear &lt;code&gt;usage.reasoning_tokens&lt;/code&gt; y ver si pagas razonamiento extra.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si ya tienes la &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;colección GPT-5.5 en Apidog&lt;/a&gt;, duplícala, cambia la URL base a &lt;code&gt;&lt;a href="https://api.deepseek.com/v1" rel="noopener noreferrer"&gt;https://api.deepseek.com/v1&lt;/a&gt;&lt;/code&gt;, actualiza el modelo y compara resultados en minutos.&lt;/p&gt;

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

&lt;p&gt;El formato de error es igual a OpenAI. Principales códigos:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Código&lt;/th&gt;
&lt;th&gt;Significado&lt;/th&gt;
&lt;th&gt;Solución&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;Solicitud incorrecta&lt;/td&gt;
&lt;td&gt;Verifica el esquema JSON, sobre todo &lt;code&gt;messages&lt;/code&gt; y &lt;code&gt;tools&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;401&lt;/td&gt;
&lt;td&gt;Clave inválida&lt;/td&gt;
&lt;td&gt;Regenera desde &lt;a href="https://platform.deepseek.com/" rel="noopener noreferrer"&gt;platform.deepseek.com&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;402&lt;/td&gt;
&lt;td&gt;Saldo insuficiente&lt;/td&gt;
&lt;td&gt;Recarga la cuenta.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;403&lt;/td&gt;
&lt;td&gt;Modelo no permitido&lt;/td&gt;
&lt;td&gt;Revisa alcance de la clave y ortografía del modelo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;422&lt;/td&gt;
&lt;td&gt;Parámetro fuera de rango&lt;/td&gt;
&lt;td&gt;Verifica &lt;code&gt;max_tokens&lt;/code&gt; y &lt;code&gt;thinking_mode&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;429&lt;/td&gt;
&lt;td&gt;Límite de tasa&lt;/td&gt;
&lt;td&gt;Implementa backoff exponencial y reintenta.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;Error del servidor&lt;/td&gt;
&lt;td&gt;Reintenta una vez; si persiste, revisa status.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;503&lt;/td&gt;
&lt;td&gt;Sobrecarga&lt;/td&gt;
&lt;td&gt;Pasa a V4-Flash o espera 30 segundos.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Implementa un helper de reintentos para &lt;code&gt;429&lt;/code&gt; y &lt;code&gt;5xx&lt;/code&gt; con backoff exponencial. No reintentes errores &lt;code&gt;4xx&lt;/code&gt; automáticamente: indican errores de lógica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Patrones de control de costos
&lt;/h2&gt;

&lt;p&gt;Para evitar sorpresas en facturación:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Predetermina V4-Flash.&lt;/strong&gt; Cambia a V4-Pro solo si mides mejora tangible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protege &lt;code&gt;thinking_max&lt;/code&gt; con flag.&lt;/strong&gt; Es el modo más caro; úsalo solo si la corrección es crítica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limita &lt;code&gt;max_tokens&lt;/code&gt;.&lt;/strong&gt; La mayoría de respuestas caben en 2.000 tokens. El contexto de 1M es para entrada, no salida.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registra &lt;code&gt;usage&lt;/code&gt; en cada llamada.&lt;/strong&gt; Monitorea tokens de entrada, salida y razonamiento para detectar picos.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Migración desde modelos DeepSeek antiguos
&lt;/h2&gt;

&lt;p&gt;IDs &lt;code&gt;deepseek-chat&lt;/code&gt; y &lt;code&gt;deepseek-reasoner&lt;/code&gt; se deprecian el 24/07/2026. Migra cambiando solo el ID de modelo; la forma de requests/responses no cambia.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;-  model="deepseek-chat"
&lt;/span&gt;&lt;span class="gi"&gt;+  model="deepseek-v4-pro"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes de producción, haz comparativas A/B en Apidog. La mejora de calidad suele justificar el esfuerzo.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;¿La API de DeepSeek V4 está lista para producción?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí. La API está disponible desde el 23 de abril de 2026. V3/V3.2 ya operaban a escala, la superficie es madura.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Soporta formato Anthropic?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sí. Usa &lt;code&gt;&lt;a href="https://api.deepseek.com/anthropic/v1/messages" rel="noopener noreferrer"&gt;https://api.deepseek.com/anthropic/v1/messages&lt;/a&gt;&lt;/code&gt; y payload Anthropic. Acceso al mismo modelo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cuál es la ventana de contexto?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
1 millón de tokens en V4-Pro y V4-Flash. &lt;code&gt;thinking_max&lt;/code&gt; recomienda mínimo 384K.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo cuento tokens de entrada antes de enviar?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Usa tokenizador OpenAI para estimar; el recuento exacto está en &lt;code&gt;usage&lt;/code&gt; de la respuesta. Para presupuestos, confía en el output real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Puedo ajustar (fine-tune) vía API?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No por ahora. Fine-tuning solo vía checkpoints base en Hugging Face.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Es gratis para probar?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No hay capa gratuita, pero nuevos registros a veces reciben crédito de prueba.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
