NL ▾

Chinese LLM APIFictie

API-sleutel aanvragen

Bijgewerkt

Chinese webromans en roleplay-apps: context, karakters en kosten

Geserialiseerde Chinese webfiction en in-character chat zijn twee van de meest veeleisende tekstworkloads: duizenden tekens per hoofdstuk, een cast die maandenlang consistent moet blijven, en lezers die elke fout opmerken. Deze gids laat zien hoe je prompts structureert, het contextvenster van 100.000 tokens beheert en de kosten inschat op basis van opgegeven aannames.

Hoe deze workloads eruitzien

Webfictieseries worden in hoofdstukken van 2.000 tot 4.000 tekens geschreven, vaak dagelijks gepubliceerd, met een plot die zich over honderden hoofdstukken uitstrekt. Rollenspel-apps zijn de gespreksachtige neef: een persona, een scenario en een lange geschiedenis. Beide hebben dezelfde drie dingen nodig van de model-API: genoeg context om te onthouden, genoeg outputbudget om lang te schrijven, en een stijl die niet afdrijft.

De dienst biedt een OpenAI-compatibel chat-endpoint op https://api.chinesellmapi.com/v1 met één tekstmodel, id uncensored. Het contextvenster is 100.000 tokens verdeeld over prompt en voltooiing, max_tokens staat standaard op 2.048 en kan oplopen tot 32.000, en standaard sampling-velden zoals temperature, top_p en stop worden doorgegeven. Streaming wordt ondersteund, wat past bij chatten. Basisinstellingen en coderingsopmerkingen staan in de tekstmodel.

Inhoudsregels, vooraf duidelijk

Dit is een service alleen voor volwassenen. Wettelijke volwassen fictie, volwassen thema's en controversiële onderwerpen worden niet per se geweigerd, en de dienst is bedoeld voor gebruikers van 18 jaar of ouder. Seksuele inhoud met minderjarigen wordt altijd geblokkeerd en retourneert een 403 content_blocked fout, ook wanneer het als fictie of roleplay wordt gepresenteerd. Er is geen instelling die dit verandert.

Bouw er vanaf het begin voor. Geef in je karakterbladen aan dat elk karakter volwassen is en geef expliciete leeftijden. Voeg een leeftijdsgrens toe aan je eigen product. Behandel een 403 als een definitief antwoord voor dat verzoek: toon een neutrale boodschap en probeer het niet opnieuw met herschreven prompts. Deze stappen zijn goede producthygiëne, ongeacht de platformregels.

Karakterbladen en stijlblokken

Consistentie komt door stabiele feiten op één plek te plaatsen en ze bij elke call te herhalen. Een karakterblad is een compacte registratie van naam, leeftijd, rol, spreekgewoonten, relaties en harde beperkingen, inclusief geheimen die het karakter nog niet mag onthullen. Een apart stijlblok fixeert het perspectief, het tempo, de dialoogratio, de hoofdstuklengte en de eindgewoonte. Beide gaan in het system message zodat ze vooraan elk verzoek staan.

CHARACTER_SHEET = """\
【人物卡】
姓名:沈清禾(女,28岁)
身份:江城古籍修复师,性格沉静,嘴硬心软
口头禅:“先别急,东西不会跑。”
说话方式:短句,少用感叹号,偶尔引用旧书里的句子
关系:与顾远舟(男,31岁,旧书商)是多年好友,彼此有未说出口的好感
禁忌:不提及她离开出版社的真正原因(第40章才揭晓)
"""

STYLE = """\
【文风】第三人称限知视角,贴近沈清禾;节奏舒缓,多写物件与天气的细节;
对话占比约四成;每章 2500 到 3000 字;结尾留一个小悬念。"""

Schrijf deze in het Chinees. Spreekgewoonten uitgedrukt in Chinese voorbeelden, zoals een kreet of zinslengte, worden veel betrouwbaarder overgebracht dan een Engelse beschrijving ervan. Houd elk blad onder een paar honderd tokens, en geef elk terugkerend karakter er één; een cast van tien is nog maar een paar duizend tokens. Als de situatie van een karakter verandert, update dan het blad zelf in plaats van te vertrouwen op de geschiedenis om de verandering door te geven.

Lange context voor geserialiseerde hoofdstukken

De verleiding is om elk vorig hoofdstuk in de prompt te plakken. Doe eerst de rekensom. Met een contextvenster van 100.000 tokens en hoofdstukken van ongeveer 4.500 tokens, past de hele window ongeveer veertien hoofdstukken zonder ruimte voor output, en een serie loopt over honderden. Het bruikbare patroon is gelaagde geheugen:

  1. Het karakterblad en stijlblok, altijd aanwezig.
  2. Een lopende verhaalsamenvatting, een paar honderd tekens per hoofdstuk, samengevoegd tot één lopende recap die je elke paar hoofdstukken ververst.
  3. De volledige tekst van het vorige hoofdstuk, zodat de proza aan de naad aansluit.
  4. Het outline voor het hoofdstuk dat wordt geschreven.

Na elk hoofdstuk vraag je het model om een korte samenvatting die relatieveranderingen en open plotdraden behoudt, en voeg deze toe aan de recap. De code hieronder schrijft een hoofdstuk en produceert de volgende samenvatting. Het retourneert ook usage zodat je echte tokenaantallen kunt loggen:

import os
from openai import OpenAI

client = OpenAI(base_url="https://api.chinesellmapi.com/v1", api_key=os.environ["API_KEY"])

def write_chapter(sheet, style, story_so_far, last_chapter, outline):
    messages = [
        {"role": "system", "content": "你是一位连载网络小说的作者,所有人物均为成年人。严格遵守人物卡和文风设定。\n" + sheet + "\n" + style},
        {"role": "user", "content": (
            "【前情提要】\n" + story_so_far +
            "\n\n【上一章全文】\n" + last_chapter +
            "\n\n【本章大纲】\n" + outline +
            "\n\n请直接写出本章正文,不要写标题以外的说明。")},
    ]
    r = client.chat.completions.create(
        model="uncensored",
        messages=messages,
        max_tokens=5000,       # ~3,000 characters needs roughly 4,500 tokens under our assumption
        temperature=0.9,
        top_p=0.95,
    )
    return r.choices[0].message.content, r.usage

def summarize(chapter_text):
    r = client.chat.completions.create(
        model="uncensored",
        messages=[{"role": "user", "content": "用 200 字以内概括下面这一章的剧情,保留人物关系的变化和未解的伏笔:\n" + chapter_text}],
        max_tokens=400,
        temperature=0.3,
    )
    return r.choices[0].message.content

Roleplay: persona, beurtvorm en stopsequentie

Roleplay heeft dezelfde sheet-and-style discipline nodig plus een paar chat-specifieke controles. Zet de persona in het system message, geef aan wie wie speelt, fixeer de reply lengte range, en vertel het model niet de acties van het karakter van de gebruiker te schrijven. Gebruik stop om de output te onderbreken als het model begint de volgende regel van de gebruiker te schrijven, en stream de reply zodat de tekst verschijnt terwijl deze wordt gegenereerd.

import os
from openai import OpenAI

client = OpenAI(base_url="https://api.chinesellmapi.com/v1", api_key=os.environ["API_KEY"])

PERSONA = (
    "你扮演顾远舟,31岁的旧书商,说话随和,爱开玩笑,但在重要的事上很认真。"
    "用户扮演沈清禾。所有角色均为成年人。保持第一人称,每次回复 80 到 200 字,"
    "用(括号)写简短的动作描写,不要替用户的角色做决定。"
)

history = [{"role": "system", "content": PERSONA}]

def turn(user_text):
    history.append({"role": "user", "content": user_text})
    stream = client.chat.completions.create(
        model="uncensored",
        messages=history,
        max_tokens=400,
        temperature=1.0,
        stop=["\n用户:"],        # keep the model from writing the user's next line
        stream=True,
    )
    reply = ""
    for chunk in stream:
        if chunk.choices and chunk.choices[0].delta.content:
            piece = chunk.choices[0].delta.content
            reply += piece
            print(piece, end="", flush=True)
    print()
    history.append({"role": "assistant", "content": reply})

turn("(推开书店的门)这场雨下得真不是时候。")

Geschiedenis groeit met één user message en één assistant message per turn. Zodra het je budget nadert, vat het oudste deel samen tot één bericht en behoud de meest recente turns letterlijk. Temperature rond 0,9 tot 1,0 geeft levendige dialoog voor karakters; verlaag het naar 0,5 als je wilt dat de persona strikt op script blijft.

Stijlcontrole die een lange serie overleeft

Stijldrift is het falen waar lezers het meest over klagen: de verteller wordt langzaam kletserig, de dialoog wordt formeel, het tempo versnelt. Bestrijd het met specificaties. In plaats van "schrijf in een elegante stijl", beschrijf meetbare gewoonten: zinslengte, hoe vaak idiomaten te gebruiken, hoeveel weer- en objectdetails op te nemen, of hoofdstukken eindigen op een hook of een rustig moment. Twee of drie korte voorbeeldparagrafen in de target voice, geplaatst in het stijlblok, zijn meer waard dan een pagina bijvoeglijke naamwoorden.

Verschillende genres hebben verschillende dials nodig. Een cultivation of fantasy serie baat bij een glossary van verzonnen termen, zoals realms, sects en techniques, zodat dezelfde naam nooit op twee manieren wordt gespeld. Een moderne romance leunt op dialoogritme en kleine fysieke details. Een mystery heeft een clue ledger nodig: een lijst van feiten die de lezer heeft gezien, zodat het model ze niet contradict. Houd elk van deze lijsten in het system prompt en update het naarmate het verhaal vordert.

Houd tot slot temperature en top_p vast binnen een serie. Als je sampling tussen hoofdstukken verandert, verandert de voice mee. Verhoog temperature alleen voor brainstorming outlines, niet voor de proza zelf.

Kostenberekening met opgegeven aannames

Alle cijfers gebruiken de gepubliceerde tarieven van $0,25 per miljoen input tokens en $1,00 per miljoen output tokens, en een aangenomen 1,5 tokens per Chinees teken. Vervang de aannames met cijfers uit je eigen usage logs.

ScenarioAangenomen input tokensAangenomen output tokensKosten per call
Serie hoofdstuk (3.000 tekens out)8.0004.500$0.0020 + $0.0045 = $0.0065
Roleplay turn, 20.000-token geschiedenis20.000300$0.0050 + $0.0003 = $0.0053
Roleplay turn, volledige 60.000-token geschiedenis60.000500$0.0150 + $0.0005 = $0.0155

In de chapter row breken de 8.000 input tokens als volgt op: een 1.200-token karakterblad en stijlblok, een 2.000-token recap, een 4.500-token vorig hoofdstuk en een 300-token outline. Een honderdtal zulke hoofdstukken kost ongeveer $0,65. Een honderdtal roleplay turns bij de 20.000-token geschiedenis grootte kost ongeveer $0,53. De conclusie is dat de geschiedenislengte de chatkosten bepaalt, dus trimmen en samenvatten betalen zichzelf snel terug.

Het $0,50 trial credit, geldig voor zeven dagen, dekt ongeveer 76 hoofdstukken onder de aannames van de eerste rij. Controleer pricing voor huidige tarieven, en zie de trial FAQ voor accountdetails.

Operationele notities voor productie

Hoofdstukgeneratie is een lang verzoek, dus gebruik genereuze timeouts of stream en assembleer de tekst zelf. Behandel 429 met een korte backoff, omdat elke key 300 requests per minuut toelaat, en behandel 503 met upstream_busy als een retry-in-a-few-seconds event. Een 402 betekent dat het prepaid saldo op is of dat de trial is verlopen, wat je moet waarschuwen in plaats van opnieuw proberen.

Bewaar elk gegenereerd hoofdstuk en de samenvatting in je eigen database voordat je het volgende genereert. Als een verzoek halverwege een nachtelijke batch faalt, kun je verder vanaf het laatst opgeslagen hoofdstuk, en betaal je nooit twee keer voor dezelfde tekst. Sla de promptversie en de verbruiksgegevens naast elk hoofdstuk op, zodat de kosten per hoofdstuk een query zijn in plaats van een gok.

Houd voor rollenspel-producten een budget per sessie bij. Beperk het aantal beurten of de totale tokens die een enkele sessie mag verbruiken, en toon gebruikers een duidelijke melding wanneer de limiet is bereikt. Omdat prompts geschiedenis bevatten, kost een zeer lange sessie veel meer per beurt dan een verse, vandaar dat het samenvatten van oude beurten belangrijk is, niet alleen om in het venster te passen. Prompts worden niet gebruikt voor training, wat je kunt vermelden in de privacyopmerkingen van je product, samen met je eigen opslagbeleid.

Vragen en antwoorden

Hoe lang kan een hoofdstuk zijn in één verzoek?

De uitvoer is beperkt tot 32.000 tokens per verzoek en deelt het contextvenster van 100.000 tokens met de prompt. Een hoofdstuk van 3.000 tekens past comfortabel, dus stel max_tokens iets hoger in dan je schatting.

Hoe houd ik personages consistent over honderden hoofdstukken?

Houd een karakterblad en stijlblok in de systeemprompt bij elk verzoek, en voer de plot voort als een lopende samenvatting plus het vorige hoofdstuk.

Is volwassen fictie toegestaan?

Wettelijke volwassen fictie tussen volwassen personages wordt niet geweigerd, en de dienst is voor gebruikers van 18 jaar en ouder. Seksuele inhoud met minderjarigen wordt altijd geblokkeerd met een 403, ook in fictie en roleplay.

Kan ik roleplay-antwoorden streamen?

Ja. Stel stream in op true om serververzonden gebeurtenissen te ontvangen, en gebruik stopvolgorde om te voorkomen dat het model de regels van de gebruiker schrijft.

Je sleutel is nog maar één formulier verwijderd

Maak een account aan, kopieer de sleutel, pas de basis-URL aan. Dat is de hele installatie.

API-sleutel aanvragen