生成

Direct API の生成をロングポーリングで最終ステータスまで追跡し、複数件をまとめて読み取り、ポーリングの間隔を判断します。

生成は非同期処理の 1 単位です。1 枚の画像、1 本の動画、1 本の音声トラック、1 回のレンダリングがそれぞれ 1 件の生成にあたります。returns_generation: true のツールは 1 件以上の生成を開始し、その ID をすぐに返します。生成はポーリング、Webhook、またはその両方で追跡します。Webhook を主な通知手段とし、ときどきのポーリングを安全策として使ってください。

ステータス

queued ──► in_progress ──► succeeded
   │             │
   │             ├──────► failed
   └─────────────┴──────► cancelled
ステータス最終意味
queuedいいえ受け付け済みで、モデルの処理枠を待っています
in_progressいいえモデルが処理中です
succeededはいassets に出力が入っています
failedはいerror に理由が示されます。請求額は返金され、返金額は billing.credits_refunded に示されます
cancelledはい出力を生成する前に停止しました。請求額は返金されます

認識できないステータスは最終状態ではないものとして扱い、生成の追跡を続けてください。新しい中間ステータスが追加される可能性があります。

生成オブジェクト

{
  "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
}
フィールド意味
errornull、または failed の場合は { "error_code": "…", "message": "…" }。メッセージはお客様のユーザーにそのまま表示できます。
billingこの生成にかかった費用。クレジットと使用量 を参照
assets[].id他のツールが入力として受け取るアセット ID(image_asset_id、video_asset_id など)
assets[].urlメディアをダウンロードするための短縮リンク。有効期限はなく、url_expires_at は null です
assets[].studio_urlチームのために Morphic Studio でアセットを開きます
assets[].final_generation_expires_atドラフト動画のみ: finalize_video_draft でフル解像度にレンダリングできる期限
content_left_out、render_warningsコンポーズとタイムラインの書き出しのみ: 出力に含められなかった内容とその理由
poll_after_seconds最終状態になるまでの間、次の読み取りまでに待つ秒数。最終状態になると null

1 件の生成を読み取る

GET /v1/direct/generations/{id} は { "generation": { … } } とともに 200 を返します。

curl -s "https://mcp.morphic.com/v1/direct/generations/$ID?wait=45" \
  -H "Authorization: Bearer $MORPHIC_API_KEY"
  • wait は任意で、0 から 45 秒です。生成のステータスが変わるか完了するまでリクエストが保持され、その時点ですぐに応答します。
  • 待機時間が切れると、現在の状態を返します。45 を超える値は 45 に切り詰められます。
  • 他の組織の生成や、このキーで読み取れない生成には、403 ではなく 404 が返ります。そのため ID を探られることはありません。

複数の生成を読み取る

POST /v1/direct/generations/batch-get は、1 回のリクエストで最大 10 件の生成を読み取ります。

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}'
  • wait を指定すると、いずれかのステータスが変わるか、すべてが最終状態になった時点で応答します。
  • レスポンスは { "generations": [ … ], "not_found": ["…"] } で、リクエストした順に並びます。

ポーリングの頻度

各開始レスポンスと、最終状態でない各読み取りには poll_after_seconds が含まれます。次の読み取りまで少なくともその秒数だけ待ち、その後は間隔を延ばしてください。

出力最初のポーリングまで最終状態までの目安
画像、画像編集、アップスケール、画像操作5 秒5 から 60 秒
音声合成、効果音、文字起こし10 秒10 から 90 秒
音楽、対話20 秒30 秒から 3 分
動画、動画編集、リップシンク、レンダリング30 秒1 から 10 分、高負荷時はそれ以上

ロングポーリング(wait=45)は、保持された時間にかかわらず 1 回の読み取りとしてカウントされるため、最も速く、最も負担の少ないポーリング方法です。HTTP クライアントのタイムアウトは待機時間より長く設定してください。wait=45 なら 60 秒です。

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))

ポーリングの制限

制限値超過時
1 つのキーによる 1 件の生成の読み取り毎分 30 回429、Retry-After
1 つのキーによるすべての生成の読み取り毎分 1,200 回429、Retry-After
wait45 秒切り詰め
一括読み取り 1 回あたりの ID 数10400

一括読み取りは、ID ごとに 1 回として両方の制限にカウントされます。推奨の間隔であれば、1 つのキーで同時に数百件の進行中の生成を追跡できます。それ以上を追跡する場合は Webhook を使ってください。


何かお困りのことやご質問がありましたら、お気軽にご連絡ください。喜んでお手伝いします。こちらまでご連絡ください support@morphic.com.

このページの内容