<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Interactions API on KnightLi Blog</title>
        <link>https://knightli.com/en/tags/interactions-api/</link>
        <description>Recent content in Interactions API on KnightLi Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Sun, 12 Jul 2026 10:33:00 +0800</lastBuildDate><atom:link href="https://knightli.com/en/tags/interactions-api/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Gemini Interactions API Migration Guide: How to troubleshoot after changing outputs to steps</title>
        <link>https://knightli.com/en/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/en/2026/07/12/gemini-interactions-api-outputs-steps-migration-troubleshooting/</guid>
        <description>&lt;p&gt;The Gemini Interactions API has become the recommended unified interface for new projects. It represents a generation, tool call, thinking process, tool result and final reply as observable execution steps, suitable for Agents, long tasks and applications that need to display intermediate states.&lt;/p&gt;
&lt;p&gt;This also means that legacy code can no longer assume &lt;code&gt;outputs&lt;/code&gt; in the response. Starting in May 2026, the new schema will become the default; the old schema was removed on June 8. If there are empty replies, tool calls are lost, SSE events are not triggered, or historical context is broken after migration, it is usually not a model problem, but that the data is still being read according to the old structure.&lt;/p&gt;
&lt;h2 id=&#34;first-confirm-which-layer-you-are-migrating-to&#34;&gt;First confirm which layer you are migrating to
&lt;/h2&gt;&lt;p&gt;Before troubleshooting, categorize the problem first to avoid changing just one field:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Hierarchy&lt;/th&gt;
          &lt;th&gt;Old way&lt;/th&gt;
          &lt;th&gt;New way&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Final text&lt;/td&gt;
          &lt;td&gt;Traverse &lt;code&gt;outputs&lt;/code&gt; to find text&lt;/td&gt;
          &lt;td&gt;Simple scene reading &lt;code&gt;interaction.output_text&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Full response&lt;/td&gt;
          &lt;td&gt;Find content, tools, or search results in &lt;code&gt;outputs&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Traverse &lt;code&gt;interaction.steps&lt;/code&gt;, process as &lt;code&gt;type&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Tool call&lt;/td&gt;
          &lt;td&gt;Parse from old content type&lt;/td&gt;
          &lt;td&gt;Process steps such as &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;Streaming events&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;Multi-round history&lt;/td&gt;
          &lt;td&gt;Return old &lt;code&gt;outputs&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Use &lt;code&gt;previous_interaction_id&lt;/code&gt; on the server, or return &lt;code&gt;steps&lt;/code&gt; on the client&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If the SDK is still Python 1.x or JavaScript 1.x, confirm the version first. The official migration instructions require using Python ≥2.0.0 or JavaScript ≥2.0.0 to automatically adopt the new schema; but upgrading the SDK will not automatically fix the &lt;code&gt;outputs&lt;/code&gt; parser, SSE processor and front-end state machine you wrote yourself.&lt;/p&gt;
&lt;h2 id=&#34;easiest-fix-read-the-final-text-with-output_text&#34;&gt;Easiest fix: read the final text with &lt;code&gt;output_text&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;When processing only plain text questions and answers, there is no need to manually find the last text from &lt;code&gt;steps&lt;/code&gt;. The new version of the SDK provides &lt;code&gt;output_text&lt;/code&gt;, which extracts and splices consecutive text blocks at the end of the response:&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;If you leave &lt;code&gt;interaction.outputs[-1].text&lt;/code&gt; as is after migration, common results are that the property does not exist, indexing fails, or the object is incorrectly serialized into an empty string. First replace it with &lt;code&gt;interaction.output_text&lt;/code&gt;, and then add the step analysis of complex scenarios.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;output_text&lt;/code&gt; is not suitable for all responses: when text is separated by thoughts, images, audio, or tool calls, it won&amp;rsquo;t restore all interleaving content for you. When you need to show the complete execution process, you should traverse &lt;code&gt;steps&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;how-to-properly-traverse-steps&#34;&gt;How to properly traverse &lt;code&gt;steps&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;The new schema represents processes as typed steps. At a minimum, &lt;code&gt;user_input&lt;/code&gt;, &lt;code&gt;model_output&lt;/code&gt;, &lt;code&gt;function_call&lt;/code&gt;, and &lt;code&gt;function_result&lt;/code&gt; will be recognized; if using server-side tools, you will also see &lt;code&gt;google_search_call&lt;/code&gt;, &lt;code&gt;google_search_result&lt;/code&gt;, or other tool-specific steps.&lt;/p&gt;
&lt;p&gt;The following example only collects text from the final model output:&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;In real projects, don&amp;rsquo;t assume that &lt;code&gt;content&lt;/code&gt; exists for every step, and don&amp;rsquo;t treat &lt;code&gt;thought&lt;/code&gt; as the final answer. First branch according to &lt;code&gt;step.type&lt;/code&gt;, and then read the fields allowed by this type. Record unknown steps as type, ID, and status to preserve forward compatibility; don&amp;rsquo;t let the entire request fail just because a new tool step appears.&lt;/p&gt;
&lt;h2 id=&#34;why-does-the-tool-call-disappear&#34;&gt;Why does the tool call &amp;ldquo;disappear&amp;rdquo;?
&lt;/h2&gt;&lt;p&gt;Older schemas often wrap server-side tool operations in a specific content type called &lt;code&gt;outputs&lt;/code&gt;. The new schema breaks these into independent steps, so scanning only &lt;code&gt;model_output&lt;/code&gt; will not see the search, function calls, and function results.&lt;/p&gt;
&lt;p&gt;For example, the function call would read like this:&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;Server-side Google Search should also handle the call and result steps separately, rather than guessing from the final text whether a search was performed or not. For client function tools, after receiving &lt;code&gt;requires_action&lt;/code&gt;, submit the corresponding &lt;code&gt;function_result&lt;/code&gt; and continue to use the status of the interaction to complete the subsequent process.&lt;/p&gt;
&lt;h2 id=&#34;streaming-sse-events-are-migrated-together&#34;&gt;Streaming SSE events are migrated together
&lt;/h2&gt;&lt;p&gt;If you only change the REST response parsing and do not change the stream processor, the front end will usually behave as &amp;ldquo;the request is successful but the page is not updated.&amp;rdquo; The new event names are as follows:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Old events&lt;/th&gt;
          &lt;th&gt;New events&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; and other status events&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The parameters of the function call are no longer guaranteed to arrive completely at once. In the stream, &lt;code&gt;step.start&lt;/code&gt; will first give the function name, and then multiple &lt;code&gt;step.delta&lt;/code&gt; events will be delivered piece by piece with some JSON parameters. The client must accumulate parameters and parse the complete JSON after &lt;code&gt;step.stop&lt;/code&gt; or a state requiring action; do not directly &lt;code&gt;JSON.parse()&lt;/code&gt; for each 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;do-not-reply-after-multiple-rounds-of-dialogue-outputs&#34;&gt;Do not reply after multiple rounds of dialogue &lt;code&gt;outputs&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;The old stateless implementation often collects the previous round of &lt;code&gt;outputs&lt;/code&gt; and stuffs it back into the next round of &lt;code&gt;input&lt;/code&gt;. There are two clearer options after migration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Continue the same session via &lt;code&gt;previous_interaction_id&lt;/code&gt; using the default server-side state;&lt;/li&gt;
&lt;li&gt;When you must manage the history by yourself, return the previous round of &lt;code&gt;steps&lt;/code&gt; and add a new &lt;code&gt;user_input&lt;/code&gt; step.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Server-side status is more suitable for ordinary multi-round conversations; client-side status is used when strict control of saved content, cross-system migration, or offline playback is required. No matter which one you choose, do not splice the old &lt;code&gt;outputs&lt;/code&gt; and the new &lt;code&gt;steps&lt;/code&gt; at the same time, otherwise it is easy to produce duplicate contexts, tool result mismatches, or token proliferation.&lt;/p&gt;
&lt;h2 id=&#34;response_format-may-also-be-the-source-of-the-error&#34;&gt;&lt;code&gt;response_format&lt;/code&gt; may also be the source of the error
&lt;/h2&gt;&lt;p&gt;This migration not only changes the output array. Structured output and multi-modal configuration are also unified into the top-level &lt;code&gt;response_format&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The original &lt;code&gt;response_mime_type&lt;/code&gt; has been removed; specify &lt;code&gt;mime_type&lt;/code&gt; in the &lt;code&gt;response_format&lt;/code&gt; entry.&lt;/li&gt;
&lt;li&gt;The JSON schema needs to be put in a format object with &lt;code&gt;type: &amp;quot;text&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Picture configuration moved from &lt;code&gt;generation_config&lt;/code&gt; to &lt;code&gt;response_format&lt;/code&gt; entry in &lt;code&gt;type: &amp;quot;image&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Multimodal output requires an array of format entries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the interface returns 400, in addition to checking for &lt;code&gt;steps&lt;/code&gt;, the code is also searched for &lt;code&gt;response_mime_type&lt;/code&gt;, &lt;code&gt;generation_config.image_config&lt;/code&gt;, and the legacy single object &lt;code&gt;response_format&lt;/code&gt;. These old fields often appear together with the &lt;code&gt;outputs&lt;/code&gt; problem after the same upgrade.&lt;/p&gt;
&lt;h2 id=&#34;a-practical-troubleshooting-procedure&#34;&gt;A practical troubleshooting procedure
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Upgrade the Google GenAI SDK and document the actual version.&lt;/li&gt;
&lt;li&gt;Verify &lt;code&gt;interaction.output_text&lt;/code&gt; with a toolless, non-streaming minimal request.&lt;/li&gt;
&lt;li&gt;Print the type and status of &lt;code&gt;interaction.steps&lt;/code&gt; to confirm that the program has received the new schema.&lt;/li&gt;
&lt;li&gt;Migrate the parsing logic of function calls, server-side searches, and tool results respectively.&lt;/li&gt;
&lt;li&gt;Modify SSE event subscription and parameter accumulation logic.&lt;/li&gt;
&lt;li&gt;Check if the multi-round history is changed to &lt;code&gt;previous_interaction_id&lt;/code&gt; or &lt;code&gt;steps&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Search and replace old &lt;code&gt;response_format&lt;/code&gt; related fields.&lt;/li&gt;
&lt;li&gt;Run regression tests one each with text, tool calls, streaming output, and failure retries.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Don&amp;rsquo;t rely on the old &lt;code&gt;Api-Revision&lt;/code&gt; header to temporarily restore old code. The transition period for the old schema is over; migration should now be considered an official compatibility fix, rather than continuing to have two sets of inconsistent parsers.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;The essence of changing &lt;code&gt;outputs&lt;/code&gt; to &lt;code&gt;steps&lt;/code&gt; is that the Interactions API no longer crams all processes into an output list, but explicitly exposes inputs, reflections, tools, results, and final outputs. Pure text scenes preferentially use &lt;code&gt;interaction.output_text&lt;/code&gt;; Agent, tool, streaming and multi-modal scenes use &lt;code&gt;step.type&lt;/code&gt; to establish explicit branches; multi-round sessions use &lt;code&gt;previous_interaction_id&lt;/code&gt; or &lt;code&gt;steps&lt;/code&gt; instead. By migrating according to these three principles, most of the &amp;ldquo;no output&amp;rdquo;, &amp;ldquo;tool missing&amp;rdquo; and &amp;ldquo;SSE does not refresh&amp;rdquo; problems can be located.&lt;/p&gt;
&lt;p&gt;Official information:&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>
