Skip to main content
POST /v2/models/{provider}/{model} は、モデルの処理が完了するまで接続を保持します。キュー経由の配信は同じモデル ID と同じネイティブなリクエストボディを使用しますが、Router が実行を受理した時点で応答を返します。request_id をすぐに受け取り、準備ができたときに同じプロセスまたは別のプロセスから結果を取得します。 同期ルートには 10 分の上限があります。 この上限こそがこのページが存在する理由です。Router のデフォルトのデッドラインは 10 分(デプロイごとに設定可能)であり、同期呼び出しがそこに達すると、プロバイダーがまだ処理を続けていても 504 / deadline_exceeded で切断されます。それより長く実行される可能性がある生成や、10 分間接続を開いたままにできない呼び出し元は、キューを使用する必要があります。デッドラインが課金について何を伝え、何を伝えないかについては、サーバーのデッドラインで呼び出しが切断される を参照してください。 キューは、1 回の生成が自分が保持できる接続時間より長引く可能性がある場合、Web リクエストが今すぐ応答を返す必要がある場合、あるプロセスで送信して別のプロセスで結果を取得する場合、あるいは多数の生成を同時に進行させたい場合に使用します。順序付け、受付、リトライ、タイムアウト、課金、有効期限はすべてサーバー側で決定されます。SDK はその上にポーリングと使いやすさを追加するだけで、それ以外は何も行いません。

2つの配信モード、1つのリクエスト

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から別のプロセスでハンドルを再構築します。呼び出しは発生しません。
両方の ID がリクエストの指定に関わるため、どの場面でも両方の ID が必要です。ルートは /v2/models/{provider}/{model}/requests/{request_id} です。
ここでの events() は、Comfy Cloud クライアントの job.events() ではありません。こちらはステータスルートをポーリングし、Router リクエストのキューの観測結果(ステータスとキュー位置)を返します。Cloud の方は、ComfyUI ワークフロージョブの進行状況、プレビュー、出力を運ぶライブ SSE ストリームです。subscribe() はまた別のもので、イテレータではなく、送信、ポーリング、収集を1回の呼び出しにまとめたものです。詳しくは events() is not subscribe() を参照してください。

4つのルート

status は IN_QUEUE、IN_PROGRESS、COMPLETED のいずれかです。失敗やキャンセル済みを表す独立したステータスはありません。成功しなかったリクエストは error_type を持つ COMPLETED になるため、4つ目のステータス値ではなく、このフィールドの有無で分岐してください。SDK はこれを自動で処理します。get() は失敗を結果として返すのではなく、型付きの Router エラーを送出または reject します。 進捗イベント、webhook、優先度レベルはありません。リクエストを追跡する手段はステータスルートです。API リファレンスに、各ルートの完全なコントラクトが記載されています。

リクエストをキューに登録する

クイックスタートが送信するのと同じリクエストをキューに登録し、画像を収集します。まずキーを COMFY_API_KEY としてエクスポートしてください。
各モデルページでは、同期スニペットの隣にある Queue and collect later タブに、そのモデル向けのこの形が記載されています。

進捗を追跡して 1 回の呼び出しで収集する

待機しつつ進捗も表示したい場合は、subscribe が送信、ポーリング、収集を 1 回の呼び出しにまとめます:
タイムアウトはクライアント側の制限であり、サーバー側の意味はありません。タイムアウトすると、subscribe は例外を送出する前にベストエフォートのキャンセルを 1 回行います。キャンセルは、まだ実行が始まっていないリクエストにのみ効果があります。パートナー側ですでに実行中の生成は、誰が収集するかに関わらず完了し、課金されます。呼び出し元より長く存続すべきリクエストには 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 の推定値です。これはヒントであり制約ではなく、キューの後方にあるリクエストはすでに実行中のものよりも長く待つよう通知されます。より速くポーリングしても早く何かが分かるわけではなく、自身のレート制限の許容量を消費するだけです。
成功せずに完了したリクエストは COMPLETED で、error_type を持ち、結果の読み取りが 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 に課金したタイミングで発生します。キューでの待機に費やした時間は課金されません。
  • 送信ごとに 1 つの Idempotency-Key。 SDK は submit 呼び出しごとに新しいキーを生成するため、同じ入力に対する意図的な 2 回の送信は 2 つのリクエストになります。同じキーでの同じ呼び出しの再試行は、2 回目の実行をキューに入れません。オリジナルのハンドルを Idempotent-Replayed: true とともに返します。レスポンスの消失によって request_id を失う可能性がある場合は、独自のキーを渡してください。Headers を参照してください。
  • 結果は失効します。 完了したリクエストは、完了後 24 時間保持されます。その後、ステータスと結果の読み取りは 410 を返し、結果は失われます。速やかに収集し、出力が持つアセット URL をダウンロードしてください。
  • ポーリングもリクエストです。 ステータスと結果の読み取りも、呼び出し元ごとのリクエストレートにカウントされます。固定の短い間隔でポーリングするのではなく、Retry-After に従ってください。

エラー

すべてのエラーレスポンスには X-Comfy-Request-Id が含まれる。サポートに連絡する際はこれを伝えること。

Next

クイックスタート

同じモデルに対する同期呼び出しを、ゼロから画像生成まで。

モデル

各モデルのページには、そのモデルとボディに対応するキュー用スニペットがあります。

ヘッダー

認証、冪等性、リクエスト ID、エラーバケット、リトライのペーシング。

API リファレンス

4 つのキュールートを、フィールドごとに解説します。