{
  "aboutHtml": "<p>FLUX 3 Image est le modèle de génération et de montage d’images de Black Forest Labs avec contrôle explicite de la composition. Une description textuelle peut créer une nouvelle scène; des images fournies peuvent établir un sujet, une scène à réviser ou plusieurs éléments à combiner. Les boîtes englobantes permettent à un brief de préciser l’emplacement de chaque élément et les parties d’une image existante à modifier. Le résultat est une image, avec la scène, le texte et la mise en page demandés à inspecter.</p><h4>Créer une scène ou donner une instruction de montage</h4><p>Pour une nouvelle image, décrivez le sujet, l’action ou la pose, le décor, la lumière et le cadrage. Placez le texte exact à afficher dans l’image entre guillemets et indiquez où il apparaît. Un brief de produit original pourrait montrer une tasse de camping rouge sur une surface en pierre claire, avec un grand titre au-dessus et une lumière matinale douce révélant l’anse. Définissez la relation entre le titre, le produit et l’arrière-plan au lieu de fournir des mots de style sans lien.</p><p>Pour le montage, identifiez l’objet précis et la modification : recolorer la tasse, remplacer une étiquette, déplacer une silhouette ou changer le style de la scène. Un montage unique ne nécessite pas de boîte dessinée manuellement. Le processus documenté enrichit l’instruction avant la génération et peut repérer l’élément nommé et ajouter une boîte automatiquement. Le prompt enrichi renvoyé consigne cette interprétation, ce qui est utile lorsqu’une instruction sélectionne le mauvais objet ou introduit un détail indésirable.</p><h4>Combiner et préparer les images de référence</h4><p>Le profil exact du producteur accepte d’une à dix références, fournies sous forme d’URL d’images ou de données d’image encodées. Chacune doit mesurer au moins 256×256 pixels et ne pas dépasser 16 mégapixels. Nommez une référence selon sa position ou son contenu visible, puis expliquez son rôle : la personne d’Image 1, la veste d’Image 2 et la pièce d’Image 3. Une image de référence est une source d’information visuelle, et non une instruction de copier chaque détail sans rapport qu’elle contient.</p><p>Le réglage du ratio est auto par défaut. Dans la spécification de requête, un ratio demandé dans le prompt a priorité; sinon, la première référence établit le cadrage, avec une sortie carrée de repli lorsqu’aucune référence ni aucun format demandé ne le définit. Pour une composition, placez la référence de scène voulue en premier ou choisissez le ratio explicitement. Conservez les images sources et leur ordre avec le résultat pour qu’une révision ultérieure utilise le même point de départ visuel.</p><h4>Placer les éléments avec des boîtes englobantes</h4><p>Un prompt de mise en page combine une légende avec un tableau JSON de lignes d’éléments. La légende nomme un élément au moyen d’un marqueur comme &lt;cup_1&gt;; la ligne contient id, bbox et desc. Les coordonnées sont des entiers de 0 à 1000 dans l’ordre [haut, gauche, bas, droite], mesurés depuis le coin supérieur gauche. Par exemple, [0, 0, 500, 500] décrit le quart supérieur gauche, peu importe les dimensions de l’image en pixels. Utilisez le ratio pour lequel la mise en page a été conçue, car cette grille de coordonnées s’étire avec le cadre.</p><p>Une ligne de montage utilise plutôt from, src_bbox et tgt_bbox avec l’identifiant et la description. ref_image_0 désigne la première image fournie. Des boîtes source et cible identiques ancrent un élément; des boîtes différentes le déplacent ou le redimensionnent. Une nouvelle ligne sans source génère sa description à l’emplacement cible, permettant les ajouts, remplacements ou recolorations. Une ligne source sans cible retire l’élément. Indiquez les ajouts et retraits dans l’instruction écrite et dans les lignes, et conservez les lignes d’ancrage des détails qui doivent rester en place.</p><p>Donnez au texte sa propre boîte et citez sa formulation exacte dans desc. Les boîtes guident le placement et l’échelle; ce ne sont pas des masques de découpage, donc un élément peut dépasser le rectangle. Le fabricant rapporte que de nouveaux objets dans des boîtes d’environ 40×25 pixels n’apparaissaient souvent pas dans ses exemples. Prévoyez assez d’espace visible et inspectez les limites modifiées. Les pixels à l’extérieur de la cible restent généralement stables, mais les ombres, les reflets et l’éclairage à proximité peuvent quand même changer.</p><h4>Ancrage, classes de sortie et dossiers utiles</h4><p>Le profil documenté active l’ancrage par défaut, permettant à la recherche Web et d’images d’informer la génération. Il peut être désactivé pour un brief qui doit utiliser seulement la description et les références fournies. Pour un sujet du monde réel, identifiez clairement le lieu, l’événement ou l’objet et gardez le contenu factuel distinct du traitement artistique. Une image informée par la recherche doit tout de même être comparée à des sources faisant autorité lorsqu’une étiquette, un objet ou un événement représenté doit être exact.</p><p>Les cinq classes de résolution sont 768sq, 1k, 1.5k, 2k et 4k, avec 1k par défaut. Elles représentent des paliers de surface égale en pixels : la largeur et la hauteur exactes dépendent donc du ratio choisi. Quinze ratios fixes vont de 21:9, en passant par les formats carré et portrait, à 9:21. Le profil de ce modèle contrôle la taille par le ratio et la résolution; il n’expose pas les champs seed, width ou height utilisés dans les profils de requête FLUX.2. Son sélecteur de version documenté nomme actuellement une version évolutive plutôt que d’établir une correspondance datée avec les poids du fournisseur.</p><p>Le processus du producteur renvoie une image après un traitement asynchrone, ainsi que le prompt enrichi. Son lien signé de téléchargement d’image est valide pendant une heure. Conservez l’image réelle, le prompt final et les références au lieu de compter sur un lien temporaire. Pour une ressource vérifiée, comparez le texte demandé, le placement des objets, l’identité des références et la zone modifiée à la taille d’affichage prévue. Une génération terminée est le point de départ de la vérification de ces exigences visuelles.</p>",
  "aboutText": "FLUX 3 Image est le modèle de génération et de montage d’images de Black Forest Labs avec contrôle explicite de la composition. Une description textuelle peut créer une nouvelle scène; des images fournies peuvent établir un sujet, une scène à réviser ou plusieurs éléments à combiner. Les boîtes englobantes permettent à un brief de préciser l’emplacement de chaque élément et les parties d’une image existante à modifier. Le résultat est une image, avec la scène, le texte et la mise en page demandés à inspecter.\n\n### Créer une scène ou donner une instruction de montage\n\nPour une nouvelle image, décrivez le sujet, l’action ou la pose, le décor, la lumière et le cadrage. Placez le texte exact à afficher dans l’image entre guillemets et indiquez où il apparaît. Un brief de produit original pourrait montrer une tasse de camping rouge sur une surface en pierre claire, avec un grand titre au-dessus et une lumière matinale douce révélant l’anse. Définissez la relation entre le titre, le produit et l’arrière-plan au lieu de fournir des mots de style sans lien.\n\nPour le montage, identifiez l’objet précis et la modification : recolorer la tasse, remplacer une étiquette, déplacer une silhouette ou changer le style de la scène. Un montage unique ne nécessite pas de boîte dessinée manuellement. Le processus documenté enrichit l’instruction avant la génération et peut repérer l’élément nommé et ajouter une boîte automatiquement. Le prompt enrichi renvoyé consigne cette interprétation, ce qui est utile lorsqu’une instruction sélectionne le mauvais objet ou introduit un détail indésirable.\n\n### Combiner et préparer les images de référence\n\nLe profil exact du producteur accepte d’une à dix références, fournies sous forme d’URL d’images ou de données d’image encodées. Chacune doit mesurer au moins 256×256 pixels et ne pas dépasser 16 mégapixels. Nommez une référence selon sa position ou son contenu visible, puis expliquez son rôle : la personne d’Image 1, la veste d’Image 2 et la pièce d’Image 3. Une image de référence est une source d’information visuelle, et non une instruction de copier chaque détail sans rapport qu’elle contient.\n\nLe réglage du ratio est auto par défaut. Dans la spécification de requête, un ratio demandé dans le prompt a priorité; sinon, la première référence établit le cadrage, avec une sortie carrée de repli lorsqu’aucune référence ni aucun format demandé ne le définit. Pour une composition, placez la référence de scène voulue en premier ou choisissez le ratio explicitement. Conservez les images sources et leur ordre avec le résultat pour qu’une révision ultérieure utilise le même point de départ visuel.\n\n### Placer les éléments avec des boîtes englobantes\n\nUn prompt de mise en page combine une légende avec un tableau JSON de lignes d’éléments. La légende nomme un élément au moyen d’un marqueur comme <cup_1>; la ligne contient id, bbox et desc. Les coordonnées sont des entiers de 0 à 1000 dans l’ordre [haut, gauche, bas, droite], mesurés depuis le coin supérieur gauche. Par exemple, [0, 0, 500, 500] décrit le quart supérieur gauche, peu importe les dimensions de l’image en pixels. Utilisez le ratio pour lequel la mise en page a été conçue, car cette grille de coordonnées s’étire avec le cadre.\n\nUne ligne de montage utilise plutôt from, src_bbox et tgt_bbox avec l’identifiant et la description. ref_image_0 désigne la première image fournie. Des boîtes source et cible identiques ancrent un élément; des boîtes différentes le déplacent ou le redimensionnent. Une nouvelle ligne sans source génère sa description à l’emplacement cible, permettant les ajouts, remplacements ou recolorations. Une ligne source sans cible retire l’élément. Indiquez les ajouts et retraits dans l’instruction écrite et dans les lignes, et conservez les lignes d’ancrage des détails qui doivent rester en place.\n\nDonnez au texte sa propre boîte et citez sa formulation exacte dans desc. Les boîtes guident le placement et l’échelle; ce ne sont pas des masques de découpage, donc un élément peut dépasser le rectangle. Le fabricant rapporte que de nouveaux objets dans des boîtes d’environ 40×25 pixels n’apparaissaient souvent pas dans ses exemples. Prévoyez assez d’espace visible et inspectez les limites modifiées. Les pixels à l’extérieur de la cible restent généralement stables, mais les ombres, les reflets et l’éclairage à proximité peuvent quand même changer.\n\n### Ancrage, classes de sortie et dossiers utiles\n\nLe profil documenté active l’ancrage par défaut, permettant à la recherche Web et d’images d’informer la génération. Il peut être désactivé pour un brief qui doit utiliser seulement la description et les références fournies. Pour un sujet du monde réel, identifiez clairement le lieu, l’événement ou l’objet et gardez le contenu factuel distinct du traitement artistique. Une image informée par la recherche doit tout de même être comparée à des sources faisant autorité lorsqu’une étiquette, un objet ou un événement représenté doit être exact.\n\nLes cinq classes de résolution sont 768sq, 1k, 1.5k, 2k et 4k, avec 1k par défaut. Elles représentent des paliers de surface égale en pixels : la largeur et la hauteur exactes dépendent donc du ratio choisi. Quinze ratios fixes vont de 21:9, en passant par les formats carré et portrait, à 9:21. Le profil de ce modèle contrôle la taille par le ratio et la résolution; il n’expose pas les champs seed, width ou height utilisés dans les profils de requête FLUX.2. Son sélecteur de version documenté nomme actuellement une version évolutive plutôt que d’établir une correspondance datée avec les poids du fournisseur.\n\nLe processus du producteur renvoie une image après un traitement asynchrone, ainsi que le prompt enrichi. Son lien signé de téléchargement d’image est valide pendant une heure. Conservez l’image réelle, le prompt final et les références au lieu de compter sur un lien temporaire. Pour une ressource vérifiée, comparez le texte demandé, le placement des objets, l’identité des références et la zone modifiée à la taille d’affichage prévue. Une génération terminée est le point de départ de la vérification de ces exigences visuelles.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "d12bd50e5ff79eeb7264d0e232e829c1e42dc3140180ea0217f4dd400d2768af",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "fr-ca",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">Black Forest Labs: FLUX.3 Image</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Fermer\">×</button></div><div class=\"idline\"><span>Black Forest Labs /</span><code>black-forest-labs/flux-3-image</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\">Pour commencer</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|images|/v1/images/generations|black-forest-labs%2Fflux-3-image\">Images</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\">Pour commencer</h3><p class=\"mdesc-full\">FLUX 3 Image crée et monte des images à partir d’un brief écrit et d’un maximum de dix références. Il ajoute des boîtes englobantes définies par prompt pour la composition et les changements locaux, l’ancrage dans les recherches Web et d’images, ainsi que cinq classes de résolution.</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>Images</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>FLUX 3 Image est le modèle de génération et de montage d’images de Black Forest Labs avec contrôle explicite de la composition. Une description textuelle peut créer une nouvelle scène; des images fournies peuvent établir un sujet, une scène à réviser ou plusieurs éléments à combiner. Les boîtes englobantes permettent à un brief de préciser l’emplacement de chaque élément et les parties d’une image existante à modifier. Le résultat est une image, avec la scène, le texte et la mise en page demandés à inspecter.</p><h4>Créer une scène ou donner une instruction de montage</h4><p>Pour une nouvelle image, décrivez le sujet, l’action ou la pose, le décor, la lumière et le cadrage. Placez le texte exact à afficher dans l’image entre guillemets et indiquez où il apparaît. Un brief de produit original pourrait montrer une tasse de camping rouge sur une surface en pierre claire, avec un grand titre au-dessus et une lumière matinale douce révélant l’anse. Définissez la relation entre le titre, le produit et l’arrière-plan au lieu de fournir des mots de style sans lien.</p><p>Pour le montage, identifiez l’objet précis et la modification : recolorer la tasse, remplacer une étiquette, déplacer une silhouette ou changer le style de la scène. Un montage unique ne nécessite pas de boîte dessinée manuellement. Le processus documenté enrichit l’instruction avant la génération et peut repérer l’élément nommé et ajouter une boîte automatiquement. Le prompt enrichi renvoyé consigne cette interprétation, ce qui est utile lorsqu’une instruction sélectionne le mauvais objet ou introduit un détail indésirable.</p><h4>Combiner et préparer les images de référence</h4><p>Le profil exact du producteur accepte d’une à dix références, fournies sous forme d’URL d’images ou de données d’image encodées. Chacune doit mesurer au moins 256×256 pixels et ne pas dépasser 16 mégapixels. Nommez une référence selon sa position ou son contenu visible, puis expliquez son rôle : la personne d’Image 1, la veste d’Image 2 et la pièce d’Image 3. Une image de référence est une source d’information visuelle, et non une instruction de copier chaque détail sans rapport qu’elle contient.</p><p>Le réglage du ratio est auto par défaut. Dans la spécification de requête, un ratio demandé dans le prompt a priorité; sinon, la première référence établit le cadrage, avec une sortie carrée de repli lorsqu’aucune référence ni aucun format demandé ne le définit. Pour une composition, placez la référence de scène voulue en premier ou choisissez le ratio explicitement. Conservez les images sources et leur ordre avec le résultat pour qu’une révision ultérieure utilise le même point de départ visuel.</p><h4>Placer les éléments avec des boîtes englobantes</h4><p>Un prompt de mise en page combine une légende avec un tableau JSON de lignes d’éléments. La légende nomme un élément au moyen d’un marqueur comme &lt;cup_1&gt;; la ligne contient id, bbox et desc. Les coordonnées sont des entiers de 0 à 1000 dans l’ordre [haut, gauche, bas, droite], mesurés depuis le coin supérieur gauche. Par exemple, [0, 0, 500, 500] décrit le quart supérieur gauche, peu importe les dimensions de l’image en pixels. Utilisez le ratio pour lequel la mise en page a été conçue, car cette grille de coordonnées s’étire avec le cadre.</p><p>Une ligne de montage utilise plutôt from, src_bbox et tgt_bbox avec l’identifiant et la description. ref_image_0 désigne la première image fournie. Des boîtes source et cible identiques ancrent un élément; des boîtes différentes le déplacent ou le redimensionnent. Une nouvelle ligne sans source génère sa description à l’emplacement cible, permettant les ajouts, remplacements ou recolorations. Une ligne source sans cible retire l’élément. Indiquez les ajouts et retraits dans l’instruction écrite et dans les lignes, et conservez les lignes d’ancrage des détails qui doivent rester en place.</p><p>Donnez au texte sa propre boîte et citez sa formulation exacte dans desc. Les boîtes guident le placement et l’échelle; ce ne sont pas des masques de découpage, donc un élément peut dépasser le rectangle. Le fabricant rapporte que de nouveaux objets dans des boîtes d’environ 40×25 pixels n’apparaissaient souvent pas dans ses exemples. Prévoyez assez d’espace visible et inspectez les limites modifiées. Les pixels à l’extérieur de la cible restent généralement stables, mais les ombres, les reflets et l’éclairage à proximité peuvent quand même changer.</p><h4>Ancrage, classes de sortie et dossiers utiles</h4><p>Le profil documenté active l’ancrage par défaut, permettant à la recherche Web et d’images d’informer la génération. Il peut être désactivé pour un brief qui doit utiliser seulement la description et les références fournies. Pour un sujet du monde réel, identifiez clairement le lieu, l’événement ou l’objet et gardez le contenu factuel distinct du traitement artistique. Une image informée par la recherche doit tout de même être comparée à des sources faisant autorité lorsqu’une étiquette, un objet ou un événement représenté doit être exact.</p><p>Les cinq classes de résolution sont 768sq, 1k, 1.5k, 2k et 4k, avec 1k par défaut. Elles représentent des paliers de surface égale en pixels : la largeur et la hauteur exactes dépendent donc du ratio choisi. Quinze ratios fixes vont de 21:9, en passant par les formats carré et portrait, à 9:21. Le profil de ce modèle contrôle la taille par le ratio et la résolution; il n’expose pas les champs seed, width ou height utilisés dans les profils de requête FLUX.2. Son sélecteur de version documenté nomme actuellement une version évolutive plutôt que d’établir une correspondance datée avec les poids du fournisseur.</p><p>Le processus du producteur renvoie une image après un traitement asynchrone, ainsi que le prompt enrichi. Son lien signé de téléchargement d’image est valide pendant une heure. Conservez l’image réelle, le prompt final et les références au lieu de compter sur un lien temporaire. Pour une ressource vérifiée, comparez le texte demandé, le placement des objets, l’identité des références et la zone modifiée à la taille d’affichage prévue. Une génération terminée est le point de départ de la vérification de ces exigences visuelles.</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 · Génération d’images</b> <code>POST /v1/images/generations</code></summary><dl class=\"method-capabilities\"><div><dt>Entrée</dt><dd><code>text</code>, <code>image</code></dd></div><div><dt>Sortie</dt><dd><code>image</code></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><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>black-forest-labs/flux-3-image</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr><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><div>Longueur minimale: 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><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>768, 1K, 1.5K, 2K, 4K</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr><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>21:9, 2:1, 16:9, 3:2, 7:5, 4:3, 5:4, 1:1, 4:5, 3:4, 5:7, 2:3, 9:16, 1:2, 9:21, auto</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">n</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>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>Minimum: 1</div><div>Maximum: 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><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><div>Nombre minimal d’éléments: 0</div><div>Nombre maximal d’éléments: 10</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">provider</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></tbody></table></div><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</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></tbody></table></div><p>Cycle de vie : <code>synchronous_result_then_owned_library</code></p><p class=\"note-s\"><code>GET /v1/media/tasks/{task_id}</code> · task_id effectivement renvoyé ou enregistrement de la bibliothèque multimédia</p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}/content</code></p><p class=\"note-s\"><code>GET /v1/media/assets</code></p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}</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>Coût</th></tr></thead><tbody><tr><th data-cell-label=\"Configuration\" scope=\"row\"><span class=\"card-cell-label\">Configuration</span>Tarifs de base des jetons</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=\"Coût\"><span class=\"card-cell-label\">Coût</span><div><span>Entrée · Jetons en entrée · Estimation à des fins de comparaison uniquement</span> <b>—</b> <span class=\"price-unit\">/ 1K jetons</span></div><div><span>Sortie · Jetons en sortie · Estimation à des fins de comparaison uniquement</span> <b>—</b> <span class=\"price-unit\">/ 1K jetons</span></div><div><span>Entrée · Lecture du cache · Estimation à des fins de comparaison uniquement</span> <b>—</b> <span class=\"price-unit\">/ 1K jetons</span></div><div><span>Entrée · Écriture dans le cache · Estimation à des fins de comparaison uniquement</span> <b>—</b> <span class=\"price-unit\">/ 1K jetons</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 jetons</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=\"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>$0.082</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-ca/billing/reserve/\">Fonctionnement de la réservation et du débit →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Exemples de requêtes</h3><h4>Ailoot Ultra · Génération d’images</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-1090-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1090-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl</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-1090-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1090-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_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np={&#39;model&#39;: &#39;black-forest-labs/flux-3-image&#39;, &#39;prompt&#39;: &#39;a red panda astronaut floating in space, studio lighting&#39;}\n\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\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 base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(&quot;No completed images; retain the full response&quot;)\n    for index, item in enumerate(items):\n        encoded=item.get(&quot;b64_json&quot;)\n        uri=item.get(&quot;url&quot;, &quot;&quot;)\n        if not encoded and uri.startswith(&quot;data:image/&quot;):\n            header, separator, encoded=uri.partition(&quot;,&quot;)\n            if not separator or &quot;;base64&quot; not in header: raise SystemExit(&quot;Unsupported image data URI&quot;)\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(&quot;https://api.ailoot.ai&quot;,uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=&quot;https&quot; or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(&quot;Invalid returned image URL&quot;)\n            owned=parsed.netloc==&quot;api.ailoot.ai&quot; and parsed.path.startswith(&quot;/v1/media/assets/&quot;) and parsed.path.endswith(&quot;/content&quot;)\n            args=[&quot;curl&quot;,&quot;--fail-with-body&quot;,&quot;--silent&quot;,&quot;--show-error&quot;,uri]\n            if owned: args += [&quot;-H&quot;,&quot;Authorization: Bearer &quot;+os.environ[&quot;AILOOT_API_KEY&quot;]]\n            temporary=Path(f&quot;image-{index}.bin&quot;)\n            subprocess.run(args+[&quot;-o&quot;,str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(&quot;Image has neither bytes nor URL&quot;)\n        if not raw: raise SystemExit(&quot;Empty image result&quot;)\n        ext=&quot;png&quot; if raw.startswith(b&quot;\\x89PNG&quot;) else &quot;jpg&quot; if raw.startswith(b&quot;\\xff\\xd8&quot;) else &quot;webp&quot; if raw[:4]==b&quot;RIFF&quot; and raw[8:12]==b&quot;WEBP&quot; else &quot;svg&quot; if raw.lstrip().startswith((b&quot;&lt;svg&quot;,b&quot;&lt;?xml&quot;)) else &quot;bin&quot;\n        Path(f&quot;image-{index}.{ext}&quot;).write_bytes(raw)\n    print(&quot;Every returned image saved; complete response metadata retained&quot;)\nsave_images(json.loads(Path(&quot;result.json&quot;).read_text())[&quot;data&quot;])\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 · Génération d’images</h4><p class=\"note-s\">Téléchargez chaque image renvoyée ou enregistrez son contenu Base64</p><ul class=\"card-result-paths\"><li><code>GET /v1/media/tasks/{task_id}</code></li><li><code>GET /v1/media/assets/{asset_id}/content</code></li><li><code>GET /v1/media/assets</code></li><li><code>GET /v1/media/assets/{asset_id}</code></li></ul><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-1091-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1091-panel-0\" aria-selected=\"true\" tabindex=\"0\">Lire les ressources existantes 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-1091-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1091-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -o owned-assets.json\n# Preserve every returned asset and follow its exact signed content URL. Do not construct a signed token.\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 image terminée ; récupérez chaque URL renvoyée ou décodez son contenu Base64.</p><p class=\"note-s\">Conservez la réponse complète et les en-têtes, chaque sortie effective, les identifiants initialement renvoyés et tous les champs d’utilisation. Récupérez l’opération d’origine sans soumettre à nouveau sa création.</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\">Conservez le X-Client-Request-ID renvoyé pour le rapprochement. Consultez uniquement les valeurs task_id/asset_id effectivement renvoyées ou votre bibliothèque multimédia ; ne construisez jamais une URL de tâche à partir de l’identifiant de l’opération et ne soumettez jamais à nouveau la création.</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></tr></thead><tbody><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">created</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span></td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">data[].url</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span></td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">data[].b64_json</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span></td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">usage</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span></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=black-forest-labs%2Fflux-3-image&amp;route=Ultra&amp;caller=black-forest-labs%2Fflux-3-image&amp;fmt=images\"><code>black-forest-labs/flux-3-image</code></a></span></p><h4>Alias des chemins de méthode</h4><p class=\"note-s\"><code>/v1/images</code></p><h4>ID d’appel associés</h4><p class=\"note-s\"><a href=\"#m=black-forest-labs%2Fflux-3-image&amp;route=Ultra&amp;caller=black-forest-labs%2Fflux-3-image&amp;fmt=images\"><code>black-forest-labs/flux-3-image</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "black-forest-labs/flux-3-image",
        "fmt": "images",
        "http": "POST",
        "path": "/v1/images/generations",
        "request_model_id": "black-forest-labs/flux-3-image",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|images|/v1/images/generations|black-forest-labs%2Fflux-3-image",
      "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": "Retain the complete response and headers, every actual output, original returned identifiers and all usage fields. Recover the original operation without submitting creation again.",
            "lifecycle": {
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "Conservez le X-Client-Request-ID renvoyé pour le rapprochement. Consultez uniquement les valeurs task_id/asset_id effectivement renvoyées ou votre bibliothèque multimédia ; ne construisez jamais une URL de tâche à partir de l’identifiant de l’opération et ne soumettez jamais à nouveau la création."
            },
            "outputs": {
              "all_results": "Conservez la réponse complète et les en-têtes, chaque sortie effective, les identifiants initialement renvoyés et tous les champs d’utilisation. Récupérez l’opération d’origine sans soumettre à nouveau sa création.",
              "family": "image",
              "fields": [
                {
                  "description": null,
                  "name": "created",
                  "type": null
                },
                {
                  "description": null,
                  "name": "data[].url",
                  "type": null
                },
                {
                  "description": null,
                  "name": "data[].b64_json",
                  "type": null
                },
                {
                  "description": null,
                  "name": "usage",
                  "type": null
                }
              ]
            },
            "parameters": [
              {
                "enum": [
                  "black-forest-labs/flux-3-image"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "min_length": 1,
                "name": "prompt",
                "required": true,
                "type": "string"
              },
              {
                "enum": [
                  "768",
                  "1K",
                  "1.5K",
                  "2K",
                  "4K"
                ],
                "enum_known": true,
                "name": "resolution",
                "required": false,
                "type": "string"
              },
              {
                "enum": [
                  "21:9",
                  "2:1",
                  "16:9",
                  "3:2",
                  "7:5",
                  "4:3",
                  "5:4",
                  "1:1",
                  "4:5",
                  "3:4",
                  "5:7",
                  "2:3",
                  "9:16",
                  "1:2",
                  "9:21",
                  "auto"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": false,
                "type": "string"
              },
              {
                "maximum": 1,
                "minimum": 1,
                "name": "n",
                "required": false,
                "type": "integer"
              },
              {
                "items": {
                  "properties": {
                    "image_url": {
                      "properties": {
                        "url": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "url"
                      ],
                      "type": "object"
                    },
                    "type": {
                      "const": "image_url"
                    }
                  },
                  "required": [
                    "type",
                    "image_url"
                  ],
                  "type": "object"
                },
                "maximum_items": 10,
                "minimum_items": 0,
                "name": "input_references",
                "required": false,
                "type": "array"
              },
              {
                "name": "provider",
                "required": false,
                "type": "object"
              }
            ],
            "request_schema": {
              "properties": {
                "aspect_ratio": {
                  "enum": [
                    "21:9",
                    "2:1",
                    "16:9",
                    "3:2",
                    "7:5",
                    "4:3",
                    "5:4",
                    "1:1",
                    "4:5",
                    "3:4",
                    "5:7",
                    "2:3",
                    "9:16",
                    "1:2",
                    "9:21",
                    "auto"
                  ],
                  "type": "string"
                },
                "input_references": {
                  "items": {
                    "properties": {
                      "image_url": {
                        "properties": {
                          "url": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "url"
                        ],
                        "type": "object"
                      },
                      "type": {
                        "const": "image_url"
                      }
                    },
                    "required": [
                      "type",
                      "image_url"
                    ],
                    "type": "object"
                  },
                  "maxItems": 10,
                  "minItems": 0,
                  "type": "array"
                },
                "model": {
                  "enum": [
                    "black-forest-labs/flux-3-image"
                  ],
                  "type": "string"
                },
                "n": {
                  "maximum": 1,
                  "minimum": 1,
                  "type": "integer"
                },
                "prompt": {
                  "minLength": 1,
                  "type": "string"
                },
                "provider": {
                  "description": "Exact image provider preferences from the documented image request schema.",
                  "type": "object"
                },
                "resolution": {
                  "enum": [
                    "768",
                    "1K",
                    "1.5K",
                    "2K",
                    "4K"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt"
              ],
              "type": "object"
            },
            "schema_template": {
              "actual_file_preparation_required": false,
              "body": {
                "model": "black-forest-labs/flux-3-image",
                "prompt": "a red panda astronaut floating in space, studio lighting"
              },
              "content_type": "application/json"
            }
          },
          "input": {
            "content_type": "application/json",
            "material_types": [
              "text",
              "image"
            ],
            "required": [
              "model",
              "prompt"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "task_id effectivement renvoyé ou enregistrement de la bibliothèque multimédia",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "Keep the returned X-Client-Request-ID for reconciliation. Read only actual returned task_id/asset_id values or the owned media library; never build a task URL from the operation ID and never resubmit creation."
          },
          "method": {
            "http": "POST",
            "path": "/v1/images/generations"
          },
          "output": {
            "all_results": "Retain the complete response and headers, every actual output, original returned identifiers and all usage fields. Recover the original operation without submitting creation again.",
            "family": "image",
            "fields": [
              {
                "description": null,
                "name": "created",
                "type": null
              },
              {
                "description": null,
                "name": "data[].url",
                "type": null
              },
              {
                "description": null,
                "name": "data[].b64_json",
                "type": null
              },
              {
                "description": null,
                "name": "usage",
                "type": null
              }
            ]
          }
        },
        "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"
              }
            ]
          },
          {
            "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": "0.082",
                "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": "0.082",
                "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}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np={'model': 'black-forest-labs/flux-3-image', 'prompt': 'a red panda astronaut floating in space, studio lighting'}\n\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\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 base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        ext=\"png\" if raw.startswith(b\"\\x89PNG\") else \"jpg\" if raw.startswith(b\"\\xff\\xd8\") else \"webp\" if raw[:4]==b\"RIFF\" and raw[8:12]==b\"WEBP\" else \"svg\" if raw.lstrip().startswith((b\"<svg\",b\"<?xml\")) else \"bin\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\nsave_images(json.loads(Path(\"result.json\").read_text())[\"data\"])\nPY_RESULT\n",
            "label": "curl · exact creation/save all outputs",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o owned-assets.json\n# Preserve every returned asset and follow its exact signed content URL. Do not construct a signed token.\n",
            "label": "Read existing owned assets",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "images",
        "hints": [
          "Use the exact caller model ID and documented input representation.",
          "Retain the complete response and headers, every actual output, original returned identifiers and all usage fields. Recover the original operation without submitting creation again."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text",
          "image"
        ],
        "label": "Génération d’images",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [
          "/v1/images"
        ],
        "native_endpoint": "images",
        "out": null,
        "output": [
          "image"
        ],
        "path": "/v1/images/generations",
        "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"
              }
            ]
          },
          {
            "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": "0.082",
                "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": "0.082",
                "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": "black-forest-labs/flux-3-image",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/media/tasks/{task_id}"
        ],
        "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.082",
            "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": "0.082",
            "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": "black-forest-labs/flux-3-image",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "bb72891577999d681823bd3696fbc362433b6ee35d24028e31452498e27d8a74",
    "input_html_sha256": "fcb972904f0d83ec78124aeff108362b4848c7caedb008d67dcb66905f1c645c",
    "private_audit_sha256": "ce2f14da4a96a09689ddef61a0719ae5100ae11239a0d9b52f234e7b0dfbd70b",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/fr-ca/black-forest-labs-flux-3-image/",
    "description": "FLUX 3 Image crée et monte des images à partir d’un brief écrit et d’un maximum de dix références. Il ajoute des boîtes englobantes définies par prompt pour la composition et les changements locaux, l’ancrage dans les recherches Web et d’images, ainsi que cinq classes de résolution.",
    "locale": "fr-ca",
    "md_url": "https://ailoot.ai/models/fr-ca/black-forest-labs-flux-3-image/index.md",
    "title": "Black Forest Labs: FLUX.3 Image — Ailoot",
    "url": "https://ailoot.ai/models/fr-ca/black-forest-labs-flux-3-image/"
  },
  "rawModel": {
    "about": "FLUX 3 Image est le modèle de génération et de montage d’images de Black Forest Labs avec contrôle explicite de la composition. Une description textuelle peut créer une nouvelle scène; des images fournies peuvent établir un sujet, une scène à réviser ou plusieurs éléments à combiner. Les boîtes englobantes permettent à un brief de préciser l’emplacement de chaque élément et les parties d’une image existante à modifier. Le résultat est une image, avec la scène, le texte et la mise en page demandés à inspecter.\n\n### Créer une scène ou donner une instruction de montage\n\nPour une nouvelle image, décrivez le sujet, l’action ou la pose, le décor, la lumière et le cadrage. Placez le texte exact à afficher dans l’image entre guillemets et indiquez où il apparaît. Un brief de produit original pourrait montrer une tasse de camping rouge sur une surface en pierre claire, avec un grand titre au-dessus et une lumière matinale douce révélant l’anse. Définissez la relation entre le titre, le produit et l’arrière-plan au lieu de fournir des mots de style sans lien.\n\nPour le montage, identifiez l’objet précis et la modification : recolorer la tasse, remplacer une étiquette, déplacer une silhouette ou changer le style de la scène. Un montage unique ne nécessite pas de boîte dessinée manuellement. Le processus documenté enrichit l’instruction avant la génération et peut repérer l’élément nommé et ajouter une boîte automatiquement. Le prompt enrichi renvoyé consigne cette interprétation, ce qui est utile lorsqu’une instruction sélectionne le mauvais objet ou introduit un détail indésirable.\n\n### Combiner et préparer les images de référence\n\nLe profil exact du producteur accepte d’une à dix références, fournies sous forme d’URL d’images ou de données d’image encodées. Chacune doit mesurer au moins 256×256 pixels et ne pas dépasser 16 mégapixels. Nommez une référence selon sa position ou son contenu visible, puis expliquez son rôle : la personne d’Image 1, la veste d’Image 2 et la pièce d’Image 3. Une image de référence est une source d’information visuelle, et non une instruction de copier chaque détail sans rapport qu’elle contient.\n\nLe réglage du ratio est auto par défaut. Dans la spécification de requête, un ratio demandé dans le prompt a priorité; sinon, la première référence établit le cadrage, avec une sortie carrée de repli lorsqu’aucune référence ni aucun format demandé ne le définit. Pour une composition, placez la référence de scène voulue en premier ou choisissez le ratio explicitement. Conservez les images sources et leur ordre avec le résultat pour qu’une révision ultérieure utilise le même point de départ visuel.\n\n### Placer les éléments avec des boîtes englobantes\n\nUn prompt de mise en page combine une légende avec un tableau JSON de lignes d’éléments. La légende nomme un élément au moyen d’un marqueur comme <cup_1>; la ligne contient id, bbox et desc. Les coordonnées sont des entiers de 0 à 1000 dans l’ordre [haut, gauche, bas, droite], mesurés depuis le coin supérieur gauche. Par exemple, [0, 0, 500, 500] décrit le quart supérieur gauche, peu importe les dimensions de l’image en pixels. Utilisez le ratio pour lequel la mise en page a été conçue, car cette grille de coordonnées s’étire avec le cadre.\n\nUne ligne de montage utilise plutôt from, src_bbox et tgt_bbox avec l’identifiant et la description. ref_image_0 désigne la première image fournie. Des boîtes source et cible identiques ancrent un élément; des boîtes différentes le déplacent ou le redimensionnent. Une nouvelle ligne sans source génère sa description à l’emplacement cible, permettant les ajouts, remplacements ou recolorations. Une ligne source sans cible retire l’élément. Indiquez les ajouts et retraits dans l’instruction écrite et dans les lignes, et conservez les lignes d’ancrage des détails qui doivent rester en place.\n\nDonnez au texte sa propre boîte et citez sa formulation exacte dans desc. Les boîtes guident le placement et l’échelle; ce ne sont pas des masques de découpage, donc un élément peut dépasser le rectangle. Le fabricant rapporte que de nouveaux objets dans des boîtes d’environ 40×25 pixels n’apparaissaient souvent pas dans ses exemples. Prévoyez assez d’espace visible et inspectez les limites modifiées. Les pixels à l’extérieur de la cible restent généralement stables, mais les ombres, les reflets et l’éclairage à proximité peuvent quand même changer.\n\n### Ancrage, classes de sortie et dossiers utiles\n\nLe profil documenté active l’ancrage par défaut, permettant à la recherche Web et d’images d’informer la génération. Il peut être désactivé pour un brief qui doit utiliser seulement la description et les références fournies. Pour un sujet du monde réel, identifiez clairement le lieu, l’événement ou l’objet et gardez le contenu factuel distinct du traitement artistique. Une image informée par la recherche doit tout de même être comparée à des sources faisant autorité lorsqu’une étiquette, un objet ou un événement représenté doit être exact.\n\nLes cinq classes de résolution sont 768sq, 1k, 1.5k, 2k et 4k, avec 1k par défaut. Elles représentent des paliers de surface égale en pixels : la largeur et la hauteur exactes dépendent donc du ratio choisi. Quinze ratios fixes vont de 21:9, en passant par les formats carré et portrait, à 9:21. Le profil de ce modèle contrôle la taille par le ratio et la résolution; il n’expose pas les champs seed, width ou height utilisés dans les profils de requête FLUX.2. Son sélecteur de version documenté nomme actuellement une version évolutive plutôt que d’établir une correspondance datée avec les poids du fournisseur.\n\nLe processus du producteur renvoie une image après un traitement asynchrone, ainsi que le prompt enrichi. Son lien signé de téléchargement d’image est valide pendant une heure. Conservez l’image réelle, le prompt final et les références au lieu de compter sur un lien temporaire. Pour une ressource vérifiée, comparez le texte demandé, le placement des objets, l’identité des références et la zone modifiée à la taille d’affichage prévue. Une génération terminée est le point de départ de la vérification de ces exigences visuelles.",
    "alias_of": null,
    "aliases": [],
    "author": "Black Forest Labs",
    "capabilities": {
      "context_length": 46864,
      "manufacturer_input": [
        "text",
        "image"
      ],
      "manufacturer_output": [
        "image"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "0.082",
            "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": "0.082",
            "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,
    "formats": [
      "images"
    ],
    "id": "black-forest-labs/flux-3-image",
    "input": [
      "text",
      "image"
    ],
    "kind": "image",
    "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": "Retain the complete response and headers, every actual output, original returned identifiers and all usage fields. Recover the original operation without submitting creation again.",
            "lifecycle": {
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "Conservez le X-Client-Request-ID renvoyé pour le rapprochement. Consultez uniquement les valeurs task_id/asset_id effectivement renvoyées ou votre bibliothèque multimédia ; ne construisez jamais une URL de tâche à partir de l’identifiant de l’opération et ne soumettez jamais à nouveau la création."
            },
            "outputs": {
              "all_results": "Conservez la réponse complète et les en-têtes, chaque sortie effective, les identifiants initialement renvoyés et tous les champs d’utilisation. Récupérez l’opération d’origine sans soumettre à nouveau sa création.",
              "family": "image",
              "fields": [
                {
                  "description": null,
                  "name": "created",
                  "type": null
                },
                {
                  "description": null,
                  "name": "data[].url",
                  "type": null
                },
                {
                  "description": null,
                  "name": "data[].b64_json",
                  "type": null
                },
                {
                  "description": null,
                  "name": "usage",
                  "type": null
                }
              ]
            },
            "parameters": [
              {
                "enum": [
                  "black-forest-labs/flux-3-image"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "min_length": 1,
                "name": "prompt",
                "required": true,
                "type": "string"
              },
              {
                "enum": [
                  "768",
                  "1K",
                  "1.5K",
                  "2K",
                  "4K"
                ],
                "enum_known": true,
                "name": "resolution",
                "required": false,
                "type": "string"
              },
              {
                "enum": [
                  "21:9",
                  "2:1",
                  "16:9",
                  "3:2",
                  "7:5",
                  "4:3",
                  "5:4",
                  "1:1",
                  "4:5",
                  "3:4",
                  "5:7",
                  "2:3",
                  "9:16",
                  "1:2",
                  "9:21",
                  "auto"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": false,
                "type": "string"
              },
              {
                "maximum": 1,
                "minimum": 1,
                "name": "n",
                "required": false,
                "type": "integer"
              },
              {
                "items": {
                  "properties": {
                    "image_url": {
                      "properties": {
                        "url": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "url"
                      ],
                      "type": "object"
                    },
                    "type": {
                      "const": "image_url"
                    }
                  },
                  "required": [
                    "type",
                    "image_url"
                  ],
                  "type": "object"
                },
                "maximum_items": 10,
                "minimum_items": 0,
                "name": "input_references",
                "required": false,
                "type": "array"
              },
              {
                "name": "provider",
                "required": false,
                "type": "object"
              }
            ],
            "request_schema": {
              "properties": {
                "aspect_ratio": {
                  "enum": [
                    "21:9",
                    "2:1",
                    "16:9",
                    "3:2",
                    "7:5",
                    "4:3",
                    "5:4",
                    "1:1",
                    "4:5",
                    "3:4",
                    "5:7",
                    "2:3",
                    "9:16",
                    "1:2",
                    "9:21",
                    "auto"
                  ],
                  "type": "string"
                },
                "input_references": {
                  "items": {
                    "properties": {
                      "image_url": {
                        "properties": {
                          "url": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "url"
                        ],
                        "type": "object"
                      },
                      "type": {
                        "const": "image_url"
                      }
                    },
                    "required": [
                      "type",
                      "image_url"
                    ],
                    "type": "object"
                  },
                  "maxItems": 10,
                  "minItems": 0,
                  "type": "array"
                },
                "model": {
                  "enum": [
                    "black-forest-labs/flux-3-image"
                  ],
                  "type": "string"
                },
                "n": {
                  "maximum": 1,
                  "minimum": 1,
                  "type": "integer"
                },
                "prompt": {
                  "minLength": 1,
                  "type": "string"
                },
                "provider": {
                  "description": "Exact image provider preferences from the documented image request schema.",
                  "type": "object"
                },
                "resolution": {
                  "enum": [
                    "768",
                    "1K",
                    "1.5K",
                    "2K",
                    "4K"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt"
              ],
              "type": "object"
            },
            "schema_template": {
              "actual_file_preparation_required": false,
              "body": {
                "model": "black-forest-labs/flux-3-image",
                "prompt": "a red panda astronaut floating in space, studio lighting"
              },
              "content_type": "application/json"
            }
          },
          "input": {
            "content_type": "application/json",
            "material_types": [
              "text",
              "image"
            ],
            "required": [
              "model",
              "prompt"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "task_id effectivement renvoyé ou enregistrement de la bibliothèque multimédia",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "Keep the returned X-Client-Request-ID for reconciliation. Read only actual returned task_id/asset_id values or the owned media library; never build a task URL from the operation ID and never resubmit creation."
          },
          "method": {
            "http": "POST",
            "path": "/v1/images/generations"
          },
          "output": {
            "all_results": "Retain the complete response and headers, every actual output, original returned identifiers and all usage fields. Recover the original operation without submitting creation again.",
            "family": "image",
            "fields": [
              {
                "description": null,
                "name": "created",
                "type": null
              },
              {
                "description": null,
                "name": "data[].url",
                "type": null
              },
              {
                "description": null,
                "name": "data[].b64_json",
                "type": null
              },
              {
                "description": null,
                "name": "usage",
                "type": null
              }
            ]
          }
        },
        "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"
              }
            ]
          },
          {
            "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": "0.082",
                "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": "0.082",
                "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}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np={'model': 'black-forest-labs/flux-3-image', 'prompt': 'a red panda astronaut floating in space, studio lighting'}\n\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\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 base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        ext=\"png\" if raw.startswith(b\"\\x89PNG\") else \"jpg\" if raw.startswith(b\"\\xff\\xd8\") else \"webp\" if raw[:4]==b\"RIFF\" and raw[8:12]==b\"WEBP\" else \"svg\" if raw.lstrip().startswith((b\"<svg\",b\"<?xml\")) else \"bin\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\nsave_images(json.loads(Path(\"result.json\").read_text())[\"data\"])\nPY_RESULT\n",
            "label": "curl · exact creation/save all outputs",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o owned-assets.json\n# Preserve every returned asset and follow its exact signed content URL. Do not construct a signed token.\n",
            "label": "Read existing owned assets",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "images",
        "hints": [
          "Use the exact caller model ID and documented input representation.",
          "Retain the complete response and headers, every actual output, original returned identifiers and all usage fields. Recover the original operation without submitting creation again."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text",
          "image"
        ],
        "label": "Génération d’images",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [
          "/v1/images"
        ],
        "native_endpoint": "images",
        "out": null,
        "output": [
          "image"
        ],
        "path": "/v1/images/generations",
        "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"
              }
            ]
          },
          {
            "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": "0.082",
                "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": "0.082",
                "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": "black-forest-labs/flux-3-image",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/media/tasks/{task_id}"
        ],
        "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.082",
            "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": "0.082",
            "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": "black-forest-labs/flux-3-image",
        "request_model_id": "black-forest-labs/flux-3-image",
        "route_label": "Ultra"
      }
    ],
    "name": "Black Forest Labs: FLUX.3 Image",
    "price": {
      "estimate_only": true,
      "in": null,
      "in_label": null,
      "out": 0.082,
      "out_label": "estimate before generation",
      "scope_label": "Estimated generation cost",
      "sort_in": null,
      "sort_out": 0.082,
      "varies": false
    },
    "short": "FLUX 3 Image crée et monte des images à partir d’un brief écrit et d’un maximum de dix références. Il ajoute des boîtes englobantes définies par prompt pour la composition et les changements locaux, l’ancrage dans les recherches Web et d’images, ainsi que cinq classes de résolution."
  },
  "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": "FLUX 3 Image crée et monte des images à partir d’un brief écrit et d’un maximum de dix références. Il ajoute des boîtes englobantes définies par prompt pour la composition et les changements locaux, l’ancrage dans les recherches Web et d’images, ainsi que cinq classes de résolution.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "fe369ef1f4fbbb04377afb1bed9377b60d8950210bfd45347fd430baaf1d779e",
    "renderer_sha256": "98cb81b9c4ef4923c22e586170e7cdf67056351148a1666fb03dd6a4a26716a3"
  },
  "sourceRevision": "1b7ba6a2363709558c4a9a11ce45cd751345e7f63a8d1e389054932eca03076e"
}
