{
  "aboutHtml": "<p>Sora 2 ist das Modell von OpenAI zur Video- und Audiogenerierung für dynamische Clips aus einer schriftlichen Szenenbeschreibung oder einer Bildreferenz. Es erzeugt die Bildfolge zusammen mit synchronisierter Sprache, Effekten und Hintergrundton. Das Standardprofil Sora 2 ist für visuelle Erkundung, Konzeptentwicklung, Prototypen und Rohschnitte vorgesehen. Sora 2 Pro ist eine separate Ausgabe für höhere Bildtreue und die Fertigstellung in höherer Auflösung.</p><h4>Eine Einstellung beschreiben, die sichtbar und hörbar ist</h4><p>Der Prompting-Leitfaden des Herstellers gliedert ein hilfreiches Briefing nach Bildausschnitt, Motiv, Handlung, Umgebung und Licht. Geben Sie der Szene einen stimmigen visuellen Stil und beschreiben Sie die Bewegung anschliessend in klaren Etappen. Ein eigenständiges Produktkonzept könnte ein kleines mechanisches Objekt zeigen, das sich auf einer Werkbank einmal dreht, während die Kamera langsam näher kommt, bei weichem Fensterlicht und einem dezenten Motorgeräusch. Geben Sie an, worauf die Betrachtenden achten sollen und wie die Handlung endet.</p><p>Halten Sie die Kamerabewegung und die Handlung des Motivs in jeder Einstellung verständlich. Eine komplizierte Sequenz lässt sich in einzelne Einstellungsblöcke mit jeweils eigenem Bildausschnitt, eigener Handlung und Beleuchtung aufteilen. Bewahren Sie dieselben Motivdetails und dieselbe Farbpalette, wenn mehrere Clips eine Sequenz bilden sollen. Der Leitfaden betont, dass kürzere Einstellungen Anweisungen in der Regel zuverlässiger folgen und dass wiederholte Generierungen mit demselben Prompt unterschiedliche Takes liefern.</p><p>Die Modellvorstellung beschreibt verbessertes physikalisches Verhalten und bessere Kontinuität über mehrere Einstellungen hinweg, unter anderem in realistischen, filmischen und Anime-Stilen. Diese vorgesehenen Fähigkeiten müssen gezielt angeleitet und geprüft werden. Kontrollieren Sie Bewegung, Kontakt zwischen Gegenständen, Proportionen und Kontinuität, statt anzunehmen, dass ein plausibles erstes Bild eine stimmige Sequenz garantiert. Wenn eine Handlung unklar ist, vereinfachen Sie sie und geben ihr einen sichtbaren Anfang und ein sichtbares Ende.</p><h4>Dialog und Ton getrennt anleiten</h4><p>Geben Sie gesprochene Sätze getrennt von der visuellen Beschreibung an und kennzeichnen Sie die Sprechenden einheitlich. Halten Sie Dialoge kurz genug, damit sie zur Handlung und zur vorgesehenen Cliplänge passen. Bei einer Animation mit zwei Figuren wechseln Sie eine kurze Frage und Antwort ab, statt in einer kurzen Einstellung eine lange Rede unterbringen zu wollen. Der Leitfaden warnt, dass komplexe, lange Dialoge Tempo und Synchronisierung beeinträchtigen können.</p><p>Beschreiben Sie die zur Szene gehörende Klangkulisse: das Geräusch einer kleinen Bewegung, die Raumatmosphäre oder den Rhythmus eines Umgebungsgeräusches. Erklären Sie, welcher Klang mit der Handlung zusammenfallen soll. Hören Sie die erzeugte Sprache und die Effekte zusammen mit dem Bild an und prüfen Sie Sprecherzuordnung, Wortlaut und Timing. Synchronisierter Ton ist Teil des erzeugten Clips und keine separate Textantwort.</p><h4>Grösse, Dauer und ein bildgeführter Anfang</h4><p>Die dokumentierten Ausgabegrössen des Standardmodells sind 720×1280 im Hochformat und 1280×720 im Querformat. Die höheren Auflösungen des Pro-Profils dürfen nicht dem Standardmodell Sora 2 zugeordnet werden. Grösse und Dauer sind ausdrückliche Anfrageeinstellungen; eine andere Grössenangabe oder der Wunsch nach einem längeren Film im Prompt ändert diese Einstellungen nicht. Die Referenz zur Erstellung nennt Cliplängen von 4, 8 und 12 Sekunden. Planen Sie deshalb eine kurze, klar definierte Handlung für die Einstellung. Der erweiterte Herstellerablauf dokumentiert ausserdem Einstellungen für 16- und 20-sekündige Clips.</p><p>Eine Bildreferenz verankert das erste Einzelbild; der Text beschreibt, was danach geschieht. Der Hersteller unterstützt Referenzen in JPEG, PNG und WebP und verlangt, dass das Bild der Zielgrösse des Videos entspricht. Bereiten Sie Motiv, Umgebung und Komposition in diesem Anfangsbild vor und verlangen Sie dann eine bestimmte Bewegung. Die Referenz legt das Anfangsbild fest, garantiert aber nicht, dass jedes Detail im gesamten Clip identisch bleibt.</p><h4>Wiederverwendbare nichtmenschliche Figuren</h4><p>Der erweiterte Herstellerablauf kann aus einem kurzen Referenzvideo eines Tiers, Maskottchens oder Gegenstands eine wiederverwendbare Figurenressource erstellen. Seine Vorbereitungshinweise nennen einen MP4-Clip von etwa zwei bis vier Sekunden, 720p bis 1080p, in 16:9 oder 9:16. Übereinstimmende Seitenverhältnisse von Quelle und Ausgabe helfen, eine gestreckte Darstellung zu vermeiden. Die Generierung kann bis zu zwei Figuren referenzieren.</p><p>Bewahren Sie die Figurenkennung auf und nennen Sie den Namen der Figur im Prompt; die Kennung allein zu übergeben erfüllt die Vorbereitung des Leitfadens nicht vollständig. Figurenressourcen können zusammen mit einer bildgeführten Generierung verwendet werden, Videoverlängerungen akzeptieren sie jedoch nicht. Der Hersteller blockiert standardmässig Figuren-Uploads mit menschlichem Aussehen und weist im dokumentierten API-Ablauf Referenzbilder mit menschlichen Gesichtern zurück. Die Funktionen der Sora-App für persönliche Figuren gehören zu einem separaten Produktablauf.</p><h4>Einen fertigen Clip fortsetzen oder bearbeiten</h4><p>Eine Verlängerung übernimmt ein abgeschlossenes Quellvideo und einen Fortsetzungs-Prompt. Sie verwendet den gesamten Quellclip als Kontext für Bewegung, Kameraführung und Szenenkontinuität. Der Leitfaden beschreibt Ergänzungen von bis zu 20 Sekunden pro Verlängerung. Als dokumentierte Eingabe dienen Quellvideo und Text; zusätzliche Figuren- oder Bildreferenzen sind in diesem Modus ausgeschlossen. Beschreiben Sie, wie die bestehende Handlung weitergeht, statt ohne Übergang eine unverbundene Szene einzuführen.</p><p>Die Videobearbeitung zielt auf eine klare Änderung an einem bestehenden Clip. Eine gezielte Überarbeitung kann die Farbe eines Gegenstands oder die Farbpalette der Szene ändern und den Rest der Einstellung bewahren. Der Herstellerleitfaden empfiehlt jeweils eine klar abgegrenzte Änderung und unterscheidet die Bearbeitung eines generierten Videos vom Upload beliebigen Filmmaterials, für den eine separate Zulassungsbedingung gilt. Bewahren Sie die abgeschlossene Quelle auf und benennen Sie die genaue gewünschte Änderung, bevor Sie erneut bearbeiten.</p><h4>Renderaufträge und das fertige Video</h4><p>Der dokumentierte Videoablauf des Herstellers ist asynchron: Ein eingereichter Auftrag kann zunächst in der Warteschlange stehen oder in Bearbeitung sein, bevor er abgeschlossen wird oder fehlschlägt. Ein abgeschlossener Auftrag liefert ein MP4-Video; Vorschaubilder und Sprite-Sheets unterstützen Vorschau und Durchsicht. Bewahren Sie die Auftragskennung zusammen mit Prompt, Referenzen und zurückgegebenen Ressourcen auf. Eine erste Auftragsantwort ist noch nicht das fertige abspielbare Video.</p><p>Der gewöhnliche Downloadablauf beschreibt eine Gültigkeit der Download-URL von einer Stunde. Der erweiterte Stapelablauf bereitet unabhängige JSON-Renderanfragen mit stabilen Elementkennungen, hochgeladenen Referenzen und einer Zuordnung jedes Ergebnisses zur jeweiligen Einstellung vor; für seine abgeschlossenen Ressourcen gilt ein separater Downloadzeitraum von bis zu 24 Stunden. Speichern Sie den fertigen Clip zeitnah und prüfen Sie das tatsächliche Bild und den Ton, bevor Sie ihn als ausgewählten Take behandeln.</p><p>Die dokumentierten API-Inhaltsbeschränkungen des Herstellers verlangen für Personen unter 18 Jahren geeignetes Material und weisen urheberrechtlich geschützte Figuren oder Musik sowie die Generierung realer Personen zurück. Bereiten Sie Szene und Referenzen entsprechend vor. Das direkte Modellergebnis ist ein Video mit Ton, keine generierten Standbilder, keine dialogbasierte Tool-Antwort und kein unbegrenzt langer Film. Bewahren Sie die genaue Identität des Standardmodells und den akzeptierten Quellclip, wenn Sie ein visuelles Konzept fortsetzen.</p>",
  "aboutText": "Sora 2 ist das Modell von OpenAI zur Video- und Audiogenerierung für dynamische Clips aus einer schriftlichen Szenenbeschreibung oder einer Bildreferenz. Es erzeugt die Bildfolge zusammen mit synchronisierter Sprache, Effekten und Hintergrundton. Das Standardprofil Sora 2 ist für visuelle Erkundung, Konzeptentwicklung, Prototypen und Rohschnitte vorgesehen. Sora 2 Pro ist eine separate Ausgabe für höhere Bildtreue und die Fertigstellung in höherer Auflösung.\n\n### Eine Einstellung beschreiben, die sichtbar und hörbar ist\n\nDer Prompting-Leitfaden des Herstellers gliedert ein hilfreiches Briefing nach Bildausschnitt, Motiv, Handlung, Umgebung und Licht. Geben Sie der Szene einen stimmigen visuellen Stil und beschreiben Sie die Bewegung anschliessend in klaren Etappen. Ein eigenständiges Produktkonzept könnte ein kleines mechanisches Objekt zeigen, das sich auf einer Werkbank einmal dreht, während die Kamera langsam näher kommt, bei weichem Fensterlicht und einem dezenten Motorgeräusch. Geben Sie an, worauf die Betrachtenden achten sollen und wie die Handlung endet.\n\nHalten Sie die Kamerabewegung und die Handlung des Motivs in jeder Einstellung verständlich. Eine komplizierte Sequenz lässt sich in einzelne Einstellungsblöcke mit jeweils eigenem Bildausschnitt, eigener Handlung und Beleuchtung aufteilen. Bewahren Sie dieselben Motivdetails und dieselbe Farbpalette, wenn mehrere Clips eine Sequenz bilden sollen. Der Leitfaden betont, dass kürzere Einstellungen Anweisungen in der Regel zuverlässiger folgen und dass wiederholte Generierungen mit demselben Prompt unterschiedliche Takes liefern.\n\nDie Modellvorstellung beschreibt verbessertes physikalisches Verhalten und bessere Kontinuität über mehrere Einstellungen hinweg, unter anderem in realistischen, filmischen und Anime-Stilen. Diese vorgesehenen Fähigkeiten müssen gezielt angeleitet und geprüft werden. Kontrollieren Sie Bewegung, Kontakt zwischen Gegenständen, Proportionen und Kontinuität, statt anzunehmen, dass ein plausibles erstes Bild eine stimmige Sequenz garantiert. Wenn eine Handlung unklar ist, vereinfachen Sie sie und geben ihr einen sichtbaren Anfang und ein sichtbares Ende.\n\n### Dialog und Ton getrennt anleiten\n\nGeben Sie gesprochene Sätze getrennt von der visuellen Beschreibung an und kennzeichnen Sie die Sprechenden einheitlich. Halten Sie Dialoge kurz genug, damit sie zur Handlung und zur vorgesehenen Cliplänge passen. Bei einer Animation mit zwei Figuren wechseln Sie eine kurze Frage und Antwort ab, statt in einer kurzen Einstellung eine lange Rede unterbringen zu wollen. Der Leitfaden warnt, dass komplexe, lange Dialoge Tempo und Synchronisierung beeinträchtigen können.\n\nBeschreiben Sie die zur Szene gehörende Klangkulisse: das Geräusch einer kleinen Bewegung, die Raumatmosphäre oder den Rhythmus eines Umgebungsgeräusches. Erklären Sie, welcher Klang mit der Handlung zusammenfallen soll. Hören Sie die erzeugte Sprache und die Effekte zusammen mit dem Bild an und prüfen Sie Sprecherzuordnung, Wortlaut und Timing. Synchronisierter Ton ist Teil des erzeugten Clips und keine separate Textantwort.\n\n### Grösse, Dauer und ein bildgeführter Anfang\n\nDie dokumentierten Ausgabegrössen des Standardmodells sind 720×1280 im Hochformat und 1280×720 im Querformat. Die höheren Auflösungen des Pro-Profils dürfen nicht dem Standardmodell Sora 2 zugeordnet werden. Grösse und Dauer sind ausdrückliche Anfrageeinstellungen; eine andere Grössenangabe oder der Wunsch nach einem längeren Film im Prompt ändert diese Einstellungen nicht. Die Referenz zur Erstellung nennt Cliplängen von 4, 8 und 12 Sekunden. Planen Sie deshalb eine kurze, klar definierte Handlung für die Einstellung. Der erweiterte Herstellerablauf dokumentiert ausserdem Einstellungen für 16- und 20-sekündige Clips.\n\nEine Bildreferenz verankert das erste Einzelbild; der Text beschreibt, was danach geschieht. Der Hersteller unterstützt Referenzen in JPEG, PNG und WebP und verlangt, dass das Bild der Zielgrösse des Videos entspricht. Bereiten Sie Motiv, Umgebung und Komposition in diesem Anfangsbild vor und verlangen Sie dann eine bestimmte Bewegung. Die Referenz legt das Anfangsbild fest, garantiert aber nicht, dass jedes Detail im gesamten Clip identisch bleibt.\n\n### Wiederverwendbare nichtmenschliche Figuren\n\nDer erweiterte Herstellerablauf kann aus einem kurzen Referenzvideo eines Tiers, Maskottchens oder Gegenstands eine wiederverwendbare Figurenressource erstellen. Seine Vorbereitungshinweise nennen einen MP4-Clip von etwa zwei bis vier Sekunden, 720p bis 1080p, in 16:9 oder 9:16. Übereinstimmende Seitenverhältnisse von Quelle und Ausgabe helfen, eine gestreckte Darstellung zu vermeiden. Die Generierung kann bis zu zwei Figuren referenzieren.\n\nBewahren Sie die Figurenkennung auf und nennen Sie den Namen der Figur im Prompt; die Kennung allein zu übergeben erfüllt die Vorbereitung des Leitfadens nicht vollständig. Figurenressourcen können zusammen mit einer bildgeführten Generierung verwendet werden, Videoverlängerungen akzeptieren sie jedoch nicht. Der Hersteller blockiert standardmässig Figuren-Uploads mit menschlichem Aussehen und weist im dokumentierten API-Ablauf Referenzbilder mit menschlichen Gesichtern zurück. Die Funktionen der Sora-App für persönliche Figuren gehören zu einem separaten Produktablauf.\n\n### Einen fertigen Clip fortsetzen oder bearbeiten\n\nEine Verlängerung übernimmt ein abgeschlossenes Quellvideo und einen Fortsetzungs-Prompt. Sie verwendet den gesamten Quellclip als Kontext für Bewegung, Kameraführung und Szenenkontinuität. Der Leitfaden beschreibt Ergänzungen von bis zu 20 Sekunden pro Verlängerung. Als dokumentierte Eingabe dienen Quellvideo und Text; zusätzliche Figuren- oder Bildreferenzen sind in diesem Modus ausgeschlossen. Beschreiben Sie, wie die bestehende Handlung weitergeht, statt ohne Übergang eine unverbundene Szene einzuführen.\n\nDie Videobearbeitung zielt auf eine klare Änderung an einem bestehenden Clip. Eine gezielte Überarbeitung kann die Farbe eines Gegenstands oder die Farbpalette der Szene ändern und den Rest der Einstellung bewahren. Der Herstellerleitfaden empfiehlt jeweils eine klar abgegrenzte Änderung und unterscheidet die Bearbeitung eines generierten Videos vom Upload beliebigen Filmmaterials, für den eine separate Zulassungsbedingung gilt. Bewahren Sie die abgeschlossene Quelle auf und benennen Sie die genaue gewünschte Änderung, bevor Sie erneut bearbeiten.\n\n### Renderaufträge und das fertige Video\n\nDer dokumentierte Videoablauf des Herstellers ist asynchron: Ein eingereichter Auftrag kann zunächst in der Warteschlange stehen oder in Bearbeitung sein, bevor er abgeschlossen wird oder fehlschlägt. Ein abgeschlossener Auftrag liefert ein MP4-Video; Vorschaubilder und Sprite-Sheets unterstützen Vorschau und Durchsicht. Bewahren Sie die Auftragskennung zusammen mit Prompt, Referenzen und zurückgegebenen Ressourcen auf. Eine erste Auftragsantwort ist noch nicht das fertige abspielbare Video.\n\nDer gewöhnliche Downloadablauf beschreibt eine Gültigkeit der Download-URL von einer Stunde. Der erweiterte Stapelablauf bereitet unabhängige JSON-Renderanfragen mit stabilen Elementkennungen, hochgeladenen Referenzen und einer Zuordnung jedes Ergebnisses zur jeweiligen Einstellung vor; für seine abgeschlossenen Ressourcen gilt ein separater Downloadzeitraum von bis zu 24 Stunden. Speichern Sie den fertigen Clip zeitnah und prüfen Sie das tatsächliche Bild und den Ton, bevor Sie ihn als ausgewählten Take behandeln.\n\nDie dokumentierten API-Inhaltsbeschränkungen des Herstellers verlangen für Personen unter 18 Jahren geeignetes Material und weisen urheberrechtlich geschützte Figuren oder Musik sowie die Generierung realer Personen zurück. Bereiten Sie Szene und Referenzen entsprechend vor. Das direkte Modellergebnis ist ein Video mit Ton, keine generierten Standbilder, keine dialogbasierte Tool-Antwort und kein unbegrenzt langer Film. Bewahren Sie die genaue Identität des Standardmodells und den akzeptierten Quellclip, wenn Sie ein visuelles Konzept fortsetzen.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "c46cee709b9888eece1a12b0c5d6331865df80dfe3a1255265bb0259deef7daf",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "de-ch",
  "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=\"Schliessen\">×</button></div><div class=\"idline\"><span>Sonstiges /</span><code>sora-2</code><button type=\"button\" id=\"copy-id\">ID kopieren</button></div><nav class=\"card-jump-nav\" aria-label=\"Bereiche der Modellkarte\"><button type=\"button\" data-card-jump=\"overview\">Einstieg</button><button type=\"button\" data-card-jump=\"methods\">Eingaben und Methoden</button><button type=\"button\" data-card-jump=\"pricing\">Tarife</button><button type=\"button\" data-card-jump=\"examples\">Beispiele</button><button type=\"button\" data-card-jump=\"results\">Ergebnisse</button><button type=\"button\" data-card-jump=\"aliases\">Aliasnamen</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"API-Methoden\"><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\">Einstieg</h3><p class=\"mdesc-full\">Sora 2 erzeugt aus Text oder einer Bildreferenz Videos mit synchronisierten Dialogen, Geräuscheffekten und Hintergrundton. Das Standardprofil unterstützt visuelle Erkundung und Konzeptclips; separate Herstellerabläufe dienen wiederverwendbaren nichtmenschlichen Figuren, Fortsetzungen und gezielten Videobearbeitungen.</p><dl class=\"card-io\" data-card-io><div><dt>Zulässige Eingaben</dt><dd>Text</dd></div><div><dt>Ergebnisse</dt><dd>json · sse</dd></div></dl><details class=\"card-about\"><summary>Über das Modell</summary><p class=\"note-s\" data-model-method-boundary>Diese Beschreibung erläutert die Fähigkeiten des Modells. Die über Ailoot verfügbaren Eingaben, Ausgaben und Optionen sind unten für die ausgewählte Methode aufgeführt.</p><div class=\"mabout\" id=\"m-about\"><p>Sora 2 ist das Modell von OpenAI zur Video- und Audiogenerierung für dynamische Clips aus einer schriftlichen Szenenbeschreibung oder einer Bildreferenz. Es erzeugt die Bildfolge zusammen mit synchronisierter Sprache, Effekten und Hintergrundton. Das Standardprofil Sora 2 ist für visuelle Erkundung, Konzeptentwicklung, Prototypen und Rohschnitte vorgesehen. Sora 2 Pro ist eine separate Ausgabe für höhere Bildtreue und die Fertigstellung in höherer Auflösung.</p><h4>Eine Einstellung beschreiben, die sichtbar und hörbar ist</h4><p>Der Prompting-Leitfaden des Herstellers gliedert ein hilfreiches Briefing nach Bildausschnitt, Motiv, Handlung, Umgebung und Licht. Geben Sie der Szene einen stimmigen visuellen Stil und beschreiben Sie die Bewegung anschliessend in klaren Etappen. Ein eigenständiges Produktkonzept könnte ein kleines mechanisches Objekt zeigen, das sich auf einer Werkbank einmal dreht, während die Kamera langsam näher kommt, bei weichem Fensterlicht und einem dezenten Motorgeräusch. Geben Sie an, worauf die Betrachtenden achten sollen und wie die Handlung endet.</p><p>Halten Sie die Kamerabewegung und die Handlung des Motivs in jeder Einstellung verständlich. Eine komplizierte Sequenz lässt sich in einzelne Einstellungsblöcke mit jeweils eigenem Bildausschnitt, eigener Handlung und Beleuchtung aufteilen. Bewahren Sie dieselben Motivdetails und dieselbe Farbpalette, wenn mehrere Clips eine Sequenz bilden sollen. Der Leitfaden betont, dass kürzere Einstellungen Anweisungen in der Regel zuverlässiger folgen und dass wiederholte Generierungen mit demselben Prompt unterschiedliche Takes liefern.</p><p>Die Modellvorstellung beschreibt verbessertes physikalisches Verhalten und bessere Kontinuität über mehrere Einstellungen hinweg, unter anderem in realistischen, filmischen und Anime-Stilen. Diese vorgesehenen Fähigkeiten müssen gezielt angeleitet und geprüft werden. Kontrollieren Sie Bewegung, Kontakt zwischen Gegenständen, Proportionen und Kontinuität, statt anzunehmen, dass ein plausibles erstes Bild eine stimmige Sequenz garantiert. Wenn eine Handlung unklar ist, vereinfachen Sie sie und geben ihr einen sichtbaren Anfang und ein sichtbares Ende.</p><h4>Dialog und Ton getrennt anleiten</h4><p>Geben Sie gesprochene Sätze getrennt von der visuellen Beschreibung an und kennzeichnen Sie die Sprechenden einheitlich. Halten Sie Dialoge kurz genug, damit sie zur Handlung und zur vorgesehenen Cliplänge passen. Bei einer Animation mit zwei Figuren wechseln Sie eine kurze Frage und Antwort ab, statt in einer kurzen Einstellung eine lange Rede unterbringen zu wollen. Der Leitfaden warnt, dass komplexe, lange Dialoge Tempo und Synchronisierung beeinträchtigen können.</p><p>Beschreiben Sie die zur Szene gehörende Klangkulisse: das Geräusch einer kleinen Bewegung, die Raumatmosphäre oder den Rhythmus eines Umgebungsgeräusches. Erklären Sie, welcher Klang mit der Handlung zusammenfallen soll. Hören Sie die erzeugte Sprache und die Effekte zusammen mit dem Bild an und prüfen Sie Sprecherzuordnung, Wortlaut und Timing. Synchronisierter Ton ist Teil des erzeugten Clips und keine separate Textantwort.</p><h4>Grösse, Dauer und ein bildgeführter Anfang</h4><p>Die dokumentierten Ausgabegrössen des Standardmodells sind 720×1280 im Hochformat und 1280×720 im Querformat. Die höheren Auflösungen des Pro-Profils dürfen nicht dem Standardmodell Sora 2 zugeordnet werden. Grösse und Dauer sind ausdrückliche Anfrageeinstellungen; eine andere Grössenangabe oder der Wunsch nach einem längeren Film im Prompt ändert diese Einstellungen nicht. Die Referenz zur Erstellung nennt Cliplängen von 4, 8 und 12 Sekunden. Planen Sie deshalb eine kurze, klar definierte Handlung für die Einstellung. Der erweiterte Herstellerablauf dokumentiert ausserdem Einstellungen für 16- und 20-sekündige Clips.</p><p>Eine Bildreferenz verankert das erste Einzelbild; der Text beschreibt, was danach geschieht. Der Hersteller unterstützt Referenzen in JPEG, PNG und WebP und verlangt, dass das Bild der Zielgrösse des Videos entspricht. Bereiten Sie Motiv, Umgebung und Komposition in diesem Anfangsbild vor und verlangen Sie dann eine bestimmte Bewegung. Die Referenz legt das Anfangsbild fest, garantiert aber nicht, dass jedes Detail im gesamten Clip identisch bleibt.</p><h4>Wiederverwendbare nichtmenschliche Figuren</h4><p>Der erweiterte Herstellerablauf kann aus einem kurzen Referenzvideo eines Tiers, Maskottchens oder Gegenstands eine wiederverwendbare Figurenressource erstellen. Seine Vorbereitungshinweise nennen einen MP4-Clip von etwa zwei bis vier Sekunden, 720p bis 1080p, in 16:9 oder 9:16. Übereinstimmende Seitenverhältnisse von Quelle und Ausgabe helfen, eine gestreckte Darstellung zu vermeiden. Die Generierung kann bis zu zwei Figuren referenzieren.</p><p>Bewahren Sie die Figurenkennung auf und nennen Sie den Namen der Figur im Prompt; die Kennung allein zu übergeben erfüllt die Vorbereitung des Leitfadens nicht vollständig. Figurenressourcen können zusammen mit einer bildgeführten Generierung verwendet werden, Videoverlängerungen akzeptieren sie jedoch nicht. Der Hersteller blockiert standardmässig Figuren-Uploads mit menschlichem Aussehen und weist im dokumentierten API-Ablauf Referenzbilder mit menschlichen Gesichtern zurück. Die Funktionen der Sora-App für persönliche Figuren gehören zu einem separaten Produktablauf.</p><h4>Einen fertigen Clip fortsetzen oder bearbeiten</h4><p>Eine Verlängerung übernimmt ein abgeschlossenes Quellvideo und einen Fortsetzungs-Prompt. Sie verwendet den gesamten Quellclip als Kontext für Bewegung, Kameraführung und Szenenkontinuität. Der Leitfaden beschreibt Ergänzungen von bis zu 20 Sekunden pro Verlängerung. Als dokumentierte Eingabe dienen Quellvideo und Text; zusätzliche Figuren- oder Bildreferenzen sind in diesem Modus ausgeschlossen. Beschreiben Sie, wie die bestehende Handlung weitergeht, statt ohne Übergang eine unverbundene Szene einzuführen.</p><p>Die Videobearbeitung zielt auf eine klare Änderung an einem bestehenden Clip. Eine gezielte Überarbeitung kann die Farbe eines Gegenstands oder die Farbpalette der Szene ändern und den Rest der Einstellung bewahren. Der Herstellerleitfaden empfiehlt jeweils eine klar abgegrenzte Änderung und unterscheidet die Bearbeitung eines generierten Videos vom Upload beliebigen Filmmaterials, für den eine separate Zulassungsbedingung gilt. Bewahren Sie die abgeschlossene Quelle auf und benennen Sie die genaue gewünschte Änderung, bevor Sie erneut bearbeiten.</p><h4>Renderaufträge und das fertige Video</h4><p>Der dokumentierte Videoablauf des Herstellers ist asynchron: Ein eingereichter Auftrag kann zunächst in der Warteschlange stehen oder in Bearbeitung sein, bevor er abgeschlossen wird oder fehlschlägt. Ein abgeschlossener Auftrag liefert ein MP4-Video; Vorschaubilder und Sprite-Sheets unterstützen Vorschau und Durchsicht. Bewahren Sie die Auftragskennung zusammen mit Prompt, Referenzen und zurückgegebenen Ressourcen auf. Eine erste Auftragsantwort ist noch nicht das fertige abspielbare Video.</p><p>Der gewöhnliche Downloadablauf beschreibt eine Gültigkeit der Download-URL von einer Stunde. Der erweiterte Stapelablauf bereitet unabhängige JSON-Renderanfragen mit stabilen Elementkennungen, hochgeladenen Referenzen und einer Zuordnung jedes Ergebnisses zur jeweiligen Einstellung vor; für seine abgeschlossenen Ressourcen gilt ein separater Downloadzeitraum von bis zu 24 Stunden. Speichern Sie den fertigen Clip zeitnah und prüfen Sie das tatsächliche Bild und den Ton, bevor Sie ihn als ausgewählten Take behandeln.</p><p>Die dokumentierten API-Inhaltsbeschränkungen des Herstellers verlangen für Personen unter 18 Jahren geeignetes Material und weisen urheberrechtlich geschützte Figuren oder Musik sowie die Generierung realer Personen zurück. Bereiten Sie Szene und Referenzen entsprechend vor. Das direkte Modellergebnis ist ein Video mit Ton, keine generierten Standbilder, keine dialogbasierte Tool-Antwort und kein unbegrenzt langer Film. Bewahren Sie die genaue Identität des Standardmodells und den akzeptierten Quellclip, wenn Sie ein visuelles Konzept fortsetzen.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">In Ailoot verfügbar · Eingaben und Methoden</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>Eingabe</dt><dd><code>text</code></dd></div><div><dt>Ausgabe</dt><dd><code>json</code>, <code>sse</code></dd></div><div><dt>Ausgabeformat</dt><dd>JSON oder text/event-stream</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Feld</th><th>Typ</th><th>Anforderung</th><th>Werte und Limits</th><th>Standard</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span><code>string</code></td><td data-cell-label=\"Anforderung\"><span class=\"card-cell-label\">Anforderung</span>Erforderlich</td><td data-cell-label=\"Werte und Limits\"><span class=\"card-cell-label\">Werte und Limits</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=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">messages</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span><code>message[]</code></td><td data-cell-label=\"Anforderung\"><span class=\"card-cell-label\">Anforderung</span>Erforderlich</td><td data-cell-label=\"Werte und Limits\"><span class=\"card-cell-label\">Werte und Limits</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=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">messages[].role</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span><code>string</code></td><td data-cell-label=\"Anforderung\"><span class=\"card-cell-label\">Anforderung</span>Erforderlich</td><td data-cell-label=\"Werte und Limits\"><span class=\"card-cell-label\">Werte und Limits</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=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">messages[].content</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span><code>string</code></td><td data-cell-label=\"Anforderung\"><span class=\"card-cell-label\">Anforderung</span>Erforderlich</td><td data-cell-label=\"Werte und Limits\"><span class=\"card-cell-label\">Werte und Limits</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=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">stream</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span><code>boolean</code></td><td data-cell-label=\"Anforderung\"><span class=\"card-cell-label\">Anforderung</span>Optional</td><td data-cell-label=\"Werte und Limits\"><span class=\"card-cell-label\">Werte und Limits</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>Kombinationen von Eingabematerialien</summary><p class=\"note-s\"><b>owned_text_messages</b></p></details><details class=\"note-s\" data-method-contract><summary>Methodenparameter und Lebenszyklus</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Parameter</th><th>Vertrag</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=\"Vertrag\"><span class=\"card-cell-label\">Vertrag</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=\"Vertrag\"><span class=\"card-cell-label\">Vertrag</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=\"Vertrag\"><span class=\"card-cell-label\">Vertrag</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=\"Vertrag\"><span class=\"card-cell-label\">Vertrag</span>Nachrichtenarray mit role und content als wörtlicher Zeichenkette</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=\"Vertrag\"><span class=\"card-cell-label\">Vertrag</span>Tatsächliches UTF-8-Material kann als wörtlicher Zeichenketteninhalt eingesetzt werden; daraus wird keine Dateireferenz abgeleitet.</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=\"Vertrag\"><span class=\"card-cell-label\">Vertrag</span>stream</td></tr></tbody></table></div><p>Lebenszyklus: <code>synchronous_json_or_sse</code></p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Tarife</h3><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>Tarifangaben erweitern die Anfrageoptionen nicht. Unterstützte Parameter stehen bei der ausgewählten Methode.</p><dl data-price-conditions><dt>Schnellmodus</dt><dd>Nicht angegeben <span class=\"note-s\">Wenn der Schnellmodus ausgewählt ist</span></dd><dt>Flex-Modus</dt><dd>Nicht angegeben <span class=\"note-s\">Wenn der Modus flex ausgewählt ist</span></dd><dt>Maximaler Denkaufwand</dt><dd>Nicht angegeben <span class=\"note-s\">Wenn beim maximalen Denkaufwand die Standardanpassung (default) verwendet wird</span></dd></dl></div><div data-declared-tariff-pricing><h4>Ailoot-Tarife</h4><h4>Preise nach Konfiguration</h4><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Konfiguration</th><th>Tarifstaffel</th><th>Gebühr</th></tr></thead><tbody><tr><th data-cell-label=\"Konfiguration\" scope=\"row\"><span class=\"card-cell-label\">Konfiguration</span>Basistarife für Token</th><td data-cell-label=\"Tarifstaffel\"><span class=\"card-cell-label\">Tarifstaffel</span>Grundtarif</td><td data-cell-label=\"Gebühr\"><span class=\"card-cell-label\">Gebühr</span><div><span>Eingabe · Eingabetoken</span> <b>$0</b> <span class=\"price-unit\">/ 1K Tokens</span></div><div><span>Ausgabe · Ausgabetoken</span> <b>$0.2</b> <span class=\"price-unit\">/ 1K Tokens</span></div><div><span>Eingabe · Cache lesen</span> <b>$0</b> <span class=\"price-unit\">/ 1K Tokens</span></div><div><span>Eingabe · Cache schreiben</span> <b>$0</b> <span class=\"price-unit\">/ 1K Tokens</span></div><div><span>Eingabe · Cache schreiben, 1 Stunde</span> <b>—</b> <span class=\"price-unit\">/ 1K Tokens</span></div></td></tr></tbody></table></div></div><p class=\"note-s\">Ailoot reserviert vor einer Anfrage einen geschätzten Betrag. Nach dem Ergebnis rechnet Ailoot die endgültige Gebühr anhand des gemessenen Verbrauchs ab. Bei Streaming erfolgt die Abrechnung anhand des abschliessenden Verbrauchsdatensatzes. <a href=\"/docs/de-ch/billing/reserve/\">So funktionieren Reservierung und Abrechnung →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Beispielanfragen</h3><h4>Ailoot Ultra · Chat Completions</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Codevarianten\"><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 · vollständige JSON-Antwort</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 · vollständige JSON-Antwort</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 · SSE-Stream aufbewahren</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Code kopieren\"><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\">Ergebnisse abrufen und speichern</h3><h4>Ailoot Ultra · Chat Completions</h4><p class=\"note-s\">JSON oder text/event-stream</p><div class=\"card-result-process\" data-all-results><h5>Alle fertiggestellten Ergebnisse aufbewahren</h5><p class=\"note-s\">Bewahren Sie jede vollständig zurückgegebene Antwort, Datei und jeden Inhaltsteil auf.</p><p class=\"note-s\">Bewahren Sie die vollständigen JSON- oder SSE-Bytes, Antwortheader, zurückgegebenen Verbrauchsdaten und sämtliche gelieferten Ergebnisfelder auf. Eine modellspezifische Ausgabefamilie wird nicht zugesichert.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Wenn die ursprüngliche Antwort geprüft werden muss</h5><p class=\"note-s\">Bewahren Sie die ursprüngliche Antwort und Versuchskennung auf; daraus werden weder neue Auftragsabfragen noch ein erneutes Einreichen abgeleitet.</p></div><details class=\"card-about\" data-output-fields><summary>Antwortfelder</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Feld</th><th>Typ</th><th>Bedeutung</th></tr></thead><tbody><tr><th data-cell-label=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">complete response JSON</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span>object</td><td data-cell-label=\"Bedeutung\"><span class=\"card-cell-label\">Bedeutung</span>Bewahren Sie jedes zurückgegebene Feld auf, ohne eine modellspezifische Ergebnisfamilie vorauszusetzen.</td></tr><tr><th data-cell-label=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">SSE data events</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span>stream</td><td data-cell-label=\"Bedeutung\"><span class=\"card-cell-label\">Bedeutung</span>Bewahren Sie jedes zurückgegebene Ereignis und jede Abschlussmarkierung auf, ohne nur Textfelder auszuwählen.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Aliasnamen</h3><h4>Modellaliasnamen</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>Aliasnamen für Methodenpfade</h4><p class=\"note-s\">Verwenden Sie die oben angezeigten Methodenpfade.</p><h4>Zugehörige Aufrufer-IDs</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": "Bewahren Sie die ursprüngliche Antwort und Versuchskennung auf; daraus werden weder neue Auftragsabfragen noch ein erneutes Einreichen abgeleitet."
            },
            "material_combinations": [
              {
                "alternatives": [
                  "message[] with literal string content"
                ],
                "mode": "owned_text_messages"
              }
            ],
            "outputs": {
              "all_results": "Bewahren Sie die vollständigen JSON- oder SSE-Bytes, Antwortheader, zurückgegebenen Verbrauchsdaten und sämtliche gelieferten Ergebnisfelder auf. Eine modellspezifische Ausgabefamilie wird nicht zugesichert.",
              "family": "protocol",
              "fields": [
                {
                  "description": "Bewahren Sie jedes zurückgegebene Feld auf, ohne eine modellspezifische Ergebnisfamilie vorauszusetzen.",
                  "name": "complete response JSON",
                  "type": "object"
                },
                {
                  "description": "Bewahren Sie jedes zurückgegebene Ereignis und jede Abschlussmarkierung auf, ohne nur Textfelder auszuwählen.",
                  "name": "SSE data events",
                  "type": "stream"
                }
              ],
              "format": "JSON oder 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": "Tatsächliches UTF-8-Material kann als wörtlicher Zeichenketteninhalt eingesetzt werden; daraus wird keine Dateireferenz abgeleitet.",
            "material_types": [
              "text"
            ],
            "messages": "Nachrichtenarray mit role und content als wörtlicher Zeichenkette",
            "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": "Basistarife für Token",
            "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=\"Schliessen\">×</button></div><div class=\"idline\"><span>Sonstiges /</span><code>sora-2</code><button type=\"button\" id=\"copy-id\">ID kopieren</button></div><nav class=\"card-jump-nav\" aria-label=\"Bereiche der Modellkarte\"><button type=\"button\" data-card-jump=\"overview\">Einstieg</button><button type=\"button\" data-card-jump=\"methods\">Eingaben und Methoden</button><button type=\"button\" data-card-jump=\"pricing\">Tarife</button><button type=\"button\" data-card-jump=\"examples\">Beispiele</button><button type=\"button\" data-card-jump=\"results\">Ergebnisse</button><button type=\"button\" data-card-jump=\"aliases\">Aliasnamen</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"API-Methoden\"><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\">Einstieg</h3><p class=\"mdesc-full\">Sora 2 erzeugt aus Text oder einer Bildreferenz Videos mit synchronisierten Dialogen, Geräuscheffekten und Hintergrundton. Das Standardprofil unterstützt visuelle Erkundung und Konzeptclips; separate Herstellerabläufe dienen wiederverwendbaren nichtmenschlichen Figuren, Fortsetzungen und gezielten Videobearbeitungen.</p><dl class=\"card-io\" data-card-io><div><dt>Zulässige Eingaben</dt><dd>Text</dd></div><div><dt>Ergebnisse</dt><dd>json · sse</dd></div></dl><details class=\"card-about\"><summary>Über das Modell</summary><p class=\"note-s\" data-model-method-boundary>Diese Beschreibung erläutert die Fähigkeiten des Modells. Die über Ailoot verfügbaren Eingaben, Ausgaben und Optionen sind unten für die ausgewählte Methode aufgeführt.</p><div class=\"mabout\" id=\"m-about\"><p>Sora 2 ist das Modell von OpenAI zur Video- und Audiogenerierung für dynamische Clips aus einer schriftlichen Szenenbeschreibung oder einer Bildreferenz. Es erzeugt die Bildfolge zusammen mit synchronisierter Sprache, Effekten und Hintergrundton. Das Standardprofil Sora 2 ist für visuelle Erkundung, Konzeptentwicklung, Prototypen und Rohschnitte vorgesehen. Sora 2 Pro ist eine separate Ausgabe für höhere Bildtreue und die Fertigstellung in höherer Auflösung.</p><h4>Eine Einstellung beschreiben, die sichtbar und hörbar ist</h4><p>Der Prompting-Leitfaden des Herstellers gliedert ein hilfreiches Briefing nach Bildausschnitt, Motiv, Handlung, Umgebung und Licht. Geben Sie der Szene einen stimmigen visuellen Stil und beschreiben Sie die Bewegung anschliessend in klaren Etappen. Ein eigenständiges Produktkonzept könnte ein kleines mechanisches Objekt zeigen, das sich auf einer Werkbank einmal dreht, während die Kamera langsam näher kommt, bei weichem Fensterlicht und einem dezenten Motorgeräusch. Geben Sie an, worauf die Betrachtenden achten sollen und wie die Handlung endet.</p><p>Halten Sie die Kamerabewegung und die Handlung des Motivs in jeder Einstellung verständlich. Eine komplizierte Sequenz lässt sich in einzelne Einstellungsblöcke mit jeweils eigenem Bildausschnitt, eigener Handlung und Beleuchtung aufteilen. Bewahren Sie dieselben Motivdetails und dieselbe Farbpalette, wenn mehrere Clips eine Sequenz bilden sollen. Der Leitfaden betont, dass kürzere Einstellungen Anweisungen in der Regel zuverlässiger folgen und dass wiederholte Generierungen mit demselben Prompt unterschiedliche Takes liefern.</p><p>Die Modellvorstellung beschreibt verbessertes physikalisches Verhalten und bessere Kontinuität über mehrere Einstellungen hinweg, unter anderem in realistischen, filmischen und Anime-Stilen. Diese vorgesehenen Fähigkeiten müssen gezielt angeleitet und geprüft werden. Kontrollieren Sie Bewegung, Kontakt zwischen Gegenständen, Proportionen und Kontinuität, statt anzunehmen, dass ein plausibles erstes Bild eine stimmige Sequenz garantiert. Wenn eine Handlung unklar ist, vereinfachen Sie sie und geben ihr einen sichtbaren Anfang und ein sichtbares Ende.</p><h4>Dialog und Ton getrennt anleiten</h4><p>Geben Sie gesprochene Sätze getrennt von der visuellen Beschreibung an und kennzeichnen Sie die Sprechenden einheitlich. Halten Sie Dialoge kurz genug, damit sie zur Handlung und zur vorgesehenen Cliplänge passen. Bei einer Animation mit zwei Figuren wechseln Sie eine kurze Frage und Antwort ab, statt in einer kurzen Einstellung eine lange Rede unterbringen zu wollen. Der Leitfaden warnt, dass komplexe, lange Dialoge Tempo und Synchronisierung beeinträchtigen können.</p><p>Beschreiben Sie die zur Szene gehörende Klangkulisse: das Geräusch einer kleinen Bewegung, die Raumatmosphäre oder den Rhythmus eines Umgebungsgeräusches. Erklären Sie, welcher Klang mit der Handlung zusammenfallen soll. Hören Sie die erzeugte Sprache und die Effekte zusammen mit dem Bild an und prüfen Sie Sprecherzuordnung, Wortlaut und Timing. Synchronisierter Ton ist Teil des erzeugten Clips und keine separate Textantwort.</p><h4>Grösse, Dauer und ein bildgeführter Anfang</h4><p>Die dokumentierten Ausgabegrössen des Standardmodells sind 720×1280 im Hochformat und 1280×720 im Querformat. Die höheren Auflösungen des Pro-Profils dürfen nicht dem Standardmodell Sora 2 zugeordnet werden. Grösse und Dauer sind ausdrückliche Anfrageeinstellungen; eine andere Grössenangabe oder der Wunsch nach einem längeren Film im Prompt ändert diese Einstellungen nicht. Die Referenz zur Erstellung nennt Cliplängen von 4, 8 und 12 Sekunden. Planen Sie deshalb eine kurze, klar definierte Handlung für die Einstellung. Der erweiterte Herstellerablauf dokumentiert ausserdem Einstellungen für 16- und 20-sekündige Clips.</p><p>Eine Bildreferenz verankert das erste Einzelbild; der Text beschreibt, was danach geschieht. Der Hersteller unterstützt Referenzen in JPEG, PNG und WebP und verlangt, dass das Bild der Zielgrösse des Videos entspricht. Bereiten Sie Motiv, Umgebung und Komposition in diesem Anfangsbild vor und verlangen Sie dann eine bestimmte Bewegung. Die Referenz legt das Anfangsbild fest, garantiert aber nicht, dass jedes Detail im gesamten Clip identisch bleibt.</p><h4>Wiederverwendbare nichtmenschliche Figuren</h4><p>Der erweiterte Herstellerablauf kann aus einem kurzen Referenzvideo eines Tiers, Maskottchens oder Gegenstands eine wiederverwendbare Figurenressource erstellen. Seine Vorbereitungshinweise nennen einen MP4-Clip von etwa zwei bis vier Sekunden, 720p bis 1080p, in 16:9 oder 9:16. Übereinstimmende Seitenverhältnisse von Quelle und Ausgabe helfen, eine gestreckte Darstellung zu vermeiden. Die Generierung kann bis zu zwei Figuren referenzieren.</p><p>Bewahren Sie die Figurenkennung auf und nennen Sie den Namen der Figur im Prompt; die Kennung allein zu übergeben erfüllt die Vorbereitung des Leitfadens nicht vollständig. Figurenressourcen können zusammen mit einer bildgeführten Generierung verwendet werden, Videoverlängerungen akzeptieren sie jedoch nicht. Der Hersteller blockiert standardmässig Figuren-Uploads mit menschlichem Aussehen und weist im dokumentierten API-Ablauf Referenzbilder mit menschlichen Gesichtern zurück. Die Funktionen der Sora-App für persönliche Figuren gehören zu einem separaten Produktablauf.</p><h4>Einen fertigen Clip fortsetzen oder bearbeiten</h4><p>Eine Verlängerung übernimmt ein abgeschlossenes Quellvideo und einen Fortsetzungs-Prompt. Sie verwendet den gesamten Quellclip als Kontext für Bewegung, Kameraführung und Szenenkontinuität. Der Leitfaden beschreibt Ergänzungen von bis zu 20 Sekunden pro Verlängerung. Als dokumentierte Eingabe dienen Quellvideo und Text; zusätzliche Figuren- oder Bildreferenzen sind in diesem Modus ausgeschlossen. Beschreiben Sie, wie die bestehende Handlung weitergeht, statt ohne Übergang eine unverbundene Szene einzuführen.</p><p>Die Videobearbeitung zielt auf eine klare Änderung an einem bestehenden Clip. Eine gezielte Überarbeitung kann die Farbe eines Gegenstands oder die Farbpalette der Szene ändern und den Rest der Einstellung bewahren. Der Herstellerleitfaden empfiehlt jeweils eine klar abgegrenzte Änderung und unterscheidet die Bearbeitung eines generierten Videos vom Upload beliebigen Filmmaterials, für den eine separate Zulassungsbedingung gilt. Bewahren Sie die abgeschlossene Quelle auf und benennen Sie die genaue gewünschte Änderung, bevor Sie erneut bearbeiten.</p><h4>Renderaufträge und das fertige Video</h4><p>Der dokumentierte Videoablauf des Herstellers ist asynchron: Ein eingereichter Auftrag kann zunächst in der Warteschlange stehen oder in Bearbeitung sein, bevor er abgeschlossen wird oder fehlschlägt. Ein abgeschlossener Auftrag liefert ein MP4-Video; Vorschaubilder und Sprite-Sheets unterstützen Vorschau und Durchsicht. Bewahren Sie die Auftragskennung zusammen mit Prompt, Referenzen und zurückgegebenen Ressourcen auf. Eine erste Auftragsantwort ist noch nicht das fertige abspielbare Video.</p><p>Der gewöhnliche Downloadablauf beschreibt eine Gültigkeit der Download-URL von einer Stunde. Der erweiterte Stapelablauf bereitet unabhängige JSON-Renderanfragen mit stabilen Elementkennungen, hochgeladenen Referenzen und einer Zuordnung jedes Ergebnisses zur jeweiligen Einstellung vor; für seine abgeschlossenen Ressourcen gilt ein separater Downloadzeitraum von bis zu 24 Stunden. Speichern Sie den fertigen Clip zeitnah und prüfen Sie das tatsächliche Bild und den Ton, bevor Sie ihn als ausgewählten Take behandeln.</p><p>Die dokumentierten API-Inhaltsbeschränkungen des Herstellers verlangen für Personen unter 18 Jahren geeignetes Material und weisen urheberrechtlich geschützte Figuren oder Musik sowie die Generierung realer Personen zurück. Bereiten Sie Szene und Referenzen entsprechend vor. Das direkte Modellergebnis ist ein Video mit Ton, keine generierten Standbilder, keine dialogbasierte Tool-Antwort und kein unbegrenzt langer Film. Bewahren Sie die genaue Identität des Standardmodells und den akzeptierten Quellclip, wenn Sie ein visuelles Konzept fortsetzen.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">In Ailoot verfügbar · Eingaben und Methoden</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>Eingabe</dt><dd><code>text</code></dd></div><div><dt>Ausgabe</dt><dd><code>json</code>, <code>sse</code></dd></div><div><dt>Ausgabeformat</dt><dd>JSON oder SSE</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Feld</th><th>Typ</th><th>Anforderung</th><th>Werte und Limits</th><th>Standard</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span><code>string</code></td><td data-cell-label=\"Anforderung\"><span class=\"card-cell-label\">Anforderung</span>Erforderlich</td><td data-cell-label=\"Werte und Limits\"><span class=\"card-cell-label\">Werte und Limits</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=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">messages</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span><code>message[]</code></td><td data-cell-label=\"Anforderung\"><span class=\"card-cell-label\">Anforderung</span>Erforderlich</td><td data-cell-label=\"Werte und Limits\"><span class=\"card-cell-label\">Werte und Limits</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=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">messages[].role</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span><code>string</code></td><td data-cell-label=\"Anforderung\"><span class=\"card-cell-label\">Anforderung</span>Erforderlich</td><td data-cell-label=\"Werte und Limits\"><span class=\"card-cell-label\">Werte und Limits</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=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">messages[].content</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span><code>string</code></td><td data-cell-label=\"Anforderung\"><span class=\"card-cell-label\">Anforderung</span>Erforderlich</td><td data-cell-label=\"Werte und Limits\"><span class=\"card-cell-label\">Werte und Limits</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=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">max_tokens</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span><code>integer</code></td><td data-cell-label=\"Anforderung\"><span class=\"card-cell-label\">Anforderung</span>Erforderlich</td><td data-cell-label=\"Werte und Limits\"><span class=\"card-cell-label\">Werte und Limits</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=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">stream</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span><code>boolean</code></td><td data-cell-label=\"Anforderung\"><span class=\"card-cell-label\">Anforderung</span>Optional</td><td data-cell-label=\"Werte und Limits\"><span class=\"card-cell-label\">Werte und Limits</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>Kombinationen von Eingabematerialien</summary><p class=\"note-s\"><b>Text</b> · UTF-8-Text</p><p class=\"note-s\"><code>Zeichenfolge messages[].content</code></p></details><details class=\"note-s\" data-method-contract><summary>Methodenparameter und Lebenszyklus</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Parameter</th><th>Vertrag</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=\"Vertrag\"><span class=\"card-cell-label\">Vertrag</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=\"Vertrag\"><span class=\"card-cell-label\">Vertrag</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=\"Vertrag\"><span class=\"card-cell-label\">Vertrag</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=\"Vertrag\"><span class=\"card-cell-label\">Vertrag</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=\"Vertrag\"><span class=\"card-cell-label\">Vertrag</span>Das tatsächliche UTF-8-Dokument lesen und seinen Text in die angegebene Zeichenfolge für Eingabe oder Nachrichteninhalt einfügen.</td></tr></tbody></table></div><p>Lebenszyklus: <code>synchronous_or_streamed</code></p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Tarife</h3><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>Tarifangaben erweitern die Anfrageoptionen nicht. Unterstützte Parameter stehen bei der ausgewählten Methode.</p><dl data-price-conditions><dt>Schnellmodus</dt><dd>Nicht angegeben <span class=\"note-s\">Wenn der Schnellmodus ausgewählt ist</span></dd><dt>Flex-Modus</dt><dd>Nicht angegeben <span class=\"note-s\">Wenn der Modus flex ausgewählt ist</span></dd><dt>Maximaler Denkaufwand</dt><dd>Nicht angegeben <span class=\"note-s\">Wenn beim maximalen Denkaufwand die Standardanpassung (default) verwendet wird</span></dd></dl></div><div data-declared-tariff-pricing><h4>Ailoot-Tarife</h4><h4>Preise nach Konfiguration</h4><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Konfiguration</th><th>Tarifstaffel</th><th>Gebühr</th></tr></thead><tbody><tr><th data-cell-label=\"Konfiguration\" scope=\"row\"><span class=\"card-cell-label\">Konfiguration</span>Basistarife für Token</th><td data-cell-label=\"Tarifstaffel\"><span class=\"card-cell-label\">Tarifstaffel</span>Grundtarif</td><td data-cell-label=\"Gebühr\"><span class=\"card-cell-label\">Gebühr</span><div><span>Eingabe · Eingabetoken</span> <b>$0</b> <span class=\"price-unit\">/ 1K Tokens</span></div><div><span>Ausgabe · Ausgabetoken</span> <b>$0.2</b> <span class=\"price-unit\">/ 1K Tokens</span></div><div><span>Eingabe · Cache lesen</span> <b>$0</b> <span class=\"price-unit\">/ 1K Tokens</span></div><div><span>Eingabe · Cache schreiben</span> <b>$0</b> <span class=\"price-unit\">/ 1K Tokens</span></div><div><span>Eingabe · Cache schreiben, 1 Stunde</span> <b>—</b> <span class=\"price-unit\">/ 1K Tokens</span></div></td></tr></tbody></table></div></div><p class=\"note-s\">Ailoot reserviert vor einer Anfrage einen geschätzten Betrag. Nach dem Ergebnis rechnet Ailoot die endgültige Gebühr anhand des gemessenen Verbrauchs ab. Bei Streaming erfolgt die Abrechnung anhand des abschliessenden Verbrauchsdatensatzes. <a href=\"/docs/de-ch/billing/reserve/\">So funktionieren Reservierung und Abrechnung →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Beispielanfragen</h3><h4>Ailoot Ultra · Anthropic Messages</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Codevarianten\"><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\">Vollständiger minimaler JSON-Body</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 · eigenes UTF-8-Dokument verwenden</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 · das vollständige Ergebnis speichern</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Code kopieren\"><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\">Ergebnisse abrufen und speichern</h3><h4>Ailoot Ultra · Anthropic Messages</h4><p class=\"note-s\">JSON oder SSE</p><div class=\"card-result-process\" data-all-results><h5>Alle fertiggestellten Ergebnisse aufbewahren</h5><p class=\"note-s\">Bewahren Sie jede vollständig zurückgegebene Antwort, Datei und jeden Inhaltsteil auf.</p><p class=\"note-s\">Alle Inhaltsblöcke, Thinking-Signaturen und tatsächlichen Werkzeugaufruf-IDs beibehalten. Alle SSE-Blockdeltas zusammensetzen; der erste Textblock ist nicht die vollständige Ausgabe.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Wenn die ursprüngliche Antwort geprüft werden muss</h5><p class=\"note-s\">Anfrage- und Antwort-IDs sowie Header beibehalten. Eine allgemeine URL zum Abrufen von Textaufträgen wird nicht angegeben.</p></div><details class=\"card-about\" data-output-fields><summary>Antwortfelder</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Feld</th><th>Typ</th></tr></thead><tbody><tr><th data-cell-label=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">id</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span>string</td></tr><tr><th data-cell-label=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span>string</td></tr><tr><th data-cell-label=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">content[]</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span>text|thinking|tool_use|other content block</td></tr><tr><th data-cell-label=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">stop_reason</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span>string|null</td></tr><tr><th data-cell-label=\"Feld\" scope=\"row\"><span class=\"card-cell-label\">Feld</span><code class=\"card-field-name\">usage</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span>object</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Fehler und nächste Schritte</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Antwort</th><th>Bedingung</th><th>Nächster Schritt</th></tr></thead><tbody><tr><th data-cell-label=\"Antwort\" scope=\"row\"><span class=\"card-cell-label\">Antwort</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Bedingung\"><span class=\"card-cell-label\">Bedingung</span>Pflichtfelder, Darstellung des Eingabematerials oder Parameterwert ungültig</td><td data-cell-label=\"Nächster Schritt\"><span class=\"card-cell-label\">Nächster Schritt</span>Die angegebenen Felder vor einer neuen Erstellungsanfrage korrigieren.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Aliasnamen</h3><h4>Modellaliasnamen</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>Aliasnamen für Methodenpfade</h4><p class=\"note-s\">Verwenden Sie die oben angezeigten Methodenpfade.</p><h4>Zugehörige Aufrufer-IDs</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": "Pflichtfelder, Darstellung des Eingabematerials oder Parameterwert ungültig",
                "http_status": 400,
                "recovery": "Die angegebenen Felder vor einer neuen Erstellungsanfrage korrigieren.",
                "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": "Anfrage- und Antwort-IDs sowie Header beibehalten. Eine allgemeine URL zum Abrufen von Textaufträgen wird nicht angegeben."
            },
            "material_combinations": [
              {
                "mode": "text",
                "representation": "Zeichenfolge messages[].content",
                "required_material": "UTF-8-Text"
              }
            ],
            "operation_modes": [
              "synchronous_json",
              "streamed_SSE"
            ],
            "outputs": {
              "all_results": "Alle Inhaltsblöcke, Thinking-Signaturen und tatsächlichen Werkzeugaufruf-IDs beibehalten. Alle SSE-Blockdeltas zusammensetzen; der erste Textblock ist nicht die vollständige Ausgabe.",
              "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 oder 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": "Das tatsächliche UTF-8-Dokument lesen und seinen Text in die angegebene Zeichenfolge für Eingabe oder Nachrichteninhalt einfügen."
          },
          "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": "Basistarife für Token",
            "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": "e6f025bcfea345c6de5e0fae22ae1ed7e5d65de491db22c0a0e41e786c646d3b",
    "input_html_sha256": "dd9b33599621c38835e97d3176983c9c881c30e51f63f7b43baf6201059430bb",
    "private_audit_sha256": "069eeb6e1a2375601e14b149d8e1d26aaf64430d5a9b09b2fb0b613b3333e07f",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/de-ch/sora-2/",
    "description": "Sora 2 erzeugt aus Text oder einer Bildreferenz Videos mit synchronisierten Dialogen, Geräuscheffekten und Hintergrundton. Das Standardprofil unterstützt visuelle Erkundung und Konzeptclips; separate Herstellerabläufe dienen wiederverwendbaren nichtmenschlichen Figuren, Fortsetzungen und gezielten Videobearbeitungen.",
    "locale": "de-ch",
    "md_url": "https://ailoot.ai/models/de-ch/sora-2/index.md",
    "title": "sora-2 — Ailoot",
    "url": "https://ailoot.ai/models/de-ch/sora-2/"
  },
  "rawModel": {
    "about": "Sora 2 ist das Modell von OpenAI zur Video- und Audiogenerierung für dynamische Clips aus einer schriftlichen Szenenbeschreibung oder einer Bildreferenz. Es erzeugt die Bildfolge zusammen mit synchronisierter Sprache, Effekten und Hintergrundton. Das Standardprofil Sora 2 ist für visuelle Erkundung, Konzeptentwicklung, Prototypen und Rohschnitte vorgesehen. Sora 2 Pro ist eine separate Ausgabe für höhere Bildtreue und die Fertigstellung in höherer Auflösung.\n\n### Eine Einstellung beschreiben, die sichtbar und hörbar ist\n\nDer Prompting-Leitfaden des Herstellers gliedert ein hilfreiches Briefing nach Bildausschnitt, Motiv, Handlung, Umgebung und Licht. Geben Sie der Szene einen stimmigen visuellen Stil und beschreiben Sie die Bewegung anschliessend in klaren Etappen. Ein eigenständiges Produktkonzept könnte ein kleines mechanisches Objekt zeigen, das sich auf einer Werkbank einmal dreht, während die Kamera langsam näher kommt, bei weichem Fensterlicht und einem dezenten Motorgeräusch. Geben Sie an, worauf die Betrachtenden achten sollen und wie die Handlung endet.\n\nHalten Sie die Kamerabewegung und die Handlung des Motivs in jeder Einstellung verständlich. Eine komplizierte Sequenz lässt sich in einzelne Einstellungsblöcke mit jeweils eigenem Bildausschnitt, eigener Handlung und Beleuchtung aufteilen. Bewahren Sie dieselben Motivdetails und dieselbe Farbpalette, wenn mehrere Clips eine Sequenz bilden sollen. Der Leitfaden betont, dass kürzere Einstellungen Anweisungen in der Regel zuverlässiger folgen und dass wiederholte Generierungen mit demselben Prompt unterschiedliche Takes liefern.\n\nDie Modellvorstellung beschreibt verbessertes physikalisches Verhalten und bessere Kontinuität über mehrere Einstellungen hinweg, unter anderem in realistischen, filmischen und Anime-Stilen. Diese vorgesehenen Fähigkeiten müssen gezielt angeleitet und geprüft werden. Kontrollieren Sie Bewegung, Kontakt zwischen Gegenständen, Proportionen und Kontinuität, statt anzunehmen, dass ein plausibles erstes Bild eine stimmige Sequenz garantiert. Wenn eine Handlung unklar ist, vereinfachen Sie sie und geben ihr einen sichtbaren Anfang und ein sichtbares Ende.\n\n### Dialog und Ton getrennt anleiten\n\nGeben Sie gesprochene Sätze getrennt von der visuellen Beschreibung an und kennzeichnen Sie die Sprechenden einheitlich. Halten Sie Dialoge kurz genug, damit sie zur Handlung und zur vorgesehenen Cliplänge passen. Bei einer Animation mit zwei Figuren wechseln Sie eine kurze Frage und Antwort ab, statt in einer kurzen Einstellung eine lange Rede unterbringen zu wollen. Der Leitfaden warnt, dass komplexe, lange Dialoge Tempo und Synchronisierung beeinträchtigen können.\n\nBeschreiben Sie die zur Szene gehörende Klangkulisse: das Geräusch einer kleinen Bewegung, die Raumatmosphäre oder den Rhythmus eines Umgebungsgeräusches. Erklären Sie, welcher Klang mit der Handlung zusammenfallen soll. Hören Sie die erzeugte Sprache und die Effekte zusammen mit dem Bild an und prüfen Sie Sprecherzuordnung, Wortlaut und Timing. Synchronisierter Ton ist Teil des erzeugten Clips und keine separate Textantwort.\n\n### Grösse, Dauer und ein bildgeführter Anfang\n\nDie dokumentierten Ausgabegrössen des Standardmodells sind 720×1280 im Hochformat und 1280×720 im Querformat. Die höheren Auflösungen des Pro-Profils dürfen nicht dem Standardmodell Sora 2 zugeordnet werden. Grösse und Dauer sind ausdrückliche Anfrageeinstellungen; eine andere Grössenangabe oder der Wunsch nach einem längeren Film im Prompt ändert diese Einstellungen nicht. Die Referenz zur Erstellung nennt Cliplängen von 4, 8 und 12 Sekunden. Planen Sie deshalb eine kurze, klar definierte Handlung für die Einstellung. Der erweiterte Herstellerablauf dokumentiert ausserdem Einstellungen für 16- und 20-sekündige Clips.\n\nEine Bildreferenz verankert das erste Einzelbild; der Text beschreibt, was danach geschieht. Der Hersteller unterstützt Referenzen in JPEG, PNG und WebP und verlangt, dass das Bild der Zielgrösse des Videos entspricht. Bereiten Sie Motiv, Umgebung und Komposition in diesem Anfangsbild vor und verlangen Sie dann eine bestimmte Bewegung. Die Referenz legt das Anfangsbild fest, garantiert aber nicht, dass jedes Detail im gesamten Clip identisch bleibt.\n\n### Wiederverwendbare nichtmenschliche Figuren\n\nDer erweiterte Herstellerablauf kann aus einem kurzen Referenzvideo eines Tiers, Maskottchens oder Gegenstands eine wiederverwendbare Figurenressource erstellen. Seine Vorbereitungshinweise nennen einen MP4-Clip von etwa zwei bis vier Sekunden, 720p bis 1080p, in 16:9 oder 9:16. Übereinstimmende Seitenverhältnisse von Quelle und Ausgabe helfen, eine gestreckte Darstellung zu vermeiden. Die Generierung kann bis zu zwei Figuren referenzieren.\n\nBewahren Sie die Figurenkennung auf und nennen Sie den Namen der Figur im Prompt; die Kennung allein zu übergeben erfüllt die Vorbereitung des Leitfadens nicht vollständig. Figurenressourcen können zusammen mit einer bildgeführten Generierung verwendet werden, Videoverlängerungen akzeptieren sie jedoch nicht. Der Hersteller blockiert standardmässig Figuren-Uploads mit menschlichem Aussehen und weist im dokumentierten API-Ablauf Referenzbilder mit menschlichen Gesichtern zurück. Die Funktionen der Sora-App für persönliche Figuren gehören zu einem separaten Produktablauf.\n\n### Einen fertigen Clip fortsetzen oder bearbeiten\n\nEine Verlängerung übernimmt ein abgeschlossenes Quellvideo und einen Fortsetzungs-Prompt. Sie verwendet den gesamten Quellclip als Kontext für Bewegung, Kameraführung und Szenenkontinuität. Der Leitfaden beschreibt Ergänzungen von bis zu 20 Sekunden pro Verlängerung. Als dokumentierte Eingabe dienen Quellvideo und Text; zusätzliche Figuren- oder Bildreferenzen sind in diesem Modus ausgeschlossen. Beschreiben Sie, wie die bestehende Handlung weitergeht, statt ohne Übergang eine unverbundene Szene einzuführen.\n\nDie Videobearbeitung zielt auf eine klare Änderung an einem bestehenden Clip. Eine gezielte Überarbeitung kann die Farbe eines Gegenstands oder die Farbpalette der Szene ändern und den Rest der Einstellung bewahren. Der Herstellerleitfaden empfiehlt jeweils eine klar abgegrenzte Änderung und unterscheidet die Bearbeitung eines generierten Videos vom Upload beliebigen Filmmaterials, für den eine separate Zulassungsbedingung gilt. Bewahren Sie die abgeschlossene Quelle auf und benennen Sie die genaue gewünschte Änderung, bevor Sie erneut bearbeiten.\n\n### Renderaufträge und das fertige Video\n\nDer dokumentierte Videoablauf des Herstellers ist asynchron: Ein eingereichter Auftrag kann zunächst in der Warteschlange stehen oder in Bearbeitung sein, bevor er abgeschlossen wird oder fehlschlägt. Ein abgeschlossener Auftrag liefert ein MP4-Video; Vorschaubilder und Sprite-Sheets unterstützen Vorschau und Durchsicht. Bewahren Sie die Auftragskennung zusammen mit Prompt, Referenzen und zurückgegebenen Ressourcen auf. Eine erste Auftragsantwort ist noch nicht das fertige abspielbare Video.\n\nDer gewöhnliche Downloadablauf beschreibt eine Gültigkeit der Download-URL von einer Stunde. Der erweiterte Stapelablauf bereitet unabhängige JSON-Renderanfragen mit stabilen Elementkennungen, hochgeladenen Referenzen und einer Zuordnung jedes Ergebnisses zur jeweiligen Einstellung vor; für seine abgeschlossenen Ressourcen gilt ein separater Downloadzeitraum von bis zu 24 Stunden. Speichern Sie den fertigen Clip zeitnah und prüfen Sie das tatsächliche Bild und den Ton, bevor Sie ihn als ausgewählten Take behandeln.\n\nDie dokumentierten API-Inhaltsbeschränkungen des Herstellers verlangen für Personen unter 18 Jahren geeignetes Material und weisen urheberrechtlich geschützte Figuren oder Musik sowie die Generierung realer Personen zurück. Bereiten Sie Szene und Referenzen entsprechend vor. Das direkte Modellergebnis ist ein Video mit Ton, keine generierten Standbilder, keine dialogbasierte Tool-Antwort und kein unbegrenzt langer Film. Bewahren Sie die genaue Identität des Standardmodells und den akzeptierten Quellclip, wenn Sie ein visuelles Konzept fortsetzen.",
    "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": "Die vollständigen Preisangaben zur Konfiguration finden Sie in den Details."
      }
    ],
    "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": "Bewahren Sie die ursprüngliche Antwort und Versuchskennung auf; daraus werden weder neue Auftragsabfragen noch ein erneutes Einreichen abgeleitet."
            },
            "material_combinations": [
              {
                "alternatives": [
                  "message[] with literal string content"
                ],
                "mode": "owned_text_messages"
              }
            ],
            "outputs": {
              "all_results": "Bewahren Sie die vollständigen JSON- oder SSE-Bytes, Antwortheader, zurückgegebenen Verbrauchsdaten und sämtliche gelieferten Ergebnisfelder auf. Eine modellspezifische Ausgabefamilie wird nicht zugesichert.",
              "family": "protocol",
              "fields": [
                {
                  "description": "Bewahren Sie jedes zurückgegebene Feld auf, ohne eine modellspezifische Ergebnisfamilie vorauszusetzen.",
                  "name": "complete response JSON",
                  "type": "object"
                },
                {
                  "description": "Bewahren Sie jedes zurückgegebene Ereignis und jede Abschlussmarkierung auf, ohne nur Textfelder auszuwählen.",
                  "name": "SSE data events",
                  "type": "stream"
                }
              ],
              "format": "JSON oder 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": "Tatsächliches UTF-8-Material kann als wörtlicher Zeichenketteninhalt eingesetzt werden; daraus wird keine Dateireferenz abgeleitet.",
            "material_types": [
              "text"
            ],
            "messages": "Nachrichtenarray mit role und content als wörtlicher Zeichenkette",
            "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": "Basistarife für Token",
            "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": "Pflichtfelder, Darstellung des Eingabematerials oder Parameterwert ungültig",
                "http_status": 400,
                "recovery": "Die angegebenen Felder vor einer neuen Erstellungsanfrage korrigieren.",
                "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": "Anfrage- und Antwort-IDs sowie Header beibehalten. Eine allgemeine URL zum Abrufen von Textaufträgen wird nicht angegeben."
            },
            "material_combinations": [
              {
                "mode": "text",
                "representation": "Zeichenfolge messages[].content",
                "required_material": "UTF-8-Text"
              }
            ],
            "operation_modes": [
              "synchronous_json",
              "streamed_SSE"
            ],
            "outputs": {
              "all_results": "Alle Inhaltsblöcke, Thinking-Signaturen und tatsächlichen Werkzeugaufruf-IDs beibehalten. Alle SSE-Blockdeltas zusammensetzen; der erste Textblock ist nicht die vollständige Ausgabe.",
              "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 oder 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": "Das tatsächliche UTF-8-Dokument lesen und seinen Text in die angegebene Zeichenfolge für Eingabe oder Nachrichteninhalt einfügen."
          },
          "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": "Basistarife für Token",
            "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 erzeugt aus Text oder einer Bildreferenz Videos mit synchronisierten Dialogen, Geräuscheffekten und Hintergrundton. Das Standardprofil unterstützt visuelle Erkundung und Konzeptclips; separate Herstellerabläufe dienen wiederverwendbaren nichtmenschlichen Figuren, Fortsetzungen und gezielten Videobearbeitungen."
  },
  "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 erzeugt aus Text oder einer Bildreferenz Videos mit synchronisierten Dialogen, Geräuscheffekten und Hintergrundton. Das Standardprofil unterstützt visuelle Erkundung und Konzeptclips; separate Herstellerabläufe dienen wiederverwendbaren nichtmenschlichen Figuren, Fortsetzungen und gezielten Videobearbeitungen.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "fd6a823f524015311e005f8887655992e4974fd2113f5ec336658dc2391a02e1",
    "renderer_sha256": "76caa42c097db2ddc47d1e1e6fe7ca45c8363d7211296daf28e4352971e6c0c8"
  },
  "sourceRevision": "75a14a2db8bfe40debc3457d8098f635a05b5ea59e6f6f5d5eaed6a3126ac979"
}
