Production API Überblick
Die HTTP API bietet dieselbe provider-neutrale Produktionsautorität wie MYEQ Studio.
Die Dokumentation ist öffentlich teilbar; Verfügbarkeit von API/MCP wird jedoch vom Live-Manifest und Kontozugriff bestimmt. Foundation oder experimental sind keine Stabilitätszusagen.
Ein Lebenszyklus
Context → Plan → Preflight → Execute → Inspect → Decide → Repair → Certify → Deliver ist das semantische Langzeitmodell. Live-Manifest vor Annahmen lesen.
Vor Ausgaben planen
Planung erzeugt einen prüfbaren Vorschlag ohne bezahlte Generierung; Preflight prüft Zugriff, Referenzen, Fähigkeiten und Budget.
curl -X POST https://myeq.pro/api/v1/production/plans \
-H "Authorization: Bearer $MYEQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"projectId": "project-123",
"script": "Create a 60-second vertical trailer",
"vertical": "ai_film",
"sourceLanguage": "en",
"responseLanguage": "es",
"dialogueLanguage": "es",
"visualPromptLanguage": "en"
}'Ausführung ist dauerhaft
Akzeptierte Arbeit gehört MYEQ und überlebt Client-Trennung. Status über den Job lesen.
Öffentliche Verträge sind provider-neutral
Clients wählen Produktionsabsicht und MYEQ-Fähigkeiten, nicht private Runtimes.
24, 30 und 60 FPS in Studio, API und MCP
Alle drei Schnittstellen verwenden denselben bestätigten Szenen-Snapshot und dieselbe Zulassung. Die angeforderten FPS bleiben erhalten; kein automatischer Wechsel zu 24 FPS. Verfügbarkeit hängt vom freigegebenen Worker und der konkreten Szene ab.
START/END-Bildflächen: 704×1280, 1280×704 oder 960×960. I2V erlaubt generiertes oder kein Audio. A2V benötigt autorisiertes Quellaudio und behält dessen gewählten Zeitversatz. Diese Tabelle aktiviert keine hohen FPS für Ingredients oder V2V. Seeds sind Ganzzahlen von 0 bis 2147483647. I2V und A2V erlauben END ohne START bei 24, 30 und 60 FPS nur nach ausdrücklicher Freigabe des bereitgestellten Dienstes. END führt das letzte Bild; der Anfang entsteht aus dem Prompt. start bleibt leer, das Bild bleibt in end. Pixelidentität oder eine Umkehrung des Videos werden nicht zugesagt. A2V benötigt immer autorisiertes Quellaudio und mindestens ein START- oder END-Bild; Audio allein ist nicht zulässig.
| FPS | Zugelassene Klasse | Physische Grenzen |
|---|---|---|
| 24 | Standard; eigene Zulassung der gewählten Modalität | Dauer, Audio und Referenzen hängen von der nativen Klasse ab |
| 30 | Nur freigegebenes I2V / A2V | 720p · 2–10 ganze Sekunden · 9:16 / 16:9 / 1:1 · I2V/A2V: START und/oder END; A2V benötigt zusätzlich Quellaudio |
| 60 | Nur freigegebenes I2V / A2V | 720p · 2–10 ganze Sekunden · 9:16 / 16:9 / 1:1 · I2V/A2V: START und/oder END; A2V benötigt zusätzlich Quellaudio |
Speichern, Kosten prüfen, eine Szene bestätigen
Autorisiertes Projekt erstellen oder lesen, Szene mit PATCH expectedVersion speichern. Denselben Snapshot und targetSceneId an /api/v1/production/snapshots/preflight-scene senden. data.ready, issues und estimatedCredits prüfen; kein Job und keine Kreditreservierung. Mit confirm=true und stabilem Idempotency-Key über /api/v1/production/snapshots/generate-scene generieren, danach jobId abfragen. MCP verwendet myeq.video.preflight_scene und myeq.video.generate_scene mit demselben Snapshot; bezahlte Übermittlung wird nie automatisch wiederholt. Szeneneinstellungen überschreiben Projektstandards; passende bestätigte sceneContracts erhalten.
Die alten /video/start-, /video/create-, /video/create-job- und /video/preflight-Routen sind eingestellt: Standard/24 liefert 410, 30/60 erfordert Snapshot-Migration mit 422. 25/48/50 werden nicht unterstützt. Preflight-Fehler ändern keine FPS und berechnen keine Credits. Eine erfolgreiche Prüfung reserviert weder Verfügbarkeit noch Guthaben.
const base = process.env.MYEQ_BASE_URL || 'https://myeq.pro';
const headers = { Authorization: 'Bearer ' + process.env.MYEQ_API_KEY, 'Content-Type': 'application/json' };
async function api(path, method, body, extra = {}) {
const response = await fetch(base + path, { method, headers: { ...headers, ...extra },
...(body === undefined ? {} : { body: JSON.stringify(body) }) });
const value = await response.json();
if (!response.ok) throw new Error(JSON.stringify(value));
return value;
}
const project = await api('/api/v1/projects', 'POST', { title: '60 FPS', aspectRatio: '9:16', duration: 4 });
const sourceAudioUrl = process.env.SOURCE_AUDIO_URL;
const generationInputs = { videoProvider: 'myeq_v2', videoModelSelection: 'myeq_v2',
inputModality: sourceAudioUrl ? 'audio_to_video' : 'image_to_video', durationSeconds: 4,
fps: 60, outputResolution: '720p', includeAudio: Boolean(sourceAudioUrl), seed: 12345,
...(sourceAudioUrl ? { sourceAudioUrl, sourceAudioStartTime: 0 } : {}) };
const scene = { id: 'scene-1', prompt: 'A slow camera move. Preserve the subject.',
settings: { fps: 60, durationSeconds: 4 },
start: process.env.START_URL ? [{ name: 'START', url: process.env.START_URL }] : [],
end: process.env.END_URL ? [{ name: 'END', url: process.env.END_URL }] : [], context: [], avatar: [] };
const snapshot = { id: crypto.randomUUID(), version: 1, projectId: project.id,
ownerId: project.ownerUserId, sourceEditorStateVersion: project.version + 1,
createdAt: new Date().toISOString(), projectTitle: project.title,
aspectRatio: '9:16', resolution: '720p', durationSeconds: 4, fps: 60,
generationInputs, scenes: [scene], avatars: [], assetsSummary: [],
sourceAudio: sourceAudioUrl ? { url: sourceAudioUrl, durationSeconds: null } : null, provenance: { source: 'ui' } };
await api('/api/v1/projects/' + project.id, 'PATCH', { expectedVersion: project.version,
editorState: { ...project.editorState, generationInputs,
sceneStoryboard: { scenes: [scene] }, productionSnapshot: snapshot } });
const input = { snapshot, targetSceneId: scene.id };
const quote = await api('/api/v1/production/snapshots/preflight-scene', 'POST', input);
console.log(quote);
if (quote.data?.ready && process.env.CONFIRM_PAID === 'true') {
const idempotencyKey = process.env.SAVED_IDEMPOTENCY_KEY;
if (!idempotencyKey) throw new Error('Persist one stable key before submitting');
const result = await api('/api/v1/production/snapshots/generate-scene', 'POST',
{ ...input, confirm: true }, { 'Idempotency-Key': idempotencyKey });
console.log(result);
const jobId = result.data?.pendingTake?.orchestrationJobId || result.data?.asset?.metadata?.jobId;
if (jobId) console.log(await api('/api/v1/production/jobs/' + encodeURIComponent(jobId), 'GET'));
}