<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Google on KnightLi Blog</title>
        <link>https://knightli.com/es/tags/google/</link>
        <description>Recent content in Google on KnightLi Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>es</language>
        <lastBuildDate>Wed, 20 May 2026 23:13:35 +0800</lastBuildDate><atom:link href="https://knightli.com/es/tags/google/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Cómo usar gratis Gemini 3.5 Flash y Gemini Omni: entradas para usuarios y desarrolladores</title>
        <link>https://knightli.com/es/2026/05/20/gemini-3-5-flash-omni-free-access/</link>
        <pubDate>Wed, 20 May 2026 23:13:35 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/20/gemini-3-5-flash-omni-free-access/</guid>
        <description>&lt;p&gt;Después de que Google lanzara Gemini 3.5 Flash y Gemini Omni, la pregunta práctica no es el benchmark, sino cómo pueden usarlos realmente los usuarios normales y los desarrolladores, qué entradas son gratuitas y cuáles son solo pruebas de bajo umbral.&lt;/p&gt;
&lt;p&gt;Resumen rápido:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Para chat, escritura, comprensión de imágenes y preguntas cotidianas: primero Gemini app.&lt;/li&gt;
&lt;li&gt;Para probar parámetros, prompts y entradas multimodales de Gemini 3.5 Flash: Google AI Studio.&lt;/li&gt;
&lt;li&gt;Para llamar a Gemini 3.5 Flash desde código: crear una API key en AI Studio.&lt;/li&gt;
&lt;li&gt;Para probarlo gratis desde la terminal: mirar Gemini CLI.&lt;/li&gt;
&lt;li&gt;Para probar la edición de video de Gemini Omni: empezar por Gemini app y Google Flow.&lt;/li&gt;
&lt;li&gt;Para producción real: no depender de cuotas gratuitas; pasar a una API de pago o Vertex AI.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nota: las cuotas gratuitas, disponibilidad regional, niveles de suscripción y menús de modelos cambian con el tiempo. Este artículo fue escrito el 20 de mayo de 2026. Antes de usarlo formalmente, conviene revisar las páginas actuales de Google.&lt;/p&gt;
&lt;h2 id=&#34;método-gratuito-1-para-gemini-35-flash-gemini-app&#34;&gt;Método gratuito 1 para Gemini 3.5 Flash: Gemini app
&lt;/h2&gt;&lt;p&gt;La entrada más sencilla es Gemini app:&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://gemini.google.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://gemini.google.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;El uso es directo:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Abrir Gemini.&lt;/li&gt;
&lt;li&gt;Iniciar sesión con una cuenta de Google.&lt;/li&gt;
&lt;li&gt;Buscar &lt;code&gt;3.5 Flash&lt;/code&gt; en el selector de modelos.&lt;/li&gt;
&lt;li&gt;Empezar a conversar.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Esta entrada es adecuada para usuarios normales. Puedes usarla para escribir, resumir, entender imágenes, analizar archivos, responder preguntas cotidianas y hacer planificación simple. Según información pública, Gemini 3.5 Flash ya está disponible para usuarios globales y puede seleccionarse desde el menú de modelos de Gemini.&lt;/p&gt;
&lt;p&gt;Los límites también son claros: los usuarios gratuitos suelen tener límites diarios de mensajes, región y funciones. Si superas el límite, tendrás que esperar a que se renueve la cuota o actualizar la suscripción.&lt;/p&gt;
&lt;h2 id=&#34;método-gratuito-2-para-gemini-35-flash-google-ai-studio&#34;&gt;Método gratuito 2 para Gemini 3.5 Flash: Google AI Studio
&lt;/h2&gt;&lt;p&gt;Si no solo quieres conversar, sino ajustar prompts, revisar parámetros o probar salida estructurada, Google AI Studio encaja mejor:&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://aistudio.google.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://aistudio.google.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Flujo básico:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Iniciar sesión en Google AI Studio.&lt;/li&gt;
&lt;li&gt;Crear un nuevo prompt.&lt;/li&gt;
&lt;li&gt;Seleccionar &lt;code&gt;gemini-3.5-flash&lt;/code&gt; en el menú de modelos.&lt;/li&gt;
&lt;li&gt;Escribir el prompt y ejecutarlo.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La ventaja de AI Studio es el mayor control. Puedes ajustar temperatura, instrucciones del sistema, salida estructurada y entrada con múltiples imágenes, y también exportar el prompt probado como código o llamada API.&lt;/p&gt;
&lt;p&gt;Para desarrolladores, AI Studio es un banco de pruebas gratuito. Ajustar primero el prompt y el formato de entrada aquí ayuda a desperdiciar menos cuota cuando pases a la integración por API.&lt;/p&gt;
&lt;h2 id=&#34;método-gratuito-3-para-gemini-35-flash-api-key-gratuita&#34;&gt;Método gratuito 3 para Gemini 3.5 Flash: API key gratuita
&lt;/h2&gt;&lt;p&gt;Lo que más interesa a los desarrolladores es la API. AI Studio permite crear una Gemini API key para llamar a &lt;code&gt;gemini-3.5-flash&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Flujo básico:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Abrir Google AI Studio.&lt;/li&gt;
&lt;li&gt;Buscar &lt;code&gt;Get API key&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Elegir o crear un proyecto.&lt;/li&gt;
&lt;li&gt;Crear una API key.&lt;/li&gt;
&lt;li&gt;Guardar la key en una variable de entorno local.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ejemplo en Python:&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-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;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;os&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;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 class=&#34;n&#34;&gt;api_key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;environ&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;GEMINI_API_KEY&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&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;response&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;models&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;generate_content&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;n&#34;&gt;contents&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Explica en tres frases para qué escenarios es adecuado Gemini 3.5 Flash.&amp;#34;&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;response&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ejemplo en Node.js:&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;GoogleGenAI&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;@google/genai&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ai&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;GoogleGenAI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;apiKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;GEMINI_API_KEY&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;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ai&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;models&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;generateContent&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;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;nx&#34;&gt;contents&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Explica en tres frases para qué escenarios es adecuado Gemini 3.5 Flash.&amp;#34;&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;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;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;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;Ejemplo con &lt;code&gt;curl&lt;/code&gt;:&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;/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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#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;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;x-goog-api-key: &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$GEMINI_API_KEY&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#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;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#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;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;contents&amp;#34;:[{&amp;#34;parts&amp;#34;:[{&amp;#34;text&amp;#34;:&amp;#34;Hello Gemini 3.5 Flash&amp;#34;}]}]}&amp;#39;&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 información pública indica que el nivel gratuito de AI Studio suele ofrecer a los modelos Gemini Flash cierta cuota diaria de solicitudes. La cifra puede cambiar según tiempo, región y estado de la cuenta. Se mencionan con frecuencia cifras como unas 1.500 solicitudes al día, límites por minuto y límites de token. No conviene fijar esos números en un plan de producción; antes de lanzar algo, revisa las páginas actuales de precios y límites de Google AI.&lt;/p&gt;
&lt;h2 id=&#34;método-gratuito-4-para-gemini-35-flash-gemini-cli&#34;&gt;Método gratuito 4 para Gemini 3.5 Flash: Gemini CLI
&lt;/h2&gt;&lt;p&gt;Si te gusta la línea de comandos, puedes mirar Gemini CLI. Sirve para scripts temporales, resúmenes de repositorios, lectura de archivos y preguntas rápidas desde la terminal.&lt;/p&gt;
&lt;p&gt;La instalación suele ser:&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;/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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install -g @google/gemini-cli
&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;Después ejecuta:&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;/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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gemini
&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 CLI encaja mejor con el uso diario de desarrolladores individuales, no con integraciones de producción. En producción conviene usar API keys, cuentas de servicio, control de permisos y formas de llamada auditables.&lt;/p&gt;
&lt;h2 id=&#34;acceso-gratuito-o-de-baja-fricción-a-gemini-omni-gemini-app-y-google-flow&#34;&gt;Acceso gratuito o de baja fricción a Gemini Omni: Gemini app y Google Flow
&lt;/h2&gt;&lt;p&gt;Gemini Omni es un modelo multimodal para creación y edición de video. Su capacidad central no es la pregunta-respuesta de texto común, sino la edición de video en múltiples turnos mediante lenguaje natural, con referencias de imagen, texto, video y audio.&lt;/p&gt;
&lt;p&gt;La página de Google DeepMind menciona estas entradas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gemini app.&lt;/li&gt;
&lt;li&gt;Google Flow.&lt;/li&gt;
&lt;li&gt;YouTube Shorts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La página también indica que se requiere una suscripción a Google AI y que las funciones varían según el nivel de suscripción y la región. Por eso, el &amp;ldquo;uso gratuito&amp;rdquo; de Gemini Omni debe entenderse con cuidado: algunas entradas podrían permitir a usuarios gratuitos ver o probar parte de la experiencia, pero la edición completa de video puede requerir suscripción, disponibilidad regional o despliegue gradual.&lt;/p&gt;
&lt;p&gt;Si solo quieres probarlo, sigue este orden:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Abre primero Gemini app y revisa si aparece Gemini Omni o una entrada relacionada con edición de video.&lt;/li&gt;
&lt;li&gt;Luego abre Google Flow: &lt;a class=&#34;link&#34; href=&#34;https://flow.google/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://flow.google/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Si creas videos cortos, observa si aparecen funciones de edición relacionadas con Omni en YouTube Shorts.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Si la entrada no aparece, normalmente no significa que hayas hecho algo mal. Puede depender de la cuenta, región, nivel de suscripción o grupo de despliegue.&lt;/p&gt;
&lt;h2 id=&#34;cómo-conviene-usar-gemini-omni&#34;&gt;Cómo conviene usar Gemini Omni
&lt;/h2&gt;&lt;p&gt;Gemini Omni es más adecuado para creadores que para chat común.&lt;/p&gt;
&lt;p&gt;Puedes probar estas direcciones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Subir o elegir un video y pedirle que cambie el estilo.&lt;/li&gt;
&lt;li&gt;Hacer que una acción concreta del video sea más exagerada.&lt;/li&gt;
&lt;li&gt;Usar una imagen de referencia para reemplazar un objeto o personaje de la escena.&lt;/li&gt;
&lt;li&gt;Modificar cámara, acción, entorno y estilo en múltiples turnos.&lt;/li&gt;
&lt;li&gt;Combinar bocetos, imágenes de referencia, audio o video en una nueva salida.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El prompt puede escribirse como una instrucción para un editor:&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;/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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Mantén sin cambios la persona y la estructura de la habitación del video original. Cambia el efecto después de tocar el espejo por ondas líquidas. El movimiento debe ser natural y la luz no debe cambiar de forma brusca.
&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 edición de múltiples turnos, no metas demasiadas solicitudes de una sola vez. Un enfoque más estable es:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cambiar primero la acción principal.&lt;/li&gt;
&lt;li&gt;Cambiar después el estilo.&lt;/li&gt;
&lt;li&gt;Ajustar luego el ángulo de cámara.&lt;/li&gt;
&lt;li&gt;Ajustar al final sonido, texto y ritmo.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Así es más fácil mantener la coherencia y ubicar en qué paso aparece un problema.&lt;/p&gt;
&lt;h2 id=&#34;errores-comunes-al-usar-opciones-gratuitas&#34;&gt;Errores comunes al usar opciones gratuitas
&lt;/h2&gt;&lt;p&gt;Primero, la cuota gratuita no es cuota de producción. Una API key gratuita sirve para pruebas, herramientas personales y prototipos, no para prometer un servicio estable.&lt;/p&gt;
&lt;p&gt;Segundo, no envíes datos sensibles a entradas gratuitas o de terceros. Esto incluye código no publicado, datos de clientes, contratos, claves, hojas financieras y documentos internos.&lt;/p&gt;
&lt;p&gt;Tercero, revisa la configuración de uso de datos. Los niveles gratuitos pueden tener políticas distintas de uso de datos; antes de usar, revisa la configuración en AI Studio o en tu cuenta de Google.&lt;/p&gt;
&lt;p&gt;Cuarto, las capacidades de video suelen estar más limitadas que las de texto. Funciones como Gemini Omni pueden depender de suscripción, región, cola, duración, resolución y políticas de seguridad de contenido.&lt;/p&gt;
&lt;p&gt;Quinto, cuidado con las &amp;ldquo;API ilimitadas gratis&amp;rdquo; de terceros. Muchas pasarelas limitan velocidad, reenvían solicitudes, registran logs o exigen métodos de pago poco transparentes. No es recomendable usarlas para tareas sensibles.&lt;/p&gt;
&lt;h2 id=&#34;qué-entrada-elegir&#34;&gt;Qué entrada elegir
&lt;/h2&gt;&lt;p&gt;Si eres usuario normal:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gemini 3.5 Flash: usa Gemini app.&lt;/li&gt;
&lt;li&gt;Gemini Omni: mira primero Gemini app y luego Google Flow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si eres creador:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usa Google Flow para probar flujos de video con Omni.&lt;/li&gt;
&lt;li&gt;Usa Gemini app para guiones, storyboards, prompts y descripciones de materiales.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si eres desarrollador:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usa AI Studio para depurar prompts.&lt;/li&gt;
&lt;li&gt;Usa una API key para integrar &lt;code&gt;gemini-3.5-flash&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Usa Gemini CLI para flujos personales en terminal.&lt;/li&gt;
&lt;li&gt;Para producción, considera Vertex AI o la API de pago.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si eres empresa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No dependas de cuotas gratuitas.&lt;/li&gt;
&lt;li&gt;Prioriza permisos, logs, auditoría, residencia de datos, cumplimiento y gestión de claves.&lt;/li&gt;
&lt;li&gt;En generación y edición de video, añade marcas de agua, revisión de contenido y procesos de derechos de autor.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;Las rutas gratuitas para Gemini 3.5 Flash son relativamente claras: Gemini app, Google AI Studio, API key de AI Studio y Gemini CLI pueden servir como entradas de bajo umbral. Es adecuado para chat, escritura, programación, prototipos de Agent y pruebas multimodales.&lt;/p&gt;
&lt;p&gt;Gemini Omni se centra en edición de video y creación multimodal. Sus entradas principales están en Gemini app, Google Flow y YouTube Shorts, pero las capacidades completas probablemente dependan más de suscripción y región. Es adecuado para que los creadores empiecen con pruebas y validación de conceptos, no para planificar desde el principio un servicio de producción estable.&lt;/p&gt;
&lt;p&gt;La estrategia más prudente es: probar primero tareas de texto y código con el nivel gratuito de Gemini 3.5 Flash; validar efectos de creación de video con Gemini Omni en Gemini app o Flow; y, cuando haya que lanzar algo real, pasar a una solución formal con auditoría, facturación y permisos controlados.&lt;/p&gt;
&lt;p&gt;Referencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://deepmind.google/models/gemini/flash/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google DeepMind: Gemini 3.5 Flash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://deepmind.google/models/gemini-omni/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google DeepMind: Gemini Omni&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://apidog.com/blog/how-to-use-gemini-3-5-for-free/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Apidog: How to Use Gemini 3.5 Flash for Free&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.freedidi.com/24249.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;enlace original de freedidi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Qué es Gemini Omni: análisis completo del modelo de Google para edición de video con IA en múltiples turnos</title>
        <link>https://knightli.com/es/2026/05/20/google-gemini-omni-video-editing/</link>
        <pubDate>Wed, 20 May 2026 23:11:58 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/20/google-gemini-omni-video-editing/</guid>
        <description>&lt;p&gt;Google DeepMind publicó la página de &lt;code&gt;Gemini Omni&lt;/code&gt;. Su posición es directa: crear contenido a partir de cualquier entrada, con el foco inicial puesto en el video.&lt;/p&gt;
&lt;p&gt;Si Nano Banana está más orientado a la generación y edición de imágenes, Gemini Omni se parece más a un modelo de edición multimodal para video. Los usuarios pueden modificar un video paso a paso con lenguaje natural, haciendo que cada cambio posterior se base en el anterior, mientras intenta mantener la coherencia de escenas, personas, acciones y lógica visual.&lt;/p&gt;
&lt;p&gt;Página del proyecto: &lt;a class=&#34;link&#34; href=&#34;https://deepmind.google/models/gemini-omni/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://deepmind.google/models/gemini-omni/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;el-problema-central-que-intenta-resolver&#34;&gt;El problema central que intenta resolver
&lt;/h2&gt;&lt;p&gt;La edición de video tradicional suele requerir líneas de tiempo, capas, máscaras, fotogramas clave, corrección de color, pistas de audio y mucho trabajo manual. Las herramientas de generación de video con IA ya pueden crear clips desde prompts, pero suelen tener dos problemas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Después de una generación inicial, no es fácil hacer ajustes precisos.&lt;/li&gt;
&lt;li&gt;En ediciones de múltiples turnos, los personajes, escenas, estilos y movimientos pueden desviarse.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gemini Omni apunta al segundo paso: no solo generar un video, sino permitir que el usuario siga pidiendo cambios como si hablara con un editor.&lt;/p&gt;
&lt;p&gt;La página lo describe como una forma de editar cualquier video mediante una conversación natural y por pasos. Cada edición se basa en el resultado anterior, con el objetivo de mantener una escena coherente y unificada.&lt;/p&gt;
&lt;h2 id=&#34;capacidades-principales&#34;&gt;Capacidades principales
&lt;/h2&gt;&lt;p&gt;Las capacidades de Gemini Omni se pueden agrupar en varias áreas.&lt;/p&gt;
&lt;p&gt;La primera es la edición de video con lenguaje natural. El usuario puede pedir directamente al modelo que cambie el estilo visual, el movimiento o los efectos de un video. Por ejemplo, puede hacer que un espejo ondule como líquido, convertir a una persona en dibujo lineal, muñeco de fieltro o estructura holográfica transparente, o transformar todo el entorno en 3D voxel art.&lt;/p&gt;
&lt;p&gt;La segunda es la reconstrucción de acciones. Puede cambiar lo que ocurre en un video, como agrandar el agujero formado por una mano, hacer que un juguete emita el sonido del animal correspondiente o lograr que las luces de un edificio reaccionen a la música.&lt;/p&gt;
&lt;p&gt;La tercera es la edición de video real basada en imágenes de referencia. El usuario puede proporcionar una imagen de referencia y pedir al modelo que coloque un edificio, un sol, una aeronave u otro objeto dentro de una escena de video real.&lt;/p&gt;
&lt;p&gt;La cuarta es mantener la coherencia en ediciones de múltiples turnos. La página muestra un flujo continuo: mover a una violinista a un entorno de referencia, hacer desaparecer el violín y después cambiar la cámara a un ángulo sobre el hombro. Esto se acerca más a un proceso creativo real que a un prompt de una sola vez.&lt;/p&gt;
&lt;p&gt;La quinta es la referencia con múltiples entradas. Gemini Omni puede integrar imagen, texto, video y audio en una sola salida, con soporte para transferencia de estilo, transferencia de movimiento, reemplazo de personajes y conversión de bocetos a video.&lt;/p&gt;
&lt;h2 id=&#34;por-qué-enfatiza-el-conocimiento-del-mundo&#34;&gt;Por qué enfatiza el conocimiento del mundo
&lt;/h2&gt;&lt;p&gt;Google subraya varias veces que Gemini Omni no solo busca que las imágenes se vean reales. También combina el conocimiento del mundo de Gemini, intuición física, historia, ciencia y lógica narrativa.&lt;/p&gt;
&lt;p&gt;Esto es importante. Si un modelo de video solo optimiza la calidad visual, puede producir movimientos ilógicos, relaciones confusas entre objetos o falta de sincronía entre texto e imagen. El objetivo de Gemini Omni es que el video no solo parezca correcto, sino que también sea más coherente en historia, física y significado.&lt;/p&gt;
&lt;p&gt;Algunos ejemplos de la página son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Una canica rodando por una pista de reacción en cadena.&lt;/li&gt;
&lt;li&gt;Una explicación de plegamiento de proteínas con claymation.&lt;/li&gt;
&lt;li&gt;Una explicación estilo stop motion de cómo funciona el hipocampo.&lt;/li&gt;
&lt;li&gt;Letras que aparecen asociadas a objetos dentro de la escena.&lt;/li&gt;
&lt;li&gt;Palabras en pantalla que aparecen una por una siguiendo el ritmo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estos ejemplos muestran que no es solo una herramienta de efectos para videos cortos. Intenta unir expresión de conocimiento, narrativa y generación audiovisual.&lt;/p&gt;
&lt;h2 id=&#34;relación-con-veo-flow-y-nano-banana&#34;&gt;Relación con Veo, Flow y Nano Banana
&lt;/h2&gt;&lt;p&gt;Dentro de la línea actual de productos de Google, Gemini Omni parece una capa de creación y edición multimodal.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Veo&lt;/code&gt; está más centrado en el modelo de generación de video en sí, con énfasis en video cinematográfico y generación de audio. &lt;code&gt;Google Flow&lt;/code&gt; es un estudio creativo con IA para creadores, útil para organizar tomas, materiales y proyectos de video. &lt;code&gt;Nano Banana&lt;/code&gt; se orienta más a creación de imágenes y edición detallada. Gemini Omni, en cambio, enfatiza la edición multimodal desde cualquier entrada hacia una salida coherente, especialmente el control de video en múltiples turnos mediante lenguaje natural.&lt;/p&gt;
&lt;p&gt;Una forma simple de verlo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Para generar video de alta calidad: mirar Veo.&lt;/li&gt;
&lt;li&gt;Para organizar proyectos de video dentro de un flujo creativo: mirar Google Flow.&lt;/li&gt;
&lt;li&gt;Para editar imágenes: mirar Nano Banana.&lt;/li&gt;
&lt;li&gt;Para modificar video de forma conversacional usando imágenes, texto, video y audio como referencia: mirar Gemini Omni.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;formas-de-acceso&#34;&gt;Formas de acceso
&lt;/h2&gt;&lt;p&gt;La página menciona estos puntos de acceso:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gemini app.&lt;/li&gt;
&lt;li&gt;Google Flow.&lt;/li&gt;
&lt;li&gt;YouTube Shorts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sin embargo, también indica que se requiere una suscripción a Google AI, y que las funciones varían según el nivel de suscripción y la región. Es decir, no todos los usuarios de todas las regiones podrán usar de inmediato todas las capacidades.&lt;/p&gt;
&lt;p&gt;Para creadores, la entrada más interesante probablemente sea Google Flow, porque está más cerca de un espacio creativo completo. Para usuarios generales, Gemini app y YouTube Shorts pueden ser formas más sencillas de probarlo.&lt;/p&gt;
&lt;h2 id=&#34;seguridad-y-etiquetado-de-contenido&#34;&gt;Seguridad y etiquetado de contenido
&lt;/h2&gt;&lt;p&gt;La página de Gemini Omni dedica una sección al proceso de seguridad. El desarrollo de Gemini Omni Flash se realizó en colaboración con equipos internos de seguridad y responsabilidad, e incluyó evaluaciones automatizadas, evaluaciones humanas, red teaming humano, red teaming automatizado y revisión ética y de seguridad antes del lanzamiento.&lt;/p&gt;
&lt;p&gt;En transparencia de contenido, la página señala que el contenido creado o editado con Omni en Gemini app, Google Flow o YouTube incluirá marcas de agua digitales imperceptibles &lt;code&gt;SynthID&lt;/code&gt; y &lt;code&gt;C2PA Content Credentials&lt;/code&gt;. Los usuarios podrán verificar contenido desde Gemini app, con expansión posterior a Chrome y Search.&lt;/p&gt;
&lt;p&gt;Esto es especialmente relevante para modelos de video. Cuanto más realistas sean la generación y edición de video, más importantes serán el etiquetado de origen, la prevención de abuso y las herramientas de verificación.&lt;/p&gt;
&lt;h2 id=&#34;para-quién-sirve&#34;&gt;Para quién sirve
&lt;/h2&gt;&lt;p&gt;Gemini Omni encaja con varios tipos de usuarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creadores de contenido que quieren modificar video rápidamente con lenguaje natural.&lt;/li&gt;
&lt;li&gt;Equipos de diseño que necesitan combinar bocetos, imágenes de referencia, audio y material de video en una pieza final.&lt;/li&gt;
&lt;li&gt;Personas que crean videos cortos, conceptos publicitarios, explicadores educativos y borradores visuales de producto.&lt;/li&gt;
&lt;li&gt;Creadores que quieren construir flujos de trabajo de video con IA en Google Flow.&lt;/li&gt;
&lt;li&gt;Desarrolladores e investigadores que siguen los límites de la edición de video multimodal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pero no sirve para todos los escenarios. Películas comerciales serias, visuales principales de marca, producción audiovisual y videos de lanzamiento de producto siguen requiriendo revisión humana, control de derechos, verificación de hechos y gestión de materiales. La IA puede acelerar claramente la generación de conceptos y la iteración del primer borrador, pero no debe reemplazar la revisión final.&lt;/p&gt;
&lt;h2 id=&#34;cómo-interpretar-gemini-omni&#34;&gt;Cómo interpretar Gemini Omni
&lt;/h2&gt;&lt;p&gt;La importancia de Gemini Omni está en que mueve el video con IA desde la &amp;ldquo;generación de una sola vez&amp;rdquo; hacia la &amp;ldquo;edición conversacional&amp;rdquo;. Eso se acerca más al proceso creativo real que simplemente mejorar la calidad de imagen.&lt;/p&gt;
&lt;p&gt;Si funciona de manera estable en edición de múltiples turnos, consistencia, control de referencias, sincronización de audio y video, y etiquetado de contenido, la forma de usar herramientas de video con IA cambiará. Los usuarios ya no escribirán solo un prompt largo esperando acertar; revisarán escenas, acciones, estilos y narrativas paso a paso como directores, editores y diseñadores.&lt;/p&gt;
&lt;p&gt;Todavía habrá que observar disponibilidad real, precio, restricciones regionales, duración generable, resolución, política de derechos y reglas de uso comercial. Para creadores comunes, el punto más práctico será comprobar si Gemini Omni puede completar de forma estable ediciones de video en múltiples turnos dentro de Google Flow y Gemini app.&lt;/p&gt;
&lt;p&gt;Referencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://deepmind.google/models/gemini-omni/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google DeepMind: Gemini Omni&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Gemini 3.5 ya está aquí: Flash llega primero y Google pone el foco en agentes y tareas largas</title>
        <link>https://knightli.com/es/2026/05/20/google-gemini-3-5-flash-agent-coding/</link>
        <pubDate>Wed, 20 May 2026 22:51:31 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/20/google-gemini-3-5-flash-agent-coding/</guid>
        <description>&lt;p&gt;Google lanzó oficialmente la serie Gemini 3.5 el 20 de mayo de 2026. El primer modelo disponible es Gemini 3.5 Flash. Su posicionamiento no es solo chat, sino agentes, generación de código y ejecución de tareas complejas de larga duración.&lt;/p&gt;
&lt;p&gt;El mensaje de esta presentación es claro: Google quiere que Gemini 3.5 no solo responda preguntas, sino que también planifique, ejecute, compruebe resultados y mantenga el avance en flujos de trabajo de varios pasos.&lt;/p&gt;
&lt;h2 id=&#34;gemini-35-flash-llega-primero&#34;&gt;Gemini 3.5 Flash llega primero
&lt;/h2&gt;&lt;p&gt;Gemini 3.5 Flash ya está disponible para varios tipos de usuarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Los usuarios generales pueden probarlo en la app Gemini y en AI Mode de Google Search.&lt;/li&gt;
&lt;li&gt;Los desarrolladores pueden usarlo mediante Google Antigravity, Google AI Studio y la Gemini API en Android Studio.&lt;/li&gt;
&lt;li&gt;Los usuarios empresariales pueden acceder a él mediante Gemini Enterprise Agent Platform y Gemini Enterprise.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google también dijo que Gemini 3.5 Pro sigue en desarrollo, ya se usa internamente en Google y se espera para el próximo mes.&lt;/p&gt;
&lt;p&gt;Esto indica que la serie 3.5 mantiene la división entre Flash y Pro: Flash enfatiza velocidad, costo y ejecución a escala, mientras que Pro probablemente apuntará a escenarios más complejos y con mayores requisitos de capacidad.&lt;/p&gt;
&lt;h2 id=&#34;el-foco-está-en-agentes-y-código&#34;&gt;El foco está en agentes y código
&lt;/h2&gt;&lt;p&gt;Google describe Gemini 3.5 Flash como uno de sus modelos más fuertes para agentes y programación. El anuncio afirma que supera algunos resultados de Gemini 3.1 Pro en benchmarks de código y agentes como Terminal-Bench 2.1, GDPval-AA, MCP Atlas y CharXiv Reasoning.&lt;/p&gt;
&lt;p&gt;La mayoría de usuarios no necesita obsesionarse con cada número. Lo más importante es que Google está llevando la capacidad del modelo hacia flujos ejecutables: no solo escribir código, sino migrar proyectos antiguos, desarrollar aplicaciones complejas, organizar reportes financieros, analizar datos y ejecutar pruebas repetidas.&lt;/p&gt;
&lt;p&gt;Dentro del framework de desarrollo Antigravity, Gemini 3.5 Flash puede usar varios subagents colaborativos para manejar tareas grandes. Google mostró ejemplos como analizar el paper de AlphaZero y crear un juego jugable, convertir código legacy a Next.js y generar paisajes urbanos y opciones de UI en paralelo.&lt;/p&gt;
&lt;p&gt;La dirección es clara: las herramientas de programación con IA están pasando de &amp;ldquo;generar un fragmento de código&amp;rdquo; a &amp;ldquo;coordinar varios agentes para completar un proyecto&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;ui-multimodal-y-gráficos-más-potentes&#34;&gt;UI multimodal y gráficos más potentes
&lt;/h2&gt;&lt;p&gt;Gemini 3.5 Flash se apoya en la base multimodal de Gemini 3. Google dice que puede generar interfaces web más ricas, animaciones interactivas y contenido visual.&lt;/p&gt;
&lt;p&gt;El anuncio incluye ejemplos como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crear animaciones interactivas para papers de investigación.&lt;/li&gt;
&lt;li&gt;Convertir descripciones de texto en modelos de hardware interactivos.&lt;/li&gt;
&lt;li&gt;Generar un concepto completo de marca para una campaña escolar de recaudación.&lt;/li&gt;
&lt;li&gt;Producir varias opciones de UX para un flujo de checkout en poco tiempo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto importa para desarrolladores y equipos de producto. El modelo ya no solo escribe explicaciones. También puede participar en prototipos frontend, diseño de interacción y visualización.&lt;/p&gt;
&lt;h2 id=&#34;uso-empresarial-automatizar-flujos-que-consumen-tiempo&#34;&gt;Uso empresarial: automatizar flujos que consumen tiempo
&lt;/h2&gt;&lt;p&gt;Google citó varios ejemplos de socios. Shopify usa subagents para analizar datos complejos y predecir crecimiento de comerciantes. Macquarie Bank prueba 3.5 Flash con documentos de más de 100 páginas para acelerar la apertura de cuentas. Salesforce lo integra en Agentforce. Ramp lo usa para mejorar OCR en facturas complejas. Xero usa agentes de IA para procesos administrativos. Databricks usa flujos automatizados para monitorear anomalías de datos y sugerir correcciones.&lt;/p&gt;
&lt;p&gt;Estos casos apuntan a la misma tendencia: la adopción empresarial de modelos grandes se está moviendo de preguntas puntuales a automatización de procesos. Que un modelo sea barato, rápido y estable en tareas largas puede importar más que una respuesta aislada muy llamativa.&lt;/p&gt;
&lt;h2 id=&#34;gemini-spark-un-agente-personal-de-ia&#34;&gt;Gemini Spark: un agente personal de IA
&lt;/h2&gt;&lt;p&gt;Google también anunció Gemini Spark, un agente personal de IA impulsado por Gemini 3.5 Flash. Su objetivo es ejecutarse durante largos periodos y realizar tareas de forma proactiva bajo la guía del usuario.&lt;/p&gt;
&lt;p&gt;Gemini Spark ya empezó a desplegarse para testers de confianza. Google planea abrir una beta la próxima semana para suscriptores de Google AI Ultra en Estados Unidos.&lt;/p&gt;
&lt;p&gt;Vale la pena seguir esta parte. Google Search, la app Gemini, Android, Workspace y el ecosistema del navegador ya están presentes en muchas áreas de la vida digital personal. Si un agente personal puede conectarse con estas entradas, su impacto puede ser mayor que el de un chatbot aislado.&lt;/p&gt;
&lt;h2 id=&#34;la-seguridad-se-mueve-más-arriba-en-el-proceso&#34;&gt;La seguridad se mueve más arriba en el proceso
&lt;/h2&gt;&lt;p&gt;Google dice que Gemini 3.5 fue desarrollado bajo su Frontier Safety Framework, con protecciones reforzadas para seguridad de la información y riesgos CBRN. El anuncio también menciona herramientas de interpretabilidad para ayudar a examinar y entender el razonamiento del modelo antes de entregar respuestas.&lt;/p&gt;
&lt;p&gt;Esto muestra que los lanzamientos de modelos frontera ya no son solo una competencia de capacidad. Cuanto más se enfatizan agentes, ejecución autónoma y tareas largas, más importantes se vuelven los controles de seguridad, la tasa de rechazos erróneos, la prevención de salidas dañinas y la interpretabilidad.&lt;/p&gt;
&lt;h2 id=&#34;cómo-mirar-gemini-35&#34;&gt;Cómo mirar Gemini 3.5
&lt;/h2&gt;&lt;p&gt;Gemini 3.5 Flash no es solo otro lanzamiento de modelo. Parece más bien la apuesta de Google por la siguiente forma de los productos de IA: modelos que llaman herramientas, dividen tareas, coordinan ejecución, generan UI y entran en flujos personales y empresariales.&lt;/p&gt;
&lt;p&gt;Para desarrolladores, lo importante será la experiencia real en Google Antigravity, AI Studio, Gemini API y Android Studio. Para empresas, la pregunta es si puede reducir trabajo manual de forma estable en flujos reales, no solo sacar buenos resultados en benchmarks.&lt;/p&gt;
&lt;p&gt;Gemini 3.5 Pro todavía no está disponible públicamente. Cuando Pro llegue, las diferencias entre Flash y Pro en capacidad, precio, velocidad y manejo de contexto determinarán para qué escenarios de producción conviene cada uno.&lt;/p&gt;
&lt;p&gt;Referencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.google/intl/zh-tw/products/explore-get-answers/gemini-3-5/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Blog: Gemini 3.5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Filtración de Google Gemini Spark: podría llegar un Gemini Agent online las 24 horas</title>
        <link>https://knightli.com/es/2026/05/17/google-gemini-spark-ai-agent-leak/</link>
        <pubDate>Sun, 17 May 2026 11:58:08 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/17/google-gemini-spark-ai-agent-leak/</guid>
        <description>&lt;p&gt;Google todavía no ha lanzado oficialmente &lt;code&gt;Gemini Spark&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La información actual proviene sobre todo de interfaces internas de prueba en Gemini Web, capturas de la comunidad, reportes de TestingCatalog y resúmenes de 36Kr / Xinzhiyuan sobre filtraciones relacionadas. La lectura más consistente es que &lt;code&gt;Gemini Spark BETA&lt;/code&gt; podría ser un AI Agent always-on que Google está preparando. Su posición ya no sería solo la de un asistente de chat, sino la de un &amp;ldquo;agente de IA cotidiano&amp;rdquo; capaz de manejar correo, tareas online y flujos de varios pasos en segundo plano.&lt;/p&gt;
&lt;p&gt;Así que conviene fijar primero el límite: esto es un análisis de filtraciones, no un anuncio oficial de Google. Funciones, nombre y fecha de lanzamiento aún deben ser confirmados por Google.&lt;/p&gt;
&lt;h2 id=&#34;conclusión-rápida&#34;&gt;Conclusión rápida
&lt;/h2&gt;&lt;p&gt;Según la información expuesta hasta ahora, Gemini Spark tiene tres puntos clave:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Podría ser un Agent online las 24 horas dentro del sistema Gemini, no un modelo de chat normal.&lt;/li&gt;
&lt;li&gt;Podría usar un contexto personal más amplio, incluyendo apps de Google, historial de chats, tareas, sitios con sesión iniciada y ubicación.&lt;/li&gt;
&lt;li&gt;Sus riesgos son tan grandes como su atractivo, porque puede involucrar compartir información, datos de navegador remoto, compras y llamadas a servicios de terceros.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Si Google realmente lanza Spark, el papel de Gemini cambiará: de &amp;ldquo;IA que responde preguntas&amp;rdquo; a &amp;ldquo;IA que gestiona tareas por ti de forma continua&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;qué-es-gemini-spark&#34;&gt;Qué es Gemini Spark
&lt;/h2&gt;&lt;p&gt;TestingCatalog reportó el 14 de mayo de 2026 que Google está probando &lt;code&gt;Gemini Spark BETA&lt;/code&gt; dentro de Gemini Web. El texto de bienvenida expuesto lo describe como un everyday AI agent que puede ayudar 24/7 con inbox, online tasks y más trabajo de varios pasos.&lt;/p&gt;
&lt;p&gt;El artículo de 36Kr / Xinzhiyuan también menciona que, tras descubrirse Spark, lo que se ve desde fuera es una dirección de &amp;ldquo;Agent de tiempo completo&amp;rdquo;: puede permanecer disponible todo el día, procesar la bandeja de entrada, ejecutar tareas online e incluso involucrar compras y compartición de información.&lt;/p&gt;
&lt;p&gt;Esto significa que Spark no es simplemente el nombre de un nuevo modelo. Se parece más a una actualización de la capa de producto de Gemini: sacar a Gemini de la ventana de conversación y llevarlo al correo, la web, el calendario, las tareas y los flujos entre apps del usuario.&lt;/p&gt;
&lt;h2 id=&#34;cómo-podría-funcionar&#34;&gt;Cómo podría funcionar
&lt;/h2&gt;&lt;p&gt;Según el texto de onboarding oculto divulgado por TestingCatalog, Gemini Spark obtendría contexto de varias fuentes, incluyendo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connected Apps.&lt;/li&gt;
&lt;li&gt;skills.&lt;/li&gt;
&lt;li&gt;chats.&lt;/li&gt;
&lt;li&gt;tasks.&lt;/li&gt;
&lt;li&gt;Sitios web donde el usuario inició sesión.&lt;/li&gt;
&lt;li&gt;Personal intelligence.&lt;/li&gt;
&lt;li&gt;location.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esta información ayudaría a Spark a entender qué quiere completar el usuario y a invocar el contexto necesario durante la ejecución de tareas. El texto también menciona que, para completar algunas acciones, Gemini podría compartir información necesaria con terceros, como nombre, datos de contacto, archivos, preferencias e información que el usuario podría considerar sensible.&lt;/p&gt;
&lt;p&gt;Si estas descripciones terminan siendo correctas, Spark funcionaría más como un sistema de agente con contexto que como una herramienta de preguntas y respuestas de una sola vez. No miraría solo el prompt actual, sino que podría combinar preferencias a largo plazo, apps conectadas, estado del navegador e historial de tareas.&lt;/p&gt;
&lt;h2 id=&#34;por-qué-importa&#34;&gt;Por qué importa
&lt;/h2&gt;&lt;p&gt;La clave de Gemini Spark no es añadir otra entrada de chat. La clave es que Google tiene una entrada natural al ecosistema.&lt;/p&gt;
&lt;p&gt;OpenAI y Anthropic pueden construir Agents muy fuertes, pero no poseen de forma natural la cadena completa de Gmail, Calendar, Drive, Chrome, Android y Workspace. Si Google conecta Spark con estos productos, los usuarios no necesitarán montar demasiados flujos adicionales para que un Agent entre en su trabajo diario.&lt;/p&gt;
&lt;p&gt;Esto puede traer tres cambios.&lt;/p&gt;
&lt;p&gt;Primero, Gemini pasaría de preguntas y respuestas pasivas a ejecución activa. Los usuarios ya no solo preguntarían &amp;ldquo;resúmeme este correo&amp;rdquo;, sino que podrían pedirle que organice el inbox, siga tareas y ejecute acciones posteriores de forma continua.&lt;/p&gt;
&lt;p&gt;Segundo, los Agents dependerán más del contexto personal. Cuanto más entienda tu correo, calendario, archivos, estado del navegador y preferencias, más útiles podrán ser sus resultados.&lt;/p&gt;
&lt;p&gt;Tercero, los límites de permisos serán más sensibles. Poder hacer más también significa que el usuario debe saber con más claridad cuándo puede actuar, hasta dónde puede llegar y si necesita confirmación.&lt;/p&gt;
&lt;h2 id=&#34;dónde-están-los-riesgos&#34;&gt;Dónde están los riesgos
&lt;/h2&gt;&lt;p&gt;Hay varios puntos en el texto divulgado por TestingCatalog que merecen atención.&lt;/p&gt;
&lt;p&gt;Primero, Spark es experimental. Incluso si se lanza, no debería tratarse como un sistema completamente maduro que no requiere supervisión.&lt;/p&gt;
&lt;p&gt;Segundo, aunque el sistema está diseñado para pedir permiso antes de operaciones sensibles, el texto también advierte que podría compartir información o completar compras sin preguntar.&lt;/p&gt;
&lt;p&gt;Tercero, para mantener la continuidad de la sesión, Gemini guardará remote browser data, como detalles de inicio de sesión y remote code execution data. Los usuarios pueden borrar estos datos en Settings y también desactivar Connected Apps y capacidades relacionadas con Personal intelligence.&lt;/p&gt;
&lt;p&gt;En conjunto, estos puntos muestran que la dirección de producto de Spark es agresiva: quiere ser un Agent que realmente ejecute tareas, no solo que genere sugerencias. Pero cuanto más se acerca a la ejecución real, más necesita permisos estrictos, auditoría, confirmación y mecanismos de reversión.&lt;/p&gt;
&lt;h2 id=&#34;relación-con-remy-y-ai-ultra&#34;&gt;Relación con Remy y AI Ultra
&lt;/h2&gt;&lt;p&gt;TestingCatalog menciona que Spark podría ser una versión renombrada de la agentic Gemini upgrade antes conocida internamente como &lt;code&gt;Remy&lt;/code&gt;, y que también podría estar relacionada con la dirección de Gemini Agent para suscriptores de Google AI Ultra.&lt;/p&gt;
&lt;p&gt;Si esta pista es correcta, Spark no sería un proyecto nuevo surgido de la nada. Podría ser una forma de reempaquetar capacidades de Agent más avanzadas y cerradas, para prepararlas para una audiencia más amplia.&lt;/p&gt;
&lt;p&gt;36Kr / Xinzhiyuan también lo describe como una evolución de “Remy” a “Spark”: Gemini Agent deja de ser solo una función y se mueve hacia un gestor digital de vida 24/7.&lt;/p&gt;
&lt;p&gt;Pero esto sigue siendo una interpretación basada en filtraciones. Si Google usará &lt;code&gt;Spark&lt;/code&gt; como nombre oficial, si será solo para AI Ultra o si habrá una suscripción más ligera todavía necesita confirmación oficial.&lt;/p&gt;
&lt;h2 id=&#34;mcp-skills-y-ecosistema-de-herramientas&#34;&gt;MCP, skills y ecosistema de herramientas
&lt;/h2&gt;&lt;p&gt;En la misma tanda de capturas comunitarias también aparecieron entradas del selector de modelos como &lt;code&gt;MCP Tool Testing&lt;/code&gt;. El artículo de 36Kr cree que esto podría sugerir soporte nativo de Gemini para integración de herramientas de terceros vía MCP, además de una reconstrucción del modo Thinking.&lt;/p&gt;
&lt;p&gt;Esta pista se vuelve más interesante al mirarla junto a Spark.&lt;/p&gt;
&lt;p&gt;Si Spark fuera solo un &amp;ldquo;asistente que chatea&amp;rdquo;, skills y MCP tendrían menos importancia. Pero si Spark es un Agent de larga duración, necesita llamar herramientas de forma fiable, acceder a páginas web, ejecutar tareas, leer y escribir contexto, y entregar resultados al usuario.&lt;/p&gt;
&lt;p&gt;Es decir, Spark quizá no sea una función aislada, sino parte del ecosistema de herramientas Agent de Google: el modelo entiende y planifica, mientras skills / MCP / connected apps ejecutan y amplían.&lt;/p&gt;
&lt;h2 id=&#34;qué-significa-para-usuarios-comunes&#34;&gt;Qué significa para usuarios comunes
&lt;/h2&gt;&lt;p&gt;Si Gemini Spark se lanza de verdad, los cambios más directos para usuarios comunes podrían ser:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El correo no solo se resume, sino que se clasifica, se sigue y se convierte en tareas.&lt;/li&gt;
&lt;li&gt;Las tareas web no solo reciben sugerencias, sino que podrían ejecutarse de forma continua en un navegador remoto.&lt;/li&gt;
&lt;li&gt;Calendario, ubicación, preferencias y conversaciones previas se convierten en contexto a largo plazo del Agent.&lt;/li&gt;
&lt;li&gt;Compras, reservas, formularios y acciones similares podrían entrar en el alcance de ejecución de la IA.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Suena cómodo, pero los usuarios tendrán que crear nuevos hábitos: no solo mirar qué dice la IA, sino también qué se prepara para hacer, qué ya hizo, si se puede deshacer y si hay registro.&lt;/p&gt;
&lt;p&gt;La experiencia futura de AI Agent no dependerá solo de qué tan inteligente sea el modelo, sino también de si los avisos de permisos son claros, si los logs de tareas se pueden revisar y si los errores se pueden recuperar.&lt;/p&gt;
&lt;h2 id=&#34;qué-significa-para-desarrolladores-y-equipos&#34;&gt;Qué significa para desarrolladores y equipos
&lt;/h2&gt;&lt;p&gt;Para desarrolladores, Spark importa porque Google podría estar moviendo los Agents desde &amp;ldquo;productos demo&amp;rdquo; hacia plataformas reales de workflow.&lt;/p&gt;
&lt;p&gt;Si Spark puede conectar de forma estable apps de Google, herramientas de terceros y estado del navegador, los desarrolladores se preguntarán:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si habrá APIs o mecanismos de extensión abiertos.&lt;/li&gt;
&lt;li&gt;Si MCP o skills podrán ser conectados por terceros.&lt;/li&gt;
&lt;li&gt;Si administradores empresariales podrán controlar permisos, retención de datos y auditoría.&lt;/li&gt;
&lt;li&gt;Si los fallos de ejecución del Agent tendrán logs rastreables.&lt;/li&gt;
&lt;li&gt;Si habrá sandboxing, flujos de aprobación y confirmación para operaciones sensibles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para equipos, Spark probablemente entraría primero por escenarios frecuentes como Gmail, Calendar, Docs, Drive y Chrome. Quizá al principio no sea adecuado para automatizar por completo tareas de alto riesgo, pero encaja bien como asistente para inbox triage, seguimiento de reuniones, organización de documentos, investigación de mercado y tareas ligeras de operaciones.&lt;/p&gt;
&lt;h2 id=&#34;cómo-leerlo-ahora&#34;&gt;Cómo leerlo ahora
&lt;/h2&gt;&lt;p&gt;Esta noticia se entiende mejor como &amp;ldquo;dirección de alta confianza, detalles de baja certeza&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;La dirección de alta confianza es que Google está empujando Gemini Agent hacia algo más proactivo, más duradero y más profundamente integrado con su ecosistema. El texto de prueba de Gemini Web reportado por TestingCatalog, las capturas comunitarias y la recopilación de filtraciones de 36Kr apuntan en la misma dirección.&lt;/p&gt;
&lt;p&gt;Los detalles de baja certeza son el nombre oficial, la fecha de lanzamiento, las reglas de permisos, los niveles de suscripción, las regiones disponibles, si habrá API abierta y si realmente se llamará Gemini Spark.&lt;/p&gt;
&lt;p&gt;La lectura más prudente por ahora:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No tratar Spark como un producto oficial ya lanzado.&lt;/li&gt;
&lt;li&gt;Verlo como una señal fuerte de la próxima ruta de Google en AI Agents.&lt;/li&gt;
&lt;li&gt;Esperar cómo Google explicará permisos, privacidad, compartición de datos con terceros y almacenamiento de datos de navegador remoto.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;Si &lt;code&gt;Gemini Spark&lt;/code&gt; finalmente se lanza, podría ser un paso clave para que Gemini pase de asistente de chat a Agent always-on. No es solo cambiar un modelo, sino colocar Gemini dentro del ecosistema de Google: correo, web, tareas, ubicación, personal intelligence y servicios de terceros.&lt;/p&gt;
&lt;p&gt;Su potencial es grande: más proactivo, más cercano a flujos reales y más fácil de distribuir a muchos usuarios gracias al ecosistema de Google. Sus riesgos son igual de grandes: si la IA puede compartir información, guardar estado del navegador, ejecutar compras y llamar servicios de terceros, los límites de permisos deben ser muy claros.&lt;/p&gt;
&lt;p&gt;Por eso lo más importante de Gemini Spark no es &amp;ldquo;qué tan inteligente es&amp;rdquo;, sino cómo piensa Google hacer que un AI Agent online las 24 horas sea controlable, auditable y confiable.&lt;/p&gt;
&lt;p&gt;Referencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.testingcatalog.com/google-prepares-gemini-spark-ai-agent-ahead-of-i-o-launch/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;TestingCatalog: Google prepares Gemini Spark AI Agent ahead of I/O launch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://36kr.com/p/3810432812162816&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;36Kr: Gemini 3.5 Pro filtrado, coding supuestamente alcanza a GPT-5.5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Filtración de Gemini 3.5 Pro: con nombre en clave Cappuccino, Google intenta recuperar ritmo en coding y agentes</title>
        <link>https://knightli.com/es/2026/05/17/gemini-35-pro-cappuccino-spark-leak/</link>
        <pubDate>Sun, 17 May 2026 11:47:27 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/17/gemini-35-pro-cappuccino-spark-leak/</guid>
        <description>&lt;p&gt;Google todavía no ha lanzado oficialmente &lt;code&gt;Gemini 3.5 Pro&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La información disponible por ahora proviene sobre todo de capturas de comunidades de desarrolladores, benchmarks anónimos, filtradores y reportes de medios. El 15 de mayo de 2026, 36Kr / Xinzhiyuan publicó que un checkpoint de la próxima generación de Gemini podría tener el nombre interno &lt;code&gt;Cappuccino&lt;/code&gt;, y que modelos relacionados ya habrían aparecido en comunidades y plataformas de evaluación.&lt;/p&gt;
&lt;p&gt;Esta información no debe tratarse como un lanzamiento oficial, pero sí muestra una dirección clara: Google intenta cubrir dos brechas a la vez, coding y razonamiento por un lado, y agentes de IA always-on por el otro.&lt;/p&gt;
&lt;h2 id=&#34;conclusión-rápida&#34;&gt;Conclusión rápida
&lt;/h2&gt;&lt;p&gt;Esta filtración puede leerse en tres capas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Gemini 3.5 Pro&lt;/code&gt; aún no ha sido lanzado oficialmente, y &lt;code&gt;Cappuccino&lt;/code&gt; parece más un checkpoint interno o una build candidata.&lt;/li&gt;
&lt;li&gt;La información filtrada sugiere que el nuevo Gemini mejora en generación de código, generación SVG / web interactiva y salida multimodal.&lt;/li&gt;
&lt;li&gt;La prueba paralela de &lt;code&gt;Gemini Spark&lt;/code&gt; por parte de Google puede ser más importante que el modelo en sí, porque apunta a un agente personal de IA funcionando 24 horas.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En otras palabras, no es solo una historia de benchmarks. Parece más una señal de roadmap antes de Google I/O: el modelo necesita alcanzar a GPT-5.5, mientras la capa de agentes necesita capturar flujos de trabajo de usuarios.&lt;/p&gt;
&lt;h2 id=&#34;qué-es-cappuccino&#34;&gt;Qué es Cappuccino
&lt;/h2&gt;&lt;p&gt;El artículo de 36Kr menciona que, según una publicación de Lentils, el checkpoint de &lt;code&gt;Gemini 3.5 Pro&lt;/code&gt; con nombre en clave &lt;code&gt;Cappuccino&lt;/code&gt; ya habría empezado a producirse. La comunidad todavía hablaba de &lt;code&gt;Gemini 3.2&lt;/code&gt; horas antes, pero la filtración más reciente saltó directamente a &lt;code&gt;3.5&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si ese nombre termina siendo correcto, Google podría querer presentar el próximo Gemini como un salto de versión más grande, no como una actualización menor.&lt;/p&gt;
&lt;p&gt;Por ahora, &lt;code&gt;Cappuccino&lt;/code&gt; debe tratarse como un nombre interno filtrado. No significa que Google haya lanzado públicamente el modelo final, ni garantiza que el nombre de lanzamiento vaya a ser &lt;code&gt;Gemini 3.5 Pro&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;por-qué-el-coding-es-el-foco&#34;&gt;Por qué el coding es el foco
&lt;/h2&gt;&lt;p&gt;La parte más comentada de la filtración es la capacidad de coding del nuevo Gemini.&lt;/p&gt;
&lt;p&gt;Según capturas y supuestos benchmarks citados por 36Kr, el nuevo modelo parece más fuerte en:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generación de SVG y componentes visuales.&lt;/li&gt;
&lt;li&gt;Generación de aplicaciones web interactivas.&lt;/li&gt;
&lt;li&gt;Manejo de animación, 3D, paneles de parámetros ajustables y otras salidas frontend complejas.&lt;/li&gt;
&lt;li&gt;Mejoras en razonamiento lógico y generación de código.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El artículo también cita a Bindu Reddy, CEO de Abacus.AI, diciendo que &lt;code&gt;3.2 Flash&lt;/code&gt; se acerca a &lt;code&gt;GPT-5.5&lt;/code&gt; en coding y razonamiento, con un coste mucho menor. Otras fuentes de medios creen que el nuevo Gemini se ubica aproximadamente en el nivel de &lt;code&gt;GPT-5.5&lt;/code&gt;, aunque quizá no represente un salto cualitativo.&lt;/p&gt;
&lt;p&gt;Por eso conviene leer con cautela la frase &amp;ldquo;alcanza a GPT-5.5&amp;rdquo;. Se parece más a un juicio relativo basado en filtraciones y pruebas anónimas que a un resultado oficial de benchmark de Google.&lt;/p&gt;
&lt;h2 id=&#34;por-qué-google-necesita-ponerse-al-día-en-coding&#34;&gt;Por qué Google necesita ponerse al día en coding
&lt;/h2&gt;&lt;p&gt;El AI coding pasó de ser una categoría de herramientas para desarrolladores a ocupar el centro de la competencia entre modelos fundacionales.&lt;/p&gt;
&lt;p&gt;OpenAI tiene Codex y Anthropic tiene Claude Code. No solo sirven a ingenieros: también llevan a product managers, diseñadores y equipos de operaciones a flujos donde el lenguaje natural produce productos ejecutables.&lt;/p&gt;
&lt;p&gt;En comparación, Google tiene Gemini y Antigravity, pero no ha logrado formar el mismo punto de entrada predeterminado en la mente de los desarrolladores. El artículo de 36Kr también señala que Antigravity no ha logrado despegar claramente en el mercado externo, y que precios, avisos de cuota y estabilidad de experiencia han generado discusión en la comunidad.&lt;/p&gt;
&lt;p&gt;Así que, si el nuevo Gemini necesita demostrar algo, coding será el campo de batalla más directo. La pregunta no es solo si puede escribir código, sino si puede producir interfaces completas de forma estable, entender requisitos complejos, llamar herramientas, corregir errores e integrarse en flujos reales de desarrollo.&lt;/p&gt;
&lt;h2 id=&#34;spark-puede-importar-más-que-35-pro&#34;&gt;Spark puede importar más que 3.5 Pro
&lt;/h2&gt;&lt;p&gt;En la misma ola de filtraciones también apareció &lt;code&gt;Gemini Spark BETA&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Según TestingCatalog y otras fuentes, Spark se posiciona como un agente de IA always-on: puede procesar la bandeja de entrada, ejecutar tareas online, gestionar flujos de varios pasos y conectar contexto de apps de Google, módulos de habilidades, historial de chats, tareas programadas, sitios con sesión iniciada e información de ubicación.&lt;/p&gt;
&lt;p&gt;Eso significa que Spark no es una entrada de chat normal. Podría ser un sistema que permanece online, lee contexto de forma continua y ejecuta tareas por el usuario.&lt;/p&gt;
&lt;p&gt;El atractivo es obvio: si Google puede conectar Gmail, Calendar, Chrome, Android, Workspace y Gemini, Spark tendrá una ventaja de distribución difícil de copiar para OpenAI y Anthropic.&lt;/p&gt;
&lt;p&gt;El riesgo también es obvio. El artículo de 36Kr menciona una descripción de Spark según la cual podría compartir información o completar compras sin preguntar. Aunque el sistema esté diseñado para pedir permiso antes de operaciones sensibles, este tipo de agente sigue planteando riesgos de privacidad, límites de autorización y acciones accidentales.&lt;/p&gt;
&lt;h2 id=&#34;qué-significa-para-usuarios-comunes&#34;&gt;Qué significa para usuarios comunes
&lt;/h2&gt;&lt;p&gt;Si eres un usuario normal de Gemini, lo más importante de esta filtración no es el nombre del modelo, sino tres cambios.&lt;/p&gt;
&lt;p&gt;Primero, Google puede seguir reforzando la capacidad de producir resultados completos. Antes, usuarios se quejaban de que Gemini podía ser perezoso en generación visual, SVG y páginas frontend. Si el nuevo modelo puede generar varias propuestas completas en una sola pasada, la experiencia mejorará de forma visible.&lt;/p&gt;
&lt;p&gt;Segundo, la capacidad de coding seguirá bajando a modelos más ligeros. La filtración menciona varias veces mejoras de Flash en coding, razonamiento y generación interactiva, lo que significa que en el futuro no siempre hará falta un modelo Pro para tareas complejas.&lt;/p&gt;
&lt;p&gt;Tercero, los agentes serán más proactivos. Si Spark se lanza, Gemini podría dejar de limitarse a responder preguntas y empezar a asumir correo, web, compras, calendario y tareas entre apps durante periodos largos.&lt;/p&gt;
&lt;p&gt;Eso es bueno para la eficiencia, pero crea un nuevo desafío de gestión de permisos.&lt;/p&gt;
&lt;h2 id=&#34;qué-significa-para-desarrolladores&#34;&gt;Qué significa para desarrolladores
&lt;/h2&gt;&lt;p&gt;Los desarrolladores deberían vigilar dos cuestiones.&lt;/p&gt;
&lt;p&gt;La primera es el ecosistema de herramientas. El artículo de 36Kr dice que la comunidad vio una entrada no publicada llamada &lt;code&gt;MCP Tool Testing&lt;/code&gt; en el selector de modelos. Si Gemini soporta MCP o pruebas de herramientas de terceros de forma nativa, será más fácil conectarlo a las toolchains propias de los desarrolladores.&lt;/p&gt;
&lt;p&gt;La segunda es coste y estabilidad. Aunque el nuevo Gemini alcance a GPT-5.5 en algunos benchmarks, los desarrolladores acabarán mirando tres cosas: calidad real del código, estabilidad del contexto, y si precios y cuotas son predecibles.&lt;/p&gt;
&lt;p&gt;El último año de competencia en herramientas de AI coding ha demostrado que la capacidad del modelo es solo el billete de entrada. Lo que retiene a los desarrolladores es si la herramienta puede editar código, ejecutar tests, leer contexto y manejar casos límite de forma fiable en proyectos diarios.&lt;/p&gt;
&lt;h2 id=&#34;cómo-leer-esta-noticia-ahora&#34;&gt;Cómo leer esta noticia ahora
&lt;/h2&gt;&lt;p&gt;Esta noticia se entiende mejor como &amp;ldquo;señal fuerte, confirmación débil&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;La señal fuerte es que múltiples pistas comunitarias apuntan a que Google prepara un Gemini más fuerte y un Gemini Spark Agent más proactivo.&lt;/p&gt;
&lt;p&gt;La confirmación débil es que &lt;code&gt;Gemini 3.5 Pro&lt;/code&gt; aún no ha sido lanzado oficialmente, &lt;code&gt;Cappuccino&lt;/code&gt; sigue siendo un nombre filtrado, y la afirmación de que &amp;ldquo;alcanza a GPT-5.5&amp;rdquo; necesita validación con benchmarks oficiales de Google, pruebas de terceros y experiencia real de usuarios.&lt;/p&gt;
&lt;p&gt;La lectura más prudente por ahora:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No tratarlo como un producto ya lanzado.&lt;/li&gt;
&lt;li&gt;Tratarlo como una vista previa temprana de la próxima dirección de Gemini.&lt;/li&gt;
&lt;li&gt;Observar si I/O u otros eventos oficiales confirman el nombre del modelo, disponibilidad de API, precios, ventana de contexto, tool calling y límites de permisos del agente.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;La exposición de &lt;code&gt;Gemini 3.5 Pro / Cappuccino&lt;/code&gt; sugiere que Google podría estar preparando un empuje más fuerte para la próxima generación de Gemini. No intenta corregir una sola capacidad aislada, sino todo un flujo de trabajo de IA: el modelo debe escribir mejor código, generar interfaces y manejar razonamiento complejo, mientras Spark empuja Gemini hacia un agente always-on.&lt;/p&gt;
&lt;p&gt;Pero antes de un lanzamiento oficial, todos los benchmarks y capturas siguen siendo pistas. Lo que decidirá si Gemini 3.5 Pro puede recuperar impulso no será si el nombre en clave suena bien, sino si puede ganar de forma fiable en desarrollo real, trabajo de oficina real y tareas reales de varios pasos.&lt;/p&gt;
&lt;p&gt;Referencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://m.36kr.com/p/3810432812162816&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;36Kr: Gemini 3.5 Pro filtrado, coding supuestamente alcanza a GPT-5.5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.testingcatalog.com/google-prepares-gemini-spark-ai-agent-ahead-of-i-o-launch/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;TestingCatalog: Google prepares Gemini Spark AI agent ahead of I/O launch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://x.com/alexeheath/status/2054747125616169229&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;X: Alex Heath sobre el nuevo Gemini y GPT-5.5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://x.com/Lentils80/status/2054628116094501377&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;X: Lentils sobre Gemini 3.5 / Cappuccino&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Gemini Intelligence on Android: Google está convirtiendo el teléfono en un sistema de IA proactivo</title>
        <link>https://knightli.com/es/2026/05/17/google-gemini-intelligence-android/</link>
        <pubDate>Sun, 17 May 2026 09:13:32 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/17/google-gemini-intelligence-android/</guid>
        <description>&lt;p&gt;El 12 de mayo de 2026, Google publicó “A smarter, more proactive Android with Gemini Intelligence”, presentando Gemini Intelligence on Android. No es una app de chat independiente. Lleva capacidades de Gemini a Android, Chrome, Gboard, Autofill, widgets y experiencias multidispositivo, moviendo el teléfono desde “esperar a que el usuario toque” hacia “ayudar de forma proactiva a completar tareas”.&lt;/p&gt;
&lt;p&gt;En pocas palabras, Google quiere que Android pase de operating system a intelligence system. El teléfono ya no solo abre apps, muestra notificaciones y ejecuta ajustes; puede entender la pantalla, las apps, la voz y el contexto personal, y completar acciones más complejas con confirmación del usuario.&lt;/p&gt;
&lt;h2 id=&#34;resumen-rápido&#34;&gt;Resumen rápido
&lt;/h2&gt;&lt;p&gt;Gemini Intelligence on Android se centra en cinco áreas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatización de varios pasos: Gemini puede completar flujos entre apps, como transporte, compras o investigación.&lt;/li&gt;
&lt;li&gt;Navegación inteligente en Chrome: resumir páginas, comparar información y manejar algunas tareas web repetitivas en Android.&lt;/li&gt;
&lt;li&gt;Autofill mejorado: usar Gemini y contexto personal para completar formularios más complejos.&lt;/li&gt;
&lt;li&gt;Rambler: convertir habla natural en texto más claro y pulido.&lt;/li&gt;
&lt;li&gt;Widgets por lenguaje natural: describir lo que quieres y Android genera widgets personalizados.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estas funciones empezarán a desplegarse en verano de 2026, primero en algunos Samsung Galaxy y Google Pixel, y después en más dispositivos Android, incluidos relojes, coches, gafas y portátiles.&lt;/p&gt;
&lt;h2 id=&#34;automatización-de-varios-pasos-de-sugerir-a-ejecutar&#34;&gt;Automatización de varios pasos: de sugerir a ejecutar
&lt;/h2&gt;&lt;p&gt;La dirección más importante es permitir que Gemini complete tareas de varios pasos entre apps.&lt;/p&gt;
&lt;p&gt;Google da ejemplos como reservar una clase de spinning, encontrar un temario en Gmail y añadir los libros necesarios al carrito, o ver un cartel de viaje y pedir a Gemini que busque un viaje similar en Expedia.&lt;/p&gt;
&lt;p&gt;Lo difícil no es solo entender una frase. El sistema necesita entender:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Qué aparece en la pantalla o imagen actual del usuario.&lt;/li&gt;
&lt;li&gt;Información de apps que el usuario haya autorizado.&lt;/li&gt;
&lt;li&gt;Qué app debe abrirse después.&lt;/li&gt;
&lt;li&gt;Qué pasos pueden automatizarse.&lt;/li&gt;
&lt;li&gt;Qué pasos deben detenerse para pedir confirmación.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google subraya que Gemini actúa bajo instrucciones del usuario y se detiene cuando termina la tarea, manteniendo la confirmación final bajo control del usuario. No es un agente totalmente autónomo, sino un agent móvil con confirmación humana.&lt;/p&gt;
&lt;h2 id=&#34;la-pantalla-y-la-imagen-importan-más&#34;&gt;La pantalla y la imagen importan más
&lt;/h2&gt;&lt;p&gt;Un cambio importante es el uso de screen context e image context.&lt;/p&gt;
&lt;p&gt;Los asistentes móviles anteriores dependían más de comandos de voz e integraciones fijas dentro de apps. Gemini Intelligence pone más énfasis en “ver” la pantalla actual. Por ejemplo, si el usuario tiene una lista de compras en notas, puede mantener presionado el botón de encendido para invocar Gemini y pedirle que cree un carrito de entrega a partir de la lista.&lt;/p&gt;
&lt;p&gt;Esto significa que la IA de Android no es solo un chatbot. Está intentando entender el entorno operativo que el usuario tiene delante. La competencia futura de IA móvil puede depender no solo de quién responda mejor, sino también de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si entiende la pantalla actual.&lt;/li&gt;
&lt;li&gt;Si puede actuar entre apps.&lt;/li&gt;
&lt;li&gt;Si puede seguir el progreso de tareas en segundo plano.&lt;/li&gt;
&lt;li&gt;Si pide confirmación de forma fiable en momentos clave.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esa es una diferencia importante entre la IA móvil y la IA de chat web.&lt;/p&gt;
&lt;h2 id=&#34;chrome-de-búsqueda-a-agente-de-tareas-web&#34;&gt;Chrome: de búsqueda a agente de tareas web
&lt;/h2&gt;&lt;p&gt;Google dice que los dispositivos Android recibirán un Gemini in Chrome más inteligente a partir de finales de junio de 2026.&lt;/p&gt;
&lt;p&gt;Podrá ayudar a investigar, resumir y comparar contenido web, y Chrome auto browse podrá manejar algunas tareas repetitivas como reservas, citas o aparcamiento.&lt;/p&gt;
&lt;p&gt;Esto significa que Gemini in Chrome no es solo una función de resumen de páginas. Avanza hacia un agente de navegador. El navegador ya es donde los usuarios completan muchas tareas web. Si Gemini puede entender páginas, rellenar información, comparar opciones y ejecutar algunos pasos, Chrome pasa de herramienta de lectura a superficie de ejecución.&lt;/p&gt;
&lt;p&gt;Los retos son prácticos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Los sitios web son complejos y la automatización puede fallar.&lt;/li&gt;
&lt;li&gt;Formularios, pagos, inicios de sesión y CAPTCHAs requieren cautela.&lt;/li&gt;
&lt;li&gt;El usuario necesita saber qué hizo Gemini.&lt;/li&gt;
&lt;li&gt;El envío final, pago o reserva debería conservar confirmación humana.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La dificultad no está solo en el modelo, sino en automatización del navegador, límites de seguridad y confianza del usuario.&lt;/p&gt;
&lt;h2 id=&#34;autofill-de-contraseñas-a-formularios-complejos&#34;&gt;Autofill: de contraseñas a formularios complejos
&lt;/h2&gt;&lt;p&gt;Autofill with Google se centraba sobre todo en contraseñas, direcciones y pagos. Google ahora quiere convertirlo en un asistente de formularios más inteligente.&lt;/p&gt;
&lt;p&gt;Con Personal Intelligence de Gemini, Android puede usar información relevante de apps conectadas para completar campos más complejos, incluidos formularios en Chrome.&lt;/p&gt;
&lt;p&gt;Es muy práctico. Rellenar formularios complejos en móvil es incómodo: pantalla pequeña, muchos campos e información repartida entre correo, calendario, chats y documentos. Si Gemini puede organizar y rellenar esa información con permiso del usuario, ahorra mucho tiempo.&lt;/p&gt;
&lt;p&gt;Google también recalca que conectar Gemini y Autofill with Google es estrictamente opt-in. El usuario decide si conectarlos y puede activar o desactivar la conexión en ajustes.&lt;/p&gt;
&lt;p&gt;Esto importa porque Autofill toca datos personales, direcciones, cuentas, pagos, información laboral y formularios sensibles. Cuanto más útil es, más importantes son el permiso explícito y la salida controlable.&lt;/p&gt;
&lt;h2 id=&#34;rambler-convertir-habla-en-texto-listo-para-enviar&#34;&gt;Rambler: convertir habla en texto listo para enviar
&lt;/h2&gt;&lt;p&gt;Rambler es una de las funciones más interesantes.&lt;/p&gt;
&lt;p&gt;Gboard ya puede convertir voz en texto, pero al hablar de forma natural solemos repetir, pausar, usar muletillas y corregirnos. Rambler busca transformar habla natural en texto más claro y listo para enviar.&lt;/p&gt;
&lt;p&gt;Sirve para situaciones como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dictar rápidamente un mensaje sin editar cada palabra.&lt;/li&gt;
&lt;li&gt;Hablar con pausas, repeticiones o muletillas.&lt;/li&gt;
&lt;li&gt;Convertir una idea improvisada en un SMS, email o chat más profesional.&lt;/li&gt;
&lt;li&gt;Cambiar entre idiomas y esperar que el sistema entienda el contexto.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google dice que Rambler mostrará claramente cuándo está activado y que el audio solo se usa para transcripción en tiempo real, sin guardarse. Es una respuesta a preocupaciones de privacidad y transparencia.&lt;/p&gt;
&lt;p&gt;Desde el punto de vista del producto, Rambler convierte “entrada por voz” en “escritura por voz”. No solo registra lo que dijiste; ayuda a convertirlo en texto enviable.&lt;/p&gt;
&lt;h2 id=&#34;widgets-creados-con-lenguaje-natural&#34;&gt;Widgets creados con lenguaje natural
&lt;/h2&gt;&lt;p&gt;Gemini Intelligence también incluye Create My Widget. El usuario puede describir en lenguaje natural el widget que quiere, por ejemplo “recomiéndame tres recetas semanales altas en proteína”, y Android genera un widget personalizado para la pantalla de inicio.&lt;/p&gt;
&lt;p&gt;Esto apunta a generative UI. El usuario ya no elige solo entre plantillas fijas; describe la información y presentación que quiere.&lt;/p&gt;
&lt;p&gt;Si madura, la pantalla de inicio podría volverse mucho más personal. Clima, agenda, salud, transporte, comida, aprendizaje y recordatorios de trabajo podrían convertirse en módulos dinámicos generados según la necesidad del usuario.&lt;/p&gt;
&lt;p&gt;Pero la UI generativa también necesita estabilidad. Un widget no es una respuesta de chat de una sola vez. Permanece en la pantalla y debe ser fiable, legible, configurable y no invadir el diseño.&lt;/p&gt;
&lt;h2 id=&#34;material-3-expressive-e-interfaz-inteligente&#34;&gt;Material 3 Expressive e interfaz inteligente
&lt;/h2&gt;&lt;p&gt;Google también dice que Gemini Intelligence traerá actualizaciones de diseño basadas en Material 3 Expressive.&lt;/p&gt;
&lt;p&gt;No es solo decoración. Cuando la IA empieza a actuar proactivamente, la interfaz debe mostrar claramente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Qué está haciendo la IA.&lt;/li&gt;
&lt;li&gt;Qué pasos se han completado.&lt;/li&gt;
&lt;li&gt;Dónde hace falta confirmación.&lt;/li&gt;
&lt;li&gt;Cómo cancelar o modificar la acción.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Una IA proactiva sin una UI clara puede hacer que el usuario sienta que pierde control. El lenguaje de diseño se convierte en parte de la experiencia del producto de IA.&lt;/p&gt;
&lt;h2 id=&#34;disponibilidad-y-despliegue&#34;&gt;Disponibilidad y despliegue
&lt;/h2&gt;&lt;p&gt;Según Google, las funciones de Gemini Intelligence empezarán en los últimos Samsung Galaxy y Google Pixel durante el verano de 2026. Después llegarán a más dispositivos Android, incluidos relojes, coches, gafas y portátiles.&lt;/p&gt;
&lt;p&gt;No será un lanzamiento global instantáneo. La disponibilidad puede depender de dispositivo, región, idioma, soporte de apps y configuración de cuenta.&lt;/p&gt;
&lt;p&gt;Si quieres probarlo, las expectativas realistas son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mirar primero Pixel y Samsung de gama alta.&lt;/li&gt;
&lt;li&gt;Seguir las actualizaciones del sistema tras el verano de 2026.&lt;/li&gt;
&lt;li&gt;Buscar nuevos interruptores en Gemini, Chrome, Gboard, Autofill y ajustes de Android.&lt;/li&gt;
&lt;li&gt;No todas las regiones e idiomas admitirán todas las funciones al mismo tiempo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;qué-significa-para-android&#34;&gt;Qué significa para Android
&lt;/h2&gt;&lt;p&gt;Gemini Intelligence on Android no significa solo añadir unas cuantas funciones de IA. Cambia la dirección del producto Android.&lt;/p&gt;
&lt;p&gt;Los sistemas móviles tradicionales gestionan apps, notificaciones, permisos, archivos y hardware. Google ahora quiere que el sistema entienda la intención del usuario y complete tareas entre apps. Si funciona, la competencia de Android se moverá desde “funciones del sistema y ecosistema de apps” hacia “cuánto puede ayudar proactivamente al usuario”.&lt;/p&gt;
&lt;p&gt;También cambia la competencia de IA móvil:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apple enfatizará integración local, privacidad y control del sistema.&lt;/li&gt;
&lt;li&gt;Google enfatizará Gemini, Search, Chrome, Android y ecosistema multidispositivo.&lt;/li&gt;
&lt;li&gt;Las apps de IA de terceros lo tendrán más difícil frente a entradas de nivel sistema.&lt;/li&gt;
&lt;li&gt;Los desarrolladores deberán pensar cómo sus apps serán llamadas por agentes de IA.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En los próximos años, la IA en el teléfono puede dejar de ser solo una entrada de chat y convertirse en una capa de ejecución del sistema.&lt;/p&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;Gemini Intelligence on Android no trata de añadir otra caja de chat Gemini al teléfono. Trata de colocar IA dentro del flujo operativo de Android. Automatización de varios pasos, Chrome inteligente, Autofill, Rambler y widgets por lenguaje natural buscan convertir el teléfono de herramienta pasiva en asistente proactivo.&lt;/p&gt;
&lt;p&gt;Que cambie realmente los hábitos del usuario dependerá de la fiabilidad de la automatización, la claridad de los controles de privacidad, la fluidez entre apps y que el usuario conserve el control final. Al menos con este anuncio, Google define la siguiente etapa de Android como un sistema de IA proactivo, no solo como un sistema operativo móvil tradicional.&lt;/p&gt;
&lt;p&gt;Referencia:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.google/products-and-platforms/platforms/android/gemini-intelligence/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Blog: A smarter, more proactive Android with Gemini Intelligence&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Gemini Embedding 2: texto, imagen, video y audio en un mismo espacio vectorial</title>
        <link>https://knightli.com/es/2026/05/04/gemini-embedding-2-multimodal-rag/</link>
        <pubDate>Mon, 04 May 2026 06:01:10 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/04/gemini-embedding-2-multimodal-rag/</guid>
        <description>&lt;p&gt;Google Developers Blog presento el uso de Gemini Embedding 2 para desarrollo. El modelo ya esta en GA a traves de Gemini API y Gemini Enterprise Agent Platform. Lo importante no es solo que sea &amp;ldquo;un nuevo modelo de embedding&amp;rdquo;, sino que puede mapear texto, imagenes, video, audio y documentos al mismo espacio semantico.&lt;/p&gt;
&lt;p&gt;Esto amplia los limites de los sistemas de recuperacion. Antes, muchos flujos RAG necesitaban convertir imagenes, videos o audio en texto o metadatos y crear indices separados. Gemini Embedding 2 puede procesar directamente entradas multimodales, haciendo que agents, busqueda y sistemas de clasificacion trabajen mas facilmente con materiales reales de negocio.&lt;/p&gt;
&lt;p&gt;Enlace original: &lt;a class=&#34;link&#34; href=&#34;https://developers.googleblog.com/building-with-gemini-embedding-2/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Building with Gemini Embedding 2: Agentic multimodal RAG and beyond&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;capacidades-del-modelo&#34;&gt;Capacidades del modelo
&lt;/h2&gt;&lt;p&gt;Gemini Embedding 2 admite mas de 100 idiomas. Una sola solicitud puede procesar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hasta 8,192 tokens de texto.&lt;/li&gt;
&lt;li&gt;Hasta 6 imagenes.&lt;/li&gt;
&lt;li&gt;Hasta 120 segundos de video.&lt;/li&gt;
&lt;li&gt;Hasta 180 segundos de audio.&lt;/li&gt;
&lt;li&gt;Hasta 6 paginas PDF.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La clave es el &amp;ldquo;espacio semantico unificado&amp;rdquo;. Los desarrolladores pueden poner contenidos de distintas modalidades en una misma representacion vectorial y aplicar la misma logica de recuperacion, clustering o reranking.&lt;/p&gt;
&lt;p&gt;Por ejemplo, una descripcion de texto y una imagen pueden ir en la misma solicitud de embedding:&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;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&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 class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;google.genai&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;types&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;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;dog.png&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&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;image_bytes&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read&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;result&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;models&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;embed_content&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;s1&#34;&gt;&amp;#39;gemini-embedding-2&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 class=&#34;n&#34;&gt;contents&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 class=&#34;s2&#34;&gt;&amp;#34;An image of a dog&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;types&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Part&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;from_bytes&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;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;image_bytes&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;mime_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;image/png&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 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;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;result&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;embeddings&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 quieres obtener un embedding separado para cada entrada, en vez de agregarlas en un unico vector, puedes usar Batch API. El articulo tambien menciona que Agent Platform sigue avanzando en este soporte por lotes.&lt;/p&gt;
&lt;h2 id=&#34;que-significa-para-rag&#34;&gt;Que significa para RAG
&lt;/h2&gt;&lt;p&gt;El embedding multimodal es muy util para RAG agentico. Un AI agent puede necesitar revisar al mismo tiempo repositorios de codigo, PDF, capturas, graficos, transcripciones de reuniones y fotos de producto. Si todos los materiales entran en el mismo espacio semantico, la recuperacion no necesita una entrada distinta para cada formato.&lt;/p&gt;
&lt;p&gt;Google recomienda usar task prefix segun la tarea para acercar el embedding al objetivo de recuperacion. Por ejemplo, preguntas y respuestas, fact checking, recuperacion de codigo y resultados de busqueda pueden usar prefijos distintos:&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-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;c1&#34;&gt;# Generate embedding for your task&amp;#39;s query:&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;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;prepare_query&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;query&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;return&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;task: question answering | query: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&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;# return f&amp;#34;task: fact checking | query: {content}&amp;#34;&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;# return f&amp;#34;task: code retrieval | query: {content}&amp;#34;&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;# return f&amp;#34;task: search result | query: {content}&amp;#34;&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;# Generate embedding for document of an asymmetric retrieval task:&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;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;prepare_document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;None&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;title&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&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;title&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&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;return&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;title: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; | text: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&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;Este prefijo encaja con recuperacion asimetrica: las consultas suelen ser cortas y los documentos largos. Preparar query y document con formatos de tarea distintos puede mejorar el emparejamiento entre consulta corta y documento largo.&lt;/p&gt;
&lt;p&gt;El articulo da dos resultados reales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Harvey mejoro un 3% el Recall@20 precision frente a la generacion anterior de embedding en benchmarks legales.&lt;/li&gt;
&lt;li&gt;Supermemory mejoro un 40% el Recall@1 en precision de busqueda y lo usa en memoria, indexacion, busqueda y Q&amp;amp;A.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estos numeros no significan que todos los escenarios mejoren igual, pero muestran que el embedding multimodal ya no es solo una demostracion, sino que produce efecto en productos reales de busqueda.&lt;/p&gt;
&lt;h2 id=&#34;busqueda-visual&#34;&gt;Busqueda visual
&lt;/h2&gt;&lt;p&gt;Gemini Embedding 2 tambien encaja con busqueda por imagen, busqueda mixta imagen-texto e identificacion de productos. El articulo menciona que Nuuly, una empresa de alquiler de ropa, lo uso para emparejar fotos de ropa sin etiquetar en almacen: Match@20 subio de 60% a casi 87%, y el exito total de identificacion paso de 74% a mas de 90%.&lt;/p&gt;
&lt;p&gt;La clave de estos escenarios no es generar contenido, sino entender &amp;ldquo;a que inventario, documento o registro de producto se parece mas esta imagen&amp;rdquo;. Si tu negocio tiene muchas imagenes, clips de video o documentos escaneados, el embedding multimodal es mas natural que un indice puramente textual.&lt;/p&gt;
&lt;h2 id=&#34;reranking-de-recuperacion&#34;&gt;Reranking de recuperacion
&lt;/h2&gt;&lt;p&gt;El embedding tambien puede usarse para rerank. Una practica comun es recuperar primero un grupo de candidatos y luego calcular la similitud entre cada candidato y la consulta del usuario, subiendo los resultados mas relevantes:&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;/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;c1&#34;&gt;# 1. Define a function to calculate the dot product (cosine similarity)&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;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;dot_product&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ndarray&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ndarray&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;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;@&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&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;# 2. Retrieve your embeddings&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;# (Assuming &amp;#39;summaries&amp;#39; is your list of search results)&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;search_res&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_embeddings&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;summaries&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;embedded_query&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_embeddings&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;query&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;c1&#34;&gt;# 3. Calculate similarity scores&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;sim_value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dot_product&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;search_res&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;embedded_query&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;c1&#34;&gt;# 4. Select the most relevant result&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;best_match_index&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argmax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sim_value&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;El articulo tambien menciona otra idea: pedir primero al modelo que genere una respuesta hipotetica con su conocimiento interno, hacer embedding de esa respuesta y compararla con los candidatos. Esto ayuda a elegir resultados semanticamente mas cercanos, especialmente en RAG de preguntas y respuestas.&lt;/p&gt;
&lt;h2 id=&#34;clustering-clasificacion-y-deteccion-de-anomalias&#34;&gt;Clustering, clasificacion y deteccion de anomalias
&lt;/h2&gt;&lt;p&gt;Ademas de recuperacion, los embeddings sirven para clustering, clasificacion y deteccion de anomalias. A diferencia de la recuperacion de preguntas y respuestas, estas son tareas simetricas: query y document pueden usar el mismo prefijo de tarea.&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;/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;c1&#34;&gt;# Generate embedding for query &amp;amp; document of your task.&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;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;prepare_query_and_document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content&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;# return f&amp;#39;task: clustering | query: {content}&amp;#39;&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;# return f&amp;#39;task: sentence similarity | query: {content}&amp;#39;&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;# return f&amp;#39;task: classification | query: {content}&amp;#39;&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;Estas tareas pueden aplicarse a clasificacion de opinion publica, moderacion de contenido, agrupacion de activos similares y deteccion de muestras anomalas. Tambien pueden ayudar a un agent a ordenar mucho contexto antes de entrar en razonamiento posterior.&lt;/p&gt;
&lt;h2 id=&#34;almacenamiento-y-coste&#34;&gt;Almacenamiento y coste
&lt;/h2&gt;&lt;p&gt;Gemini Embedding 2 devuelve por defecto vectores de 3,072 dimensiones. Usa Matryoshka Representation Learning, por lo que puedes truncar el vector a una dimension menor con &lt;code&gt;output_dimensionality&lt;/code&gt;. Google recomienda 1,536 o 768 dimensiones cuando la eficiencia es prioritaria:&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;/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;n&#34;&gt;result&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;models&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;embed_content&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-embedding-2&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;contents&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;What is the meaning of life?&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;config&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;s2&#34;&gt;&amp;#34;output_dimensionality&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;768&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Los vectores pueden almacenarse en Agent Platform Vector Search, Pinecone, Weaviate, Qdrant, ChromaDB y sistemas similares. En coste, el articulo menciona que Batch API ofrece mayor throughput y puede llegar al 50% del precio por defecto de embeddings.&lt;/p&gt;
&lt;h2 id=&#34;como-usarlo-como-desarrollador&#34;&gt;Como usarlo como desarrollador
&lt;/h2&gt;&lt;p&gt;Si ya tienes RAG textual, puedes empezar con dos mejoras incrementales:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Poner PDF, capturas, descripciones de imagen y documentos de texto en un mismo indice, y comprobar si la recuperacion se vuelve mas estable.&lt;/li&gt;
&lt;li&gt;Agregar task prefix para distintas tareas, como Q&amp;amp;A, fact checking, recuperacion de codigo y busqueda de productos. No proceses todo con el mismo formato de embedding.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Si estas creando un producto nuevo, considera primero estas direcciones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Base de conocimiento empresarial: recuperar documentos, graficos, capturas de presentaciones y material de reuniones al mismo tiempo.&lt;/li&gt;
&lt;li&gt;Busqueda visual: encontrar productos, activos, disenos y archivos usando imagen, texto o entradas mixtas.&lt;/li&gt;
&lt;li&gt;Toolchain de Agent: permitir que coding agents, research agents o agentes de soporte recuperen materiales de negocio en varios formatos.&lt;/li&gt;
&lt;li&gt;Gobernanza de contenido: clasificar, agrupar y detectar anomalias en texto, imagenes y clips de video.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El valor de Gemini Embedding 2 esta en convertir materiales multimodales en un mismo conjunto de activos recuperables. Para desarrolladores, reduce la capa intermedia de &amp;ldquo;convertir primero a texto y luego buscar&amp;rdquo;, y acerca los sistemas RAG a la forma real de los datos del mundo.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Gemini llega a los coches con Google built-in: el asistente de voz del vehículo empieza a parecer un asistente de IA real</title>
        <link>https://knightli.com/es/2026/05/01/gemini-cars-with-google-built-in/</link>
        <pubDate>Fri, 01 May 2026 06:09:57 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/01/gemini-cars-with-google-built-in/</guid>
        <description>&lt;p&gt;Google anunció el 30 de abril de 2026 que &lt;code&gt;Gemini&lt;/code&gt; empezaría a llegar a coches con &lt;code&gt;Google built-in&lt;/code&gt;, como una evolución del Google Assistant dentro del vehículo.&lt;/p&gt;
&lt;p&gt;Lo importante no es solo que &amp;ldquo;hay otro asistente de IA en el coche&amp;rdquo;. El cambio real es que la interacción por voz en el automóvil empieza a moverse desde comandos rígidos hacia conversaciones más naturales. El usuario no necesita recordar fórmulas exactas: puede hablar con Gemini para navegar, manejar mensajes, consultar información del coche o controlar algunos ajustes del habitáculo.&lt;/p&gt;
&lt;h2 id=&#34;primero-para-usuarios-de-inglés-en-estados-unidos&#34;&gt;Primero para usuarios de inglés en Estados Unidos
&lt;/h2&gt;&lt;p&gt;Según Google, la actualización cubrirá vehículos nuevos y existentes, siempre que el coche soporte &lt;code&gt;Google built-in&lt;/code&gt; y el usuario haya iniciado sesión con su cuenta de Google en el sistema del vehículo.&lt;/p&gt;
&lt;p&gt;El despliegue empieza con usuarios de inglés en Estados Unidos y luego se ampliará a más idiomas y países. Los usuarios compatibles verán una indicación para actualizar a Gemini. Después, podrán invocarlo con:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;decir &lt;code&gt;Hey Google&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;tocar el micrófono en la pantalla principal;&lt;/li&gt;
&lt;li&gt;usar el botón de voz del volante.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google no está creando una entrada nueva que haya que aprender desde cero: conserva el punto de acceso de voz existente y cambia el asistente de fondo por Gemini.&lt;/p&gt;
&lt;h2 id=&#34;la-voz-en-el-coche-deja-de-depender-solo-de-comandos-fijos&#34;&gt;La voz en el coche deja de depender solo de comandos fijos
&lt;/h2&gt;&lt;p&gt;El problema clásico de los asistentes de voz en coches es que podían hacer bastantes cosas, pero el usuario tenía que hablar de forma muy &amp;ldquo;estándar&amp;rdquo;. Si la petición era un poco compleja, el asistente fallaba o ejecutaba solo una acción básica.&lt;/p&gt;
&lt;p&gt;Con Gemini, Google subraya la conversación natural. Por ejemplo, el usuario puede decir:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I need to grab lunch, find some highly rated sit-down restaurants along the way. I&amp;rsquo;m not in a rush, oh, and I’d like to eat outside.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Gemini puede combinar esa intención con Google Maps para buscar restaurantes adecuados en la ruta. Luego el usuario puede preguntar por aparcamiento, opciones vegetarianas u otros detalles sin iniciar una búsqueda completa desde cero.&lt;/p&gt;
&lt;p&gt;Esto encaja mejor con la conducción. Al manejar es difícil filtrar, tocar y ajustar condiciones como en un móvil. Si el asistente entiende una intención más completa, reduce distracciones.&lt;/p&gt;
&lt;h2 id=&#34;mapas-mensajes-y-música-se-vuelven-más-fluidos&#34;&gt;Mapas, mensajes y música se vuelven más fluidos
&lt;/h2&gt;&lt;p&gt;Los ejemplos de Google giran alrededor de necesidades comunes mientras se conduce.&lt;/p&gt;
&lt;p&gt;La primera categoría es búsqueda de rutas y lugares. Gemini puede buscar restaurantes, sitios turísticos o cargadores en el camino con información de Google Maps, y responder preguntas relacionadas con la ruta actual. Si pasas cerca de un estadio, puedes preguntar si hay un evento y si afectará al tráfico.&lt;/p&gt;
&lt;p&gt;La segunda categoría es mensajería. Gemini puede resumir mensajes nuevos y responder usando el contexto. Por ejemplo, puede decir a un amigo que vas en camino e incluir la hora estimada de llegada. Si quieres ajustar el texto, puedes seguir hablando sin empezar de nuevo.&lt;/p&gt;
&lt;p&gt;La tercera categoría es música y ambiente. No hace falta conocer una emisora o lista exacta. Puedes describir lo que quieres escuchar, como una radio de jazz o folk-rock alegre de los 70 en YouTube Music para conducir por montaña, y pedir que salte canciones lentas.&lt;/p&gt;
&lt;p&gt;Las funciones no son completamente nuevas, pero el valor de Gemini está en procesar varias condiciones en una frase natural en lugar de obligar al usuario a usar comandos fijos.&lt;/p&gt;
&lt;h2 id=&#34;gemini-live-también-entra-al-coche&#34;&gt;Gemini Live también entra al coche
&lt;/h2&gt;&lt;p&gt;Google también mencionó que &lt;code&gt;Gemini Live&lt;/code&gt; llegará al contexto del vehículo, por ahora en beta. El usuario puede tocar el botón de Gemini Live o decir &lt;code&gt;Hey Google, let&#39;s talk&lt;/code&gt; para iniciar una conversación más libre.&lt;/p&gt;
&lt;p&gt;Esto se parece más a una experiencia de aprendizaje o lluvia de ideas durante el viaje. Por ejemplo, al ir a Lake Tahoe, Gemini puede contar historia y datos locales; si algo interesa, se puede interrumpir y preguntar más. También puede ayudar a planear rutas a pie y actividades al llegar.&lt;/p&gt;
&lt;p&gt;La diferencia con el asistente tradicional es clara: el asistente clásico es más parecido a un botón de herramienta; Gemini Live se acerca más a una interfaz de voz continua.&lt;/p&gt;
&lt;h2 id=&#34;manual-del-coche-y-estado-en-tiempo-real-son-la-diferencia-clave&#34;&gt;Manual del coche y estado en tiempo real son la diferencia clave
&lt;/h2&gt;&lt;p&gt;Más interesante aún, Gemini no responde solo preguntas generales. Google dice que trabaja con fabricantes para integrarlo más profundamente en los sistemas del vehículo.&lt;/p&gt;
&lt;p&gt;Esto permite varios tipos de capacidades más cercanas al coche real.&lt;/p&gt;
&lt;p&gt;Primero, el usuario puede preguntar por funciones del vehículo. Por ejemplo: &amp;ldquo;¿Qué debo hacer antes de un lavado automático?&amp;rdquo; o &amp;ldquo;El techo de mi garaje es bajo, ¿cómo limito la apertura del portón trasero?&amp;rdquo;. Gemini puede usar el manual del propietario proporcionado por el fabricante para responder según el modelo concreto. El detalle disponible dependerá de cada marca y vehículo.&lt;/p&gt;
&lt;p&gt;Segundo, los usuarios de EV pueden preguntar por batería y autonomía en tiempo real: carga actual, carga estimada al llegar o cargadores cercanos. También puede combinarlo con Google Maps para buscar cafeterías cerca de estaciones de carga.&lt;/p&gt;
&lt;p&gt;Tercero, algunos ajustes del habitáculo pueden controlarse con lenguaje natural. El ejemplo de Google es decir que el coche está &amp;ldquo;húmedo y frío&amp;rdquo;; Gemini puede entender la intención, subir la calefacción y activar desempañado.&lt;/p&gt;
&lt;p&gt;Este tipo de integración es más útil que meter un chatbot genérico en el coche. Un automóvil tiene estado, hardware y límites de seguridad claros. Si el asistente entiende ese contexto, aporta más valor.&lt;/p&gt;
&lt;h2 id=&#34;los-límites-del-ai-en-el-coche-importan-más&#34;&gt;Los límites del AI en el coche importan más
&lt;/h2&gt;&lt;p&gt;El contexto del coche exige más que el móvil o la web. Al conducir, el usuario no puede mirar la pantalla constantemente ni dedicar demasiada atención a corregir al asistente. El sistema debe ser breve, fiable y no crear carga adicional en momentos críticos.&lt;/p&gt;
&lt;p&gt;Por eso, Gemini en coches no significa que todas las tareas complejas deban hacerse durante la conducción. La dirección razonable es:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;reducir el coste operativo de navegación y consultas;&lt;/li&gt;
&lt;li&gt;sustituir menús de varias capas por lenguaje natural;&lt;/li&gt;
&lt;li&gt;ayudar a entender funciones del vehículo;&lt;/li&gt;
&lt;li&gt;manejar mensajes y medios sin distraer;&lt;/li&gt;
&lt;li&gt;dar a usuarios EV información más fluida de carga y ruta.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En sentido contrario, las operaciones de alto riesgo necesitan límites claros. Ajustes que afecten a la seguridad, envío de mensajes que requieran confirmación o acciones de control del vehículo deben tener flujos de confirmación explícitos.&lt;/p&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;Gemini en coches con &lt;code&gt;Google built-in&lt;/code&gt; es otro paso de los asistentes de IA desde el móvil y la web hacia entornos cotidianos.&lt;/p&gt;
&lt;p&gt;Su importancia no está en poder &amp;ldquo;charlar con el coche&amp;rdquo;, sino en que el asistente de voz entiende intenciones más complejas y combina mapas, mensajes, música, manual del vehículo y parte del estado del coche para completar tareas.&lt;/p&gt;
&lt;p&gt;Si el despliegue funciona bien, la interacción por voz en coches podría pasar de &amp;ldquo;recordar comandos&amp;rdquo; a &amp;ldquo;describir necesidades&amp;rdquo;. Eso importa mucho al conducir, porque un buen AI para el coche no debería exigir demasiada atención del conductor.&lt;/p&gt;
&lt;p&gt;Referencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.google/products-and-platforms/platforms/android/cars-with-google-built-in-gemini-tips-2026/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Your car with Google built-in is about to get smarter, thanks to Gemini - Google Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Cómo llamar a Google Nano Banana para recortar fondos de imágenes</title>
        <link>https://knightli.com/es/2026/04/09/google-nano-banana-cutout-guide/</link>
        <pubDate>Thu, 09 Apr 2026 20:10:48 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/04/09/google-nano-banana-cutout-guide/</guid>
        <description>&lt;p&gt;Este artículo usa un script Python realmente ejecutable para demostrar cómo llamar a la capacidad de edición de imágenes &lt;code&gt;Nano Banana&lt;/code&gt; de Google y recortar fondos de imágenes de producto.&lt;/p&gt;
&lt;p&gt;El objetivo de esta implementación es muy claro:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Leer imágenes de producto desde un directorio&lt;/li&gt;
&lt;li&gt;Llamar al modelo de imagen de Google para eliminar el fondo&lt;/li&gt;
&lt;li&gt;Hacer una limpieza local adicional del fondo transparente sobre la imagen devuelta&lt;/li&gt;
&lt;li&gt;Exportar finalmente como &lt;code&gt;PNG&lt;/code&gt; con fondo transparente&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si ya tienes un lote de imágenes de producto con fondo blanco, fotos de auriculares o cables, y quieres generar rápidamente imágenes de fondo transparente aptas para e-commerce, esta forma es bastante directa.&lt;/p&gt;
&lt;h2 id=&#34;qué-hace-este-código&#34;&gt;Qué hace este código
&lt;/h2&gt;&lt;p&gt;Este script se divide principalmente en 4 partes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Definir el prompt para que el modelo sepa que debe &amp;ldquo;quitar fondo, conservar sujeto, no añadir sombras&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Llamar a la interfaz de generación de imágenes de &lt;code&gt;google-genai&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Extraer el resultado de imagen desde la respuesta del modelo&lt;/li&gt;
&lt;li&gt;Usar lógica local para convertir fondos claros de los bordes en transparencia, reduciendo restos de borde&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Es decir, no se limita a enviar una imagen al modelo y terminar, sino que encadena &amp;ldquo;edición con modelo + posprocesamiento local&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;preparación-antes-de-ejecutar&#34;&gt;Preparación antes de ejecutar
&lt;/h2&gt;&lt;p&gt;Primero instala dependencias:&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;/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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.&lt;span class=&#34;se&#34;&gt;\.&lt;/span&gt;venv&lt;span class=&#34;se&#34;&gt;\S&lt;/span&gt;cripts&lt;span class=&#34;se&#34;&gt;\p&lt;/span&gt;ython.exe -m pip install google-genai pillow
&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;cómo-obtener-gemini_api_key&#34;&gt;Cómo obtener GEMINI_API_KEY
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GEMINI_API_KEY&lt;/code&gt; es la clave usada para llamar a Gemini API. Según el quickstart oficial de Google, si todavía no tienes una key, puedes crearla directamente en Google AI Studio.&lt;/p&gt;
&lt;p&gt;Pasos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Abre Google AI Studio.&lt;/li&gt;
&lt;li&gt;Inicia sesión con tu cuenta de Google.&lt;/li&gt;
&lt;li&gt;Busca la página &lt;code&gt;Get API key&lt;/code&gt; o &lt;code&gt;API keys&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Crea una nueva API key.&lt;/li&gt;
&lt;li&gt;Copia la key generada.&lt;/li&gt;
&lt;li&gt;Configúrala como variable de entorno local para que el script pueda leerla.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Si la página todavía no tiene un proyecto disponible, normalmente hay que completar primero la inicialización del proyecto y después volver a la página de API Key para crear la clave.&lt;/p&gt;
&lt;p&gt;Después de obtener la key, configura la variable de entorno:&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;/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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$env&lt;/span&gt;:GEMINI_API_KEY&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;your_api_key&amp;#34;&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 usas &lt;code&gt;cmd&lt;/code&gt;, puedes escribir:&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;/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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;GEMINI_API_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;your_api_key
&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 configuras a la vez &lt;code&gt;GEMINI_API_KEY&lt;/code&gt; y &lt;code&gt;GOOGLE_API_KEY&lt;/code&gt;, en ejecución normalmente se leerá primero &lt;code&gt;GOOGLE_API_KEY&lt;/code&gt;, así que se recomienda conservar solo una para evitar confusión.&lt;/p&gt;
&lt;h2 id=&#34;ejemplo-de-estructura-de-directorios&#34;&gt;Ejemplo de estructura de directorios
&lt;/h2&gt;&lt;p&gt;El script recibe dos parámetros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input_dir&lt;/code&gt;: directorio de imágenes de entrada&lt;/li&gt;
&lt;li&gt;&lt;code&gt;output_dir&lt;/code&gt;: directorio de imágenes de salida&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por ejemplo:&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;/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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;images/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  product1.jpg
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  product2.png
&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;output/
&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;cómo-ejecutarlo&#34;&gt;Cómo ejecutarlo
&lt;/h2&gt;&lt;p&gt;Suponiendo que el script se llame &lt;code&gt;cutout.py&lt;/code&gt;, se ejecuta 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;/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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.&lt;span class=&#34;se&#34;&gt;\.&lt;/span&gt;venv&lt;span class=&#34;se&#34;&gt;\S&lt;/span&gt;cripts&lt;span class=&#34;se&#34;&gt;\p&lt;/span&gt;ython.exe .&lt;span class=&#34;se&#34;&gt;\c&lt;/span&gt;utout.py .&lt;span class=&#34;se&#34;&gt;\i&lt;/span&gt;mages .&lt;span class=&#34;se&#34;&gt;\o&lt;/span&gt;utput
&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 quieres cambiar de modelo, también puedes pasar el parámetro explícitamente:&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;/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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.&lt;span class=&#34;se&#34;&gt;\.&lt;/span&gt;venv&lt;span class=&#34;se&#34;&gt;\S&lt;/span&gt;cripts&lt;span class=&#34;se&#34;&gt;\p&lt;/span&gt;ython.exe .&lt;span class=&#34;se&#34;&gt;\c&lt;/span&gt;utout.py .&lt;span class=&#34;se&#34;&gt;\i&lt;/span&gt;mages .&lt;span class=&#34;se&#34;&gt;\o&lt;/span&gt;utput --model gemini-2.5-flash-image
&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;El script recorrerá estos formatos dentro del directorio de entrada:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.jpg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.jpeg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.png&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.webp&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Al terminar, generará archivos &lt;code&gt;PNG&lt;/code&gt; con fondo transparente y el mismo nombre en el directorio de salida.&lt;/p&gt;
&lt;h2 id=&#34;flujo-principal-de-llamada&#34;&gt;Flujo principal de llamada
&lt;/h2&gt;&lt;p&gt;La llamada clave a Google Nano Banana está aquí:&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;/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;n&#34;&gt;response&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;models&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;generate_content&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;n&#34;&gt;model&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;contents&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;n&#34;&gt;PROMPT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;image&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Aquí se pasan dos contenidos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un prompt de texto &lt;code&gt;PROMPT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Una imagen &lt;code&gt;PIL.Image&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El prompt le pide al modelo eliminar el fondo completo de la imagen de producto, conservar solo el sujeto y enfatiza varios puntos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conservar el producto completo&lt;/li&gt;
&lt;li&gt;Conservar detalles de cables y líneas finas&lt;/li&gt;
&lt;li&gt;Limpiar huecos internos y zonas anulares&lt;/li&gt;
&lt;li&gt;No añadir objetos nuevos&lt;/li&gt;
&lt;li&gt;No añadir sombras&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Este tipo de prompt influye mucho en la calidad del recorte, especialmente en detalles como cables de auriculares, bordes transparentes y zonas huecas.&lt;/p&gt;
&lt;h2 id=&#34;por-qué-hacer-otro-posprocesamiento-local&#34;&gt;Por qué hacer otro posprocesamiento local
&lt;/h2&gt;&lt;p&gt;Después de que el modelo devuelve el resultado, el script no lo guarda directamente, sino que ejecuta &lt;code&gt;make_transparent_from_borders(image)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La idea de este paso es:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Buscar píxeles de fondo claros desde los bordes de la imagen&lt;/li&gt;
&lt;li&gt;Usar búsqueda en anchura para marcar todas las zonas claras conectadas&lt;/li&gt;
&lt;li&gt;Convertir finalmente esas zonas en transparentes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La ventaja es que puede limpiar mejor algunos bordes blancos residuales, fondos gris claro y zonas de borde poco limpias.&lt;/p&gt;
&lt;p&gt;La condición para decidir &amp;ldquo;si es fondo&amp;rdquo; está aquí:&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;/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;is_light_background_pixel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;bool&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;brightness&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;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&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;spread&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;min&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&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;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;brightness&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;170&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;spread&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;35&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 términos simples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El color debe ser suficientemente claro&lt;/li&gt;
&lt;li&gt;La diferencia entre los tres canales RGB no debe ser grande&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto encaja bien con fondos blancos, gris claro o casi de color sólido en imágenes de producto.&lt;/p&gt;
&lt;h2 id=&#34;código-fuente-completo&#34;&gt;Código fuente completo
&lt;/h2&gt;&lt;p&gt;Abajo se conserva el código fuente completo actual, para que puedas reutilizarlo o modificarlo directamente:&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;span class=&#34;lnt&#34;&gt; 16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 43
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 44
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 45
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 46
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 47
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 48
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 49
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 50
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 51
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 52
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 53
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 54
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 55
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 56
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 57
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 58
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 59
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 60
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 61
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 62
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 63
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 64
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 65
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 66
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 67
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 68
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 69
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 70
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 71
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 72
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 73
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 74
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 75
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 76
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 77
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 78
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 79
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 80
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 81
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 82
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 83
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 84
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 85
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 86
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 87
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 88
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 89
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 90
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 91
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 92
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 93
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 94
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 95
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 96
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 97
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 98
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 99
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;100
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;101
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;102
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;103
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;104
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;105
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;106
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;107
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;108
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;109
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;110
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;111
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;112
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;113
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;114
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;115
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;116
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;117
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;118
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;119
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;120
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;121
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;122
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;123
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;124
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;125
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;126
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;127
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;128
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;129
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;130
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;131
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;132
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;133
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;134
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;135
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;136
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;137
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;138
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;139
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;140
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;141
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;142
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;143
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;144
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;145
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;146
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;147
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;148
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;149
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;150
&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;__future__&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;annotations&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;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;argparse&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;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;os&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;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pathlib&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&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;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;collections&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;deque&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;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;PIL&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Image&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;try&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;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 class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;ImportError&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# pragma: no cover&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;raise&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;SystemExit&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;s2&#34;&gt;&amp;#34;Missing dependency: google-genai. Install it with &amp;#34;&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;sa&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#39;.\.venv\Scripts\python.exe -m pip install google-genai&amp;#39;.&amp;#34;&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 class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;exc&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;n&#34;&gt;PROMPT&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 class=&#34;s2&#34;&gt;&amp;#34;Remove the entire background from this product photo and return only the product &amp;#34;&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;s2&#34;&gt;&amp;#34;on a fully transparent background as a PNG. Keep the full product intact, preserve &amp;#34;&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;s2&#34;&gt;&amp;#34;thin cable details, clean the inner loops and holes, and do not add any new objects &amp;#34;&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;s2&#34;&gt;&amp;#34;or shadows.&amp;#34;&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&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;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;is_light_background_pixel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;bool&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;brightness&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;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&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;spread&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;min&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&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;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;brightness&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;170&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;spread&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;35&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;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;to_pil_image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;image_obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Image&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;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;image_obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Image&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;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;image_obj&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;pil_image&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;getattr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;image_obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;_pil_image&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&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;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pil_image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Image&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;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pil_image&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;as_pil&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;getattr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;image_obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;pil_image&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&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;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;as_pil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Image&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;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;as_pil&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;raise&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;TypeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Unsupported image object type: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;image_obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;!r}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&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&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;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;make_transparent_from_borders&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Image&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;rgba&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;convert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;RGBA&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;width&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;height&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rgba&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&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;pixels&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rgba&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;load&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;visited&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;tuple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;set&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;queue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;deque&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;tuple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;deque&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;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;push_if_bg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&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;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;visited&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;return&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;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pixels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&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;is_light_background_pixel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&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;visited&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&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;queue&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;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&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;x&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;width&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;push_if_bg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&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;push_if_bg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;height&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&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;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;height&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;push_if_bg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&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;push_if_bg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;width&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&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;while&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;queue&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;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;popleft&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;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ny&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&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 class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&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 class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&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 class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&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;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;width&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ny&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;height&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;push_if_bg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ny&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;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;visited&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;pixels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&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;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&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;n&#34;&gt;rgba&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;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;save_first_image_part&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&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;parts&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;getattr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;parts&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&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;parts&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;getattr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;candidates&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&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;parts&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;candidates&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&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;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parts&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;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parts&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;raise&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;RuntimeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Model returned no content parts.&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&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;part&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parts&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;inline_data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;getattr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;part&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;inline_data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&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;inline_data&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;part&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&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;inline_data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;part&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;inline_data&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&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;inline_data&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&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;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;hasattr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;part&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;as_image&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;image&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;to_pil_image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;part&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;as_image&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;dst&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parent&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mkdir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parents&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exist_ok&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&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;make_transparent_from_borders&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;save&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dst&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;return&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;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;getattr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inline_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&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;mime_type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;getattr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inline_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;mime_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&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;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&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;dst&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parent&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mkdir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parents&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exist_ok&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&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;with&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;wb&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;handle&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;handle&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&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;with&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;img&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;processed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;make_transparent_from_borders&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;img&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;processed&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;save&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dst&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;with_suffix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;.png&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;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dst&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;suffix&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lower&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;.png&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;dst&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unlink&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;missing_ok&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&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;return&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;raise&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;RuntimeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Model returned text only and no edited image.&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&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;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;process_image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#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 class=&#34;n&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&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;with&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;convert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;RGBA&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;image&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;response&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;models&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;generate_content&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;n&#34;&gt;model&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;contents&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;n&#34;&gt;PROMPT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;image&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;n&#34;&gt;save_first_image_part&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dst&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;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&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;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Use Nano Banana / Gemini image editing to cut out product images.&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;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_dir&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Path&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;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;output_dir&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Path&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;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;--model&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;gemini-2.5-flash-image&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;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parse_args&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;api_key&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;environ&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;GEMINI_API_KEY&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;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;api_key&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;raise&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;SystemExit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Missing GEMINI_API_KEY environment variable.&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&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 class=&#34;n&#34;&gt;api_key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;api_key&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;exts&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;s2&#34;&gt;&amp;#34;.jpg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;.jpeg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;.png&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;.webp&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&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;src&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;sorted&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;input_dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iterdir&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;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;is_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;suffix&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lower&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exts&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 class=&#34;n&#34;&gt;dst&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;output_dir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stem&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;.png&amp;#34;&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;process_image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dst&lt;/span&gt;&lt;span class=&#34;p&#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 class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;model&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;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dst&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;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;vm&#34;&gt;__name__&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;__main__&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;main&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;h2 id=&#34;qué-conviene-optimizar-después&#34;&gt;Qué conviene optimizar después
&lt;/h2&gt;&lt;p&gt;Si quieres seguir usando este script para producción por lotes, después puedes añadir:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reintentos ante fallos, para evitar que una sola imagen rompa todo el lote&lt;/li&gt;
&lt;li&gt;Registro de logs, para localizar qué imagen falló&lt;/li&gt;
&lt;li&gt;Umbrales configurables para distintos fondos&lt;/li&gt;
&lt;li&gt;Escaneo recursivo de subdirectorios&lt;/li&gt;
&lt;li&gt;Vista previa comparativa entre imagen original y resultado&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;Si solo quieres entender rápido &amp;ldquo;cómo llamar a Google Nano Banana para recortar fondos&amp;rdquo;, el núcleo son tres pasos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Instalar &lt;code&gt;google-genai&lt;/code&gt; y &lt;code&gt;Pillow&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Configurar &lt;code&gt;GEMINI_API_KEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Usar &lt;code&gt;client.models.generate_content()&lt;/code&gt; pasando prompt e imagen&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;El valor de este código está en que no solo llama al modelo, sino que añade posprocesamiento de fondo transparente, por lo que sirve mejor para tareas reales de recorte de imágenes de producto.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Comparación de modelos Google Gemma 4: cómo elegir entre 2B/4B/26B/31B</title>
        <link>https://knightli.com/es/2026/04/05/google-gemma-4-model-comparison/</link>
        <pubDate>Sun, 05 Apr 2026 08:30:00 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/04/05/google-gemma-4-model-comparison/</guid>
        <description>&lt;p&gt;Gemma 4 se centra en la &amp;ldquo;multimodalidad&amp;rdquo; y la &amp;ldquo;inferencia local fuera de línea&amp;rdquo;, con una gama completa desde modelos livianos hasta modelos de alto rendimiento. Para la mayoría de los usuarios de implementación local, la clave no es elegir el modelo más grande, sino el que mejor se adapte a las necesidades de hardware y tareas.&lt;/p&gt;
&lt;h2 id=&#34;comparación-de-modelos-gemma-4&#34;&gt;Comparación de modelos Gemma 4
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;La siguiente tabla es para una selección rápida del modelo. El rendimiento real y el uso de recursos deben validarse en su propio entorno.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Modelo&lt;/th&gt;
          &lt;th&gt;Tamaño del parámetro&lt;/th&gt;
          &lt;th&gt;Posicionamiento&lt;/th&gt;
          &lt;th&gt;Fortalezas clave&lt;/th&gt;
          &lt;th&gt;Principales limitaciones&lt;/th&gt;
          &lt;th&gt;Escenarios recomendados&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Gema 4 2B&lt;/td&gt;
          &lt;td&gt;2B&lt;/td&gt;
          &lt;td&gt;Ultraligero&lt;/td&gt;
          &lt;td&gt;Baja latencia, bajo uso de recursos, barrera de implementación más baja&lt;/td&gt;
          &lt;td&gt;Rendimiento limitado en razonamientos complejos y largas cadenas de tareas&lt;/td&gt;
          &lt;td&gt;Móvil, IoT, preguntas y respuestas ligeras, automatización sencilla&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Gema 4 4B&lt;/td&gt;
          &lt;td&gt;4B&lt;/td&gt;
          &lt;td&gt;Ligero mejorado&lt;/td&gt;
          &lt;td&gt;Mayor comprensión y generación que 2B, aún fácil de implementar localmente&lt;/td&gt;
          &lt;td&gt;Límite limitado para codificación pesada y tareas complejas de agentes&lt;/td&gt;
          &lt;td&gt;Asistente local, trabajo documental básico, tareas diarias multilingües&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Gema 4 26B&lt;/td&gt;
          &lt;td&gt;26B&lt;/td&gt;
          &lt;td&gt;Alto rendimiento (MoE)&lt;/td&gt;
          &lt;td&gt;Mejor razonamiento y uso de herramientas, adecuado para flujos de trabajo de producción&lt;/td&gt;
          &lt;td&gt;Requisito de VRAM y umbral de hardware significativamente mayores&lt;/td&gt;
          &lt;td&gt;Asistente de codificación, flujos de trabajo complejos, agentes internos empresariales&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Gema 4 31B&lt;/td&gt;
          &lt;td&gt;31B&lt;/td&gt;
          &lt;td&gt;Alto rendimiento (denso)&lt;/td&gt;
          &lt;td&gt;Mejor capacidad general y mayor estabilidad en tareas complejas&lt;/td&gt;
          &lt;td&gt;Mayor coste de recursos y complejidad de ajuste&lt;/td&gt;
          &lt;td&gt;Razonamiento avanzado, tareas de codificación complejas, automatización intensa&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;cómo-elegir-comenzar-desde-hardware-y-tareas&#34;&gt;Cómo elegir: comenzar desde hardware y tareas
&lt;/h2&gt;&lt;p&gt;Si su principal preocupación es si funciona sin problemas, utilice esta guía:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VRAM &lt;code&gt;8GB&lt;/code&gt;: prioriza &lt;code&gt;2B/4B&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;VRAM &lt;code&gt;12GB&lt;/code&gt;: prioriza &lt;code&gt;4B&lt;/code&gt; o variantes cuantificadas de modelos más grandes.&lt;/li&gt;
&lt;li&gt;VRAM &lt;code&gt;24GB&lt;/code&gt;: céntrese en &lt;code&gt;26B&lt;/code&gt; y evalúe &lt;code&gt;31B&lt;/code&gt; cuantificados según la carga de trabajo.&lt;/li&gt;
&lt;li&gt;Mayor VRAM o multi-GPU: considere configuraciones &lt;code&gt;31B&lt;/code&gt; de alta precisión.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Primero, priorice la estabilidad y la velocidad de inferencia y luego aumente gradualmente el tamaño del modelo.&lt;/p&gt;
&lt;h2 id=&#34;cuatro-casos-de-uso-típicos&#34;&gt;Cuatro casos de uso típicos
&lt;/h2&gt;&lt;h3 id=&#34;1-asistente-general-local&#34;&gt;1) Asistente General Local
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Modelo preferido: &lt;code&gt;4B&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Por qué: fuerte equilibrio entre coste y calidad, adecuado para un uso local a largo plazo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-codificación-y-automatización&#34;&gt;2) Codificación y automatización
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Modelo preferido: &lt;code&gt;26B&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Por qué: más estable en tareas de varios pasos, llamadas a herramientas y generación de scripts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-razonamiento-avanzado-y-agentes-complejos&#34;&gt;3) Razonamiento avanzado y agentes complejos
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Modelo preferido: &lt;code&gt;31B&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Por qué: mayor solidez en un contexto complejo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;4-dispositivos-perimetrales-y-uso-ligero-sin-conexión&#34;&gt;4) Dispositivos perimetrales y uso ligero sin conexión
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Modelo preferido: &lt;code&gt;2B&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Por qué: es más fácil de implementar en dispositivos con recursos limitados.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;sugerencias-de-implementación-ollama&#34;&gt;Sugerencias de implementación (Ollama)
&lt;/h2&gt;&lt;p&gt;Un enfoque práctico es iterar en pequeños pasos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Comience con &lt;code&gt;4B&lt;/code&gt; para establecer una línea de base (latencia, memoria, calidad).&lt;/li&gt;
&lt;li&gt;Cree un conjunto de pruebas fijo a partir de tareas reales (por ejemplo, 20 preguntas comunes + 10 tareas de automatización).&lt;/li&gt;
&lt;li&gt;Compare &lt;code&gt;26B/31B&lt;/code&gt; con el conjunto en cuanto a precisión, latencia y costo de VRAM.&lt;/li&gt;
&lt;li&gt;Actualice sólo cuando la ganancia sea clara.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Esto evita saltar a un modelo grande demasiado pronto y sufrir retrasos, bajo rendimiento y gastos generales de mantenimiento.&lt;/p&gt;
&lt;h2 id=&#34;conclusión&#34;&gt;Conclusión
&lt;/h2&gt;&lt;p&gt;El valor real de Gemma 4 no es sólo un mayor número de parámetros, sino también un modelo práctico que permite pasar de ser liviano a uno de alto rendimiento:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Para una implementación rápida y de bajo costo: comience con &amp;ldquo;2B/4B&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Para flujos de trabajo de IA locales de nivel de producción: priorice &amp;ldquo;26B&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Para razonamiento avanzado y automatización intensa: pase a &lt;code&gt;31B&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En la mayoría de los casos, la mejor opción de Gemma 4 no es el modelo más grande, sino el que mejor se adapta a su hardware y objetivos de tareas.&lt;/p&gt;
&lt;!-- enlaces-relacionados-con-ollama:inicio --&gt;
&lt;h2 id=&#34;publicaciones-relacionadas&#34;&gt;Publicaciones relacionadas
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://knightli.com/es/2026/04/05/llm-quantization-guide-fp16-q4-q2/&#34; &gt;Guía de Cuantización LLM (FP16/Q8/Q5/Q4/Q2)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Desinstalar completamente Ollama en Linux&lt;/li&gt;
&lt;li&gt;Ruta de almacenamiento y migración del modelo Ollama&lt;/li&gt;
&lt;li&gt;Cómo comprobar si Ollama usa GPU&lt;/li&gt;
&lt;li&gt;Cómo instalar y ejecutar Gemma 4 en Android&lt;/li&gt;
&lt;li&gt;Cómo ejecutar Gemma 4 en una computadora portátil: guía de configuración local de 5 minutos&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- enlaces-relacionados-con-ollama:end --&gt;
</description>
        </item>
        
    </channel>
</rss>
