{
  "aboutHtml": "<p>Vidu Q2 luo videoita kirjoitetusta kohtauksesta tekstistä videoksi -profiililla, joka valitaan tunnuksella viduq2. Pakolliset syötteet ovat täsmällinen mallitunnus ja kohtausta kuvaava kehote. Käytä sitä lyhyeen tuoteideaan, paikan esittelevään yleiskuvaan tai hahmon toimintaan, jonka ulkonäön ja liikkeen voi määrittää sanoin. Tämä määritetty menetelmä luo videoita tekstistä; sen kuvaus ei liitä valitsimeen erillistä kuvaviite- tai videonmuokkaustilaa.</p><p>Rakenna kuvaus näkyvän tapahtumaketjun ympärille. Nimeä kohde, paikka, toiminta, kuvakoko, kameran liike ja lopullinen sommitelma. Kuvaa tuoteideassa pöydällä oleva esine, sen materiaalin yli liikkuva valo ja hidas kameran lähestyminen, joka päättyy tunnistettavaan yksityiskohtaan. Paikkaa esittelevässä kohtauksessa näytä ympäristö ennen siirtymistä huomion kohteeseen. Sovita toiminta valittuun leikkeen pituuteen, jotta kohtauksessa on tilaa suunnitellulle lopetukselle.</p><p>Kehotteen enimmäispituus on 2,000 merkkiä. Kerro tärkein kohde ja toiminta ensin ja lisää sitten valaistus, materiaali, ympäristö ja kameran yksityiskohdat, jotka muuttavat haluttua tulosta. Määritä visuaalinen tyyli kehotteessa. Q2-kohtainen ohje kertoo, että erilliset style- ja movement_amplitude-parametrit eivät vaikuta tässä mallissa, joten general- tai anime-esiasetus ja liikkeen voimakkuuden valinnat eivät korvaa selkeää kohtauskuvausta.</p><p>Mallikohtainen kestoasetus hyväksyy kokonaisia sekunteja yhdestä kymmeneen. Q2-kohtaiset resoluutiovaihtoehdot ovat 540p, 720p ja 1080p, ja dokumentoitu oletus on 720p. Valitse kesto ja resoluutio yhdessä toiminnan ja kohdekäytön mukaan. Lyhyt paljastus ja pidempi liike tarvitsevat erilaisen ajoituksen; pyydetyn keston kasvattamisen tulee palvella näkyvää tapahtumaketjua eikä vain venyttää muuttumatonta kuvausta. Tarkista palautetun leikkeen todelliset mitat ja pituus, kun valmistelet lopullista sijoittelua.</p><p>Dokumentoidut aspect_ratio-vaihtoehdot ovat 16:9, 9:16, 3:4, 4:3 ja 1:1, ja oletus on 16:9. Ohje sisältää nimenomaisesti kuvasuhteet 3:4 ja 4:3 Q2-perheelle. Valitse kuvasuhde ennen luomista ja kuvaa siihen sopiva sommitelma: pidä pääkohde selkeästi hahmotettavana pystykuvassa tai käytä vaakakuvan leveyttä ympäristön esittämiseen. Jätä loppunäkymä riittävän selkeäksi aiottua sivua, esitystä tai myöhempää tekstitystä varten.</p><p>seed-kenttä ohjaa vaihtelua. Kentän jättäminen pois tai arvon 0 antaminen valitsee satunnaisen arvon; nollasta poikkeava arvo valitsee dokumentoidun kiinteän seed-arvon toistettavaa luomista varten. Säilytä palautettu seed kehotteen ja asetusten kanssa, kun vertaat versioita. Yhteinen toiminto dokumentoi myös audio- ja off_peak-asetukset nimenomaan Q3-malleille. Nämä Q3-valinnat eivät ole tämän Q2-profiilin ominaisuuksia; suunnittele pyyntö sen dokumentoidun tekstisyötteen ja videotuloksen ympärille.</p><p>Luominen on asynkronista. Lähetys palauttaa kentän task_id ja alkutilan; uudelle tehtävälle käytetään arvoa created. Säilytä tehtävän tunniste, kun seuraat käsittelyä. Dokumentoitu tuloskysely käyttää onnistuneelle tulokselle arvoa state=success ja palauttaa creations-taulukon. Kunkin alkion videon URL on kentässä creations[].url; tallenna jokainen palautettu video sen sijaan, että olettaisit tehtävän sisältävän aina täsmälleen yhden luomuksen.</p><p>Tulosdokumentaatio ilmoittaa myös todellisen videon keston, fps-arvon sekä resoluution leveyden ja korkeuden. Säilytä nämä ilmoitetut arvot valmiin leikkeen mukana sen sijaan, että pitäisit esimerkin kuvataajuutta tai mittoja kiinteänä Q2-määrityksenä. Tehtävän luontivastaus sisältää credits-arvon pyynnön kokoonpanon rinnalla. Säilytä nämä ilmoitetut tehtävän metatiedot ja valmiin tehtävän tunniste tuloksen mukana, jotta jokainen video pysyy yhdistettynä luomisasetuksiinsa.</p><p>Vertaa koko tapahtumaketjua alkuperäiseen kuvaukseen: kohteen ulkonäköä, esineen muotoa, liikkeen suuntaa, kameran jatkuvuutta ja tavoiteltua loppunäkymää. Nimeä muokkausta varten konkreettinen yksityiskohta, joka ei vastannut kuvausta, ja säilytä kohtauksen onnistuneet osat. Pidä kehote, täsmällinen valitsin, asetukset, tehtävän tunniste ja valmiit videot yhdessä, jotta myöhempi vertailu perustuu todellisiin tuotoksiin.</p>",
  "aboutText": "Vidu Q2 luo videoita kirjoitetusta kohtauksesta tekstistä videoksi -profiililla, joka valitaan tunnuksella viduq2. Pakolliset syötteet ovat täsmällinen mallitunnus ja kohtausta kuvaava kehote. Käytä sitä lyhyeen tuoteideaan, paikan esittelevään yleiskuvaan tai hahmon toimintaan, jonka ulkonäön ja liikkeen voi määrittää sanoin. Tämä määritetty menetelmä luo videoita tekstistä; sen kuvaus ei liitä valitsimeen erillistä kuvaviite- tai videonmuokkaustilaa.\n\nRakenna kuvaus näkyvän tapahtumaketjun ympärille. Nimeä kohde, paikka, toiminta, kuvakoko, kameran liike ja lopullinen sommitelma. Kuvaa tuoteideassa pöydällä oleva esine, sen materiaalin yli liikkuva valo ja hidas kameran lähestyminen, joka päättyy tunnistettavaan yksityiskohtaan. Paikkaa esittelevässä kohtauksessa näytä ympäristö ennen siirtymistä huomion kohteeseen. Sovita toiminta valittuun leikkeen pituuteen, jotta kohtauksessa on tilaa suunnitellulle lopetukselle.\n\nKehotteen enimmäispituus on 2,000 merkkiä. Kerro tärkein kohde ja toiminta ensin ja lisää sitten valaistus, materiaali, ympäristö ja kameran yksityiskohdat, jotka muuttavat haluttua tulosta. Määritä visuaalinen tyyli kehotteessa. Q2-kohtainen ohje kertoo, että erilliset style- ja movement_amplitude-parametrit eivät vaikuta tässä mallissa, joten general- tai anime-esiasetus ja liikkeen voimakkuuden valinnat eivät korvaa selkeää kohtauskuvausta.\n\nMallikohtainen kestoasetus hyväksyy kokonaisia sekunteja yhdestä kymmeneen. Q2-kohtaiset resoluutiovaihtoehdot ovat 540p, 720p ja 1080p, ja dokumentoitu oletus on 720p. Valitse kesto ja resoluutio yhdessä toiminnan ja kohdekäytön mukaan. Lyhyt paljastus ja pidempi liike tarvitsevat erilaisen ajoituksen; pyydetyn keston kasvattamisen tulee palvella näkyvää tapahtumaketjua eikä vain venyttää muuttumatonta kuvausta. Tarkista palautetun leikkeen todelliset mitat ja pituus, kun valmistelet lopullista sijoittelua.\n\nDokumentoidut aspect_ratio-vaihtoehdot ovat 16:9, 9:16, 3:4, 4:3 ja 1:1, ja oletus on 16:9. Ohje sisältää nimenomaisesti kuvasuhteet 3:4 ja 4:3 Q2-perheelle. Valitse kuvasuhde ennen luomista ja kuvaa siihen sopiva sommitelma: pidä pääkohde selkeästi hahmotettavana pystykuvassa tai käytä vaakakuvan leveyttä ympäristön esittämiseen. Jätä loppunäkymä riittävän selkeäksi aiottua sivua, esitystä tai myöhempää tekstitystä varten.\n\nseed-kenttä ohjaa vaihtelua. Kentän jättäminen pois tai arvon 0 antaminen valitsee satunnaisen arvon; nollasta poikkeava arvo valitsee dokumentoidun kiinteän seed-arvon toistettavaa luomista varten. Säilytä palautettu seed kehotteen ja asetusten kanssa, kun vertaat versioita. Yhteinen toiminto dokumentoi myös audio- ja off_peak-asetukset nimenomaan Q3-malleille. Nämä Q3-valinnat eivät ole tämän Q2-profiilin ominaisuuksia; suunnittele pyyntö sen dokumentoidun tekstisyötteen ja videotuloksen ympärille.\n\nLuominen on asynkronista. Lähetys palauttaa kentän task_id ja alkutilan; uudelle tehtävälle käytetään arvoa created. Säilytä tehtävän tunniste, kun seuraat käsittelyä. Dokumentoitu tuloskysely käyttää onnistuneelle tulokselle arvoa state=success ja palauttaa creations-taulukon. Kunkin alkion videon URL on kentässä creations[].url; tallenna jokainen palautettu video sen sijaan, että olettaisit tehtävän sisältävän aina täsmälleen yhden luomuksen.\n\nTulosdokumentaatio ilmoittaa myös todellisen videon keston, fps-arvon sekä resoluution leveyden ja korkeuden. Säilytä nämä ilmoitetut arvot valmiin leikkeen mukana sen sijaan, että pitäisit esimerkin kuvataajuutta tai mittoja kiinteänä Q2-määrityksenä. Tehtävän luontivastaus sisältää credits-arvon pyynnön kokoonpanon rinnalla. Säilytä nämä ilmoitetut tehtävän metatiedot ja valmiin tehtävän tunniste tuloksen mukana, jotta jokainen video pysyy yhdistettynä luomisasetuksiinsa.\n\nVertaa koko tapahtumaketjua alkuperäiseen kuvaukseen: kohteen ulkonäköä, esineen muotoa, liikkeen suuntaa, kameran jatkuvuutta ja tavoiteltua loppunäkymää. Nimeä muokkausta varten konkreettinen yksityiskohta, joka ei vastannut kuvausta, ja säilytä kohtauksen onnistuneet osat. Pidä kehote, täsmällinen valitsin, asetukset, tehtävän tunniste ja valmiit videot yhdessä, jotta myöhempi vertailu perustuu todellisiin tuotoksiin.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "55293632510f1ff400b3d280d3ebd7c0f1dd3fd1f537c40a078edf01eb8d73ee",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "fi",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">Vidu: Q2 Text-to-Video</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Sulje\">×</button></div><div class=\"idline\"><span>Vidu /</span><code>viduq2</code><button type=\"button\" id=\"copy-id\">Kopioi ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Mallikortin osiot\"><button type=\"button\" data-card-jump=\"overview\">Aloitus</button><button type=\"button\" data-card-jump=\"methods\">Syötteet &amp; menetelmät</button><button type=\"button\" data-card-jump=\"pricing\">Hinnoittelu</button><button type=\"button\" data-card-jump=\"examples\">Esimerkit</button><button type=\"button\" data-card-jump=\"results\">Tulokset</button><button type=\"button\" data-card-jump=\"aliases\">Aliakset</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"API-menetelmät\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Ultra|videos|/v1/videos|viduq2\">Video</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\">Aloitus</h3><p class=\"mdesc-full\">Vidu Q2 luo videoita tekstimuotoisesta kohtauskuvauksesta. Kesto on 1–10 sekuntia, tuloksen resoluutio 540p, 720p tai 1080p ja kuvasuhteita on viisi. Tämä täsmällinen viduq2-profiili käyttää kehotetta tyylin ja liikkeen määrittämiseen ja palauttaa tuloksen asynkronisen tehtävän kautta.</p><dl class=\"card-io\" data-card-io><div><dt>Hyväksytyt syötteet</dt><dd>Teksti</dd></div><div><dt>Tulokset</dt><dd>Video</dd></div></dl><details class=\"card-about\"><summary>Tietoa mallista</summary><p class=\"note-s\" data-model-method-boundary>Tämä kuvaus kattaa mallin ominaisuudet. Ailootissa saatavilla olevat syötteet, tulosteet ja asetukset luetellaan alla valitulle menetelmälle.</p><div class=\"mabout\" id=\"m-about\"><p>Vidu Q2 luo videoita kirjoitetusta kohtauksesta tekstistä videoksi -profiililla, joka valitaan tunnuksella viduq2. Pakolliset syötteet ovat täsmällinen mallitunnus ja kohtausta kuvaava kehote. Käytä sitä lyhyeen tuoteideaan, paikan esittelevään yleiskuvaan tai hahmon toimintaan, jonka ulkonäön ja liikkeen voi määrittää sanoin. Tämä määritetty menetelmä luo videoita tekstistä; sen kuvaus ei liitä valitsimeen erillistä kuvaviite- tai videonmuokkaustilaa.</p><p>Rakenna kuvaus näkyvän tapahtumaketjun ympärille. Nimeä kohde, paikka, toiminta, kuvakoko, kameran liike ja lopullinen sommitelma. Kuvaa tuoteideassa pöydällä oleva esine, sen materiaalin yli liikkuva valo ja hidas kameran lähestyminen, joka päättyy tunnistettavaan yksityiskohtaan. Paikkaa esittelevässä kohtauksessa näytä ympäristö ennen siirtymistä huomion kohteeseen. Sovita toiminta valittuun leikkeen pituuteen, jotta kohtauksessa on tilaa suunnitellulle lopetukselle.</p><p>Kehotteen enimmäispituus on 2,000 merkkiä. Kerro tärkein kohde ja toiminta ensin ja lisää sitten valaistus, materiaali, ympäristö ja kameran yksityiskohdat, jotka muuttavat haluttua tulosta. Määritä visuaalinen tyyli kehotteessa. Q2-kohtainen ohje kertoo, että erilliset style- ja movement_amplitude-parametrit eivät vaikuta tässä mallissa, joten general- tai anime-esiasetus ja liikkeen voimakkuuden valinnat eivät korvaa selkeää kohtauskuvausta.</p><p>Mallikohtainen kestoasetus hyväksyy kokonaisia sekunteja yhdestä kymmeneen. Q2-kohtaiset resoluutiovaihtoehdot ovat 540p, 720p ja 1080p, ja dokumentoitu oletus on 720p. Valitse kesto ja resoluutio yhdessä toiminnan ja kohdekäytön mukaan. Lyhyt paljastus ja pidempi liike tarvitsevat erilaisen ajoituksen; pyydetyn keston kasvattamisen tulee palvella näkyvää tapahtumaketjua eikä vain venyttää muuttumatonta kuvausta. Tarkista palautetun leikkeen todelliset mitat ja pituus, kun valmistelet lopullista sijoittelua.</p><p>Dokumentoidut aspect_ratio-vaihtoehdot ovat 16:9, 9:16, 3:4, 4:3 ja 1:1, ja oletus on 16:9. Ohje sisältää nimenomaisesti kuvasuhteet 3:4 ja 4:3 Q2-perheelle. Valitse kuvasuhde ennen luomista ja kuvaa siihen sopiva sommitelma: pidä pääkohde selkeästi hahmotettavana pystykuvassa tai käytä vaakakuvan leveyttä ympäristön esittämiseen. Jätä loppunäkymä riittävän selkeäksi aiottua sivua, esitystä tai myöhempää tekstitystä varten.</p><p>seed-kenttä ohjaa vaihtelua. Kentän jättäminen pois tai arvon 0 antaminen valitsee satunnaisen arvon; nollasta poikkeava arvo valitsee dokumentoidun kiinteän seed-arvon toistettavaa luomista varten. Säilytä palautettu seed kehotteen ja asetusten kanssa, kun vertaat versioita. Yhteinen toiminto dokumentoi myös audio- ja off_peak-asetukset nimenomaan Q3-malleille. Nämä Q3-valinnat eivät ole tämän Q2-profiilin ominaisuuksia; suunnittele pyyntö sen dokumentoidun tekstisyötteen ja videotuloksen ympärille.</p><p>Luominen on asynkronista. Lähetys palauttaa kentän task_id ja alkutilan; uudelle tehtävälle käytetään arvoa created. Säilytä tehtävän tunniste, kun seuraat käsittelyä. Dokumentoitu tuloskysely käyttää onnistuneelle tulokselle arvoa state=success ja palauttaa creations-taulukon. Kunkin alkion videon URL on kentässä creations[].url; tallenna jokainen palautettu video sen sijaan, että olettaisit tehtävän sisältävän aina täsmälleen yhden luomuksen.</p><p>Tulosdokumentaatio ilmoittaa myös todellisen videon keston, fps-arvon sekä resoluution leveyden ja korkeuden. Säilytä nämä ilmoitetut arvot valmiin leikkeen mukana sen sijaan, että pitäisit esimerkin kuvataajuutta tai mittoja kiinteänä Q2-määrityksenä. Tehtävän luontivastaus sisältää credits-arvon pyynnön kokoonpanon rinnalla. Säilytä nämä ilmoitetut tehtävän metatiedot ja valmiin tehtävän tunniste tuloksen mukana, jotta jokainen video pysyy yhdistettynä luomisasetuksiinsa.</p><p>Vertaa koko tapahtumaketjua alkuperäiseen kuvaukseen: kohteen ulkonäköä, esineen muotoa, liikkeen suuntaa, kameran jatkuvuutta ja tavoiteltua loppunäkymää. Nimeä muokkausta varten konkreettinen yksityiskohta, joka ei vastannut kuvausta, ja säilytä kohtauksen onnistuneet osat. Pidä kehote, täsmällinen valitsin, asetukset, tehtävän tunniste ja valmiit videot yhdessä, jotta myöhempi vertailu perustuu todellisiin tuotoksiin.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Saatavilla Ailootissa · syötteet &amp; menetelmät</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · Videot</b> <code>POST /v1/videos</code></summary><dl class=\"method-capabilities\"><div><dt>Syötetyypit</dt><dd><code>text</code></dd></div><div><dt>Tulostyypit</dt><dd><code>video</code></dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Kenttä</th><th>Tyyppi</th><th>Vaatimus</th><th>Arvot &amp; rajat</th><th>Oletus</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span><code>string</code></td><td data-cell-label=\"Vaatimus\"><span class=\"card-cell-label\">Vaatimus</span>Pakollinen</td><td data-cell-label=\"Arvot &amp; rajat\"><span class=\"card-cell-label\">Arvot &amp; rajat</span><div>viduq2</div></td><td data-cell-label=\"Oletus\" data-default=\"unspecified\"><span class=\"card-cell-label\">Oletus</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">prompt</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span><code>string</code></td><td data-cell-label=\"Vaatimus\"><span class=\"card-cell-label\">Vaatimus</span>Pakollinen</td><td data-cell-label=\"Arvot &amp; rajat\"><span class=\"card-cell-label\">Arvot &amp; rajat</span><div>Ehdot: Kuvaile luotava kohtaus. Dokumentoitu raja on 2000 merkkiä; Ailoot tarkistaa, että merkkijono ei ole tyhjä, ja säilyttää tekstin.</div></td><td data-cell-label=\"Oletus\" data-default=\"unspecified\"><span class=\"card-cell-label\">Oletus</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">duration</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span><code>integer</code></td><td data-cell-label=\"Vaatimus\"><span class=\"card-cell-label\">Vaatimus</span>Valinnainen</td><td data-cell-label=\"Arvot &amp; rajat\"><span class=\"card-cell-label\">Arvot &amp; rajat</span><div>Vähimmäismäärä: 1</div><div>Enimmäismäärä: 10</div><div>Ehdot: Mallikohtainen viduq2-kuvaus määrittää kestoksi 1–10 kokonaista sekuntia. Mallikohtaista oletuskestoa ei ole dokumentoitu.</div><div>Yksikkö: sekuntia</div></td><td data-cell-label=\"Oletus\" data-default=\"unspecified\"><span class=\"card-cell-label\">Oletus</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">seed</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span><code>string</code></td><td data-cell-label=\"Vaatimus\"><span class=\"card-cell-label\">Vaatimus</span>Valinnainen</td><td data-cell-label=\"Arvot &amp; rajat\"><span class=\"card-cell-label\">Arvot &amp; rajat</span><div>Ehdot: Jätä pois tai lähetä merkkijono &quot;0&quot; satunnaisuutta varten. Annettu nollasta poikkeava seed valitsee dokumentoidun kiinteää seed-arvoa käyttävän toiminnan; numeerista vaihteluväliä ei ole määritetty.</div></td><td data-cell-label=\"Oletus\" data-default=\"unspecified\"><span class=\"card-cell-label\">Oletus</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">aspect_ratio</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span><code>string</code></td><td data-cell-label=\"Vaatimus\"><span class=\"card-cell-label\">Vaatimus</span>Valinnainen</td><td data-cell-label=\"Arvot &amp; rajat\"><span class=\"card-cell-label\">Arvot &amp; rajat</span><div>16:9, 9:16, 3:4, 4:3, 1:1</div></td><td data-cell-label=\"Oletus\" data-default=\"known\"><span class=\"card-cell-label\">Oletus</span>16:9</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">resolution</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span><code>string</code></td><td data-cell-label=\"Vaatimus\"><span class=\"card-cell-label\">Vaatimus</span>Valinnainen</td><td data-cell-label=\"Arvot &amp; rajat\"><span class=\"card-cell-label\">Arvot &amp; rajat</span><div>540p, 720p, 1080p</div><div>Ehdot: Mallikohtainen viduq2-luettelo dokumentoi nämä luokat kestolle 1–10 sekuntia. Yhteinen enum ja taulukko mainitsevat myös arvon 360p; sen sovellettavuus on ristiriidassa luettelon kanssa, eikä sitä vahvisteta tässä.</div></td><td data-cell-label=\"Oletus\" data-default=\"known\"><span class=\"card-cell-label\">Oletus</span>720p</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">style</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span><code>string</code></td><td data-cell-label=\"Vaatimus\"><span class=\"card-cell-label\">Vaatimus</span>Valinnainen</td><td data-cell-label=\"Arvot &amp; rajat\"><span class=\"card-cell-label\">Arvot &amp; rajat</span><div>general, anime</div><div>Ehdot: Yhteinen pyyntörakenne hyväksyy tämän kentän, mutta dokumentaatio toteaa nimenomaisesti, ettei sillä ole vaikutusta viduq2-malliin.</div></td><td data-cell-label=\"Oletus\" data-default=\"known\"><span class=\"card-cell-label\">Oletus</span>general</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">movement_amplitude</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span><code>string</code></td><td data-cell-label=\"Vaatimus\"><span class=\"card-cell-label\">Vaatimus</span>Valinnainen</td><td data-cell-label=\"Arvot &amp; rajat\"><span class=\"card-cell-label\">Arvot &amp; rajat</span><div>auto, small, medium, large</div><div>Ehdot: Yhteinen pyyntörakenne hyväksyy tämän kentän, mutta dokumentaatio toteaa nimenomaisesti, ettei sillä ole vaikutusta q2-malleihin.</div></td><td data-cell-label=\"Oletus\" data-default=\"known\"><span class=\"card-cell-label\">Oletus</span>auto</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Syöteaineistojen yhdistelmät</summary><p class=\"note-s\"><b></b></p></details><details class=\"note-s\" data-method-contract><summary>Menetelmän parametrit ja elinkaari</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Parametri</th><th>Sopimus</th></tr></thead><tbody><tr><th data-cell-label=\"Parametri\" scope=\"row\"><span class=\"card-cell-label\">Parametri</span><code>content_type</code></th><td data-cell-label=\"Sopimus\"><span class=\"card-cell-label\">Sopimus</span>application/json</td></tr><tr><th data-cell-label=\"Parametri\" scope=\"row\"><span class=\"card-cell-label\">Parametri</span><code>required</code></th><td data-cell-label=\"Sopimus\"><span class=\"card-cell-label\">Sopimus</span>model, prompt</td></tr><tr><th data-cell-label=\"Parametri\" scope=\"row\"><span class=\"card-cell-label\">Parametri</span><code>optional</code></th><td data-cell-label=\"Sopimus\"><span class=\"card-cell-label\">Sopimus</span>duration, seed, aspect_ratio, resolution, style, movement_amplitude</td></tr><tr><th data-cell-label=\"Parametri\" scope=\"row\"><span class=\"card-cell-label\">Parametri</span><code>material_types</code></th><td data-cell-label=\"Sopimus\"><span class=\"card-cell-label\">Sopimus</span>text</td></tr><tr><th data-cell-label=\"Parametri\" scope=\"row\"><span class=\"card-cell-label\">Parametri</span><code>additional_properties</code></th><td data-cell-label=\"Sopimus\"><span class=\"card-cell-label\">Sopimus</span>true</td></tr><tr><th data-cell-label=\"Parametri\" scope=\"row\"><span class=\"card-cell-label\">Parametri</span><code>validation_scope</code></th><td data-cell-label=\"Sopimus\"><span class=\"card-cell-label\">Sopimus</span>Ailoot validoi ei-tyhjät model/prompt-merkkijonot. Alla olevat valinnaiset tyypit ja rajat muodostavat dokumentoidun pyyntösopimuksen; muut pyyntökentät säilytetään valittua mallia varten.</td></tr></tbody></table></div><p>Menetelmien aliakset: <code>/v1/videos/generations</code></p><p>Elinkaari: <code>submit_once_poll_original</code></p><p class=\"note-s\"><code>GET /v1/videos/{request_id}</code></p><p class=\"note-s\"><code>GET /v1/videos/generations/{request_id}</code></p><p class=\"note-s\"><code>GET /v1/videos/{request_id}/content</code></p><p class=\"note-s\"><code>GET /v1/videos/generations/{request_id}/content</code></p><p class=\"note-s\">Luo kerran ja säilytä palautettu julkinen id ja polling_url.</p><p class=\"note-s\">Kysy alkuperäisen operaation tilaa ja lue state; valmistuminen edellyttää success-tilaa ja käyttäjälle kuuluvaa creations[].url-tulosta.</p><p class=\"note-s\">Lataa video jokaisesta palautetusta käyttäjälle kuuluvasta URL-osoitteesta; älä päättele esimerkistä kiinteää tulosmäärää, kestoa tai kuvataajuutta.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Hinnoittelu</h3><div class=\"card-result-process\" data-billing-basis><h5>Lopullisen veloituksen laskenta</h5><p class=\"note-s\">Näytettyjen hintojen avulla arvioidaan kustannukset ennen generointia. Lopullinen veloitus lasketaan alkuperäiselle generoinnille kirjatun kustannuksen perusteella. Lopullisena laskutettavana määränä ei käytetä tulosteen mitattua kestoa eikä ennustettuja määriä.</p></div><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>Hintatiedot eivät lisää pyyntövalintoja. Tuetut parametrit on lueteltu valitulle menetelmälle.</p><dl data-price-conditions><dt>Nopea tila</dt><dd>Ei määritetty <span class=\"note-s\">Kun nopea tila on valittu</span></dd><dt>Flex-tila</dt><dd>Ei määritetty <span class=\"note-s\">Kun flex-tila on valittu</span></dd><dt>Päättelyn enimmäisteho</dt><dd>Ei määritetty <span class=\"note-s\">Kun päättelyn enimmäistehoon sovelletaan default-oletussäätöä</span></dd></dl></div><div data-declared-tariff-pricing><h4>Arvioidut vertailuhinnat</h4><h4>Hinnat asetusten mukaan</h4><p class=\"note-s\">Kohdista kukin veloitus näytettyihin ehtoihin. Käytä yhtä hintaa kutakin vaihtoehtoisten asetusten ryhmää kohden.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Asetukset</th><th>Hinnasto</th><th>Ennustettu määrä</th><th>Veloitus</th></tr></thead><tbody><tr><th data-cell-label=\"Asetukset\" scope=\"row\"><span class=\"card-cell-label\">Asetukset</span>Tokenien perushinnat</th><td data-cell-label=\"Hinnasto\"><span class=\"card-cell-label\">Hinnasto</span>Perushinta</td><td data-cell-label=\"Ennustettu määrä\"><span class=\"card-cell-label\">Ennustettu määrä</span>—</td><td data-cell-label=\"Veloitus\"><span class=\"card-cell-label\">Veloitus</span><div><span>Syöte · Syötetokenit · Arvio vain vertailua varten</span> <b>—</b> <span class=\"price-unit\">/ 1K tokenia</span></div><div><span>Tuloste · Tulostokenit · Arvio vain vertailua varten</span> <b>—</b> <span class=\"price-unit\">/ 1K tokenia</span></div><div><span>Syöte · Välimuistin luku · Arvio vain vertailua varten</span> <b>—</b> <span class=\"price-unit\">/ 1K tokenia</span></div><div><span>Syöte · Välimuistiin kirjoitus · Arvio vain vertailua varten</span> <b>—</b> <span class=\"price-unit\">/ 1K tokenia</span></div><div><span>Syöte · Välimuistiin kirjoitus, 1 tunti · Arvio vain vertailua varten</span> <b>—</b> <span class=\"price-unit\">/ 1K tokenia</span></div></td></tr><tr><th data-cell-label=\"Asetukset\" scope=\"row\"><span class=\"card-cell-label\">Asetukset</span>Arvioitu luontikustannus</th><td data-cell-label=\"Hinnasto\"><span class=\"card-cell-label\">Hinnasto</span>—</td><td data-cell-label=\"Ennustettu määrä\"><span class=\"card-cell-label\">Ennustettu määrä</span>yhden generoinnin arvio</td><td data-cell-label=\"Veloitus\"><span class=\"card-cell-label\">Veloitus</span><div><span>Tuloste · Arvioidut generointikustannukset · Arvio vain vertailua varten</span> <b>$5.12</b> <span class=\"price-unit\">arvio ennen generointia</span></div><p class=\"note-s\">Tämä arvio ei ole lisämaksu eikä valmistuneen generoinnin kiinteä hinta.</p></td></tr></tbody></table></div></div><p class=\"note-s\">Ailoot varaa arvioidun summan ennen pyyntöä. Tuloksen jälkeen lopullinen veloitus toteutetaan mitatun käytön perusteella. Suoratoiston veloituksessa käytetään lopullista käyttötietuetta. <a href=\"/docs/fi/billing/reserve/\">Varauksen ja lopullisen veloituksen toiminta →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Esimerkkipyynnöt</h3><h4>Ailoot Ultra · Videot</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Koodivaihtoehdot\"><button class=\"cg-tab\" id=\"model-code-2782-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2782-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl · luo video</button><button class=\"cg-tab\" id=\"model-code-2782-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2782-panel-1\" aria-selected=\"false\" tabindex=\"-1\">curl · lue alkuperäinen tehtävä</button><button class=\"cg-tab\" id=\"model-code-2782-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2782-panel-2\" aria-selected=\"false\" tabindex=\"-1\">curl · lataa jokainen oma video</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Kopioi koodi\"><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-2782-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-2782-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\ncat &gt; request.json &lt;&lt;&#39;JSON_REQUEST&#39;\n{&quot;model&quot;:&quot;viduq2&quot;,&quot;prompt&quot;:&quot;In an ultra-realistic fashion photography style featuring light blue and pale amber tones, an astronaut in a spacesuit walks through the fog. The background consists of enchanting white and golden lights, creating a minimalist still life and an impressive panoramic scene.&quot;}\nJSON_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o result.json\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-2782-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-2782-tab-1\" hidden><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\npython3 - &lt;&lt;&#39;PY_POLL&#39;\nimport json\nfrom pathlib import Path\nfrom urllib.parse import quote,urljoin,urlsplit\nr=json.loads(Path(&quot;result.json&quot;).read_text())\ni=r.get(&quot;id&quot;)\nif not isinstance(i,str) or not i:raise SystemExit(&quot;Keep original response/headers/id; do not resubmit creation.&quot;)\nu=urljoin(&quot;https://api.ailoot.ai&quot;,r.get(&quot;polling_url&quot;) or &quot;/v1/videos/&quot;+quote(i,safe=&quot;&quot;))\np=urlsplit(u)\nif p.scheme!=&quot;https&quot; or p.netloc!=&quot;api.ailoot.ai&quot; or not p.path.startswith(&quot;/v1/videos/&quot;):raise SystemExit(&quot;Use the actual Ailoot lookup path.&quot;)\nPath(&quot;poll-url.txt&quot;).write_text(u)\nPY_POLL\ncurl --fail-with-body --silent --show-error &quot;$(cat poll-url.txt)&quot; -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -D status-headers.txt -o status.json\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-2782-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-2782-tab-2\" hidden><pre data-lang=\"bash\"><code>set -eu\npython3 - &lt;&lt;&#39;PY_ASSETS&#39;\nimport json\nfrom pathlib import Path\nfrom urllib.parse import urlsplit\nr=json.loads(Path(&quot;status.json&quot;).read_text())\nif r.get(&quot;state&quot;)!=&quot;success&quot;:raise SystemExit(&quot;Poll the same original job until its owned result is returned.&quot;)\ncreations=r.get(&quot;creations&quot;)\nif not isinstance(creations,list) or not creations:raise SystemExit(&quot;No completed video creations.&quot;)\nurls=[]\nfor item in creations:\n    value=item.get(&quot;url&quot;) if isinstance(item,dict) else None\n    values=[value] if isinstance(value,str) else value\n    if not isinstance(values,list) or not values:raise SystemExit(&quot;No completed video URL.&quot;)\n    for u in values:\n        if not isinstance(u,str):raise SystemExit(&quot;Invalid returned URL.&quot;)\n        p=urlsplit(u)\n        if p.scheme!=&quot;https&quot; or p.netloc!=&quot;api.ailoot.ai&quot; or not p.path.startswith(&quot;/v1/media/assets/&quot;) or not p.path.endswith(&quot;/content&quot;) or not p.query:raise SystemExit(&quot;Wait for the actual Ailoot-owned signed result.&quot;)\n        urls.append(u)\nPath(&quot;asset-urls.txt&quot;).write_text(&quot;\\n&quot;.join(urls)+&quot;\\n&quot;)\nPY_ASSETS\nindex=0\nwhile IFS= read -r asset_url; do\n  curl --fail-with-body --silent --show-error &quot;$asset_url&quot; -o &quot;video-${index}.bin&quot;\n  index=$((index + 1))\ndone &lt; asset-urls.txt\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Vastaanota ja tallenna tulokset</h3><h4>Ailoot Ultra · Videot</h4><p class=\"note-s\">JSON säilyttää natiivin state-kentän ja creations-taulukon, ja siihen lisätään julkinen id/provider_task_id/polling_url. Valitut video-osoitteet ovat tyhjiä ennen julkaisua ja muuttuvat Ailoot-palvelun hallinnoimiksi allekirjoitetuiksi osoitteiksi valmistumisen jälkeen.</p><ul class=\"card-result-paths\"><li><code>GET /v1/videos/{request_id}</code></li><li><code>GET /v1/videos/generations/{request_id}</code></li><li><code>GET /v1/videos/{request_id}/content</code></li><li><code>GET /v1/videos/generations/{request_id}/content</code></li></ul><div class=\"card-result-process\" data-all-results><h5>Säilytä kaikki valmistuneet tulokset</h5><p class=\"note-s\">Tallenna jokainen valmistunut video tai palautettu tiedosto; nouda jokainen todellinen palautettu aineiston URL.</p><p class=\"note-s\">Lataa jokainen creations[].url-kentässä todellisuudessa palautettu URL; sisältöindeksi yksilöi yhden todellisen palautetun tuloksen.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Jos alkuperäinen vastaus on tarkistettava</h5><p class=\"note-s\">Lukittu määrittely ei luettele yhtään lopullista epäonnistumistilaa. Säilytä alkuperäinen vastaus, otsakkeet ja id sekä tarkista sama operaatio, jos tila on tuntematon tai ilmenee result_pending_check-virhe; älä koskaan lähetä tuntemattomaan tilaan jäänyttä luontipyyntöä uudelleen.</p></div><details class=\"card-about\" data-output-fields><summary>Vastauksen kentät</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Kenttä</th><th>Tyyppi</th><th>Merkitys</th></tr></thead><tbody><tr><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">id</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span>string</td><td data-cell-label=\"Merkitys\"><span class=\"card-cell-label\">Merkitys</span>Palautettu julkinen Ailoot-tehtävän tai -operaation tunniste.</td></tr><tr><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">provider_task_id</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span>string</td><td data-cell-label=\"Merkitys\"><span class=\"card-cell-label\">Merkitys</span>Alkuperäinen tehtävätunniste, joka on erillinen julkisesta id-tunnisteesta.</td></tr><tr><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">polling_url</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span>string</td><td data-cell-label=\"Merkitys\"><span class=\"card-cell-label\">Merkitys</span>Palautettu Ailoot-hakupolku alkuperäiselle tehtävälle.</td></tr><tr><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">task_id</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span>string when supplied</td><td data-cell-label=\"Merkitys\"><span class=\"card-cell-label\">Merkitys</span>Luontivastauksessa oleva alkuperäinen tunniste.</td></tr><tr><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">state</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span>string when supplied</td><td data-cell-label=\"Merkitys\"><span class=\"card-cell-label\">Merkitys</span>Natiivi tehtävätila: created lukitulle odotustilalle ja success valmistumiselle.</td></tr><tr><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">err_code</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span>string when supplied</td><td data-cell-label=\"Merkitys\"><span class=\"card-cell-label\">Merkitys</span>Tehtävän diagnostiikkatiedot; tallennettu määrittely ei sisällä virhekoodien luetteloa.</td></tr><tr><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">creations[].url</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span>string|string[]</td><td data-cell-label=\"Merkitys\"><span class=\"card-cell-label\">Merkitys</span>Jokainen valittu valmistuneen videon URL korvataan Ailoot-palvelun hallinnoimalla allekirjoitetulla URL-osoitteella.</td></tr><tr><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">creations[].video.duration</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span>number when supplied</td><td data-cell-label=\"Merkitys\"><span class=\"card-cell-label\">Merkitys</span>Palautettu videon kesto; tarkista todellinen valmistunut tulos.</td></tr><tr><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">creations[].video.fps</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span>integer when supplied</td><td data-cell-label=\"Merkitys\"><span class=\"card-cell-label\">Merkitys</span>Palautettu kuvataajuus; kiinteää kuvataajuutta ei luvata.</td></tr><tr><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">creations[].video.resolution.width</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span>integer when supplied</td><td data-cell-label=\"Merkitys\"><span class=\"card-cell-label\">Merkitys</span>Palautetun tuloksen leveys pikseleinä.</td></tr><tr><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">creations[].video.resolution.height</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span>integer when supplied</td><td data-cell-label=\"Merkitys\"><span class=\"card-cell-label\">Merkitys</span>Palautetun tuloksen korkeus pikseleinä.</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Virheet ja seuraavat vaiheet</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Vastaus</th><th>Ehto</th><th>Seuraava vaihe</th></tr></thead><tbody><tr><th data-cell-label=\"Vastaus\" scope=\"row\"><span class=\"card-cell-label\">Vastaus</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Ehto\"><span class=\"card-cell-label\">Ehto</span>Virheellinen JSON/model, puuttuvat tai tyhjät pakolliset merkkijonot tai virheellinen sisältöindeksi.</td><td data-cell-label=\"Seuraava vaihe\"><span class=\"card-cell-label\">Seuraava vaihe</span></td></tr><tr><th data-cell-label=\"Vastaus\" scope=\"row\"><span class=\"card-cell-label\">Vastaus</span>401 · <code>authentication_error</code></th><td data-cell-label=\"Ehto\"><span class=\"card-cell-label\">Ehto</span>Virheellinen Ailoot API -avain.</td><td data-cell-label=\"Seuraava vaihe\"><span class=\"card-cell-label\">Seuraava vaihe</span></td></tr><tr><th data-cell-label=\"Vastaus\" scope=\"row\"><span class=\"card-cell-label\">Vastaus</span>403 · <code>permission_error</code></th><td data-cell-label=\"Ehto\"><span class=\"card-cell-label\">Ehto</span>API-avaimen ryhmällä ei ole käyttöoikeutta tähän mediareittiin.</td><td data-cell-label=\"Seuraava vaihe\"><span class=\"card-cell-label\">Seuraava vaihe</span></td></tr><tr><th data-cell-label=\"Vastaus\" scope=\"row\"><span class=\"card-cell-label\">Vastaus</span>404 · <code>not_found_error</code></th><td data-cell-label=\"Ehto\"><span class=\"card-cell-label\">Ehto</span>Alkuperäinen tehtävä tai pyydetty tulos puuttuu tai ei kuulu samalle käyttäjälle/API-avaimelle/ryhmälle.</td><td data-cell-label=\"Seuraava vaihe\"><span class=\"card-cell-label\">Seuraava vaihe</span></td></tr><tr><th data-cell-label=\"Vastaus\" scope=\"row\"><span class=\"card-cell-label\">Vastaus</span>502 · <code>result_pending_check</code></th><td data-cell-label=\"Ehto\"><span class=\"card-cell-label\">Ehto</span>Alkuperäinen lähetys tai tilatieto on puutteellinen tai sitä ei voida täsmäyttää; säilytä alkuperäinen tunniste äläkä lähetä pyyntöä uudelleen.</td><td data-cell-label=\"Seuraava vaihe\"><span class=\"card-cell-label\">Seuraava vaihe</span></td></tr><tr><th data-cell-label=\"Vastaus\" scope=\"row\"><span class=\"card-cell-label\">Vastaus</span>503 · <code>result_pending_check</code></th><td data-cell-label=\"Ehto\"><span class=\"card-cell-label\">Ehto</span>Alkuperäistä sidontaa, reittiä tai käyttäjälle kuuluvaa mediaa tarkistetaan edelleen; jatka saman alkuperäisen operaation tarkistamista.</td><td data-cell-label=\"Seuraava vaihe\"><span class=\"card-cell-label\">Seuraava vaihe</span></td></tr><tr><th data-cell-label=\"Vastaus\" scope=\"row\"><span class=\"card-cell-label\">Vastaus</span>503 · <code>server_error</code></th><td data-cell-label=\"Ehto\"><span class=\"card-cell-label\">Ehto</span>Mediapalvelu tai alkuperäisen tehtävän tallennustila ei ole saatavilla.</td><td data-cell-label=\"Seuraava vaihe\"><span class=\"card-cell-label\">Seuraava vaihe</span></td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Aliakset</h3><h4>Mallin aliakset</h4><p class=\"note-s\"><span data-model-alias-route=\"Ultra\"><b>Ailoot Ultra</b> <a href=\"#m=viduq2&amp;route=Ultra&amp;caller=viduq2&amp;fmt=videos\"><code>viduq2</code></a></span></p><h4>Menetelmäpolkujen aliakset</h4><p class=\"note-s\"><code>/v1/videos/generations</code></p><h4>Liittyvät kutsujan ID:t</h4><p class=\"note-s\"><a href=\"#m=viduq2&amp;route=Ultra&amp;caller=viduq2&amp;fmt=videos\"><code>viduq2</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "viduq2",
        "fmt": "videos",
        "http": "POST",
        "path": "/v1/videos",
        "request_model_id": "viduq2",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|videos|/v1/videos|viduq2",
      "ordinal": 0,
      "rawMethod": {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "Näytettyjen hintojen avulla arvioidaan kustannukset ennen generointia. Lopullinen veloitus lasketaan alkuperäiselle generoinnille kirjatun kustannuksen perusteella. Lopullisena laskutettavana määränä ei käytetä tulosteen mitattua kestoa eikä ennustettuja määriä.",
          "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": {
            "errors": [
              {
                "condition": "Virheellinen JSON/model, puuttuvat tai tyhjät pakolliset merkkijonot tai virheellinen sisältöindeksi.",
                "http_status": 400,
                "type": "invalid_request_error"
              },
              {
                "condition": "Virheellinen Ailoot API -avain.",
                "http_status": 401,
                "type": "authentication_error"
              },
              {
                "condition": "API-avaimen ryhmällä ei ole käyttöoikeutta tähän mediareittiin.",
                "http_status": 403,
                "type": "permission_error"
              },
              {
                "condition": "Alkuperäinen tehtävä tai pyydetty tulos puuttuu tai ei kuulu samalle käyttäjälle/API-avaimelle/ryhmälle.",
                "http_status": 404,
                "type": "not_found_error"
              },
              {
                "condition": "Alkuperäinen lähetys tai tilatieto on puutteellinen tai sitä ei voida täsmäyttää; säilytä alkuperäinen tunniste äläkä lähetä pyyntöä uudelleen.",
                "http_status": 502,
                "type": "result_pending_check"
              },
              {
                "condition": "Alkuperäistä sidontaa, reittiä tai käyttäjälle kuuluvaa mediaa tarkistetaan edelleen; jatka saman alkuperäisen operaation tarkistamista.",
                "http_status": 503,
                "type": "result_pending_check"
              },
              {
                "condition": "Mediapalvelu tai alkuperäisen tehtävän tallennustila ei ole saatavilla.",
                "http_status": 503,
                "type": "server_error"
              }
            ],
            "ignored_fields": [
              "style",
              "movement_amplitude"
            ],
            "lifecycle": {
              "cancel_endpoint": null,
              "completed_states": [
                "success"
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}/content",
                  "query": {
                    "index": "actual output index; default 0"
                  }
                },
                {
                  "http": "GET",
                  "path": "/v1/videos/generations/{request_id}/content",
                  "query": {
                    "index": "actual output index; default 0"
                  }
                }
              ],
              "content_pending": "Original status JSON until publication.",
              "content_ready": {
                "http_status": 303,
                "location": "actual signed Ailoot-owned asset URL"
              },
              "create": {
                "http": "POST",
                "path": "/v1/videos"
              },
              "failed_states": [],
              "id_source": "Use the actual returned public id or X-Ailoot-Task-Id and polling_url. Keep task_id/provider_task_id separate; status lookup can retain the original task identity when the native fetch omits it.",
              "mode": "submit_once_poll_original",
              "owned_result": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              },
              "pending_states": [
                "created"
              ],
              "signed_asset_lifetime_seconds": 86400,
              "state_field": "state",
              "status": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}"
                },
                {
                  "http": "GET",
                  "path": "/v1/videos/generations/{request_id}"
                }
              ],
              "submit_status": 200,
              "unknown": "Lukittu määrittely ei luettele yhtään lopullista epäonnistumistilaa. Säilytä alkuperäinen vastaus, otsakkeet ja id sekä tarkista sama operaatio, jos tila on tuntematon tai ilmenee result_pending_check-virhe; älä koskaan lähetä tuntemattomaan tilaan jäänyttä luontipyyntöä uudelleen.",
              "unknown_no_replay": true
            },
            "material_combinations": [
              [
                "text"
              ]
            ],
            "operation_modes": [
              "text_to_video"
            ],
            "outputs": {
              "additional_media_boundary": "Only creations[].url is selected for owned video delivery. No owned cover-image or callback result flow is established.",
              "all_results": "Lataa jokainen creations[].url-kentässä todellisuudessa palautettu URL; sisältöindeksi yksilöi yhden todellisen palautetun tuloksen.",
              "every_actual_output": true,
              "family": "video",
              "fields": [
                {
                  "description": "Palautettu julkinen Ailoot-tehtävän tai -operaation tunniste.",
                  "name": "id",
                  "type": "string"
                },
                {
                  "description": "Alkuperäinen tehtävätunniste, joka on erillinen julkisesta id-tunnisteesta.",
                  "name": "provider_task_id",
                  "type": "string"
                },
                {
                  "description": "Palautettu Ailoot-hakupolku alkuperäiselle tehtävälle.",
                  "name": "polling_url",
                  "type": "string"
                },
                {
                  "description": "Luontivastauksessa oleva alkuperäinen tunniste.",
                  "name": "task_id",
                  "type": "string when supplied"
                },
                {
                  "description": "Natiivi tehtävätila: created lukitulle odotustilalle ja success valmistumiselle.",
                  "name": "state",
                  "type": "string when supplied"
                },
                {
                  "description": "Tehtävän diagnostiikkatiedot; tallennettu määrittely ei sisällä virhekoodien luetteloa.",
                  "name": "err_code",
                  "type": "string when supplied"
                },
                {
                  "description": "Jokainen valittu valmistuneen videon URL korvataan Ailoot-palvelun hallinnoimalla allekirjoitetulla URL-osoitteella.",
                  "name": "creations[].url",
                  "type": "string|string[]"
                },
                {
                  "description": "Palautettu videon kesto; tarkista todellinen valmistunut tulos.",
                  "name": "creations[].video.duration",
                  "type": "number when supplied"
                },
                {
                  "description": "Palautettu kuvataajuus; kiinteää kuvataajuutta ei luvata.",
                  "name": "creations[].video.fps",
                  "type": "integer when supplied"
                },
                {
                  "description": "Palautetun tuloksen leveys pikseleinä.",
                  "name": "creations[].video.resolution.width",
                  "type": "integer when supplied"
                },
                {
                  "description": "Palautetun tuloksen korkeus pikseleinä.",
                  "name": "creations[].video.resolution.height",
                  "type": "integer when supplied"
                }
              ],
              "format": null,
              "maximum_outputs": null,
              "ownership": "Selected video outputs are copied, reopened and SHA256/length/positive-duration checked before publication.",
              "result": "JSON säilyttää natiivin state-kentän ja creations-taulukon, ja siihen lisätään julkinen id/provider_task_id/polling_url. Valitut video-osoitteet ovat tyhjiä ennen julkaisua ja muuttuvat Ailoot-palvelun hallinnoimiksi allekirjoitetuiksi osoitteiksi valmistumisen jälkeen."
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "viduq2"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "Kuvaile luotava kohtaus. Dokumentoitu raja on 2000 merkkiä; Ailoot tarkistaa, että merkkijono ei ole tyhjä, ja säilyttää tekstin.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maxLength": 2000,
                "minLength": 1,
                "name": "prompt",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "Mallikohtainen viduq2-kuvaus määrittää kestoksi 1–10 kokonaista sekuntia. Mallikohtaista oletuskestoa ei ole dokumentoitu.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum": 10,
                "minimum": 1,
                "name": "duration",
                "required": false,
                "type": "integer",
                "unit": "sekuntia"
              },
              {
                "availability": "source_interface",
                "conditions": "Jätä pois tai lähetä merkkijono \"0\" satunnaisuutta varten. Annettu nollasta poikkeava seed valitsee dokumentoidun kiinteää seed-arvoa käyttävän toiminnan; numeerista vaihteluväliä ei ole määritetty.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "seed",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": "16:9",
                "default_known": true,
                "enum": [
                  "16:9",
                  "9:16",
                  "3:4",
                  "4:3",
                  "1:1"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "Mallikohtainen viduq2-luettelo dokumentoi nämä luokat kestolle 1–10 sekuntia. Yhteinen enum ja taulukko mainitsevat myös arvon 360p; sen sovellettavuus on ristiriidassa luettelon kanssa, eikä sitä vahvisteta tässä.",
                "default": "720p",
                "default_known": true,
                "enum": [
                  "540p",
                  "720p",
                  "1080p"
                ],
                "enum_known": true,
                "name": "resolution",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "Yhteinen pyyntörakenne hyväksyy tämän kentän, mutta dokumentaatio toteaa nimenomaisesti, ettei sillä ole vaikutusta viduq2-malliin.",
                "default": "general",
                "default_known": true,
                "enum": [
                  "general",
                  "anime"
                ],
                "enum_known": true,
                "name": "style",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "Yhteinen pyyntörakenne hyväksyy tämän kentän, mutta dokumentaatio toteaa nimenomaisesti, ettei sillä ole vaikutusta q2-malleihin.",
                "default": "auto",
                "default_known": true,
                "enum": [
                  "auto",
                  "small",
                  "medium",
                  "large"
                ],
                "enum_known": true,
                "name": "movement_amplitude",
                "required": false,
                "type": "string"
              }
            ],
            "profile_binding": "Literal viduq2 model with the documented Ailoot videos interface.",
            "request_schema": {
              "additionalProperties": true,
              "properties": {
                "aspect_ratio": {
                  "default": "16:9",
                  "enum": [
                    "16:9",
                    "9:16",
                    "3:4",
                    "4:3",
                    "1:1"
                  ],
                  "type": "string"
                },
                "duration": {
                  "maximum": 10,
                  "minimum": 1,
                  "type": "integer"
                },
                "model": {
                  "const": "viduq2",
                  "minLength": 1,
                  "type": "string"
                },
                "movement_amplitude": {
                  "default": "auto",
                  "enum": [
                    "auto",
                    "small",
                    "medium",
                    "large"
                  ],
                  "type": "string"
                },
                "prompt": {
                  "maxLength": 2000,
                  "minLength": 1,
                  "type": "string"
                },
                "resolution": {
                  "default": "720p",
                  "enum": [
                    "540p",
                    "720p",
                    "1080p"
                  ],
                  "type": "string"
                },
                "seed": {
                  "type": "string"
                },
                "style": {
                  "default": "general",
                  "enum": [
                    "general",
                    "anime"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt"
              ],
              "type": "object"
            },
            "source_ambiguities": [
              "The shared enum and table mention 360p, while the model-specific viduq2 resolution description lists 540p/720p/1080p. The method asserts only the explicit model-specific list.",
              "The shared duration example uses a quoted string despite an integer schema. The copyable viduq2 example omits that optional field; an explicit duration follows the documented integer type.",
              "No model-specific default duration, maximum output count, generated-file retention period, cancellation endpoint or terminal failure-state list is established by these saved documents.",
              "The documented fetch uses an id path parameter; the pinned declaration names that same substituted value task_id. The fetch example has no task_id field, which the current client accepts only by retaining the original task identity."
            ],
            "unsupported": [
              "Image-guided input, video editing and extension are not part of this text-to-video method.",
              "The audio and off_peak parameters are documented only for other model selectors, not viduq2.",
              "No live streaming, callback completion or owned cover-image result contract is established here."
            ]
          },
          "hints": [
            "Luo kerran ja säilytä palautettu julkinen id ja polling_url.",
            "Kysy alkuperäisen operaation tilaa ja lue state; valmistuminen edellyttää success-tilaa ja käyttäjälle kuuluvaa creations[].url-tulosta.",
            "Lataa video jokaisesta palautetusta käyttäjälle kuuluvasta URL-osoitteesta; älä päättele esimerkistä kiinteää tulosmäärää, kestoa tai kuvataajuutta."
          ],
          "input": {
            "additional_properties": true,
            "content_type": "application/json",
            "material_types": [
              "text"
            ],
            "optional": [
              "duration",
              "seed",
              "aspect_ratio",
              "resolution",
              "style",
              "movement_amplitude"
            ],
            "required": [
              "model",
              "prompt"
            ],
            "validation_scope": "Ailoot validoi ei-tyhjät model/prompt-merkkijonot. Alla olevat valinnaiset tyypit ja rajat muodostavat dokumentoidun pyyntösopimuksen; muut pyyntökentät säilytetään valittua mallia varten."
          },
          "lifecycle": {
            "cancel_endpoint": null,
            "completed_states": [
              "success"
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}/content",
                "query": {
                  "index": "actual output index; default 0"
                }
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}/content",
                "query": {
                  "index": "actual output index; default 0"
                }
              }
            ],
            "content_pending": "Original status JSON until publication.",
            "content_ready": {
              "http_status": 303,
              "location": "actual signed Ailoot-owned asset URL"
            },
            "create": {
              "http": "POST",
              "path": "/v1/videos"
            },
            "failed_states": [],
            "id_source": "Use the actual returned public id or X-Ailoot-Task-Id and polling_url. Keep task_id/provider_task_id separate; status lookup can retain the original task identity when the native fetch omits it.",
            "mode": "submit_once_poll_original",
            "owned_result": {
              "http": "GET",
              "path": "/v1/media/assets/{asset_id}"
            },
            "pending_states": [
              "created"
            ],
            "signed_asset_lifetime_seconds": 86400,
            "state_field": "state",
            "status": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}"
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}"
              }
            ],
            "submit_status": 200,
            "unknown": "The pinned declaration enumerates no terminal failure state. Preserve original response/headers/id and check that same operation for any unrecognized state or result_pending_check error; never resubmit an unknown creation.",
            "unknown_no_replay": true
          },
          "manufacturer_capability": {
            "documented_material_types": [
              "text"
            ]
          },
          "method": {
            "http": "POST",
            "path": "/v1/videos"
          },
          "method_aliases": [
            "/v1/videos/generations"
          ],
          "operation_modes": [
            "text_to_video"
          ],
          "output": {
            "additional_media_boundary": "Only creations[].url is selected for owned video delivery. No owned cover-image or callback result flow is established.",
            "all_results": "Download every actual returned URL in creations[].url; a content index identifies one real returned output.",
            "every_actual_output": true,
            "family": "video",
            "fields": [
              {
                "description": "Returned public Ailoot task or operation identifier.",
                "name": "id",
                "type": "string"
              },
              {
                "description": "Original task identifier, separate from the public id.",
                "name": "provider_task_id",
                "type": "string"
              },
              {
                "description": "Returned Ailoot lookup path for the original task.",
                "name": "polling_url",
                "type": "string"
              },
              {
                "description": "Original identifier present in the creation response.",
                "name": "task_id",
                "type": "string when supplied"
              },
              {
                "description": "Native task state: created for the pinned pending state and success for completion.",
                "name": "state",
                "type": "string when supplied"
              },
              {
                "description": "Task diagnostic; the saved specification declares no enumerated error-code list.",
                "name": "err_code",
                "type": "string when supplied"
              },
              {
                "description": "Every selected completed video URL is replaced with an Ailoot-owned signed URL.",
                "name": "creations[].url",
                "type": "string|string[]"
              },
              {
                "description": "Returned video duration; inspect the actual completed result.",
                "name": "creations[].video.duration",
                "type": "number when supplied"
              },
              {
                "description": "Returned frame rate; no fixed frame rate is promised.",
                "name": "creations[].video.fps",
                "type": "integer when supplied"
              },
              {
                "description": "Returned output width in pixels.",
                "name": "creations[].video.resolution.width",
                "type": "integer when supplied"
              },
              {
                "description": "Returned output height in pixels.",
                "name": "creations[].video.resolution.height",
                "type": "integer when supplied"
              }
            ],
            "format": null,
            "maximum_outputs": null,
            "ownership": "Selected video outputs are copied, reopened and SHA256/length/positive-duration checked before publication.",
            "result": "JSON retains the native state and creations array, with public id/provider_task_id/polling_url added. Selected video URLs are blank before publication and become Ailoot-owned signed URLs after completion."
          }
        },
        "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": "Tämä arvio ei ole lisämaksu eikä valmistuneen generoinnin kiinteä hinta.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Arvioitu luontikustannus",
            "units": [
              {
                "amount": "5.12",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "5.12",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\ncat > request.json <<'JSON_REQUEST'\n{\"model\":\"viduq2\",\"prompt\":\"In an ultra-realistic fashion photography style featuring light blue and pale amber tones, an astronaut in a spacesuit walks through the fog. The background consists of enchanting white and golden lights, creating a minimalist still life and an impressive panoramic scene.\"}\nJSON_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\n",
            "label": "curl · create video",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_POLL'\nimport json\nfrom pathlib import Path\nfrom urllib.parse import quote,urljoin,urlsplit\nr=json.loads(Path(\"result.json\").read_text())\ni=r.get(\"id\")\nif not isinstance(i,str) or not i:raise SystemExit(\"Keep original response/headers/id; do not resubmit creation.\")\nu=urljoin(\"https://api.ailoot.ai\",r.get(\"polling_url\") or \"/v1/videos/\"+quote(i,safe=\"\"))\np=urlsplit(u)\nif p.scheme!=\"https\" or p.netloc!=\"api.ailoot.ai\" or not p.path.startswith(\"/v1/videos/\"):raise SystemExit(\"Use the actual Ailoot lookup path.\")\nPath(\"poll-url.txt\").write_text(u)\nPY_POLL\ncurl --fail-with-body --silent --show-error \"$(cat poll-url.txt)\" -H \"Authorization: Bearer $AILOOT_API_KEY\" -D status-headers.txt -o status.json\n",
            "label": "curl · read original task",
            "language": "bash"
          },
          {
            "code": "set -eu\npython3 - <<'PY_ASSETS'\nimport json\nfrom pathlib import Path\nfrom urllib.parse import urlsplit\nr=json.loads(Path(\"status.json\").read_text())\nif r.get(\"state\")!=\"success\":raise SystemExit(\"Poll the same original job until its owned result is returned.\")\ncreations=r.get(\"creations\")\nif not isinstance(creations,list) or not creations:raise SystemExit(\"No completed video creations.\")\nurls=[]\nfor item in creations:\n    value=item.get(\"url\") if isinstance(item,dict) else None\n    values=[value] if isinstance(value,str) else value\n    if not isinstance(values,list) or not values:raise SystemExit(\"No completed video URL.\")\n    for u in values:\n        if not isinstance(u,str):raise SystemExit(\"Invalid returned URL.\")\n        p=urlsplit(u)\n        if p.scheme!=\"https\" or p.netloc!=\"api.ailoot.ai\" or not p.path.startswith(\"/v1/media/assets/\") or not p.path.endswith(\"/content\") or not p.query:raise SystemExit(\"Wait for the actual Ailoot-owned signed result.\")\n        urls.append(u)\nPath(\"asset-urls.txt\").write_text(\"\\n\".join(urls)+\"\\n\")\nPY_ASSETS\nindex=0\nwhile IFS= read -r asset_url; do\n  curl --fail-with-body --silent --show-error \"$asset_url\" -o \"video-${index}.bin\"\n  index=$((index + 1))\ndone < asset-urls.txt\n",
            "label": "curl · download every owned video",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "videos",
        "hints": [
          "Create once and retain the returned public id and polling_url.",
          "Poll the original operation and read state; success and an owned creations[].url result are the completion boundary.",
          "Download every returned owned video URL; do not infer a fixed output count, duration or frame rate from the example."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text"
        ],
        "label": "Videot",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [
          "/v1/videos/generations"
        ],
        "out": null,
        "output": [
          "video"
        ],
        "path": "/v1/videos",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "original_invoice_usd",
          "image_input_price": null,
          "image_output_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "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": "5.12",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "5.12",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "request_model_id": "viduq2",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/videos/{request_id}",
          "GET /v1/videos/generations/{request_id}",
          "GET /v1/videos/{request_id}/content",
          "GET /v1/videos/generations/{request_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "5.12",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "5.12",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ]
      }
    }
  ],
  "model_id": "viduq2",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "aab242ba3b968400bb0269db88e6749e7b1b56ed96b83cf202e479cf1edd6c6e",
    "input_html_sha256": "8f9cc028e3647ffc973fc17e831dcbfc0d5682982c8ce69da6e66415ce7fa9d6",
    "private_audit_sha256": "4341709efe7ebde71d89dfaaa2013a7a942f5796613954dcd2a93dcbda17f892",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/fi/viduq2/",
    "description": "Vidu Q2 luo videoita tekstimuotoisesta kohtauskuvauksesta. Kesto on 1–10 sekuntia, tuloksen resoluutio 540p, 720p tai 1080p ja kuvasuhteita on viisi. Tämä täsmällinen viduq2-profiili käyttää kehotetta tyylin ja liikkeen määrittämiseen ja palauttaa tuloksen asynkronisen tehtävän kautta.",
    "locale": "fi",
    "md_url": "https://ailoot.ai/models/fi/viduq2/index.md",
    "title": "Vidu: Q2 Text-to-Video — Ailoot",
    "url": "https://ailoot.ai/models/fi/viduq2/"
  },
  "rawModel": {
    "about": "Vidu Q2 luo videoita kirjoitetusta kohtauksesta tekstistä videoksi -profiililla, joka valitaan tunnuksella viduq2. Pakolliset syötteet ovat täsmällinen mallitunnus ja kohtausta kuvaava kehote. Käytä sitä lyhyeen tuoteideaan, paikan esittelevään yleiskuvaan tai hahmon toimintaan, jonka ulkonäön ja liikkeen voi määrittää sanoin. Tämä määritetty menetelmä luo videoita tekstistä; sen kuvaus ei liitä valitsimeen erillistä kuvaviite- tai videonmuokkaustilaa.\n\nRakenna kuvaus näkyvän tapahtumaketjun ympärille. Nimeä kohde, paikka, toiminta, kuvakoko, kameran liike ja lopullinen sommitelma. Kuvaa tuoteideassa pöydällä oleva esine, sen materiaalin yli liikkuva valo ja hidas kameran lähestyminen, joka päättyy tunnistettavaan yksityiskohtaan. Paikkaa esittelevässä kohtauksessa näytä ympäristö ennen siirtymistä huomion kohteeseen. Sovita toiminta valittuun leikkeen pituuteen, jotta kohtauksessa on tilaa suunnitellulle lopetukselle.\n\nKehotteen enimmäispituus on 2,000 merkkiä. Kerro tärkein kohde ja toiminta ensin ja lisää sitten valaistus, materiaali, ympäristö ja kameran yksityiskohdat, jotka muuttavat haluttua tulosta. Määritä visuaalinen tyyli kehotteessa. Q2-kohtainen ohje kertoo, että erilliset style- ja movement_amplitude-parametrit eivät vaikuta tässä mallissa, joten general- tai anime-esiasetus ja liikkeen voimakkuuden valinnat eivät korvaa selkeää kohtauskuvausta.\n\nMallikohtainen kestoasetus hyväksyy kokonaisia sekunteja yhdestä kymmeneen. Q2-kohtaiset resoluutiovaihtoehdot ovat 540p, 720p ja 1080p, ja dokumentoitu oletus on 720p. Valitse kesto ja resoluutio yhdessä toiminnan ja kohdekäytön mukaan. Lyhyt paljastus ja pidempi liike tarvitsevat erilaisen ajoituksen; pyydetyn keston kasvattamisen tulee palvella näkyvää tapahtumaketjua eikä vain venyttää muuttumatonta kuvausta. Tarkista palautetun leikkeen todelliset mitat ja pituus, kun valmistelet lopullista sijoittelua.\n\nDokumentoidut aspect_ratio-vaihtoehdot ovat 16:9, 9:16, 3:4, 4:3 ja 1:1, ja oletus on 16:9. Ohje sisältää nimenomaisesti kuvasuhteet 3:4 ja 4:3 Q2-perheelle. Valitse kuvasuhde ennen luomista ja kuvaa siihen sopiva sommitelma: pidä pääkohde selkeästi hahmotettavana pystykuvassa tai käytä vaakakuvan leveyttä ympäristön esittämiseen. Jätä loppunäkymä riittävän selkeäksi aiottua sivua, esitystä tai myöhempää tekstitystä varten.\n\nseed-kenttä ohjaa vaihtelua. Kentän jättäminen pois tai arvon 0 antaminen valitsee satunnaisen arvon; nollasta poikkeava arvo valitsee dokumentoidun kiinteän seed-arvon toistettavaa luomista varten. Säilytä palautettu seed kehotteen ja asetusten kanssa, kun vertaat versioita. Yhteinen toiminto dokumentoi myös audio- ja off_peak-asetukset nimenomaan Q3-malleille. Nämä Q3-valinnat eivät ole tämän Q2-profiilin ominaisuuksia; suunnittele pyyntö sen dokumentoidun tekstisyötteen ja videotuloksen ympärille.\n\nLuominen on asynkronista. Lähetys palauttaa kentän task_id ja alkutilan; uudelle tehtävälle käytetään arvoa created. Säilytä tehtävän tunniste, kun seuraat käsittelyä. Dokumentoitu tuloskysely käyttää onnistuneelle tulokselle arvoa state=success ja palauttaa creations-taulukon. Kunkin alkion videon URL on kentässä creations[].url; tallenna jokainen palautettu video sen sijaan, että olettaisit tehtävän sisältävän aina täsmälleen yhden luomuksen.\n\nTulosdokumentaatio ilmoittaa myös todellisen videon keston, fps-arvon sekä resoluution leveyden ja korkeuden. Säilytä nämä ilmoitetut arvot valmiin leikkeen mukana sen sijaan, että pitäisit esimerkin kuvataajuutta tai mittoja kiinteänä Q2-määrityksenä. Tehtävän luontivastaus sisältää credits-arvon pyynnön kokoonpanon rinnalla. Säilytä nämä ilmoitetut tehtävän metatiedot ja valmiin tehtävän tunniste tuloksen mukana, jotta jokainen video pysyy yhdistettynä luomisasetuksiinsa.\n\nVertaa koko tapahtumaketjua alkuperäiseen kuvaukseen: kohteen ulkonäköä, esineen muotoa, liikkeen suuntaa, kameran jatkuvuutta ja tavoiteltua loppunäkymää. Nimeä muokkausta varten konkreettinen yksityiskohta, joka ei vastannut kuvausta, ja säilytä kohtauksen onnistuneet osat. Pidä kehote, täsmällinen valitsin, asetukset, tehtävän tunniste ja valmiit videot yhdessä, jotta myöhempi vertailu perustuu todellisiin tuotoksiin.",
    "alias_of": null,
    "aliases": [],
    "author": "Vidu",
    "capabilities": {
      "context_length": 0,
      "manufacturer_input": [
        "text"
      ],
      "manufacturer_output": [
        "video"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "5.12",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "5.12",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ],
        "summary": "Konfiguraation täydet hintatiedot lisätiedoissa."
      }
    ],
    "ctx": null,
    "display_name": "Vidu: Q2 Text-to-Video",
    "formats": [
      "videos"
    ],
    "id": "viduq2",
    "input": [
      "text"
    ],
    "kind": "video",
    "locale": "en",
    "max_out": null,
    "methods": [
      {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "Näytettyjen hintojen avulla arvioidaan kustannukset ennen generointia. Lopullinen veloitus lasketaan alkuperäiselle generoinnille kirjatun kustannuksen perusteella. Lopullisena laskutettavana määränä ei käytetä tulosteen mitattua kestoa eikä ennustettuja määriä.",
          "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": {
            "errors": [
              {
                "condition": "Virheellinen JSON/model, puuttuvat tai tyhjät pakolliset merkkijonot tai virheellinen sisältöindeksi.",
                "http_status": 400,
                "type": "invalid_request_error"
              },
              {
                "condition": "Virheellinen Ailoot API -avain.",
                "http_status": 401,
                "type": "authentication_error"
              },
              {
                "condition": "API-avaimen ryhmällä ei ole käyttöoikeutta tähän mediareittiin.",
                "http_status": 403,
                "type": "permission_error"
              },
              {
                "condition": "Alkuperäinen tehtävä tai pyydetty tulos puuttuu tai ei kuulu samalle käyttäjälle/API-avaimelle/ryhmälle.",
                "http_status": 404,
                "type": "not_found_error"
              },
              {
                "condition": "Alkuperäinen lähetys tai tilatieto on puutteellinen tai sitä ei voida täsmäyttää; säilytä alkuperäinen tunniste äläkä lähetä pyyntöä uudelleen.",
                "http_status": 502,
                "type": "result_pending_check"
              },
              {
                "condition": "Alkuperäistä sidontaa, reittiä tai käyttäjälle kuuluvaa mediaa tarkistetaan edelleen; jatka saman alkuperäisen operaation tarkistamista.",
                "http_status": 503,
                "type": "result_pending_check"
              },
              {
                "condition": "Mediapalvelu tai alkuperäisen tehtävän tallennustila ei ole saatavilla.",
                "http_status": 503,
                "type": "server_error"
              }
            ],
            "ignored_fields": [
              "style",
              "movement_amplitude"
            ],
            "lifecycle": {
              "cancel_endpoint": null,
              "completed_states": [
                "success"
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}/content",
                  "query": {
                    "index": "actual output index; default 0"
                  }
                },
                {
                  "http": "GET",
                  "path": "/v1/videos/generations/{request_id}/content",
                  "query": {
                    "index": "actual output index; default 0"
                  }
                }
              ],
              "content_pending": "Original status JSON until publication.",
              "content_ready": {
                "http_status": 303,
                "location": "actual signed Ailoot-owned asset URL"
              },
              "create": {
                "http": "POST",
                "path": "/v1/videos"
              },
              "failed_states": [],
              "id_source": "Use the actual returned public id or X-Ailoot-Task-Id and polling_url. Keep task_id/provider_task_id separate; status lookup can retain the original task identity when the native fetch omits it.",
              "mode": "submit_once_poll_original",
              "owned_result": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              },
              "pending_states": [
                "created"
              ],
              "signed_asset_lifetime_seconds": 86400,
              "state_field": "state",
              "status": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}"
                },
                {
                  "http": "GET",
                  "path": "/v1/videos/generations/{request_id}"
                }
              ],
              "submit_status": 200,
              "unknown": "Lukittu määrittely ei luettele yhtään lopullista epäonnistumistilaa. Säilytä alkuperäinen vastaus, otsakkeet ja id sekä tarkista sama operaatio, jos tila on tuntematon tai ilmenee result_pending_check-virhe; älä koskaan lähetä tuntemattomaan tilaan jäänyttä luontipyyntöä uudelleen.",
              "unknown_no_replay": true
            },
            "material_combinations": [
              [
                "text"
              ]
            ],
            "operation_modes": [
              "text_to_video"
            ],
            "outputs": {
              "additional_media_boundary": "Only creations[].url is selected for owned video delivery. No owned cover-image or callback result flow is established.",
              "all_results": "Lataa jokainen creations[].url-kentässä todellisuudessa palautettu URL; sisältöindeksi yksilöi yhden todellisen palautetun tuloksen.",
              "every_actual_output": true,
              "family": "video",
              "fields": [
                {
                  "description": "Palautettu julkinen Ailoot-tehtävän tai -operaation tunniste.",
                  "name": "id",
                  "type": "string"
                },
                {
                  "description": "Alkuperäinen tehtävätunniste, joka on erillinen julkisesta id-tunnisteesta.",
                  "name": "provider_task_id",
                  "type": "string"
                },
                {
                  "description": "Palautettu Ailoot-hakupolku alkuperäiselle tehtävälle.",
                  "name": "polling_url",
                  "type": "string"
                },
                {
                  "description": "Luontivastauksessa oleva alkuperäinen tunniste.",
                  "name": "task_id",
                  "type": "string when supplied"
                },
                {
                  "description": "Natiivi tehtävätila: created lukitulle odotustilalle ja success valmistumiselle.",
                  "name": "state",
                  "type": "string when supplied"
                },
                {
                  "description": "Tehtävän diagnostiikkatiedot; tallennettu määrittely ei sisällä virhekoodien luetteloa.",
                  "name": "err_code",
                  "type": "string when supplied"
                },
                {
                  "description": "Jokainen valittu valmistuneen videon URL korvataan Ailoot-palvelun hallinnoimalla allekirjoitetulla URL-osoitteella.",
                  "name": "creations[].url",
                  "type": "string|string[]"
                },
                {
                  "description": "Palautettu videon kesto; tarkista todellinen valmistunut tulos.",
                  "name": "creations[].video.duration",
                  "type": "number when supplied"
                },
                {
                  "description": "Palautettu kuvataajuus; kiinteää kuvataajuutta ei luvata.",
                  "name": "creations[].video.fps",
                  "type": "integer when supplied"
                },
                {
                  "description": "Palautetun tuloksen leveys pikseleinä.",
                  "name": "creations[].video.resolution.width",
                  "type": "integer when supplied"
                },
                {
                  "description": "Palautetun tuloksen korkeus pikseleinä.",
                  "name": "creations[].video.resolution.height",
                  "type": "integer when supplied"
                }
              ],
              "format": null,
              "maximum_outputs": null,
              "ownership": "Selected video outputs are copied, reopened and SHA256/length/positive-duration checked before publication.",
              "result": "JSON säilyttää natiivin state-kentän ja creations-taulukon, ja siihen lisätään julkinen id/provider_task_id/polling_url. Valitut video-osoitteet ovat tyhjiä ennen julkaisua ja muuttuvat Ailoot-palvelun hallinnoimiksi allekirjoitetuiksi osoitteiksi valmistumisen jälkeen."
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "viduq2"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "Kuvaile luotava kohtaus. Dokumentoitu raja on 2000 merkkiä; Ailoot tarkistaa, että merkkijono ei ole tyhjä, ja säilyttää tekstin.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maxLength": 2000,
                "minLength": 1,
                "name": "prompt",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "Mallikohtainen viduq2-kuvaus määrittää kestoksi 1–10 kokonaista sekuntia. Mallikohtaista oletuskestoa ei ole dokumentoitu.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum": 10,
                "minimum": 1,
                "name": "duration",
                "required": false,
                "type": "integer",
                "unit": "sekuntia"
              },
              {
                "availability": "source_interface",
                "conditions": "Jätä pois tai lähetä merkkijono \"0\" satunnaisuutta varten. Annettu nollasta poikkeava seed valitsee dokumentoidun kiinteää seed-arvoa käyttävän toiminnan; numeerista vaihteluväliä ei ole määritetty.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "seed",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": "16:9",
                "default_known": true,
                "enum": [
                  "16:9",
                  "9:16",
                  "3:4",
                  "4:3",
                  "1:1"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "Mallikohtainen viduq2-luettelo dokumentoi nämä luokat kestolle 1–10 sekuntia. Yhteinen enum ja taulukko mainitsevat myös arvon 360p; sen sovellettavuus on ristiriidassa luettelon kanssa, eikä sitä vahvisteta tässä.",
                "default": "720p",
                "default_known": true,
                "enum": [
                  "540p",
                  "720p",
                  "1080p"
                ],
                "enum_known": true,
                "name": "resolution",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "Yhteinen pyyntörakenne hyväksyy tämän kentän, mutta dokumentaatio toteaa nimenomaisesti, ettei sillä ole vaikutusta viduq2-malliin.",
                "default": "general",
                "default_known": true,
                "enum": [
                  "general",
                  "anime"
                ],
                "enum_known": true,
                "name": "style",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "Yhteinen pyyntörakenne hyväksyy tämän kentän, mutta dokumentaatio toteaa nimenomaisesti, ettei sillä ole vaikutusta q2-malleihin.",
                "default": "auto",
                "default_known": true,
                "enum": [
                  "auto",
                  "small",
                  "medium",
                  "large"
                ],
                "enum_known": true,
                "name": "movement_amplitude",
                "required": false,
                "type": "string"
              }
            ],
            "profile_binding": "Literal viduq2 model with the documented Ailoot videos interface.",
            "request_schema": {
              "additionalProperties": true,
              "properties": {
                "aspect_ratio": {
                  "default": "16:9",
                  "enum": [
                    "16:9",
                    "9:16",
                    "3:4",
                    "4:3",
                    "1:1"
                  ],
                  "type": "string"
                },
                "duration": {
                  "maximum": 10,
                  "minimum": 1,
                  "type": "integer"
                },
                "model": {
                  "const": "viduq2",
                  "minLength": 1,
                  "type": "string"
                },
                "movement_amplitude": {
                  "default": "auto",
                  "enum": [
                    "auto",
                    "small",
                    "medium",
                    "large"
                  ],
                  "type": "string"
                },
                "prompt": {
                  "maxLength": 2000,
                  "minLength": 1,
                  "type": "string"
                },
                "resolution": {
                  "default": "720p",
                  "enum": [
                    "540p",
                    "720p",
                    "1080p"
                  ],
                  "type": "string"
                },
                "seed": {
                  "type": "string"
                },
                "style": {
                  "default": "general",
                  "enum": [
                    "general",
                    "anime"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt"
              ],
              "type": "object"
            },
            "source_ambiguities": [
              "The shared enum and table mention 360p, while the model-specific viduq2 resolution description lists 540p/720p/1080p. The method asserts only the explicit model-specific list.",
              "The shared duration example uses a quoted string despite an integer schema. The copyable viduq2 example omits that optional field; an explicit duration follows the documented integer type.",
              "No model-specific default duration, maximum output count, generated-file retention period, cancellation endpoint or terminal failure-state list is established by these saved documents.",
              "The documented fetch uses an id path parameter; the pinned declaration names that same substituted value task_id. The fetch example has no task_id field, which the current client accepts only by retaining the original task identity."
            ],
            "unsupported": [
              "Image-guided input, video editing and extension are not part of this text-to-video method.",
              "The audio and off_peak parameters are documented only for other model selectors, not viduq2.",
              "No live streaming, callback completion or owned cover-image result contract is established here."
            ]
          },
          "hints": [
            "Luo kerran ja säilytä palautettu julkinen id ja polling_url.",
            "Kysy alkuperäisen operaation tilaa ja lue state; valmistuminen edellyttää success-tilaa ja käyttäjälle kuuluvaa creations[].url-tulosta.",
            "Lataa video jokaisesta palautetusta käyttäjälle kuuluvasta URL-osoitteesta; älä päättele esimerkistä kiinteää tulosmäärää, kestoa tai kuvataajuutta."
          ],
          "input": {
            "additional_properties": true,
            "content_type": "application/json",
            "material_types": [
              "text"
            ],
            "optional": [
              "duration",
              "seed",
              "aspect_ratio",
              "resolution",
              "style",
              "movement_amplitude"
            ],
            "required": [
              "model",
              "prompt"
            ],
            "validation_scope": "Ailoot validoi ei-tyhjät model/prompt-merkkijonot. Alla olevat valinnaiset tyypit ja rajat muodostavat dokumentoidun pyyntösopimuksen; muut pyyntökentät säilytetään valittua mallia varten."
          },
          "lifecycle": {
            "cancel_endpoint": null,
            "completed_states": [
              "success"
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}/content",
                "query": {
                  "index": "actual output index; default 0"
                }
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}/content",
                "query": {
                  "index": "actual output index; default 0"
                }
              }
            ],
            "content_pending": "Original status JSON until publication.",
            "content_ready": {
              "http_status": 303,
              "location": "actual signed Ailoot-owned asset URL"
            },
            "create": {
              "http": "POST",
              "path": "/v1/videos"
            },
            "failed_states": [],
            "id_source": "Use the actual returned public id or X-Ailoot-Task-Id and polling_url. Keep task_id/provider_task_id separate; status lookup can retain the original task identity when the native fetch omits it.",
            "mode": "submit_once_poll_original",
            "owned_result": {
              "http": "GET",
              "path": "/v1/media/assets/{asset_id}"
            },
            "pending_states": [
              "created"
            ],
            "signed_asset_lifetime_seconds": 86400,
            "state_field": "state",
            "status": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}"
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}"
              }
            ],
            "submit_status": 200,
            "unknown": "The pinned declaration enumerates no terminal failure state. Preserve original response/headers/id and check that same operation for any unrecognized state or result_pending_check error; never resubmit an unknown creation.",
            "unknown_no_replay": true
          },
          "manufacturer_capability": {
            "documented_material_types": [
              "text"
            ]
          },
          "method": {
            "http": "POST",
            "path": "/v1/videos"
          },
          "method_aliases": [
            "/v1/videos/generations"
          ],
          "operation_modes": [
            "text_to_video"
          ],
          "output": {
            "additional_media_boundary": "Only creations[].url is selected for owned video delivery. No owned cover-image or callback result flow is established.",
            "all_results": "Download every actual returned URL in creations[].url; a content index identifies one real returned output.",
            "every_actual_output": true,
            "family": "video",
            "fields": [
              {
                "description": "Returned public Ailoot task or operation identifier.",
                "name": "id",
                "type": "string"
              },
              {
                "description": "Original task identifier, separate from the public id.",
                "name": "provider_task_id",
                "type": "string"
              },
              {
                "description": "Returned Ailoot lookup path for the original task.",
                "name": "polling_url",
                "type": "string"
              },
              {
                "description": "Original identifier present in the creation response.",
                "name": "task_id",
                "type": "string when supplied"
              },
              {
                "description": "Native task state: created for the pinned pending state and success for completion.",
                "name": "state",
                "type": "string when supplied"
              },
              {
                "description": "Task diagnostic; the saved specification declares no enumerated error-code list.",
                "name": "err_code",
                "type": "string when supplied"
              },
              {
                "description": "Every selected completed video URL is replaced with an Ailoot-owned signed URL.",
                "name": "creations[].url",
                "type": "string|string[]"
              },
              {
                "description": "Returned video duration; inspect the actual completed result.",
                "name": "creations[].video.duration",
                "type": "number when supplied"
              },
              {
                "description": "Returned frame rate; no fixed frame rate is promised.",
                "name": "creations[].video.fps",
                "type": "integer when supplied"
              },
              {
                "description": "Returned output width in pixels.",
                "name": "creations[].video.resolution.width",
                "type": "integer when supplied"
              },
              {
                "description": "Returned output height in pixels.",
                "name": "creations[].video.resolution.height",
                "type": "integer when supplied"
              }
            ],
            "format": null,
            "maximum_outputs": null,
            "ownership": "Selected video outputs are copied, reopened and SHA256/length/positive-duration checked before publication.",
            "result": "JSON retains the native state and creations array, with public id/provider_task_id/polling_url added. Selected video URLs are blank before publication and become Ailoot-owned signed URLs after completion."
          }
        },
        "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": "Tämä arvio ei ole lisämaksu eikä valmistuneen generoinnin kiinteä hinta.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Arvioitu luontikustannus",
            "units": [
              {
                "amount": "5.12",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "5.12",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\ncat > request.json <<'JSON_REQUEST'\n{\"model\":\"viduq2\",\"prompt\":\"In an ultra-realistic fashion photography style featuring light blue and pale amber tones, an astronaut in a spacesuit walks through the fog. The background consists of enchanting white and golden lights, creating a minimalist still life and an impressive panoramic scene.\"}\nJSON_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\n",
            "label": "curl · create video",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_POLL'\nimport json\nfrom pathlib import Path\nfrom urllib.parse import quote,urljoin,urlsplit\nr=json.loads(Path(\"result.json\").read_text())\ni=r.get(\"id\")\nif not isinstance(i,str) or not i:raise SystemExit(\"Keep original response/headers/id; do not resubmit creation.\")\nu=urljoin(\"https://api.ailoot.ai\",r.get(\"polling_url\") or \"/v1/videos/\"+quote(i,safe=\"\"))\np=urlsplit(u)\nif p.scheme!=\"https\" or p.netloc!=\"api.ailoot.ai\" or not p.path.startswith(\"/v1/videos/\"):raise SystemExit(\"Use the actual Ailoot lookup path.\")\nPath(\"poll-url.txt\").write_text(u)\nPY_POLL\ncurl --fail-with-body --silent --show-error \"$(cat poll-url.txt)\" -H \"Authorization: Bearer $AILOOT_API_KEY\" -D status-headers.txt -o status.json\n",
            "label": "curl · read original task",
            "language": "bash"
          },
          {
            "code": "set -eu\npython3 - <<'PY_ASSETS'\nimport json\nfrom pathlib import Path\nfrom urllib.parse import urlsplit\nr=json.loads(Path(\"status.json\").read_text())\nif r.get(\"state\")!=\"success\":raise SystemExit(\"Poll the same original job until its owned result is returned.\")\ncreations=r.get(\"creations\")\nif not isinstance(creations,list) or not creations:raise SystemExit(\"No completed video creations.\")\nurls=[]\nfor item in creations:\n    value=item.get(\"url\") if isinstance(item,dict) else None\n    values=[value] if isinstance(value,str) else value\n    if not isinstance(values,list) or not values:raise SystemExit(\"No completed video URL.\")\n    for u in values:\n        if not isinstance(u,str):raise SystemExit(\"Invalid returned URL.\")\n        p=urlsplit(u)\n        if p.scheme!=\"https\" or p.netloc!=\"api.ailoot.ai\" or not p.path.startswith(\"/v1/media/assets/\") or not p.path.endswith(\"/content\") or not p.query:raise SystemExit(\"Wait for the actual Ailoot-owned signed result.\")\n        urls.append(u)\nPath(\"asset-urls.txt\").write_text(\"\\n\".join(urls)+\"\\n\")\nPY_ASSETS\nindex=0\nwhile IFS= read -r asset_url; do\n  curl --fail-with-body --silent --show-error \"$asset_url\" -o \"video-${index}.bin\"\n  index=$((index + 1))\ndone < asset-urls.txt\n",
            "label": "curl · download every owned video",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "videos",
        "hints": [
          "Create once and retain the returned public id and polling_url.",
          "Poll the original operation and read state; success and an owned creations[].url result are the completion boundary.",
          "Download every returned owned video URL; do not infer a fixed output count, duration or frame rate from the example."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text"
        ],
        "label": "Videot",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [
          "/v1/videos/generations"
        ],
        "out": null,
        "output": [
          "video"
        ],
        "path": "/v1/videos",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "original_invoice_usd",
          "image_input_price": null,
          "image_output_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "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": "5.12",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "5.12",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "request_model_id": "viduq2",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/videos/{request_id}",
          "GET /v1/videos/generations/{request_id}",
          "GET /v1/videos/{request_id}/content",
          "GET /v1/videos/generations/{request_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "5.12",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "5.12",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "viduq2",
        "request_model_id": "viduq2",
        "route_label": "Ultra"
      }
    ],
    "name": "Vidu: Q2 Text-to-Video",
    "price": {
      "estimate_only": true,
      "in": null,
      "in_label": null,
      "out": 5.12,
      "out_label": "estimate before generation",
      "scope_label": "Estimated generation cost",
      "sort_in": null,
      "sort_out": 5.12,
      "varies": false
    },
    "short": "Vidu Q2 luo videoita tekstimuotoisesta kohtauskuvauksesta. Kesto on 1–10 sekuntia, tuloksen resoluutio 540p, 720p tai 1080p ja kuvasuhteita on viisi. Tämä täsmällinen viduq2-profiili käyttää kehotetta tyylin ja liikkeen määrittämiseen ja palauttaa tuloksen asynkronisen tehtävän kautta."
  },
  "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": "Vidu Q2 luo videoita tekstimuotoisesta kohtauskuvauksesta. Kesto on 1–10 sekuntia, tuloksen resoluutio 540p, 720p tai 1080p ja kuvasuhteita on viisi. Tämä täsmällinen viduq2-profiili käyttää kehotetta tyylin ja liikkeen määrittämiseen ja palauttaa tuloksen asynkronisen tehtävän kautta.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "486006992ebea1d8c0864fd9f076c9c426f6059c92f7b43bacdfb553a5a92563",
    "renderer_sha256": "303a59603e2bc29ba8fda690e95fd32cec68de223d92e26054a88babff801dd7"
  },
  "sourceRevision": "fa109947af393a6fcafff3e6f067b1220436f88ba90cce795aeade8a6810898f"
}
