{
  "aboutHtml": "<p>Sora 2 er OpenAI&#39;s model til generering af video og lyd i dynamiske klip ud fra en skriftlig scenebeskrivelse eller et referencebillede. Den genererer billedsekvensen sammen med synkroniseret tale, effekter og baggrundslyd. Standardprofilen Sora 2 er rettet mod visuel udforskning, konceptudvikling, prototyper og grovklip. Sora 2 Pro er en særskilt udgave, der sigter mod større visuel præcision og færdiggørelse i højere opløsning.</p><h4>Beskriv en indstilling, der kan ses og høres</h4><p>Producentens promptvejledning opbygger en nyttig opgavebeskrivelse omkring billedudsnit, motiv, handling, omgivelser og lys. Giv scenen en sammenhængende visuel stil, og beskriv derefter bevægelsen i tydelige handlingsled. Et originalt produktkoncept kan eksempelvis vise en lille mekanisk genstand, der drejer én omgang på et arbejdsbord, mens kameraet langsomt nærmer sig, med blødt vindueslys og en diskret motorlyd. Angiv, hvad seeren skal bemærke, og hvordan handlingen slutter.</p><p>Gør kamerabevægelsen og motivets handling i hver indstilling forståelige. En kompliceret sekvens kan opdeles i særskilte indstillingsblokke med hvert sit billedudsnit, sin handling og sin belysning. Bevar de samme motivdetaljer og den samme farvepalet, når flere klip skal danne én sekvens. Vejledningen fremhæver, at kortere indstillinger generelt følger instruktionerne mere pålideligt, og at gentagen generering med samme prompt giver forskellige optagelser.</p><p>Modellens lancering beskriver forbedret fysisk adfærd og kontinuitet mellem indstillinger, herunder realistiske, filmiske og animeprægede stilarter. Det er tilsigtede egenskaber, som skal instrueres og vurderes. Gennemgå bevægelse, kontakt mellem objekter, proportioner og kontinuitet frem for at antage, at et plausibelt første billede garanterer en sammenhængende sekvens. Hvis en handling er uklar, skal du forenkle den og give den en synlig begyndelse og afslutning.</p><h4>Instruér dialog og lyd hver for sig</h4><p>Angiv replikker adskilt fra den visuelle beskrivelse, og mærk talerne konsekvent. Hold dialogen kort nok til at passe til handlingen og den ønskede kliplængde. I en animation med to figurer kan du lade et kort spørgsmål og svar skifte frem for at forsøge at rumme en lang tale i en kort indstilling. Vejledningen advarer om, at kompleks og lang dialog kan forstyrre tempo og synkronisering.</p><p>Beskriv scenens lydmiljø: lyden af en lille bevægelse, rummets atmosfære eller rytmen i en effekt fra omgivelserne. Forklar, hvilken lyd der skal falde sammen med handlingen. Lyt til den resulterende tale og effekterne sammen med billedet, og kontrollér, hvem der taler, ordlyden og timingen. Synkroniseret lyd er en del af det genererede klip frem for et særskilt tekstsvar.</p><h4>Størrelse, varighed og en billedstyret begyndelse</h4><p>Standardmodellens dokumenterede outputstørrelser er 720×1280 i højformat og 1280×720 i bredformat. Pro-profilens størrelser i højere opløsning må ikke tilskrives standardudgaven Sora 2. Størrelse og varighed er udtrykkelige indstillinger i anmodningen; det ændrer ikke disse indstillinger at skrive en anden størrelse eller bede om en længere film i prompten. Oprettelsesreferencen angiver klipindstillinger på 4, 8 og 12 sekunder, så vælg et kort, defineret handlingsled, når en indstilling forberedes. Den udvidede producentarbejdsgang dokumenterer også klipindstillinger på 16 og 20 sekunder.</p><p>Et referencebillede forankrer det første billede i videoen, og teksten beskriver, hvad der sker derefter. Producenten understøtter JPEG-, PNG- og WebP-referencer og kræver, at billedet svarer til målvideoens størrelse. Forbered motiv, omgivelser og komposition i dette åbningsbillede, og bed derefter om en bestemt bevægelse. Dette er en reference for åbningsbilledet frem for en garanti for, at alle detaljer bevares gennem hele klippet.</p><h4>Genbrugelige ikke-menneskelige figurer</h4><p>Den udvidede producentarbejdsgang kan oprette et genbrugeligt figuraktiv ud fra en kort referencevideo af et dyr, en maskot eller en genstand. Forberedelsesvejledningen foreskriver et MP4-klip på cirka to til fire sekunder, i 720p til 1080p og i 16:9 eller 9:16. Samme billedformat i kilde og output hjælper med at undgå et strakt udseende. Genereringen kan referere til op til to figurer.</p><p>Bevar figurens id, og nævn dens navn i prompten; alene at sende id&#39;et opfylder ikke vejledningens fulde forberedelse. Figuraktiver kan ledsage en billedstyret generering, men videoforlængelser accepterer dem ikke. Producenten blokerer som standard figuruploads med menneskelig lighed og afviser referencebilleder med menneskeansigter i det dokumenterede API-forløb. Sora-appens funktioner til personlige figurer er en særskilt produktarbejdsgang.</p><h4>Fortsæt eller redigér et færdigt klip</h4><p>En forlængelse modtager en færdig kildevideo og en fortsættelsesprompt og bruger hele kildeklippet som kontekst for bevægelse, kameraretning og scenekontinuitet. Vejledningen beskriver tilføjelser på op til 20 sekunder pr. forlængelse. Det dokumenterede input til forlængelse er kildevideoen og tekst; yderligere figur- eller billedreferencer er udelukket i denne tilstand. Beskriv, hvordan den eksisterende handling fortsætter, frem for at indføre en uvedkommende scene uden overgang.</p><p>Videoredigering retter sig mod en tydelig ændring i et eksisterende klip. En fokuseret revision kan ændre et objekts farve eller scenens farvepalet, mens resten af indstillingen bevares. Producentvejledningen anbefaler én veldefineret ændring ad gangen og skelner mellem redigering af en genereret video og upload af vilkårlige optagelser, som har en særskilt betingelse for berettigelse. Behold den færdige kilde, og identificér den præcise revision, der er nødvendig, før du foretager endnu en redigering.</p><h4>Renderingsjob og den færdige video</h4><p>Producentens dokumenterede videoforløb er asynkront: et indsendt job kan stå i kø eller være i gang, før det fuldføres eller fejler. Et fuldført job giver en MP4-video; miniaturebilleder og spriteark understøtter forhåndsvisning og gennemsyn. Bevar forbindelsen mellem jobbets identitet, prompten, referencerne og de returnerede aktiver. Det første jobsvar er ikke den endelige video, der kan afspilles.</p><p>Den almindelige downloadarbejdsgang beskriver en gyldighed på én time for download-URL&#39;en. Den udvidede batcharbejdsgang forbereder uafhængige JSON-renderingsanmodninger med stabile element-id&#39;er, uploadede referencer og et resultat, der føres tilbage til hver indstilling; dens færdige aktiver har en særskilt downloadperiode på op til 24 timer. Gem det færdige klip hurtigt, og undersøg det faktiske billede og den faktiske lyd, før du behandler det som en valgt optagelse.</p><p>Producentens dokumenterede indholdsbegrænsninger for API&#39;et kræver materiale, der egner sig til seere under 18 år, og afviser ophavsretligt beskyttede figurer eller musik samt generering af virkelige personer. Forbered scene og referencer derefter. Modellens direkte resultat er video med lyd, ikke genererede stillbilleder, et værktøjssvar i en samtale eller en film af ubegrænset længde. Bevar standardmodellens præcise identitet og det accepterede kildeklip, når et visuelt koncept videreføres.</p>",
  "aboutText": "Sora 2 er OpenAI's model til generering af video og lyd i dynamiske klip ud fra en skriftlig scenebeskrivelse eller et referencebillede. Den genererer billedsekvensen sammen med synkroniseret tale, effekter og baggrundslyd. Standardprofilen Sora 2 er rettet mod visuel udforskning, konceptudvikling, prototyper og grovklip. Sora 2 Pro er en særskilt udgave, der sigter mod større visuel præcision og færdiggørelse i højere opløsning.\n\n### Beskriv en indstilling, der kan ses og høres\n\nProducentens promptvejledning opbygger en nyttig opgavebeskrivelse omkring billedudsnit, motiv, handling, omgivelser og lys. Giv scenen en sammenhængende visuel stil, og beskriv derefter bevægelsen i tydelige handlingsled. Et originalt produktkoncept kan eksempelvis vise en lille mekanisk genstand, der drejer én omgang på et arbejdsbord, mens kameraet langsomt nærmer sig, med blødt vindueslys og en diskret motorlyd. Angiv, hvad seeren skal bemærke, og hvordan handlingen slutter.\n\nGør kamerabevægelsen og motivets handling i hver indstilling forståelige. En kompliceret sekvens kan opdeles i særskilte indstillingsblokke med hvert sit billedudsnit, sin handling og sin belysning. Bevar de samme motivdetaljer og den samme farvepalet, når flere klip skal danne én sekvens. Vejledningen fremhæver, at kortere indstillinger generelt følger instruktionerne mere pålideligt, og at gentagen generering med samme prompt giver forskellige optagelser.\n\nModellens lancering beskriver forbedret fysisk adfærd og kontinuitet mellem indstillinger, herunder realistiske, filmiske og animeprægede stilarter. Det er tilsigtede egenskaber, som skal instrueres og vurderes. Gennemgå bevægelse, kontakt mellem objekter, proportioner og kontinuitet frem for at antage, at et plausibelt første billede garanterer en sammenhængende sekvens. Hvis en handling er uklar, skal du forenkle den og give den en synlig begyndelse og afslutning.\n\n### Instruér dialog og lyd hver for sig\n\nAngiv replikker adskilt fra den visuelle beskrivelse, og mærk talerne konsekvent. Hold dialogen kort nok til at passe til handlingen og den ønskede kliplængde. I en animation med to figurer kan du lade et kort spørgsmål og svar skifte frem for at forsøge at rumme en lang tale i en kort indstilling. Vejledningen advarer om, at kompleks og lang dialog kan forstyrre tempo og synkronisering.\n\nBeskriv scenens lydmiljø: lyden af en lille bevægelse, rummets atmosfære eller rytmen i en effekt fra omgivelserne. Forklar, hvilken lyd der skal falde sammen med handlingen. Lyt til den resulterende tale og effekterne sammen med billedet, og kontrollér, hvem der taler, ordlyden og timingen. Synkroniseret lyd er en del af det genererede klip frem for et særskilt tekstsvar.\n\n### Størrelse, varighed og en billedstyret begyndelse\n\nStandardmodellens dokumenterede outputstørrelser er 720×1280 i højformat og 1280×720 i bredformat. Pro-profilens størrelser i højere opløsning må ikke tilskrives standardudgaven Sora 2. Størrelse og varighed er udtrykkelige indstillinger i anmodningen; det ændrer ikke disse indstillinger at skrive en anden størrelse eller bede om en længere film i prompten. Oprettelsesreferencen angiver klipindstillinger på 4, 8 og 12 sekunder, så vælg et kort, defineret handlingsled, når en indstilling forberedes. Den udvidede producentarbejdsgang dokumenterer også klipindstillinger på 16 og 20 sekunder.\n\nEt referencebillede forankrer det første billede i videoen, og teksten beskriver, hvad der sker derefter. Producenten understøtter JPEG-, PNG- og WebP-referencer og kræver, at billedet svarer til målvideoens størrelse. Forbered motiv, omgivelser og komposition i dette åbningsbillede, og bed derefter om en bestemt bevægelse. Dette er en reference for åbningsbilledet frem for en garanti for, at alle detaljer bevares gennem hele klippet.\n\n### Genbrugelige ikke-menneskelige figurer\n\nDen udvidede producentarbejdsgang kan oprette et genbrugeligt figuraktiv ud fra en kort referencevideo af et dyr, en maskot eller en genstand. Forberedelsesvejledningen foreskriver et MP4-klip på cirka to til fire sekunder, i 720p til 1080p og i 16:9 eller 9:16. Samme billedformat i kilde og output hjælper med at undgå et strakt udseende. Genereringen kan referere til op til to figurer.\n\nBevar figurens id, og nævn dens navn i prompten; alene at sende id'et opfylder ikke vejledningens fulde forberedelse. Figuraktiver kan ledsage en billedstyret generering, men videoforlængelser accepterer dem ikke. Producenten blokerer som standard figuruploads med menneskelig lighed og afviser referencebilleder med menneskeansigter i det dokumenterede API-forløb. Sora-appens funktioner til personlige figurer er en særskilt produktarbejdsgang.\n\n### Fortsæt eller redigér et færdigt klip\n\nEn forlængelse modtager en færdig kildevideo og en fortsættelsesprompt og bruger hele kildeklippet som kontekst for bevægelse, kameraretning og scenekontinuitet. Vejledningen beskriver tilføjelser på op til 20 sekunder pr. forlængelse. Det dokumenterede input til forlængelse er kildevideoen og tekst; yderligere figur- eller billedreferencer er udelukket i denne tilstand. Beskriv, hvordan den eksisterende handling fortsætter, frem for at indføre en uvedkommende scene uden overgang.\n\nVideoredigering retter sig mod en tydelig ændring i et eksisterende klip. En fokuseret revision kan ændre et objekts farve eller scenens farvepalet, mens resten af indstillingen bevares. Producentvejledningen anbefaler én veldefineret ændring ad gangen og skelner mellem redigering af en genereret video og upload af vilkårlige optagelser, som har en særskilt betingelse for berettigelse. Behold den færdige kilde, og identificér den præcise revision, der er nødvendig, før du foretager endnu en redigering.\n\n### Renderingsjob og den færdige video\n\nProducentens dokumenterede videoforløb er asynkront: et indsendt job kan stå i kø eller være i gang, før det fuldføres eller fejler. Et fuldført job giver en MP4-video; miniaturebilleder og spriteark understøtter forhåndsvisning og gennemsyn. Bevar forbindelsen mellem jobbets identitet, prompten, referencerne og de returnerede aktiver. Det første jobsvar er ikke den endelige video, der kan afspilles.\n\nDen almindelige downloadarbejdsgang beskriver en gyldighed på én time for download-URL'en. Den udvidede batcharbejdsgang forbereder uafhængige JSON-renderingsanmodninger med stabile element-id'er, uploadede referencer og et resultat, der føres tilbage til hver indstilling; dens færdige aktiver har en særskilt downloadperiode på op til 24 timer. Gem det færdige klip hurtigt, og undersøg det faktiske billede og den faktiske lyd, før du behandler det som en valgt optagelse.\n\nProducentens dokumenterede indholdsbegrænsninger for API'et kræver materiale, der egner sig til seere under 18 år, og afviser ophavsretligt beskyttede figurer eller musik samt generering af virkelige personer. Forbered scene og referencer derefter. Modellens direkte resultat er video med lyd, ikke genererede stillbilleder, et værktøjssvar i en samtale eller en film af ubegrænset længde. Bevar standardmodellens præcise identitet og det accepterede kildeklip, når et visuelt koncept videreføres.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "6d8784386e681af81294e1a8f8aeb45d49ebbe53c1c9b44d3eae15745d84e83c",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "da",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">sora-2</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Luk\">×</button></div><div class=\"idline\"><span>Andet /</span><code>sora-2</code><button type=\"button\" id=\"copy-id\">Kopiér ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Modelkortets afsnit\"><button type=\"button\" data-card-jump=\"overview\">Start</button><button type=\"button\" data-card-jump=\"methods\">Input og metoder</button><button type=\"button\" data-card-jump=\"pricing\">Priser</button><button type=\"button\" data-card-jump=\"examples\">Eksempler</button><button type=\"button\" data-card-jump=\"results\">Resultater</button><button type=\"button\" data-card-jump=\"aliases\">Aliaser</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"API-metoder\"><button type=\"button\" role=\"tab\" tabindex=\"-1\" aria-controls=\"card-method-content\" aria-selected=\"false\" id=\"card-method-tab-0\" data-card-method=\"Ultra|messages|/v1/messages|sora-2\">Messages</button><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-1\" data-card-method=\"Ultra|chat_completions|/v1/chat/completions|sora-2\">Chat Completions</button></div><div id=\"card-method-content\" role=\"tabpanel\" aria-labelledby=\"card-method-tab-1\"><section class=\"card-section\" data-card-section=\"overview\"><h3 tabindex=\"-1\">Start</h3><p class=\"mdesc-full\">Sora 2 skaber video med synkroniseret dialog, lydeffekter og baggrundslyd ud fra tekst eller et referencebillede. Standardprofilen understøtter visuel udforskning og konceptklip med særskilte producentarbejdsgange til genbrugelige ikke-menneskelige figurer, fortsættelse og fokuserede videoredigeringer.</p><dl class=\"card-io\" data-card-io><div><dt>Accepterede input</dt><dd>Tekst</dd></div><div><dt>Resultater</dt><dd>json · sse</dd></div></dl><details class=\"card-about\"><summary>Om modellen</summary><p class=\"note-s\" data-model-method-boundary>Denne beskrivelse dækker modellens funktioner. Tilgængelige input, output og indstillinger i Ailoot står nedenfor for den valgte metode.</p><div class=\"mabout\" id=\"m-about\"><p>Sora 2 er OpenAI&#39;s model til generering af video og lyd i dynamiske klip ud fra en skriftlig scenebeskrivelse eller et referencebillede. Den genererer billedsekvensen sammen med synkroniseret tale, effekter og baggrundslyd. Standardprofilen Sora 2 er rettet mod visuel udforskning, konceptudvikling, prototyper og grovklip. Sora 2 Pro er en særskilt udgave, der sigter mod større visuel præcision og færdiggørelse i højere opløsning.</p><h4>Beskriv en indstilling, der kan ses og høres</h4><p>Producentens promptvejledning opbygger en nyttig opgavebeskrivelse omkring billedudsnit, motiv, handling, omgivelser og lys. Giv scenen en sammenhængende visuel stil, og beskriv derefter bevægelsen i tydelige handlingsled. Et originalt produktkoncept kan eksempelvis vise en lille mekanisk genstand, der drejer én omgang på et arbejdsbord, mens kameraet langsomt nærmer sig, med blødt vindueslys og en diskret motorlyd. Angiv, hvad seeren skal bemærke, og hvordan handlingen slutter.</p><p>Gør kamerabevægelsen og motivets handling i hver indstilling forståelige. En kompliceret sekvens kan opdeles i særskilte indstillingsblokke med hvert sit billedudsnit, sin handling og sin belysning. Bevar de samme motivdetaljer og den samme farvepalet, når flere klip skal danne én sekvens. Vejledningen fremhæver, at kortere indstillinger generelt følger instruktionerne mere pålideligt, og at gentagen generering med samme prompt giver forskellige optagelser.</p><p>Modellens lancering beskriver forbedret fysisk adfærd og kontinuitet mellem indstillinger, herunder realistiske, filmiske og animeprægede stilarter. Det er tilsigtede egenskaber, som skal instrueres og vurderes. Gennemgå bevægelse, kontakt mellem objekter, proportioner og kontinuitet frem for at antage, at et plausibelt første billede garanterer en sammenhængende sekvens. Hvis en handling er uklar, skal du forenkle den og give den en synlig begyndelse og afslutning.</p><h4>Instruér dialog og lyd hver for sig</h4><p>Angiv replikker adskilt fra den visuelle beskrivelse, og mærk talerne konsekvent. Hold dialogen kort nok til at passe til handlingen og den ønskede kliplængde. I en animation med to figurer kan du lade et kort spørgsmål og svar skifte frem for at forsøge at rumme en lang tale i en kort indstilling. Vejledningen advarer om, at kompleks og lang dialog kan forstyrre tempo og synkronisering.</p><p>Beskriv scenens lydmiljø: lyden af en lille bevægelse, rummets atmosfære eller rytmen i en effekt fra omgivelserne. Forklar, hvilken lyd der skal falde sammen med handlingen. Lyt til den resulterende tale og effekterne sammen med billedet, og kontrollér, hvem der taler, ordlyden og timingen. Synkroniseret lyd er en del af det genererede klip frem for et særskilt tekstsvar.</p><h4>Størrelse, varighed og en billedstyret begyndelse</h4><p>Standardmodellens dokumenterede outputstørrelser er 720×1280 i højformat og 1280×720 i bredformat. Pro-profilens størrelser i højere opløsning må ikke tilskrives standardudgaven Sora 2. Størrelse og varighed er udtrykkelige indstillinger i anmodningen; det ændrer ikke disse indstillinger at skrive en anden størrelse eller bede om en længere film i prompten. Oprettelsesreferencen angiver klipindstillinger på 4, 8 og 12 sekunder, så vælg et kort, defineret handlingsled, når en indstilling forberedes. Den udvidede producentarbejdsgang dokumenterer også klipindstillinger på 16 og 20 sekunder.</p><p>Et referencebillede forankrer det første billede i videoen, og teksten beskriver, hvad der sker derefter. Producenten understøtter JPEG-, PNG- og WebP-referencer og kræver, at billedet svarer til målvideoens størrelse. Forbered motiv, omgivelser og komposition i dette åbningsbillede, og bed derefter om en bestemt bevægelse. Dette er en reference for åbningsbilledet frem for en garanti for, at alle detaljer bevares gennem hele klippet.</p><h4>Genbrugelige ikke-menneskelige figurer</h4><p>Den udvidede producentarbejdsgang kan oprette et genbrugeligt figuraktiv ud fra en kort referencevideo af et dyr, en maskot eller en genstand. Forberedelsesvejledningen foreskriver et MP4-klip på cirka to til fire sekunder, i 720p til 1080p og i 16:9 eller 9:16. Samme billedformat i kilde og output hjælper med at undgå et strakt udseende. Genereringen kan referere til op til to figurer.</p><p>Bevar figurens id, og nævn dens navn i prompten; alene at sende id&#39;et opfylder ikke vejledningens fulde forberedelse. Figuraktiver kan ledsage en billedstyret generering, men videoforlængelser accepterer dem ikke. Producenten blokerer som standard figuruploads med menneskelig lighed og afviser referencebilleder med menneskeansigter i det dokumenterede API-forløb. Sora-appens funktioner til personlige figurer er en særskilt produktarbejdsgang.</p><h4>Fortsæt eller redigér et færdigt klip</h4><p>En forlængelse modtager en færdig kildevideo og en fortsættelsesprompt og bruger hele kildeklippet som kontekst for bevægelse, kameraretning og scenekontinuitet. Vejledningen beskriver tilføjelser på op til 20 sekunder pr. forlængelse. Det dokumenterede input til forlængelse er kildevideoen og tekst; yderligere figur- eller billedreferencer er udelukket i denne tilstand. Beskriv, hvordan den eksisterende handling fortsætter, frem for at indføre en uvedkommende scene uden overgang.</p><p>Videoredigering retter sig mod en tydelig ændring i et eksisterende klip. En fokuseret revision kan ændre et objekts farve eller scenens farvepalet, mens resten af indstillingen bevares. Producentvejledningen anbefaler én veldefineret ændring ad gangen og skelner mellem redigering af en genereret video og upload af vilkårlige optagelser, som har en særskilt betingelse for berettigelse. Behold den færdige kilde, og identificér den præcise revision, der er nødvendig, før du foretager endnu en redigering.</p><h4>Renderingsjob og den færdige video</h4><p>Producentens dokumenterede videoforløb er asynkront: et indsendt job kan stå i kø eller være i gang, før det fuldføres eller fejler. Et fuldført job giver en MP4-video; miniaturebilleder og spriteark understøtter forhåndsvisning og gennemsyn. Bevar forbindelsen mellem jobbets identitet, prompten, referencerne og de returnerede aktiver. Det første jobsvar er ikke den endelige video, der kan afspilles.</p><p>Den almindelige downloadarbejdsgang beskriver en gyldighed på én time for download-URL&#39;en. Den udvidede batcharbejdsgang forbereder uafhængige JSON-renderingsanmodninger med stabile element-id&#39;er, uploadede referencer og et resultat, der føres tilbage til hver indstilling; dens færdige aktiver har en særskilt downloadperiode på op til 24 timer. Gem det færdige klip hurtigt, og undersøg det faktiske billede og den faktiske lyd, før du behandler det som en valgt optagelse.</p><p>Producentens dokumenterede indholdsbegrænsninger for API&#39;et kræver materiale, der egner sig til seere under 18 år, og afviser ophavsretligt beskyttede figurer eller musik samt generering af virkelige personer. Forbered scene og referencer derefter. Modellens direkte resultat er video med lyd, ikke genererede stillbilleder, et værktøjssvar i en samtale eller en film af ubegrænset længde. Bevar standardmodellens præcise identitet og det accepterede kildeklip, når et visuelt koncept videreføres.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Tilgængelig i Ailoot · input og metoder</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · Chat Completions</b> <code>POST /v1/chat/completions</code></summary><dl class=\"method-capabilities\"><div><dt>Inputtyper</dt><dd><code>text</code></dd></div><div><dt>Outputtyper</dt><dd><code>json</code>, <code>sse</code></dd></div><div><dt>Outputformat</dt><dd>JSON eller text/event-stream</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Felt</th><th>Type</th><th>Krav</th><th>Værdier og grænser</th><th>Standard</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Påkrævet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>sora-2</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">messages</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>message[]</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Påkrævet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">messages[].role</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Påkrævet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">messages[].content</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Påkrævet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">stream</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>boolean</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span></td><td data-cell-label=\"Standard\" data-default=\"known\"><span class=\"card-cell-label\">Standard</span>false</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Kombinationer af inputmaterialer</summary><p class=\"note-s\"><b>owned_text_messages</b></p></details><details class=\"note-s\" data-method-contract><summary>Metodeparametre og livscyklus</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Parameter</th><th>Kontrakt</th></tr></thead><tbody><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>content_type</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>application/json</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>required</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>model, messages</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>material_types</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>text</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>messages</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>beskedarray med role og bogstaveligt strengindhold</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>file_material</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>Faktisk UTF-8-materiale kan indsættes som bogstaveligt strengindhold; der udledes ingen filreference.</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>optional_controls</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>stream</td></tr></tbody></table></div><p>Livscyklus: <code>synchronous_json_or_sse</code></p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Priser</h3><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>Tarifoplysninger tilføjer ikke anmodningsmuligheder. Understøttede parametre står ved den valgte metode.</p><dl data-price-conditions><dt>Hurtig tilstand</dt><dd>Ikke angivet <span class=\"note-s\">Når hurtig tilstand er valgt</span></dd><dt>flex-tilstand</dt><dd>Ikke angivet <span class=\"note-s\">Når flex-tilstanden er valgt</span></dd><dt>Maksimal ræsonneringsindsats</dt><dd>Ikke angivet <span class=\"note-s\">Når default-justeringen anvendes ved maksimal ræsonneringsindsats</span></dd></dl></div><div data-declared-tariff-pricing><h4>Ailoot-takster</h4><h4>Priser efter konfiguration</h4><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Konfiguration</th><th>Takstplan</th><th>Beløb</th></tr></thead><tbody><tr><th data-cell-label=\"Konfiguration\" scope=\"row\"><span class=\"card-cell-label\">Konfiguration</span>Grundtakster for tokens</th><td data-cell-label=\"Takstplan\"><span class=\"card-cell-label\">Takstplan</span>Grundtakst</td><td data-cell-label=\"Beløb\"><span class=\"card-cell-label\">Beløb</span><div><span>Input · Inputtokens</span> <b>$0</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Output · Outputtokens</span> <b>$0.2</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Input · Cachelæsning</span> <b>$0</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Input · Cacheskrivning</span> <b>$0</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Input · Cacheskrivning, 1 time</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div></td></tr></tbody></table></div></div><p class=\"note-s\">Ailoot reserverer et estimeret beløb før en anmodning. Efter resultatet afregnes det endelige beløb ud fra det målte forbrug. Ved streaming bruges den endelige forbrugsregistrering til afregningen. <a href=\"/docs/da/billing/reserve/\">Sådan fungerer reservation og afregning →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Eksempelanmodninger</h3><h4>Ailoot Ultra · Chat Completions</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Kodevarianter\"><button class=\"cg-tab\" id=\"model-code-2605-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2605-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl · komplet JSON-svar</button><button class=\"cg-tab\" id=\"model-code-2605-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2605-panel-1\" aria-selected=\"false\" tabindex=\"-1\">Python SDK · komplet JSON-svar</button><button class=\"cg-tab\" id=\"model-code-2605-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2605-panel-2\" aria-selected=\"false\" tabindex=\"-1\">curl · bevar SSE-strømmen</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Kopiér kode\"><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-2605-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-2605-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np=json.loads(&#39;{&quot;model&quot;:&quot;sora-2&quot;,&quot;messages&quot;:[{&quot;role&quot;:&quot;user&quot;,&quot;content&quot;:&quot;hello&quot;}],&quot;stream&quot;:false}&#39;)\n\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nfrom pathlib import Path\nprint(Path(&quot;result.json&quot;).read_text(encoding=&quot;utf-8&quot;))\nPY_RESULT\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-2605-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-2605-tab-1\" hidden><pre data-lang=\"python\"><code>from openai import OpenAI\nimport os\n\nif not os.environ.get(&quot;AILOOT_API_KEY&quot;, &quot;&quot;).strip(): raise SystemExit(&quot;Set AILOOT_API_KEY before making a request&quot;)\nclient=OpenAI(base_url=&quot;https://api.ailoot.ai/v1&quot;,api_key=os.environ[&quot;AILOOT_API_KEY&quot;],max_retries=0)\nresult=client.chat.completions.create(model=&quot;sora-2&quot;, messages=[{&quot;role&quot;:&quot;user&quot;,&quot;content&quot;:&quot;hello&quot;}], stream=False)\nimport json\nfrom pathlib import Path\n\ndata = result.to_dict(mode=&quot;json&quot;)\nPath(&quot;result.json&quot;).write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding=&quot;utf-8&quot;)\nprint(json.dumps(data, ensure_ascii=False, indent=2))\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-2605-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-2605-tab-2\" hidden><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np=json.loads(&#39;{&quot;model&quot;:&quot;sora-2&quot;,&quot;messages&quot;:[{&quot;role&quot;:&quot;user&quot;,&quot;content&quot;:&quot;hello&quot;}],&quot;stream&quot;:true}&#39;)\n\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \\\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.sse\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Hent og gem resultater</h3><h4>Ailoot Ultra · Chat Completions</h4><p class=\"note-s\">JSON eller text/event-stream</p><div class=\"card-result-process\" data-all-results><h5>Behold alle færdige resultater</h5><p class=\"note-s\">Gem hvert fuldstændigt returneret svar, hver fil og hver indholdsdel.</p><p class=\"note-s\">Behold samtlige JSON- eller SSE-bytes, svarheadere, det returnerede forbrug og alle angivne resultatfelter. Der angives ingen modelspecifik outputfamilie.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Hvis det oprindelige svar skal kontrolleres</h5><p class=\"note-s\">Behold det oprindelige svar og forsøgsidentiteten; der udledes ingen nye statusforespørgsler for job eller genindsendelse.</p></div><details class=\"card-about\" data-output-fields><summary>Svarfelter</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Felt</th><th>Type</th><th>Betydning</th></tr></thead><tbody><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">complete response JSON</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>object</td><td data-cell-label=\"Betydning\"><span class=\"card-cell-label\">Betydning</span>Bevar hvert returneret felt uden at antage en modelspecifik resultatfamilie.</td></tr><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">SSE data events</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>stream</td><td data-cell-label=\"Betydning\"><span class=\"card-cell-label\">Betydning</span>Bevar hver returneret hændelse og afslutningsmarkør uden kun at vælge tekstfelter.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Aliaser</h3><h4>Modelaliaser</h4><p class=\"note-s\"><span data-model-alias-route=\"Ultra\"><b>Ailoot Ultra</b> <a href=\"#m=sora-2&amp;route=Ultra&amp;caller=sora-2&amp;fmt=chat_completions\"><code>sora-2</code></a></span></p><h4>Aliaser for metodestier</h4><p class=\"note-s\">Brug metodestierne vist ovenfor.</p><h4>Relaterede kalder-ID’er</h4><p class=\"note-s\"><a href=\"#m=sora-2&amp;route=Ultra&amp;caller=sora-2&amp;fmt=chat_completions\"><code>sora-2</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "sora-2",
        "fmt": "chat_completions",
        "http": "POST",
        "path": "/v1/chat/completions",
        "request_model_id": "sora-2",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|chat_completions|/v1/chat/completions|sora-2",
      "ordinal": 0,
      "rawMethod": {
        "available": null,
        "cache_read": 0,
        "cache_write": 0,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "authentication": {
              "api_key_source": "AILOOT_API_KEY",
              "header": "Authorization: Bearer"
            },
            "example_body": {
              "messages": [
                {
                  "content": "hello",
                  "role": "user"
                }
              ],
              "model": "sora-2",
              "stream": false
            },
            "hints": [
              "Supply owned text as messages[].content.",
              "Use stream:false for JSON or stream:true for SSE; keep the complete response."
            ],
            "ignored_fields": [],
            "lifecycle": {
              "cancel": null,
              "create": {
                "http": "POST",
                "path": "/v1/chat/completions"
              },
              "job_read": null,
              "mode": "synchronous_json_or_sse",
              "status_poll": null,
              "unknown": "Behold det oprindelige svar og forsøgsidentiteten; der udledes ingen nye statusforespørgsler for job eller genindsendelse."
            },
            "material_combinations": [
              {
                "alternatives": [
                  "message[] with literal string content"
                ],
                "mode": "owned_text_messages"
              }
            ],
            "outputs": {
              "all_results": "Behold samtlige JSON- eller SSE-bytes, svarheadere, det returnerede forbrug og alle angivne resultatfelter. Der angives ingen modelspecifik outputfamilie.",
              "family": "protocol",
              "fields": [
                {
                  "description": "Bevar hvert returneret felt uden at antage en modelspecifik resultatfamilie.",
                  "name": "complete response JSON",
                  "type": "object"
                },
                {
                  "description": "Bevar hver returneret hændelse og afslutningsmarkør uden kun at vælge tekstfelter.",
                  "name": "SSE data events",
                  "type": "stream"
                }
              ],
              "format": "JSON eller text/event-stream"
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "sora-2"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "messages",
                "required": true,
                "type": "message[]"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "messages[].role",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "messages[].content",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": false,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "name": "stream",
                "required": false,
                "type": "boolean"
              }
            ],
            "profile_binding": "Current d09 shared client interface only; model-specific provider output and acceptance are not claimed.",
            "request_schema": {
              "additionalProperties": false,
              "properties": {
                "messages": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "content": {
                        "oneOf": [
                          {
                            "type": "string"
                          },
                          {
                            "items": {
                              "oneOf": [
                                {
                                  "properties": {
                                    "text": {
                                      "type": "string"
                                    },
                                    "type": {
                                      "const": "text"
                                    }
                                  },
                                  "required": [
                                    "type",
                                    "text"
                                  ],
                                  "type": "object"
                                },
                                {
                                  "properties": {
                                    "image_url": {
                                      "properties": {
                                        "detail": {
                                          "type": "string"
                                        },
                                        "url": {
                                          "type": "string"
                                        }
                                      },
                                      "required": [
                                        "url"
                                      ],
                                      "type": "object"
                                    },
                                    "type": {
                                      "const": "image_url"
                                    }
                                  },
                                  "required": [
                                    "type",
                                    "image_url"
                                  ],
                                  "type": "object"
                                }
                              ]
                            },
                            "type": "array"
                          }
                        ]
                      },
                      "role": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "role",
                      "content"
                    ],
                    "type": "object"
                  },
                  "minItems": 1,
                  "type": "array"
                },
                "model": {
                  "enum": [
                    "sora-2"
                  ],
                  "type": "string"
                },
                "stream": {
                  "default": false,
                  "type": "boolean"
                }
              },
              "required": [
                "model",
                "messages"
              ],
              "type": "object"
            },
            "schema_template": {
              "messages": [
                {
                  "content": "hello",
                  "role": "user"
                }
              ],
              "model": "sora-2",
              "stream": false
            },
            "unsupported": [
              "Model-specific optional tools or structured-output controls are not part of this minimal profile.",
              "No image/audio/video request controls, dimensions or foreign model limits are inherited.",
              "No asynchronous media job route or manufacturer output capability is inferred."
            ]
          },
          "input": {
            "content_type": "application/json",
            "file_material": "Faktisk UTF-8-materiale kan indsættes som bogstaveligt strengindhold; der udledes ingen filreference.",
            "material_types": [
              "text"
            ],
            "messages": "beskedarray med role og bogstaveligt strengindhold",
            "optional_controls": [
              "stream"
            ],
            "required": [
              "model",
              "messages"
            ]
          },
          "lifecycle": {
            "cancel": null,
            "create": {
              "http": "POST",
              "path": "/v1/chat/completions"
            },
            "job_read": null,
            "mode": "synchronous_json_or_sse",
            "status_poll": null,
            "unknown": "Preserve the original response and attempt identity; no new job polling or resubmission is inferred."
          },
          "manufacturer_capability": null,
          "method": {
            "http": "POST",
            "path": "/v1/chat/completions"
          },
          "operation_modes": [
            "request_response",
            "response_stream"
          ],
          "output": {
            "all_results": "Retain the complete JSON or SSE bytes, response headers, returned usage and all supplied result fields. No model-specific output family is asserted.",
            "family": "protocol",
            "format": "JSON or text/event-stream",
            "manufacturer_output_family": null
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Grundtakster for tokens",
            "units": [
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": "0.2000",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": "0.0002",
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "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": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\":\"sora-2\",\"messages\":[{\"role\":\"user\",\"content\":\"hello\"}],\"stream\":false}')\n\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nfrom pathlib import Path\nprint(Path(\"result.json\").read_text(encoding=\"utf-8\"))\nPY_RESULT\n",
            "label": "curl · complete JSON response",
            "language": "bash"
          },
          {
            "code": "from openai import OpenAI\nimport os\n\nif not os.environ.get(\"AILOOT_API_KEY\", \"\").strip(): raise SystemExit(\"Set AILOOT_API_KEY before making a request\")\nclient=OpenAI(base_url=\"https://api.ailoot.ai/v1\",api_key=os.environ[\"AILOOT_API_KEY\"],max_retries=0)\nresult=client.chat.completions.create(model=\"sora-2\", messages=[{\"role\":\"user\",\"content\":\"hello\"}], stream=False)\nimport json\nfrom pathlib import Path\n\ndata = result.to_dict(mode=\"json\")\nPath(\"result.json\").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding=\"utf-8\")\nprint(json.dumps(data, ensure_ascii=False, indent=2))\n",
            "label": "Python SDK · complete JSON response",
            "language": "python"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\":\"sora-2\",\"messages\":[{\"role\":\"user\",\"content\":\"hello\"}],\"stream\":true}')\n\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.sse\n",
            "label": "curl · preserve SSE stream",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "chat_completions",
        "hints": [
          "Supply owned text as messages[].content.",
          "Use stream:false for JSON or stream:true for SSE; keep the complete response."
        ],
        "http": "POST",
        "in": 0,
        "input": [
          "text"
        ],
        "label": "Chat Completions",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [],
        "out": 200,
        "output": [
          "json",
          "sse"
        ],
        "path": "/v1/chat/completions",
        "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": "token",
          "image_input_price": null,
          "image_output_price": null,
          "per_request_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": "0.2000",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": "0.0002",
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "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": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          }
        ],
        "request_model_id": "sora-2",
        "route_label": "Ultra",
        "status_reads": [],
        "tiers": [],
        "units": [
          {
            "amount": "0",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": "0",
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": "0.2000",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": "0.0002",
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": "0",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": "0",
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": "0",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": "0",
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "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": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          }
        ]
      }
    },
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">sora-2</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Luk\">×</button></div><div class=\"idline\"><span>Andet /</span><code>sora-2</code><button type=\"button\" id=\"copy-id\">Kopiér ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Modelkortets afsnit\"><button type=\"button\" data-card-jump=\"overview\">Start</button><button type=\"button\" data-card-jump=\"methods\">Input og metoder</button><button type=\"button\" data-card-jump=\"pricing\">Priser</button><button type=\"button\" data-card-jump=\"examples\">Eksempler</button><button type=\"button\" data-card-jump=\"results\">Resultater</button><button type=\"button\" data-card-jump=\"aliases\">Aliaser</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"API-metoder\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Ultra|messages|/v1/messages|sora-2\">Messages</button><button type=\"button\" role=\"tab\" tabindex=\"-1\" aria-controls=\"card-method-content\" aria-selected=\"false\" id=\"card-method-tab-1\" data-card-method=\"Ultra|chat_completions|/v1/chat/completions|sora-2\">Chat Completions</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\">Start</h3><p class=\"mdesc-full\">Sora 2 skaber video med synkroniseret dialog, lydeffekter og baggrundslyd ud fra tekst eller et referencebillede. Standardprofilen understøtter visuel udforskning og konceptklip med særskilte producentarbejdsgange til genbrugelige ikke-menneskelige figurer, fortsættelse og fokuserede videoredigeringer.</p><dl class=\"card-io\" data-card-io><div><dt>Accepterede input</dt><dd>Tekst</dd></div><div><dt>Resultater</dt><dd>json · sse</dd></div></dl><details class=\"card-about\"><summary>Om modellen</summary><p class=\"note-s\" data-model-method-boundary>Denne beskrivelse dækker modellens funktioner. Tilgængelige input, output og indstillinger i Ailoot står nedenfor for den valgte metode.</p><div class=\"mabout\" id=\"m-about\"><p>Sora 2 er OpenAI&#39;s model til generering af video og lyd i dynamiske klip ud fra en skriftlig scenebeskrivelse eller et referencebillede. Den genererer billedsekvensen sammen med synkroniseret tale, effekter og baggrundslyd. Standardprofilen Sora 2 er rettet mod visuel udforskning, konceptudvikling, prototyper og grovklip. Sora 2 Pro er en særskilt udgave, der sigter mod større visuel præcision og færdiggørelse i højere opløsning.</p><h4>Beskriv en indstilling, der kan ses og høres</h4><p>Producentens promptvejledning opbygger en nyttig opgavebeskrivelse omkring billedudsnit, motiv, handling, omgivelser og lys. Giv scenen en sammenhængende visuel stil, og beskriv derefter bevægelsen i tydelige handlingsled. Et originalt produktkoncept kan eksempelvis vise en lille mekanisk genstand, der drejer én omgang på et arbejdsbord, mens kameraet langsomt nærmer sig, med blødt vindueslys og en diskret motorlyd. Angiv, hvad seeren skal bemærke, og hvordan handlingen slutter.</p><p>Gør kamerabevægelsen og motivets handling i hver indstilling forståelige. En kompliceret sekvens kan opdeles i særskilte indstillingsblokke med hvert sit billedudsnit, sin handling og sin belysning. Bevar de samme motivdetaljer og den samme farvepalet, når flere klip skal danne én sekvens. Vejledningen fremhæver, at kortere indstillinger generelt følger instruktionerne mere pålideligt, og at gentagen generering med samme prompt giver forskellige optagelser.</p><p>Modellens lancering beskriver forbedret fysisk adfærd og kontinuitet mellem indstillinger, herunder realistiske, filmiske og animeprægede stilarter. Det er tilsigtede egenskaber, som skal instrueres og vurderes. Gennemgå bevægelse, kontakt mellem objekter, proportioner og kontinuitet frem for at antage, at et plausibelt første billede garanterer en sammenhængende sekvens. Hvis en handling er uklar, skal du forenkle den og give den en synlig begyndelse og afslutning.</p><h4>Instruér dialog og lyd hver for sig</h4><p>Angiv replikker adskilt fra den visuelle beskrivelse, og mærk talerne konsekvent. Hold dialogen kort nok til at passe til handlingen og den ønskede kliplængde. I en animation med to figurer kan du lade et kort spørgsmål og svar skifte frem for at forsøge at rumme en lang tale i en kort indstilling. Vejledningen advarer om, at kompleks og lang dialog kan forstyrre tempo og synkronisering.</p><p>Beskriv scenens lydmiljø: lyden af en lille bevægelse, rummets atmosfære eller rytmen i en effekt fra omgivelserne. Forklar, hvilken lyd der skal falde sammen med handlingen. Lyt til den resulterende tale og effekterne sammen med billedet, og kontrollér, hvem der taler, ordlyden og timingen. Synkroniseret lyd er en del af det genererede klip frem for et særskilt tekstsvar.</p><h4>Størrelse, varighed og en billedstyret begyndelse</h4><p>Standardmodellens dokumenterede outputstørrelser er 720×1280 i højformat og 1280×720 i bredformat. Pro-profilens størrelser i højere opløsning må ikke tilskrives standardudgaven Sora 2. Størrelse og varighed er udtrykkelige indstillinger i anmodningen; det ændrer ikke disse indstillinger at skrive en anden størrelse eller bede om en længere film i prompten. Oprettelsesreferencen angiver klipindstillinger på 4, 8 og 12 sekunder, så vælg et kort, defineret handlingsled, når en indstilling forberedes. Den udvidede producentarbejdsgang dokumenterer også klipindstillinger på 16 og 20 sekunder.</p><p>Et referencebillede forankrer det første billede i videoen, og teksten beskriver, hvad der sker derefter. Producenten understøtter JPEG-, PNG- og WebP-referencer og kræver, at billedet svarer til målvideoens størrelse. Forbered motiv, omgivelser og komposition i dette åbningsbillede, og bed derefter om en bestemt bevægelse. Dette er en reference for åbningsbilledet frem for en garanti for, at alle detaljer bevares gennem hele klippet.</p><h4>Genbrugelige ikke-menneskelige figurer</h4><p>Den udvidede producentarbejdsgang kan oprette et genbrugeligt figuraktiv ud fra en kort referencevideo af et dyr, en maskot eller en genstand. Forberedelsesvejledningen foreskriver et MP4-klip på cirka to til fire sekunder, i 720p til 1080p og i 16:9 eller 9:16. Samme billedformat i kilde og output hjælper med at undgå et strakt udseende. Genereringen kan referere til op til to figurer.</p><p>Bevar figurens id, og nævn dens navn i prompten; alene at sende id&#39;et opfylder ikke vejledningens fulde forberedelse. Figuraktiver kan ledsage en billedstyret generering, men videoforlængelser accepterer dem ikke. Producenten blokerer som standard figuruploads med menneskelig lighed og afviser referencebilleder med menneskeansigter i det dokumenterede API-forløb. Sora-appens funktioner til personlige figurer er en særskilt produktarbejdsgang.</p><h4>Fortsæt eller redigér et færdigt klip</h4><p>En forlængelse modtager en færdig kildevideo og en fortsættelsesprompt og bruger hele kildeklippet som kontekst for bevægelse, kameraretning og scenekontinuitet. Vejledningen beskriver tilføjelser på op til 20 sekunder pr. forlængelse. Det dokumenterede input til forlængelse er kildevideoen og tekst; yderligere figur- eller billedreferencer er udelukket i denne tilstand. Beskriv, hvordan den eksisterende handling fortsætter, frem for at indføre en uvedkommende scene uden overgang.</p><p>Videoredigering retter sig mod en tydelig ændring i et eksisterende klip. En fokuseret revision kan ændre et objekts farve eller scenens farvepalet, mens resten af indstillingen bevares. Producentvejledningen anbefaler én veldefineret ændring ad gangen og skelner mellem redigering af en genereret video og upload af vilkårlige optagelser, som har en særskilt betingelse for berettigelse. Behold den færdige kilde, og identificér den præcise revision, der er nødvendig, før du foretager endnu en redigering.</p><h4>Renderingsjob og den færdige video</h4><p>Producentens dokumenterede videoforløb er asynkront: et indsendt job kan stå i kø eller være i gang, før det fuldføres eller fejler. Et fuldført job giver en MP4-video; miniaturebilleder og spriteark understøtter forhåndsvisning og gennemsyn. Bevar forbindelsen mellem jobbets identitet, prompten, referencerne og de returnerede aktiver. Det første jobsvar er ikke den endelige video, der kan afspilles.</p><p>Den almindelige downloadarbejdsgang beskriver en gyldighed på én time for download-URL&#39;en. Den udvidede batcharbejdsgang forbereder uafhængige JSON-renderingsanmodninger med stabile element-id&#39;er, uploadede referencer og et resultat, der føres tilbage til hver indstilling; dens færdige aktiver har en særskilt downloadperiode på op til 24 timer. Gem det færdige klip hurtigt, og undersøg det faktiske billede og den faktiske lyd, før du behandler det som en valgt optagelse.</p><p>Producentens dokumenterede indholdsbegrænsninger for API&#39;et kræver materiale, der egner sig til seere under 18 år, og afviser ophavsretligt beskyttede figurer eller musik samt generering af virkelige personer. Forbered scene og referencer derefter. Modellens direkte resultat er video med lyd, ikke genererede stillbilleder, et værktøjssvar i en samtale eller en film af ubegrænset længde. Bevar standardmodellens præcise identitet og det accepterede kildeklip, når et visuelt koncept videreføres.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Tilgængelig i Ailoot · input og metoder</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · Anthropic Messages</b> <code>POST /v1/messages</code></summary><dl class=\"method-capabilities\"><div><dt>Inputtyper</dt><dd><code>text</code></dd></div><div><dt>Outputtyper</dt><dd><code>json</code>, <code>sse</code></dd></div><div><dt>Outputformat</dt><dd>JSON eller SSE</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Felt</th><th>Type</th><th>Krav</th><th>Værdier og grænser</th><th>Standard</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Påkrævet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>sora-2</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">messages</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>message[]</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Påkrævet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">messages[].role</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Påkrævet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>user, assistant</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">messages[].content</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Påkrævet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">max_tokens</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>integer</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Påkrævet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">stream</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>boolean</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span></td><td data-cell-label=\"Standard\" data-default=\"known\"><span class=\"card-cell-label\">Standard</span>false</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Kombinationer af inputmaterialer</summary><p class=\"note-s\"><b>Tekst</b> · UTF-8-tekst</p><p class=\"note-s\"><code>messages[].content som streng</code></p></details><details class=\"note-s\" data-method-contract><summary>Metodeparametre og livscyklus</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Parameter</th><th>Kontrakt</th></tr></thead><tbody><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>content_type</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>application/json</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>required</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>model, messages, max_tokens</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>optional_controls</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>stream</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>material_types</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>text</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>text_file_material</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>Læs det faktiske UTF-8-dokument, og indsæt teksten i det angivne input eller beskedens indholdsstreng.</td></tr></tbody></table></div><p>Livscyklus: <code>synchronous_or_streamed</code></p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Priser</h3><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>Tarifoplysninger tilføjer ikke anmodningsmuligheder. Understøttede parametre står ved den valgte metode.</p><dl data-price-conditions><dt>Hurtig tilstand</dt><dd>Ikke angivet <span class=\"note-s\">Når hurtig tilstand er valgt</span></dd><dt>flex-tilstand</dt><dd>Ikke angivet <span class=\"note-s\">Når flex-tilstanden er valgt</span></dd><dt>Maksimal ræsonneringsindsats</dt><dd>Ikke angivet <span class=\"note-s\">Når default-justeringen anvendes ved maksimal ræsonneringsindsats</span></dd></dl></div><div data-declared-tariff-pricing><h4>Ailoot-takster</h4><h4>Priser efter konfiguration</h4><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Konfiguration</th><th>Takstplan</th><th>Beløb</th></tr></thead><tbody><tr><th data-cell-label=\"Konfiguration\" scope=\"row\"><span class=\"card-cell-label\">Konfiguration</span>Grundtakster for tokens</th><td data-cell-label=\"Takstplan\"><span class=\"card-cell-label\">Takstplan</span>Grundtakst</td><td data-cell-label=\"Beløb\"><span class=\"card-cell-label\">Beløb</span><div><span>Input · Inputtokens</span> <b>$0</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Output · Outputtokens</span> <b>$0.2</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Input · Cachelæsning</span> <b>$0</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Input · Cacheskrivning</span> <b>$0</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Input · Cacheskrivning, 1 time</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div></td></tr></tbody></table></div></div><p class=\"note-s\">Ailoot reserverer et estimeret beløb før en anmodning. Efter resultatet afregnes det endelige beløb ud fra det målte forbrug. Ved streaming bruges den endelige forbrugsregistrering til afregningen. <a href=\"/docs/da/billing/reserve/\">Sådan fungerer reservation og afregning →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Eksempelanmodninger</h3><h4>Ailoot Ultra · Anthropic Messages</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Kodevarianter\"><button class=\"cg-tab\" id=\"model-code-2606-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2606-panel-0\" aria-selected=\"true\" tabindex=\"0\">Komplet minimalt requestbody i JSON</button><button class=\"cg-tab\" id=\"model-code-2606-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2606-panel-1\" aria-selected=\"false\" tabindex=\"-1\">curl · brug dit UTF-8-dokument</button><button class=\"cg-tab\" id=\"model-code-2606-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2606-panel-2\" aria-selected=\"false\" tabindex=\"-1\">Python · gem hele resultatet</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Kopiér kode\"><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-2606-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-2606-tab-0\"><pre data-lang=\"json\"><code>{\n  &quot;model&quot;: &quot;sora-2&quot;,\n  &quot;max_tokens&quot;: 128,\n  &quot;messages&quot;: [\n    {\n      &quot;role&quot;: &quot;user&quot;,\n      &quot;content&quot;: &quot;Summarize the incident report.&quot;\n    }\n  ],\n  &quot;stream&quot;: false\n}</code></pre></div><div class=\"cg-pane\" id=\"model-code-2606-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-2606-tab-1\" hidden><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_TEXT_FILE:?Set your actual UTF-8 document}&quot;\nexport AILOOT_TEXT_FILE\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json, os\nfrom pathlib import Path\n\nsource_file = Path(os.environ[&#39;AILOOT_TEXT_FILE&#39;])\nif not source_file.is_file():\n    raise SystemExit(&#39;Set AILOOT_TEXT_FILE to your actual UTF-8 document&#39;)\ntext = source_file.read_text(encoding=&#39;utf-8&#39;)\nif not text.strip():\n    raise SystemExit(&#39;Choose a document containing text&#39;)\npayload = {&#39;model&#39;: &#39;sora-2&#39;, &#39;max_tokens&#39;: 128, &#39;messages&#39;: [{&#39;role&#39;: &#39;user&#39;, &#39;content&#39;: &#39;Summarize the incident report.&#39;}]}\npayload[&#39;messages&#39;][0][&#39;content&#39;] = &#39;Summarize this material and quote supporting source passages.\\n\\n&#39; + text\nPath(&#39;request.json&#39;).write_text(json.dumps(payload, ensure_ascii=False), encoding=&#39;utf-8&#39;)\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \\\n  -H &quot;x-api-key: $AILOOT_API_KEY&quot; -H &#39;anthropic-version: 2023-06-01&#39; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport json\nfrom pathlib import Path\n\nresult = json.loads(Path(&#39;result.json&#39;).read_text(encoding=&#39;utf-8&#39;))\nprint(json.dumps(result, ensure_ascii=False, indent=2))\nPY_RESULT\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-2606-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-2606-tab-2\" hidden><pre data-lang=\"python\"><code>import json, os\nfrom pathlib import Path\n\nsource_file = Path(os.environ[&#39;AILOOT_TEXT_FILE&#39;])\nif not source_file.is_file():\n    raise SystemExit(&#39;Set AILOOT_TEXT_FILE to your actual UTF-8 document&#39;)\ntext = source_file.read_text(encoding=&#39;utf-8&#39;)\nif not text.strip():\n    raise SystemExit(&#39;Choose a document containing text&#39;)\npayload = {&#39;model&#39;: &#39;sora-2&#39;, &#39;max_tokens&#39;: 128, &#39;messages&#39;: [{&#39;role&#39;: &#39;user&#39;, &#39;content&#39;: &#39;Summarize the incident report.&#39;}]}\npayload[&#39;messages&#39;][0][&#39;content&#39;] = &#39;Summarize this material and quote supporting source passages.\\n\\n&#39; + text\nfrom urllib.request import Request, urlopen\nfrom urllib.error import HTTPError\n\napi_key = os.environ[&#39;AILOOT_API_KEY&#39;]\nif not api_key.strip():\n    raise SystemExit(&#39;Set AILOOT_API_KEY before making a request&#39;)\nheaders = {&#39;x-api-key&#39;: &#39;PLACEHOLDER_KEY&#39;, &#39;anthropic-version&#39;: &#39;2023-06-01&#39;, &#39;Content-Type&#39;: &#39;application/json&#39;}\nheaders[&#39;x-api-key&#39;] = api_key\nrequest = Request(&#39;https://api.ailoot.ai/v1/messages&#39;, data=json.dumps(payload, ensure_ascii=False).encode(&#39;utf-8&#39;), headers=headers, method=&#39;POST&#39;)\ntry:\n    with urlopen(request, timeout=120) as response:\n        raw = response.read()\n        Path(&#39;response-headers.txt&#39;).write_text(str(response.headers), encoding=&#39;utf-8&#39;)\nexcept HTTPError as error:\n    Path(&#39;result.json&#39;).write_bytes(error.read())\n    Path(&#39;response-headers.txt&#39;).write_text(str(error.headers), encoding=&#39;utf-8&#39;)\n    raise\nPath(&#39;result.json&#39;).write_bytes(raw)\nimport json\nfrom pathlib import Path\n\nresult = json.loads(Path(&#39;result.json&#39;).read_text(encoding=&#39;utf-8&#39;))\nprint(json.dumps(result, ensure_ascii=False, indent=2))\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Hent og gem resultater</h3><h4>Ailoot Ultra · Anthropic Messages</h4><p class=\"note-s\">JSON eller SSE</p><div class=\"card-result-process\" data-all-results><h5>Behold alle færdige resultater</h5><p class=\"note-s\">Gem hvert fuldstændigt returneret svar, hver fil og hver indholdsdel.</p><p class=\"note-s\">Bevar alle indholdsblokke, ræsonnementssignaturer og faktiske værktøjsbrugs-ID’er. Saml alle SSE-blokdeltaer; den første tekstblok er ikke hele outputtet.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Hvis det oprindelige svar skal kontrolleres</h5><p class=\"note-s\">Bevar anmodnings-/svar-ID’er og headere. Der leveres ingen generel URL til at hente tekstjob.</p></div><details class=\"card-about\" data-output-fields><summary>Svarfelter</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Felt</th><th>Type</th></tr></thead><tbody><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">id</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">content[]</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>text|thinking|tool_use|other content block</td></tr><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">stop_reason</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string|null</td></tr><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">usage</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>object</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Fejl og næste trin</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Svar</th><th>Betingelse</th><th>Næste trin</th></tr></thead><tbody><tr><th data-cell-label=\"Svar\" scope=\"row\"><span class=\"card-cell-label\">Svar</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Betingelse\"><span class=\"card-cell-label\">Betingelse</span>Ugyldige obligatoriske felter, materialerepræsentation eller parameterværdi</td><td data-cell-label=\"Næste trin\"><span class=\"card-cell-label\">Næste trin</span>Ret de angivne felter før en ny oprettelsesanmodning.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Aliaser</h3><h4>Modelaliaser</h4><p class=\"note-s\"><span data-model-alias-route=\"Ultra\"><b>Ailoot Ultra</b> <a href=\"#m=sora-2&amp;route=Ultra&amp;caller=sora-2&amp;fmt=messages\"><code>sora-2</code></a></span></p><h4>Aliaser for metodestier</h4><p class=\"note-s\">Brug metodestierne vist ovenfor.</p><h4>Relaterede kalder-ID’er</h4><p class=\"note-s\"><a href=\"#m=sora-2&amp;route=Ultra&amp;caller=sora-2&amp;fmt=messages\"><code>sora-2</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "sora-2",
        "fmt": "messages",
        "http": "POST",
        "path": "/v1/messages",
        "request_model_id": "sora-2",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|messages|/v1/messages|sora-2",
      "ordinal": 1,
      "rawMethod": {
        "available": null,
        "cache_read": 0,
        "cache_write": 0,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "authentication": {
              "api_key_source": "AILOOT_API_KEY",
              "headers": [
                "Authorization: Bearer",
                "x-api-key",
                "anthropic-version"
              ],
              "version_example": "2023-06-01"
            },
            "errors": [
              {
                "code": null,
                "condition": "Ugyldige obligatoriske felter, materialerepræsentation eller parameterværdi",
                "http_status": 400,
                "recovery": "Ret de angivne felter før en ny oprettelsesanmodning.",
                "type": "invalid_request_error"
              }
            ],
            "example_body": {
              "max_tokens": 128,
              "messages": [
                {
                  "content": "Summarize the incident report.",
                  "role": "user"
                }
              ],
              "model": "sora-2",
              "stream": false
            },
            "lifecycle": {
              "create": {
                "http": "POST",
                "path": "/v1/messages"
              },
              "job_read": null,
              "mode": "synchronous_or_streamed",
              "unknown": "Bevar anmodnings-/svar-ID’er og headere. Der leveres ingen generel URL til at hente tekstjob."
            },
            "material_combinations": [
              {
                "mode": "text",
                "representation": "messages[].content som streng",
                "required_material": "UTF-8-tekst"
              }
            ],
            "operation_modes": [
              "synchronous_json",
              "streamed_SSE"
            ],
            "outputs": {
              "all_results": "Bevar alle indholdsblokke, ræsonnementssignaturer og faktiske værktøjsbrugs-ID’er. Saml alle SSE-blokdeltaer; den første tekstblok er ikke hele outputtet.",
              "family": "protocol",
              "fields": [
                {
                  "description": null,
                  "name": "id",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "model",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "content[]",
                  "type": "text|thinking|tool_use|other content block"
                },
                {
                  "description": null,
                  "name": "stop_reason",
                  "type": "string|null"
                },
                {
                  "description": null,
                  "name": "usage",
                  "type": "object"
                }
              ],
              "format": "JSON eller SSE"
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "sora-2"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "messages",
                "required": true,
                "type": "message[]"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "user",
                  "assistant"
                ],
                "enum_known": true,
                "name": "messages[].role",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "messages[].content",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "max_tokens",
                "required": true,
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "default": false,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "name": "stream",
                "required": false,
                "type": "boolean"
              }
            ],
            "profile_binding": "Documented current stock Messages bridge; optional model capabilities are separate from this minimal text request.",
            "request_schema": {
              "additionalProperties": false,
              "properties": {
                "max_tokens": {
                  "minimum": 1,
                  "type": "integer"
                },
                "messages": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "content": {
                        "oneOf": [
                          {
                            "type": "string"
                          },
                          {
                            "items": {
                              "oneOf": [
                                {
                                  "properties": {
                                    "text": {
                                      "type": "string"
                                    },
                                    "type": {
                                      "const": "text"
                                    }
                                  },
                                  "required": [
                                    "type",
                                    "text"
                                  ],
                                  "type": "object"
                                },
                                {
                                  "properties": {
                                    "source": {
                                      "oneOf": [
                                        {
                                          "properties": {
                                            "type": {
                                              "const": "url"
                                            },
                                            "url": {
                                              "type": "string"
                                            }
                                          },
                                          "required": [
                                            "type",
                                            "url"
                                          ],
                                          "type": "object"
                                        },
                                        {
                                          "properties": {
                                            "data": {
                                              "type": "string"
                                            },
                                            "media_type": {
                                              "type": "string"
                                            },
                                            "type": {
                                              "const": "base64"
                                            }
                                          },
                                          "required": [
                                            "type",
                                            "media_type",
                                            "data"
                                          ],
                                          "type": "object"
                                        }
                                      ]
                                    },
                                    "type": {
                                      "const": "image"
                                    }
                                  },
                                  "required": [
                                    "type",
                                    "source"
                                  ],
                                  "type": "object"
                                }
                              ]
                            },
                            "type": "array"
                          }
                        ]
                      },
                      "role": {
                        "enum": [
                          "user",
                          "assistant"
                        ],
                        "type": "string"
                      }
                    },
                    "required": [
                      "role",
                      "content"
                    ],
                    "type": "object"
                  },
                  "minItems": 1,
                  "type": "array"
                },
                "model": {
                  "enum": [
                    "sora-2"
                  ],
                  "type": "string"
                },
                "stream": {
                  "default": false,
                  "type": "boolean"
                }
              },
              "required": [
                "model",
                "messages",
                "max_tokens"
              ],
              "type": "object"
            },
            "schema_template": {
              "max_tokens": 128,
              "messages": [
                {
                  "content": "Summarize the incident report.",
                  "role": "user"
                }
              ],
              "model": "sora-2",
              "stream": false
            },
            "unsupported": [
              "No query API key.",
              "Hosted/server-side tools and model-specific optional controls are not part of this minimal family example."
            ]
          },
          "input": {
            "content_type": "application/json",
            "material_types": [
              "text"
            ],
            "optional_controls": [
              "stream"
            ],
            "required": [
              "model",
              "messages",
              "max_tokens"
            ],
            "text_file_material": "Læs det faktiske UTF-8-dokument, og indsæt teksten i det angivne input eller beskedens indholdsstreng."
          },
          "lifecycle": {
            "create": {
              "http": "POST",
              "path": "/v1/messages"
            },
            "job_read": null,
            "mode": "synchronous_or_streamed",
            "unknown": "Keep request/response IDs and headers. No generic text job retrieval URL is supplied."
          },
          "manufacturer_capability": null,
          "method": {
            "http": "POST",
            "path": "/v1/messages"
          },
          "output": {
            "all_results": "Keep all content blocks, thinking signatures and actual tool-use IDs. Assemble all SSE block deltas; a first text block is not the complete output.",
            "family": "protocol",
            "format": "JSON or SSE"
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Grundtakster for tokens",
            "units": [
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": "0.2000",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": "0.0002",
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "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": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "{\n  \"model\": \"sora-2\",\n  \"max_tokens\": 128,\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": \"Summarize the incident report.\"\n    }\n  ],\n  \"stream\": false\n}",
            "label": "Complete minimal JSON body",
            "language": "json"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_TEXT_FILE:?Set your actual UTF-8 document}\"\nexport AILOOT_TEXT_FILE\npython3 - <<'PY_REQUEST'\nimport json, os\nfrom pathlib import Path\n\nsource_file = Path(os.environ['AILOOT_TEXT_FILE'])\nif not source_file.is_file():\n    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')\ntext = source_file.read_text(encoding='utf-8')\nif not text.strip():\n    raise SystemExit('Choose a document containing text')\npayload = {'model': 'sora-2', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}\npayload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\\n\\n' + text\nPath('request.json').write_text(json.dumps(payload, ensure_ascii=False), encoding='utf-8')\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \\\n  -H \"x-api-key: $AILOOT_API_KEY\" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\n\nresult = json.loads(Path('result.json').read_text(encoding='utf-8'))\nprint(json.dumps(result, ensure_ascii=False, indent=2))\nPY_RESULT\n",
            "label": "curl · use your UTF-8 document",
            "language": "bash"
          },
          {
            "code": "import json, os\nfrom pathlib import Path\n\nsource_file = Path(os.environ['AILOOT_TEXT_FILE'])\nif not source_file.is_file():\n    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')\ntext = source_file.read_text(encoding='utf-8')\nif not text.strip():\n    raise SystemExit('Choose a document containing text')\npayload = {'model': 'sora-2', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}\npayload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\\n\\n' + text\nfrom urllib.request import Request, urlopen\nfrom urllib.error import HTTPError\n\napi_key = os.environ['AILOOT_API_KEY']\nif not api_key.strip():\n    raise SystemExit('Set AILOOT_API_KEY before making a request')\nheaders = {'x-api-key': 'PLACEHOLDER_KEY', 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json'}\nheaders['x-api-key'] = api_key\nrequest = Request('https://api.ailoot.ai/v1/messages', data=json.dumps(payload, ensure_ascii=False).encode('utf-8'), headers=headers, method='POST')\ntry:\n    with urlopen(request, timeout=120) as response:\n        raw = response.read()\n        Path('response-headers.txt').write_text(str(response.headers), encoding='utf-8')\nexcept HTTPError as error:\n    Path('result.json').write_bytes(error.read())\n    Path('response-headers.txt').write_text(str(error.headers), encoding='utf-8')\n    raise\nPath('result.json').write_bytes(raw)\nimport json\nfrom pathlib import Path\n\nresult = json.loads(Path('result.json').read_text(encoding='utf-8'))\nprint(json.dumps(result, ensure_ascii=False, indent=2))\n",
            "label": "Python · save the complete result",
            "language": "python"
          }
        ],
        "family": "anthropic",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "messages",
        "http": "POST",
        "in": 0,
        "input": [
          "text"
        ],
        "label": "Anthropic Messages",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [],
        "out": 200,
        "output": [
          "json",
          "sse"
        ],
        "path": "/v1/messages",
        "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": "token",
          "image_input_price": null,
          "image_output_price": null,
          "per_request_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": "0.2000",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": "0.0002",
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "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": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          }
        ],
        "request_model_id": "sora-2",
        "route_label": "Ultra",
        "status_reads": [],
        "tiers": [],
        "units": [
          {
            "amount": "0",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": "0",
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": "0.2000",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": "0.0002",
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": "0",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": "0",
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": "0",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": "0",
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "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": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          }
        ]
      }
    }
  ],
  "model_id": "sora-2",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "201ce49a977556437e19af4579d9ffa77dc2fe0067ee0410f7abeec1301408e4",
    "input_html_sha256": "018e8d26daf6f79fb12830c2c418336c25aee3d2773a3b2bbe0bb7e82ea69a89",
    "private_audit_sha256": "38ceb113309843b0671c5eb6c84561567920f4b69aa2259c42c48097814e784e",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/da/sora-2/",
    "description": "Sora 2 skaber video med synkroniseret dialog, lydeffekter og baggrundslyd ud fra tekst eller et referencebillede. Standardprofilen understøtter visuel udforskning og konceptklip med særskilte producentarbejdsgange til genbrugelige ikke-menneskelige figurer, fortsættelse og fokuserede videoredigeringer.",
    "locale": "da",
    "md_url": "https://ailoot.ai/models/da/sora-2/index.md",
    "title": "sora-2 — Ailoot",
    "url": "https://ailoot.ai/models/da/sora-2/"
  },
  "rawModel": {
    "about": "Sora 2 er OpenAI's model til generering af video og lyd i dynamiske klip ud fra en skriftlig scenebeskrivelse eller et referencebillede. Den genererer billedsekvensen sammen med synkroniseret tale, effekter og baggrundslyd. Standardprofilen Sora 2 er rettet mod visuel udforskning, konceptudvikling, prototyper og grovklip. Sora 2 Pro er en særskilt udgave, der sigter mod større visuel præcision og færdiggørelse i højere opløsning.\n\n### Beskriv en indstilling, der kan ses og høres\n\nProducentens promptvejledning opbygger en nyttig opgavebeskrivelse omkring billedudsnit, motiv, handling, omgivelser og lys. Giv scenen en sammenhængende visuel stil, og beskriv derefter bevægelsen i tydelige handlingsled. Et originalt produktkoncept kan eksempelvis vise en lille mekanisk genstand, der drejer én omgang på et arbejdsbord, mens kameraet langsomt nærmer sig, med blødt vindueslys og en diskret motorlyd. Angiv, hvad seeren skal bemærke, og hvordan handlingen slutter.\n\nGør kamerabevægelsen og motivets handling i hver indstilling forståelige. En kompliceret sekvens kan opdeles i særskilte indstillingsblokke med hvert sit billedudsnit, sin handling og sin belysning. Bevar de samme motivdetaljer og den samme farvepalet, når flere klip skal danne én sekvens. Vejledningen fremhæver, at kortere indstillinger generelt følger instruktionerne mere pålideligt, og at gentagen generering med samme prompt giver forskellige optagelser.\n\nModellens lancering beskriver forbedret fysisk adfærd og kontinuitet mellem indstillinger, herunder realistiske, filmiske og animeprægede stilarter. Det er tilsigtede egenskaber, som skal instrueres og vurderes. Gennemgå bevægelse, kontakt mellem objekter, proportioner og kontinuitet frem for at antage, at et plausibelt første billede garanterer en sammenhængende sekvens. Hvis en handling er uklar, skal du forenkle den og give den en synlig begyndelse og afslutning.\n\n### Instruér dialog og lyd hver for sig\n\nAngiv replikker adskilt fra den visuelle beskrivelse, og mærk talerne konsekvent. Hold dialogen kort nok til at passe til handlingen og den ønskede kliplængde. I en animation med to figurer kan du lade et kort spørgsmål og svar skifte frem for at forsøge at rumme en lang tale i en kort indstilling. Vejledningen advarer om, at kompleks og lang dialog kan forstyrre tempo og synkronisering.\n\nBeskriv scenens lydmiljø: lyden af en lille bevægelse, rummets atmosfære eller rytmen i en effekt fra omgivelserne. Forklar, hvilken lyd der skal falde sammen med handlingen. Lyt til den resulterende tale og effekterne sammen med billedet, og kontrollér, hvem der taler, ordlyden og timingen. Synkroniseret lyd er en del af det genererede klip frem for et særskilt tekstsvar.\n\n### Størrelse, varighed og en billedstyret begyndelse\n\nStandardmodellens dokumenterede outputstørrelser er 720×1280 i højformat og 1280×720 i bredformat. Pro-profilens størrelser i højere opløsning må ikke tilskrives standardudgaven Sora 2. Størrelse og varighed er udtrykkelige indstillinger i anmodningen; det ændrer ikke disse indstillinger at skrive en anden størrelse eller bede om en længere film i prompten. Oprettelsesreferencen angiver klipindstillinger på 4, 8 og 12 sekunder, så vælg et kort, defineret handlingsled, når en indstilling forberedes. Den udvidede producentarbejdsgang dokumenterer også klipindstillinger på 16 og 20 sekunder.\n\nEt referencebillede forankrer det første billede i videoen, og teksten beskriver, hvad der sker derefter. Producenten understøtter JPEG-, PNG- og WebP-referencer og kræver, at billedet svarer til målvideoens størrelse. Forbered motiv, omgivelser og komposition i dette åbningsbillede, og bed derefter om en bestemt bevægelse. Dette er en reference for åbningsbilledet frem for en garanti for, at alle detaljer bevares gennem hele klippet.\n\n### Genbrugelige ikke-menneskelige figurer\n\nDen udvidede producentarbejdsgang kan oprette et genbrugeligt figuraktiv ud fra en kort referencevideo af et dyr, en maskot eller en genstand. Forberedelsesvejledningen foreskriver et MP4-klip på cirka to til fire sekunder, i 720p til 1080p og i 16:9 eller 9:16. Samme billedformat i kilde og output hjælper med at undgå et strakt udseende. Genereringen kan referere til op til to figurer.\n\nBevar figurens id, og nævn dens navn i prompten; alene at sende id'et opfylder ikke vejledningens fulde forberedelse. Figuraktiver kan ledsage en billedstyret generering, men videoforlængelser accepterer dem ikke. Producenten blokerer som standard figuruploads med menneskelig lighed og afviser referencebilleder med menneskeansigter i det dokumenterede API-forløb. Sora-appens funktioner til personlige figurer er en særskilt produktarbejdsgang.\n\n### Fortsæt eller redigér et færdigt klip\n\nEn forlængelse modtager en færdig kildevideo og en fortsættelsesprompt og bruger hele kildeklippet som kontekst for bevægelse, kameraretning og scenekontinuitet. Vejledningen beskriver tilføjelser på op til 20 sekunder pr. forlængelse. Det dokumenterede input til forlængelse er kildevideoen og tekst; yderligere figur- eller billedreferencer er udelukket i denne tilstand. Beskriv, hvordan den eksisterende handling fortsætter, frem for at indføre en uvedkommende scene uden overgang.\n\nVideoredigering retter sig mod en tydelig ændring i et eksisterende klip. En fokuseret revision kan ændre et objekts farve eller scenens farvepalet, mens resten af indstillingen bevares. Producentvejledningen anbefaler én veldefineret ændring ad gangen og skelner mellem redigering af en genereret video og upload af vilkårlige optagelser, som har en særskilt betingelse for berettigelse. Behold den færdige kilde, og identificér den præcise revision, der er nødvendig, før du foretager endnu en redigering.\n\n### Renderingsjob og den færdige video\n\nProducentens dokumenterede videoforløb er asynkront: et indsendt job kan stå i kø eller være i gang, før det fuldføres eller fejler. Et fuldført job giver en MP4-video; miniaturebilleder og spriteark understøtter forhåndsvisning og gennemsyn. Bevar forbindelsen mellem jobbets identitet, prompten, referencerne og de returnerede aktiver. Det første jobsvar er ikke den endelige video, der kan afspilles.\n\nDen almindelige downloadarbejdsgang beskriver en gyldighed på én time for download-URL'en. Den udvidede batcharbejdsgang forbereder uafhængige JSON-renderingsanmodninger med stabile element-id'er, uploadede referencer og et resultat, der føres tilbage til hver indstilling; dens færdige aktiver har en særskilt downloadperiode på op til 24 timer. Gem det færdige klip hurtigt, og undersøg det faktiske billede og den faktiske lyd, før du behandler det som en valgt optagelse.\n\nProducentens dokumenterede indholdsbegrænsninger for API'et kræver materiale, der egner sig til seere under 18 år, og afviser ophavsretligt beskyttede figurer eller musik samt generering af virkelige personer. Forbered scene og referencer derefter. Modellens direkte resultat er video med lyd, ikke genererede stillbilleder, et værktøjssvar i en samtale eller en film af ubegrænset længde. Bevar standardmodellens præcise identitet og det accepterede kildeklip, når et visuelt koncept videreføres.",
    "alias_of": null,
    "aliases": [],
    "author": "Other",
    "capabilities": {
      "context_length": 60000,
      "manufacturer_input": [],
      "manufacturer_output": []
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "0",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": "0",
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": "0.2000",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": "0.0002",
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          }
        ],
        "summary": "De fulde prisoplysninger for konfigurationen findes under detaljer."
      }
    ],
    "ctx": null,
    "formats": [
      "chat_completions",
      "messages"
    ],
    "id": "sora-2",
    "input": [
      "text"
    ],
    "kind": "text",
    "max_out": null,
    "methods": [
      {
        "available": null,
        "cache_read": 0,
        "cache_write": 0,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "authentication": {
              "api_key_source": "AILOOT_API_KEY",
              "header": "Authorization: Bearer"
            },
            "example_body": {
              "messages": [
                {
                  "content": "hello",
                  "role": "user"
                }
              ],
              "model": "sora-2",
              "stream": false
            },
            "hints": [
              "Supply owned text as messages[].content.",
              "Use stream:false for JSON or stream:true for SSE; keep the complete response."
            ],
            "ignored_fields": [],
            "lifecycle": {
              "cancel": null,
              "create": {
                "http": "POST",
                "path": "/v1/chat/completions"
              },
              "job_read": null,
              "mode": "synchronous_json_or_sse",
              "status_poll": null,
              "unknown": "Behold det oprindelige svar og forsøgsidentiteten; der udledes ingen nye statusforespørgsler for job eller genindsendelse."
            },
            "material_combinations": [
              {
                "alternatives": [
                  "message[] with literal string content"
                ],
                "mode": "owned_text_messages"
              }
            ],
            "outputs": {
              "all_results": "Behold samtlige JSON- eller SSE-bytes, svarheadere, det returnerede forbrug og alle angivne resultatfelter. Der angives ingen modelspecifik outputfamilie.",
              "family": "protocol",
              "fields": [
                {
                  "description": "Bevar hvert returneret felt uden at antage en modelspecifik resultatfamilie.",
                  "name": "complete response JSON",
                  "type": "object"
                },
                {
                  "description": "Bevar hver returneret hændelse og afslutningsmarkør uden kun at vælge tekstfelter.",
                  "name": "SSE data events",
                  "type": "stream"
                }
              ],
              "format": "JSON eller text/event-stream"
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "sora-2"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "messages",
                "required": true,
                "type": "message[]"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "messages[].role",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "messages[].content",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": false,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "name": "stream",
                "required": false,
                "type": "boolean"
              }
            ],
            "profile_binding": "Current d09 shared client interface only; model-specific provider output and acceptance are not claimed.",
            "request_schema": {
              "additionalProperties": false,
              "properties": {
                "messages": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "content": {
                        "oneOf": [
                          {
                            "type": "string"
                          },
                          {
                            "items": {
                              "oneOf": [
                                {
                                  "properties": {
                                    "text": {
                                      "type": "string"
                                    },
                                    "type": {
                                      "const": "text"
                                    }
                                  },
                                  "required": [
                                    "type",
                                    "text"
                                  ],
                                  "type": "object"
                                },
                                {
                                  "properties": {
                                    "image_url": {
                                      "properties": {
                                        "detail": {
                                          "type": "string"
                                        },
                                        "url": {
                                          "type": "string"
                                        }
                                      },
                                      "required": [
                                        "url"
                                      ],
                                      "type": "object"
                                    },
                                    "type": {
                                      "const": "image_url"
                                    }
                                  },
                                  "required": [
                                    "type",
                                    "image_url"
                                  ],
                                  "type": "object"
                                }
                              ]
                            },
                            "type": "array"
                          }
                        ]
                      },
                      "role": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "role",
                      "content"
                    ],
                    "type": "object"
                  },
                  "minItems": 1,
                  "type": "array"
                },
                "model": {
                  "enum": [
                    "sora-2"
                  ],
                  "type": "string"
                },
                "stream": {
                  "default": false,
                  "type": "boolean"
                }
              },
              "required": [
                "model",
                "messages"
              ],
              "type": "object"
            },
            "schema_template": {
              "messages": [
                {
                  "content": "hello",
                  "role": "user"
                }
              ],
              "model": "sora-2",
              "stream": false
            },
            "unsupported": [
              "Model-specific optional tools or structured-output controls are not part of this minimal profile.",
              "No image/audio/video request controls, dimensions or foreign model limits are inherited.",
              "No asynchronous media job route or manufacturer output capability is inferred."
            ]
          },
          "input": {
            "content_type": "application/json",
            "file_material": "Faktisk UTF-8-materiale kan indsættes som bogstaveligt strengindhold; der udledes ingen filreference.",
            "material_types": [
              "text"
            ],
            "messages": "beskedarray med role og bogstaveligt strengindhold",
            "optional_controls": [
              "stream"
            ],
            "required": [
              "model",
              "messages"
            ]
          },
          "lifecycle": {
            "cancel": null,
            "create": {
              "http": "POST",
              "path": "/v1/chat/completions"
            },
            "job_read": null,
            "mode": "synchronous_json_or_sse",
            "status_poll": null,
            "unknown": "Preserve the original response and attempt identity; no new job polling or resubmission is inferred."
          },
          "manufacturer_capability": null,
          "method": {
            "http": "POST",
            "path": "/v1/chat/completions"
          },
          "operation_modes": [
            "request_response",
            "response_stream"
          ],
          "output": {
            "all_results": "Retain the complete JSON or SSE bytes, response headers, returned usage and all supplied result fields. No model-specific output family is asserted.",
            "family": "protocol",
            "format": "JSON or text/event-stream",
            "manufacturer_output_family": null
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Grundtakster for tokens",
            "units": [
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": "0.2000",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": "0.0002",
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "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": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\":\"sora-2\",\"messages\":[{\"role\":\"user\",\"content\":\"hello\"}],\"stream\":false}')\n\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nfrom pathlib import Path\nprint(Path(\"result.json\").read_text(encoding=\"utf-8\"))\nPY_RESULT\n",
            "label": "curl · complete JSON response",
            "language": "bash"
          },
          {
            "code": "from openai import OpenAI\nimport os\n\nif not os.environ.get(\"AILOOT_API_KEY\", \"\").strip(): raise SystemExit(\"Set AILOOT_API_KEY before making a request\")\nclient=OpenAI(base_url=\"https://api.ailoot.ai/v1\",api_key=os.environ[\"AILOOT_API_KEY\"],max_retries=0)\nresult=client.chat.completions.create(model=\"sora-2\", messages=[{\"role\":\"user\",\"content\":\"hello\"}], stream=False)\nimport json\nfrom pathlib import Path\n\ndata = result.to_dict(mode=\"json\")\nPath(\"result.json\").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding=\"utf-8\")\nprint(json.dumps(data, ensure_ascii=False, indent=2))\n",
            "label": "Python SDK · complete JSON response",
            "language": "python"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\":\"sora-2\",\"messages\":[{\"role\":\"user\",\"content\":\"hello\"}],\"stream\":true}')\n\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.sse\n",
            "label": "curl · preserve SSE stream",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "chat_completions",
        "hints": [
          "Supply owned text as messages[].content.",
          "Use stream:false for JSON or stream:true for SSE; keep the complete response."
        ],
        "http": "POST",
        "in": 0,
        "input": [
          "text"
        ],
        "label": "Chat Completions",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [],
        "out": 200,
        "output": [
          "json",
          "sse"
        ],
        "path": "/v1/chat/completions",
        "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": "token",
          "image_input_price": null,
          "image_output_price": null,
          "per_request_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": "0.2000",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": "0.0002",
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "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": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          }
        ],
        "request_model_id": "sora-2",
        "route_label": "Ultra",
        "status_reads": [],
        "tiers": [],
        "units": [
          {
            "amount": "0",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": "0",
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": "0.2000",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": "0.0002",
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": "0",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": "0",
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": "0",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": "0",
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "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": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          }
        ]
      },
      {
        "available": null,
        "cache_read": 0,
        "cache_write": 0,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "authentication": {
              "api_key_source": "AILOOT_API_KEY",
              "headers": [
                "Authorization: Bearer",
                "x-api-key",
                "anthropic-version"
              ],
              "version_example": "2023-06-01"
            },
            "errors": [
              {
                "code": null,
                "condition": "Ugyldige obligatoriske felter, materialerepræsentation eller parameterværdi",
                "http_status": 400,
                "recovery": "Ret de angivne felter før en ny oprettelsesanmodning.",
                "type": "invalid_request_error"
              }
            ],
            "example_body": {
              "max_tokens": 128,
              "messages": [
                {
                  "content": "Summarize the incident report.",
                  "role": "user"
                }
              ],
              "model": "sora-2",
              "stream": false
            },
            "lifecycle": {
              "create": {
                "http": "POST",
                "path": "/v1/messages"
              },
              "job_read": null,
              "mode": "synchronous_or_streamed",
              "unknown": "Bevar anmodnings-/svar-ID’er og headere. Der leveres ingen generel URL til at hente tekstjob."
            },
            "material_combinations": [
              {
                "mode": "text",
                "representation": "messages[].content som streng",
                "required_material": "UTF-8-tekst"
              }
            ],
            "operation_modes": [
              "synchronous_json",
              "streamed_SSE"
            ],
            "outputs": {
              "all_results": "Bevar alle indholdsblokke, ræsonnementssignaturer og faktiske værktøjsbrugs-ID’er. Saml alle SSE-blokdeltaer; den første tekstblok er ikke hele outputtet.",
              "family": "protocol",
              "fields": [
                {
                  "description": null,
                  "name": "id",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "model",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "content[]",
                  "type": "text|thinking|tool_use|other content block"
                },
                {
                  "description": null,
                  "name": "stop_reason",
                  "type": "string|null"
                },
                {
                  "description": null,
                  "name": "usage",
                  "type": "object"
                }
              ],
              "format": "JSON eller SSE"
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "sora-2"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "messages",
                "required": true,
                "type": "message[]"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "user",
                  "assistant"
                ],
                "enum_known": true,
                "name": "messages[].role",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "messages[].content",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "max_tokens",
                "required": true,
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "default": false,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "name": "stream",
                "required": false,
                "type": "boolean"
              }
            ],
            "profile_binding": "Documented current stock Messages bridge; optional model capabilities are separate from this minimal text request.",
            "request_schema": {
              "additionalProperties": false,
              "properties": {
                "max_tokens": {
                  "minimum": 1,
                  "type": "integer"
                },
                "messages": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "content": {
                        "oneOf": [
                          {
                            "type": "string"
                          },
                          {
                            "items": {
                              "oneOf": [
                                {
                                  "properties": {
                                    "text": {
                                      "type": "string"
                                    },
                                    "type": {
                                      "const": "text"
                                    }
                                  },
                                  "required": [
                                    "type",
                                    "text"
                                  ],
                                  "type": "object"
                                },
                                {
                                  "properties": {
                                    "source": {
                                      "oneOf": [
                                        {
                                          "properties": {
                                            "type": {
                                              "const": "url"
                                            },
                                            "url": {
                                              "type": "string"
                                            }
                                          },
                                          "required": [
                                            "type",
                                            "url"
                                          ],
                                          "type": "object"
                                        },
                                        {
                                          "properties": {
                                            "data": {
                                              "type": "string"
                                            },
                                            "media_type": {
                                              "type": "string"
                                            },
                                            "type": {
                                              "const": "base64"
                                            }
                                          },
                                          "required": [
                                            "type",
                                            "media_type",
                                            "data"
                                          ],
                                          "type": "object"
                                        }
                                      ]
                                    },
                                    "type": {
                                      "const": "image"
                                    }
                                  },
                                  "required": [
                                    "type",
                                    "source"
                                  ],
                                  "type": "object"
                                }
                              ]
                            },
                            "type": "array"
                          }
                        ]
                      },
                      "role": {
                        "enum": [
                          "user",
                          "assistant"
                        ],
                        "type": "string"
                      }
                    },
                    "required": [
                      "role",
                      "content"
                    ],
                    "type": "object"
                  },
                  "minItems": 1,
                  "type": "array"
                },
                "model": {
                  "enum": [
                    "sora-2"
                  ],
                  "type": "string"
                },
                "stream": {
                  "default": false,
                  "type": "boolean"
                }
              },
              "required": [
                "model",
                "messages",
                "max_tokens"
              ],
              "type": "object"
            },
            "schema_template": {
              "max_tokens": 128,
              "messages": [
                {
                  "content": "Summarize the incident report.",
                  "role": "user"
                }
              ],
              "model": "sora-2",
              "stream": false
            },
            "unsupported": [
              "No query API key.",
              "Hosted/server-side tools and model-specific optional controls are not part of this minimal family example."
            ]
          },
          "input": {
            "content_type": "application/json",
            "material_types": [
              "text"
            ],
            "optional_controls": [
              "stream"
            ],
            "required": [
              "model",
              "messages",
              "max_tokens"
            ],
            "text_file_material": "Læs det faktiske UTF-8-dokument, og indsæt teksten i det angivne input eller beskedens indholdsstreng."
          },
          "lifecycle": {
            "create": {
              "http": "POST",
              "path": "/v1/messages"
            },
            "job_read": null,
            "mode": "synchronous_or_streamed",
            "unknown": "Keep request/response IDs and headers. No generic text job retrieval URL is supplied."
          },
          "manufacturer_capability": null,
          "method": {
            "http": "POST",
            "path": "/v1/messages"
          },
          "output": {
            "all_results": "Keep all content blocks, thinking signatures and actual tool-use IDs. Assemble all SSE block deltas; a first text block is not the complete output.",
            "family": "protocol",
            "format": "JSON or SSE"
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Grundtakster for tokens",
            "units": [
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": "0.2000",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": "0.0002",
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "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": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "{\n  \"model\": \"sora-2\",\n  \"max_tokens\": 128,\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": \"Summarize the incident report.\"\n    }\n  ],\n  \"stream\": false\n}",
            "label": "Complete minimal JSON body",
            "language": "json"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_TEXT_FILE:?Set your actual UTF-8 document}\"\nexport AILOOT_TEXT_FILE\npython3 - <<'PY_REQUEST'\nimport json, os\nfrom pathlib import Path\n\nsource_file = Path(os.environ['AILOOT_TEXT_FILE'])\nif not source_file.is_file():\n    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')\ntext = source_file.read_text(encoding='utf-8')\nif not text.strip():\n    raise SystemExit('Choose a document containing text')\npayload = {'model': 'sora-2', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}\npayload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\\n\\n' + text\nPath('request.json').write_text(json.dumps(payload, ensure_ascii=False), encoding='utf-8')\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \\\n  -H \"x-api-key: $AILOOT_API_KEY\" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\n\nresult = json.loads(Path('result.json').read_text(encoding='utf-8'))\nprint(json.dumps(result, ensure_ascii=False, indent=2))\nPY_RESULT\n",
            "label": "curl · use your UTF-8 document",
            "language": "bash"
          },
          {
            "code": "import json, os\nfrom pathlib import Path\n\nsource_file = Path(os.environ['AILOOT_TEXT_FILE'])\nif not source_file.is_file():\n    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')\ntext = source_file.read_text(encoding='utf-8')\nif not text.strip():\n    raise SystemExit('Choose a document containing text')\npayload = {'model': 'sora-2', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}\npayload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\\n\\n' + text\nfrom urllib.request import Request, urlopen\nfrom urllib.error import HTTPError\n\napi_key = os.environ['AILOOT_API_KEY']\nif not api_key.strip():\n    raise SystemExit('Set AILOOT_API_KEY before making a request')\nheaders = {'x-api-key': 'PLACEHOLDER_KEY', 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json'}\nheaders['x-api-key'] = api_key\nrequest = Request('https://api.ailoot.ai/v1/messages', data=json.dumps(payload, ensure_ascii=False).encode('utf-8'), headers=headers, method='POST')\ntry:\n    with urlopen(request, timeout=120) as response:\n        raw = response.read()\n        Path('response-headers.txt').write_text(str(response.headers), encoding='utf-8')\nexcept HTTPError as error:\n    Path('result.json').write_bytes(error.read())\n    Path('response-headers.txt').write_text(str(error.headers), encoding='utf-8')\n    raise\nPath('result.json').write_bytes(raw)\nimport json\nfrom pathlib import Path\n\nresult = json.loads(Path('result.json').read_text(encoding='utf-8'))\nprint(json.dumps(result, ensure_ascii=False, indent=2))\n",
            "label": "Python · save the complete result",
            "language": "python"
          }
        ],
        "family": "anthropic",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "messages",
        "http": "POST",
        "in": 0,
        "input": [
          "text"
        ],
        "label": "Anthropic Messages",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [],
        "out": 200,
        "output": [
          "json",
          "sse"
        ],
        "path": "/v1/messages",
        "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": "token",
          "image_input_price": null,
          "image_output_price": null,
          "per_request_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": "0.2000",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": "0.0002",
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": "0",
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": "0",
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "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": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          }
        ],
        "request_model_id": "sora-2",
        "route_label": "Ultra",
        "status_reads": [],
        "tiers": [],
        "units": [
          {
            "amount": "0",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": "0",
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": "0.2000",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": "0.0002",
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": "0",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": "0",
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": "0",
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": "0",
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "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": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "sora-2",
        "request_model_id": "sora-2",
        "route_label": "Ultra"
      }
    ],
    "name": "sora-2",
    "price": {
      "in": 0,
      "in_label": null,
      "out": 200,
      "out_label": null,
      "scope_label": "Token rates",
      "sort_in": 0,
      "sort_out": 200,
      "varies": false
    },
    "short": "Sora 2 skaber video med synkroniseret dialog, lydeffekter og baggrundslyd ud fra tekst eller et referencebillede. Standardprofilen understøtter visuel udforskning og konceptklip med særskilte producentarbejdsgange til genbrugelige ikke-menneskelige figurer, fortsættelse og fokuserede videoredigeringer."
  },
  "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
        },
        {
          "contract_json_pointer": "/methods/1/rawMethod/contract",
          "html_json_pointer": "/methods/1/html",
          "method_ordinal": 1
        }
      ],
      "role": "current-semantic-reference"
    },
    "raw_input": {
      "examples_role": "historical-input-not-current-ready-examples",
      "json_pointers": [
        "/rawModel",
        "/methods/0/rawMethod",
        "/methods/1/rawMethod"
      ],
      "role": "historical-owner-input"
    },
    "schema": "ailoot-native-model-representations-v1"
  },
  "schema": "ailoot-static-model-facts-v1",
  "schema_version": 1,
  "shortText": "Sora 2 skaber video med synkroniseret dialog, lydeffekter og baggrundslyd ud fra tekst eller et referencebillede. Standardprofilen understøtter visuel udforskning og konceptklip med særskilte producentarbejdsgange til genbrugelige ikke-menneskelige figurer, fortsættelse og fokuserede videoredigeringer.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "6079a60565900f58ed7a9cda3f6cfc62a0a5550b3e02f11d23b0cd6940867368",
    "renderer_sha256": "2bf9f26ea9bfd57ed53d867671d8f05b41a6ea85089f48039e3365dc2b92ec2c"
  },
  "sourceRevision": "c33f5450142226343989ccefc0452d0d8d499761368a9ad075f2dfa8fd98d936"
}
