GX10 Render-Relay

Interaktive Doku Startseite

GX10 Render-API (über das Relay)

Zwei Workflows auf der GX10, per HTTP für dich und deine Agents:

Endpunkt Modell Ergebnis
POST /v1/images Qwen-Image 2.1 – Standbild, optional mit bis zu 4 Referenzbildern PNG
POST /v1/videos MiniMax H3 – Video mit Ton (Dialog, Geräusche, Musik in einem Pass), 2–15 s MP4

Basis-URL: https://ai.michalski-marketing.de · interaktive Doku: https://ai.michalski-marketing.de/docs

API-Key: auf der Startseite mit Google anmelden → Neuen Key anlegen. Der Key wird nur einmal angezeigt. Jede Anfrage braucht den Header Authorization: Bearer <key>. Keys nie in Repos oder in Prompts für fremde Dienste legen; einen verlorenen Key auf der Startseite widerrufen und einen neuen anlegen.


Ablauf

  1. Referenzen hochladen → POST /v1/uploads (multipart, Feld file) → liefert eine id
    • Bilder (PNG/JPG/WebP) werden zu PNG, Audio (WAV/MP3/FLAC/M4A – bei einem Video mit Ton dessen Tonspur) zu WAV mono 24 kHz, max. 30 s.
  2. Auftrag anlegen → POST /v1/images oder POST /v1/videos → liefert {"id": …, "status": "pending"}
    • Optionaler Header Idempotency-Key: <eigene-id>: Schickt dein Agent dieselbe Anfrage nach einem Netzfehler noch einmal, kommt der schon angelegte Auftrag zurück statt eines zweiten.
  3. Status abfragen → GET /v1/jobs/{id} – alle 10–30 s reicht:

    Status Bedeutung
    pending wartet beim Relay; position = Platz in der Reihe
    queued liegt auf der GX10 in der Warteschlange; position ≥ 1
    rendering rechnet gerade (position 0)
    done fertig → result_url
    failed Fehler, Grund in error
    cancelled abgebrochen
  4. Ergebnis laden → GET /v1/jobs/{id}/result. Ergebnisse und Uploads werden nach 14 Tagen gelöscht (expires im Auftrag) – also zeitnah herunterladen.

Weitere: GET /v1/jobs (eigene Aufträge), DELETE /v1/jobs/{id} (solange er noch nicht rechnet), GET /v1/uploads, GET /v1/me (Limits und heutiger Verbrauch), GET /v1/health (ohne Key: ist die GX10 gerade erreichbar, runner_online, gx10_ready, paused).

Warteschlange: Die GX10 hat eine GPU und rendert auch eigene Produktionen. Deine Aufträge wechseln sich mit denen ab: höchstens einer wartet direkt hinter dem Render, der gerade läuft. Ist die GX10 aus oder pausiert, bleiben Aufträge auf pending und laufen später von selbst los. Zeiten: Bild ~1 min, Video ~1 min pro Sekunde Clip bei nativer Größe (15 s ≈ 15 min), mit megapixels: 0.5 etwa die Hälfte.

Tageslimits stehen in GET /v1/me (bei Bedarf beim Admin erhöhen lassen).


Bild: POST /v1/images

Feld Typ Standard Hinweis
prompt Text ≤ 6000 – englisch; Referenzen als „Picture 1“, „Picture 2“ … ansprechen und beschreiben
negative Text ≤ 2000 Standard-Negativliste
width, height 512–2048, durch 16 teilbar 1344 × 768 768 × 1344 = Hochformat, 1024 × 1024 = quadratisch
refs Liste von Upload-IDs, max. 4 [] Figur, Produkt, Ort …
ref_resolution 1024 | 2048 1024 2048 für Model-Sheets mit mehreren Ansichten
steps 8–40 30
seed Zahl zufällig gleicher Seed + gleiche Eingaben = gleiches Bild
{"prompt": "Product photo of the bottle in Picture 1 on a wet black stone, soft rim light, studio, no text.",
 "refs": ["3f2a…"], "width": 1024, "height": 1024}

Video: POST /v1/videos

Variante A – strukturiert (empfohlen)

Du beschreibst Figuren/Orte/Objekte mit je einem Bild und die Einstellungen; die API schreibt daraus den H3-Brief.

Feld Hinweis
subjects max. 8: key (GROSS, z. B. ANNA), kind (character | location | prop), name, description (englisch: Aussehen, Kleidung), image (Upload-ID; bei Figuren am besten ein Model-Sheet mit mehreren Ansichten auf grauem Grund), optional voice (Upload-ID einer 5–15-s-Stimmprobe), voice_desc (z. B. „a warm, low female voice“), retain
shots max. 8 Einstellungen, je ein Absatz englisch. Platzhalter: {ANNA} = die Figur, {ANNA!} = sie spricht, {ANNA~} = ihre Stimme. Dialog: <d>[English] Text </d>
speakers Keys der Sprecher in Reihenfolge, z. B. ["ANNA"]
summary ein Satz, was passiert
sound Geräusche/Atmo (englisch), ohne Musik
music nicht-diegetische Musik (englisch), leer = keine
style Stil-Absatz (englisch); leer = fotorealistisches Kino-Drama. Für Werbung z. B. „The target video is a premium commercial …“
seconds 2–15 (Standard 10)
aspect 16:9 | 9:16 | 1:1
megapixels 0 = nativ (~1 MP, 1344×768) · 0.4–1.0 kleiner und schneller
steps 4 (Turbo, Standard) | 8
seed optional
{
  "subjects": [
    {"key": "ANNA", "kind": "character", "name": "Anna",
     "description": "a woman in her thirties with short red hair, wearing a green raincoat",
     "image": "a1b2…", "voice": "c3d4…", "voice_desc": "a calm, warm female voice"},
    {"key": "CAFE", "kind": "location", "name": "corner café",
     "description": "a small Berlin corner café at night, rain on the windows", "image": "e5f6…"},
    {"key": "CUP", "kind": "prop", "name": "travel mug",
     "description": "a matte black travel mug with a copper lid", "image": "g7h8…"}
  ],
  "shots": [
    "A medium shot in {CAFE}: {ANNA} sits at the window and lifts {CUP}, steam rising.",
    "A close-up of {ANNA!}, who smiles and says {ANNA~}: <d>[English] Some mornings need a little more warmth. </d>"
  ],
  "speakers": ["ANNA"],
  "summary": "Anna enjoys her coffee from the travel mug on a rainy evening.",
  "sound": "Soft rain on the window, quiet café murmur, a cup set down on wood.",
  "music": "A gentle, warm acoustic guitar motif under the scene.",
  "seconds": 10, "aspect": "9:16"
}

Variante B – eigener H3-Brief (für Fortgeschrittene)

brief = kompletter H3-ref2va-Brief (Abschnitte subject_definitions, summary, retention_analysis, detailed_description, overall_soundscape, non_diegetic_music) und tray = die Referenzen in Reihenfolge (upload, label klein-mit-bindestrichen, role: subject | environment | voice_timbre | music_style, note). <Subject n> / <Picture n> / <Audio n> im Brief zählen in der Reihenfolge des Trays. Die Antwort von GET /v1/jobs/{id} enthält bei Variante A den erzeugten Brief – gute Vorlage.


Erfahrungen (was H3 gut / schlecht kann)

Fehler

Code Bedeutung
401 Key fehlt, ist falsch oder widerrufen
400 Upload-ID unbekannt bzw. nicht deine, oder Eingaben passen nicht zusammen
422 Feld außerhalb der Grenzen (Antwort sagt welches)
429 Tageslimit oder 10 offene Aufträge erreicht
409 Ergebnis noch nicht fertig / Auftrag läuft schon
410 Ergebnis nach 14 Tagen gelöscht

Manche Fehler meldet erst die GX10 (z. B. eine Datei, die sich dort nicht lesen lässt). Dann steht der Auftrag auf failed mit dem Grund in error.

Minimaler Python-Client

import time, uuid, requests
API, H = "https://ai.michalski-marketing.de", {"Authorization": "Bearer rr_…"}

def upload(path):
    with open(path, "rb") as f:
        r = requests.post(f"{API}/v1/uploads", headers=H, files={"file": f})
    r.raise_for_status()
    return r.json()["id"]

def run(kind, body, out):
    hdr = {**H, "Idempotency-Key": uuid.uuid4().hex}
    j = requests.post(f"{API}/v1/{kind}", headers=hdr, json=body).json()
    while j["status"] in ("pending", "queued", "rendering"):
        time.sleep(20)
        j = requests.get(f"{API}/v1/jobs/{j['id']}", headers=H).json()
    if j["status"] != "done":
        raise RuntimeError(j)
    with open(out, "wb") as f:
        f.write(requests.get(API + j["result_url"], headers=H).content)

ref = upload("produkt.png")
run("images", {"prompt": "The product in Picture 1 on a marble table, morning light.", "refs": [ref]}, "bild.png")