Was ein LLM in einer Video-Pipeline macht
Wenn du einen Workflow für ein NSFW-Video-Script-LLM-API erstellst, ist die erste Entscheidung die Aufgabenteilung. Ein Sprachmodell schreibt. Ein separates Videomodell, ein Editor oder ein Shooting erzeugt das Material. Dieser Dienst bietet nur den ersten Teil: ein Open-Weight-Textmodell, das darauf abgestimmt ist, bei rechtlicher Verwendung durch Erwachsene ohne Ablehnung von Inhalten zu antworten, hinter einem OpenAI-kompatiblen Endpunkt. Es rendert keinen Frame, erzeugt keine Stimme und kein Bild und bietet keine Embeddings oder Fine-Tuning.
Das deckt noch viel der Arbeit um ein Projekt für ein erwachsenes Publikum ab, wie Fiktion, Rollenspiel und Begleit-Erzählungen. Das Modell kann einen Entwurf verfassen, ihn in Szenen aufteilen, Dialoge und Erzählungen schreiben, eine Szenen-für-Szene-Liste erstellen und Prompts für das Videotool deiner Wahl formulieren. Die Seite zu NSFW-Pipelines beschreibt, wie diese Textphase in den Rest der Stack-Architektur eingebunden wird.
Eine Regel ist fest und gilt für jede Anfrage: Keine sexuellen Inhalte mit Minderjährigen. Baue deinen System-Prompt so, dass jeder Charakter erwachsen ist, und betrachte dies als Projektanforderung, nicht als Nachgedanke.
Eine Pipeline in vier Phasen
Ein Skript-Workflow funktioniert am besten, wenn jeder Aufruf eine Aufgabe erledigt und strukturierte Ausgabe an die nächste weitergibt. Ein praktisches Layout sieht so aus:
- Story Bible. Ein Dokument mit Charakteren (alle erwachsen), Setting, Tonfall und wiederkehrenden Details. Du schreibst es einmal und sendest es mit jedem Aufruf.
- Gliederung. Ein Aufruf wandelt eine Prämisse in 8 bis 15 Beat-Zusammenfassungen um.
- Drehbücher für Szenen. Ein Aufruf pro Beat erzeugt Dialoge, Handlungsanweisungen und Erzähltext unter Verwendung der Story Bible und der vorherigen Szene für Kontinuität.
- Shotliste und Prompts. Ein letzter Aufruf pro Szene gibt JSON zurück: Shots, Dauer, Kameraanmerkungen und einen Prompt-String für dein Videotool.
Diese Aufteilung hält die Ausgaben kurz, was jede Ausgabe leichter überprüfbar und bei Missfallen günstiger zu regenerieren macht. Es bedeutet auch, dass ein fehlgeschlagener Aufruf nur eine Szene kostet, nicht das ganze Skript.
Ein System-Prompt, der die Regeln festlegt
Der System-Prompt ist der Ort für Tonfall, Format und Grenzen. Ein Modell ohne Ablehnungsverhalten folgt immer noch Anweisungen, also entscheidet die Qualität deines Prompts die Qualität des Skripts. Sei spezifisch bezüglich Genre, Perspektive und was weggelassen werden soll. Hier ist ein Startpunkt für Fiktion für erwachsene Zuschauer, der innerhalb der professionellen Grenzen bleibt:
SYSTEM = '''You are a screenwriter for adult-audience fiction videos.
All characters are adults aged 25 or older, and you state each age in the character sheet.
Write in present tense, third person, with short visual action lines.
Keep dialogue natural and under 25 words per line.
Build tension and character through setting, glances and subtext.
Never include minors in any role or reference.
Follow the story bible exactly; do not change names, ages or relationships.
When asked for JSON, return only the JSON object.'''
Passe ihn pro Projekt an. Ein Noir-Mystery und eine Romantik-Komödie brauchen unterschiedliche Anweisungen, und ein einzeiliges Stilbeispiel im Prompt lenkt das Modell oft besser als ein Absatz Adjektive.
Generierung einer Szenenliste im JSON-Modus
Für die Shooting-Phase möchtest du eine Ausgabe, die Code lesen kann. Der JSON-Modus erzwingt ein parsbares Objekt. Übergebe response_format={"type": "json_object"}, benenne die Schlüssel im Prompt und halte die Temperatur niedrig. Dieses Beispiel nutzt das Python-openai-Paket mit der Basis-URL dieser Seite und der Modell-ID uncensored.
import json, os
from openai import OpenAI
client = OpenAI(
base_url="https://api.nsfwvideogenerator.cc/v1",
api_key=os.environ["NOTRACK_API_KEY"],
)
SYSTEM = open("system_prompt.txt").read()
BIBLE = open("story_bible.txt").read()
def shot_list(scene_text):
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": SYSTEM},
{"role": "user", "content": (
"Story bible:\n" + BIBLE +
"\n\nScene script:\n" + scene_text +
"\n\nReturn a JSON object with key 'shots': a list of objects with "
"'number', 'seconds', 'camera', 'action' and 'video_prompt'."
)},
],
response_format={"type": "json_object"},
temperature=0.3,
seed=7,
)
data = json.loads(resp.choices[0].message.content)
return data["shots"]
for shot in shot_list(open("scene_03.txt").read()):
print(shot["number"], shot["seconds"], shot["video_prompt"])
Validiere das Ergebnis, bevor du es weitergibst. Prüfe, dass shots existiert, dass seconds eine Zahl ist und die Prompt-Strings nicht leer sind. Wenn das Parsing fehlschlägt, versuche es einmal erneut. Fehlgeschlagene oder abgelehnte Anfragen werden nicht berechnet, also kostet ein Retry bei einem Fehler nichts.
Einstellungen, die für kreativen Text wichtig sind
Verschiedene Phasen brauchen unterschiedliche Einstellungen, und die API übergibt die üblichen: temperature, top_p, stop, seed sowie die Frequenz- und Präsenzstrafen.
- Gliederungen und Dialoge: Temperatur 0,8 bis 1,0 für Abwechslung. Generiere zwei oder drei Varianten und wähle eine aus.
- Shooting-Listen: Temperatur 0,2 bis 0,3, plus einen festen
seed, damit ein erneuter Durchlauf derselben Eingabe vergleichbar ist. - Wiederholung: Lange Szenen durchlaufen manchmal dieselbe Phrase. Eine kleine Frequenzstrafe, z. B. 0,3, hilft.
- Längenkontrolle:
max_tokensist optional, aber eine Obergrenze von 800 für eine Szene hält die Ausgabe kompakt. Einestop-Folge wie"END SCENE"lässt dich bei einem Marker enden, den du das Modell schreiben lässt. - Streaming: Aktiviere
stream: true, wenn ein Autor die Ausgabe live sieht. Denke daran, dass ein Stream seine Concurrency-Position bis zum Ende hält.
Die Schnellstartanleitung listet alle unterstützten Parameter auf, und die Endpunkte sind POST /v1/chat/completions und GET /v1/models.
Das 100k-Kontextfenster für Kontinuität nutzen
Kontinuität ist das übliche Versagen bei generierten Drehbüchern: Ein Name ändert sich, ein Alter driftet ab, ein Requisit verschwindet. Das Kontextfenster umfasst 100.000 Token, Prompt plus Vervollständigung, und das ist groß genug, um die gesamte Story Bible, das Outline und mehrere fertige Szenen in jede Anfrage zu packen. Du brauchst für ein Projekt in diesem Umfang kein Retrieval-System. Füge die Fakten ein und lass das Modell sie jedes Mal lesen.
Kontext ist nicht kostenlos, aber er ist günstig. Angenommen, deine Bible und der Entwurf ergeben 20.000 Token und du schreibst 50 Szenen, jede Ausgabe ca. 600 Token:
- Input: 50 x 20.000 = 1.000.000 Token x $0,15 pro 1M = $0,15
- Output: 50 x 600 = 30.000 Token x $0,50 pro 1M = $0,015
- Gesamt: $0,165 für alle 50 Szenen
Füge eine Shooting-Listen-Phase über dieselben 50 Szenen mit 3.000 Token Input und 500 Token Output hinzu: Input 150.000 Token kostet $0,0225 und Output 25.000 Token kostet $0,0125, weitere $0,035. Das vollständige Drehbuch und die Shooting-Listen kosten etwa $0,20, was weniger ist als das Testguthaben von $0,50, das du auf der API-Schlüssel-Seite beanspruchen kannst.
Behalte im Kopf, dass das Fenster sowohl Prompt als auch Antwort halten muss. Eine 20.000-Token-Bible lässt viel Platz, aber ein 95.000-Token-Prompt lässt wenig für die Vervollständigung.
Überprüfung und Korrektur der Ausgabe
Behandle jede generierte Szene als ersten Entwurf. Drei Checks fangen die meisten Probleme ab, bevor sie ein Videotool erreichen. Erstens: Führe einen Konsistenzdurchlauf durch: Sende das fertige Skript zurück mit der Story Bible und bitte das Modell, jede Stelle aufzulisten, an der Name, Alter, Ort oder Zeitleine abweichen. Ein zweiter Aufruf mit niedriger Temperatur ist günstig und findet oft Abweichungen, die du übersehen hast. Zweitens: Lies den Dialog laut vor. Zeilen, die auf dem Bildschirm gut aussehen, können beim Sprechen umständlich sein, und ein Synchronsprecher oder ein Text-to-Speech-Dienst deckt sie sofort auf. Drittens: Prüfe, ob die Szenendauern die geplante Länge ergeben. Modelle sind bei Arithmetik locker, also addiere die seconds-Felder im Code, statt einer vom Modell geschriebenen Gesamtsumme zu vertrauen.
Wenn eine Szene am Ziel vorbeingeht, widerstehe dem Drang, das ganze System-Prompt zu ändern. Füge eine korrigierende Anweisung zur User-Nachricht hinzu, z. B. "kürzere Handlungsanweisungen" oder "mehr Dialog, weniger Beschreibung", und regeneriere nur diese Szene. Die Bible und den System-Prompt fix zu halten, während du eine Anweisung nach der anderen änderst, macht klar, welche Änderung half. Der Parameter seed ist hier nützlich, weil ein fester Seed mit einer kleinen Prompt-Änderung die Wirkung der Änderung isoliert.
Grenzen, Ehrlichkeit und nächste Schritte
Einige einfache Einschränkungen vor der Erstellung. Das Modell ist nur Text, also müssen jedes Video, jedes Bild und jeder Voice-Track von anderen Tools stammen. Es ist ein Open-Weight-Modell, das von einem unabhängigen Anbieter betrieben wird, und es ist nicht die offizielle API eines großen Anbieters. Die Qualität variiert je nach Prompt, plane also eine Prüfung durch eine Person für jedes Drehbuch ein; betrachte die Ausgabe als Entwurf.
Bezüglich des Durchsatzes erlaubt ein voller Schlüssel 8 parallele Anfragen und 300 pro Minute, während ein Test-Schlüssel 2 und 60 erlaubt. Wenn du Szenen parallel schreibst, dimensioniere deinen Worker-Pool entsprechend. Ein 429 mit rate_limited oder concurrency bedeutet langsamer werden; einer mit einem Retry-After: 5-Header bedeutet, dass der Dienst kurz überlastet ist, also warte fünf Sekunden und versuche es erneut. Prompts werden nicht zum Training verwendet.
Bezahltes Guthaben beginnt bei einer Aufladung von $20, jedem ganzen Betrag bis zu $500, mit +5% ab $50, +10% ab $100 und +15% ab $200. Die Zahlung ist nur Krypto, USDT auf TRC20 oder USDC auf Base, und das Guthaben verfällt nie. Aktuelle Nutzungsbedingungen findest du auf der Preisseite. Für ein Projekt wie das oben genannte reicht $20 für Dutzende vollständiger Drehbücher.
