APIMit MYEQ bauen

Production API Überblick

Die HTTP API bietet dieselbe provider-neutrale Produktionsautorität wie MYEQ Studio.

API-/MCP-Reife

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.

FPSZugelassene KlassePhysische Grenzen
24Standard; eigene Zulassung der gewählten ModalitätDauer, Audio und Referenzen hängen von der nativen Klasse ab
30Nur freigegebenes I2V / A2V720p · 2–10 ganze Sekunden · 9:16 / 16:9 / 1:1 · I2V/A2V: START und/oder END; A2V benötigt zusätzlich Quellaudio
60Nur freigegebenes I2V / A2V720p · 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'));
}
Workspace · Project · Asset · Entity · Storyboard · Plan · JobGeneriert ≠ Zertifiziert