
Migración a Gemini 3.6 Flash: cinco cambios de API y un fallo silencioso
TL;DR Migrar agemini-3.6-flashogemini-3.5-flash-liteimplica cinco cambios en la solicitud. Cuatro de ellos devuelven HTTP 400, así que te enteras de inmediato. Uno no:temperature,top_pytop_kahora se aceptan y se ignoran. Si tu pipeline depende detemperature=0para obtener una salida estable, seguirá devolviendo 200 OK mientras la garantía con la que contabas deja de existir. Corrige ese primero, y luego los cuatro ruidosos.Last verified: 2026-07-21
Si vas a cambiar un ID de modelo en un archivo de configuración esperando que todo lo demás siga funcionando, lee la primera sección antes de desplegar.
Los cinco cambios, ordenados por lo rápido que te enteras
| Cambio | Qué ocurre en los nuevos modelos | Cómo te enteras |
|---|---|---|
temperature, top_p, top_k | Se aceptan y luego se ignoran | Nada. Ni error, ni advertencia. |
thinking_budget enviado junto con thinking_level | Solicitud rechazada | HTTP 400 |
El último turno de la solicitud tiene el rol model | Solicitud rechazada | HTTP 400 |
FunctionResponse sin call_id ni name | Solicitud rechazada | HTTP 400 |
candidate_count | No soportado en Gemini 3.x | La solicitud falla o el campo se descarta |
Cuatro de estos cinco fallos se anuncian solos. Tus pruebas de integración los detectan, tu rastreador de errores te avisa, los corriges en una tarde. El primero es el que llega a producción.
El peligroso: temperature, top_p y top_k ahora se ignoran
Lee esa secuencia con atención, porque el orden te importa. Hoy el parámetro es un no-op. Más adelante se convierte en un error. Eso significa que el período en el que es más probable que te equivoques sobre tu propio sistema es justo ahora, mientras todo sigue devolviendo 200.

Qué pipelines se rompen sin dar error
Un no-op silencioso solo es peligroso si dependías del parámetro. Cuatro configuraciones comunes lo hacían:
- Pipelines de determinismo. Cualquier cosa que fije
temperature=0para que las llamadas repetidas coincidan entre sí: claves de caché construidas a partir de la salida del modelo, pasadas de deduplicación, trabajos de clasificación que alimentan una máquina de estados aguas abajo. El ajuste ahora es inerte, así que la estabilidad de salida que te compraba ya no se compra. - Pruebas golden-file y de snapshot. Suites que fijaban
temperature=0y comparan (diff) la salida del modelo contra una cadena esperada guardada. Empiezan a fallar de forma intermitente tras el cambio de modelo, y esa intermitencia parece una regresión de calidad del modelo en lugar de un problema de configuración, lo que te manda a depurar en la dirección equivocada. - Salida estructurada sostenida por temperatura baja. Equipos que nunca adoptaron los structured outputs y en su lugar mantenían
temperaturecerca de cero más untop_pajustado para que el modelo emitiera JSON parseable de forma fiable. Ambas perillas quedan inertes a la vez. - Configuraciones ajustadas por ruta. Productos que exponen un control deslizante de creatividad, o que enrutan "resumir" a una temperatura y "hacer lluvia de ideas" a otra. El control deslizante todavía se mueve en tu UI. Ya no mueve nada en el modelo.
Ninguno de estos produce un stack trace. Producen una salida ligeramente distinta de la que validaste, en un sistema que se declara sano.
Tu gateway tampoco te advertirá
Esta es la parte que atrapa incluso a equipos cuidadosos. Los gateways de modelos publican metadatos legibles por máquina que describen qué parámetros soporta cada modelo, y el tooling lee esos metadatos para decidir qué enviar.
temperature, top_p y seed en supported_parameters tanto para google/gemini-3.6-flash como para google/gemini-3.5-flash-lite. El gateway acepta esos campos y los reenvía. El modelo al otro lado los ignora. Nada en esa cadena lanza un error, y nada en los metadatos te dice que el campo está muerto.Qué reemplaza a temperature
El reemplazo que Google indica no es otro parámetro. Es la system instruction: escribe el comportamiento que quieres como una regla que el modelo lee, en lugar de como una constante de muestreo.
Ese es un cambio real en cómo expresas la intención, así que traduce en lugar de borrar:
| Lo que antes codificabas como un número | A dónde va ahora |
|---|---|
temperature=0 para respuestas escuetas y repetibles | Una system instruction que indique el formato, la longitud y el tono requeridos, más una regla para responder sin preámbulo |
| Temperatura baja para mantener el JSON parseable | Structured outputs, que gemini-3.6-flash y gemini-3.5-flash-lite soportan ambos |
| Temperatura alta para variedad | Una instrucción que pida N opciones distintas en una sola respuesta, ya que candidate_count también desapareció |
temperature y candidate_count en la misma migración retira los dos mecanismos que los equipos usaban para la variedad de salida. Si una función tuya dependía de la variedad, necesita un rediseño real, no una edición de configuración.Cómo encontrar cada sitio de llamada antes de desplegar
Busca en tu código los nombres de los parámetros en lugar de confiar en la capa de configuración, porque estos valores suelen fijarse en varios sitios por distintas personas:
# Formas nativas de Gemini y compatibles con OpenAI, más los objetos de configuración que las llevan
grep -rn "temperature\|top_p\|topP\|top_k\|topK\|candidate_count\|candidateCount" \
--include="*.py" --include="*.ts" --include="*.js" --include="*.go" --include="*.java" .
# Los wrappers que las esconden
grep -rn "generation_config\|generationConfig\|GenerateContentConfig\|thinking_budget\|thinkingBudget" .Revisa los resultados también fuera del código de aplicación: configuración YAML y JSON, herramientas de gestión de prompts, notebooks, arneses de evaluación, y cualquier Terraform o consola de administración que almacene ajustes de modelo. Una perilla puesta en un dashboard hace seis meses es exactamente el tipo de cosa que sobrevive a un code review.
Los cuatro que fallan de forma ruidosa
Estos son más sencillos, porque la API te lo dice. Corrígelos en el orden en que tu suite de pruebas los saque a la luz.
thinking_budget y thinking_level no pueden estar ambos presentes
thinking_budget numérico por el enum de cadena thinking_level, que toma minimal, low, medium o high. Enviar ambos en una misma solicitud devuelve 400. La nota de migración de Google es reemplazar thinking_budget por thinking_level, no mantener ambos por compatibilidad.Dos valores por defecto que conviene conocer al elegir un valor, porque difieren entre los dos modelos:
gemini-3.6-flashusa por defectomedium.gemini-3.5-flash-liteusa por defectominimal, que está optimizado para throughput.
minimal de Flash-Lite no es adecuado para usarlo como subagente autónomo, y que en tareas de varios pasos terminará las llamadas a herramientas de forma prematura. Si Flash-Lite va a escribir código, ejecutar comandos de terminal o llamar a APIs externas por ti, súbelo a medium o high deliberadamente. Esta es la única edición de la migración donde aceptar el valor por defecto es una decisión de producto real y no un formalismo.minimal, en una cadena de notificaciones de tres pasos, fallando los tres intentos. La forma fue idéntica cada vez. Llamó a las dos primeras herramientas correctamente, luego se detuvo y reportó éxito sin enviar la notificación final. Sin error, sin excepción, una respuesta bien formada que un servicio aguas abajo aceptaría. Subir el mismo modelo a high superó la tarea todas las veces.thinking_level sin fijar, la solicitud no fallará. Devolverá una respuesta segura sobre un trabajo que no terminó. Fija el nivel explícitamente, y luego haz aserciones sobre los efectos que tu flujo de trabajo debía producir, en lugar de sobre la respuesta que recibiste de vuelta.Ya no puedes prellenar un turno del modelo
model, la API devuelve 400. El prefill era un truco común: añadías un turno de asistente parcial como {"role": "model", "parts": [{"text": "{"}]} para forzar al modelo a abrir con una llave JSON, o para suprimir un preámbulo parlanchín.Ambos objetivos se mueven a los mismos dos sitios que todo lo demás: una system instruction que indique la regla, o structured outputs cuando necesitas una forma parseable por máquina. Busca en tu código cualquier constructor de solicitudes que añada un mensaje final de asistente o de modelo, sobre todo la lógica de reintentos y de continuación, que es donde los prefills tienden a generarse de forma dinámica en lugar de escribirse literalmente.
Cada FunctionResponse necesita call_id y name
generateContent, cada FunctionResponse debe llevar tanto el call_id correspondiente como el name de la función. Los bucles de herramientas hechos a mano son la víctima habitual aquí, porque muchos se escribieron cuando bastaba con un resultado pelado y reconstruyen el objeto de respuesta desde cero en lugar de devolver lo que el modelo envió.call_id de la function call del modelo y vuelve a ponerlo en la respuesta que devuelves. Si construiste tu bucle de herramientas sobre un framework, actualiza el framework en lugar de parchear alrededor.candidate_count desapareció
candidate_count no está soportado en Gemini 3.x. Elimínalo. Si lo usabas para muestrear varias respuestas y elegir la mejor, esa lógica ahora tiene que ser explícita: o pides varias opciones dentro de una respuesta, o lanzas varias solicitudes y las pagas por separado.Antes y después: una solicitud que migra limpiamente
Aquí tienes una llamada nativa de Gemini que lleva todos los campos obsoletos, y la versión que sobrevive al cambio.
# ANTES: funciona en modelos de la era 2.5, se rompe o se comporta mal en silencio en 3.6 Flash
config = {
"temperature": 0, # ahora se ignora, sin error
"top_p": 0.95, # ahora se ignora, sin error
"top_k": 40, # ahora se ignora, sin error
"candidate_count": 1, # no soportado en Gemini 3.x
"thinking_budget": 8192, # 400 si coincide con thinking_level
}
# DESPUÉS: la intención se movió de las constantes de muestreo a las instrucciones
config = {
"system_instruction": (
"Responde en tres frases como máximo. Usa frases declarativas simples. "
"No añadas preámbulo, no repitas la pregunta ni ofrezcas seguimientos. "
"Si la respuesta es incierta, dilo en una frase."
),
"thinking_level": "medium",
}temperature=0 en un archivo de configuración nunca se explicó a sí mismo.import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["EVOLINK_API_KEY"],
base_url="https://api.evolink.ai/v1"
)
response = client.chat.completions.create(
model="gemini-3.6-flash",
messages=[
{"role": "system", "content": "Responde en tres frases como máximo. Sin preámbulo."},
{"role": "user", "content": "Resume este informe de incidente."}
]
# sin temperature, sin top_p: se aceptarían y se ignorarían aguas abajo
)
print(response.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env["EVOLINK_API_KEY"],
baseURL: "https://api.evolink.ai/v1",
});
const response = await client.chat.completions.create({
model: "gemini-3.6-flash",
messages: [
{ role: "system", content: "Responde en tres frases como máximo. Sin preámbulo." },
{ role: "user", content: "Resume este informe de incidente." },
],
// sin temperature, sin top_p
});
console.log(response.choices[0].message.content);gemini-3.6-flash. No hay sufijo preview ni sello de fecha, así que no hay ningún alias con fecha que fijar. Si tu proceso de despliegue asume que existe una variante -preview o -001, esa suposición falla en el momento de la solicitud.Un orden de migración que atrapa el fallo silencioso
La secuencia importa, porque los errores ruidosos son fáciles y el silencioso no lo es. Hazlo en este orden:

- Inventaría primero. Ejecuta los greps de arriba y lista cada sitio donde se fija un parámetro de muestreo, incluidos almacenes de configuración y dashboards. Anota qué comportamiento estaba protegiendo cada uno.
- Traduce la intención, no la borres sin más. Por cada
temperatureque encuentres, decide para qué servía y escribe la system instruction equivalente. Borrar sin traducir es como envías una regresión de calidad. - Corrige los 400. Cambia
thinking_budgetporthinking_level, eliminacandidate_count, quita los turnos de modelo prellenados, añadecall_idynamea cadaFunctionResponse. - Elige un nivel de thinking a propósito, sobre todo en Flash-Lite, donde el valor por defecto
minimalno es adecuado para trabajo autónomo de varios pasos. Esta es además la mayor palanca de coste de la migración: en nuestro conjunto de tareas, 3.6 Flash enminimalcostó un 73,6 % menos por pasada que el mismo modelo en el valor por defectomedium, y los tokens de thinking supusieron el 85 % de la salida facturada enmedium. Lo que hay que probar es si tu carga de trabajo sobrevive a la bajada, no si el ahorro es real. - Regenera la baseline de tus pruebas de snapshot contra el nuevo modelo antes de comparar nada. Los golden files antiguos se produjeron bajo un parámetro que ya no aplica, así que no son un punto de referencia válido.
- Ejecuta tus evaluaciones en ambos modelos sobre el mismo conjunto de tareas y compara las distribuciones de salida, no solo las tasas de aprobado. Los cambios de comportamiento silenciosos aparecen como deriva en formato, longitud y verbosidad antes de aparecer como respuestas incorrectas.
- Haz canary sobre tráfico real y vigila los parsers aguas abajo, no solo la tasa de error de la API. Si algo se va a romper en silencio, se rompe en el código que consume la salida del modelo, no en la llamada en sí.
temperature=0 todavía hacía algo, cada diff parece un problema del modelo y ninguno lo es.Deja que la skill de migración de Google haga la primera pasada
npx skills add google-gemini/gemini-skills --skill gemini-interactions-api --globalLuego, en un agente de codificación, apúntalo a tu proyecto:
/gemini-interactions-api migrate my app to Gemini 3.6 Flash
Vale la pena ejecutarla. Se ocupa del trabajo mecánico: encontrar campos obsoletos, reescribir la construcción de solicitudes, actualizar sitios de llamada, lo que cubre la mayor parte del paso 3 de arriba.
temperature=0 debería eliminarse. No puede saber que el valor estaba ahí porque un servicio aguas abajo asumía una salida idéntica ante una entrada idéntica, y no puede escribir la system instruction que preserva esa intención. Trata la skill como una pasada de barrido de código, y luego haz tú mismo la traducción de intención.Calendario de retirada: cuándo la elección deja de ser tuya
| Modelo | Fecha de apagado | Reemplazo recomendado |
|---|---|---|
gemini-2.5-flash | 2026-10-16 | gemini-3.6-flash |
gemini-2.5-flash-lite | 2026-10-16 | gemini-3.1-flash-lite |
gemini-3.1-flash-lite | 2027-05-07 | gemini-3.5-flash-lite |
gemini-3-flash-preview | Sin fecha de apagado anunciada | gemini-3.6-flash |
gemini-3.6-flash, gemini-3.5-flash-lite | Sin fecha de apagado anunciada | No aplica |
gemini-2.5-flash-lite es gemini-3.1-flash-lite, no el recién lanzado gemini-3.5-flash-lite. Saltar directamente al modelo Lite más nuevo es una elección defendible, pero es tu elección, no la ruta de actualización documentada, y es un salto de dos generaciones en lugar de una. Planifícalo y pruébalo como tal.gemini-3-flash-preview, no hay fecha de fin anunciada, pero los modelos preview no son algo sobre lo que construir una hoja de ruta.Computer Use: cuatro páginas oficiales, dos respuestas
Una cuestión de capacidad no puede resolverse ahora mismo desde la documentación. Si estos modelos soportan Computer Use se afirma de forma inconsistente en el propio material de Google:
- La documentación de modelos de la API de Gemini marca Computer Use como soportado (preview) para 3.6 Flash, mientras que la página de plataforma empresarial del mismo modelo lo lista como no soportado.
- Para 3.5 Flash-Lite, las páginas de modelo dicen que no está soportado, mientras que el anuncio de lanzamiento y la guía para desarrolladores de Gemini 3 dicen que funciona.
Cuatro páginas oficiales, dos respuestas contradictorias, sin forma de resolverlo leyendo. Si Computer Use está en tu ruta crítica, pruébalo en tu propia cuenta y endpoint antes de comprometerte, y ten un modelo de reserva conectado. Esta sección se actualizará con una respuesta probada y la fecha en que se observó. Todos los demás cambios de esta guía están documentados de forma consistente; este no.
Qué significa esto si esta semana estás reeligiendo proveedor
Una migración que no habías planificado ha aterrizado en tu sprint, y el trabajo es un día o dos de edición cuidadosa en lugar de una reescritura de fin de semana. Como ya estás tocando cada sitio de llamada, este es un momento natural para mirar cómo te llega el modelo en primer lugar.
Vale la pena comprobar dos cosas mientras estás ahí:
- ¿Puedes ejecutar los modelos viejo y nuevo en paralelo durante el cambio? El paso 6 de arriba lo requiere. Si tu montaje hace que ejecutar
gemini-3.5-flashygemini-3.6-flashcontra el mismo conjunto de tareas sea incómodo, esa fricción seguirá ahí para la próxima migración también, y habrá una próxima: Google ha dicho que estas reglas se aplican a todos los modelos que se publiquen de aquí en adelante. - ¿Con qué rapidez se vuelve invocable un nuevo modelo para ti?
gemini-3.6-flashllegó a disponibilidad general sin sufijo preview el primer día. La brecha entre que un modelo se lanza y que tu código pueda invocarlo es un coste que pagas en cada lanzamiento.
model en lugar de un segundo SDK y un segundo juego de credenciales, y los modelos nuevos están disponibles a través del mismo endpoint que ya usas. Si quieres ver primero el estado actual de este modelo en concreto, nuestro rastreador de lanzamiento de Gemini 3.6 Flash tiene detalles de disponibilidad y del ID del modelo, y la comparativa 3.6 Flash frente a 3.5 Flash cubre si la actualización merece la pena en absoluto, que es una pregunta distinta de cómo hacerla de forma segura.gemini-3.6-flash ya no lo hacen.FAQ
temperature, top_p y top_k se aceptan y se ignoran, sin error y sin advertencia. Google ha afirmado que futuras generaciones de modelos devolverán HTTP 400 para estos parámetros, así que el silencio es temporal, pero por ahora una solicitud que los lleve parece completamente sana.thinking_level con los valores minimal, low, medium y high. Enviar thinking_budget y thinking_level en la misma solicitud devuelve HTTP 400. El valor por defecto es medium en 3.6 Flash y minimal en 3.5 Flash-Lite.gemini-3.1-flash-lite, no gemini-3.5-flash-lite, y da una fecha de apagado del 16 de octubre de 2026. Puedes moverte a 3.5 Flash-Lite en su lugar, pero eso es un salto de dos generaciones y una decisión tuya en lugar de la ruta documentada.thinking_level, la restricción de prefill, los requisitos de FunctionResponse y la eliminación de candidate_count aplican todos también a gemini-3.5-flash-lite, y Google ha dicho que aplican a todos los modelos que se publiquen después de estos dos. Los cambios de código son los mismos en ambos casos, así que puedes empezar la migración antes de haber decidido a cuál de los dos te mueves. Esa elección es una cuestión aparte, cubierta en nuestra comparativa Gemini 3.6 Flash frente a 3.5 Flash-Lite.gemini-3.6-flash, sin sufijo preview y sin sello de fecha. Si tu tooling de despliegue espera un alias con fecha, fallará en el momento de la solicitud.Fuentes
- Using the latest Gemini models (Google AI for Developers): parámetros de muestreo obsoletos,
thinking_level,candidate_count, restricción de prefill, requisitos deFunctionResponse, comando de la skill de migración - Gemini deprecations (Google AI for Developers): fechas de apagado y reemplazos recomendados
- Gemini API models (Google AI for Developers): IDs de modelo, matriz de soporte de capacidades
- Gemini 3 developer guide (Google AI for Developers): comportamiento de solicitud y capacidades de Gemini 3
- Gemini 3.6 Flash on Gemini Enterprise Agent Platform (Google Cloud): listado de capacidades empresariales y valores por defecto de parámetros mostrados
- Introducing Gemini 3.6 Flash, 3.5 Flash-Lite, and 3.5 Flash Cyber (Google): anuncio de lanzamiento y fecha de publicación
- google-gemini/gemini-skills (GitHub): la skill de migración oficial
- OpenRouter models endpoint (OpenRouter): metadatos del gateway que listan
temperature,top_pyseedcomo parámetros soportados para ambos modelos, observado el 2026-07-21 - Catálogo de modelos de EvoLink, rastreador de lanzamiento de Gemini 3.6 Flash, Gemini 3.6 Flash vs Gemini 3.5 Flash, guía de migración de Gemini 3.5 Flash vs Gemini 3 Flash Preview, guía de deprecación de Gemini 3 Pro, URL base de la API de EvoLink


