Wat een LLM doet in een videopipeline
Als je een nsfw-video script LLM API-werkstroom bouwt, is het eerste wat je moet regelen de verdeling van taken. Een taalmodel schrijft. Een apart videomodel, een editor of een opname maakt de beelden. Deze dienst levert alleen het eerste deel: één open-weight tekstmodel, afgestemd op het geven van antwoorden zonder contentafwijzingen voor wettelijk volwassen gebruik, achter een OpenAI-compatible endpoint. Het zal geen frame renderen, een stem synthesizeren of een afbeelding maken, en het biedt geen embeddings of fine-tuning.
Dat dekt nog steeds veel van het werk rond een project voor volwassenen, zoals fictie, roleplay en companion-style storytelling. Het model kan een treatment opstellen, het in scènes verdelen, dialoog en narratief schrijven, een shot-by-shot lijst produceren en prompts formuleren voor de video tool die je verderop in de keten gebruikt. De pagina over NSFW pipelines beschrijft hoe dit tekststadium aansluit op de rest van de stack.
Een regel is vast en geldt voor elk verzoek: geen seksuele inhoud met minderjarigen. Bouw je system prompt zo dat elk personage volwassen is, en behandel dit als een vereiste van het project, niet als een bijzaak.
Een pipeline in vier fasen
Een script workflow werkt het beste wanneer elke aanroep één taak doet en gestructureerde output doorgeeft aan de volgende. Een praktische indeling ziet er als volgt uit:
- Story bible. Eén document met personages (allemaal volwassenen), setting, toon en terugkerende details. Je schrijft het één keer en stuurt het met elke aanroep.
- Schets. Eén verzoek zet een premise om in 8 tot 15 beat samenvattingen.
- Scenariobestanden. Één aanroep per beat produceert dialoog, actielijnen en narratief, gebruikmakend van de bible en de vorige scène voor continuïteit.
- Shotlijst en prompts. Een laatste aanroep per scène retourneert JSON: shots, duur, camera notities en een prompt string voor je video tool.
Het op deze manier opsplitsen houdt de outputs kort, wat elk resultaat makkelijker te beoordelen en goedkoper te regenereren maakt als je het niet leuk vindt. Het betekent ook dat een mislukte aanroep één scène kost, niet het hele script.
Een systeemprompt die de regels vastlegt
De system prompt is waar toon, formaat en limieten leven. Een model zonder refusal gedrag volgt nog steeds instructies, dus de kwaliteit van je prompt bepaalt de kwaliteit van het script. Wees specifiek over genre, point of view en wat je moet weglaten. Hier is een startpunt voor fictie gericht op volwassen kijkers, geschreven om aan de professionele kant van de pagina te blijven:
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.'''
Pas het aan per project. Een noir mystery en een romance comedy hebben verschillende instructies nodig, en een one-line style example binnen de prompt stuurt het model vaak beter aan dan een alinea met bijvoeglijke naamwoorden.
Een scenelijst genereren in JSON-modus
Voor de shotlijst fase wil je output die code kan lezen. JSON-modus afdwingt een parseerbaar object. Voeg response_format={"type": "json_object"} toe, noem de sleutels in de prompt en houd de temperatuur laag. Dit voorbeeld gebruikt het Python openai pakket met de base URL van deze site en de model-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"])
Valideer het resultaat voordat je het doorgeeft. Controleer of shots bestaat, of seconds een getal is, en of de prompt strings niet leeg zijn. Als parseren mislukt, probeer het één keer opnieuw. Mislukte of geweigerde verzoeken worden niet in rekening gebracht, dus een retry kost niets extra voor een gefaalde call.
Instellingen die er toe doen voor creatieve tekst
Verschillende fasen willen verschillende instellingen, en de API doorstuurt de gebruikelijke: temperature, top_p, stop, seed en de frequentie- en aanwezigheidsstraffen.
- Outlines en dialoog: temperature 0,8 tot 1,0 voor variatie. Genereer twee of drie varianten en kies er één.
- Shotlijsten: temperature 0,2 tot 0,3, plus een vaste
seedzodat een rerun van dezelfde input vergelijkbaar is. - Herhaling: lange scènes lopen soms in een lus op dezelfde zin. Een kleine frequency penalty, zoals 0,3, helpt.
- Lengtebeheersing:
max_tokensis optioneel, maar een cap van 800 voor een scène houdt de output strak. Eenstopsequence zoals"END SCENE"laat je eindigen bij een marker die je het model laat schrijven. - Streaming: zet
stream: trueaan als een schrijver de output live bekijkt. Onthoud dat een stream zijn concurrentievergunning vasthoudt tot het eindigt.
De quickstart somt alle ondersteunde parameters op, en de endpoints zijn POST /v1/chat/completions en GET /v1/models.
Het 100k contextvenster gebruiken voor continuïteit
Continuïteit is de gebruikelijke fout in gegenereerde scripts: een naam verandert, een leeftijd verschuift, een prop verdwijnt. Het contextvenster is 100.000 tokens, prompt plus completion, en dat is groot genoeg om de hele story bible, de outline en verschillende voltooide scènes in elke aanroep te plaatsen. Je hebt geen retrieval-systeem nodig voor een project in deze schaal. Plak de feiten erin en laat het model ze elke keer lezen.
Context is niet gratis, maar het is goedkoop. Stel dat je bible en outline samen 20.000 tokens zijn en je schrijft 50 scènes, elke call retourneert ongeveer 600 tokens:
- Input: 50 x 20.000 = 1.000.000 tokens x $0,15 per 1M = $0,15
- Output: 50 x 600 = 30.000 tokens x $0,50 per 1M = $0,015
- Totaal: $0,165 voor alle 50 scènes
Voeg een shot-list pass toe over dezelfde 50 scènes met 3.000 tokens input en 500 tokens output elk: input van 150.000 tokens kost $0,0225 en output van 25.000 tokens kost $0,0125, een extra $0,035. Het volledige script en de shotlijsten kosten ongeveer $0,20, wat minder is dan het trialtegoed van $0,50 dat je kunt claimen via de API-sleutelpagina.
Houd er rekening mee dat het venster zowel prompt als antwoord moet bevatten. Een 20.000 token bible laat veel ruimte, maar een 95.000 token prompt laat weinig ruimte voor de completion.
De output reviewen en fixen
Behandel elke gegenereerde scène als een eerste concept. Drie checks vangen de meeste problemen op voordat ze een video tool bereiken. Eerst, run een consistentiecontrole: stuur het voltooide script terug met de story bible en vraag het model om elke plek te noemen waar een naam, leeftijd, locatie of timeline verschilt. Een tweede aanroep met een lage temperatuur is goedkoop en vindt vaak drift die je met het oog hebt gemist. Twee, lees de dialoog hardop. Regels die er op het scherm goed uitzien, kunnen onhandig zijn als ze worden uitgesproken, en een voice-over acteur of een text-to-speech tool zal ze direct blootleggen. Drie, controleer of de shot durations optellen tot de lengte die je plande. Modellen zijn los met rekenkunde, dus tel de seconds velden op in code in plaats van een totaal te vertrouwen dat het model schreef.
Wanneer een scène de maat mist, weersta dan de hele system prompt te herschrijven. Voeg één correcte instructie toe aan de user message, zoals "kortere actielijnen" of "meer dialoog, minder beschrijving", en regenereer alleen die scène. De bible en system prompt vasthouden terwijl je één instructie tegelijk varieert, maakt duidelijk welke verandering hielp. De seed parameter is hier nuttig, omdat een vaste seed met een kleine promptedit het effect van de edit isoleert.
Limieten, eerlijkheid en vervolgstappen
Enkele eenvoudige beperkingen voordat je bouwt. Het model is tekst alleen, dus elke video, afbeelding en voice track moet van andere tools komen. Het is één open-weight model gerund door een onafhankelijke provider, en het is niet de officiële API van een grote vendor. Kwaliteit varieert met de prompt, dus plan een review pass door een persoon op elk script; behandel de uitvoer als een concept.
Wat betreft throughput staat een volledige sleutel 8 gelijktijdige verzoeken en 300 per minuut toe, terwijl een trial sleutel 2 en 60 toestaat. Als je scènes parallel schrijft, pas dan je werkpools aan om dit te matchen. Een 429 met rate_limited of concurrency betekent dat je moet vertragen; één met een Retry-After: 5 header betekent dat de service kortstondig overbelast is, dus wacht vijf seconden en probeer het opnieuw. Prompts worden niet gebruikt voor training.
Betaald tegoed begint bij een opwaardering van $20, elk willekeurig geheel bedrag tot $500, met +5% vanaf $50, +10% vanaf $100 en +15% vanaf $200. Betaling is alleen crypto, USDT op TRC20 of USDC op Base, en tegoed verloopt nooit. Huidige voorwaarden staan op de prijzenpagina. Voor een project zoals hierboven dekt $20 tientallen volledige scripts.
