Generaciones
Siga una generación de la Direct API hasta su estado final con sondeo largo, lea varias a la vez y sepa cuándo sondear.
Una generación es una unidad de trabajo asíncrono: una imagen, un video, una pista de audio, un renderizado. Las herramientas con returns_generation: true inician una o más y responden de inmediato con sus ids. Sígalas mediante sondeo, mediante webhook o de ambas formas: use un webhook como señal principal y un sondeo ocasional como red de seguridad.
Estados
queued ──► in_progress ──► succeeded
│ │
│ ├──────► failed
└─────────────┴──────► cancelled| Estado | Final | Significado |
|---|---|---|
queued | no | aceptada, a la espera de capacidad del modelo |
in_progress | no | el modelo está trabajando |
succeeded | sí | assets contiene la salida |
failed | sí | error indica el motivo; el cobro se reembolsa y billing.credits_refunded indica cuánto |
cancelled | sí | se detuvo antes de producir salida; el cobro se reembolsa |
Trate cualquier estado que no reconozca como no final y siga la generación; pueden añadirse nuevos estados intermedios.
El objeto de generación
{
"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
}| Campo | Significado |
|---|---|
error | null, o { "error_code": "…", "message": "…" } en failed. El mensaje puede mostrarse a sus usuarios con seguridad. |
billing | lo que costó esta generación; consulte Créditos y uso |
assets[].id | el id de recurso que otras herramientas reciben como entrada (image_asset_id, video_asset_id, …) |
assets[].url | un enlace corto para descargar el contenido; no caduca, y url_expires_at es null |
assets[].studio_url | abre el recurso en Morphic Studio para su equipo |
assets[].final_generation_expires_at | solo para borradores de video: hasta cuándo finalize_video_draft puede renderizarlo a resolución completa |
content_left_out, render_warnings | solo para composiciones y exportaciones de línea de tiempo: lo que la salida no pudo incluir, y por qué |
poll_after_seconds | mientras no sea final, cuánto esperar antes de la siguiente lectura; null una vez final |
Leer una generación
GET /v1/direct/generations/{id} responde 200 con { "generation": { … } }.
curl -s "https://mcp.morphic.com/v1/direct/generations/$ID?wait=45" \
-H "Authorization: Bearer $MORPHIC_API_KEY"waites opcional, de0a45segundos. La solicitud se mantiene abierta hasta que cambia el estado de la generación o esta termina, y entonces responde de inmediato.- Cuando se agota la espera, responde con el estado actual. Un valor superior a 45 se limita a 45.
- Una generación de otra organización, o una que esta clave no puede leer, responde
404, nunca403, para que no se puedan sondear ids ajenos.
Leer varias generaciones
POST /v1/direct/generations/batch-get lee hasta 10 generaciones en una sola solicitud.
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}'- Con
wait, la solicitud responde en cuanto alguna de ellas cambia de estado o todas son finales. - La respuesta es
{ "generations": [ … ], "not_found": ["…"] }, en el orden solicitado.
Con qué frecuencia sondear
Cada inicio y cada lectura no final llevan poll_after_seconds. Espere al menos ese tiempo antes de la siguiente lectura y luego vaya espaciando las lecturas.
| Salida | Primer sondeo tras | Tiempo habitual hasta el estado final |
|---|---|---|
| imagen, edición de imagen, aumento de resolución, operaciones de imagen | 5 s | de 5 a 60 s |
| voz, efecto de sonido, transcripción | 10 s | de 10 a 90 s |
| música, diálogo | 20 s | de 30 s a 3 min |
| video, edición de video, sincronización labial, renderizados | 30 s | de 1 a 10 min, más con carga alta |
Un sondeo largo (wait=45) cuenta como una sola lectura por mucho que se mantenga abierto, así que es la forma más rápida y también la más barata de sondear. Configure el tiempo de espera de su cliente HTTP por encima de la 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))Límites de sondeo
| Límite | Valor | Al superarlo |
|---|---|---|
| Lecturas de una generación por una clave | 30 por minuto | 429, Retry-After |
| Lecturas de todas las generaciones por una clave | 1,200 por minuto | 429, Retry-After |
wait | 45 segundos | se limita |
| Ids por lectura por lotes | 10 | 400 |
Una lectura por lotes cuenta una vez por id en ambos límites. Con la cadencia recomendada, una clave puede seguir varios cientos de generaciones en curso a la vez; si sigue más, use webhooks.
Si tiene algún problema o alguna pregunta, no dude en ponerse en contacto con nosotros. Estaremos encantados de ayudarle. Escríbanos a support@morphic.com.
Llamar a una herramienta
Llame a cualquier herramienta de la Direct API con una misma forma de solicitud, lea su resultado y su facturación, y reintente llamadas de pago con seguridad mediante un Idempotency-Key.
Webhooks
Reciba un aviso firmado cuando termine una generación de la Direct API, verifíquelo y lea la generación para obtener sus detalles.