Zum Inhalt springen
vanheek.biz
Startseite Praxistests Web & Tools Alltag
Kontakt

Praxistest · Stand: 30. August 2026

Die Levelfabrik: Wie OpenRouter jede Nacht das Spiel meines Sohnes weiterschreibt

Für meinen Sohn habe ich ein Lernspiel gebaut: „Luca und die Chronik der Siegel", ein Jump-and-Run mit Rätseln über zwanzig erzählte Welten. Das Problem aller selbst gebauten Spiele: Kinder spielen schneller, als Väter Level bauen. Die Lösung steht inzwischen auf der Startseite des Spiels — neben den 20 erzählten Welten zählt sie aktuell 66 KI-Welten. Und es werden jede Nacht mehr, ohne dass ich etwas dafür tue.

Startbildschirm des Lernspiels „Luca und die Chronik der Siegel“ mit dem Zähler: 20 erzählte Welten, 66 KI-Welten, 8 Rätselarten
Der Beleg läuft öffentlich: 66 KI-Welten — alle nachts generiert, Stand 30.08.2026.

Der Aufbau: drei Gratis-Bausteine

1. Ein Zeitplan-Dienst — bei mir cron-job.org — ruft jede Nacht eine Adresse meines Spiels auf. Das ist die ganze „Automatisierung": ein Wecker für eine Webadresse, kostenlos.

2. Das Spiel selbst nimmt den Weckruf entgegen und beauftragt ein Sprachmodell: Schreib die nächste Welt — Thema, Geschichte, Rätsel, im festen Format, das mein Spiel versteht. Das Ergebnis landet im Level-Vorrat, aus dem sich der Endlos-Modus bedient.

3. Die Modelle kommen von OpenRouter — einem Dienst, der viele KI-Anbieter hinter einer einzigen Schnittstelle bündelt. Der Clou ist die Sammlung komplett kostenloser Modelle: Für eine Welt pro Nacht reicht das dicke. Laufende Modellkosten dieser Levelfabrik: null Euro.

Der Kniff für mehr: Rotation

Gratis-Modelle haben Tageslimits, und manche sind zeitweise überlastet. Die Antwort darauf ist bei OpenRouter eingebaut: Weil alle Modelle über dieselbe Schnittstelle laufen, unterscheidet sich „nimm ein anderes Modell" nur um eine Namenszeile. Statt an einem Modell zu hängen, arbeitet man eine Liste ab — klemmt das erste, übernimmt das zweite. In einem anderen Projekt von mir rotiert so ein halbes Dutzend Anbieter; seitdem ist „die KI antwortet gerade nicht" praktisch ausgestorben. Wer mehr als eine Welt pro Nacht will, holt über diese Rotation auch aus den Gratis-Limits deutlich mehr heraus.

Für Bastler: die Rotation in Code

Das Muster ist in jeder Sprache dasselbe — hier in PHP, weil mein Spiel darin läuft. Zuerst der Nacht-Eingang: eine Adresse, die nur der Zeitplan-Dienst kennt, abgesichert über ein Geheimnis in der Umgebung:

// cron.php — wird nachts von cron-job.org aufgerufen
if (($_GET['schluessel'] ?? '') !== getenv('CRON_SECRET')) {
    http_response_code(403);
    exit('Kein Zutritt');
}

Dann die eigentliche Rotation: eine Liste kostenloser Modelle, und der erste brauchbare Treffer gewinnt. Klemmt ein Modell oder liefert es Ausschuss, ist einfach das nächste dran:

$modelle = [
    'anbieter-eins/modell:free',
    'anbieter-zwei/modell:free',
    // aktuelle Namen: openrouter.ai/collections/free-models
];

function welt_schreiben(array $modelle, string $auftrag): ?string {
    foreach ($modelle as $modell) {
        $antwort = ki_anfrage($modell, $auftrag);
        if ($antwort !== null && format_ok($antwort)) {
            return $antwort;              // erster Treffer gewinnt
        }
        // Limit erreicht oder Unsinn geliefert? Nächstes Modell.
    }
    return null;   // heute keine neue Welt — morgen ist auch eine Nacht
}

Und der Anruf beim Modell selbst ist ein einziger HTTP-POST — OpenRouter spricht die gleiche Schnittstelle wie die großen Anbieter, nur mit tauschbarem Modellnamen:

function ki_anfrage(string $modell, string $auftrag): ?string {
    $ch = curl_init('https://openrouter.ai/api/v1/chat/completions');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_TIMEOUT        => 90,
        CURLOPT_HTTPHEADER     => [
            'Authorization: Bearer ' . getenv('OPENROUTER_API_KEY'),
            'Content-Type: application/json',
        ],
        CURLOPT_POSTFIELDS => json_encode([
            'model'    => $modell,
            'messages' => [['role' => 'user', 'content' => $auftrag]],
        ]),
    ]);
    $roh = curl_exec($ch);
    curl_close($ch);
    $daten = json_decode((string) $roh, true);
    return $daten['choices'][0]['message']['content'] ?? null;
}

Wichtigster Baustein ist ausgerechnet der unscheinbarste: format_ok(). Meine Welten müssen ein striktes Format einhalten, damit das Spiel sie laden kann — alles, was die Prüfung nicht besteht, wird verworfen, bevor es ein Kind je zu sehen bekommt. Nebenbei erledigt derselbe Nachtlauf noch etwas: Er lässt die neuen Texte gleich von KI-Stimmen vorsprechen und legt die Audiodateien in den Cache — aber das ist einen eigenen Praxistest wert.

Was man ehrlich dazu sagen muss

Sprachmodelle halten sich nicht immer an Formatvorgaben — je strikter das erwartete Format, desto wichtiger ist es, Antworten zu prüfen, statt sie ungesehen ins Spiel zu lassen. Die Qualität der Gratis-Modelle schwankt zudem stärker als bei den Bezahl-Varianten: Für generierte Spielwelten ist das verschmerzbar, für einen Kundendienst-Chat wäre es das nicht. Und wie bei jedem Gratis-Angebot gilt: Limits und Modellauswahl können sich jederzeit ändern.

Fazit

Ein kostenloser Zeitplan-Dienst, ein paar Zeilen Anbindung und die Gratis-Modelle von OpenRouter — mehr braucht es nicht, damit ein Hobby-Projekt nachts von allein wächst. Mein Sohn misst den Erfolg übrigens in seiner eigenen Währung: Der Endlos-Modus geht nie aus. Für Bastler mit eigener Website ist dieses Muster — Wecker, Auftrag, Gratis-Modell — auf erstaunlich viele Ideen übertragbar.

© 2026 Matthias van Heek Impressum · Datenschutzerklärung