Llamas a Gemini Omni 1.1 Flash con el ID de modelo gemini-omni-1.1-flash a través de la API de Interacciones de Google, no el endpoint generateContent que usas para los modelos de texto. Eso es lo primero que confunde a la gente. Si copias un fragmento de texto de Gemini y cambias el nombre del modelo, obtendrás un 404.
Esta guía te lleva desde una terminal vacía hasta una solicitud probada de generación de video. Obtendrás una clave, harás tu primera llamada en curl y Python, aprenderás los parámetros existentes (y la sorprendente lista de los que no existen), manejarás respuestas grandes y guardarás todo como una prueba repetible.
El modelo pasó a disponibilidad general (GA) el 27 de agosto de 2026. Para ver lo que se lanzó con él, consulta novedades en Gemini Omni 1.1 Flash.
Lo que necesitas antes de empezar
- Una cuenta de Google, para iniciar sesión en AI Studio.
- Una clave de API de Gemini de Google AI Studio.
- Facturación habilitada. Omni no tiene un nivel gratuito, a diferencia de la opción gratuita en los modelos de texto. Tu primera solicitud cuesta dinero.
- Una forma de enviar solicitudes HTTP: curl, el SDK de Python o un cliente de API.
Guarda la clave como una variable de entorno en lugar de pegarla en el código fuente:
export GEMINI_API_KEY="your_key_here"
Los SDK oficiales leen esa variable por sí mismos, lo que mantiene el secreto fuera de tu repositorio.
Tu primera llamada de generación de video
El endpoint es un POST a /v1beta/interactions. Aquí está en curl:
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions?key=$GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-omni-1.1-flash",
"input": "A marble rolling fast on a chain reaction style track, continuous smooth shot."
}'
Dos campos: el modelo y la entrada. Esa es toda la solicitud mínima. La respuesta lleva el video generado como base64 en output_video.data.
En Python, instala el SDK con pip install google-genai, luego:
import base64
from google import genai
client = genai.Client() # reads GEMINI_API_KEY from the environment
interaction = client.interactions.create(
model="gemini-omni-1.1-flash",
input="A marble rolling fast on a chain reaction style track, continuous smooth shot.",
)
with open("marble.mp4", "wb") as f:
f.write(base64.b64decode(interaction.output_video.data))
JavaScript sigue la misma estructura con @google/genai:
import { GoogleGenAI } from '@google/genai';
import * as fs from 'fs';
const ai = new GoogleGenAI({});
const interaction = await ai.interactions.create({
model: 'gemini-omni-1.1-flash',
input: 'A marble rolling fast on a chain reaction style track, continuous smooth shot.',
});
if (interaction.output_video?.data) {
fs.writeFileSync('marble.mp4', Buffer.from(interaction.output_video.data, 'base64'));
}
La generación lleva tiempo. La latencia escala con la duración, la resolución y la carga actual de la API, así que establece un tiempo de espera del cliente generoso antes de decidir que algo está roto.
Controlando la resolución y la relación de aspecto
Todo lo relacionado con el formato de salida va en response_format:
interaction = client.interactions.create(
model="gemini-omni-1.1-flash",
input="A drone shot of a mountain landscape at sunrise.",
response_format={
"type": "video",
"aspect_ratio": "16:9",
"resolution": "1080p",
},
)
Los valores aceptados:
| Campo | Valores | Por defecto |
|---|---|---|
type |
video |
video |
aspect_ratio |
16:9, 9:16 |
16:9 |
resolution |
360p, 720p, 1080p, 4k |
720p |
delivery |
base64 en línea, uri |
en línea |
Haz borradores en 360p. Genera hasta un 60% más rápido que 720p y cuesta un tercio, así que tus quince intentos de prompt descartables cuestan lo que solían costar cinco. Vuelve a renderizar el que conserves a una resolución más alta. 1080p y 4k son escalados de los fotogramas generados, no renderizados nativos. El desglose de precios muestra lo que cada nivel cuesta por segundo.
Los parámetros que no existen
Esta lista importa más que la anterior, porque de lo contrario perderás una tarde:
- Sin instrucciones del sistema
- Sin
temperature - Sin
top_p - Sin secuencias de parada
- Sin campo de prompt negativo
Si necesitas excluir algo de una toma, escribe la exclusión en el propio prompt. El propio ejemplo de la documentación hace exactamente eso: “usando el dibujo solo como guía para el movimiento, no muestres el dibujo en el video final”
Entradas de imagen, fotogramas clave y referencias
Pasa una lista en lugar de una cadena cuando quieras incluir medios. Imagen a video:
interaction = client.interactions.create(
model="gemini-omni-1.1-flash",
input=[
{"type": "image", "data": base64_image, "mime_type": "image/jpeg"},
{"type": "text", "text": "turn this into realistic footage, using the drawing only as a guide for movement, do not show the drawing in the final video"},
],
)
Dos imágenes se convierten en un primer fotograma y un último fotograma, y el modelo genera el movimiento entre ellas:
interaction = client.interactions.create(
model="gemini-omni-1.1-flash",
input=[
{"type": "image", "data": first_frame_b64, "mime_type": "image/jpeg"},
{"type": "image", "data": last_frame_b64, "mime_type": "image/jpeg"},
{"type": "text", "text": "A smooth cinematic transition from a lush green forest at sunrise to a snowy forest under a starry night sky."},
],
)
Las referencias de video funcionan de la misma manera a través de la API de Archivos, con un límite de tres clips de tres segundos cada uno. El audio de esos clips se ignora; el modelo los lee para el movimiento y la apariencia.
Edición de múltiples turnos
Esto es lo que separa a Omni de un simple endpoint de texto a video. Genera una vez, luego edita conversacionalmente pasando el ID de interacción anterior:
res1 = client.interactions.create(
model="gemini-omni-1.1-flash",
input="A woman playing violin outdoors.",
)
res2 = client.interactions.create(
model="gemini-omni-1.1-flash",
previous_interaction_id=res1.id,
input="Make the violin invisible.",
)
Sin volver a subir, sin volver a describir la escena. El mismo mecanismo impulsa la extensión de escenas, que se cubre en la guía de extensión de 40 segundos.
Manejo de videos de más de 4 MB
Cualquier cosa de más de 4 MB se devuelve como una URI en lugar de base64 en línea, y el archivo necesita terminar de procesarse antes de que puedas descargarlo. Este es el error que la mayoría de la gente encuentra en 1080p: su manejador lee output_video.data, no encuentra nada y reporta un fallo silencioso.
Pide la entrega de URI explícitamente y haz un sondeo:
import time
from google import genai
client = genai.Client()
interaction = client.interactions.create(
model="gemini-omni-1.1-flash",
input="A beautiful sunset.",
response_format={"type": "video", "delivery": "uri"},
)
video_output = interaction.output_video
file_name = video_output.uri.split("/")[-1]
while True:
f_info = client.files.get(name=f"files/{file_name}")
if f_info.state.name == "ACTIVE":
break
if f_info.state.name == "FAILED":
raise RuntimeError("Generation failed.")
time.sleep(5)
video_bytes = client.files.download(file=video_output.uri)
with open("output.mp4", "wb") as f:
f.write(video_bytes)
Escribe tu manejador de respuestas para que acepte ambas formas desde el principio. La resolución cambia cuál obtienes.
Prueba la solicitud en Apidog
Una vez que la llamada funciona, el problema cambia. Ahora tienes un endpoint costoso, lento y no determinista en tu ruta crítica, y necesitas saber cuándo cambia su comportamiento. Los comandos curl ad-hoc en el historial de la shell no te lo dirán.
Configúralo una vez en Apidog:
- Crea un proyecto y un entorno. Pon
GEMINI_API_KEYyMODEL_IDen variables de entorno para que la clave nunca llegue a la solicitud guardada. - Añade la solicitud. POST a
https://generativelanguage.googleapis.com/v1beta/interactions, cuerpo JSON conmodeleinput. Haz referencia a las variables con{{MODEL_ID}}. - Aumenta el tiempo de espera. La generación de video toma mucho más tiempo que una finalización de texto, y el tiempo de espera predeterminado del cliente la cortará.
- Añade aserciones. Verifica el código de estado, verifica que
output_videoexista y verifica la forma de respuesta que esperas en tu resolución. Esta es la aserción que detecta el cambio entre en línea y URI. - Duplica para cada tipo de tarea. Una solicitud guardada para texto a video, otra para imagen a video y otra para extensión. Cuando Google lance Omni 1.2, ejecutarás tres solicitudes y sabrás en minutos qué cambió.
Apidog no genera video y no es un framework de IA. Es donde construyes la solicitud, la envías y mantienes la respuesta a un estándar que tú estableces. Descarga Apidog si quieres tener esa estructura implementada antes de aumentar el gasto.
Errores comunes y soluciones
- 404 en el endpoint. Estás llamando a
/v1beta/models/gemini-omni-1.1-flash:generateContent. Omni usa/v1beta/interactionscon el modelo en el cuerpo. output_video.datavacío. La respuesta se devolvió como una URI porque el video excedió los 4 MB. Leeoutput_video.uriy descarga a través de la API de Archivos.- Modelo no encontrado. Busca
gemini-omni-flash-previewen tu configuración. Ese endpoint se retirará el 30 de septiembre de 2026. - La edición de un video subido falla. La edición de videos subidos no está disponible en el EEE, Suiza y el Reino Unido. Los videos generados por el modelo aún funcionan allí.
- Solicitud de extensión rechazada. Los videos de entrada tienen un límite de 10 segundos, la extensión solo añade al final y no puedes añadir diálogos al extender una subida.
Preguntas Frecuentes
- ¿Qué endpoint usa Gemini Omni?
POST https://generativelanguage.googleapis.com/v1beta/interactions, congemini-omni-1.1-flashen el cuerpo de la solicitud. - ¿Existe un nivel gratuito para la API de Gemini Omni? No. Cada generación se factura. Los modelos de texto son los que tienen una opción gratuita en AI Studio.
- ¿Puedo establecer la temperatura o un prompt negativo? No. Las instrucciones del sistema, la temperatura,
top_p, las secuencias de parada y los prompts negativos no son compatibles. Pon las exclusiones en el texto del prompt. - ¿Cómo genero video vertical? Establece
aspect_ratioen9:16enresponse_format. - ¿Los videos generados tienen marca de agua? Sí. Toda la salida lleva SynthID, invisible para los espectadores y detectable programáticamente.
- ¿Cómo se compara esto con la API de Veo? Diferente endpoint, diferente precio, diferentes fortalezas. Omni 1.1 Flash vs Veo 3.1 cubre la compensación, y la guía de la API de Veo 3.1 tiene los detalles de esa integración.
Toda la integración consta de dos campos obligatorios más un manejador de respuestas que se adapta a ambas formas de entrega. Haz que una llamada de 360p funcione primero, guárdala con aserciones y luego aumenta la resolución una vez que confíes en la infraestructura. Lee la documentación oficial de Omni para la lista de parámetros a medida que evoluciona.
