POST /v2/models/{provider}/{model} は、モデルの処理が完了するまで接続を保持します。キュー経由の配信は同じモデル ID と同じネイティブなリクエストボディを使用しますが、Router が実行を受理した時点で応答を返します。request_id をすぐに受け取り、準備ができたときに同じプロセスまたは別のプロセスから結果を取得します。
同期ルートには 10 分の上限があります。 Router のデフォルトのデッドラインはデプロイごとに設定できます。同期呼び出しがこのデッドラインに達すると、プロバイダーがまだ処理を続けていても 504 / deadline_exceeded で切断されます。実行がデッドラインを超える可能性がある場合、または呼び出し元がそれほど長く接続を開いたままにできない場合は、その実行をキューに入れてください。デッドラインが課金について何を伝え、何を伝えないかについては、サーバーのデッドラインで呼び出しが打ち切られます を参照してください。
キューは、1 回の生成が自分が保持できる接続より長引く可能性がある場合、Web リクエストが今すぐ応答を返す必要がある場合、あるプロセスで送信して別のプロセスで結果を取得する場合、あるいは多数の生成を同時に進行させたい場合に使用します。順序付け、受付、リトライ、タイムアウト、課金、有効期限はすべてサーバー側で決定されます。SDK はその上にポーリングと使いやすさを追加するだけで、それ以外は何も行いません。
配信モードを選択する
SDK(
comfy-sdk と @comfyorg/sdk、0.3.0 以降)は、キューを run の隣にある 3 つのメソッドとして公開しています:
submit(model, body)はリクエストを送信し、すぐにハンドルを返します。ハンドルはstatus()、get()、cancel()とイベントイテレータ(Python ではiter_events()、TypeScript ではevents())を備えています。subscribe(model, body, ...)は送信、ポーリング、収集を 1 回の呼び出しにまとめたもので、進捗コールバックを備えています。handle(model, request_id)は 2 つの ID から別のプロセスでハンドルを再構築します。呼び出しは行われません。
/v2/models/{provider}/{model}/requests/{request_id} です。
ここでの
events() は、Comfy Cloud クライアントの job.events() ではありません。こちらはステータスルートをポーリングし、Router リクエストのキューの観測値(ステータスとキュー位置)を返します。Cloud の方は、進捗、プレビュー、出力を伴う ComfyUI ワークフロージョブのライブ SSE ストリームです。subscribe() はまた別のもので、イテレータでは一切なく、送信、ポーリング、収集を 1 回の呼び出しにまとめたものです。詳しくは events() is not subscribe() を参照してください。キュールート
status は IN_QUEUE、IN_PROGRESS、COMPLETED のいずれかです。失敗やキャンセル済みという独立したステータスはありません。成功しなかったリクエストは error_type を持つ COMPLETED となるため、4 つ目のステータス値ではなく、このフィールドの有無で分岐してください。SDK はこれを自動で処理します。get() は失敗を結果として返すのではなく、型付きの Router エラーを発生させるか reject します。
進捗イベント、Webhook、優先度レベルはありません。リクエストを追跡する方法はステータスルートです。API リファレンス に各ルートの完全なコントラクトが記載されています。
リクエストの送信と収集
これは、クイックスタートが送信するのと同じリクエストをキューに入れ、画像を収集します。まず、キーをCOMFY_API_KEY としてエクスポートしてください。
進捗の追跡と1回の呼び出しでの収集
待機しつつ進捗も表示したい場合は、subscribe が送信、ポーリング、収集を1回の呼び出しにまとめます。
subscribe は例外を発生させる前に一度ベストエフォートのキャンセルを行います。キャンセルは、まだ実行が開始されていないリクエストにのみ効果があります。パートナーですでに実行中の生成は、誰かが収集するかどうかに関わらず完了し、課金されます。リクエストが呼び出し元より長く存続すべき場合は、submit を使用してください。
別のプロセスからの収集
request_id をモデル ID と一緒に保存します。ハンドルを再構築するには両方が必要で、使用するまで呼び出しは行われません。
ステータスの確認またはキャンセル
status() は1回のポーリングで、現在の状態を返します。cancel() は、完了していないリクエストを停止するようサーバーに要求します。これは要求であり、保証ではありません。パートナーですでに送信中の実行はそのまま完了する可能性があり、次に status() が返すものが真実です。
非同期 Python
AsyncComfy はすべての名前、引数、引数の順序を反映しています。run_async が存在しないのと同じ理由で、submit_async も存在しません。
SDK が発生させるエラー
成功せずに完了したリクエストは、error_type 付きの COMPLETED として報告されます。get() と subscribe() はそれを該当するバケットの型付き Router エラーに変換します。Python では comfy_sdk.router_exceptions のクラス、TypeScript では routerErrors.* です。イベントイテレーターはこのケースでは例外を発生させません。これはキュー進捗のビューであるためです。error_type を持つ完了は最後の観察として yield され、収集するのは get() です。送信時の 403 not_enabled は NotEnabled として届き、ターミナルであるため、SDK はそれをリトライしません。
キューレスポンスの形状
送信、201。 この時点で status は常に IN_QUEUE です。3つの URL は絶対 URL で、送信時と同じキーで認証されます。
request_id は送信時の X-Comfy-Request-Id ヘッダーの値でもあります。モデル ID をその隣に保持してください。リクエストはこの両方で指定されます。
ステータス、200。 同じ形状で、現在の状態が入ります。queue_position は自分の前に並んでいるリクエスト数を数えたもので、実行が先頭に到達すると 0 になります。このレスポンスの Retry-After は、再度ポーリングする価値があるタイミングについての Router の見積もりです。これは目安であり、上限ではありません。キューの最後尾にあるリクエストには、すでに実行中のものより長く待つよう指示されます。より速くポーリングしても早く分かることはなく、自分のレート制限の枠を消費するだけです。
error_type を伴う COMPLETED となり、結果の読み取りが X-Comfy-Error-Type に付けるのと同じ大まかなバケットを持ちます。このフィールドは成功時には null ではなく存在しません。
200 はモデル自身のネイティブな出力を返します。同じモデルと入力に対して同期ルートが返すものとバイト単位で同一で、プロバイダー自身の Content-Type が付きます。リクエストが完了していない間、この読み取りは上記のステータスボディとともに 202 を返すため、結果 URL だけをポーリングするクライアントは 1 つの型だけをパースすれば済みます。失敗したリクエストは、X-Comfy-Error-Type が設定されたエラーレスポンスとして返り、バケットは同期ルートと同じです。
キャンセル。 CANCELLATION_REQUESTED を伴う 202 は、要求が受け付けられたことを意味するのであり、実行が停止したことを意味するわけではありません。すでにパートナー側で処理中の実行はそのまま完了する可能性があり、完了したパートナーでの生成は、誰かが受け取るかどうかに関わらず課金されます。その後でステータスを読み取ってください。効果があったキャンセルは error_type: cancelled を伴う COMPLETED として現れます。実行される前に期限切れになったリクエストも、同じように queue_timeout を示します。すでに完了していたリクエストは ALREADY_COMPLETED を伴う 409 を返します。
冪等性と課金
- 同期ルートと同じ課金。 課金はプロバイダーが Comfy に課金した時点で発生します。キューで待機している時間は課金されません。
Idempotency-Keyは送信ごとに 1 つ。 SDK はsubmit呼び出しごとに新しいキーを発行するため、同じ入力を意図的に 2 回送信すると 2 つのリクエストになります。同じキーで同じ呼び出しを再試行しても 2 回目の実行はキューに入りません。元のハンドルをIdempotent-Replayed: trueとともに返します。応答を取りこぼすとrequest_idを失いかねない場合は、独自のキーを渡してください。詳しくは ヘッダー を参照してください。- 結果は失効します。 完了したリクエストは、完了後 24 時間保持されます。その後はステータスおよび結果の読み取りが
410を返し、結果は失われます。速やかに回収し、出力に含まれるアセット URL はダウンロードしてください。 - ポーリングもリクエストです。 ステータスと結果の読み取りは、呼び出し元ごとのリクエストレートにカウントされます。固定の短い間隔でポーリングするのではなく、
Retry-Afterに従ってください。
キューのエラー応答
すべてのエラー応答には
X-Comfy-Request-Id が含まれます。サポートに連絡する際はこれを伝えてください。
次のステップ
- エラーと再試行: エラーレスポンスの読み方と、二重に課金されずに再試行する方法。
- API リファレンス: 各キュールートの完全なコントラクト。