curl --request POST \
--url https://api.apimart.ai/v1/videos/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "gemini-omni-1.1-flash",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "gemini-omni-1.1-flash",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
const url = "https://api.apimart.ai/v1/videos/generations";
const payload = {
model: "gemini-omni-1.1-flash",
prompt: "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
aspect_ratio: "16:9",
resolution: "1080p"
};
const headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(payload)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error("Error:", error));
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
url := "https://api.apimart.ai/v1/videos/generations"
payload := map[string]interface{}{
"model": "gemini-omni-1.1-flash",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p",
}
jsonData, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
req.Header.Set("Authorization", "Bearer <token>")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
{
"code": 200,
"data": [
{
"status": "submitted",
"task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA"
}
]
}
{
"error": {
"code": 400,
"message": "Paramètres de requête non valides",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Échec de l'authentification. Vérifiez votre clé API",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Solde insuffisant. Rechargez votre compte et réessayez",
"type": "payment_required"
}
}
{
"error": {
"code": 429,
"message": "Trop de requêtes. Réessayez plus tard",
"type": "rate_limit_error"
}
}
Gemini Omni 1.1 Flash
Génération vidéo Gemini Omni 1.1 Flash
- Modèle officiel de génération vidéo multimodale tout-en-un Gemini Omni 1.1 Flash de Google
- Prend en charge le texte-vers-vidéo, l’image-vers-vidéo, les références multi-sujets, l’interpolation de première et dernière image, l’édition et la prolongation vidéo
- Prend en charge 360p / 720p / 1080p / 4K, 24 i/s et des sorties de 3 à 10 secondes avec audio généré
- API de tâche asynchrone ; consultez le résultat avec l’ID de tâche après l’envoi
POST
/
v1
/
videos
/
generations
curl --request POST \
--url https://api.apimart.ai/v1/videos/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "gemini-omni-1.1-flash",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "gemini-omni-1.1-flash",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
const url = "https://api.apimart.ai/v1/videos/generations";
const payload = {
model: "gemini-omni-1.1-flash",
prompt: "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
aspect_ratio: "16:9",
resolution: "1080p"
};
const headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(payload)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error("Error:", error));
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
url := "https://api.apimart.ai/v1/videos/generations"
payload := map[string]interface{}{
"model": "gemini-omni-1.1-flash",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p",
}
jsonData, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
req.Header.Set("Authorization", "Bearer <token>")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
{
"code": 200,
"data": [
{
"status": "submitted",
"task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA"
}
]
}
{
"error": {
"code": 400,
"message": "Paramètres de requête non valides",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Échec de l'authentification. Vérifiez votre clé API",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Solde insuffisant. Rechargez votre compte et réessayez",
"type": "payment_required"
}
}
{
"error": {
"code": 429,
"message": "Trop de requêtes. Réessayez plus tard",
"type": "rate_limit_error"
}
}
curl --request POST \
--url https://api.apimart.ai/v1/videos/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "gemini-omni-1.1-flash",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "gemini-omni-1.1-flash",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
const url = "https://api.apimart.ai/v1/videos/generations";
const payload = {
model: "gemini-omni-1.1-flash",
prompt: "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
aspect_ratio: "16:9",
resolution: "1080p"
};
const headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(payload)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error("Error:", error));
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
url := "https://api.apimart.ai/v1/videos/generations"
payload := map[string]interface{}{
"model": "gemini-omni-1.1-flash",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p",
}
jsonData, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
req.Header.Set("Authorization", "Bearer <token>")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
{
"code": 200,
"data": [
{
"status": "submitted",
"task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA"
}
]
}
{
"error": {
"code": 400,
"message": "Paramètres de requête non valides",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Échec de l'authentification. Vérifiez votre clé API",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Solde insuffisant. Rechargez votre compte et réessayez",
"type": "payment_required"
}
}
{
"error": {
"code": 429,
"message": "Trop de requêtes. Réessayez plus tard",
"type": "rate_limit_error"
}
}
Authentification
string
requis
Toutes les API nécessitent une authentification par Bearer Token.Obtenir une clé API :Accédez à la page de gestion des clés API pour obtenir votre clé API.Ajoutez-la à l’en-tête de la requête :
Authorization: Bearer YOUR_API_KEY
Paramètres de requête
string
requis
Nom du modèle de génération vidéo. Doit être
gemini-omni-1.1-flash.string
Instruction textuelle. Pour le texte-vers-vidéo, décrivez la scène. Pour l’image-vers-vidéo, l’édition ou la prolongation, décrivez le mouvement, le style ou la modification souhaitée.
Fournissez au moins
prompt ou un média (image_urls, images de première/dernière image ou video_urls).string
défaut:"720p"
Résolution de la vidéo de sortie. La casse n’est pas prise en compte.Valeurs disponibles :
360p720p(par défaut)1080p4k
2160p est traité comme 4k. La résolution détermine le niveau de dépôt prélevé et le coût principal de la sortie vidéo.Une résolution non prise en charge renvoie l’erreur
invalid_resolution.string
défaut:"16:9"
Format d’image de la vidéo, utilisé pour choisir une sortie paysage ou portrait.Pris en charge :
16:9- Paysage (par défaut)9:16- Portrait
16:9.Lorsque
video_urls est fourni, la sortie suit généralement le format de la vidéo source ; aspect_ratio peut donc ne pas s’appliquer.array<string>
Tableau d’images de référence. Seules les URL HTTP/HTTPS accessibles publiquement sont prises en charge.
- 1 image : utilisée par défaut comme première image de la vidéo
- Plusieurs images : utilisées comme références de sujets ou de style ; décrivez leur rôle et leurs relations dans
prompt
image_urls et les images de début/fin sont limités à 10 images au total.string
Première image. Seule une URL HTTP/HTTPS accessible publiquement est prise en charge.
- Fournie seule : utilisée comme première image de la vidéo
- Fournie avec
last_frame_image: génère une transition fluide de la première à la dernière image
string
Dernière image. Seule une URL HTTP/HTTPS accessible publiquement est prise en charge et elle doit être fournie avec
first_frame_image.Fournir uniquement
last_frame_image renvoie invalid_frame_images. Utilisez le même format pour les deux images et faites-le correspondre à aspect_ratio.Pour une première image ou une paire première/dernière image, les deux méthodes suivantes sont équivalentes. Choisissez-en une et ne fournissez pas les deux :
- Utiliser
first_frame_image/last_frame_image - Utiliser
image_with_rolesavecroledéfini surfirst_frame/last_frame
array<object>
Tableau d’images avec rôles. Il constitue une alternative équivalente à
Exemple :
first_frame_image / last_frame_image et permet aussi de déclarer des images de référence.Afficher Élément image_with_roles
Afficher Élément image_with_roles
string
requis
URL HTTP/HTTPS d’image accessible publiquement.
string
requis
Rôle de l’image :
first_frame: première imagelast_frame: dernière image ; une première image doit aussi être présentereference: image de référence ; les autres rôles qui ne sont ni début ni fin sont également traités comme références
[
{"url": "https://example.com/start.jpg", "role": "first_frame"},
{"url": "https://example.com/end.jpg", "role": "last_frame"}
]
Si
image_urls est également fourni, il prévaut pour les références et n’est pas combiné aux références de image_with_roles. Toutes les images effectivement utilisées, y compris les images de début et de fin, sont limitées à 10 au total.array<string>
Tableau de vidéos à éditer ou prolonger. Une seule vidéo de 10 secondes maximum est actuellement acceptée.Seules les URL HTTP/HTTPS directes et accessibles publiquement sont prises en charge. Les liens YouTube ne le sont pas.
video_urls et extend_from_task_id sont mutuellement exclusifs. Fournissez-en un seul.object
Objet de paramètres supplémentaires permettant d’indiquer explicitement l’intention de génération.
Afficher Champs metadata
Afficher Champs metadata
string
Types de tâche disponibles :
text_to_video: texte-vers-vidéoimage_to_video: image-vers-vidéoreference_to_video: référence-vers-vidéoedit: édition vidéoextend: prolongation vidéo
Pour l’interpolation de première et dernière image, le modèle déduit automatiquement la tâche et la plateforme ne transmet pas
metadata.task.string
task_id local de la tâche de génération précédente. Utilisez-le pour l’édition conversationnelle ou une nouvelle prolongation sans recharger la vidéo précédente.La tâche référencée doit appartenir à l’utilisateur actuel, avoir réussi et utiliser un modèle Gemini Omni.extend_from_task_id et video_urls sont mutuellement exclusifs. Fournissez-en un seul.Ce modèle ne possède pas de paramètre
duration. La durée de chaque sortie est déterminée automatiquement selon le contenu, généralement entre 3 et 10 secondes. Pour contrôler le rythme, décrivez-le dans prompt en langage naturel ou avec des plages temporelles.Réponse
integer
Code de réponse.
200 indique un succès.array
Consulter le résultat de la tâche
La génération vidéo est asynchrone. Après réception dutask_id, utilisez l’API Obtenir l’état de la tâche pour consulter la progression et le résultat.
cURL
curl --request GET \
--url https://api.apimart.ai/v1/tasks/task_01KS1H7ZYSJWH1N779S2FSHTKA \
--header 'Authorization: Bearer <token>'
completed ou failed. Un délai d’expiration global de 10 minutes est recommandé côté client.
Exemple de résultat réussi
{
"code": 200,
"data": {
"id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
"status": "completed",
"progress": 100,
"cost": 1.52,
"credits_cost": 15.2,
"result": {
"videos": [
{
"url": ["https://cdn.example.com/gemini_omni_xxx.mp4"],
"expires_at": 1788518400
}
]
}
}
}
Cas d’utilisation
Cas 1 : texte-vers-vidéo (4K)
{
"model": "gemini-omni-1.1-flash",
"prompt": "a blue butterfly landing on a flower, macro, soft light, no dialogue",
"aspect_ratio": "9:16",
"resolution": "4k"
}
Cas 2 : interpolation de première et dernière image
{
"model": "gemini-omni-1.1-flash",
"prompt": "smooth transition, camera slowly pushes in",
"first_frame_image": "https://example.com/start.jpg",
"last_frame_image": "https://example.com/end.jpg",
"resolution": "720p"
}
Cas 3 : références multi-sujets
{
"model": "gemini-omni-1.1-flash",
"prompt": "the cat playfully bats at the ball of yarn",
"image_urls": [
"https://example.com/cat.png",
"https://example.com/yarn.png"
],
"resolution": "720p"
}
Cas 4 : déclarer les images de début et de fin avec des rôles
{
"model": "gemini-omni-1.1-flash",
"prompt": "a smooth cinematic transition from sunrise to a starry night",
"image_with_roles": [
{"url": "https://example.com/sunrise.jpg", "role": "first_frame"},
{"url": "https://example.com/night.jpg", "role": "last_frame"}
],
"resolution": "1080p"
}
Cas 5 : édition vidéo
{
"model": "gemini-omni-1.1-flash",
"prompt": "Make the violin invisible. Keep everything else the same.",
"video_urls": ["https://example.com/clip.mp4"]
}
Keep everything else the same afin de préserver la cohérence du reste.
Cas 6 : prolongation conversationnelle
{
"model": "gemini-omni-1.1-flash",
"prompt": "Extend this video: the camera pans across the mountains.",
"extend_from_task_id": "task_01AAA"
}