{
  "aboutHtml": "<p>Kling VIDEO O1 est le modèle vidéo unifié de Kuaishou guidé par des références. Il combine une description textuelle avec des images, des éléments de sujets préparés ou une vidéo source pour guider de nouvelles scènes et des modifications ciblées de séquences existantes. Son interface principale est un brief visuel : identifiez les matériaux de référence, décrivez leur rôle et précisez l’apparence, l’action ou la transformation souhaitées dans la vidéo obtenue.</p><p>Un nouveau plan peut partir de texte, d’une image d’ouverture ou d’un ensemble de références visuelles. Utilisez une image pour définir un personnage ou un objet, et décrivez le décor, l’action et le point de vue avec des mots. Lorsque plusieurs références apportent des caractéristiques différentes, attribuez-leur explicitement leurs rôles. Un brief de produit peut prendre l’objet d’une image et l’environnement d’une autre, puis décrire le mouvement de l’objet dans ce décor.</p><p>Le prompt d’O1 peut désigner des images, des éléments et des vidéos avec des marqueurs de référence spécifiques, tels que &lt;&lt;&lt;image_1&gt;&gt;&gt; ou &lt;&lt;&lt;video_1&gt;&gt;&gt;. Associez ces marqueurs aux fichiers réellement fournis et expliquez ce qu’il faut en reprendre. Le producteur autorise des prompts de 2 500 caractères. Une instruction concise qui identifie le sujet et le changement est plus utile qu’une collection de termes de style sans rapport entre eux.</p><p>Pour les références basées sur des images sans entrée vidéo, la limite combinée documentée atteint sept images de référence et éléments multi-images au total. Avec une vidéo de référence, cette limite d’images et d’éléments est de quatre. Ces limites concernent les éléments basés sur des images ; les autres types d’éléments ont leurs propres règles de compatibilité. Choisissez les matériaux qui fournissent les informations essentielles sur l’apparence ou la scène, plutôt que de remplir la limite avec des vues redondantes.</p><p>Les images d’entrée utilisent JPG, JPEG ou PNG et sont fournies sous forme d’URL accessible ou de données d’image, avec des fichiers allant jusqu’à 10 Mo, des dimensions d’au moins 300 pixels et un rapport largeur/hauteur compris entre 1:2.5 et 2.5:1. Préparez des sujets nets et conservez les détails importants dans le recadrage. Si la tâche nécessite qu’un personnage ou un produit reste reconnaissable, précisez les caractéristiques à préserver et examinez-les sur toute la durée du clip terminé.</p><p>Les images de début et de fin conditionnent une transition entre des limites visuelles. Le processus documenté d’O1 pour ces images exige une image de départ lorsqu’une image de fin est fournie et ne prend pas en charge le contrôle début/fin avec plus de deux images dans le tableau. Lorsque les deux images de délimitation sont utilisées, les éléments de sujets supplémentaires ne font pas partie de cette configuration O1. Distinguez une tâche contrôlée par des images initiales et finales de la modification d’une vidéo de base fournie.</p><p>Une vidéo source peut avoir deux rôles distincts. Comme clip de base, elle est la séquence à modifier : demandez un ajout, une suppression, un traitement de style ou un changement de composition précis, tout en indiquant ce qui doit rester. La modification suit la durée du clip d’entrée et ne combine pas cette tâche sur vidéo de base avec le contrôle d’images initiales et finales ou la génération de plusieurs plans. Comme référence de caractéristiques, la vidéo fournit du contenu, du style ou des informations de caméra pour un nouveau plan.</p><p>Un prompt avec vidéo de référence peut aussi demander un plan précédent ou suivant. Identifiez le clip source et décrivez le nouvel événement visible, par exemple la poursuite de l’action du sujet ou la révélation de l’environnement autour de lui. La référence sert ici à communiquer des informations visuelles ; vérifiez le raccord et la continuité du sujet avant d’assembler le nouveau segment avec la séquence originale.</p><p>Le profil d’entrée vidéo du producteur accepte une source MP4 ou MOV, jusqu’à 200 Mo, d’une durée minimale de trois secondes. Son profil détaillé précise des dimensions de 720 à 2160 pixels et des fréquences de 24 à 60 images par seconde, avec un rapport largeur/hauteur d’entrée compris entre 1:2.5 et 2.5:1. Ce processus documenté avec vidéo source renvoie une vidéo à 24 images par seconde. La durée exacte autorisée pour le clip dépend aussi du profil de modèle sélectionné. La plage de nouvelle génération d’O1 va de trois à dix secondes, et diffère de celle du modèle 3.0 Omni ultérieur.</p><p>Les modes O1 du producteur proposent des sorties 720p Standard ou 1080p Pro. Le cadrage des nouveaux plans permet les choix paysage, portrait et carré documentés lorsque la fonction choisie utilise ce contrôle ; une modification sur vidéo de base suit le cadrage source. Le son de la vidéo source peut être conservé ou supprimé. Le processus de références et de modification d’O1 doit rester distinct du profil ultérieur de 3.0 Omni avec son natif et storyboard personnalisé.</p><p>La génération produit une tâche dont le résultat terminé contient le fichier vidéo et la durée réelle. La documentation des résultats du producteur indique que les vidéos générées sont supprimées au bout de 30 jours : sauvegardez donc rapidement le clip terminé. Conservez les matériaux sources et le brief avec ce résultat, puis vérifiez la modification demandée, l’utilisation des références et la continuité. Pour une modification, comparez la zone concernée et les parties qui devaient rester. Pour un nouveau plan guidé par des références, vérifiez que chaque fichier a fourni les informations visuelles prévues. Gardez le clip terminé à disposition pour le montage ou la séquence de production suivante.</p>",
  "aboutText": "Kling VIDEO O1 est le modèle vidéo unifié de Kuaishou guidé par des références. Il combine une description textuelle avec des images, des éléments de sujets préparés ou une vidéo source pour guider de nouvelles scènes et des modifications ciblées de séquences existantes. Son interface principale est un brief visuel : identifiez les matériaux de référence, décrivez leur rôle et précisez l’apparence, l’action ou la transformation souhaitées dans la vidéo obtenue.\n\nUn nouveau plan peut partir de texte, d’une image d’ouverture ou d’un ensemble de références visuelles. Utilisez une image pour définir un personnage ou un objet, et décrivez le décor, l’action et le point de vue avec des mots. Lorsque plusieurs références apportent des caractéristiques différentes, attribuez-leur explicitement leurs rôles. Un brief de produit peut prendre l’objet d’une image et l’environnement d’une autre, puis décrire le mouvement de l’objet dans ce décor.\n\nLe prompt d’O1 peut désigner des images, des éléments et des vidéos avec des marqueurs de référence spécifiques, tels que <<<image_1>>> ou <<<video_1>>>. Associez ces marqueurs aux fichiers réellement fournis et expliquez ce qu’il faut en reprendre. Le producteur autorise des prompts de 2 500 caractères. Une instruction concise qui identifie le sujet et le changement est plus utile qu’une collection de termes de style sans rapport entre eux.\n\nPour les références basées sur des images sans entrée vidéo, la limite combinée documentée atteint sept images de référence et éléments multi-images au total. Avec une vidéo de référence, cette limite d’images et d’éléments est de quatre. Ces limites concernent les éléments basés sur des images ; les autres types d’éléments ont leurs propres règles de compatibilité. Choisissez les matériaux qui fournissent les informations essentielles sur l’apparence ou la scène, plutôt que de remplir la limite avec des vues redondantes.\n\nLes images d’entrée utilisent JPG, JPEG ou PNG et sont fournies sous forme d’URL accessible ou de données d’image, avec des fichiers allant jusqu’à 10 Mo, des dimensions d’au moins 300 pixels et un rapport largeur/hauteur compris entre 1:2.5 et 2.5:1. Préparez des sujets nets et conservez les détails importants dans le recadrage. Si la tâche nécessite qu’un personnage ou un produit reste reconnaissable, précisez les caractéristiques à préserver et examinez-les sur toute la durée du clip terminé.\n\nLes images de début et de fin conditionnent une transition entre des limites visuelles. Le processus documenté d’O1 pour ces images exige une image de départ lorsqu’une image de fin est fournie et ne prend pas en charge le contrôle début/fin avec plus de deux images dans le tableau. Lorsque les deux images de délimitation sont utilisées, les éléments de sujets supplémentaires ne font pas partie de cette configuration O1. Distinguez une tâche contrôlée par des images initiales et finales de la modification d’une vidéo de base fournie.\n\nUne vidéo source peut avoir deux rôles distincts. Comme clip de base, elle est la séquence à modifier : demandez un ajout, une suppression, un traitement de style ou un changement de composition précis, tout en indiquant ce qui doit rester. La modification suit la durée du clip d’entrée et ne combine pas cette tâche sur vidéo de base avec le contrôle d’images initiales et finales ou la génération de plusieurs plans. Comme référence de caractéristiques, la vidéo fournit du contenu, du style ou des informations de caméra pour un nouveau plan.\n\nUn prompt avec vidéo de référence peut aussi demander un plan précédent ou suivant. Identifiez le clip source et décrivez le nouvel événement visible, par exemple la poursuite de l’action du sujet ou la révélation de l’environnement autour de lui. La référence sert ici à communiquer des informations visuelles ; vérifiez le raccord et la continuité du sujet avant d’assembler le nouveau segment avec la séquence originale.\n\nLe profil d’entrée vidéo du producteur accepte une source MP4 ou MOV, jusqu’à 200 Mo, d’une durée minimale de trois secondes. Son profil détaillé précise des dimensions de 720 à 2160 pixels et des fréquences de 24 à 60 images par seconde, avec un rapport largeur/hauteur d’entrée compris entre 1:2.5 et 2.5:1. Ce processus documenté avec vidéo source renvoie une vidéo à 24 images par seconde. La durée exacte autorisée pour le clip dépend aussi du profil de modèle sélectionné. La plage de nouvelle génération d’O1 va de trois à dix secondes, et diffère de celle du modèle 3.0 Omni ultérieur.\n\nLes modes O1 du producteur proposent des sorties 720p Standard ou 1080p Pro. Le cadrage des nouveaux plans permet les choix paysage, portrait et carré documentés lorsque la fonction choisie utilise ce contrôle ; une modification sur vidéo de base suit le cadrage source. Le son de la vidéo source peut être conservé ou supprimé. Le processus de références et de modification d’O1 doit rester distinct du profil ultérieur de 3.0 Omni avec son natif et storyboard personnalisé.\n\nLa génération produit une tâche dont le résultat terminé contient le fichier vidéo et la durée réelle. La documentation des résultats du producteur indique que les vidéos générées sont supprimées au bout de 30 jours : sauvegardez donc rapidement le clip terminé. Conservez les matériaux sources et le brief avec ce résultat, puis vérifiez la modification demandée, l’utilisation des références et la continuité. Pour une modification, comparez la zone concernée et les parties qui devaient rester. Pour un nouveau plan guidé par des références, vérifiez que chaque fichier a fourni les informations visuelles prévues. Gardez le clip terminé à disposition pour le montage ou la séquence de production suivante.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "0ed398cb37b549651e875e4a05587a6a660d5c165082760a30596f209a496ef0",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "fr",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">Kling: Video O1</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Fermer\">×</button></div><div class=\"idline\"><span>Kuaishou /</span><code>kwaivgi/kling-video-o1</code><button type=\"button\" id=\"copy-id\">Copier l’ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Rubriques de la fiche modèle\"><button type=\"button\" data-card-jump=\"overview\">Premiers pas</button><button type=\"button\" data-card-jump=\"methods\">Entrées et méthodes</button><button type=\"button\" data-card-jump=\"pricing\">Tarifs</button><button type=\"button\" data-card-jump=\"examples\">Exemples</button><button type=\"button\" data-card-jump=\"results\">Résultats</button><button type=\"button\" data-card-jump=\"aliases\">Alias</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"Méthodes API\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Ultra|videos|/v1/videos|kwaivgi%2Fkling-video-o1\">Vidéo</button></div><div id=\"card-method-content\" role=\"tabpanel\" aria-labelledby=\"card-method-tab-0\"><section class=\"card-section\" data-card-section=\"overview\"><h3 tabindex=\"-1\">Premiers pas</h3><p class=\"mdesc-full\">Kling VIDEO O1 est le modèle vidéo de Kuaishou guidé par des références pour générer et modifier des scènes à l’aide de texte, d’images, d’éléments de sujets et d’un clip source. Utilisez son profil de génération de trois à dix secondes pour la continuité visuelle, les transitions guidées entre images et les modifications ciblées de séquences existantes.</p><dl class=\"card-io\" data-card-io><div><dt>Entrées acceptées</dt><dd>Texte · Images</dd></div><div><dt>Résultats</dt><dd>Vidéo</dd></div></dl><details class=\"card-about\"><summary>À propos du modèle</summary><p class=\"note-s\" data-model-method-boundary>Cette description présente les capacités du modèle. Les entrées, sorties et options disponibles dans Ailoot pour la méthode sélectionnée figurent ci-dessous.</p><div class=\"mabout\" id=\"m-about\"><p>Kling VIDEO O1 est le modèle vidéo unifié de Kuaishou guidé par des références. Il combine une description textuelle avec des images, des éléments de sujets préparés ou une vidéo source pour guider de nouvelles scènes et des modifications ciblées de séquences existantes. Son interface principale est un brief visuel : identifiez les matériaux de référence, décrivez leur rôle et précisez l’apparence, l’action ou la transformation souhaitées dans la vidéo obtenue.</p><p>Un nouveau plan peut partir de texte, d’une image d’ouverture ou d’un ensemble de références visuelles. Utilisez une image pour définir un personnage ou un objet, et décrivez le décor, l’action et le point de vue avec des mots. Lorsque plusieurs références apportent des caractéristiques différentes, attribuez-leur explicitement leurs rôles. Un brief de produit peut prendre l’objet d’une image et l’environnement d’une autre, puis décrire le mouvement de l’objet dans ce décor.</p><p>Le prompt d’O1 peut désigner des images, des éléments et des vidéos avec des marqueurs de référence spécifiques, tels que &lt;&lt;&lt;image_1&gt;&gt;&gt; ou &lt;&lt;&lt;video_1&gt;&gt;&gt;. Associez ces marqueurs aux fichiers réellement fournis et expliquez ce qu’il faut en reprendre. Le producteur autorise des prompts de 2 500 caractères. Une instruction concise qui identifie le sujet et le changement est plus utile qu’une collection de termes de style sans rapport entre eux.</p><p>Pour les références basées sur des images sans entrée vidéo, la limite combinée documentée atteint sept images de référence et éléments multi-images au total. Avec une vidéo de référence, cette limite d’images et d’éléments est de quatre. Ces limites concernent les éléments basés sur des images ; les autres types d’éléments ont leurs propres règles de compatibilité. Choisissez les matériaux qui fournissent les informations essentielles sur l’apparence ou la scène, plutôt que de remplir la limite avec des vues redondantes.</p><p>Les images d’entrée utilisent JPG, JPEG ou PNG et sont fournies sous forme d’URL accessible ou de données d’image, avec des fichiers allant jusqu’à 10 Mo, des dimensions d’au moins 300 pixels et un rapport largeur/hauteur compris entre 1:2.5 et 2.5:1. Préparez des sujets nets et conservez les détails importants dans le recadrage. Si la tâche nécessite qu’un personnage ou un produit reste reconnaissable, précisez les caractéristiques à préserver et examinez-les sur toute la durée du clip terminé.</p><p>Les images de début et de fin conditionnent une transition entre des limites visuelles. Le processus documenté d’O1 pour ces images exige une image de départ lorsqu’une image de fin est fournie et ne prend pas en charge le contrôle début/fin avec plus de deux images dans le tableau. Lorsque les deux images de délimitation sont utilisées, les éléments de sujets supplémentaires ne font pas partie de cette configuration O1. Distinguez une tâche contrôlée par des images initiales et finales de la modification d’une vidéo de base fournie.</p><p>Une vidéo source peut avoir deux rôles distincts. Comme clip de base, elle est la séquence à modifier : demandez un ajout, une suppression, un traitement de style ou un changement de composition précis, tout en indiquant ce qui doit rester. La modification suit la durée du clip d’entrée et ne combine pas cette tâche sur vidéo de base avec le contrôle d’images initiales et finales ou la génération de plusieurs plans. Comme référence de caractéristiques, la vidéo fournit du contenu, du style ou des informations de caméra pour un nouveau plan.</p><p>Un prompt avec vidéo de référence peut aussi demander un plan précédent ou suivant. Identifiez le clip source et décrivez le nouvel événement visible, par exemple la poursuite de l’action du sujet ou la révélation de l’environnement autour de lui. La référence sert ici à communiquer des informations visuelles ; vérifiez le raccord et la continuité du sujet avant d’assembler le nouveau segment avec la séquence originale.</p><p>Le profil d’entrée vidéo du producteur accepte une source MP4 ou MOV, jusqu’à 200 Mo, d’une durée minimale de trois secondes. Son profil détaillé précise des dimensions de 720 à 2160 pixels et des fréquences de 24 à 60 images par seconde, avec un rapport largeur/hauteur d’entrée compris entre 1:2.5 et 2.5:1. Ce processus documenté avec vidéo source renvoie une vidéo à 24 images par seconde. La durée exacte autorisée pour le clip dépend aussi du profil de modèle sélectionné. La plage de nouvelle génération d’O1 va de trois à dix secondes, et diffère de celle du modèle 3.0 Omni ultérieur.</p><p>Les modes O1 du producteur proposent des sorties 720p Standard ou 1080p Pro. Le cadrage des nouveaux plans permet les choix paysage, portrait et carré documentés lorsque la fonction choisie utilise ce contrôle ; une modification sur vidéo de base suit le cadrage source. Le son de la vidéo source peut être conservé ou supprimé. Le processus de références et de modification d’O1 doit rester distinct du profil ultérieur de 3.0 Omni avec son natif et storyboard personnalisé.</p><p>La génération produit une tâche dont le résultat terminé contient le fichier vidéo et la durée réelle. La documentation des résultats du producteur indique que les vidéos générées sont supprimées au bout de 30 jours : sauvegardez donc rapidement le clip terminé. Conservez les matériaux sources et le brief avec ce résultat, puis vérifiez la modification demandée, l’utilisation des références et la continuité. Pour une modification, comparez la zone concernée et les parties qui devaient rester. Pour un nouveau plan guidé par des références, vérifiez que chaque fichier a fourni les informations visuelles prévues. Gardez le clip terminé à disposition pour le montage ou la séquence de production suivante.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Disponible dans Ailoot · entrées et méthodes</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · Vidéo</b> <code>POST /v1/videos</code></summary><dl class=\"method-capabilities\"><div><dt>Types d’entrée</dt><dd><code>text</code>, <code>image</code></dd></div><div><dt>Types de sortie</dt><dd><code>video</code></dd></div><div><dt>Format de sortie</dt><dd>Octets MP4 d’origine ; sans normalisation ni transcodage</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Champ</th><th>Type</th><th>Exigence</th><th>Valeurs et limites</th><th>Par défaut</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Obligatoire</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>kwaivgi/kling-video-o1</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">prompt</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Obligatoire</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">duration</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>integer</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Obligatoire</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>5, 10</div><div>Minimum: 1</div><div>Maximum: 600</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">resolution</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>720p</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">aspect_ratio</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>16:9, 9:16, 1:1</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">generate_audio</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>boolean</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>false, true</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">frame_images</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>array</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>Nombre minimal d’éléments: 1</div><div>Nombre maximal d’éléments: 2</div><div>Contenu en entrée: Tableau d’objets d’image. Chaque objet comporte type=image_url, image_url contenant url et frame_type. Utilisez une URL HTTPS pour l’image et définissez frame_type sur first_frame ou last_frame. Chaque rôle d’image apparaît au plus une fois.</div><div>Clés exactes: type, image_url, frame_type</div><div>Conditions: Ces clés décrivent chaque objet d’image ; image_url contient uniquement url. Omettez frame_images pour une requête contenant uniquement du texte.</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">input_references</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>array</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">size</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>1280x720, 720x1280, 720x720</div><div>Motif: ^[1-9][0-9]*x[1-9][0-9]*$</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">callback_url</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>Motif: ^https://</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">session_id</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">trace</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>object</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">user</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Combinaisons d’éléments d’entrée</summary><p class=\"note-s\"><b>Texte vers vidéo</b> · Une consigne écrite. · Obligatoire : model, prompt, duration</p><p class=\"note-s\"><code>Fournissez prompt sous forme de texte et duration en secondes entières. Choisissez une résolution prise en charge ; ajoutez un rapport d’image ou utilisez une taille indiquée.</code></p><p class=\"note-s\"><code class=\"card-field-name\">model</code>: Type : string · kwaivgi/kling-video-o1</p><p class=\"note-s\"><code class=\"card-field-name\">prompt</code>: Type : string · Nombre maximal d’octets UTF-8: 10 000 · Caractères autres que des espaces requis: Oui</p><p class=\"note-s\"><b>Image vers vidéo</b> · Une consigne écrite et une image initiale. · Obligatoire : model, prompt, duration, frame_images</p><p class=\"note-s\"><code>frame_images est un tableau. Chaque objet d’image comporte type, image_url et frame_type ; image_url contient url. Définissez type sur image_url. Utilisez first_frame avec, facultativement, last_frame. Chaque rôle d’image apparaît au plus une fois. Fournissez une URL HTTPS publique pour chaque image. Choisissez une résolution prise en charge ; ajoutez un rapport d’image ou utilisez une taille indiquée.</code></p><p class=\"note-s\">Clés exactes : type, image_url, frame_type</p><p class=\"note-s\"><code class=\"card-field-name\">model</code>: Type : string · kwaivgi/kling-video-o1</p><p class=\"note-s\"><code class=\"card-field-name\">prompt</code>: Type : string · Nombre maximal d’octets UTF-8: 10 000 · Caractères autres que des espaces requis: Oui</p></details><details class=\"note-s\" data-method-contract><summary>Paramètres et cycle de vie de la méthode</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Paramètre</th><th>Contrat</th></tr></thead><tbody><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>content_type</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>application/json</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>required</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>model, prompt, duration</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>material_types</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>text, image</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>additional_properties</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>false</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>optional_controls</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>resolution, aspect_ratio, generate_audio, frame_images, input_references, size, callback_url, session_id, trace, user</td></tr></tbody></table></div><p>Cycle de vie : <code>submit_once_poll_original</code></p><p class=\"note-s\"><code>GET /v1/videos/{public_id}</code></p><p class=\"note-s\"><code>GET /v1/videos/{public_id}/content</code></p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Tarifs</h3><div class=\"card-result-process\" data-billing-basis><h5>Calcul du coût final</h5><p class=\"note-s\">Les tarifs affichés servent à estimer le coût avant la génération. Le montant final est calculé à partir du coût enregistré pour la génération d’origine. La durée mesurée du résultat et les quantités prévisionnelles ne constituent pas la quantité finale facturable.</p></div><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>Les tarifs n’ajoutent pas d’options de requête. Les paramètres pris en charge figurent dans la méthode sélectionnée.</p><dl data-price-conditions><dt>Mode rapide</dt><dd>Non précisé <span class=\"note-s\">Lorsque le mode rapide est sélectionné</span></dd><dt>Mode Flex</dt><dd>Non précisé <span class=\"note-s\">Lorsque le mode flex est sélectionné</span></dd><dt>Effort de raisonnement maximal</dt><dd>Non précisé <span class=\"note-s\">Lorsque l’effort de raisonnement maximal utilise l’ajustement par défaut (default)</span></dd></dl></div><div data-declared-tariff-pricing><h4>Tarifs estimés à des fins de comparaison</h4><h4>Prix par configuration</h4><p class=\"note-s\">Associez chaque coût aux conditions indiquées. Utilisez un seul tarif pour chaque ensemble de configurations alternatives.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Configuration</th><th>Barème tarifaire</th><th>Quantité prévisionnelle</th><th>Unité de facturation</th><th>Conditions de facturation</th><th>Coût</th></tr></thead><tbody><tr><th data-cell-label=\"Configuration\" scope=\"row\"><span class=\"card-cell-label\">Configuration</span>Tarifs de base par jeton</th><td data-cell-label=\"Barème tarifaire\"><span class=\"card-cell-label\">Barème tarifaire</span>Tarif de base</td><td data-cell-label=\"Quantité prévisionnelle\"><span class=\"card-cell-label\">Quantité prévisionnelle</span>—</td><td data-cell-label=\"Unité de facturation\"><span class=\"card-cell-label\">Unité de facturation</span>—</td><td data-cell-label=\"Conditions de facturation\"><span class=\"card-cell-label\">Conditions de facturation</span>—</td><td data-cell-label=\"Coût\"><span class=\"card-cell-label\">Coût</span><div><span>Entrée · Tokens en entrée · Estimation à des fins de comparaison uniquement</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Sortie · Tokens en sortie · Estimation à des fins de comparaison uniquement</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Entrée · Lecture du cache · Estimation à des fins de comparaison uniquement</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Entrée · Écriture dans le cache · Estimation à des fins de comparaison uniquement</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Entrée · Écriture dans le cache, 1 h · Estimation à des fins de comparaison uniquement</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div></td></tr><tr><th data-cell-label=\"Configuration\" scope=\"row\"><span class=\"card-cell-label\">Configuration</span>Tarif vidéo</th><td data-cell-label=\"Barème tarifaire\"><span class=\"card-cell-label\">Barème tarifaire</span>—</td><td data-cell-label=\"Quantité prévisionnelle\"><span class=\"card-cell-label\">Quantité prévisionnelle</span>—</td><td data-cell-label=\"Unité de facturation\"><span class=\"card-cell-label\">Unité de facturation</span>par seconde de vidéo</td><td data-cell-label=\"Conditions de facturation\"><span class=\"card-cell-label\">Conditions de facturation</span>Cette clé de tarification ne déclare aucune condition supplémentaire.</td><td data-cell-label=\"Coût\"><span class=\"card-cell-label\">Coût</span><div><span>Sortie · Tarif vidéo · Estimation à des fins de comparaison uniquement</span> <b>$0.224</b> <span class=\"price-unit\">par seconde de vidéo</span></div></td></tr><tr><th data-cell-label=\"Configuration\" scope=\"row\"><span class=\"card-cell-label\">Configuration</span>Coût de génération estimé</th><td data-cell-label=\"Barème tarifaire\"><span class=\"card-cell-label\">Barème tarifaire</span>—</td><td data-cell-label=\"Quantité prévisionnelle\"><span class=\"card-cell-label\">Quantité prévisionnelle</span>Estimation pour une génération</td><td data-cell-label=\"Unité de facturation\"><span class=\"card-cell-label\">Unité de facturation</span>—</td><td data-cell-label=\"Conditions de facturation\"><span class=\"card-cell-label\">Conditions de facturation</span>—</td><td data-cell-label=\"Coût\"><span class=\"card-cell-label\">Coût</span><div><span>Sortie · Coût estimé de génération · Estimation à des fins de comparaison uniquement</span> <b>$1.12</b> <span class=\"price-unit\">estimation avant génération</span></div><p class=\"note-s\">Cette estimation ne constitue ni des frais supplémentaires ni un tarif fixe pour la génération terminée.</p></td></tr></tbody></table></div></div><p class=\"note-s\">Ailoot réserve un montant estimé avant une requête. Après le résultat, le montant final est débité selon l’utilisation mesurée. Pour le streaming, le montant final à débiter est calculé à partir du relevé final d’utilisation. <a href=\"/docs/fr/billing/reserve/\">Fonctionnement de la réservation et du débit →</a></p><div data-declared-reference-pricing><h4>Détails du tarif de référence</h4><p class=\"note-s\">Les barèmes de référence du modèle ne modifient ni la sélection de méthode, ni les devis, ni les coûts. Les frais actifs utilisent les tarifs de la méthode Ailoot sélectionnée.</p><details class=\"card-price-reference\" data-declared-reference-group data-client-selectable=\"false\"><summary>Références tarifaires des configurations vidéo</summary><h4>Prix par configuration</h4><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Configuration</th><th>Conditions de facturation</th><th>Coût</th></tr></thead><tbody><tr><th data-cell-label=\"Configuration\" scope=\"row\"><span class=\"card-cell-label\">Configuration</span>Tarif vidéo</th><td data-cell-label=\"Conditions de facturation\"><span class=\"card-cell-label\">Conditions de facturation</span>Cette clé de tarification ne déclare aucune condition supplémentaire.</td><td data-cell-label=\"Coût\"><span class=\"card-cell-label\">Coût</span><div><span>Sortie · Tarif vidéo</span> <b>$0.224</b> <span class=\"price-unit\">par seconde de vidéo</span></div><p class=\"note-s\">Tarif publié de référence pour la configuration affichée. Les frais définitifs correspondent à la configuration réellement facturée.</p></td></tr></tbody></table></div></details></div></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Exemples de requêtes</h3><h4>Ailoot Ultra · Vidéo</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Variantes du code\"><button class=\"cg-tab\" id=\"model-code-1785-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1785-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl · créer une vidéo</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Copier le code\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1785-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1785-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nfrom pathlib import Path\nPath(&#39;request.json&#39;).write_text(&#39;{&quot;aspect_ratio&quot;:&quot;16:9&quot;,&quot;duration&quot;:5,&quot;model&quot;:&quot;kwaivgi/kling-video-o1&quot;,&quot;prompt&quot;:&quot;A serene mountain landscape at sunset&quot;,&quot;resolution&quot;:&quot;720p&quot;}&#39;, encoding=&#39;utf-8&#39;)\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport json\nfrom pathlib import Path\nr=json.loads(Path(&#39;result.json&#39;).read_text())\nprint(json.dumps(r,ensure_ascii=False,indent=2))\nprint(&#39;Keep the complete JSON and response headers; do not resubmit an unknown creation.&#39;)\nPY_RESULT\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Recevoir et enregistrer les résultats</h3><h4>Ailoot Ultra · Vidéo</h4><p class=\"note-s\">URL signées de contenu vous appartenant</p><ul class=\"card-result-paths\"><li><code>GET /v1/videos/{public_id}</code></li><li><code>GET /v1/videos/{public_id}/content</code></li></ul><h5>Vérifier l’état de la tâche</h5><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Variantes du code\"><button class=\"cg-tab\" id=\"model-code-1786-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1786-panel-0\" aria-selected=\"true\" tabindex=\"0\">GET état de l’opération d’origine</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Copier le code\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1786-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1786-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\npython3 - &lt;&lt;&#39;PY_STATUS_URL&#39;\nimport json\nfrom pathlib import Path\nfrom urllib.parse import quote\nr=json.loads(Path(&#39;result.json&#39;).read_text())\nif not isinstance(r.get(&#39;id&#39;),str) or not r[&#39;id&#39;]:raise SystemExit(&#39;Keep the original response and headers for reconciliation; no returned ID&#39;)\nPath(&#39;status-url.txt&#39;).write_text(&#39;https://api.ailoot.ai/v1/videos/&#39;+quote(r[&#39;id&#39;],safe=&#39;&#39;))\nPY_STATUS_URL\ncurl --fail-with-body --silent --show-error &quot;$(cat status-url.txt)&quot; \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -D status-headers.txt -o status.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport json\nfrom pathlib import Path\nr=json.loads(Path(&#39;status.json&#39;).read_text())\nprint(json.dumps(r,ensure_ascii=False,indent=2))\nprint(&#39;Keep the complete JSON and response headers; do not resubmit an unknown creation.&#39;)\nPY_RESULT\n</code></pre></div></div></div><details class=\"card-about\"><summary>Autres lectures de contenu</summary><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Variantes du code\"><button class=\"cg-tab\" id=\"model-code-1787-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1787-panel-0\" aria-selected=\"true\" tabindex=\"0\">Enregistrer chaque sortie terminée dont vous êtes propriétaire</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Copier le code\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1787-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1787-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\nexport AILOOT_API_KEY\npython3 - &lt;&lt;&#39;PY_ASSETS&#39;\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path(&#39;status.json&#39;).read_text())\nif r.get(&#39;status&#39;)!=&#39;completed&#39;:raise SystemExit(&#39;Keep the original ID and read its status; never recreate an unknown job&#39;)\nif not isinstance(r.get(&#39;data&#39;),list) or not r[&#39;data&#39;]:raise SystemExit(&#39;Keep the complete original status; no completed outputs supplied&#39;)\nurls=[]\nfor i,u in enumerate(r.get(&#39;data&#39;,[])):\n    if not isinstance(u,str):raise SystemExit(&#39;Keep the original response; unexpected asset shape&#39;)\n    urls.append((str(i),u))\nfor label,path in urls:\n    u=urljoin(&#39;https://api.ailoot.ai&#39;,path);z=urlsplit(u)\n    if z.scheme!=&#39;https&#39; or z.netloc!=&#39;api.ailoot.ai&#39; or z.username or z.password:raise SystemExit(&#39;Use the actual returned Ailoot owned content URL&#39;)\n    target=Path(&#39;owned-&#39;+label+&#39;.bin&#39;)\n    subprocess.run([&#39;curl&#39;,&#39;--fail-with-body&#39;,&#39;--silent&#39;,&#39;--show-error&#39;,u,&#39;-H&#39;,&#39;Authorization: Bearer &#39;+os.environ[&#39;AILOOT_API_KEY&#39;],&#39;-D&#39;,str(target)+&#39;.headers&#39;,&#39;-o&#39;,str(target)],check=True)\nprint(&#39;All returned owned URLs saved; complete metadata, timing and usage remain in the JSON.&#39;)\nPY_ASSETS\n</code></pre></div></div></div></details><div class=\"card-result-process\" data-all-results><h5>Conserver tous les résultats terminés</h5><p class=\"note-s\">Enregistrez chaque vidéo terminée ou fichier renvoyé ; récupérez chaque URL de ressource effectivement renvoyée.</p><p class=\"note-s\">Conservez toutes les sorties réelles vous appartenant et les métadonnées mesurées renvoyées pour chacune.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Si la réponse d’origine doit être vérifiée</h5><p class=\"note-s\">503 result_pending_check + originalid + X-Should-Retry:false ; ne rejouez jamais la demande d’origine</p></div><details class=\"card-about\" data-output-fields><summary>Champs de la réponse</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Champ</th><th>Type</th><th>Signification</th></tr></thead><tbody><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">index</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>integer</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>Position de cette vidéo dans la liste des sorties, en commençant à zéro.</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">content_url</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>URL HTTPS signée pour télécharger cette vidéo terminée.</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">sha256</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string | null</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>Empreinte SHA-256 des octets vidéo d’origine ; null si indisponible.</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">size_bytes</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>integer | null</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>Taille du fichier vidéo d’origine en octets ; null si indisponible.</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">duration_ms</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>integer | null</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>Durée vidéo mesurée en millisecondes ; null si indisponible.</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">width</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>integer | null</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>Largeur de la vidéo en pixels ; null si indisponible.</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">height</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>integer | null</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>Hauteur de la vidéo en pixels ; null si indisponible.</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">video_codec</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string | null</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>Identifiant du codec vidéo ; null s’il n’est pas enregistré.</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">has_audio</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>boolean | null</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>Indique si la vidéo contient une piste audio ; null si cela n’a pas été mesuré.</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">audio_codec</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string | null</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>Identifiant du codec audio ; null lorsqu’aucun identifiant n’est enregistré.</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Erreurs et étapes suivantes</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Réponse</th><th>Condition</th><th>Étape suivante</th></tr></thead><tbody><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>404 · <code>not_found_error</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>L’accès vidéo n’est pas disponible, ou cet identifiant vidéo est introuvable.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Vérifiez l’accès vidéo. Pour une vidéo existante, utilisez son identifiant public d’origine et la même clé API.</td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>401 · <code>authentication_error</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>La clé API ne correspond pas au compte authentifié.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Vérifiez votre clé API et l’accès à votre compte avant de soumettre la demande.</td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>La requête n’a pas pu être lue ou l’index de téléchargement n’est pas valide.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Corrigez le corps de la requête. Pour un téléchargement, choisissez un index de sortie renvoyé par la tâche d’origine.</td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>422 · <code>price_unavailable</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>La configuration vidéo sélectionnée ne peut pas être tarifée.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Choisissez une configuration vidéo prise en charge et renseignez ses options obligatoires avant de soumettre une demande corrigée.</td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>422 · <code>invalid_request_error</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>Une entrée vidéo ou une tâche de continuation d’origine n’est pas valide.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Utilisez des entrées HTTPS valides. Pour une continuation, utilisez l’identifiant vidéo public de votre original terminé avec la même clé API.</td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>402 · <code>billing_error</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>Le solde disponible ou les limites ne permettent pas de réserver les fonds nécessaires.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Vérifiez votre solde disponible et vos limites avant d’envoyer une nouvelle demande.</td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>503 · <code>server_error</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>La vérification vidéo, le stockage ou l’accès au service est temporairement indisponible.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Attendez que le service soit disponible. Si vous possédez déjà un identifiant vidéo, consultez cette tâche d’origine au lieu de créer une autre génération.</td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>503 · <code>result_pending_check</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>Le résultat vidéo d’origine et sa facturation nécessitent une vérification.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Conservez l’identifiant vidéo renvoyé et consultez cette tâche. N’envoyez pas de demande de génération de remplacement tant que sa vérification est en cours.</td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>503 · <code>owned_result_unavailable</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>Le téléchargement de la vidéo existante est temporairement indisponible.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Consultez cette même tâche vidéo ultérieurement et téléchargez sa sortie existante. Une nouvelle génération crée une opération distincte.</td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>409 · <code>video_not_ready</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>Le contenu vidéo n’a pas été publié.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Vérifiez le statut de la tâche d’origine. Téléchargez après l’apparition de completed ; si elle indique failed, suivez son avis de vérification de la facturation.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Alias</h3><h4>Alias du modèle</h4><p class=\"note-s\"><span data-model-alias-route=\"Ultra\"><b>Ailoot Ultra</b> <a href=\"#m=kwaivgi%2Fkling-video-o1&amp;route=Ultra&amp;caller=kwaivgi%2Fkling-video-o1&amp;fmt=videos\"><code>kwaivgi/kling-video-o1</code></a></span></p><h4>Alias des chemins de méthode</h4><p class=\"note-s\">Utilisez les chemins de méthode indiqués ci-dessus.</p><h4>ID d’appel associés</h4><p class=\"note-s\"><a href=\"#m=kwaivgi%2Fkling-video-o1&amp;route=Ultra&amp;caller=kwaivgi%2Fkling-video-o1&amp;fmt=videos\"><code>kwaivgi/kling-video-o1</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "kwaivgi/kling-video-o1",
        "fmt": "videos",
        "http": "POST",
        "path": "/v1/videos",
        "request_model_id": "kwaivgi/kling-video-o1",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|videos|/v1/videos|kwaivgi%2Fkling-video-o1",
      "ordinal": 0,
      "rawMethod": {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "Les tarifs affichés servent à estimer le coût avant la génération. Le montant final est calculé à partir du coût enregistré pour la génération d’origine. La durée mesurée du résultat et les quantités prévisionnelles ne constituent pas la quantité finale facturable.",
          "forecast_quantity_is_estimate": true,
          "physical_output_is_billable_quantity": false,
          "version": "original_invoice_usd_v1"
        },
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Conservez toutes les sorties réelles vous appartenant et les métadonnées mesurées renvoyées pour chacune.",
            "defaults": {
              "aspect_ratio": null,
              "duration": null,
              "generate_audio": "endpoint capability flag when published; omitted unknown stays unknown; never guarantees audio track",
              "resolution": null,
              "seed": null,
              "size": null,
              "wire_omissions_preserved": true
            },
            "errors": [
              {
                "condition": "L’accès vidéo n’est pas disponible, ou cet identifiant vidéo est introuvable.",
                "http_status": 404,
                "public_identifier_field": "error.type",
                "recovery": "Vérifiez l’accès vidéo. Pour une vidéo existante, utilisez son identifiant public d’origine et la même clé API.",
                "type": "not_found_error"
              },
              {
                "condition": "La clé API ne correspond pas au compte authentifié.",
                "http_status": 401,
                "public_identifier_field": "error.type",
                "recovery": "Vérifiez votre clé API et l’accès à votre compte avant de soumettre la demande.",
                "type": "authentication_error"
              },
              {
                "condition": "La requête n’a pas pu être lue ou l’index de téléchargement n’est pas valide.",
                "http_status": 400,
                "public_identifier_field": "error.type",
                "recovery": "Corrigez le corps de la requête. Pour un téléchargement, choisissez un index de sortie renvoyé par la tâche d’origine.",
                "type": "invalid_request_error"
              },
              {
                "condition": "La configuration vidéo sélectionnée ne peut pas être tarifée.",
                "http_status": 422,
                "public_identifier_field": "error.type",
                "recovery": "Choisissez une configuration vidéo prise en charge et renseignez ses options obligatoires avant de soumettre une demande corrigée.",
                "type": "price_unavailable"
              },
              {
                "condition": "Une entrée vidéo ou une tâche de continuation d’origine n’est pas valide.",
                "http_status": 422,
                "public_identifier_field": "error.type",
                "recovery": "Utilisez des entrées HTTPS valides. Pour une continuation, utilisez l’identifiant vidéo public de votre original terminé avec la même clé API.",
                "type": "invalid_request_error"
              },
              {
                "condition": "Le solde disponible ou les limites ne permettent pas de réserver les fonds nécessaires.",
                "http_status": 402,
                "public_identifier_field": "error.type",
                "recovery": "Vérifiez votre solde disponible et vos limites avant d’envoyer une nouvelle demande.",
                "type": "billing_error"
              },
              {
                "condition": "La vérification vidéo, le stockage ou l’accès au service est temporairement indisponible.",
                "http_status": 503,
                "public_identifier_field": "error.type",
                "recovery": "Attendez que le service soit disponible. Si vous possédez déjà un identifiant vidéo, consultez cette tâche d’origine au lieu de créer une autre génération.",
                "type": "server_error"
              },
              {
                "code": "result_pending_check",
                "condition": "Le résultat vidéo d’origine et sa facturation nécessitent une vérification.",
                "http_status": 503,
                "public_identifier_field": "error.code",
                "recovery": "Conservez l’identifiant vidéo renvoyé et consultez cette tâche. N’envoyez pas de demande de génération de remplacement tant que sa vérification est en cours.",
                "type": "server_error"
              },
              {
                "code": "owned_result_unavailable",
                "condition": "Le téléchargement de la vidéo existante est temporairement indisponible.",
                "http_status": 503,
                "public_identifier_field": "error.code",
                "recovery": "Consultez cette même tâche vidéo ultérieurement et téléchargez sa sortie existante. Une nouvelle génération crée une opération distincte.",
                "type": "server_error"
              },
              {
                "condition": "Le contenu vidéo n’a pas été publié.",
                "http_status": 409,
                "public_identifier_field": "error.type",
                "recovery": "Vérifiez le statut de la tâche d’origine. Téléchargez après l’apparition de completed ; si elle indique failed, suivez son avis de vérification de la facturation.",
                "type": "video_not_ready"
              }
            ],
            "hints": [
              "No null values or duplicate keys at any JSON object level",
              "No duration/resolution/aspect default is inserted",
              "Prompt required for all21 despite broader official image-only schema",
              "A request must also pass model membership, exact price card, SKU selection and frozen quote construction",
              "Non-string known trace fields reject; other trace keys retain arbitrary JSON",
              "No n/output-count/client price fields accepted",
              "Provider passthrough disabled for all21; feed allowlist names do not supply provider slug/value contract"
            ],
            "ignored_fields": [],
            "lifecycle": {
              "cancel_endpoint": null,
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{public_id}/content",
                  "query": {
                    "index": "actual output index"
                  }
                }
              ],
              "create": {
                "http": "POST",
                "path": "/v1/videos"
              },
              "mode": "submit_once_poll_original",
              "public_id": "video_<uuid>; owner user/key/group scope",
              "status": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{public_id}"
                }
              ],
              "submit_status": 202,
              "terminal_failure_public": "200 failed + charge_pending_check=true; inspect original operation",
              "terminal_provider_states": [
                "failed",
                "cancelled",
                "expired"
              ],
              "unknown": "503 result_pending_check + originalid + X-Should-Retry:false ; ne rejouez jamais la demande d’origine"
            },
            "material_combinations": [
              {
                "mode": "text_to_video",
                "model": {
                  "enum": [
                    "kwaivgi/kling-video-o1"
                  ],
                  "enum_known": true,
                  "type": "string"
                },
                "prompt": {
                  "max_utf8_bytes": 10000,
                  "non_whitespace": true,
                  "type": "string"
                },
                "representation": "Fournissez prompt sous forme de texte et duration en secondes entières. Choisissez une résolution prise en charge ; ajoutez un rapport d’image ou utilisez une taille indiquée.",
                "required": [
                  "model",
                  "prompt",
                  "duration"
                ],
                "required_material": "Une consigne écrite."
              },
              {
                "exact_keys": [
                  "type",
                  "image_url",
                  "frame_type"
                ],
                "mode": "image_to_video",
                "model": {
                  "enum": [
                    "kwaivgi/kling-video-o1"
                  ],
                  "enum_known": true,
                  "type": "string"
                },
                "prompt": {
                  "max_utf8_bytes": 10000,
                  "non_whitespace": true,
                  "type": "string"
                },
                "representation": "frame_images est un tableau. Chaque objet d’image comporte type, image_url et frame_type ; image_url contient url. Définissez type sur image_url. Utilisez first_frame avec, facultativement, last_frame. Chaque rôle d’image apparaît au plus une fois. Fournissez une URL HTTPS publique pour chaque image. Choisissez une résolution prise en charge ; ajoutez un rapport d’image ou utilisez une taille indiquée.",
                "required": [
                  "model",
                  "prompt",
                  "duration",
                  "frame_images"
                ],
                "required_material": "Une consigne écrite et une image initiale."
              }
            ],
            "operation_modes": [
              "text_to_video",
              "image_to_video_frame_images"
            ],
            "outputs": {
              "content_range_supported": true,
              "every_actual_output": true,
              "family": "video",
              "fields": [
                {
                  "condition": "Always present for each completed output.",
                  "description": "Position de cette vidéo dans la liste des sorties, en commençant à zéro.",
                  "field_path": "outputs[].index",
                  "json_schema": {
                    "type": "integer"
                  },
                  "name": "index",
                  "nullable": false,
                  "type": "integer"
                },
                {
                  "condition": "Present after the owned result is available and a signed URL is created.",
                  "description": "URL HTTPS signée pour télécharger cette vidéo terminée.",
                  "field_path": "outputs[].content_url",
                  "json_schema": {
                    "type": "string"
                  },
                  "name": "content_url",
                  "nullable": false,
                  "type": "string"
                },
                {
                  "condition": "A nonempty recorded digest is returned; otherwise null.",
                  "description": "Empreinte SHA-256 des octets vidéo d’origine ; null si indisponible.",
                  "field_path": "outputs[].sha256",
                  "json_schema": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": "sha256",
                  "nullable": true,
                  "type": "string | null"
                },
                {
                  "condition": "Returned when the recorded file size is positive.",
                  "description": "Taille du fichier vidéo d’origine en octets ; null si indisponible.",
                  "field_path": "outputs[].size_bytes",
                  "json_schema": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "name": "size_bytes",
                  "nullable": true,
                  "type": "integer | null"
                },
                {
                  "condition": "Returned when the measured duration is positive.",
                  "description": "Durée vidéo mesurée en millisecondes ; null si indisponible.",
                  "field_path": "outputs[].duration_ms",
                  "json_schema": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "name": "duration_ms",
                  "nullable": true,
                  "type": "integer | null"
                },
                {
                  "condition": "Width, height and the video codec are returned together when recorded.",
                  "description": "Largeur de la vidéo en pixels ; null si indisponible.",
                  "field_path": "outputs[].width",
                  "json_schema": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "name": "width",
                  "nullable": true,
                  "type": "integer | null"
                },
                {
                  "condition": "Width, height and the video codec are returned together when recorded.",
                  "description": "Hauteur de la vidéo en pixels ; null si indisponible.",
                  "field_path": "outputs[].height",
                  "json_schema": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "name": "height",
                  "nullable": true,
                  "type": "integer | null"
                },
                {
                  "condition": "Returned together with positive recorded width and height.",
                  "description": "Identifiant du codec vidéo ; null s’il n’est pas enregistré.",
                  "field_path": "outputs[].video_codec",
                  "json_schema": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": "video_codec",
                  "nullable": true,
                  "type": "string | null"
                },
                {
                  "condition": "Returned when width, height and the video codec are recorded; false is a known result.",
                  "description": "Indique si la vidéo contient une piste audio ; null si cela n’a pas été mesuré.",
                  "field_path": "outputs[].has_audio",
                  "json_schema": {
                    "type": [
                      "boolean",
                      "null"
                    ]
                  },
                  "name": "has_audio",
                  "nullable": true,
                  "type": "boolean | null"
                },
                {
                  "condition": "Returned when video metadata is recorded and the audio codec identifier is nonempty.",
                  "description": "Identifiant du codec audio ; null lorsqu’aucun identifiant n’est enregistré.",
                  "field_path": "outputs[].audio_codec",
                  "json_schema": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": "audio_codec",
                  "nullable": true,
                  "type": "string | null"
                }
              ],
              "format": "original MP4 bytes; no normalization/transcode",
              "max_aggregate_seconds": 2400,
              "max_bytes_per_output": 67108864,
              "max_seconds_per_output": 600,
              "result": "URL signées de contenu vous appartenant",
              "unmeasured_fields_nullable": true
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "kwaivgi/kling-video-o1"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "schema": {
                  "const": "kwaivgi/kling-video-o1"
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "minLength": 1,
                "name": "prompt",
                "required": true,
                "schema": {
                  "minLength": 1,
                  "type": "string",
                  "x-source-max-utf8-bytes": 10000,
                  "x-source-non-whitespace": true
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  5,
                  10
                ],
                "enum_known": true,
                "maximum": 600,
                "minimum": 1,
                "name": "duration",
                "required": true,
                "schema": {
                  "enum": [
                    5,
                    10
                  ],
                  "maximum": 600,
                  "minimum": 1,
                  "type": "integer"
                },
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "720p"
                ],
                "enum_known": true,
                "name": "resolution",
                "required": false,
                "schema": {
                  "enum": [
                    "720p"
                  ]
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "16:9",
                  "9:16",
                  "1:1"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": false,
                "schema": {
                  "enum": [
                    "16:9",
                    "9:16",
                    "1:1"
                  ]
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  false,
                  true
                ],
                "enum_known": true,
                "name": "generate_audio",
                "required": false,
                "schema": {
                  "enum": [
                    false,
                    true
                  ],
                  "x-omitted-default": "published audio capability when true/false; unknown if null; output audio must be measured"
                },
                "type": "boolean"
              },
              {
                "availability": "source_interface",
                "conditions": "Ces clés décrivent chaque objet d’image ; image_url contient uniquement url. Omettez frame_images pour une requête contenant uniquement du texte.",
                "content": "Tableau d’objets d’image. Chaque objet comporte type=image_url, image_url contenant url et frame_type. Utilisez une URL HTTPS pour l’image et définissez frame_type sur first_frame ou last_frame. Chaque rôle d’image apparaît au plus une fois.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "exact_keys": [
                  "type",
                  "image_url",
                  "frame_type"
                ],
                "maxItems": 2,
                "max_items": 2,
                "minItems": 1,
                "min_items": 1,
                "name": "frame_images",
                "required": false,
                "schema": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "frame_type": {
                        "enum": [
                          "first_frame",
                          "last_frame"
                        ]
                      },
                      "image_url": {
                        "additionalProperties": false,
                        "properties": {
                          "url": {
                            "format": "uri",
                            "pattern": "^https://",
                            "type": "string",
                            "x-source-rule": "public HTTPS; no userinfo, fragment, whitespace, private/reserved hosts; own-media links additionally require owner/signature/status/hash/MIME/bytes"
                          }
                        },
                        "required": [
                          "url"
                        ],
                        "type": "object"
                      },
                      "type": {
                        "const": "image_url"
                      }
                    },
                    "required": [
                      "type",
                      "image_url",
                      "frame_type"
                    ],
                    "type": "object"
                  },
                  "maxItems": 2,
                  "minItems": 1,
                  "type": "array",
                  "x-source-unique-role": "frame_type"
                },
                "type": "array"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maxItems": 0,
                "name": "input_references",
                "required": false,
                "schema": {
                  "items": false,
                  "maxItems": 0,
                  "type": "array"
                },
                "type": "array"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "1280x720",
                  "720x1280",
                  "720x720"
                ],
                "enum_known": true,
                "name": "size",
                "pattern": "^[1-9][0-9]*x[1-9][0-9]*$",
                "required": false,
                "schema": {
                  "enum": [
                    "1280x720",
                    "720x1280",
                    "720x720"
                  ],
                  "pattern": "^[1-9][0-9]*x[1-9][0-9]*$",
                  "type": "string"
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "callback_url",
                "pattern": "^https://",
                "required": false,
                "schema": {
                  "format": "uri",
                  "pattern": "^https://",
                  "type": "string",
                  "x-source-rule": "public HTTPS; no userinfo, fragment, whitespace, private/reserved hosts; own-media links additionally require owner/signature/status/hash/MIME/bytes"
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maxLength": 256,
                "name": "session_id",
                "required": false,
                "schema": {
                  "maxLength": 256,
                  "type": "string"
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "trace",
                "required": false,
                "schema": {
                  "additionalProperties": true,
                  "properties": {
                    "generation_name": {
                      "type": "string"
                    },
                    "parent_span_id": {
                      "type": "string"
                    },
                    "span_name": {
                      "type": "string"
                    },
                    "trace_id": {
                      "type": "string"
                    },
                    "trace_name": {
                      "type": "string"
                    }
                  },
                  "type": "object"
                },
                "type": "object"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maxLength": 256,
                "name": "user",
                "required": false,
                "schema": {
                  "maxLength": 256,
                  "type": "string"
                },
                "type": "string"
              }
            ],
            "request_schema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "additionalProperties": false,
              "properties": {
                "aspect_ratio": {
                  "enum": [
                    "16:9",
                    "9:16",
                    "1:1"
                  ]
                },
                "callback_url": {
                  "format": "uri",
                  "pattern": "^https://",
                  "type": "string",
                  "x-source-rule": "public HTTPS; no userinfo, fragment, whitespace, private/reserved hosts; own-media links additionally require owner/signature/status/hash/MIME/bytes"
                },
                "creativity": false,
                "duration": {
                  "enum": [
                    5,
                    10
                  ],
                  "maximum": 600,
                  "minimum": 1,
                  "type": "integer"
                },
                "frame_images": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "frame_type": {
                        "enum": [
                          "first_frame",
                          "last_frame"
                        ]
                      },
                      "image_url": {
                        "additionalProperties": false,
                        "properties": {
                          "url": {
                            "format": "uri",
                            "pattern": "^https://",
                            "type": "string",
                            "x-source-rule": "public HTTPS; no userinfo, fragment, whitespace, private/reserved hosts; own-media links additionally require owner/signature/status/hash/MIME/bytes"
                          }
                        },
                        "required": [
                          "url"
                        ],
                        "type": "object"
                      },
                      "type": {
                        "const": "image_url"
                      }
                    },
                    "required": [
                      "type",
                      "image_url",
                      "frame_type"
                    ],
                    "type": "object"
                  },
                  "maxItems": 2,
                  "minItems": 1,
                  "type": "array",
                  "x-source-unique-role": "frame_type"
                },
                "generate_audio": {
                  "enum": [
                    false,
                    true
                  ],
                  "x-omitted-default": "published audio capability when true/false; unknown if null; output audio must be measured"
                },
                "input_references": {
                  "items": false,
                  "maxItems": 0,
                  "type": "array"
                },
                "model": {
                  "const": "kwaivgi/kling-video-o1"
                },
                "previous_job_id": false,
                "prompt": {
                  "minLength": 1,
                  "type": "string",
                  "x-source-max-utf8-bytes": 10000,
                  "x-source-non-whitespace": true
                },
                "provider": false,
                "resolution": {
                  "enum": [
                    "720p"
                  ]
                },
                "seed": false,
                "session_id": {
                  "maxLength": 256,
                  "type": "string"
                },
                "size": {
                  "enum": [
                    "1280x720",
                    "720x1280",
                    "720x720"
                  ],
                  "pattern": "^[1-9][0-9]*x[1-9][0-9]*$",
                  "type": "string"
                },
                "trace": {
                  "additionalProperties": true,
                  "properties": {
                    "generation_name": {
                      "type": "string"
                    },
                    "parent_span_id": {
                      "type": "string"
                    },
                    "span_name": {
                      "type": "string"
                    },
                    "trace_id": {
                      "type": "string"
                    },
                    "trace_name": {
                      "type": "string"
                    }
                  },
                  "type": "object"
                },
                "upscale_factor": false,
                "user": {
                  "maxLength": 256,
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt",
                "duration"
              ],
              "title": "Video generation request",
              "type": "object",
              "x-source-global-rules": [
                "No null values or duplicate keys at any JSON object level",
                "No duration/resolution/aspect default is inserted",
                "Prompt required for all21 despite broader official image-only schema",
                "A request must also pass model membership, exact price card, SKU selection and frozen quote construction",
                "Non-string known trace fields reject; other trace keys retain arbitrary JSON",
                "No n/output-count/client price fields accepted",
                "Provider passthrough disabled for all21; feed allowlist names do not supply provider slug/value contract"
              ],
              "x-source-material-combinations": [
                "Exact model/card, positive published duration, model resolution/aspect membership and valid frozen quote are all required; independent enum arrays are not proven provider Cartesian combinations.",
                "Use exact published size or compatible resolution/aspect. Omitted options stay omitted; no guessed geometry.",
                "first_frame/last_frame roles each occur at most once; frame_images wins mode precedence over input_references.",
                "provider options are unavailable for this model despite any published passthrough-name allowlist."
              ]
            },
            "unsupported": [
              "seed",
              "provider",
              "previous_job_id",
              "upscale_factor",
              "creativity"
            ]
          },
          "input": {
            "additional_properties": false,
            "content_type": "application/json",
            "material_types": [
              "text",
              "image"
            ],
            "optional_controls": [
              "resolution",
              "aspect_ratio",
              "generate_audio",
              "frame_images",
              "input_references",
              "size",
              "callback_url",
              "session_id",
              "trace",
              "user"
            ],
            "required": [
              "model",
              "prompt",
              "duration"
            ]
          },
          "lifecycle": {
            "cancel_endpoint": null,
            "content": [
              {
                "http": "GET",
                "path": "/v1/videos/{public_id}/content",
                "query": {
                  "index": "actual output index"
                }
              }
            ],
            "create": {
              "http": "POST",
              "path": "/v1/videos"
            },
            "mode": "submit_once_poll_original",
            "public_id": "video_<uuid>; owner user/key/group scope",
            "status": [
              {
                "http": "GET",
                "path": "/v1/videos/{public_id}"
              }
            ],
            "submit_status": 202,
            "terminal_failure_public": "200 failed + charge_pending_check=true; inspect original operation",
            "terminal_provider_states": [
              "failed",
              "cancelled",
              "expired"
            ],
            "unknown": "503 result_pending_check + originalid + X-Should-Retry:false; never replay original"
          },
          "method": {
            "http": "POST",
            "path": "/v1/videos"
          },
          "method_aliases": [],
          "operation_modes": [
            "text_to_video",
            "image_to_video_frame_images"
          ],
          "output": {
            "content_range_supported": true,
            "every_actual_output": true,
            "family": "video",
            "fields": [
              {
                "condition": "Always present for each completed output.",
                "description": "Zero-based position of this video in the outputs list.",
                "field_path": "outputs[].index",
                "json_schema": {
                  "type": "integer"
                },
                "name": "index",
                "nullable": false,
                "type": "integer"
              },
              {
                "condition": "Present after the owned result is available and a signed URL is created.",
                "description": "Signed HTTPS download URL for this completed video.",
                "field_path": "outputs[].content_url",
                "json_schema": {
                  "type": "string"
                },
                "name": "content_url",
                "nullable": false,
                "type": "string"
              },
              {
                "condition": "A nonempty recorded digest is returned; otherwise null.",
                "description": "SHA-256 digest of the original video bytes; null if unavailable.",
                "field_path": "outputs[].sha256",
                "json_schema": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "name": "sha256",
                "nullable": true,
                "type": "string | null"
              },
              {
                "condition": "Returned when the recorded file size is positive.",
                "description": "Size of the original video file in bytes; null if unavailable.",
                "field_path": "outputs[].size_bytes",
                "json_schema": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "name": "size_bytes",
                "nullable": true,
                "type": "integer | null"
              },
              {
                "condition": "Returned when the measured duration is positive.",
                "description": "Measured video duration in milliseconds; null if unavailable.",
                "field_path": "outputs[].duration_ms",
                "json_schema": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "name": "duration_ms",
                "nullable": true,
                "type": "integer | null"
              },
              {
                "condition": "Width, height and the video codec are returned together when recorded.",
                "description": "Video width in pixels; null if unavailable.",
                "field_path": "outputs[].width",
                "json_schema": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "name": "width",
                "nullable": true,
                "type": "integer | null"
              },
              {
                "condition": "Width, height and the video codec are returned together when recorded.",
                "description": "Video height in pixels; null if unavailable.",
                "field_path": "outputs[].height",
                "json_schema": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "name": "height",
                "nullable": true,
                "type": "integer | null"
              },
              {
                "condition": "Returned together with positive recorded width and height.",
                "description": "Video codec identifier; null if not recorded.",
                "field_path": "outputs[].video_codec",
                "json_schema": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "name": "video_codec",
                "nullable": true,
                "type": "string | null"
              },
              {
                "condition": "Returned when width, height and the video codec are recorded; false is a known result.",
                "description": "Whether the video contains an audio track; null if not measured.",
                "field_path": "outputs[].has_audio",
                "json_schema": {
                  "type": [
                    "boolean",
                    "null"
                  ]
                },
                "name": "has_audio",
                "nullable": true,
                "type": "boolean | null"
              },
              {
                "condition": "Returned when video metadata is recorded and the audio codec identifier is nonempty.",
                "description": "Audio codec identifier; null when no identifier is recorded.",
                "field_path": "outputs[].audio_codec",
                "json_schema": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "name": "audio_codec",
                "nullable": true,
                "type": "string | null"
              }
            ],
            "format": "original MP4 bytes; no normalization/transcode",
            "max_aggregate_seconds": 2400,
            "max_bytes_per_output": 67108864,
            "max_seconds_per_output": 600,
            "result": "signed owned content URLs",
            "unmeasured_fields_nullable": true
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "conditions": "No additional condition is declared in this pricing key.",
              "quoted_unit": "per video second"
            },
            "label": "Video price",
            "units": [
              {
                "amount": "0.224",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds",
                "label": "Video price",
                "native_amount_usd_per_unit": "0.224",
                "native_quantity": 1,
                "public_unit_label": "per video second",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "basis": "Cette estimation ne constitue ni des frais supplémentaires ni un tarif fixe pour la génération terminée.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Coût de génération estimé",
            "units": [
              {
                "amount": "1.12",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "1.12",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_REQUEST'\nfrom pathlib import Path\nPath('request.json').write_text('{\"aspect_ratio\":\"16:9\",\"duration\":5,\"model\":\"kwaivgi/kling-video-o1\",\"prompt\":\"A serene mountain landscape at sunset\",\"resolution\":\"720p\"}', encoding='utf-8')\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nr=json.loads(Path('result.json').read_text())\nprint(json.dumps(r,ensure_ascii=False,indent=2))\nprint('Keep the complete JSON and response headers; do not resubmit an unknown creation.')\nPY_RESULT\n",
            "label": "curl · create video",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_STATUS_URL'\nimport json\nfrom pathlib import Path\nfrom urllib.parse import quote\nr=json.loads(Path('result.json').read_text())\nif not isinstance(r.get('id'),str) or not r['id']:raise SystemExit('Keep the original response and headers for reconciliation; no returned ID')\nPath('status-url.txt').write_text('https://api.ailoot.ai/v1/videos/'+quote(r['id'],safe=''))\nPY_STATUS_URL\ncurl --fail-with-body --silent --show-error \"$(cat status-url.txt)\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -D status-headers.txt -o status.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nr=json.loads(Path('status.json').read_text())\nprint(json.dumps(r,ensure_ascii=False,indent=2))\nprint('Keep the complete JSON and response headers; do not resubmit an unknown creation.')\nPY_RESULT\n",
            "label": "GET original status",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_ASSETS'\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path('status.json').read_text())\nif r.get('status')!='completed':raise SystemExit('Keep the original ID and read its status; never recreate an unknown job')\nif not isinstance(r.get('data'),list) or not r['data']:raise SystemExit('Keep the complete original status; no completed outputs supplied')\nurls=[]\nfor i,u in enumerate(r.get('data',[])):\n    if not isinstance(u,str):raise SystemExit('Keep the original response; unexpected asset shape')\n    urls.append((str(i),u))\nfor label,path in urls:\n    u=urljoin('https://api.ailoot.ai',path);z=urlsplit(u)\n    if z.scheme!='https' or z.netloc!='api.ailoot.ai' or z.username or z.password:raise SystemExit('Use the actual returned Ailoot owned content URL')\n    target=Path('owned-'+label+'.bin')\n    subprocess.run(['curl','--fail-with-body','--silent','--show-error',u,'-H','Authorization: Bearer '+os.environ['AILOOT_API_KEY'],'-D',str(target)+'.headers','-o',str(target)],check=True)\nprint('All returned owned URLs saved; complete metadata, timing and usage remain in the JSON.')\nPY_ASSETS\n",
            "label": "Save every completed owned output",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "videos",
        "hints": [],
        "http": "POST",
        "in": null,
        "input": [
          "text",
          "image"
        ],
        "label": "Видео",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [],
        "out": null,
        "output": [
          "video"
        ],
        "path": "/v1/videos",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "original_invoice_usd",
          "image_input_price": null,
          "image_output_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "conditions": "No additional condition is declared in this pricing key.",
              "quoted_unit": "per video second"
            },
            "label": "Video price",
            "units": [
              {
                "amount": "0.224",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds",
                "label": "Video price",
                "native_amount_usd_per_unit": "0.224",
                "native_quantity": 1,
                "public_unit_label": "per video second",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "basis": "This estimate is not an additional charge or a fixed rate for the completed generation.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Estimated generation cost",
            "units": [
              {
                "amount": "1.12",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "1.12",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "request_model_id": "kwaivgi/kling-video-o1",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/videos/{public_id}",
          "GET /v1/videos/{public_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.224",
            "amount_unit": "usd_per_video_second",
            "billing_input": false,
            "estimate_only": true,
            "key": "duration_seconds",
            "label": "Video price",
            "native_amount_usd_per_unit": "0.224",
            "native_quantity": 1,
            "public_unit_label": "per video second",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "video_second"
          },
          {
            "amount": "1.12",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "1.12",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ]
      }
    }
  ],
  "model_id": "kwaivgi/kling-video-o1",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "9106c8fcc14fe4f196c6b528c9cb622f53f61dfdbc0258c27fe119e0c68fc097",
    "input_html_sha256": "edc52cf9399b434922b30632e4d35d51551017527a3bd9bf8a523fb4d4c15699",
    "private_audit_sha256": "3881d42df99b4b0e3aa8c4ef73e9d77f63aea308015a96db4201d8ec739f97da",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/fr/kwaivgi-kling-video-o1/",
    "description": "Kling VIDEO O1 est le modèle vidéo de Kuaishou guidé par des références pour générer et modifier des scènes à l’aide de texte, d’images, d’éléments de sujets et d’un clip source. Utilisez son profil de génération de trois à dix secondes pour la continuité visuelle, les transitions guidées entre images et les modifications ciblées de séquences existantes.",
    "locale": "fr",
    "md_url": "https://ailoot.ai/models/fr/kwaivgi-kling-video-o1/index.md",
    "title": "Kling: Video O1 — Ailoot",
    "url": "https://ailoot.ai/models/fr/kwaivgi-kling-video-o1/"
  },
  "rawModel": {
    "about": "Kling VIDEO O1 est le modèle vidéo unifié de Kuaishou guidé par des références. Il combine une description textuelle avec des images, des éléments de sujets préparés ou une vidéo source pour guider de nouvelles scènes et des modifications ciblées de séquences existantes. Son interface principale est un brief visuel : identifiez les matériaux de référence, décrivez leur rôle et précisez l’apparence, l’action ou la transformation souhaitées dans la vidéo obtenue.\n\nUn nouveau plan peut partir de texte, d’une image d’ouverture ou d’un ensemble de références visuelles. Utilisez une image pour définir un personnage ou un objet, et décrivez le décor, l’action et le point de vue avec des mots. Lorsque plusieurs références apportent des caractéristiques différentes, attribuez-leur explicitement leurs rôles. Un brief de produit peut prendre l’objet d’une image et l’environnement d’une autre, puis décrire le mouvement de l’objet dans ce décor.\n\nLe prompt d’O1 peut désigner des images, des éléments et des vidéos avec des marqueurs de référence spécifiques, tels que <<<image_1>>> ou <<<video_1>>>. Associez ces marqueurs aux fichiers réellement fournis et expliquez ce qu’il faut en reprendre. Le producteur autorise des prompts de 2 500 caractères. Une instruction concise qui identifie le sujet et le changement est plus utile qu’une collection de termes de style sans rapport entre eux.\n\nPour les références basées sur des images sans entrée vidéo, la limite combinée documentée atteint sept images de référence et éléments multi-images au total. Avec une vidéo de référence, cette limite d’images et d’éléments est de quatre. Ces limites concernent les éléments basés sur des images ; les autres types d’éléments ont leurs propres règles de compatibilité. Choisissez les matériaux qui fournissent les informations essentielles sur l’apparence ou la scène, plutôt que de remplir la limite avec des vues redondantes.\n\nLes images d’entrée utilisent JPG, JPEG ou PNG et sont fournies sous forme d’URL accessible ou de données d’image, avec des fichiers allant jusqu’à 10 Mo, des dimensions d’au moins 300 pixels et un rapport largeur/hauteur compris entre 1:2.5 et 2.5:1. Préparez des sujets nets et conservez les détails importants dans le recadrage. Si la tâche nécessite qu’un personnage ou un produit reste reconnaissable, précisez les caractéristiques à préserver et examinez-les sur toute la durée du clip terminé.\n\nLes images de début et de fin conditionnent une transition entre des limites visuelles. Le processus documenté d’O1 pour ces images exige une image de départ lorsqu’une image de fin est fournie et ne prend pas en charge le contrôle début/fin avec plus de deux images dans le tableau. Lorsque les deux images de délimitation sont utilisées, les éléments de sujets supplémentaires ne font pas partie de cette configuration O1. Distinguez une tâche contrôlée par des images initiales et finales de la modification d’une vidéo de base fournie.\n\nUne vidéo source peut avoir deux rôles distincts. Comme clip de base, elle est la séquence à modifier : demandez un ajout, une suppression, un traitement de style ou un changement de composition précis, tout en indiquant ce qui doit rester. La modification suit la durée du clip d’entrée et ne combine pas cette tâche sur vidéo de base avec le contrôle d’images initiales et finales ou la génération de plusieurs plans. Comme référence de caractéristiques, la vidéo fournit du contenu, du style ou des informations de caméra pour un nouveau plan.\n\nUn prompt avec vidéo de référence peut aussi demander un plan précédent ou suivant. Identifiez le clip source et décrivez le nouvel événement visible, par exemple la poursuite de l’action du sujet ou la révélation de l’environnement autour de lui. La référence sert ici à communiquer des informations visuelles ; vérifiez le raccord et la continuité du sujet avant d’assembler le nouveau segment avec la séquence originale.\n\nLe profil d’entrée vidéo du producteur accepte une source MP4 ou MOV, jusqu’à 200 Mo, d’une durée minimale de trois secondes. Son profil détaillé précise des dimensions de 720 à 2160 pixels et des fréquences de 24 à 60 images par seconde, avec un rapport largeur/hauteur d’entrée compris entre 1:2.5 et 2.5:1. Ce processus documenté avec vidéo source renvoie une vidéo à 24 images par seconde. La durée exacte autorisée pour le clip dépend aussi du profil de modèle sélectionné. La plage de nouvelle génération d’O1 va de trois à dix secondes, et diffère de celle du modèle 3.0 Omni ultérieur.\n\nLes modes O1 du producteur proposent des sorties 720p Standard ou 1080p Pro. Le cadrage des nouveaux plans permet les choix paysage, portrait et carré documentés lorsque la fonction choisie utilise ce contrôle ; une modification sur vidéo de base suit le cadrage source. Le son de la vidéo source peut être conservé ou supprimé. Le processus de références et de modification d’O1 doit rester distinct du profil ultérieur de 3.0 Omni avec son natif et storyboard personnalisé.\n\nLa génération produit une tâche dont le résultat terminé contient le fichier vidéo et la durée réelle. La documentation des résultats du producteur indique que les vidéos générées sont supprimées au bout de 30 jours : sauvegardez donc rapidement le clip terminé. Conservez les matériaux sources et le brief avec ce résultat, puis vérifiez la modification demandée, l’utilisation des références et la continuité. Pour une modification, comparez la zone concernée et les parties qui devaient rester. Pour un nouveau plan guidé par des références, vérifiez que chaque fichier a fourni les informations visuelles prévues. Gardez le clip terminé à disposition pour le montage ou la séquence de production suivante.",
    "alias_of": null,
    "aliases": [],
    "author": "Kuaishou",
    "available": null,
    "canonical_model": "kwaivgi/kling-video-o1",
    "capabilities": {
      "context_length": 0,
      "manufacturer_input": [
        "text",
        "image"
      ],
      "manufacturer_output": [
        "video"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "1.12",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "1.12",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ],
        "summary": "La tarification complète de la configuration figure dans les détails."
      }
    ],
    "ctx": null,
    "declared_tariff_references": [
      {
        "client_selectable": false,
        "key": "5674106f0bbce742cc7b0c00",
        "label": "Références tarifaires des configurations vidéo",
        "profiles": [
          {
            "basis": "Tarif publié de référence pour la configuration affichée. Les frais définitifs correspondent à la configuration réellement facturée.",
            "dimensions": {
              "conditions": "Cette clé de tarification ne déclare aucune condition supplémentaire."
            },
            "label": "Tarif vidéo",
            "units": [
              {
                "amount": "0.224",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "key": "video_second",
                "label": "Video price",
                "public_unit_label": "per video second",
                "quantity": 1,
                "rate_role": "typed_video_second_reference",
                "side": "out",
                "unit": "video_second"
              }
            ]
          }
        ]
      }
    ],
    "entity_type": "model",
    "formats": [
      "videos"
    ],
    "id": "kwaivgi/kling-video-o1",
    "input": [
      "text",
      "image"
    ],
    "kind": "video",
    "max_out": null,
    "methods": [
      {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "Les tarifs affichés servent à estimer le coût avant la génération. Le montant final est calculé à partir du coût enregistré pour la génération d’origine. La durée mesurée du résultat et les quantités prévisionnelles ne constituent pas la quantité finale facturable.",
          "forecast_quantity_is_estimate": true,
          "physical_output_is_billable_quantity": false,
          "version": "original_invoice_usd_v1"
        },
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Conservez toutes les sorties réelles vous appartenant et les métadonnées mesurées renvoyées pour chacune.",
            "defaults": {
              "aspect_ratio": null,
              "duration": null,
              "generate_audio": "endpoint capability flag when published; omitted unknown stays unknown; never guarantees audio track",
              "resolution": null,
              "seed": null,
              "size": null,
              "wire_omissions_preserved": true
            },
            "errors": [
              {
                "condition": "L’accès vidéo n’est pas disponible, ou cet identifiant vidéo est introuvable.",
                "http_status": 404,
                "public_identifier_field": "error.type",
                "recovery": "Vérifiez l’accès vidéo. Pour une vidéo existante, utilisez son identifiant public d’origine et la même clé API.",
                "type": "not_found_error"
              },
              {
                "condition": "La clé API ne correspond pas au compte authentifié.",
                "http_status": 401,
                "public_identifier_field": "error.type",
                "recovery": "Vérifiez votre clé API et l’accès à votre compte avant de soumettre la demande.",
                "type": "authentication_error"
              },
              {
                "condition": "La requête n’a pas pu être lue ou l’index de téléchargement n’est pas valide.",
                "http_status": 400,
                "public_identifier_field": "error.type",
                "recovery": "Corrigez le corps de la requête. Pour un téléchargement, choisissez un index de sortie renvoyé par la tâche d’origine.",
                "type": "invalid_request_error"
              },
              {
                "condition": "La configuration vidéo sélectionnée ne peut pas être tarifée.",
                "http_status": 422,
                "public_identifier_field": "error.type",
                "recovery": "Choisissez une configuration vidéo prise en charge et renseignez ses options obligatoires avant de soumettre une demande corrigée.",
                "type": "price_unavailable"
              },
              {
                "condition": "Une entrée vidéo ou une tâche de continuation d’origine n’est pas valide.",
                "http_status": 422,
                "public_identifier_field": "error.type",
                "recovery": "Utilisez des entrées HTTPS valides. Pour une continuation, utilisez l’identifiant vidéo public de votre original terminé avec la même clé API.",
                "type": "invalid_request_error"
              },
              {
                "condition": "Le solde disponible ou les limites ne permettent pas de réserver les fonds nécessaires.",
                "http_status": 402,
                "public_identifier_field": "error.type",
                "recovery": "Vérifiez votre solde disponible et vos limites avant d’envoyer une nouvelle demande.",
                "type": "billing_error"
              },
              {
                "condition": "La vérification vidéo, le stockage ou l’accès au service est temporairement indisponible.",
                "http_status": 503,
                "public_identifier_field": "error.type",
                "recovery": "Attendez que le service soit disponible. Si vous possédez déjà un identifiant vidéo, consultez cette tâche d’origine au lieu de créer une autre génération.",
                "type": "server_error"
              },
              {
                "code": "result_pending_check",
                "condition": "Le résultat vidéo d’origine et sa facturation nécessitent une vérification.",
                "http_status": 503,
                "public_identifier_field": "error.code",
                "recovery": "Conservez l’identifiant vidéo renvoyé et consultez cette tâche. N’envoyez pas de demande de génération de remplacement tant que sa vérification est en cours.",
                "type": "server_error"
              },
              {
                "code": "owned_result_unavailable",
                "condition": "Le téléchargement de la vidéo existante est temporairement indisponible.",
                "http_status": 503,
                "public_identifier_field": "error.code",
                "recovery": "Consultez cette même tâche vidéo ultérieurement et téléchargez sa sortie existante. Une nouvelle génération crée une opération distincte.",
                "type": "server_error"
              },
              {
                "condition": "Le contenu vidéo n’a pas été publié.",
                "http_status": 409,
                "public_identifier_field": "error.type",
                "recovery": "Vérifiez le statut de la tâche d’origine. Téléchargez après l’apparition de completed ; si elle indique failed, suivez son avis de vérification de la facturation.",
                "type": "video_not_ready"
              }
            ],
            "hints": [
              "No null values or duplicate keys at any JSON object level",
              "No duration/resolution/aspect default is inserted",
              "Prompt required for all21 despite broader official image-only schema",
              "A request must also pass model membership, exact price card, SKU selection and frozen quote construction",
              "Non-string known trace fields reject; other trace keys retain arbitrary JSON",
              "No n/output-count/client price fields accepted",
              "Provider passthrough disabled for all21; feed allowlist names do not supply provider slug/value contract"
            ],
            "ignored_fields": [],
            "lifecycle": {
              "cancel_endpoint": null,
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{public_id}/content",
                  "query": {
                    "index": "actual output index"
                  }
                }
              ],
              "create": {
                "http": "POST",
                "path": "/v1/videos"
              },
              "mode": "submit_once_poll_original",
              "public_id": "video_<uuid>; owner user/key/group scope",
              "status": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{public_id}"
                }
              ],
              "submit_status": 202,
              "terminal_failure_public": "200 failed + charge_pending_check=true; inspect original operation",
              "terminal_provider_states": [
                "failed",
                "cancelled",
                "expired"
              ],
              "unknown": "503 result_pending_check + originalid + X-Should-Retry:false ; ne rejouez jamais la demande d’origine"
            },
            "material_combinations": [
              {
                "mode": "text_to_video",
                "model": {
                  "enum": [
                    "kwaivgi/kling-video-o1"
                  ],
                  "enum_known": true,
                  "type": "string"
                },
                "prompt": {
                  "max_utf8_bytes": 10000,
                  "non_whitespace": true,
                  "type": "string"
                },
                "representation": "Fournissez prompt sous forme de texte et duration en secondes entières. Choisissez une résolution prise en charge ; ajoutez un rapport d’image ou utilisez une taille indiquée.",
                "required": [
                  "model",
                  "prompt",
                  "duration"
                ],
                "required_material": "Une consigne écrite."
              },
              {
                "exact_keys": [
                  "type",
                  "image_url",
                  "frame_type"
                ],
                "mode": "image_to_video",
                "model": {
                  "enum": [
                    "kwaivgi/kling-video-o1"
                  ],
                  "enum_known": true,
                  "type": "string"
                },
                "prompt": {
                  "max_utf8_bytes": 10000,
                  "non_whitespace": true,
                  "type": "string"
                },
                "representation": "frame_images est un tableau. Chaque objet d’image comporte type, image_url et frame_type ; image_url contient url. Définissez type sur image_url. Utilisez first_frame avec, facultativement, last_frame. Chaque rôle d’image apparaît au plus une fois. Fournissez une URL HTTPS publique pour chaque image. Choisissez une résolution prise en charge ; ajoutez un rapport d’image ou utilisez une taille indiquée.",
                "required": [
                  "model",
                  "prompt",
                  "duration",
                  "frame_images"
                ],
                "required_material": "Une consigne écrite et une image initiale."
              }
            ],
            "operation_modes": [
              "text_to_video",
              "image_to_video_frame_images"
            ],
            "outputs": {
              "content_range_supported": true,
              "every_actual_output": true,
              "family": "video",
              "fields": [
                {
                  "condition": "Always present for each completed output.",
                  "description": "Position de cette vidéo dans la liste des sorties, en commençant à zéro.",
                  "field_path": "outputs[].index",
                  "json_schema": {
                    "type": "integer"
                  },
                  "name": "index",
                  "nullable": false,
                  "type": "integer"
                },
                {
                  "condition": "Present after the owned result is available and a signed URL is created.",
                  "description": "URL HTTPS signée pour télécharger cette vidéo terminée.",
                  "field_path": "outputs[].content_url",
                  "json_schema": {
                    "type": "string"
                  },
                  "name": "content_url",
                  "nullable": false,
                  "type": "string"
                },
                {
                  "condition": "A nonempty recorded digest is returned; otherwise null.",
                  "description": "Empreinte SHA-256 des octets vidéo d’origine ; null si indisponible.",
                  "field_path": "outputs[].sha256",
                  "json_schema": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": "sha256",
                  "nullable": true,
                  "type": "string | null"
                },
                {
                  "condition": "Returned when the recorded file size is positive.",
                  "description": "Taille du fichier vidéo d’origine en octets ; null si indisponible.",
                  "field_path": "outputs[].size_bytes",
                  "json_schema": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "name": "size_bytes",
                  "nullable": true,
                  "type": "integer | null"
                },
                {
                  "condition": "Returned when the measured duration is positive.",
                  "description": "Durée vidéo mesurée en millisecondes ; null si indisponible.",
                  "field_path": "outputs[].duration_ms",
                  "json_schema": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "name": "duration_ms",
                  "nullable": true,
                  "type": "integer | null"
                },
                {
                  "condition": "Width, height and the video codec are returned together when recorded.",
                  "description": "Largeur de la vidéo en pixels ; null si indisponible.",
                  "field_path": "outputs[].width",
                  "json_schema": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "name": "width",
                  "nullable": true,
                  "type": "integer | null"
                },
                {
                  "condition": "Width, height and the video codec are returned together when recorded.",
                  "description": "Hauteur de la vidéo en pixels ; null si indisponible.",
                  "field_path": "outputs[].height",
                  "json_schema": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "name": "height",
                  "nullable": true,
                  "type": "integer | null"
                },
                {
                  "condition": "Returned together with positive recorded width and height.",
                  "description": "Identifiant du codec vidéo ; null s’il n’est pas enregistré.",
                  "field_path": "outputs[].video_codec",
                  "json_schema": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": "video_codec",
                  "nullable": true,
                  "type": "string | null"
                },
                {
                  "condition": "Returned when width, height and the video codec are recorded; false is a known result.",
                  "description": "Indique si la vidéo contient une piste audio ; null si cela n’a pas été mesuré.",
                  "field_path": "outputs[].has_audio",
                  "json_schema": {
                    "type": [
                      "boolean",
                      "null"
                    ]
                  },
                  "name": "has_audio",
                  "nullable": true,
                  "type": "boolean | null"
                },
                {
                  "condition": "Returned when video metadata is recorded and the audio codec identifier is nonempty.",
                  "description": "Identifiant du codec audio ; null lorsqu’aucun identifiant n’est enregistré.",
                  "field_path": "outputs[].audio_codec",
                  "json_schema": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": "audio_codec",
                  "nullable": true,
                  "type": "string | null"
                }
              ],
              "format": "original MP4 bytes; no normalization/transcode",
              "max_aggregate_seconds": 2400,
              "max_bytes_per_output": 67108864,
              "max_seconds_per_output": 600,
              "result": "URL signées de contenu vous appartenant",
              "unmeasured_fields_nullable": true
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "kwaivgi/kling-video-o1"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "schema": {
                  "const": "kwaivgi/kling-video-o1"
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "minLength": 1,
                "name": "prompt",
                "required": true,
                "schema": {
                  "minLength": 1,
                  "type": "string",
                  "x-source-max-utf8-bytes": 10000,
                  "x-source-non-whitespace": true
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  5,
                  10
                ],
                "enum_known": true,
                "maximum": 600,
                "minimum": 1,
                "name": "duration",
                "required": true,
                "schema": {
                  "enum": [
                    5,
                    10
                  ],
                  "maximum": 600,
                  "minimum": 1,
                  "type": "integer"
                },
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "720p"
                ],
                "enum_known": true,
                "name": "resolution",
                "required": false,
                "schema": {
                  "enum": [
                    "720p"
                  ]
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "16:9",
                  "9:16",
                  "1:1"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": false,
                "schema": {
                  "enum": [
                    "16:9",
                    "9:16",
                    "1:1"
                  ]
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  false,
                  true
                ],
                "enum_known": true,
                "name": "generate_audio",
                "required": false,
                "schema": {
                  "enum": [
                    false,
                    true
                  ],
                  "x-omitted-default": "published audio capability when true/false; unknown if null; output audio must be measured"
                },
                "type": "boolean"
              },
              {
                "availability": "source_interface",
                "conditions": "Ces clés décrivent chaque objet d’image ; image_url contient uniquement url. Omettez frame_images pour une requête contenant uniquement du texte.",
                "content": "Tableau d’objets d’image. Chaque objet comporte type=image_url, image_url contenant url et frame_type. Utilisez une URL HTTPS pour l’image et définissez frame_type sur first_frame ou last_frame. Chaque rôle d’image apparaît au plus une fois.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "exact_keys": [
                  "type",
                  "image_url",
                  "frame_type"
                ],
                "maxItems": 2,
                "max_items": 2,
                "minItems": 1,
                "min_items": 1,
                "name": "frame_images",
                "required": false,
                "schema": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "frame_type": {
                        "enum": [
                          "first_frame",
                          "last_frame"
                        ]
                      },
                      "image_url": {
                        "additionalProperties": false,
                        "properties": {
                          "url": {
                            "format": "uri",
                            "pattern": "^https://",
                            "type": "string",
                            "x-source-rule": "public HTTPS; no userinfo, fragment, whitespace, private/reserved hosts; own-media links additionally require owner/signature/status/hash/MIME/bytes"
                          }
                        },
                        "required": [
                          "url"
                        ],
                        "type": "object"
                      },
                      "type": {
                        "const": "image_url"
                      }
                    },
                    "required": [
                      "type",
                      "image_url",
                      "frame_type"
                    ],
                    "type": "object"
                  },
                  "maxItems": 2,
                  "minItems": 1,
                  "type": "array",
                  "x-source-unique-role": "frame_type"
                },
                "type": "array"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maxItems": 0,
                "name": "input_references",
                "required": false,
                "schema": {
                  "items": false,
                  "maxItems": 0,
                  "type": "array"
                },
                "type": "array"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "1280x720",
                  "720x1280",
                  "720x720"
                ],
                "enum_known": true,
                "name": "size",
                "pattern": "^[1-9][0-9]*x[1-9][0-9]*$",
                "required": false,
                "schema": {
                  "enum": [
                    "1280x720",
                    "720x1280",
                    "720x720"
                  ],
                  "pattern": "^[1-9][0-9]*x[1-9][0-9]*$",
                  "type": "string"
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "callback_url",
                "pattern": "^https://",
                "required": false,
                "schema": {
                  "format": "uri",
                  "pattern": "^https://",
                  "type": "string",
                  "x-source-rule": "public HTTPS; no userinfo, fragment, whitespace, private/reserved hosts; own-media links additionally require owner/signature/status/hash/MIME/bytes"
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maxLength": 256,
                "name": "session_id",
                "required": false,
                "schema": {
                  "maxLength": 256,
                  "type": "string"
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "trace",
                "required": false,
                "schema": {
                  "additionalProperties": true,
                  "properties": {
                    "generation_name": {
                      "type": "string"
                    },
                    "parent_span_id": {
                      "type": "string"
                    },
                    "span_name": {
                      "type": "string"
                    },
                    "trace_id": {
                      "type": "string"
                    },
                    "trace_name": {
                      "type": "string"
                    }
                  },
                  "type": "object"
                },
                "type": "object"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maxLength": 256,
                "name": "user",
                "required": false,
                "schema": {
                  "maxLength": 256,
                  "type": "string"
                },
                "type": "string"
              }
            ],
            "request_schema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "additionalProperties": false,
              "properties": {
                "aspect_ratio": {
                  "enum": [
                    "16:9",
                    "9:16",
                    "1:1"
                  ]
                },
                "callback_url": {
                  "format": "uri",
                  "pattern": "^https://",
                  "type": "string",
                  "x-source-rule": "public HTTPS; no userinfo, fragment, whitespace, private/reserved hosts; own-media links additionally require owner/signature/status/hash/MIME/bytes"
                },
                "creativity": false,
                "duration": {
                  "enum": [
                    5,
                    10
                  ],
                  "maximum": 600,
                  "minimum": 1,
                  "type": "integer"
                },
                "frame_images": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "frame_type": {
                        "enum": [
                          "first_frame",
                          "last_frame"
                        ]
                      },
                      "image_url": {
                        "additionalProperties": false,
                        "properties": {
                          "url": {
                            "format": "uri",
                            "pattern": "^https://",
                            "type": "string",
                            "x-source-rule": "public HTTPS; no userinfo, fragment, whitespace, private/reserved hosts; own-media links additionally require owner/signature/status/hash/MIME/bytes"
                          }
                        },
                        "required": [
                          "url"
                        ],
                        "type": "object"
                      },
                      "type": {
                        "const": "image_url"
                      }
                    },
                    "required": [
                      "type",
                      "image_url",
                      "frame_type"
                    ],
                    "type": "object"
                  },
                  "maxItems": 2,
                  "minItems": 1,
                  "type": "array",
                  "x-source-unique-role": "frame_type"
                },
                "generate_audio": {
                  "enum": [
                    false,
                    true
                  ],
                  "x-omitted-default": "published audio capability when true/false; unknown if null; output audio must be measured"
                },
                "input_references": {
                  "items": false,
                  "maxItems": 0,
                  "type": "array"
                },
                "model": {
                  "const": "kwaivgi/kling-video-o1"
                },
                "previous_job_id": false,
                "prompt": {
                  "minLength": 1,
                  "type": "string",
                  "x-source-max-utf8-bytes": 10000,
                  "x-source-non-whitespace": true
                },
                "provider": false,
                "resolution": {
                  "enum": [
                    "720p"
                  ]
                },
                "seed": false,
                "session_id": {
                  "maxLength": 256,
                  "type": "string"
                },
                "size": {
                  "enum": [
                    "1280x720",
                    "720x1280",
                    "720x720"
                  ],
                  "pattern": "^[1-9][0-9]*x[1-9][0-9]*$",
                  "type": "string"
                },
                "trace": {
                  "additionalProperties": true,
                  "properties": {
                    "generation_name": {
                      "type": "string"
                    },
                    "parent_span_id": {
                      "type": "string"
                    },
                    "span_name": {
                      "type": "string"
                    },
                    "trace_id": {
                      "type": "string"
                    },
                    "trace_name": {
                      "type": "string"
                    }
                  },
                  "type": "object"
                },
                "upscale_factor": false,
                "user": {
                  "maxLength": 256,
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt",
                "duration"
              ],
              "title": "Video generation request",
              "type": "object",
              "x-source-global-rules": [
                "No null values or duplicate keys at any JSON object level",
                "No duration/resolution/aspect default is inserted",
                "Prompt required for all21 despite broader official image-only schema",
                "A request must also pass model membership, exact price card, SKU selection and frozen quote construction",
                "Non-string known trace fields reject; other trace keys retain arbitrary JSON",
                "No n/output-count/client price fields accepted",
                "Provider passthrough disabled for all21; feed allowlist names do not supply provider slug/value contract"
              ],
              "x-source-material-combinations": [
                "Exact model/card, positive published duration, model resolution/aspect membership and valid frozen quote are all required; independent enum arrays are not proven provider Cartesian combinations.",
                "Use exact published size or compatible resolution/aspect. Omitted options stay omitted; no guessed geometry.",
                "first_frame/last_frame roles each occur at most once; frame_images wins mode precedence over input_references.",
                "provider options are unavailable for this model despite any published passthrough-name allowlist."
              ]
            },
            "unsupported": [
              "seed",
              "provider",
              "previous_job_id",
              "upscale_factor",
              "creativity"
            ]
          },
          "input": {
            "additional_properties": false,
            "content_type": "application/json",
            "material_types": [
              "text",
              "image"
            ],
            "optional_controls": [
              "resolution",
              "aspect_ratio",
              "generate_audio",
              "frame_images",
              "input_references",
              "size",
              "callback_url",
              "session_id",
              "trace",
              "user"
            ],
            "required": [
              "model",
              "prompt",
              "duration"
            ]
          },
          "lifecycle": {
            "cancel_endpoint": null,
            "content": [
              {
                "http": "GET",
                "path": "/v1/videos/{public_id}/content",
                "query": {
                  "index": "actual output index"
                }
              }
            ],
            "create": {
              "http": "POST",
              "path": "/v1/videos"
            },
            "mode": "submit_once_poll_original",
            "public_id": "video_<uuid>; owner user/key/group scope",
            "status": [
              {
                "http": "GET",
                "path": "/v1/videos/{public_id}"
              }
            ],
            "submit_status": 202,
            "terminal_failure_public": "200 failed + charge_pending_check=true; inspect original operation",
            "terminal_provider_states": [
              "failed",
              "cancelled",
              "expired"
            ],
            "unknown": "503 result_pending_check + originalid + X-Should-Retry:false; never replay original"
          },
          "method": {
            "http": "POST",
            "path": "/v1/videos"
          },
          "method_aliases": [],
          "operation_modes": [
            "text_to_video",
            "image_to_video_frame_images"
          ],
          "output": {
            "content_range_supported": true,
            "every_actual_output": true,
            "family": "video",
            "fields": [
              {
                "condition": "Always present for each completed output.",
                "description": "Zero-based position of this video in the outputs list.",
                "field_path": "outputs[].index",
                "json_schema": {
                  "type": "integer"
                },
                "name": "index",
                "nullable": false,
                "type": "integer"
              },
              {
                "condition": "Present after the owned result is available and a signed URL is created.",
                "description": "Signed HTTPS download URL for this completed video.",
                "field_path": "outputs[].content_url",
                "json_schema": {
                  "type": "string"
                },
                "name": "content_url",
                "nullable": false,
                "type": "string"
              },
              {
                "condition": "A nonempty recorded digest is returned; otherwise null.",
                "description": "SHA-256 digest of the original video bytes; null if unavailable.",
                "field_path": "outputs[].sha256",
                "json_schema": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "name": "sha256",
                "nullable": true,
                "type": "string | null"
              },
              {
                "condition": "Returned when the recorded file size is positive.",
                "description": "Size of the original video file in bytes; null if unavailable.",
                "field_path": "outputs[].size_bytes",
                "json_schema": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "name": "size_bytes",
                "nullable": true,
                "type": "integer | null"
              },
              {
                "condition": "Returned when the measured duration is positive.",
                "description": "Measured video duration in milliseconds; null if unavailable.",
                "field_path": "outputs[].duration_ms",
                "json_schema": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "name": "duration_ms",
                "nullable": true,
                "type": "integer | null"
              },
              {
                "condition": "Width, height and the video codec are returned together when recorded.",
                "description": "Video width in pixels; null if unavailable.",
                "field_path": "outputs[].width",
                "json_schema": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "name": "width",
                "nullable": true,
                "type": "integer | null"
              },
              {
                "condition": "Width, height and the video codec are returned together when recorded.",
                "description": "Video height in pixels; null if unavailable.",
                "field_path": "outputs[].height",
                "json_schema": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "name": "height",
                "nullable": true,
                "type": "integer | null"
              },
              {
                "condition": "Returned together with positive recorded width and height.",
                "description": "Video codec identifier; null if not recorded.",
                "field_path": "outputs[].video_codec",
                "json_schema": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "name": "video_codec",
                "nullable": true,
                "type": "string | null"
              },
              {
                "condition": "Returned when width, height and the video codec are recorded; false is a known result.",
                "description": "Whether the video contains an audio track; null if not measured.",
                "field_path": "outputs[].has_audio",
                "json_schema": {
                  "type": [
                    "boolean",
                    "null"
                  ]
                },
                "name": "has_audio",
                "nullable": true,
                "type": "boolean | null"
              },
              {
                "condition": "Returned when video metadata is recorded and the audio codec identifier is nonempty.",
                "description": "Audio codec identifier; null when no identifier is recorded.",
                "field_path": "outputs[].audio_codec",
                "json_schema": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "name": "audio_codec",
                "nullable": true,
                "type": "string | null"
              }
            ],
            "format": "original MP4 bytes; no normalization/transcode",
            "max_aggregate_seconds": 2400,
            "max_bytes_per_output": 67108864,
            "max_seconds_per_output": 600,
            "result": "signed owned content URLs",
            "unmeasured_fields_nullable": true
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "conditions": "No additional condition is declared in this pricing key.",
              "quoted_unit": "per video second"
            },
            "label": "Video price",
            "units": [
              {
                "amount": "0.224",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds",
                "label": "Video price",
                "native_amount_usd_per_unit": "0.224",
                "native_quantity": 1,
                "public_unit_label": "per video second",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "basis": "Cette estimation ne constitue ni des frais supplémentaires ni un tarif fixe pour la génération terminée.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Coût de génération estimé",
            "units": [
              {
                "amount": "1.12",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "1.12",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_REQUEST'\nfrom pathlib import Path\nPath('request.json').write_text('{\"aspect_ratio\":\"16:9\",\"duration\":5,\"model\":\"kwaivgi/kling-video-o1\",\"prompt\":\"A serene mountain landscape at sunset\",\"resolution\":\"720p\"}', encoding='utf-8')\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nr=json.loads(Path('result.json').read_text())\nprint(json.dumps(r,ensure_ascii=False,indent=2))\nprint('Keep the complete JSON and response headers; do not resubmit an unknown creation.')\nPY_RESULT\n",
            "label": "curl · create video",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_STATUS_URL'\nimport json\nfrom pathlib import Path\nfrom urllib.parse import quote\nr=json.loads(Path('result.json').read_text())\nif not isinstance(r.get('id'),str) or not r['id']:raise SystemExit('Keep the original response and headers for reconciliation; no returned ID')\nPath('status-url.txt').write_text('https://api.ailoot.ai/v1/videos/'+quote(r['id'],safe=''))\nPY_STATUS_URL\ncurl --fail-with-body --silent --show-error \"$(cat status-url.txt)\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -D status-headers.txt -o status.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nr=json.loads(Path('status.json').read_text())\nprint(json.dumps(r,ensure_ascii=False,indent=2))\nprint('Keep the complete JSON and response headers; do not resubmit an unknown creation.')\nPY_RESULT\n",
            "label": "GET original status",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_ASSETS'\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path('status.json').read_text())\nif r.get('status')!='completed':raise SystemExit('Keep the original ID and read its status; never recreate an unknown job')\nif not isinstance(r.get('data'),list) or not r['data']:raise SystemExit('Keep the complete original status; no completed outputs supplied')\nurls=[]\nfor i,u in enumerate(r.get('data',[])):\n    if not isinstance(u,str):raise SystemExit('Keep the original response; unexpected asset shape')\n    urls.append((str(i),u))\nfor label,path in urls:\n    u=urljoin('https://api.ailoot.ai',path);z=urlsplit(u)\n    if z.scheme!='https' or z.netloc!='api.ailoot.ai' or z.username or z.password:raise SystemExit('Use the actual returned Ailoot owned content URL')\n    target=Path('owned-'+label+'.bin')\n    subprocess.run(['curl','--fail-with-body','--silent','--show-error',u,'-H','Authorization: Bearer '+os.environ['AILOOT_API_KEY'],'-D',str(target)+'.headers','-o',str(target)],check=True)\nprint('All returned owned URLs saved; complete metadata, timing and usage remain in the JSON.')\nPY_ASSETS\n",
            "label": "Save every completed owned output",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "videos",
        "hints": [],
        "http": "POST",
        "in": null,
        "input": [
          "text",
          "image"
        ],
        "label": "Видео",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [],
        "out": null,
        "output": [
          "video"
        ],
        "path": "/v1/videos",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "original_invoice_usd",
          "image_input_price": null,
          "image_output_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "conditions": "No additional condition is declared in this pricing key.",
              "quoted_unit": "per video second"
            },
            "label": "Video price",
            "units": [
              {
                "amount": "0.224",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds",
                "label": "Video price",
                "native_amount_usd_per_unit": "0.224",
                "native_quantity": 1,
                "public_unit_label": "per video second",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "basis": "This estimate is not an additional charge or a fixed rate for the completed generation.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Estimated generation cost",
            "units": [
              {
                "amount": "1.12",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "1.12",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "request_model_id": "kwaivgi/kling-video-o1",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/videos/{public_id}",
          "GET /v1/videos/{public_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.224",
            "amount_unit": "usd_per_video_second",
            "billing_input": false,
            "estimate_only": true,
            "key": "duration_seconds",
            "label": "Video price",
            "native_amount_usd_per_unit": "0.224",
            "native_quantity": 1,
            "public_unit_label": "per video second",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "video_second"
          },
          {
            "amount": "1.12",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "1.12",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "kwaivgi/kling-video-o1",
        "request_model_id": "kwaivgi/kling-video-o1",
        "route_label": "Ultra"
      }
    ],
    "name": "Kling: Video O1",
    "price": {
      "estimate_only": true,
      "in": null,
      "in_label": null,
      "out": 1.12,
      "out_label": "estimate before generation",
      "scope_label": "Estimated generation cost",
      "sort_in": null,
      "sort_out": 1.12,
      "varies": false
    },
    "pricing_profiles": [
      {
        "applicability": {
          "client_selectable": false,
          "native_profile_selection_pending": true,
          "scope": "hosted_reference"
        },
        "dimensions": {
          "published_labels": [],
          "variant": "duration_seconds"
        },
        "label": "Ultra",
        "units": [
          {
            "amount": "0.2240",
            "amount_unit": "usd_per_second",
            "conditions": {
              "published_labels": [],
              "variant": "duration_seconds"
            },
            "key": "duration_seconds",
            "label": "duration seconds",
            "profile_index": 0,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "out",
            "unit": "second"
          }
        ]
      },
      {
        "applicability": {
          "client_selectable": false,
          "no_method_admission_claim": true,
          "scope": "supplier_tariff_reference"
        },
        "dimensions": {},
        "label": "Ailoot Ultra · Tariff components",
        "units": [
          {
            "amount": "0.224",
            "amount_unit": "usd_per_exact_physical_unit",
            "basis": "output second",
            "billing_original_currency": "USD",
            "billing_original_rate": "0.2240",
            "key": "duration_seconds",
            "label": "output second",
            "native_amount_usd_per_unit": "0.224",
            "native_quantity": 1,
            "quantity": 1,
            "side": "out",
            "unit": "output_second"
          }
        ]
      }
    ],
    "public_id": "kwaivgi/kling-video-o1",
    "short": "Kling VIDEO O1 est le modèle vidéo de Kuaishou guidé par des références pour générer et modifier des scènes à l’aide de texte, d’images, d’éléments de sujets et d’un clip source. Utilisez son profil de génération de trois à dix secondes pour la continuité visuelle, les transitions guidées entre images et les modifications ciblées de séquences existantes."
  },
  "renderer_schema": {
    "method_order": "Original DTO methods order; every exact route/format/path/caller survives.",
    "prices": "Original public DTO fields and original native display HTML; no flattened or normalized offers."
  },
  "representation": "exact-public-dto-and-native-renderer-html",
  "representationNotes": {
    "current_reference": {
      "about_json_pointer": "/aboutHtml",
      "methods": [
        {
          "contract_json_pointer": "/methods/0/rawMethod/contract",
          "html_json_pointer": "/methods/0/html",
          "method_ordinal": 0
        }
      ],
      "role": "current-semantic-reference"
    },
    "raw_input": {
      "examples_role": "historical-input-not-current-ready-examples",
      "json_pointers": [
        "/rawModel",
        "/methods/0/rawMethod"
      ],
      "role": "historical-owner-input"
    },
    "schema": "ailoot-native-model-representations-v1"
  },
  "schema": "ailoot-static-model-facts-v1",
  "schema_version": 1,
  "shortText": "Kling VIDEO O1 est le modèle vidéo de Kuaishou guidé par des références pour générer et modifier des scènes à l’aide de texte, d’images, d’éléments de sujets et d’un clip source. Utilisez son profil de génération de trois à dix secondes pour la continuité visuelle, les transitions guidées entre images et les modifications ciblées de séquences existantes.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "d558d90e8dfbf8bb50da99727d20a7f7ae2934e4d97e6b08021f56a9c074bf06",
    "renderer_sha256": "44d2db1deadc475e1793597083716540bae7bbc53606f05f58780fec5f115dd4"
  },
  "sourceRevision": "2f14b19d8b749739de8d0b67ff76ecaa4fd0c78c772d2e2ed11f401fccab0a3a"
}
