Gerações

Acompanhe uma geração da Direct API até o status final com long-polling, leia várias de uma vez e saiba com que frequência consultar.

Uma geração é uma unidade de trabalho assíncrono: uma imagem, um vídeo, uma faixa de áudio, uma renderização. As ferramentas com returns_generation: true iniciam uma ou mais e respondem na hora com os IDs delas. Acompanhe-as por polling, por webhook ou pelos dois: use um webhook como sinal principal e uma consulta ocasional como rede de segurança.

Status

queued ──► in_progress ──► succeeded
   │             │
   │             ├──────► failed
   └─────────────┴──────► cancelled
StatusFinalSignificado
queuednãoaceita, aguardando capacidade do modelo
in_progressnãoo modelo está trabalhando
succeededsimassets contém o resultado
failedsimerror diz o motivo; a cobrança é reembolsada e billing.credits_refunded informa quanto
cancelledsiminterrompida antes de produzir um resultado; a cobrança é reembolsada

Trate qualquer status que você não reconheça como não final e continue acompanhando a geração; novos status intermediários podem ser adicionados.

O objeto de geração

{
  "object": "generation",
  "id": "0192a7b3-a1c4-7e02-8f9d-1a2b3c4d5e6f",
  "tool": "generate_video",
  "status": "succeeded",
  "project_id": "01928f4e-5b7c-7d2a-9e11-3c4b5a6d7e8f",
  "model_id": "mdl_7rk2pq9vxa4m",
  "created_at": "2026-10-25T09:14:03.120Z",
  "completed_at": "2026-10-25T09:15:41.902Z",
  "error": null,
  "billing": {
    "estimated_credits": 120,
    "credits_charged": 96,
    "credits_refunded": 0,
    "credits_are_final": true,
    "credits_settle_on_output_duration": true
  },
  "assets": [
    {
      "id": "0192a7b4-0f1e-7d3c-9b8a-7c6d5e4f3a2b",
      "type": "video",
      "name": "Bicycle hero shot",
      "mime_type": "video/mp4",
      "width": 1920,
      "height": 1080,
      "duration_seconds": 8,
      "url": "https://mcp.morphic.com/m/Xk29dPq",
      "url_expires_at": null,
      "studio_url": "https://studio.morphic.com/…",
      "final_generation_expires_at": null
    }
  ],
  "content_left_out": [],
  "render_warnings": [],
  "metadata": { "order_id": "4411" },
  "poll_after_seconds": null
}
CampoSignificado
errornull, ou { "error_code": "…", "message": "…" } em failed. A mensagem pode ser mostrada com segurança aos seus usuários.
billingquanto esta geração custou; veja Créditos e uso
assets[].ido ID do recurso que outras ferramentas recebem como entrada (image_asset_id, video_asset_id, …)
assets[].urlum link curto para baixar a mídia; ele não expira, e url_expires_at é null
assets[].studio_urlabre o recurso no Morphic Studio para a sua equipe
assets[].final_generation_expires_atapenas vídeos de rascunho: até quando finalize_video_draft pode renderizá-lo em resolução máxima
content_left_out, render_warningsapenas composições e exportações de linha do tempo: o que o resultado não conseguiu incluir, e por quê
poll_after_secondsenquanto não for final, quanto tempo esperar antes da próxima leitura; null quando for final

Ler uma geração

GET /v1/direct/generations/{id} responde 200 com { "generation": { … } }.

curl -s "https://mcp.morphic.com/v1/direct/generations/$ID?wait=45" \
  -H "Authorization: Bearer $MORPHIC_API_KEY"
  • wait é opcional, de 0 a 45 segundos. A solicitação fica aberta até o status da geração mudar ou ela terminar, e então responde na hora.
  • Quando a espera se esgota, ela responde com o estado atual. Um valor acima de 45 é reduzido para 45.
  • Uma geração de outra organização, ou uma que esta chave não pode ler, responde 404, nunca 403, para que IDs não possam ser sondados.

Ler várias gerações

POST /v1/direct/generations/batch-get lê até 10 gerações em uma única solicitação.

curl -s https://mcp.morphic.com/v1/direct/generations/batch-get \
  -H "Authorization: Bearer $MORPHIC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids": ["0192a7b3-…", "0192a7b3-…"], "wait": 30}'
  • Com wait, a solicitação responde assim que qualquer uma delas mudar de status ou todas forem finais.
  • A resposta é { "generations": [ … ], "not_found": ["…"] }, na ordem pedida.

Com que frequência consultar

Cada início e cada leitura não final trazem poll_after_seconds. Espere pelo menos esse tempo antes da próxima leitura e depois vá espaçando as consultas.

ResultadoPrimeira consulta apósTempo típico até o final
imagem, edição de imagem, upscale, operações de imagem5 s5 a 60 s
fala, efeito sonoro, transcrição10 s10 a 90 s
música, diálogo20 s30 s a 3 min
vídeo, edição de vídeo, sincronização labial, renderizações30 s1 a 10 min, mais sob carga

Um long-poll (wait=45) custa uma leitura, não importa quanto tempo fique aberto, então é a forma mais rápida e mais barata de consultar. Configure o timeout do seu cliente HTTP acima da espera: 60 s para wait=45.

import time, requests

def wait_for(generation_id, key):
    headers = {"Authorization": f"Bearer {key}"}
    url = f"https://mcp.morphic.com/v1/direct/generations/{generation_id}"
    while True:
        r = requests.get(url, params={"wait": 45}, headers=headers, timeout=60)
        if r.status_code == 429:
            time.sleep(int(r.headers.get("Retry-After", "5")))
            continue
        r.raise_for_status()
        gen = r.json()["generation"]
        if gen["status"] in ("succeeded", "failed", "cancelled"):
            return gen
        # A long-poll already waited; only sleep if the server asks for more.
        time.sleep(max(0, (gen.get("poll_after_seconds") or 0) - 45))

Limites de polling

LimiteValorAo ultrapassar
Leituras de uma geração por uma chave30 por minuto429, Retry-After
Leituras de todas as gerações por uma chave1.200 por minuto429, Retry-After
wait45 segundosreduzido ao máximo
IDs por leitura em lote10400

Uma leitura em lote conta uma vez por ID nos dois limites. No ritmo recomendado, uma chave consegue acompanhar várias centenas de gerações em andamento ao mesmo tempo; se você acompanhar mais, use webhooks.


Se você tiver algum problema ou alguma dúvida, entre em contato. Teremos prazer em ajudar. Escreva para nós em support@morphic.com.

Nesta página