01
Schnellstart: ein Auftrag, ein Konto
Für neue Agenten-Integrationen empfehlen wir die fal-native API. Sie verwendet vollständige fal-Endpoint-IDs und native Felder, aber OKTA-Authentifizierung, Credits und Mediathek. Die folgenden Bash-Schritte gehören zusammen.
1. Modell und Schema prüfen
Erstelle zuerst einen API-Schlüssel im Konto. Setze OKTA_API_KEY über deine sichere lokale Umgebung oder den Secret-Manager – niemals in Git, Browsercode oder einen öffentlichen Prompt.
# Bash-Beispiele: curl + jq; OKTA_API_KEY sicher in der Umgebung setzen.
: "${OKTA_API_KEY:?Bitte zuerst OKTA_API_KEY setzen}"
BASE_URL="https://okta.studio"
ENDPOINT="openai/gpt-image-2.5/flare/text-to-image"
curl --fail-with-body -sS "$BASE_URL/api/v1/fal/models" \
-H "Authorization: Bearer $OKTA_API_KEY" | jq .
curl --fail-with-body -sS --get "$BASE_URL/api/v1/fal/schema" \
-H "Authorization: Bearer $OKTA_API_KEY" \
--data-urlencode "endpoint_id=$ENDPOINT" | jq .input_schema2. Eingaben und Preis prüfen
Die Quote liefert den aktuellen OKTA-Preis. Sie startet keine Generierung und bucht keine Generierungscredits ab. Referenzquotes können Medien bereits prüfen und zwischenspeichern.
# Datei und Quote aufbewahren; noch keine Generierung.
cat > input.json <<'JSON'
{
"prompt": "Ein Produktfoto einer Keramiktasse auf hellem Holz, weiches Tageslicht.",
"image_size": {
"width": 1024,
"height": 1024
},
"quality": "medium",
"num_images": 1,
"output_format": "png"
}
JSON
jq -n --arg endpoint_id "$ENDPOINT" --slurpfile input input.json \
'{endpoint_id: $endpoint_id, input: $input[0]}' > quote-request.json
curl --fail-with-body -sS "$BASE_URL/api/v1/fal/quote" \
-H "Authorization: Bearer $OKTA_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @quote-request.json > quote.json
jq '{credits, currency, reference_quote_id, expires_at}' quote.json3. Bewusst kostenpflichtig starten
Speichere eine neue Operations-ID vor dem Start. Bei einem Timeout verwende exakt dieselbe ID und dieselben Eingaben. Für ein absichtlich neues Bild vergibst du eine neue ID. Die Budgetgrenze gilt für diesen einen Auftrag.
# BEZAHLTER SCHRITT: Quote prüfen und das Budget selbst festlegen.
MAX_CREDITS=20 # Beispiel-Obergrenze, kein versprochener Bildpreis.
# Pro neuem Auftrag einmal vergeben und VOR dem Absenden speichern.
OPERATION_ID="produktmotiv-20260910-001"
printf '%s\n' "$OPERATION_ID" > operation-id.txt
curl --fail-with-body -sS "$BASE_URL/api/v1/fal/queue/$ENDPOINT" \
-H "Authorization: Bearer $OKTA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $OPERATION_ID" \
-H "X-Okta-Max-Credits: $MAX_CREDITS" \
--data-binary @input.json > submitted.json
jq '{request_id, status_url, response_url, context_url, web_url, okta}' submitted.json4. Ergebnis abholen oder im Chat weiterarbeiten
Ein angenommener Auftrag läuft serverseitig weiter. COMPLETED kann auch einen Fehler bedeuten: error und error_type prüfen, anschließend das Ergebnis abrufen. Der Browser muss dafür nicht offenbleiben.
# Nach Annahme nur noch diesen Auftrag abfragen, nicht neu starten.
STATUS_URL=$(jq -er '.status_url' submitted.json)
RESULT_URL=$(jq -er '.response_url' submitted.json)
CONTEXT_URL=$(jq -er '.context_url' submitted.json)
curl --fail-with-body -sS "$STATUS_URL" \
-H "Authorization: Bearer $OKTA_API_KEY" | jq .
# Alle 3–5 Sekunden prüfen. Erst bei COMPLETED ohne error/error_type:
curl --fail-with-body -sS "$RESULT_URL" \
-H "Authorization: Bearer $OKTA_API_KEY" > result.json
curl --fail-with-body -sS "$CONTEXT_URL" \
-H "Authorization: Bearer $OKTA_API_KEY" | jq .
# web_url in submitted.json öffnet denselben Auftrag im OKTA-Chat.02
Schlüssel, Credits und Budget
Ein OKTA-Schlüssel reicht. Kunden brauchen weder einen Fal-Key noch ein eigenes Fal-Konto. Die Abrechnung folgt dem persönlichen oder organisatorischen Kontext des OKTA-Schlüssels.
| Header | Bedeutung |
|---|---|
| Authorization: Bearer <OKTA_API_KEY> | Für native API, Medienabruf und MCP-Toolausführung. Auch native Modellsuche und Schema sind authentifiziert. |
| Idempotency-Key | Pflicht für native Queue-POSTs: 8–160 Zeichen aus Buchstaben, Ziffern, _, ., :, -. Dieselbe ID mit anderen Eingaben ergibt 409. |
| X-Okta-Max-Credits | Ganzzahlige Obergrenze pro Auftrag. REST/SDK optional, ausdrücklich empfohlen; CLI/MCP verlangen einen freigegebenen Cap. |
| X-Okta-Reference-Quote | Für neue H3-Max-Referenzaufträge: reference_quote_id aus der zuvor gemessenen Quote. |
100 Credits entsprechen 1 €. Nutze /api/v1/credits für das Guthaben und /api/v1/fal/quote für die konkrete Konfiguration. Keine hart codierten Modellpreise: Qualität, Größe, Anzahl und Referenzmedien verändern den Preis. Persönliche und Organisationslimits bleiben wirksam.
Budget ist keine neue Freigabe
Das Einschalten des Medien-Agenten im Web-Chat erlaubt noch keine Ausgaben. Der Nutzer bestätigt den Auftrag und den Gesamtplan-Cap separat. Ein extern verwendeter API-Schlüssel autorisiert API-Aufrufe; schütze ihn entsprechend.
03
Codex, Claude Code und MCP
Am einfachsten verbindest du den gehosteten MCP-Server unter https://okta.studio/api/mcp per Browser-Login. Er verwendet Streamable HTTP mit JSON-Antworten. Guthaben und Mediathek sind dieselben wie in der Web-App.
Browser-Login (empfohlen)
Ohne Schlüssel: Die App öffnet den Browser, du meldest dich bei OKTA an, wählst persönliches Konto oder Team und bestätigst. Trennen kannst du die Verbindung unter Konto → API-Zugang. Der Login ist keine Ausgabenfreigabe – Preisabfrage, Budget und Credit-Cap gelten weiter.
# Codex
codex mcp add okta --url https://okta.studio/api/mcp
codex mcp login okta
# Claude Code
claude mcp add --transport http okta https://okta.studio/api/mcp
# danach in Claude Code: /mcp → okta → AuthenticateCodex mit API-Schlüssel
Für Skripte und Umgebungen ohne Browser. Ergänze deine bestehende Konfiguration, statt sie zu überschreiben. OKTA_API_KEY muss beim Start im Umfeld des Codex-Prozesses verfügbar sein.
# In ~/.codex/config.toml ergänzen:
[mcp_servers.okta]
url = "https://okta.studio/api/mcp"
bearer_token_env_var = "OKTA_API_KEY"Claude Code mit API-Schlüssel: .mcp.json
Die Umgebungsvariable wird von Claude Code eingesetzt. Speichere nicht den echten Schlüssel in dieser Datei. Andere MCP-Clients können andere Konfigurationsformate verlangen.
{
"mcpServers": {
"okta": {
"type": "http",
"url": "https://okta.studio/api/mcp",
"headers": {
"Authorization": "Bearer ${OKTA_API_KEY}"
}
}
}
}Bessere Bilder: Leitfäden im MCP
Der Server liefert Ressourcen mit, die jeder Agent lesen kann: okta://guides/models (empfohlene Modelle pro Aufgabe und der Ablauf Entwurf → Verfeinern → Final) und okta://guides/image-prompting (BRIEF-DNA-Methode, dazu Stil-Bibliothek, Fehlerliste und Übersetzungstabelle). Der Prompt image_brief macht aus einer kurzen Anfrage einen Auftragsplan. get_job_result liefert Bild-Ergebnisse zusätzlich als Vorschau mit Prüfliste, damit der Agent sein Ergebnis selbst kontrolliert.
So arbeitet der Agent
search_models → get_model_schema → upload_file / search_assets → estimate_cost → submit_job → check_job → get_job_result. submit_job braucht endpoint_id, input, idempotency_key und max_credits. Für H3-Referenzen zusätzlich reference_quote_id. Das Ergebnis bleibt im selben OKTA-Konto.
Lokale Dateien über stdio
Agent Kit 0.5.3 enthält einen gebauten lokalen MCP-Server. Der Client startet ihn per Node aus dem entpackten Kit oder über dessen Plugin-Konfiguration. OKTA_API_KEY bleibt in der sicheren Client-Umgebung; OKTA_WORKSPACE ist nur für einen ausdrücklich erlaubten lokalen Ordner zu setzen.
# Agent Kit 0.5.3 entpacken; kein npm-Install nötig.
# OKTA_API_KEY im Agent-Prozess sicher bereitstellen.
# Optional: OKTA_WORKSPACE nur auf den explizit freigegebenen Medienordner setzen.
node /ABSOLUTER/PFAD/okta-agent-kit/server/stdio.mjs
# Für Plugin-Clients ist okta-agent-kit/ selbst die Plugin-Wurzel.
# Dessen mcp.json nutzt den gehosteten Server mit Browser-Login;
# den lokalen Server trägst du für Dateizugriff selbst ein.| Fähigkeit | Gehosteter MCP | Lokaler stdio-MCP mit OKTA_WORKSPACE |
|---|---|---|
| Modelle / Quote / Generierung / Status | Ja | Ja |
| upload_file.url | Eigene Assets oder erlaubte HTTPS-Medien | Eigene Assets oder erlaubte HTTPS-Medien |
| upload_file.file_path | Nicht verfügbar | Reguläre Mediendatei im freigegebenen Workspace; maximal 4 MiB |
| get_job_result.save_to | Nicht verfügbar | Zielverzeichnis im Workspace; alle Ergebnisse, kein Überschreiben |
Kein npm-Publish
@okta-studio/mcp ist nicht als npm-Installation zugesichert. Das Agent Kit enthält den tatsächlich gebauten stdio-Server; eine ältere Installation aktualisiert sich nicht automatisch. Prüfe tools/list in deiner verbundenen Version.
04
CLI und Agent Kit
Der Download enthält die ausführbare CLI und den vollständigen Skill-Baum mit Referenzen und Konfiguration. Verwende Node.js 24 und die komplette entpackte Struktur; der einzelne CLI-Download ist nicht zwingend eigenständig.
Agent Kit 0.5.3: CLI, Skills und lokaler MCP
Das Kit enthält die fal-native CLI, den gebauten stdio-MCP-Server und acht Skill-Einstiege einschließlich vier unabhängig versionierten Produktionsrezepten. fal context und MCP get_job_context lesen denselben versionierten Auftrag mit geordneten Ergebnissen und Web-Link. Die Playbooks schaffen keine zusätzlichen Modellfähigkeiten und ändern keine Budgetfreigabe.
Neu: Live-Preisabfrage statt veraltetem Snapshot, vollständiger Batch-Download, Kontextabruf und Versions-/Prüfsummenmanifest. Bereits installierte Kits werden nicht automatisch aktualisiert: neu herunterladen, in ein neues Verzeichnis entpacken und die vollständigen gewünschten Skill-Ordner übernehmen. Eigene Projektdaten und Secrets nicht überschreiben.
input.json, ENDPOINT, OPERATION_ID und MAX_CREDITS stammen aus dem Schnellstart. Unter Windows das ZIP entpacken und denselben node-Befehl mit dem passenden Dateipfad verwenden. API-Schlüssel als OKTA_API_KEY setzen.
# Agent Kit herunterladen und lokal entpacken (kein npm-Publish nötig).
curl --fail-with-body -sS https://okta.studio/downloads/okta-agent-kit \
-o okta-agent-kit.zip
unzip okta-agent-kit.zip
CLI="okta-agent-kit/skills/okta-cli/scripts/okta-cli.mjs"
node "$CLI" --json skills list
node "$CLI" --json skills show --id product-photoshoot
node "$CLI" fal models --query gpt-image-2.5
node "$CLI" fal schema --endpoint "$ENDPOINT"
node "$CLI" fal quote --endpoint "$ENDPOINT" --input-file input.json
# Erst nach Preisprüfung; dieselbe gespeicherte ID bei Wiederholung verwenden:
node "$CLI" fal submit --endpoint "$ENDPOINT" --input-file input.json \
--idempotency-key "$OPERATION_ID" --max-credits "$MAX_CREDITS"fal status / fal result verwenden --endpoint und --request-id. --wait wartet begrenzt und startet keinen zweiten Job. --output speichert das erste Medium. Mit fal result --output-dir NEUES_VERZEICHNIS werden alle bestätigten Medien ohne Überschreiben gespeichert (bis zu 10 Dateien, 200 MiB pro Datei). fal context liest den ursprünglichen Auftrag samt Web-Link. H3-Submit übernimmt die Quote mit --reference-quote-id.
Downloads
| Datei | Verwendung |
|---|---|
| Vollständiges Agent Kit | /downloads/okta-agent-kit |
| Skill-Einstieg | /downloads/okta-cli-skill |
| CLI-Quelltext | /downloads/okta-cli-script |
| LLM-README | /downloads/okta-llm-readme |
05
fal-native REST-Referenz
Base URL: https://okta.studio. Der Queue-Body ist der native Input selbst – ohne äußeres input-Objekt. Nur Quote verwendet { endpoint_id, input }. Verwende für Folgeaufrufe am besten die zurückgegebenen URLs.
| Methode | Pfad | Vertrag |
|---|---|---|
| GET | /api/v1/fal/models | Kuratierte Modelle (okta.pricing: fixed) und der übrige aktive fal-Katalog (okta.pricing: usage). Filter q, category, endpoint_id; Blättern mit cursor. Authentifizierung erforderlich. |
| GET | /api/v1/fal/schema?endpoint_id=… | input_schema ist der ausführbare OKTA-Vertrag; openapi ist die Upstream-Quelle. |
| POST | /api/v1/fal/quote | { endpoint_id, input } → credits, currency, schema_version; ggf. reference_quote_id und expires_at. |
| POST | /api/v1/fal/upload | { url } → stabile Referenz im eigenen Konto. Kein Upload lokaler Pfade. |
| POST | /api/v1/fal/queue/<endpoint> | Direkter nativer Input als Body; Idempotency-Key erforderlich. Antwort: HTTP 200 mit Request-URLs. |
| GET | /api/v1/fal/queue/<endpoint>/requests/<id>/status | IN_QUEUE, IN_PROGRESS oder COMPLETED; error/error_type beachten. |
| GET | /api/v1/fal/queue/<endpoint>/requests/<id> | Ergebnis im Modellformat. Kein /response-Suffix. Vor Abschluss HTTP 400, terminaler Fehler HTTP 422. |
| GET | /api/v1/fal/queue/<endpoint>/requests/<id>/context | Ursprüngliche Eingaben, Ergebnisse und web_url zum Fortsetzen im Chat. |
| PUT | /api/v1/fal/queue/<endpoint>/requests/<id>/cancel | Abbruch anfragen. 202 ist keine Garantie für einen gestoppten oder kostenlosen Providerauftrag. |
Die API ist ein Kompatibilitätsprofil, kein offener Fal-Proxy: Abrechnung, Speicherung und Rechte laufen immer über OKTA. Kuratierte Modelle haben geprüfte Festpreise. Alle übrigen aktiven fal-Modelle (ohne Training) werden nach tatsächlichem Verbrauch abgerechnet: X-Okta-Max-Credits ist dort Pflicht, wird beim Start reserviert, der ungenutzte Rest automatisch erstattet; Fehlschläge werden voll erstattet.
06
Native Modelle und Eingaben
Die folgende Endpoint-Liste wird beim Rendern aus demselben Katalog wie die native API erstellt. Die authentifizierte Modellsuche und das aktuelle input_schema bleiben für die Ausführung maßgeblich.
| Modell | Endpoint-ID | Modus |
|---|---|---|
| FLUX 3 Image | blackforestlabs/flux-3/text-to-image | text-to-image |
| FLUX 3 Image | blackforestlabs/flux-3/edit-image | edit |
| Nano Banana 2.1 | google/nano-banana-2.1 | text-to-image |
| Nano Banana 2.1 | google/nano-banana-2.1/edit | edit |
| GPT Image 2.5 Flare | openai/gpt-image-2.5/flare/text-to-image | text-to-image |
| GPT Image 2.5 Flare | openai/gpt-image-2.5/flare/edit | edit |
| GPT Image 2.5 Sunburst | openai/gpt-image-2.5/sunburst/text-to-image | text-to-image |
| GPT Image 2.5 Sunburst | openai/gpt-image-2.5/sunburst/edit | edit |
| MiniMax H3 Max | minimax/h3-max/text-to-video | text-to-video |
| MiniMax H3 Max | minimax/h3-max/image-to-video | image-to-video |
| MiniMax H3 Max | minimax/h3-max/reference-to-video | reference-to-video · Referenzquote erforderlich |
| MiniMax H3 Max Turbo | minimax/h3-max-turbo/text-to-video | text-to-video |
| MiniMax H3 Max Turbo | minimax/h3-max-turbo/image-to-video | image-to-video |
| seedance-2.0 | bytedance/seedance-2.0/text-to-video | text-to-video |
| seedance-2.0 | bytedance/seedance-2.0/image-to-video | image-to-video |
| seedance-2.0-fast | bytedance/seedance-2.0/fast/text-to-video | text-to-video |
| seedance-2.0-fast | bytedance/seedance-2.0/fast/image-to-video | image-to-video |
GPT Image 2.5 Flare und Sunburst
Text-zu-Bild und Bearbeiten; quality: auto, low, medium, high, xhigh, max. Native Batches: 1–10 Bilder; beim Edit 1–16 Referenzbilder plus optionale mask_url. image_size muss ein explizites Objekt aus width und height sein. Benannte Größen und image_size: auto sind im nativen Tarif noch nicht unterstützt. quality: auto ist dagegen erlaubt und verwendet den Maximum-Tarif.
Beide Kanten müssen durch 16 teilbar und höchstens 3840 px lang sein; Fläche 655.360 bis 8.294.400 Pixel, Seitenverhältnis höchstens 3:1 bzw. 1:3. 1920 × 1080 ist daher kein gültiger expliziter Input. output_format: png, jpeg oder webp; transparente Ausgabe braucht png/webp. output_compression nur bei jpeg/webp.
Nano Banana 2.1
Text-zu-Bild und Edit über google/nano-banana-2.1 mit 1K, 2K oder 4K und bis zu vier Ausgaben. Die Studio-ID nano-banana-2 bleibt kompatibel. Edit unterstützt im freigegebenen Profil bis zu zehn Bildreferenzen. Websuche, Thinking sowie Video-/Audio-/PDF-Edit-Eingaben sind in diesem nativen Profil nicht freigegeben.
MiniMax H3 Max / Turbo
Text-/Bild-zu-Video mit 480P oder 768P. H3 Max reference-to-video verwendet ausschließlich 768P und die gemessene Referenzquote. Nutze das jeweilige Schema für Dauer und Referenzkombinationen; Auflösungswerte sind hier großgeschrieben.
07
H3: Referenzen korrekt bepreisen
Bei minimax/h3-max/reference-to-video reicht die Videolänge allein nicht als Preisgrundlage. OKTA misst und fixiert die tatsächlich verwendeten Referenzbytes. Eine neue Ausführung benötigt deshalb eine gültige Referenzquote.
POST /quote liefert reference_quote_id und expires_at; die Quote gilt zehn Minuten. Sie ist an Nutzer, Organisation und Eingaben gebunden. Für neue Aufträge sende diese ID als X-Okta-Reference-Quote. Bei geänderten Medien oder abgelaufener Quote neu prüfen. Eine bereits angenommene Operations-ID wird weiterhin wiedergefunden, statt erneut gekauft.
# h3-input.json anhand des aktuellen input_schema erstellen; 768P verwenden.
H3_ENDPOINT="minimax/h3-max/reference-to-video"
jq -n --arg endpoint_id "$H3_ENDPOINT" --slurpfile input h3-input.json \
'{endpoint_id: $endpoint_id, input: $input[0]}' > h3-quote-request.json
curl --fail-with-body -sS "$BASE_URL/api/v1/fal/quote" \
-H "Authorization: Bearer $OKTA_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @h3-quote-request.json > h3-quote.json
jq '{credits, reference_quote_id, expires_at}' h3-quote.json
# Erst nach Freigabe des gemessenen Preises:
REFERENCE_QUOTE=$(jq -er '.reference_quote_id' h3-quote.json)
: "${H3_MAX_CREDITS:?Gemessenes Budget selbst freigeben}"
: "${H3_OPERATION_ID:?Neue stabile H3-Auftrags-ID vorher speichern}"
curl --fail-with-body -sS "$BASE_URL/api/v1/fal/queue/$H3_ENDPOINT" \
-H "Authorization: Bearer $OKTA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $H3_OPERATION_ID" \
-H "X-Okta-Max-Credits: $H3_MAX_CREDITS" \
-H "X-Okta-Reference-Quote: $REFERENCE_QUOTE" \
--data-binary @h3-input.jsonDie Medienprüfung erlaubt bis zu 50 MiB pro Referenzdatei und 200 MiB insgesamt. Das ist NICHT das Größenlimit eines Browser-/Multipart-Uploads. Bei mehrstufigen Chat-Plänen wird eine erst später erzeugte Referenz nachgemessen; übersteigt der neue Preis das Budget, pausiert der Plan zur Freigabe.
08
Originales fal-JavaScript-SDK
Das originale @fal-ai/client arbeitet über /api/fal/proxy mit den unterstützten Queue-Aufrufen. Der folgende serverseitige Adapter erzwingt OKTA als Transportziel. Er ist kein separates veröffentlichtes OKTA-SDK-Paket.
// Node.js / Server, nicht mit einem geheimen Key im Browser ausführen.
// Installation: npm install @fal-ai/client@1.10.1
import { createFalClient } from '@fal-ai/client';
const apiKey = process.env.OKTA_API_KEY;
const operationId = process.env.OKTA_OPERATION_ID; // Vorher speichern!
const maxCredits = Number(process.env.OKTA_MAX_CREDITS);
if (!apiKey || !operationId || !/^[a-zA-Z0-9_.:-]{8,160}$/.test(operationId)
|| !process.env.OKTA_MAX_CREDITS || !Number.isSafeInteger(maxCredits)
|| maxCredits < 0) throw new Error('Key, Auftrags-ID und Budget fehlen/ungültig.');
const proxy = 'https://okta.studio/api/fal/proxy';
const transport = globalThis.fetch;
const fal = createFalClient({
credentials: () => undefined, // Kein FAL_KEY beim Kunden.
proxyUrl: { url: proxy, when: 'always' },
fetch: async (url, init) => {
if (String(url) !== proxy) throw new Error('Direkter Providerzugriff gesperrt.');
const headers = new Headers(init?.headers);
headers.set('Authorization', 'Bearer ' + apiKey);
return transport(url, { ...init, headers, redirect: 'error' });
},
});
const endpoint = 'openai/gpt-image-2.5/flare/text-to-image';
// Dieselben Eingaben vorher über /api/v1/fal/quote prüfen.
const submitted = await fal.queue.submit(endpoint, {
input: {
"prompt": "Ein Produktfoto einer Keramiktasse auf hellem Holz, weiches Tageslicht.",
"image_size": {
"width": 1024,
"height": 1024
},
"quality": "medium",
"num_images": 1,
"output_format": "png"
},
headers: {
'Idempotency-Key': operationId,
'X-Okta-Max-Credits': String(maxCredits),
},
});
console.log(submitted.request_id); // Dauerhaft speichern.
// In späteren Aufrufen mit dieser ID: fal.queue.status / fal.queue.result.
// Bei einem Submit-Timeout dieselbe ID + Eingaben wiederverwenden.Nutze queue.status(endpoint, { requestId }) und nach erfolgreichem Abschluss queue.result(endpoint, { requestId }). Der SDK-Ergebnisumschlag enthält data und requestId. Der REST-Ergebnispfad liefert dagegen direkt das Modellresultat. Für H3-Referenzen den bereits erhaltenen X-Okta-Reference-Quote-Header zusätzlich setzen.
Bewusste Grenzen
Nicht qualifiziert: fal.run / synchrones Inference, SSE-Statusstream, Realtime/WebSockets, direkte SDK-Storage-Uploads, eigene Provider-Webhooks, Training/Hosting sowie eine Spiegelung der Fal-Account-/Billing-APIs. Python-, Swift- und Kotlin-SDK-Kompatibilität ist nicht zugesichert. Verwende REST für andere Sprachen und /api/v1/assets für Dateien.
09
Dateien und gemeinsame Mediathek
Uploads, generierte Ergebnisse und der Web-Chat verwenden dieselben Asset-Rechte. URLs sind keine öffentlichen Freigabelinks. Bewahre Asset-IDs auf und beachte Speicherquota und die jeweilige Aufbewahrungsfrist.
Datei hochladen und wiederfinden
# Lokale Datei: Multipart über die gemeinsame Mediathek (kleine Dateien).
curl --fail-with-body -sS "$BASE_URL/api/v1/assets" \
-H "Authorization: Bearer $OKTA_API_KEY" \
-F "file=@produkt.png" | jq .
# Bereits gespeicherte Medien suchen:
curl --fail-with-body -sS --get "$BASE_URL/api/v1/assets" \
-H "Authorization: Bearer $OKTA_API_KEY" \
--data-urlencode 'search=produkt' | jq .Größenlimit nicht verwechseln
Für lokale MCP-Uploads gilt ein konservatives Limit von 4 MiB. Auch direkte Multipart-Requests müssen innerhalb der Deploymentgrenzen bleiben. Große Direct-to-Storage-/Multipart-Uploads sind noch nicht implementiert. Größere bereits gehostete Referenzen können nur über erlaubte, erreichbare Medienquellen importiert werden.
Eigene URL wiederverwenden / erlaubte Medien importieren
# Beispiel: eigenen Asset-Pfad ersetzen; keine beliebige Fremd-URL.
curl --fail-with-body -sS "$BASE_URL/api/v1/fal/upload" \
-H "Authorization: Bearer $OKTA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"/api/v1/assets/DEINE_ASSET_ID/content"}'
# Antwort: url, asset_id, content_type, reused.Geschützte Ergebnisse herunterladen
# Beispiel lädt das erste GPT-Bild. Für Batches alle images[] verarbeiten.
ASSET_URL=$(jq -er '.images[0].url' result.json)
# Authorization niemals an fremde Hosts oder Redirects weitergeben.
case "$ASSET_URL" in
"$BASE_URL/api/v1/assets/"*/content) ;;
*) printf '%s\n' 'Kein bestätigter OKTA-Downloadpfad' >&2; exit 1 ;;
esac
curl --fail-with-body -sS "$ASSET_URL" \
-H "Authorization: Bearer $OKTA_API_KEY" -o ergebnis.pngReferenz-Importe liefern einen stabilen /api/assets/…-Pfad. Native Ergebnisse verwenden absolute /api/v1/assets/…/content-URLs für authentifizierte Downloads. Verwende die gelieferten Pfade statt URLs zu erfinden. Der native Ergebnisabruf wird erst erfolgreich, wenn alle erwarteten Ausgaben in OKTA gespeichert sind.
10
Aufträge, Wiederaufnahme und Abbruch
Speichere endpoint_id, Operations-ID, request_id, Eingaben und die Rückgabe-URLs. So kann derselbe Auftrag zwischen Coding-Agent und Web-App weiterverwendet werden.
| Fall | Richtige Aktion |
|---|---|
| Submit-Antwort fehlt / SUBMISSION_UNCONFIRMED | Identische native Eingaben mit derselben Idempotency-Key wiederholen. Keine neue ID als Reparatur. |
| request_id bekannt | status_url abfragen. Nicht erneut generieren. |
| COMPLETED mit error/error_type | Terminaler Fehler; Result-Endpoint liefert 422. Nicht als Erfolg anzeigen. |
| COMPLETED ohne Fehler | response_url abrufen und alle zurückgegebenen Medien sichern. |
| Im Web fortsetzen | web_url öffnen. context_url liefert den gemeinsamen Arbeitskontext; das Öffnen startet keinen neuen Auftrag. |
| Abbrechen | PUT auf cancel_url. 202 bedeutet nur CANCELLATION_REQUESTED; zu spät: ALREADY_COMPLETED. Fertige Ergebnisse bleiben erhalten. |
Ein absichtlich neuer Versuch ist ein neuer kostenpflichtiger Auftrag mit neuer Autorisierung und neuer ID. Ein fehlgeschlagener oder abgebrochener nativer Job wird nicht über den alten Studio-Retry wiederbelebt. Pausieren im Chat verhindert weitere Schritte, stoppt aber nicht automatisch einen bereits laufenden Providerauftrag.
11
Bestehende kompakte API
Bestehende Integrationen bleiben nutzbar. Diese Endpoints verwenden OKTA-Modell-IDs und settings, nicht vollständige fal-Endpoint-IDs. Sie sind ein separater Vertrag; native Idempotenz- und H3-Quote-Header nicht ungeprüft übertragen.
| Methode | Pfad | Verwendung |
|---|---|---|
| GET | /api/v1/models | Öffentlicher Modellkatalog der kompakten API; andere Auswahl als native models. |
| POST | /api/v1/generate/image | { model, prompt, settings? }; settings mit snake_case-Schlüsseln. |
| POST | /api/v1/edit/image | { model, prompt, image_url oder image_urls, settings? }. Modellgrenzen beachten. |
| POST | /api/v1/generate/video | { model, prompt, image_url?, settings? }; unterstütztes Text-/Startbild-Profil. |
| GET / POST | /api/v1/assets | Mediathek suchen bzw. Multipart mit file hochladen. |
| GET | /api/v1/assets/<id> | Asset-Metadaten und verfügbare Varianten. |
| GET | /api/v1/assets/<id>/content | Geschützte Originaldatei herunterladen. |
| GET | /api/v1/credits | Guthaben im Kontext des Schlüssels. |
| GET | /api/v1/generations | Verlauf / Statusabfrage mit ?jobId=…; Rückgabe-URLs des jeweiligen Auftrags nutzen. |
# Bestehende kompakte API: NICHT das native Eingabeformat.
curl --fail-with-body -sS "$BASE_URL/api/v1/generate/image" \
-H "Authorization: Bearer $OKTA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-image-2.5-flare",
"prompt": "Ein Produktfoto einer Keramiktasse",
"settings": { "width": 1024, "height": 1024, "quality": "medium" }
}'Die kompakte API kann mit completed oder HTTP 202 / processing antworten. Folge ihrer status_url. Native Queue-Submits antworten dagegen mit HTTP 200 und IN_QUEUE. Für die volle aktuelle fal-native Eingabefläche nutze den neuen Vertrag.
Bestehende Feldnamen
Bilder: settings.aspect_ratio, settings.width und settings.height gemeinsam, settings.quality nach Modellfähigkeiten (bei GPT 2.5 alle sechs Stufen). Videos: settings.duration und settings.aspect_ratio im unterstützten Modellprofil. Keine pauschale Referenz- oder Pixelgrenze annehmen; /api/v1/models prüfen.
12
Fehler und Rate Limits
Native Fehler enthalten detail und ggf. error_type oder errors. Die kompakte API verwendet ihren eigenen error/code-Umschlag. HTTP-Status und Body gemeinsam prüfen.
| Status / Code | Bedeutung und Behandlung |
|---|---|
| 400 | Ungültige Anfrage; beim nativen Result-Abruf auch: noch nicht fertig. status_url weiter prüfen. |
| 401 / 403 / 404 | Key, Berechtigung, Modell- oder Asset-Verfügbarkeit prüfen. Fremde IDs nicht durchraten. |
| 402 / BUDGET_EXCEEDED | Guthaben oder genehmigtes Budget reichen nicht. Nicht automatisch den Cap erhöhen. |
| 409 / IDEMPOTENCY_CONFLICT | Dieselbe ID wurde mit anderen Eingaben verwendet. Ursprünglichen Auftrag prüfen. |
| 412 / 422 | Nicht unterstützte Funktion, ungültiges Schema, Referenzquote oder terminaler Ergebnisfehler. Body auswerten. |
| 413 | Datei oder Request zu groß. Kleineren unterstützten Uploadpfad verwenden. |
| 428 / REFERENCE_QUOTE_REQUIRED | Für neue H3-Referenzjobs zunächst Quote abrufen und Quote-ID mitsenden. |
| 429 | Retry-After und X-RateLimit-* beachten; mit Verzögerung erneut versuchen. |
| 503 / SUBMISSION_UNCONFIRMED | Annahme unklar: dieselbe Operations-ID beibehalten, niemals blind neu kaufen. |
Rate Limits gelten pro Nutzer und/oder IP und können je Endpoint variieren. Backoff mit Zufallsanteil nutzen, keine engen Polling-Schleifen. Weder ein Timeout noch eine angenommene Abbruchanfrage beweist, dass der Provider nicht mehr arbeitet.