curl --request POST \
--url https://api.evolink.ai/v1/videos/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "gemini-omni-flash-reference-to-video",
"prompt": "Que el personaje de la imagen de referencia pasee por el escenario de referencia",
"image_urls": [
"https://example.com/character.png",
"https://example.com/scene.png"
],
"aspect_ratio": "16:9",
"duration": 10
}
'import requests
url = "https://api.evolink.ai/v1/videos/generations"
payload = {
"model": "gemini-omni-flash-reference-to-video",
"prompt": "Que el personaje de la imagen de referencia pasee por el escenario de referencia",
"image_urls": ["https://example.com/character.png", "https://example.com/scene.png"],
"aspect_ratio": "16:9",
"duration": 10
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'gemini-omni-flash-reference-to-video',
prompt: 'Que el personaje de la imagen de referencia pasee por el escenario de referencia',
image_urls: ['https://example.com/character.png', 'https://example.com/scene.png'],
aspect_ratio: '16:9',
duration: 10
})
};
fetch('https://api.evolink.ai/v1/videos/generations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.evolink.ai/v1/videos/generations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'model' => 'gemini-omni-flash-reference-to-video',
'prompt' => 'Que el personaje de la imagen de referencia pasee por el escenario de referencia',
'image_urls' => [
'https://example.com/character.png',
'https://example.com/scene.png'
],
'aspect_ratio' => '16:9',
'duration' => 10
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.evolink.ai/v1/videos/generations"
payload := strings.NewReader("{\n \"model\": \"gemini-omni-flash-reference-to-video\",\n \"prompt\": \"Que el personaje de la imagen de referencia pasee por el escenario de referencia\",\n \"image_urls\": [\n \"https://example.com/character.png\",\n \"https://example.com/scene.png\"\n ],\n \"aspect_ratio\": \"16:9\",\n \"duration\": 10\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.evolink.ai/v1/videos/generations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"gemini-omni-flash-reference-to-video\",\n \"prompt\": \"Que el personaje de la imagen de referencia pasee por el escenario de referencia\",\n \"image_urls\": [\n \"https://example.com/character.png\",\n \"https://example.com/scene.png\"\n ],\n \"aspect_ratio\": \"16:9\",\n \"duration\": 10\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.evolink.ai/v1/videos/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"gemini-omni-flash-reference-to-video\",\n \"prompt\": \"Que el personaje de la imagen de referencia pasee por el escenario de referencia\",\n \"image_urls\": [\n \"https://example.com/character.png\",\n \"https://example.com/scene.png\"\n ],\n \"aspect_ratio\": \"16:9\",\n \"duration\": 10\n}"
response = http.request(request)
puts response.read_body{
"created": 1757169743,
"id": "task-unified-1757169743-7cvnl5zw",
"model": "gemini-omni-flash-reference-to-video",
"object": "video.generation.task",
"progress": 0,
"status": "pending",
"task_info": {
"can_cancel": false,
"estimated_time": 60
},
"type": "video",
"usage": {
"billing_rule": "per_token",
"credits_reserved": 102.34,
"user_group": "default"
}
}{
"error": {
"code": "invalid_request",
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid or expired token",
"type": "authentication_error"
}
}{
"error": {
"code": "insufficient_quota",
"message": "Insufficient quota. Please top up your account.",
"type": "insufficient_quota"
}
}{
"error": {
"code": "model_access_denied",
"message": "Token does not have access to model: gemini-omni-flash-reference-to-video",
"type": "invalid_request_error"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests, please try again later",
"type": "rate_limit_error"
}
}{
"error": {
"code": "internal_error",
"message": "Internal server error",
"type": "api_error"
}
}Gemini Omni Flash 1.0 Video con Imagenes de Referencia
- El modelo Gemini Omni Flash (gemini-omni-flash-reference-to-video) admite el modo video a partir de imagenes de referencia, generando un video con audio nativo a partir de 1~6 imagenes de referencia y un prompt de texto
- Entrada de imagenes de referencia: se pasan mediante
image_urls, admite 1~6 imagenes, usadas para restringir el sujeto, el estilo o los elementos del video - Control de duracion: usa
durationpara indicar una duracion entera de3~10segundos, o pasaautopara dejar que el modelo lo decida - Relacion de aspecto: usa
aspect_ratiopara elegir16:9,9:16oauto - Audio nativo: el modelo genera automaticamente audio sincronizado para la imagen, sin parametros adicionales
- Descripcion negativa: escribela directamente en
prompt(por ejemploNo dialogue); este modelo no ofrece un parametro independiente de prompt negativo - Procesamiento asincrono, usa el ID de tarea devuelto para consultar estado
- Los enlaces de video generados son validos durante 24 horas, guardalos cuanto antes
curl --request POST \
--url https://api.evolink.ai/v1/videos/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "gemini-omni-flash-reference-to-video",
"prompt": "Que el personaje de la imagen de referencia pasee por el escenario de referencia",
"image_urls": [
"https://example.com/character.png",
"https://example.com/scene.png"
],
"aspect_ratio": "16:9",
"duration": 10
}
'import requests
url = "https://api.evolink.ai/v1/videos/generations"
payload = {
"model": "gemini-omni-flash-reference-to-video",
"prompt": "Que el personaje de la imagen de referencia pasee por el escenario de referencia",
"image_urls": ["https://example.com/character.png", "https://example.com/scene.png"],
"aspect_ratio": "16:9",
"duration": 10
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'gemini-omni-flash-reference-to-video',
prompt: 'Que el personaje de la imagen de referencia pasee por el escenario de referencia',
image_urls: ['https://example.com/character.png', 'https://example.com/scene.png'],
aspect_ratio: '16:9',
duration: 10
})
};
fetch('https://api.evolink.ai/v1/videos/generations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.evolink.ai/v1/videos/generations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'model' => 'gemini-omni-flash-reference-to-video',
'prompt' => 'Que el personaje de la imagen de referencia pasee por el escenario de referencia',
'image_urls' => [
'https://example.com/character.png',
'https://example.com/scene.png'
],
'aspect_ratio' => '16:9',
'duration' => 10
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.evolink.ai/v1/videos/generations"
payload := strings.NewReader("{\n \"model\": \"gemini-omni-flash-reference-to-video\",\n \"prompt\": \"Que el personaje de la imagen de referencia pasee por el escenario de referencia\",\n \"image_urls\": [\n \"https://example.com/character.png\",\n \"https://example.com/scene.png\"\n ],\n \"aspect_ratio\": \"16:9\",\n \"duration\": 10\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.evolink.ai/v1/videos/generations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"gemini-omni-flash-reference-to-video\",\n \"prompt\": \"Que el personaje de la imagen de referencia pasee por el escenario de referencia\",\n \"image_urls\": [\n \"https://example.com/character.png\",\n \"https://example.com/scene.png\"\n ],\n \"aspect_ratio\": \"16:9\",\n \"duration\": 10\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.evolink.ai/v1/videos/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"gemini-omni-flash-reference-to-video\",\n \"prompt\": \"Que el personaje de la imagen de referencia pasee por el escenario de referencia\",\n \"image_urls\": [\n \"https://example.com/character.png\",\n \"https://example.com/scene.png\"\n ],\n \"aspect_ratio\": \"16:9\",\n \"duration\": 10\n}"
response = http.request(request)
puts response.read_body{
"created": 1757169743,
"id": "task-unified-1757169743-7cvnl5zw",
"model": "gemini-omni-flash-reference-to-video",
"object": "video.generation.task",
"progress": 0,
"status": "pending",
"task_info": {
"can_cancel": false,
"estimated_time": 60
},
"type": "video",
"usage": {
"billing_rule": "per_token",
"credits_reserved": 102.34,
"user_group": "default"
}
}{
"error": {
"code": "invalid_request",
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid or expired token",
"type": "authentication_error"
}
}{
"error": {
"code": "insufficient_quota",
"message": "Insufficient quota. Please top up your account.",
"type": "insufficient_quota"
}
}{
"error": {
"code": "model_access_denied",
"message": "Token does not have access to model: gemini-omni-flash-reference-to-video",
"type": "invalid_request_error"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests, please try again later",
"type": "rate_limit_error"
}
}{
"error": {
"code": "internal_error",
"message": "Internal server error",
"type": "api_error"
}
}Autorizaciones
##Todas las APIs requieren autenticacion Bearer Token##
Obtener API Key:
Visita la Pagina de gestion de API Key para obtener tu API Key
Agregar al encabezado de la solicitud:
Authorization: Bearer YOUR_API_KEY
Cuerpo
Nombre del modelo, fijo en gemini-omni-flash-reference-to-video
gemini-omni-flash-reference-to-video "gemini-omni-flash-reference-to-video"
Prompt de texto para la generacion de video, admite chino e ingles
Recomendaciones de uso:
- Describe la accion del sujeto de la imagen de referencia en el video, el movimiento de camara, el ambiente de la escena, etc.
- Escribe los requisitos negativos directamente en el prompt (por ejemplo
No dialogue,sin texto); este modelo no ofrece un parametro independiente de prompt negativo
"Un gatito juguetea traviesamente con una bola de lana"
Arreglo de imagenes de referencia, admite 1~6
Formas admitidas:
- URL de imagen HTTP/HTTPS
- data URL en formato
data:image/...;base64,... - Cadena de imagen en base64 puro
Requisitos de formato: admite png, jpeg, webp
1 - 6 elements[ "https://example.com/character.png", "https://example.com/scene.png" ]
Duracion del video (segundos), por defecto 10
Valores admitidos:
- Entero: rango
3 ~ 10segundos auto: el modelo decide la duracion de salida
Nota de facturacion: el cobro real se basa en el consumo del video generado
3 <= x <= 106
Relacion de aspecto del video, por defecto 16:9
Valores admitidos:
16:9: imagen horizontal9:16: imagen verticalauto: el modelo decide la relacion de aspecto
16:9, 9:16, auto "16:9"
Direccion de callback HTTPS despues de completar la tarea
Momento del callback:
- Se activa cuando la tarea se completa (completed), falla (failed) o se cancela (cancelled)
- Se envia despues de completar la confirmacion de facturacion
Restricciones de seguridad:
- Solo se admite el protocolo HTTPS
- El callback a direcciones IP internas esta prohibido (127.0.0.1, 10.x.x.x, 172.16-31.x.x, 192.168.x.x, etc.)
- La longitud de la URL no debe exceder
2048caracteres
Mecanismo de callback:
- Tiempo de espera:
10segundos - Maximo
3reintentos en caso de fallo (reintentos despues de1segundo/2segundos/4segundos) - El formato del cuerpo de respuesta del callback es consistente con el formato de respuesta de la API de consulta de tareas
- La direccion de callback que devuelve un codigo de estado 2xx se considera exitosa, otros codigos de estado activaran reintentos
"https://your-domain.com/webhooks/video-task-completed"
Respuesta
Tarea de video creada exitosamente
Marca de tiempo de creacion de la tarea
1757169743
ID de tarea
"task-unified-1757169743-7cvnl5zw"
Nombre del modelo real utilizado
"gemini-omni-flash-reference-to-video"
Tipo de tarea especifico
video.generation.task Porcentaje de progreso de la tarea (0-100)
0 <= x <= 1000
Estado de la tarea
pending, processing, completed, failed "pending"
Informacion detallada de la tarea de video
Show child attributes
Show child attributes
Tipo de salida de la tarea
text, image, audio, video "video"
Informacion de uso y facturacion
Show child attributes
Show child attributes