<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Gemini API on KnightLi Blog</title>
        <link>https://knightli.com/es/tags/gemini-api/</link>
        <description>Recent content in Gemini API on KnightLi Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>es</language>
        <lastBuildDate>Sun, 12 Jul 2026 10:33:00 +0800</lastBuildDate><atom:link href="https://knightli.com/es/tags/gemini-api/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Guía de migración de Gemini Interactions API: cómo depurar después de cambiar outputs por steps</title>
        <link>https://knightli.com/es/2026/07/12/gemini-interactions-api-outputs-steps-migration-troubleshooting/</link>
        <pubDate>Sun, 12 Jul 2026 10:33:00 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/07/12/gemini-interactions-api-outputs-steps-migration-troubleshooting/</guid>
        <description>&lt;p&gt;La API de Gemini Interactions se ha convertido en la interfaz unificada recomendada para nuevos proyectos. Representa una generación, una llamada a una herramienta, un proceso de pensamiento, un resultado de una herramienta y una respuesta final como pasos de ejecución observables, adecuados para Agentes, tareas largas y aplicaciones que necesitan mostrar estados intermedios.&lt;/p&gt;
&lt;p&gt;Esto también significa que el código heredado ya no puede asumir &lt;code&gt;outputs&lt;/code&gt; en la respuesta. A partir de mayo de 2026, el nuevo esquema será el predeterminado; el esquema anterior se eliminó el 8 de junio. Si hay respuestas vacías, las llamadas a herramientas se pierden, los eventos SSE no se activan o el contexto histórico se rompe después de la migración, generalmente no es un problema del modelo, sino que los datos aún se están leyendo de acuerdo con la estructura anterior.&lt;/p&gt;
&lt;h2 id=&#34;primero-confirme-a-qué-capa-está-migrando&#34;&gt;Primero confirme a qué capa está migrando
&lt;/h2&gt;&lt;p&gt;Antes de solucionar el problema, primero categorice el problema para evitar cambiar solo un campo:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Jerarquía&lt;/th&gt;
          &lt;th&gt;Camino antiguo&lt;/th&gt;
          &lt;th&gt;Nueva manera&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Texto final&lt;/td&gt;
          &lt;td&gt;Recorra &lt;code&gt;outputs&lt;/code&gt; para buscar texto&lt;/td&gt;
          &lt;td&gt;Lectura de escena simple &lt;code&gt;interaction.output_text&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Respuesta completa&lt;/td&gt;
          &lt;td&gt;Encuentre contenido, herramientas o resultados de búsqueda en &lt;code&gt;outputs&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Atraviese &lt;code&gt;interaction.steps&lt;/code&gt;, procese como &lt;code&gt;type&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Llamada de herramienta&lt;/td&gt;
          &lt;td&gt;Analizar desde el tipo de contenido antiguo&lt;/td&gt;
          &lt;td&gt;Pasos del proceso como &lt;code&gt;function_call&lt;/code&gt;, &lt;code&gt;function_result&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Transmisión de eventos&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;content.start&lt;/code&gt;, &lt;code&gt;content.delta&lt;/code&gt;, &lt;code&gt;content.stop&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;step.start&lt;/code&gt;, &lt;code&gt;step.delta&lt;/code&gt;, &lt;code&gt;step.stop&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Historia de varias rondas&lt;/td&gt;
          &lt;td&gt;Devolver el antiguo &lt;code&gt;outputs&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Utilice &lt;code&gt;previous_interaction_id&lt;/code&gt; en el servidor o devuelva &lt;code&gt;steps&lt;/code&gt; en el cliente.&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Si el SDK sigue siendo Python 1.x o JavaScript 1.x, primero confirme la versión. Las instrucciones oficiales de migración requieren el uso de Python ≥2.0.0 o JavaScript ≥2.0.0 para adoptar automáticamente el nuevo esquema; pero actualizar el SDK no reparará automáticamente el analizador &lt;code&gt;outputs&lt;/code&gt;, el procesador SSE y la máquina de estado frontal que usted mismo escribió.&lt;/p&gt;
&lt;h2 id=&#34;solución-más-sencilla-lea-el-texto-final-con-output_text&#34;&gt;Solución más sencilla: lea el texto final con &lt;code&gt;output_text&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;Al procesar solo preguntas y respuestas en texto sin formato, no es necesario buscar manualmente el último texto de &lt;code&gt;steps&lt;/code&gt;. La nueva versión del SDK proporciona &lt;code&gt;output_text&lt;/code&gt;, que extrae y une bloques de texto consecutivos al final de la respuesta:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;google&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;genai&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;genai&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;interaction&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;interactions&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;gemini-3.5-flash&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;用三句话解释什么是 prompt caching。&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;interaction&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;output_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si deja &lt;code&gt;interaction.outputs[-1].text&lt;/code&gt; como está después de la migración, los resultados comunes son que la propiedad no existe, la indexación falla o el objeto se serializa incorrectamente en una cadena vacía. Primero reemplácelo con &lt;code&gt;interaction.output_text&lt;/code&gt; y luego agregue el análisis de pasos de escenarios complejos.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;output_text&lt;/code&gt; no es adecuado para todas las respuestas: cuando el texto está separado por pensamientos, imágenes, audio o llamadas de herramientas, no restaurará todo el contenido entrelazado. Cuando necesite mostrar el proceso de ejecución completo, debe atravesar &lt;code&gt;steps&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;cómo-atravesar-correctamente-steps&#34;&gt;Cómo atravesar correctamente &lt;code&gt;steps&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;El nuevo esquema representa los procesos como pasos escritos. Como mínimo, se reconocerán &lt;code&gt;user_input&lt;/code&gt;, &lt;code&gt;model_output&lt;/code&gt;, &lt;code&gt;function_call&lt;/code&gt; y &lt;code&gt;function_result&lt;/code&gt;; Si utiliza herramientas del lado del servidor, también verá &lt;code&gt;google_search_call&lt;/code&gt;, &lt;code&gt;google_search_result&lt;/code&gt; u otros pasos específicos de la herramienta.&lt;/p&gt;
&lt;p&gt;El siguiente ejemplo solo recopila texto del resultado final del modelo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;collect_model_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;interaction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;chunks&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;step&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;interaction&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;steps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;step&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;model_output&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;step&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;chunks&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;chunks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;collect_model_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;interaction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En proyectos reales, no asuma que &lt;code&gt;content&lt;/code&gt; existe para cada paso y no trate a &lt;code&gt;thought&lt;/code&gt; como la respuesta final. Primero bifurque según &lt;code&gt;step.type&lt;/code&gt; y luego lea los campos permitidos por este tipo. Registre los pasos desconocidos como tipo, ID y estado para preservar la compatibilidad futura; no permita que toda la solicitud falle solo porque aparece un nuevo paso de herramienta.&lt;/p&gt;
&lt;h2 id=&#34;por-qué-la-herramienta-llama-desaparecer&#34;&gt;¿Por qué la herramienta llama &amp;ldquo;desaparecer&amp;rdquo;?
&lt;/h2&gt;&lt;p&gt;Los esquemas más antiguos a menudo envuelven las operaciones de herramientas del lado del servidor en un tipo de contenido específico llamado &lt;code&gt;outputs&lt;/code&gt;. El nuevo esquema los divide en pasos independientes, por lo que escanear solo &lt;code&gt;model_output&lt;/code&gt; no verá la búsqueda, las llamadas a funciones ni los resultados de las funciones.&lt;/p&gt;
&lt;p&gt;Por ejemplo, la llamada a la función se leería así:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;step&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;interaction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;steps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;step&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;function_call&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`Calling &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;step&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;step&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;arguments&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;La Búsqueda de Google del lado del servidor también debería manejar los pasos de llamada y resultado por separado, en lugar de adivinar a partir del texto final si se realizó una búsqueda o no. Para las herramientas de función del cliente, después de recibir &lt;code&gt;requires_action&lt;/code&gt;, envíe el &lt;code&gt;function_result&lt;/code&gt; correspondiente y continúe usando el estado de la interacción para completar el proceso posterior.&lt;/p&gt;
&lt;h2 id=&#34;los-eventos-de-streaming-sse-se-migran-juntos&#34;&gt;Los eventos de streaming SSE se migran juntos
&lt;/h2&gt;&lt;p&gt;Si solo cambia el análisis de la respuesta REST y no cambia el procesador de flujo, la interfaz generalmente se comportará como &amp;ldquo;la solicitud se realizó correctamente pero la página no se actualizó&amp;rdquo;. Los nuevos nombres de los eventos son los siguientes:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Eventos antiguos&lt;/th&gt;
          &lt;th&gt;Nuevos eventos&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;interaction.start&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;interaction.created&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;interaction.complete&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;interaction.completed&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;content.start&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;step.start&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;content.delta&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;step.delta&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;content.stop&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;step.stop&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;interaction.status_update&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;interaction.in_progress&lt;/code&gt;, &lt;code&gt;interaction.requires_action&lt;/code&gt; y otros eventos de estado&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ya no se garantiza que los parámetros de la llamada a la función lleguen completamente a la vez. En la transmisión, &lt;code&gt;step.start&lt;/code&gt; primero proporcionará el nombre de la función y luego se entregarán varios eventos &lt;code&gt;step.delta&lt;/code&gt; pieza por pieza con algunos parámetros JSON. El cliente debe acumular parámetros y analizar el JSON completo después de &lt;code&gt;step.stop&lt;/code&gt; o un estado que requiera acción; no haga &lt;code&gt;JSON.parse()&lt;/code&gt; directamente para cada delta.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;rawArguments&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;event_type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;step.delta&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;delta&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;arguments&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;rawArguments&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;delta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;partial_arguments&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;event_type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;step.stop&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 只在对应 function_call 步骤完成后解析 rawArguments。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;no-responder-después-de-varias-rondas-de-diálogo-outputs&#34;&gt;No responder después de varias rondas de diálogo &lt;code&gt;outputs&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;La antigua implementación sin estado a menudo recopila la ronda anterior de &lt;code&gt;outputs&lt;/code&gt; y la vuelve a incluir en la siguiente ronda de &lt;code&gt;input&lt;/code&gt;. Hay dos opciones más claras después de la migración:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Continúe la misma sesión a través de &lt;code&gt;previous_interaction_id&lt;/code&gt; usando el estado predeterminado del lado del servidor;&lt;/li&gt;
&lt;li&gt;Cuando deba administrar el historial usted mismo, regrese la ronda anterior de &lt;code&gt;steps&lt;/code&gt; y agregue un nuevo paso &lt;code&gt;user_input&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El estado del lado del servidor es más adecuado para conversaciones ordinarias de varias rondas; El estado del lado del cliente se utiliza cuando se requiere un control estricto del contenido guardado, la migración entre sistemas o la reproducción sin conexión. No importa cuál elija, no empalme el antiguo &lt;code&gt;outputs&lt;/code&gt; y el nuevo &lt;code&gt;steps&lt;/code&gt; al mismo tiempo; de lo contrario, es fácil producir contextos duplicados, discrepancias en los resultados de las herramientas o proliferación de tokens.&lt;/p&gt;
&lt;h2 id=&#34;response_format-también-puede-ser-la-fuente-del-error&#34;&gt;&lt;code&gt;response_format&lt;/code&gt; también puede ser la fuente del error
&lt;/h2&gt;&lt;p&gt;Esta migración no solo cambia la matriz de salida. La salida estructurada y la configuración multimodal también se unifican en el &lt;code&gt;response_format&lt;/code&gt; de nivel superior:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se ha eliminado el &lt;code&gt;response_mime_type&lt;/code&gt; original; especifique &lt;code&gt;mime_type&lt;/code&gt; en la entrada &lt;code&gt;response_format&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;El esquema JSON debe colocarse en un objeto de formato con &lt;code&gt;type: &amp;quot;text&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;La configuración de imagen se movió de &lt;code&gt;generation_config&lt;/code&gt; a la entrada &lt;code&gt;response_format&lt;/code&gt; en &lt;code&gt;type: &amp;quot;image&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;La salida multimodal requiere una serie de entradas de formato.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si la interfaz devuelve 400, además de buscar &lt;code&gt;steps&lt;/code&gt;, también se busca en el código &lt;code&gt;response_mime_type&lt;/code&gt;, &lt;code&gt;generation_config.image_config&lt;/code&gt; y el objeto único heredado &lt;code&gt;response_format&lt;/code&gt;. Estos campos antiguos suelen aparecer junto con el problema &lt;code&gt;outputs&lt;/code&gt; después de la misma actualización.&lt;/p&gt;
&lt;h2 id=&#34;un-procedimiento-práctico-de-resolución-de-problemas&#34;&gt;Un procedimiento práctico de resolución de problemas
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Actualice el SDK de Google GenAI y documente la versión real.&lt;/li&gt;
&lt;li&gt;Verifique &lt;code&gt;interaction.output_text&lt;/code&gt; con una solicitud mínima sin herramientas y sin transmisión.&lt;/li&gt;
&lt;li&gt;Imprima el tipo y el estado de &lt;code&gt;interaction.steps&lt;/code&gt; para confirmar que el programa ha recibido el nuevo esquema.&lt;/li&gt;
&lt;li&gt;Migre la lógica de análisis de llamadas a funciones, búsquedas del lado del servidor y resultados de herramientas, respectivamente.&lt;/li&gt;
&lt;li&gt;Modifique la suscripción de eventos SSE y la lógica de acumulación de parámetros.&lt;/li&gt;
&lt;li&gt;Compruebe si el historial de rondas múltiples ha cambiado a &lt;code&gt;previous_interaction_id&lt;/code&gt; o &lt;code&gt;steps&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Busque y reemplace los antiguos campos relacionados con &lt;code&gt;response_format&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ejecute pruebas de regresión, una con texto, llamadas a herramientas, salida de transmisión y reintentos fallidos.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;No confíe en el antiguo encabezado &lt;code&gt;Api-Revision&lt;/code&gt; para restaurar temporalmente el código antiguo. El período de transición del antiguo esquema ha terminado; La migración ahora debería considerarse una solución de compatibilidad oficial, en lugar de seguir teniendo dos conjuntos de analizadores inconsistentes.&lt;/p&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;La esencia de cambiar &lt;code&gt;outputs&lt;/code&gt; a &lt;code&gt;steps&lt;/code&gt; es que la API de Interacciones ya no agrupa todos los procesos en una lista de salida, sino que expone explícitamente entradas, reflexiones, herramientas, resultados y salidas finales. Las escenas de texto puro utilizan preferentemente &lt;code&gt;interaction.output_text&lt;/code&gt;; Agentes, herramientas, streaming y escenas multimodales utilizan &lt;code&gt;step.type&lt;/code&gt; para establecer ramas explícitas; Las sesiones de varias rondas utilizan &lt;code&gt;previous_interaction_id&lt;/code&gt; o &lt;code&gt;steps&lt;/code&gt; en su lugar. Al migrar de acuerdo con estos tres principios, se pueden localizar la mayoría de los problemas de &amp;ldquo;no hay salida&amp;rdquo;, &amp;ldquo;falta herramienta&amp;rdquo; y &amp;ldquo;SSE no se actualiza&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Información oficial:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ai.google.dev/gemini-api/docs/interactions-breaking-changes-may-2026&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://ai.google.dev/gemini-api/docs/interactions-breaking-changes-may-2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ai.google.dev/gemini-api/docs/migrate-to-interactions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://ai.google.dev/gemini-api/docs/migrate-to-interactions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ai.google.dev/gemini-api/docs/changelog&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://ai.google.dev/gemini-api/docs/changelog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
