APIИнтеграция с MYEQ

Обзор Production API

HTTP API предоставляет ту же provider-neutral производственную власть, что MYEQ Studio.

Зрелость API / MCP

Документация публична, но доступность API/MCP определяется живым манифестом и правами аккаунта. Foundation/experimental не являются обещанием стабильности.

Единый жизненный цикл

Context → Plan → Preflight → Execute → Inspect → Decide → Repair → Certify → Deliver — долгосрочная семантическая модель. Перед использованием читайте live manifest.

Планируйте до расходов

Plan создаёт проверяемое предложение без платной генерации; Preflight проверяет доступ, references, capabilities и 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"
  }'

Execution durable

Принятая работа остаётся у MYEQ после отключения клиента. Читайте job status.

Публичные контракты provider-neutral

Клиент выбирает производственное намерение и возможности MYEQ, а не приватный runtime.

24, 30 и 60 FPS в Studio, API и MCP

Все три интерфейса используют один подтверждённый snapshot сцены и одинаковые проверки допуска. Запрошенный FPS сохраняется, автоматического перехода на 24 FPS нет. Доступность зависит от разрешённого worker и точных условий сцены.

Размеры START/END: 704×1280, 1280×704 или 960×960. I2V допускает сгенерированное аудио или отсутствие аудио. A2V требует исходное аудио с правом использования и сохраняет выбранное смещение. Таблица не включает высокий FPS для ingredients или V2V. Seed — целое число от 0 до 2147483647. I2V и A2V допускают END без START при 24, 30 и 60 FPS только при явном разрешении развёрнутого сервиса. END направляет последний кадр; начало создаётся по промпту. Оставьте start пустым, а изображение — в end. Это не гарантирует совпадения пикселей и не переворачивает видео. A2V всегда требует исходное аудио с правом использования и хотя бы одно изображение START или END; одного аудио недостаточно.

FPSДопущенный классФизические ограничения
24По умолчанию; выбранная модальность проходит собственный допускДлительность, аудио и референсы зависят от native-класса
30Только одобренные I2V / A2V720p · целые 2–10 секунд · 9:16 / 16:9 / 1:1 · I2V/A2V: START и/или END; A2V также требует исходное аудио
60Только одобренные I2V / A2V720p · целые 2–10 секунд · 9:16 / 16:9 / 1:1 · I2V/A2V: START и/или END; A2V также требует исходное аудио

Сохранить, проверить цену, подтвердить одну сцену

Создайте или прочитайте доступный проект, сохраните сцену через PATCH expectedVersion. Отправьте тот же snapshot и targetSceneId в /api/v1/production/snapshots/preflight-scene. Проверьте data.ready, issues и estimatedCredits: job и резерв кредитов не создаются. Генерируйте через /api/v1/production/snapshots/generate-scene с confirm=true и постоянным Idempotency-Key, затем проверяйте jobId. MCP использует myeq.video.preflight_scene и myeq.video.generate_scene с тем же snapshot; платная отправка не повторяется автоматически. Настройки сцены важнее общих; сохраняйте соответствующие подтверждённые sceneContracts.

Старые /video/start, /video/create, /video/create-job и /video/preflight сняты: запрос по умолчанию/24 возвращает 410, для 30/60 нужен snapshot и код 422. 25/48/50 не поддерживаются. Ошибка preflight не меняет FPS и не списывает кредиты. Успех проверки не резервирует доступность или баланс.

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 · JobСгенерировано ≠ Сертифицировано