--- title: "Comfy Router API リファレンス" description: "Comfy API 契約から生成済みの、Comfy Router のすべてのエンドポイント、パラメータ、レスポンスボディ、エラーバケット。" sidebarTitle: "API リファレンス" translationSourceHash: 7bdc66a2 translationFrom: development/comfy-router/reference.mdx translationBlockHashes: "_intro": 3f6e5d23 "Endpoints": 222fd740 "Error buckets": 02a09cb4 "Response headers": 403c8bf5 "Pre-flight cost estimates": 862a49f8 "Result assets": 65fc939b "Per-model input and output schemas": 61c6bde8 "Schemas": 0c65163b --- {/* 生成済みファイル: 手動で編集しないでください。 gen_router_reference.py によって Comfy API コントラクトから生成されています。 コントラクトを編集して再生成してください。ここでの編集は次回の実行で上書きされ、 それまでの間はドリフトゲートによって拒否されます。 */}
モデル ID でアドレス指定される Comfy Router の正規ルート。 ベース URL: `https://api.comfy.org` 以下のすべてのエンドポイントは認証が必要です。`X-API-Key: ` または `Authorization: Bearer ` を送信してください。 Comfy API キーは Bearer トークンとして送信することもできます。両方の認証ヘッダーが指定された場合、`X-API-Key` が優先されます。キーと JWT の違いについては[認証ヘッダー](/ja/development/comfy-router/headers#リクエストヘッダー)を、アクセス要件については[クイックスタート](/ja/development/comfy-router/quickstart)を参照してください。 ## エンドポイント ### `GET /v2/models` **Comfy Router が実行できるモデルを一覧表示します。** 利用可能なモデル ID と課金情報を一覧表示します。`has_more` が true の間は `next_cursor` を使用します。 **パラメータ** 不透明なページネーションカーソル。 Type: [`RouterPageCursor`](#routerpagecursor) -- `next_cursor` として返される不透明なカーソル、1〜512 文字 1 ページで返すモデル数。 最大 100、デフォルト: 20 呼び出し元が以前の `200` から保持している `ETag`。 **レスポンス** OK - モデルカタログの 1 ページ。 Body: [`RouterModelListResponse`](#routermodellistresponse) -- ヘッダー: `X-Comfy-Request-Id`、`ETag`、`Cache-Control` Not Modified - 呼び出し元が `If-None-Match` で送信した `ETag` 以降、ページは変更されていません。 ヘッダー: `X-Comfy-Request-Id`、`ETag`、`Cache-Control` 無効なリクエストです。エラータイプとリクエストボディを確認してください。 Body: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` 認証情報が不足しているか、無効です。 Body: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` この呼び出し元またはモデルに対して、このリクエストは許可されていません。 Body: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` Router は一時的に利用できません。バックオフして再試行してください。 Body: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` ### `GET /v2/models/{provider}/{model}` **正規のモデル ID でパートナーモデル1件のカタログエントリを取得します。** カタログ全体を一覧表示せずに、1つのモデルの詳細を読み取ります。 **パラメータ** 正規の `{provider}/{model}` モデル ID のプロバイダー部分。 型: [`RouterProviderSegment`](#routerprovidersegment)。英数字のスラッグ(例: `anthropic`)、最大64文字 正規の `{provider}/{model}` モデル ID のモデル部分。 型: [`RouterModelSegment`](#routermodelsegment)。英数字のスラッグ(例: `claude-opus-4-6`)、最大128文字 呼び出し元が以前の `200` から保持している `ETag`。 **レスポンス** OK: モデルのカタログエントリ。 ボディ: [`RouterModelDetail`](#routermodeldetail)。ヘッダー: `X-Comfy-Request-Id`、`ETag`、`Cache-Control` Not Modified: 呼び出し元が `If-None-Match` で送信した `ETag` 以降、エントリは変更されていません。 ヘッダー: `X-Comfy-Request-Id`、`ETag`、`Cache-Control` 認証情報が不足しているか無効です。 ボディ: [`RouterErrorResponse`](#routererrorresponse)。ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` この呼び出し元またはモデルでは、このリクエストは許可されていません。 ボディ: [`RouterErrorResponse`](#routererrorresponse)。ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` モデル ID が見つかりませんでした。 ボディ: [`RouterErrorResponse`](#routererrorresponse)。ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` Router は一時的に利用できません。バックオフして再試行してください。 ボディ: [`RouterErrorResponse`](#routererrorresponse)。ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` ### `POST /v2/models/{provider}/{model}` **正規のモデル ID でパートナーモデルを同期的に実行します。** モデルを実行し、完了した結果を同じレスポンスで受け取ります。 **パラメータ** 正規の `{provider}/{model}` モデル ID のプロバイダー部分。 型: [`RouterProviderSegment`](#routerprovidersegment)、英数字のスラッグ(例: `anthropic`)、最大 64 文字 正規の `{provider}/{model}` モデル ID のモデル部分。 型: [`RouterModelSegment`](#routermodelsegment)、英数字のスラッグ(例: `claude-opus-4-6`)、最大 128 文字 1 つの論理的な呼び出しの再試行を安全にする、呼び出し側が生成するキー。 1〜255 文字 このモデルを現在のデフォルトの代わりに配信する代替プロバイダーを選択します。代替プロバイダーは `fal`、`wavespeed`、`runware`、`higgsfield` で、`GET /v2/models/{provider}/{model}` は、あるモデルがそれらのどれをサポートしているかを報告します。拒否は固定の順序で判定され、先の判定は、後の判定に該当するかどうかに関係なく応答します。認識されない値(登録されたプロバイダーでさえないもの)は `400` で拒否されます。次に、ボディがマルチパート操作(編集)を選択しているリクエストでの代替プロバイダーは、`detail` が "this request's `image` selects the edit operation" で始まる `409` で拒否されますが、それはそのプロバイダーのこのモデル用のトランスレーターがその操作を提供できない場合に限られます。トランスレーターがメディアを扱えるレッグは通常どおり処理されます。次に、bring-your-own-key 認証情報が解決されたリクエストでは、代替プロバイダーはどれでも `detail` が `this request resolved a BYOK credential` で始まる `409` で拒否されます(そのレスポンスを参照)。そのプロバイダーがこのモデルを提供するかどうかは関係ありません。次に、指定されたプロバイダー自身のゲートがあり、そのプロバイダーがあなたに対して有効になっていない場合は `error_type: not_enabled` を伴う `403` で、ゲートを評価できない場合は `error_type: service_unavailable` を伴う `503` で拒否します。そしてこれら 4 つすべてを通過した後にのみ、このモデル用のレッグを持たない実在のプロバイダーが `error_type: invalid_input` を伴う `400` で拒否されます。これは認識されない値と同じ応答です。`fallback_provider` は、bring-your-own-key リクエスト、ボディがマルチパート操作を選択しているリクエスト、および `strict_mode=true` の下では、拒否されるのではなく何の効果も持ちません。 `model_provider` と併用した場合にのみ意味を持ちます。 デフォルト: False 最初の試行が Router または試行したプロバイダーに起因する理由で失敗したときに、Router がこの呼び出しをモデルの他の登録済みプロバイダーに対して再試行するかどうかを制御します。省略した場合、または `false` 以外の値はフォールバックを有効のままにします。`false` は無効にします。フォールバックが成功したレスポンスには `X-Comfy-Router-Fallback-Provider` が付与されます。bring-your-own-key 認証情報が解決されたリクエストでは、このパラメータの値に関係なくフォールバックは利用できません。試行は単に行われず、最初の失敗がそのまま返ります。これは拒否ではなく不作用であり、ここから `409` が発生することはありません。同じ理由で、ボディがマルチパート操作を選択しているリクエストおよび `strict_mode=true` の下でも同様です。それぞれが呼び出しを 1 つのプロバイダーに結び付けるため、別のプロバイダーに対して忠実に再現することはできず、フォールバックは拒否されるのではなく単にスキップされます。その `409` で拒否されるのは明示的な `model_provider` だけであり、この無条件のスキップとは異なり、そのマルチパートの `409` はトランスレーターがその操作を提供できないレッグにのみ適用されます。 このモデルの入力スキーマが宣言していないトップレベルのリクエストボディフィールドを、受け入れるのではなく拒否するようにオプトインします。ネストされたフィールドはチェックされず、宣言されていないフィールドを許可するスキーマを持つモデルや、作成済みスキーマを持たないモデルの場合は何も拒否されません。また、`strict_mode=true` で送信されたキュー中の送信でも拒否されません。 デフォルト: False **リクエストボディ** `application/json` -- [`RouterModelInput`](#routermodelinput)(必須) パートナーモデルのネイティブ JSON 入力です。`model_provider` がない場合、リクエストはモデルのデフォルトプロバイダーでネイティブディスパッチを実行し、このボディはモデル自身のネイティブスキーマであって、変更されずに転送されます(そこでは `strict_mode` は意味を持たず、何も変わりません)。`model_provider` が代替プロバイダーを選択し、`strict_mode=false`(デフォルト)の場合、ボディは送信前にそのプロバイダーの実際のスキーマに変換されます。正確に表現できないネイティブフィールドは削除され、レスポンスの `X-Comfy-Router-Dropped-Params` ヘッダーで開示されます。暗黙に削除されることはありません。`model_provider` が代替プロバイダーを選択し、`strict_mode=true` の場合、変換は実行されません。ボディはすでにその代替プロバイダー自身の実際のスキーマである必要があり(このモデルのネイティブスキーマではありません。`strict_mode` を参照)、変更されずに転送されます。ボディ自体のフィールドも、複数の操作をサポートするモデルで Router が実行する操作を選択します。編集可能な画像モデルの場合、入力画像を含めると、テキストから画像への操作から画像から画像へ(編集)の操作に切り替わり、それは独自のレートで課金される場合があります。Seedance ビデオモデルの場合、`content[].role` が操作を選択します(最初のフレームの画像は画像から動画へ、参照画像またはクリップは参照から動画を選択します)。ネイティブディスパッチでは、Seedance の課金は役割ではなく `content` 内のメディア種別に従います。ビデオ入力が少しでもあるリクエストは動画から動画へとして課金され、そうでなければ画像があるものは画像から動画へとして、それもなければテキストから動画へとして課金されます。ただし、`draft_task` 項目からの最終レンダーは、それがレンダリングする Draft の操作として課金されます。テキストから動画へと画像から動画へで同じレートを請求するモデルもあります。`model_provider` が代替プロバイダーを選択している場合、条件付きの各操作はそのプロバイダー独自のレートで課金される場合があります。 **レスポンス** OK。`model_provider` を指定しない場合、または `model_provider` を指定して `strict_mode=false`(デフォルト。可能な場合はこのモデルのネイティブな契約に変換して返し、変換に失敗した場合は代替プロバイダー自身の生のレスポンスにフォールバックします。ログに記録され、暗黙に処理されることはありません)の場合、形状はこのモデル自身のネイティブな出力です。`strict_mode=true` の場合は、代替プロバイダーのレスポンスがそのまま返されます。パートナーが生成結果をバイト列として直接返すモデルでは、ボディは `application/json` ではなくパートナー自身の `Content-Type` を持つそのバイト列になります。レスポンスの `Content-Type` で分岐し、JSON ドキュメントであると仮定しないでください。 Body: [`RouterModelOutput`](#routermodeloutput) または生のバイト列(`*/*`) -- Headers: `X-Comfy-Request-Id`, `X-Content-Type-Options`, `X-Comfy-Router-Fallback-Provider`, `X-Comfy-Router-Provider`, `X-Comfy-Router-Dropped-Params`, `X-Comfy-Credits-Used`, `Idempotent-Replayed`, `X-Committed-Spend-Limit`, `X-Committed-Spend-Current`, `X-Committed-Spend-Remaining` 無効なリクエストです。エラータイプとリクエストボディを確認してください。 Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `X-Comfy-Upstream-Status`, `X-Comfy-Upstream-Detail`, `X-Comfy-Refusal-Subject`, `X-Comfy-Credits-Used`, `Idempotent-Replayed` 認証情報が不足しているか、無効です。 Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` Router のリクエストレベルの失敗です。リクエストはモデルに到達しなかったか、モデル自身が報告しなかった理由で失敗しました。 Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` この呼び出し元またはモデルに対して、リクエストは許可されていません。 Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` モデル ID が見つかりませんでした。 Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` `X-Comfy-Error-Type` を確認してください。`concurrency_limit_exceeded` はオリジナルの呼び出しがまだ実行中であることを意味するため、`Retry-After` を待って同じキーを再利用します。`invalid_input` の場合は新しいキーが必要です。このルートにおける 2 つの `invalid_input` 競合はキーとはまったく無関係で、新しいキーでもどちらも解消されません。1 つは、リクエストボディがマルチパート操作(編集)を選択しているのに `model_provider` が代替プロバイダーを指定しており、そのプロバイダーのこのモデル用トランスレーターが対応できない場合で、`detail` は "this request's `image` selects the edit operation" で始まります。もう 1 つはその後チェックされるもので、リクエストがすでにパス内のプロバイダーに対する BYOK 認証情報を解決済みの場合で、`detail` は `this request resolved a BYOK credential` で始まります。`model_provider` を外すか、BYOK 認証情報なしで(マルチパートの場合は編集もなしで)リクエストを送信してください。 Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Retry-After`(`concurrency_limit_exceeded` の場合) リクエストボディが大きすぎます。 Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` リクエストの内容がモデルのスキーマに照らして拒否されました。 Body: [`RouterValidationErrorResponse`](#routervalidationerrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Idempotent-Replayed` `X-Comfy-Error-Type` を確認してください。`concurrency_limit_exceeded` は実行中の呼び出しを減らすことを意味し、`rate_limited` は許可ウィンドウを待つことを意味します。 Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `X-Committed-Spend-Limit`, `X-Committed-Spend-Current`, `X-Committed-Spend-Remaining`, `X-Model-Concurrency-Limit`, `X-Model-Concurrency-Current`, `X-Model-Concurrency-Remaining` プロバイダー自身のレスポンスを結果に変換できませんでした(`provider_error`)。 Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `X-Comfy-Upstream-Status` Router は一時的に利用できません。バックオフしながらリトライしてください。 Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Retry-After`(容量拒否時のみ) リクエストがデッドラインを超過しました。リトライする前にエラータイプを確認してください。 Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `X-Comfy-Upstream-Status`, `Retry-After` ### `POST /v2/models/{provider}/{model}/estimate` **モデル呼び出しを実行する前に、実行せずに価格を見積もります。** このボディをこのモデルで実行した場合のコストを、米ドルで事前に見積もって返します。価格は、実行時の請求に使われるのと同じレートカードから算出されます。これは見積もりであり、最終的な請求額ではありません。実際に支払うのは、ワークスペースの使用状況および請求記録に確定した請求額です。ボディはまずモデルの入力スキーマに対して検証されます。これはデフォルトの実行(`strict_mode` なし、`reject_unknown_fields` なし)が検証するのと同じ方法です。そのため、モデルのスキーマに適合しないボディは、実行時と同じ `422` になります。プロバイダーには何も送信されず、課金も発生しません。この回答は価格の固定ではありません。`pricing_as_of` の時点で有効なレートで算出され、実行は評価時点で有効なレートで請求されます。機能のロールアウト中は、このルートは `403` を返し、`error_type: not_enabled` となります。 **パラメータ** 正規の `{provider}/{model}` モデル ID の小文字のプロバイダーセグメント。実行対象のモデルを持つパートナーです。 型: [`RouterProviderSegment`](#routerprovidersegment):英数字スラッグ(例: `anthropic`)、最大 64 文字 正規の `{provider}/{model}` モデル ID の小文字のモデルセグメント。そのプロバイダー内で実行するモデルです。 型: [`RouterModelSegment`](#routermodelsegment):英数字スラッグ(例: `claude-opus-4-6`)、最大 128 文字 このモデルを提供する代替プロバイダーを、現在のデフォルトの代わりに選択します。 **リクエストボディ** `application/json`:[`RouterModelInput`](#routermodelinput)(必須) パートナーモデルのネイティブ JSON 入力で、このモデルに対して同期ルートが受け付けるボディと同一です。デフォルトの実行が検証するのと同じく、モデル自身の入力スキーマに対して検証され(このルートは `strict_mode` も `reject_unknown_fields` も受け付けません)、その独自のフィールド(出力数、入力画像が選択する操作)が、何の価格を算出するかを決めます。 **レスポンス** 見積もりです。 ボディ: [`RouterCostEstimate`](#routercostestimate)、ヘッダー: `X-Comfy-Request-Id` 無効なリクエストです。エラータイプとリクエストボディを確認してください。 ボディ: [`RouterErrorResponse`](#routererrorresponse)、ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` 認証情報が不足しているか、無効です。 ボディ: [`RouterErrorResponse`](#routererrorresponse)、ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` この呼び出し元またはモデルに対して、リクエストは許可されていません。 ボディ: [`RouterErrorResponse`](#routererrorresponse)、ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` モデル ID が見つかりませんでした。 ボディ: [`RouterErrorResponse`](#routererrorresponse)、ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` リクエストボディが大きすぎます。 ボディ: [`RouterErrorResponse`](#routererrorresponse)、ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` 見積もりのボディがモデルのスキーマに対して拒否されたか、パスとは異なるモデルが指定されました。 ボディ: [`RouterValidationErrorResponse`](#routervalidationerrorresponse)、ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` Router は一時的に利用できません。バックオフを伴って再試行してください。 ボディ: [`RouterErrorResponse`](#routererrorresponse)、ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id`、`Retry-After`(容量不足による拒否のみ) ### `GET /v2/models/{provider}/{model}/openapi.json` **1つのパートナーモデルの入力スキーマと出力スキーマを OpenAPI ドキュメントとして読み取ります。** 1つのモデルの入力スキーマと出力スキーマを、単体の OpenAPI ドキュメントとして読み取ります。 **パラメータ** 正規の `{provider}/{model}` モデル ID のうちプロバイダー部分。 Type: [`RouterProviderSegment`](#routerprovidersegment) -- 英数字のスラッグ(例: `anthropic`)、最大 64 文字 正規の `{provider}/{model}` モデル ID のうちモデル部分。 Type: [`RouterModelSegment`](#routermodelsegment) -- 英数字のスラッグ(例: `claude-opus-4-6`)、最大 128 文字 呼び出し元が以前の `200` から保持している `ETag`。 **レスポンス** OK - モデルの入力スキーマと出力スキーマを、単体の OpenAPI ドキュメントとして返します。 Body: [`RouterModelInputSchemaDocument`](#routermodelinputschemadocument) -- ヘッダー: `X-Comfy-Request-Id`、`ETag`、`Cache-Control` Not Modified - 呼び出し元が `If-None-Match` で送信した `ETag` 以降、ドキュメントは変更されていません。 ヘッダー: `X-Comfy-Request-Id`、`ETag`、`Cache-Control` 認証情報が不足しているか無効です。 Body: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` この呼び出し元またはモデルに対して、このリクエストは許可されていません。 Body: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` モデル ID が見つかりませんでした。 Body: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` Router がリクエストを完了できませんでした。 Body: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` Router は一時的に利用できません。バックオフして再試行してください。 Body: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` ### `POST /v2/models/{provider}/{model}/requests` **パートナーモデルの実行をキューに送信し、すぐに戻ります。** Comfy Routerのキュー配信モードです。リクエストボディは、`POST /v2/models/{provider}/{model}` がこのモデルに対して受け付けるものと同じパートナー固有のJSON入力です(ボディの形状は1つ、モデルごとのスキーマは1つ、配信モードは2つ)。ただし、このルートは結果のために接続を保持しません。実行を受け付けてハンドル付きで `201` を返し、呼び出し元は後で以下の3つの読み取りを通じて結果を取得します。 **パラメータ** 正規の `{provider}/{model}` モデルIDの小文字のプロバイダーセグメント。実行するモデルを持つパートナーです。 型: [`RouterProviderSegment`](#routerprovidersegment) -- 英数字スラッグ、例: `anthropic`、最大64文字 正規の `{provider}/{model}` モデルIDの小文字のモデルセグメント。そのプロバイダー内で実行するモデルです。 型: [`RouterModelSegment`](#routermodelsegment) -- 英数字スラッグ、例: `claude-opus-4-6`、最大128文字 現在のデフォルトの代わりに、このモデルを提供する代替プロバイダーを選択します。 `model_provider` と併用した場合にのみ意味があります。 デフォルト: False 呼び出し元が生成するキーで、1つの論理的な呼び出しの再試行を安全にします。 1~255文字 このモデルの入力スキーマが宣言していないトップレベルのリクエストボディフィールドを、受け入れるのではなく拒否することを選択します。ネストされたフィールドはチェックされません。スキーマが未宣言のフィールドを許可しているモデル、または作成済みスキーマを持たないモデルでは何も拒否されません。また、`strict_mode=true` で送信されたキューへの送信でも何も拒否されません。 デフォルト: False **リクエストボディ** `application/json` -- [`RouterModelInput`](#routermodelinput)(必須) パートナーモデル固有のJSON入力で、同期ルートがこのモデルに対して受け付けるボディと同一です。また、実行する操作を選択し、同じ方法で課金されます。ボディ自身のフィールドが、複数の操作をサポートするモデルでRouterが実行する操作を選択します(入力画像は編集可能な画像モデルを画像から画像へに切り替え、それには独自のレートで課金される場合があります。Seedanceの最初のフレーム画像は画像から動画へを選択し、参照画像またはクリップは参照から動画を選択します)。ネイティブディスパッチでは、Seedanceリクエストはロールではなく `content` 内のメディア種別で課金されます。つまり、ビデオ入力があれば動画から動画へとして課金され、そうでなければ画像があれば画像から動画へ、それもなければテキストから動画へとして課金されます。ただし、`draft_task` アイテムからの最終レンダーは、それがレンダーするDraftの操作として課金されます。一部のモデルはテキストから動画へと画像から動画へに同じレートを課金します。`model_provider` で代替プロバイダーを選択している場合、条件付きの各操作はそのプロバイダー独自のレートで課金される場合があります。同じプロバイダー選択の契約がディスパッチ時にも適用されます。`model_provider` がない場合、または `model_provider` があり `strict_mode=false`(デフォルト)の場合、ボディはモデル固有のドキュメントであり、実行が受け付けられる前にモデル自身の入力スキーマに対して検証されます。そのため、モデルが拒否するボディはここで `422` となり、数分後に失敗するキュー中のリクエストにはなりません。非strictの代替プロバイダーのボディはさらに、ディスパッチ時にそのプロバイダーの実際のスキーマへ変換されます。`strict_mode=true` の場合、ボディはすでに代替プロバイダー自身のスキーマである必要があり、変更されずに転送されます。ネイティブスキーマの検証はスキップされます。これは同期ルートとまったく同じです(`model_provider` と `strict_mode` を参照)。 **レスポンス** Created - 実行がキューに受け付けられました。 ボディ: [`RouterQueueSubmitResponse`](#routerqueuesubmitresponse) -- ヘッダー: `X-Comfy-Request-Id`、`Idempotent-Replayed` 認証情報が不足しているか無効です。 ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` 無効なリクエストです。エラータイプとリクエストボディを確認してください。 ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` リクエストボディが大きすぎます。 ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` Routerのリクエストレベルの失敗です。リクエストがモデルに到達しなかったか、モデル自体が報告しなかった理由で失敗しました。 ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` この呼び出し元またはモデルではリクエストが許可されていません。パートナーが生成結果を直接バイトとして返すモデルはまだキューに投入できず、`not_enabled` で拒否されます。代わりに同期ルートで実行してください。 ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` モデルIDが見つかりませんでした。 ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` `X-Comfy-Error-Type` を確認してください: `concurrency_limit_exceeded` はオリジナルの呼び出しがまだ実行中であることを意味するため、`Retry-After` を待って同じキーを再利用してください。`invalid_input` の場合は新しいキーが必要です。このルート上の 2 つの `invalid_input` 競合はキーとはまったく関係がなく、新しいキーでもどちらも解消されません: 別のプロバイダーを指定する `model_provider` は、リクエスト本文が、そのプロバイダーのこのモデル用トランスレーターが対応できないマルチパート操作(編集)を選択している場合に拒否され、その `detail` は "this request's `image` selects the edit operation" で始まります。さらに、その後チェックされる条件として、リクエストがパス内のプロバイダーに対して BYOK 認証情報をすでに解決している場合があり、その `detail` は `this request resolved a BYOK credential` で始まります。`model_provider` を削除するか、BYOK 認証情報なしで、かつ(マルチパートの場合)編集なしでリクエストを送信してください。 本文: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Retry-After`(`concurrency_limit_exceeded` の場合) リクエストの内容はモデルのスキーマに照らして拒否されました。 本文: [`RouterValidationErrorResponse`](#routervalidationerrorresponse) -- ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Idempotent-Replayed` `X-Comfy-Error-Type` を確認してください。`queue_backlog_full` は、保持できる未完了のキュー済みリクエスト数がすでに上限に達していることを意味するため、いずれかが完了してから再送信してください。`rate_limited` は、許容量のウィンドウを待つことを意味します。 本文: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` Router は一時的に利用できません。バックオフを伴って再試行してください。 本文: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Retry-After`(容量拒否の場合のみ) ### `GET /v2/models/{provider}/{model}/requests/{request_id}` **送信済みの 1 件のリクエストの結果を取得します。** 結果取得エンドポイントです。正常に完了したリクエストに対しては、パートナーモデル自身のネイティブ出力を返します。これは、同じモデルと同じ入力に対して同期ルートの `200` が返す内容とバイト単位で同一です。つまり 2 つの配信モードは同じ結果形状を生成するため、呼び出し側は別のパーサーを用意することなく両者を切り替えられます。 **パラメータ** 正規の `{provider}/{model}` モデル ID のうち小文字のプロバイダーセグメント。モデルを実行するパートナーです。 型: [`RouterProviderSegment`](#routerprovidersegment) -- 英数字のスラッグ(例: `anthropic`)、最大 64 文字 正規の `{provider}/{model}` モデル ID のうち小文字のモデルセグメント。そのプロバイダー内で実行するモデルです。 型: [`RouterModelSegment`](#routermodelsegment) -- 英数字のスラッグ(例: `claude-opus-4-6`)、最大 128 文字 対象とするキュー中のリクエスト。送信時にレスポンス本文で返された `request_id` です。 型: [`RouterQueueRequestId`](#routerqueuerequestid) -- `pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`、uuid、最大 36 文字 **レスポンス** OK -- 結果を生成したリクエスト(正常に完了したリクエスト、または課金の記録と保存済みの結果の両方を持つターミナル状態のリクエスト)に対して保存された結果を、パートナー自身のメディアタイプでそのまま返します。同期ルートの `200` が返す場合とまったく同じであり、送信時に受け入れたのと同じプロバイダー選択の契約に従います。`model_provider` を指定しない場合、または `model_provider` と `strict_mode=false`(デフォルト。可能な場合はこのモデルのネイティブな契約に変換し、変換に失敗した場合は代替プロバイダー自身の生のレスポンスにフォールバックします。この処理はログに記録され、決して黙って行われることはありません)を指定した場合、形状はこのモデル自身のネイティブ出力です。`strict_mode=true` の場合は、代替プロバイダーのレスポンスがそのまま返されます。パートナーが生成結果をバイト列として直接返すモデルでは、本文は `application/json` ではなくパートナー自身の `Content-Type` を持つそのバイト列です。レスポンスの `Content-Type` で分岐し、JSON ドキュメントであると仮定しないでください。 本文: [`RouterModelOutput`](#routermodeloutput) または生のバイト列 (`*/*`) -- ヘッダー: `X-Comfy-Request-Id`、`X-Content-Type-Options`、`X-Comfy-Credits-Used` 受理済み -- リクエストはまだ完了していません。 本文: [`RouterQueueStatusResponse`](#routerqueuestatusresponse) -- ヘッダー: `X-Comfy-Request-Id`、`Retry-After` 認証情報が不足しているか無効です。 本文: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` この呼び出し元またはモデルに対して、リクエストは許可されていません。 本文: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` モデル ID が見つかりませんでした。 本文: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` Router のリクエストレベルの失敗。リクエストがモデルに到達しなかったか、モデル自身が報告しなかった理由で失敗しました。 本文: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` Router は一時的に利用できません。バックオフを伴って再試行してください。 本文: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` リクエストが操作と競合する状態にあります。エラータイプを確認してください。 本文: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` リクエストが期限を超過しました。再試行する前にエラータイプを確認してください。 本文: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` Router のリクエストレベルの失敗。リクエストがモデルに到達しなかったか、モデル自身が報告しなかった理由で失敗しました。 本文: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` ### `PUT /v2/models/{provider}/{model}/requests/{request_id}/cancel` **送信済みの1件のリクエストのキャンセルを要求します。** まだ完了していないリクエストの停止を Comfy に要求します。これは要求であり保証ではなく、`202` はまさにそのことを示します。`CANCELLATION_REQUESTED` は要求が受け付けられたことを意味し、実行が停止したことを意味するものではありません。パートナー側で既に処理中の実行はそのまま完了する可能性があり(パートナーでの生成は、誰が結果を受け取ったかに関わらず、完了すれば課金されます)、そのため実際に何が起きたかを知る必要がある呼び出し元は、後でステータスエンドポイントを読み取ります。そこでは、有効になったキャンセルは、他のすべてのターミナルな結果と同様に `error_type` を持つ `COMPLETED` として示されます。 **パラメータ** 正規の `{provider}/{model}` モデル ID の小文字のプロバイダーセグメント。実行対象のモデルを持つパートナーです。 型: [`RouterProviderSegment`](#routerprovidersegment):英数字のスラッグ(例: `anthropic`)、最大 64 文字 正規の `{provider}/{model}` モデル ID の小文字のモデルセグメント。そのプロバイダー内で実行するモデルです。 型: [`RouterModelSegment`](#routermodelsegment):英数字のスラッグ(例: `claude-opus-4-6`)、最大 128 文字 対象となるキュー中のリクエスト。送信時にレスポンスボディで返された `request_id` です。 型: [`RouterQueueRequestId`](#routerqueuerequestid):`pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`、uuid、最大 36 文字 **レスポンス** 受理済み。`CANCELLATION_REQUESTED`。 ボディ: [`RouterQueueCancelResponse`](#routerqueuecancelresponse)、ヘッダー: `X-Comfy-Request-Id` 競合。`ALREADY_COMPLETED`。 ボディ: [`RouterQueueCancelResponse`](#routerqueuecancelresponse)、ヘッダー: `X-Comfy-Request-Id` 無効なリクエストです。エラータイプとリクエストボディを確認してください。 ボディ: [`RouterErrorResponse`](#routererrorresponse)、ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` 認証情報が不足しているか無効です。 ボディ: [`RouterErrorResponse`](#routererrorresponse)、ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` この呼び出し元またはモデルでは、このリクエストは許可されていません。 ボディ: [`RouterErrorResponse`](#routererrorresponse)、ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` モデル ID が見つかりませんでした。 ボディ: [`RouterErrorResponse`](#routererrorresponse)、ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` Router は一時的に利用できません。バックオフを伴って再試行してください。 ボディ: [`RouterErrorResponse`](#routererrorresponse)、ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` Router のリクエストレベルの失敗。リクエストがモデルに到達しなかったか、モデル自体が報告しなかった理由で失敗しました。 ボディ: [`RouterErrorResponse`](#routererrorresponse)、ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` ### `GET /v2/models/{provider}/{model}/requests/{request_id}/status` **送信済みリクエスト1件のキュー状態を読み取ります。** ポーリングエンドポイントです。リクエストの現在の状態を返し、結果は決して返しません。そのためクライアントは、ポーリングのたびに出力を転送することなく、長時間の生成を監視できます。結果は、この応答が `COMPLETED` を示したときに、以下の読み取りから一度だけ取得します。 **パラメータ** 正規の `{provider}/{model}` モデル ID の小文字プロバイダーセグメント。実行対象のモデルを持つパートナーです。 型: [`RouterProviderSegment`](#routerprovidersegment) -- 英数字スラッグ(例: `anthropic`)、最大64文字 正規の `{provider}/{model}` モデル ID の小文字モデルセグメント。そのプロバイダー内で実行するモデルです。 型: [`RouterModelSegment`](#routermodelsegment) -- 英数字スラッグ(例: `claude-opus-4-6`)、最大128文字 対象とするキュー中のリクエスト。送信時にレスポンスボディで返された `request_id` です。 型: [`RouterQueueRequestId`](#routerqueuerequestid) -- `pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`、uuid、最大36文字 **レスポンス** OK - リクエストの現在のキュー状態です。 ボディ: [`RouterQueueStatusResponse`](#routerqueuestatusresponse) -- ヘッダー: `X-Comfy-Request-Id`、`Retry-After`、`X-Comfy-Estimated-Duration-Seconds`、`X-Comfy-Estimated-Duration-P90-Seconds`、`X-Comfy-Estimate-Source` 認証情報が不足しているか無効です。 ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` この呼び出し元またはモデルに対して、そのリクエストは許可されていません。 ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` モデル ID が見つかりませんでした。 ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` Router のリクエストレベルの失敗。リクエストがモデルに到達しなかったか、モデル自体が報告しなかった理由で失敗しました。 ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` Router が一時的に利用できません。バックオフを伴って再試行してください。 ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` Router のリクエストレベルの失敗。リクエストがモデルに到達しなかったか、モデル自体が報告しなかった理由で失敗しました。 ボディ: [`RouterErrorResponse`](#routererrorresponse) -- ヘッダー: `X-Comfy-Error-Type`、`X-Comfy-Request-Id` ここでの説明は簡潔です。モデルの選択、検証、再試行、課金については [Comfy Router API の使用](/ja/development/comfy-router/api) を、ヘッダーの動作については [ヘッダー](/ja/development/comfy-router/headers) を参照してください。 ## エラーバケット Router の機械可読なエラーカテゴリで、`X-Comfy-Error-Type` ヘッダーでも送信されます。 ### リクエストレベルバケット Router が受け付けたものの、完了できなかったリクエストに対して発生します。 | `error_type` | 意味 | | --- | --- | | `invalid_input` | リクエストがモデルに到達する前に拒否されました。ボディの形式が不正、ページネーションカーソルが不正または期限切れ、モデル自身のスキーマが受け付けない入力、またはこのリクエストに使用できない `Idempotency-Key`(別のリクエストで既に使用済み。方法、パスとクエリ、またはボディが異なる。もしくは、レスポンスを再生できない呼び出しによって既に消費済み)です。 | | `content_policy_violation` | プロバイダーがコンテンツポリシーを理由にリクエストを拒否しました。 | | `provider_error` | パートナープロバイダーが自身の障害を報告したか、Router が結果として解釈できないレスポンスを返しました。 | | `provider_timeout` | パートナープロバイダーが期限までに応答しませんでした。 | | `insufficient_credits` | 呼び出し元のワークスペースに、モデルを実行するための十分なクレジットがありません。 | | `model_not_found` | `{provider}/{model}` という ID が、Router で実行できるモデルを指していません。不明なプロバイダー、未登録の ID、カタログが提供終了日を過ぎて廃止したモデル、またはプロバイダーが現在 Comfy 向けに提供していないカタログ登録済みの ID です。 | ### トランスポートレベルバケット モデルへの呼び出しの前またはその周辺で、Router 自身によって発生します。 | `error_type` | 意味 | | --- | --- | | `unauthorized` | リクエストに利用可能な認証情報が含まれていませんでした。 | | `forbidden` | 認証情報は有効ですが、このモデルまたはこの操作に対する権限がありません。 | | `concurrency_limit_exceeded` | ワークスペースはすでに許可された数の呼び出しを実行中です。いずれかが完了したら再試行してください。 | | `client_disconnected` | 呼び出し側が、Router が結果を返す前に接続を閉じました。 | | `internal_error` | Router 自体が失敗しました。 | | `deadline_exceeded` | 回答が到着する前に、Comfy が自身の設定済みの上限で接続の維持を停止しました。 | | `not_enabled` | この呼び出し側に対して Comfy Router がまだ有効になっていません。 | | `service_unavailable` | Comfy Router が依存するサービスが一時的に利用できず、呼び出し側に問題はありません。 | | `rate_limited` | 呼び出し側がウィンドウ単位で測定される割り当てを消費し、そのウィンドウが経過するのを待つ必要があります。 | | `cancelled` | キューに入っていたリクエストが、結果を生成する前に、キャンセルルートまたはオペレーターによって取り消されました。これは終端状態であり、それ自体は課金に関する表明ではありません。 | | `queue_timeout` | キュー中のリクエストが、一度も受け入れられることなくキュータイムアウトを超えて待機し続けました。 | | `request_not_found` | `request_id` が、このモデルにおける呼び出し元のどのリクエストも指していません。 | | `queue_backlog_full` | 呼び出し元が既に実行待ちのキュー中リクエストを抱えすぎているため、この送信は拒否されました。 | | `result_expired` | リクエストは存在し完了していましたが、その結果はもう保存されていないため、収集時に返せるものがありません。 | ## レスポンスヘッダー カタログページまたはカタログエントリの鮮度ディレクティブ。 送信時: `200`, `304` 提供されるスキーマドキュメントの鮮度ディレクティブ。 送信時: `200`, `304` 提供されるボディのバイト列に対する強力なエンティティタグ。`GET /v2/models` と `GET /v2/models/{provider}/{model}` 用です。 送信時: `200`, `304` 提供されるドキュメントのバイト列に対する強力なエンティティタグ。`GET /v2/models/{provider}/{model}/openapi.json` 用です。 送信時: `200`, `304` このレスポンスがモデルを再度実行した結果ではなく、`Idempotency-Key` の記録から提供された場合に存在し、`true` になります。 同じリクエストを変更せずに再送する前に待機する秒数。 送信時: `503` このキュー中のリクエストを再度ポーリングする前に待機する秒数。 送信時: `200`, `202` 同じ `Idempotency-Key` で同じリクエストを再試行する前に待機する秒数。 送信時: `409`, `504` この実行にかかったコストを Comfy クレジットで示したもので、課金自体と同じ料金カードから算出されます。したがって呼び出し元は独自の価格表を持つ必要がありません。また、複数の課金対象呼び出しを経てプロバイダーに到達した実行では、最後の呼び出しの値ではなくそれらの合計になります。 障害を表す大まかで機械可読な分類で、Router がすべてのエラーレスポンスに設定します。 型: [`RouterErrorType`](#routererrortype) `status` が `IN_PROGRESS` のステータス読み取り時のみ、`X-Comfy-Estimated-Duration-Seconds` の隣に送信されます。その生成時間の見積もりがどこから来たのか(コスト見積もりの `source` とは別)を示し、`historical`(最近の実行で実測)または `default`(メディア種別ごとのフォールバックで、記録された最近の実行が少なすぎる間に使われます)のいずれかです。 `status` が `IN_PROGRESS` のステータス読み取り時のみ、`X-Comfy-Estimated-Duration-Seconds` の隣に送信されます。その生成時間の見積もりの 90 パーセンタイルを整数秒で示します。 `status` が `IN_PROGRESS` のステータス読み取り時のみ送信されます。プロバイダーが受け付けた後、生成の実行全体にかかる時間についての Router の見積もりを整数秒で示します(残り時間ではなく、`IN_QUEUE` で過ごした時間は決して含みません)。 コンテンツポリシーによる拒否がどの入力または出力に関するものかを、Router レベルの閉じた語彙として示します: `input`, `output`, `input_text`, `input_image`, `input_video`, `input_audio`, `output_text`, `output_image`, `output_video`, `output_audio`。 この呼び出しに対してサーバーが生成する識別子で、成功、4xx、5xx を問わず、すべての Router レスポンスに存在します。エラーレスポンスこそ、ユーザーがサポートリクエストで引用する ID を必要とするまさにその瞬間だからです。 文字列の配列を保持する、JSON エンコードされた 1 つの文字列です。カンマで分割するのではなく JSON パーサーでデコードしてください。これはワイヤー上では単一の文字列であり、カンマ区切りの OpenAPI 配列ではないためです。また、各エントリはそれ自体にカンマを含む文です。このヘッダーは、ある変換がこの呼び出しのリクエストボディを生成し、1 つ以上のネイティブフィールドを、それを処理したプロバイダー上で正確に表現できなかった場合に常に存在し、削除された各フィールドとその理由を示します。呼び出し元が `model_provider` でその変換を要求した場合(`strict_mode=false`、これがデフォルト)でも、自動の `fallback_provider` 再試行がそれを実行した場合でも同様です。 `fallback_provider` が実際にこの呼び出しを 2 つ目のプロバイダーに対して再試行し、その再試行が成功した場合にのみ存在し、プロバイダー名を示します。最終的にこの呼び出しを処理したプロバイダーであり、試行されて同様に失敗したプロバイダーではありません。 この呼び出しを処理した Router のレグのプロバイダーで、成功したすべての実行レスポンスに存在します。ネイティブ実行ではモデル自身のプロバイダー、`model_provider` が指定した代替プロバイダー、または `fallback_provider` の再試行がたどり着いたプロバイダー(その場合に限り `X-Comfy-Router-Fallback-Provider` も同じ名前を示します)です。これは Router がディスパッチしたレグであり、必ずしも出力を生成したベンダーとは限りません。ネイティブレグ内のプロキシレベルのカスケード(たとえば `vertexai` の Gemini 画像チェーン)は、どのヘッダーにも名前が現れない別のベンダーに呼び出しを渡すことがあるためです。 モデルプロバイダーがリクエストを拒否した理由を、範囲を限定してサニタイズしたもの。 この呼び出しに対するモデルプロバイダー自身の HTTP ステータス。 呼び出し元が現在、まだ実行中の呼び出しに対してコミットしている金額(米ドルのセント単位)。 呼び出し元がまだ実行中の呼び出しにコミットできるパートナー支出の上限(米ドルのセント単位)。この金額は呼び出しが受け付けられた時点で確保され、その呼び出しが完了した時点で解放されます。 上限までに残りの余裕(米ドルのセント単位)。下限は 0 です。 Router モデルのすべての成功した実行において、常に `nosniff` です。 呼び出し元が高コストに分類されたモデルに対して行っている同時呼び出し数で、この呼び出しを拒否したゲートが数えたものです。 呼び出し元が同時に保持できる、高コストに分類されたモデルへの同時呼び出しの最大数。同時呼び出し上限の 4 分の 1 で、パートナーノードの呼び出しと共有されます。 呼び出し元がまだ開始できる高コストモデルへの呼び出し数。`429` では `0` です。 ## 事前のコスト見積もり `POST /v2/models/{provider}/{model}/estimate` は、リクエストボディを実行せずにその価格を見積もります。また、キュー中の送信 (`POST /v2/models/{provider}/{model}/requests`) は、その `201` で `estimate` と同じ [`RouterCostEstimate`](#routercostestimate) を返します。どちらも、Comfy がその実行の請求に用いるレートカードから価格が決まります。どちらが返す数値も見積もりであり、最終的な請求額ではありません。ワークスペースの利用状況および請求記録にある確定額が最終です。自分のプロバイダーキーでの実行は Comfy から課金されません(後述)。見積もりの展開中は、このルートは `error_type: not_enabled` を伴う `403` を返し、送信レスポンスは `estimate` を省略します。カタログには依然として価格が含まれていません。 金額を確認する前に `source` を読んでください。数値が不足していても、決して無料という意味ではありません。 | `source` | 含まれるもの | 読み方 | | --- | --- | --- | | `exact` | `amount`、`amount_cents`、`credits` | `pricing_as_of` のレートに基づく、このボディに対する請求額に等しい見積もりです。ワークスペースの利用状況および請求記録にある確定額が最終です。 | | `estimated` | `min_amount`、`max_amount` とそれぞれの `_cents` 形式(`amount` はなし) | 請求額がプロバイダーから報告される数量に依存し、ボディがその数量の境界を定める見積もりです。請求額はその境界の間になると見込まれ、ワークスペースの利用状況および請求記録にある確定額が最終です。 | | `unknown` | `reason`(数値はなし) | 実行前に価格を示すことができませんでした。その他の `source` の値はすべて `unknown` として扱ってください。 | `unknown` の見積もりの `reason` は次のいずれかです。 - `not_quotable`: Router はこの呼び出しが実行される前に価格を算出できません。プロバイダーが後から報告する数量で課金され、ボディがその範囲を定めていないか、送信されたままの内容では価格を算出できないためです。認識できない `reason` はすべて `not_quotable` として扱ってください。 - `unpriced_model`: レートカードがこのリクエストの価格を定めていません。 - `byok`(キュー中の送信のみ): 実行が自分のプロバイダーキーを使用するため、Comfy はその実行に対して何も課金しません。 - `pricing_unavailable`(キュー中の送信のみ): リクエストを受け付けた時点でレートカードを読み取れませんでした。送信はそれでも受け入れられ、実行は通常どおり課金されます。 Router が実行前にまだ価格を算出できないモデルは、[事前見積もりのないモデル](/ja/development/comfy-router/limitations#事前見積もりのないモデル) に一覧されています。そこに一覧されていないモデルでも、特定のボディに対しては `unknown` を返すことがあるため、すべての見積もりで `source` を読んでください。 見積もりがフェイルクローズするのは、次の場合です。 - 数値を出すためにレートカードが必要で、カードが読み込まれていないか古い場合、`/estimate` は推測ではなく `503` を返します。キュー中の送信が見積もりを理由に拒否されることはありません。代わりに `reason: pricing_unavailable` を伴う `source: unknown` を返します。実行前にまったく価格を算出できない呼び出し(`not_quotable`)、または自分のプロバイダーキーでのキュー中の送信(`byok`)は、カードを読まずに応答されるため、その `200` はカードが新しいかどうかについて何も示しません。 - `/estimate` は、デフォルトの実行と同様に、モデル自身の入力スキーマに対してボディを検証します。そのため、モデルのスキーマに適合しないボディには、実行が返すのと同じ `422` が、同じ `detail[]` の形状で返ります。価格の算出もディスパッチも行われません。 - キュー中の送信の冪等な再生(`Idempotent-Replayed: true`)は `estimate` を省略します。元の見積もりは保存されないためです。 見積もりの限界。`200` の数値は、その実行が受け入れられることや、まさにその額が課金されることを約束するものではありません。 - `/estimate` は `strict_mode` や `reject_unknown_fields` を受け取らないため、モデルのネイティブな契約のみを検証します。`strict_mode=true` の実行が代替プロバイダー自身のスキーマで受け入れるボディも、ここでは `422` になることがあります。また、`reject_unknown_fields=true` の実行なら拒否するであろう、宣言されていないトップレベルフィールドも、ここでは価格が算出されます。 - `pricing_as_of` は、レートカードを取得した時刻です(カードを読まなかった場合は、見積もりに応答した時刻)。これは価格の固定ではありません。実行は、評価された時点で有効なレートで課金されます。 - `/estimate` が見積もるのは、`model_provider` が指定するレグ、またはネイティブのプロバイダーです。`fallback_provider` や `strict_mode` パラメータは受け取りません。フォールバックの再試行が別のプロバイダーに到達した同期実行は、そのプロバイダーのレートで課金され、見積もりはそのレートを示していません。実行のレスポンスにある `X-Comfy-Router-Fallback-Provider` が、それが発生したことを示します。キュー中の送信にはフォールバックがないため、その `estimate` は実行されるレグを見積もります。 - `/estimate` とキュー中の送信の `estimate` は、`model_provider` のレグにおける同じボディ、または兄弟オペレーションで実行されるボディに対して、わずかに異なるドキュメントの価格を算出することがあります。送信の `estimate` は、その実行が送るドキュメントに基づいて価格が算出されます。 - `/estimate` は常にプラットフォームの請求額を見積もります。自分のプロバイダーキーでの実行は Comfy から課金されませんが、`/estimate` はそれを検出せず、依然として数値を返します。`reason: byok` を返すのはキュー中の送信だけです。 - ドルは丸めていないセントから、最大 8 桁の小数で表示され、課金対象となる 1 セント未満の `amount` が `0` と表示されることはありません。`credits` は `round(amount × 211, 2)` で、`X-Comfy-Credits-Used` が請求額に適用するのと同じ換算です。そのため、非常に小さな非ゼロの価格では `credits` が `0` にラウンドされることがあります。それが問題になる場合は `credits` ではなく `amount` または `amount_cents` で予算を立ててください。このヘッダーは実行後の数値のままであり、残高は Comfy プラットフォーム上にあります。 ## 結果アセット モデルは、アセット URL、インラインバイト、またはその両方を返すことができます。以下のプロバイダーは、選択済みのアセットを Comfy ストレージにコピーし、その URL を置き換えます。この動作はモデルによって異なります。これを選択するリクエストヘッダーはありません。 | モデル | Comfy ストレージにコピーされるもの | Comfy ホスト URL の最大有効期間 | | --- | --- | --- | | `bfl/*` | 完了したアセット、および結果に含まれている場合はドラフトキャッシュのアセット | 24 時間 | | `byteplus/*` ビデオモデル (`seedance`、`dreamina-seedance`) | 完了したビデオ、および結果に含まれている場合はラストフレーム画像 | 24 時間 | | `minimax/*` | 完了したビデオ | 12 時間 | | `xai/*` | 生成されたすべての画像、および完了したビデオ | 24 時間 | これらの有効期間は、URL を開いたときではなく、URL が署名されたときに開始されます。キャッシュされた URL や再利用された URL は残り時間が短い場合があります。再利用しても有効期間は更新されません。アセットは速やかにダウンロードしてください。コピーされるのは各行に記載されたアセットのみです。`byteplus/seedream-*` と `byteplus/seededit-*` の画像は BytePlus ビデオの行には含まれません。 コピーを実行するのは、モデルのネイティブプロバイダーのみです。代替プロバイダーによって処理された実行、つまり `model_provider` が代替プロバイダーを指定している場合、またはネイティブ実行のフォールバック再試行が代替プロバイダーに到達した場合(`X-Comfy-Router-Fallback-Provider` で開示されます)は、そのプロバイダー自身の URL を返します。これらの URL はプロバイダーの有効期限に従い、コピーされません。`model_provider` の値 `default`、`comfy`、`comfyui` は代替プロバイダーを指定しないため、それらの実行はネイティブであり、上記と同様にコピーされます。フォールバック再試行がネイティブプロバイダーに戻った `model_provider` の実行も同様です。 **Veo (`veo/*`) には別のストレージパスがあります。** `response.videos[]` では、存在する方のメンバーを読み取ってください。`bytesBase64Encoded` はクリップをインラインで含み、`gcsUri` は、プロバイダーから Comfy ストレージへの直接書き込みが環境で構成されている場合に、Comfy が署名した HTTPS リンクを含みます。そのリンクはレスポンスから 24 時間有効です。後者の場合はアセットをコピーするのではなく直接書き込むため、Veo は再ホスティングの表には含まれていません。 その他のモデルは、プロバイダーのアセット参照またはインラインバイトを返します。プロバイダーの URL はプロバイダーの有効期限に従います。これは上記の有効期間よりはるかに短い場合があり、Router の契約では規定されていません。 コピーはアセットごとのベストエフォートです。1 つのコピーが失敗した場合、そのエントリはプロバイダーの参照を保持します。レスポンスには Comfy とプロバイダーの両方の URL が含まれる可能性があり、アセットごとの明示的なコピーステータスフィールドはありません。生成は引き続き成功し、課金されます。1 つの正常に再ホストされたアセットから、すべての URL の有効期間を推測しないでください。 結果が Comfy ホストかどうかは、完了した呼び出しが後でその `Idempotency-Key` レコードから再生できるかどうかも決定します。上記の `Idempotency-Key` パラメーターは、再生できない場合に再試行が何で応答されるかを説明しています。 ## モデルごとの入力および出力スキーマ 各モデルのフィールドは `GET /v2/models/{provider}/{model}/openapi.json` から読み取ります。この呼び出しには APIキーが必要です。スキーマが作成されているすべてのモデルについて、同じドキュメントが APIキーなしでこのサイトの `/router-schemas/{provider}/{model}.json` にも公開されています。このコピーは最後のドキュメント更新時に取得されたスナップショットであるため、両者が異なる場合はエンドポイントの内容が正式です。オペレーションの `requestBody` は入力の検証を記述しており、その `200` レスポンスは、スキーマが作成されている場合に出力の形状とメディアタイプを記述しています。`x-comfy-input-schema-authored` が false の場合、Router はモデル固有の事前検証なしで任意の JSON オブジェクトを受け入れます。プロバイダーの要件は引き続き適用されます。出力スキーマは結果を記述するものであり、Router は返されたプロバイダーのペイロードをそれらに対して検証しません。スキーマが作成されていない出力では、`application/json` ではなく `*/*` が使用される場合があります。デコードする前にレスポンスのコンテンツタイプを確認してください。 ## スキーマ ### RouterBilledWorkspace 拒否された呼び出しで課金されるはずだったウォレットです(`RouterErrorResponse.billed_workspace`)。「どのウォレットが空なのか」に答えるものであり、呼び出し元の UI が現在選択しているワークスペースとは限りません。残高のあるチームを開いていても、チームメンバーの個人認証情報はここではその個人ウォレットを示します。`denied_reason` と同時にのみ存在します。 **フィールド** Cloud ワークスペースの id。レガシーレールでは存在しません。 `personal` または `team`。オープンな文字列であり、それ以外の値は personal として扱ってください。 呼び出しが Cloud ワークスペースではなく、呼び出し元のワークスペース導入前の Metronome 顧客に課金される場合は `legacy`。その顧客にはワークスペース id がありません。Cloud ワークスペースでは存在しません。 ### RouterChargesOnPolicyRejection このモデルでコンテンツポリシーによる拒否が課金されるかどうか。不明な値は課金される可能性があるものとして扱ってください。 型: `string` ### RouterCostEstimate この呼び出しにかかる費用を、ディスパッチ前に、実行の課金に用いられるのと同じレートカードから米ドルで見積もった事前見積もりです。最終的な請求額ではありません。実際に支払うのは、ワークスペースの使用量および請求記録にある確定した請求額です。実行後に報告される `X-Comfy-Credits-Used` は事後に丸められた数値であり、領収書ではありません。`source` はその数値をどこまで信頼できるかを示します。`exact` は `amount` を持ち、`estimated` は `min_amount` と `max_amount` を持ち `amount` は持ちません。`unknown` はどちらも持たず `reason` を持ちます。`amount` が存在しないことを無料と読み取らないでください。価格の固定ではありません。`pricing_as_of` を参照してください。 **フィールド** `exact` | `estimated` | `unknown`。それ以外の値は `unknown` として読み取ります。`exact` と `estimated` はいずれも見積もりを表すもので、どちらも最終的な請求額ではありません。`unknown` は数値を持ちません。 常に `USD` です。 小数文字列としてのドル額。例: "0.04"。最大 8 桁の小数で、指数表記はありません。課金対象となる 1 セント未満の価格が "0" として表示されることはありません。`source` が `exact` の場合のみ存在します。最終的な請求額ではありません。最終的なのは、ワークスペースの使用量および請求記録にある確定した請求額です。 小数文字列としてのドル額の下限。`source` が `estimated` の場合のみ存在します。 小数文字列としてのドル額の上限。`source` が `estimated` の場合のみ存在します。 計算用の、端数処理を行っていない米セント単位の同じ数値。`amount` とともに存在します。 double 端数処理を行っていない米セント単位の `min_amount`。`min_amount` とともに存在します。 double 米セント単位の `max_amount`。`max_amount` とともに存在します。 double プラットフォームの換算($1 = 211 credits)を用いた Comfy クレジット単位の `amount`。小数第 2 位に丸められます。`exact` な見積もりで `X-Comfy-Credits-Used` が保持すると想定される値です。このヘッダーは事後に丸められた数値であり、領収書ではありません。ワークスペースの使用量および請求記録にある確定した請求額が最終的な金額です。 double この見積もりが対象とするプロバイダーのレッグ。キュー中の送信では、実行されるレッグになります。 正規の Comfy Router モデル ID で、`{provider}/{model}` の形式です。`POST /v2/models/{provider}/{model}` でモデルを指定する値とまったく同じもので、呼び出し元は何からも再導出することなくそのパスに埋め込めます。その `pattern` は `RouterProviderSegment` と `RouterModelSegment` を単一の `/` で連結したもので、`maxLength` はそれらの合計にその区切り文字を加えたものです。 型: [`RouterModelId`](#routermodelid)。モデル ID(例: `anthropic/claude-opus-4-6`)、最大 193 文字 この見積もりの価格算出に使用したレートカードを取得した日時。実行は、評価された時点で有効な料率で課金され、この瞬間の料率で課金されるわけではありません。ベンダーが公開している価格リストから取得した `estimated` 見積もり(ベンダーが報告するコストで課金されるモデル)は、代わりにそのリストを読んだ日付を持ちます。課金数量をそのリストから予測し、それをレートカードで価格付けする見積もり(ベンダーが報告するクレジットで課金されるモデル)は、二つのうち古い方の日付を持ちます。レートカードが読まれなかった場合(`reason: pricing_unavailable`、`byok`、またはどのカードからも価格を算出できない `not_quotable` の呼び出し)は、見積もりが返された日時を示します。 date-time `source` が `unknown` の場合のみ存在します。`not_quotable`(Router は実行前にこの呼び出しの価格を算出できません。価格がプロバイダーから返される内容に依存するか、リクエストボディが課金対象の数量を定めていないためです)、`unpriced_model`(レートカードにこのリクエストの価格がない)、`byok`(キュー中の送信のみ: 実行は自身のプロバイダーキーを使用するため、Comfy は何も請求しません)、または `pricing_unavailable`(キュー中の送信のみ: リクエストの受け入れ時にレートカードを読めませんでした。これは一時的なもので、実行は通常どおり課金されます)。それ以外の値は `not_quotable` として読み取ります。 ### RouterErrorResponse 認証、アクセス、モデル検索、クォータ、プロバイダーの転送に関する失敗のエラーボディです。 **フィールド** 失敗を人間が読める形で説明したもので、エンドユーザーに提示しても安全です。機械的にパースされることはありません。代わりに `error_type` で分岐してください。退役したモデルに対する `model_not_found` の場合、後継モデルが記録されていて呼び出し元から参照できるときは `detail` に ` was retired on ; use ` が入り、そうでないときは通常の候補リストではなく ` was retired on ` だけが入ります。ここで示される後継モデルは常に、呼び出しの向き先を変更できる有効なカタログ ID です。提供終了日がまだ未来であるモデルは退役していません。その日付までは `GET /v2/models` に一覧表示され、実行可能なままです。`detail` の他の部分と同様に、この退役に関する文言は表示用であり、互換性の保証はありません。機械的にパースされないというルールには、文書化された 2 つの例外があります。`POST /v2/models/{provider}/{model}` では、`409` が `invalid_input` バケットを共有する 3 つの無関係な条件に対して返され、それらを区別するのは `detail` だけです。`detail` が「this request's `image` selects the edit operation」で始まる場合は multipart の `model_provider` 拒否であり、`detail` が `this request resolved a BYOK credential` で始まる場合は BYOK の `model_provider` 拒否です。どちらも新しい `Idempotency-Key` では解消しません。そのルートにおける他の `invalid_input` の `409` はキーの競合です。どちらのプレフィックスも安定した契約用語であり、マッチングしてもかまいません。これ以外の箇所では、`detail` で分岐することに互換性の保証はありません。 Router の失敗を表す粗い機械可読なバケットで、`X-Comfy-Error-Type` レスポンスヘッダーにも反映されるため、呼び出し元はボディをパースせずに分岐できます。この集合は 20 個の値で閉じています。6 つのリクエストレベルのバケット `invalid_input`、`content_policy_violation`、`provider_error`、`provider_timeout`、`insufficient_credits`、`model_not_found` に加えて、トランスポートレベルの `unauthorized`、`forbidden`、`concurrency_limit_exceeded`、`client_disconnected`、`internal_error`、`deadline_exceeded`、`not_enabled`、`service_unavailable`、`rate_limited`、`cancelled`、`queue_timeout`、`request_not_found`、`queue_backlog_full`、`result_expired` です。「閉じている」とは今日文書化されている集合を指すのであり、永久に保たれる上限ではありません。集合は増えることが想定されているため、これは意図的に `enum` ではなくプレーンな文字列になっています。したがってクライアントは、上記のリストを網羅的に switch して次の追加のたびに壊れるのではなく、認識できない値を `internal_error` として扱わなければなりません。 型: [`RouterErrorType`](#routererrortype) モデルプロバイダーがリクエストを拒否した理由を、範囲を限定してサニタイズしたものです。`error_type` が `invalid_input` で、`X-Comfy-Upstream-Status` がプロバイダーの `4xx` または `2xx` の場合にのみ存在します。つまり、プロバイダーがリクエストを不正な形式として拒否し、その理由を述べた場合です。通常このステータスは `4xx` です。成功のエンベロープ内で拒否された生成を報告するプロバイダーでは `2xx` になります(BytePlus の失敗タスクのポーリングは HTTP `200` で、理由はボディに含まれます)。それ以外のすべての失敗では存在しません。プロバイダーの `5xx`、トランスポートの失敗、コンテンツポリシーによる拒否、および Router が自身について発生させた拒否が含まれます。`X-Comfy-Upstream-Detail` ヘッダーに反映されます。 コンテンツポリシーによる拒否がどの入力または出力に関するものかを、Router レベルの閉じた語彙として示します。`input`、`output`、`input_text`、`input_image`、`input_video`、`input_audio`、`output_text`、`output_image`、`output_video`、`output_audio` です。プロバイダーがモダリティを特定しなかった場合、単なる `input` / `output` の値がどちら側かを示します。`error_type` が `content_policy_violation` で、プロバイダーが拒否された対象を機械可読なコードで示した場合にのみ存在し、それ以外では存在しません。プロバイダーのテキストが入ることはありません。現在は BytePlus、Runway、BFL、Gemini、Veo、Vertex、xAI、Wan の拒否に対して、また MiniMax Router の Nano Banana レッグにおける Gemini の拒否に対しても付与されます。拒否がどちら側に関するものかを示さないプロバイダーでは存在しません。`X-Comfy-Refusal-Subject` ヘッダーに反映されます。 パートナーノードの支出拒否に対する課金側のポリシー分岐です。`no_funds` は課金対象ウォレットが空であること、`unspecified` は資金の読み取りを伴わずに拒否されたことを示します。`error_type` が `insufficient_credits` で、デプロイがウォレットの事実を報告する場合にのみ存在します。それ以外では存在しません。表示用テキストではなく機械可読なコードです。表示には `detail` を使い、分岐にはこの値を使います。 拒否された呼び出しで課金されるはずだったウォレットです(`RouterErrorResponse.billed_workspace`)。「どのウォレットが空なのか」に答えるものであり、呼び出し元の UI が現在選択しているワークスペースとは限りません。残高のあるチームを開いていても、チームメンバーの個人認証情報はここではその個人ウォレットを示します。`denied_reason` と同時にのみ存在します。 型: [`RouterBilledWorkspace`](#routerbilledworkspace) 拒否されたリクエストがどの方法で認証されたかを示します。`personal_api_key`、`team_api_key`、`personal_session`、`team_session` のいずれかです。「もう一方のウォレットに課金するにはどの認証情報に切り替えればよいか」に答えるものです。権限ではなく、何も付与しません。`denied_reason` と同時にのみ存在します。 ### RouterErrorType 機械可読な Router エラーカテゴリ。`X-Comfy-Error-Type` ヘッダーでも送信されます。 型: `string` ### RouterModelBilling モデルを呼び出す前に確認すべき課金動作。価格や使用量は含みません。 **フィールド** コンテンツポリシーを理由にこのモデルが拒否した呼び出しでも、呼び出し元に課金されるかどうか。プロバイダーによって異なり、その違いは呼び出し時には見えず、同じ呼び出しでエラーと課金の両方を見たユーザーには知りようがありません。そのため、プロバイダーごとの伝聞に任せるのではなく、モデルごとに、呼び出しの前に明示されます。`yes` の場合、同期ルートの `content_policy_violation` エラーに `X-Comfy-Credits-Used` が付くことがあります。プロバイダーがモデルの生成出力を拒否し、Comfy がその拒否された生成の使用量を記録した場合に付き、その金額を持ちます。入力側の拒否と同じキーのリプレイ(`Idempotent-Replayed: true`)には付きません。ヘッダーのない拒否は報告されていないだけで、無料であった証明ではありません。 型: [`RouterChargesOnPolicyRejection`](#routerchargesonpolicyrejection) ### RouterModelDetail 1つの Comfy Router モデルに関するモデルごとの詳細: カタログ一覧がそのモデルについて報告するすべての情報に加え、単一モデルのルートだけが持つモデル単位のフィールドです。 [`RouterModelListEntry`](#routermodellistentry)、[`RouterModelDetailFields`](#routermodeldetailfields) を構成します。 型: `object` ### RouterModelDetailFields モデル詳細エンドポイントが返すオプションのフィールドです。 **フィールド** このモデルの OpenAPI ドキュメントの URL。入力スキーマと出力スキーマを含みます。 HTTPS URL(例: `https://api.comfy.org/v2/models/bfl/flux-2-pro/openapi.json`)、最大 2048 文字 ### RouterModelId `POST /v2/models/{provider}/{model}` で使用されるモデルIDです。 型: `string`。モデルID(例: `anthropic/claude-opus-4-6`)、最大193文字 ### RouterModelInput モデルの入力オブジェクトです。フィールドと検証については、選択済みモデルのOpenAPIドキュメントを参照してください。 型: `object` ### RouterModelInputSchemaDocument 1つのモデルの入力と出力を記述した、独立した OpenAPI ドキュメント。 型: `object` ### RouterModelListEntry モデルの ID と課金情報です。 **フィールド** 正規の Comfy Router モデル ID、`{provider}/{model}` です。これは `POST /v2/models/{provider}/{model}` でモデルを指定する値そのものなので、呼び出し側は他の何かから再導出することなくこのパスに埋め込むことができます。`pattern` は `RouterProviderSegment` と `RouterModelSegment` を単一の `/` で連結したもので、`maxLength` はそれらの合計にこの区切り文字を加えた長さです。 型: [`RouterModelId`](#routermodelid) -- モデル ID、例: `anthropic/claude-opus-4-6`、最大 193 文字 正規の `{provider}/{model}` モデル ID の小文字の `provider` セグメントで、どのパートナーのモデルを扱うかを示します。呼び出しルートの `provider` パスパラメータとカタログエントリの `provider` フィールドはどちらもこの 1 つのスキーマを参照しており、これによって一覧に載る ID と受け付ける ID が食い違わないようになっています。 型: [`RouterProviderSegment`](#routerprovidersegment) -- 英数字スラッグ、例: `anthropic`、最大 64 文字 正規の `{provider}/{model}` モデル ID の小文字の `model` セグメントで、そのプロバイダー内で実行するモデルを指します。呼び出しルートの `model` パスパラメータとカタログエントリの `model` フィールドで共有されており、`RouterProviderSegment` と同じく食い違いを防ぐためです。 型: [`RouterModelSegment`](#routermodelsegment) -- 英数字スラッグ、例: `claude-opus-4-6`、最大 128 文字 呼び出しの前に呼び出し側が必要とするモデルごとの課金情報です。価格ではありません。使用量やコストの数値はここには現れません。 型: [`RouterModelBilling`](#routermodelbilling) このモデルの `GET /v2/models/{provider}/{model}/openapi.json` ドキュメントの現在の強力な `ETag` です。スキーマが変わっていない間に `304` を得るには、その読み取りで `If-None-Match` としてこれを送信します。また、前回確認した値と比較すれば、すべてのドキュメントを取得することなく、どのモデルのスキーマが変わったかを知ることができます。この呼び出し元に対してその読み取りが現時点で `200` を返さない場合、この値は存在しません。スキーマサービスが利用不可である、モデルのドキュメントをレンダリングできない、またはレスポンスの構築中にモデルがこの呼び出し元にとって利用不可になった、といった場合です。タグが存在しないことはスキーマの変更ではありません。モデルのドキュメントを再読み取りして、現在のタグを確認してください。 ### RouterModelListResponse Router モデルカタログの 1 ページです。 **フィールド** このページのモデルで、最大 `limit` 件です。 型: [`RouterModelListEntry`](#routermodellistentry) の配列 このページより先に別のページが存在するかどうか。これが true である間は辿り続けてください。短い、または空の `data` からカタログの終端を推測しないでください。 Router リストへの不透明なカーソルです。これはサーバーによって生成され、そのまま往復させるだけのものです。オフセットではなく、モデル ID でもなく、順序付けもされておらず、カタログの再構築をまたいで安定もしません。したがって、カーソルを解析したり、インクリメントしたり、それが得られた走査を超えて永続化したりすることは、いずれも契約の範囲外です。オフセットではなくカーソルを用いるのは、カタログが変化し続けるリストだからです。走査の途中でエントリが追加または削除されると、オフセットによる走査は気付かないうちにエントリをスキップしたり繰り返したりしますが、呼び出し側はそれが起きたことを判別できません。 型: [`RouterPageCursor`](#routerpagecursor): `next_cursor` として返される不透明なカーソル、1〜512 文字 実際に提供されたページサイズです。最大値を超える `limit` を要求した場合、拒否されるのではなく最大値に切り下げられます。そのため、これは要求した値より小さくなることがあります。送信した値ではなく、この数値でページネーションしてください。さもないと、実際には受け取っていない行が存在すると想定してしまいます。 1〜100 ### RouterModelOutput モデルの結果オブジェクト。正確な形状については、選択済みモデルの出力スキーマを参照してください。 型: `object` ### RouterModelSegment `{provider}/{model}` 形式のモデル ID におけるモデル部分。 型: `string` -- 英数字のスラッグ(例: `claude-opus-4-6`)、最大 128 文字 ### RouterPageCursor カタログの不透明なカーソル。`cursor` として変更せずにそのまま渡し直してください。 型: `string` -- `next_cursor` として返される不透明なカーソル。1〜512文字 ### RouterProviderSegment `{provider}/{model}` というモデル ID のうち、プロバイダー部分。 型: `string`。英数字のスラッグ(例: `anthropic`)、最大 64 文字 ### RouterQueueCancelResponse このルートが解決したリクエストを記述する 2 つのステータス、`202` と `409` に対するキャンセル要求への応答です。成功エンベロープとエラーエンベロープに分けるのではなく、両方で 1 つのボディ形状を共有します。どちらも同じ表明、つまりキャンセルが何を見つけたかを示すものであり、ステータスコードごとに異なる型をパースしなければならないクライアントにとって、分割には何の利点もないからです。 **フィールド** キュー中の Router リクエスト 1 つを識別するもの。呼び出し元がポーリング、キャンセル、結果の収集に使うハンドルです。 型: [`RouterQueueRequestId`](#routerqueuerequestid) -- `pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`、uuid、最大 36 文字 このルートが実際に解決したリクエストを記述する 2 つの結果について、キャンセル要求が何を見つけたか。どちらも HTTP ステータスに反映されるため、クライアントはどちらで分岐してもかまいません。 型: [`RouterQueueCancelStatus`](#routerqueuecancelstatus) ### RouterQueueCancelStatus このルートが実際に解決したリクエストを表す2つの結果について、キャンセル要求が何を検出したかを示します。どちらも HTTP ステータスに反映されるため、クライアントはどちらで分岐してもかまいません。 型: `string` ### RouterQueuePosition 応答が構成された時点で、キュー内でこのリクエストより前に並んでいるリクエストの数。0 はこのリクエストが先頭であることを意味します。 型: `integer` -- 0 以上 ### RouterQueueRequestId キュー中の Router リクエスト1件の識別子。呼び出し元がポーリング、キャンセル、結果の取得に使用するハンドルです。 型: `string` -- `pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`, uuid, 最大36文字 ### RouterQueueStatus キュー中の Router リクエストの状態です。取り得る値はちょうど 3 つで、`RouterErrorType` とは異なり、こちらは閉じた `enum` です。これは 2 つのスキーマが意図的に逆方向へ閉じているためです。`RouterErrorType` は失敗を分類するもので、その集合は今後増えていくことが想定されています。そのため、認識できないバケットを厳格に拒否する生成済みクライアントは、何かがすでに問題を起こしているまさにそのときに、最も激しく失敗することになります。一方、こちらはライフサイクルです。後で 4 つ目の状態が追加されたライフサイクルは、enum として宣言されているかどうかにかかわらず、それに対して書かれたすべてのポーリングループにとって破壊的変更になります。そこでこれは enum として宣言され、その制約はクライアントから見える場所に明記されています。 型: `string` ### RouterQueueStatusFields `RouterQueueStatusResponse` のうち URL ブロックではない半分: キュー中の 1 つのリクエストの識別情報、その現在の状態、そしてその状態がターミナルで実行が成功しなかった場合には、その理由を示す大まかな分類です。 **Fields** キュー中の Router リクエストを識別するもの。呼び出し元がポーリング、キャンセル、結果の収集に使用するハンドルです。 型: [`RouterQueueRequestId`](#routerqueuerequestid) -- `pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`, uuid, 最大 36 文字 キュー中の Router リクエストの状態です。これはちょうど 3 つの値を持ち、`RouterErrorType` とは異なり閉じた `enum` です。これは、2 つのスキーマが意図的に逆方向に閉じているためです。`RouterErrorType` は失敗を分類し、その集合は拡張されることが想定されているため、認識されない分類を厳密に拒否する生成済みのクライアントは、何かが既にうまくいかなくなったまさにその時に最も大きな失敗をすることになります。こちらはライフサイクルであり、後で第 4 の状態が追加されたライフサイクルは、enum として宣言されているかどうかに関係なく、それに対して書かれたすべてのポーリングループにとって破壊的変更となります。そのため enum として宣言されており、制約はクライアントが確認できる場所に記載されています。 型: [`RouterQueueStatus`](#routerqueuestatus) 応答が構成された時点で、キュー内でこのリクエストの前に何件のリクエストがあるかを示します。0 はこのリクエストが先頭にあることを意味します。 型: [`RouterQueuePosition`](#routerqueueposition) -- 0 以上 成功しなかった `COMPLETED` リクエストにのみ存在し、結果の読み取りがその失敗を返すときに `X-Comfy-Error-Type` に付けるのと同じ大まかな分類を持ちます。これは成功したターミナルリクエストと、失敗またはキャンセルされたリクエストを区別するものです。どちらにも別個のターミナルステータスはありません。また、成功時には null ではなく存在しないため、その存在の有無で分岐してください。 型: [`RouterErrorType`](#routererrortype) ### RouterQueueStatusResponse キュー中の1件のリクエストの現在の状態を、送信時に返されたものと同じ3つのURLと組み合わせて構成したものです。 [`RouterQueueUrls`](#routerqueueurls)、[`RouterQueueStatusFields`](#routerqueuestatusfields)を組み合わせます。 型: `object` ### RouterQueueSubmitFields `RouterQueueSubmitResponse` のうち、URL ブロックではない半分です。新しいリクエストの識別情報と、それが受け付けられた時点の状態を表します。 **フィールド** キュー中の Router リクエスト 1 件の識別子です。呼び出し側がポーリングし、キャンセルし、結果を取得するときのハンドルになります。 型: [`RouterQueueRequestId`](#routerqueuerequestid) -- `pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`、uuid、最大 36 文字 キュー中の Router リクエストの状態です。値はちょうど 3 つあり、`RouterErrorType` とは異なりこちらは閉じた `enum` です。これは 2 つのスキーマが意図的に逆方向に閉じているためです。`RouterErrorType` は失敗を分類するもので、その集合は今後増えていくことが想定されています。そのため、認識できない区分を厳格に拒否する生成済みのクライアントは、まさに何かがすでに失敗したときに最も激しく失敗することになります。一方こちらはライフサイクルであり、後で 4 つ目の状態が追加されるライフサイクルは、enum として宣言されているかどうかにかかわらず、それに対して書かれたすべてのポーリングループにとって破壊的変更になります。そこで enum として宣言し、その制約はクライアントから見える場所に明記しています。 型: [`RouterQueueStatus`](#routerqueuestatus) レスポンスが構成された時点で、キューのうちこのリクエストより前に何件のリクエストがあるかを示します。0 はこのリクエストが先頭にあることを意味します。 型: [`RouterQueuePosition`](#routerqueueposition) -- 0 以上 このリクエストの事前コスト見積もりです。呼び出し側に対してコスト見積もりが有効になっている場合、新規受け付け時に含まれます。このリクエストがピン留めされたプロバイダーのレッグを見積もります(キューにはフォールバックループがないため、`fallback_provider` が実行されるレッグを変えることはありません)。数値を提示できない場合でも、`source: unknown` を伴って常に存在します。見積もりのせいで送信が失敗することはありません。冪等なリプレイ(`Idempotent-Replayed: true`)では省略されます。オリジナルの見積もりは保存されないためです。これは見積もりであり、最終的な請求額ではなく、価格の固定でもありません。実行はレーティングが行われる時点で有効な料金で課金され、ワークスペースの使用量および請求記録に確定した請求額が最終となります。 型: [`RouterCostEstimate`](#routercostestimate) ### RouterQueueSubmitResponse 実行がキューに受け入れられたときに返されるハンドルです。リクエストの識別情報と状態を、そのライフタイムの残りの部分に対応する 3 つの URL と組み合わせたものです。 [`RouterQueueUrls`](#routerqueueurls)、[`RouterQueueSubmitFields`](#routerqueuesubmitfields) を合成します。 型: `object` ### RouterQueueUrls キュー中の 1 件のリクエストのライフタイムの残りに対応する 3 つの URL です。有効なハンドルを含むすべてのレスポンスで返されるため、クライアントがキュー URL を自分で組み立てることはありません。 **フィールド** このリクエストのステータス読み取りの絶対 URL。 URI このリクエストの結果を取得する絶対 URL。 URI キャンセルを要求する絶対 URL。 URI ### RouterValidationErrorContext 失敗した検証ルールについて、プロバイダーから提供される詳細情報。 型: `object` ### RouterValidationErrorDetail 単一のフィールドレベルの検証失敗。 **フィールド** 問題のあるフィールドへのパス。最も外側のセグメントが先頭になります。たとえば `["body", "image_url"]`、または `["body", "images", 0]` のように、整数は配列へのインデックスを表します。 この 1 件の失敗を人間が読める形で説明したもの。 この失敗の具体的で機械可読な理由。プロバイダーからそのまま渡されます。これは型付き SDK の例外階層が分岐に使う値であり、レスポンスヘッダーの `error_type` はその粗い区分にすぎません。 1 つの `RouterValidationErrorDetail` で違反した境界値。プロバイダーからそのまま引き継がれます。たとえば `greater_than` に対応する `{"limit_value": 8}`、`image_too_small` に対応する `{"min_width": 512}`、`file_too_large` に対応する `{"max_size_bytes": 10485760}` などです。キー集合はプロバイダーとエラータイプに固有であるため、これは意図的にオープンなオブジェクトとしています。固定のフィールドリストに狭めたり、`msg` 文字列に畳み込んだりすることこそが、移植された統合がコンパイルは通るものの、境界値を読んでいた分岐を黙って失う原因そのものです。エラータイプが境界値を持たない場合は存在しません。 型: [`RouterValidationErrorContext`](#routervalidationerrorcontext) 問題のある入力値。呼び出し元が `loc` から再導出することなく何が拒否されたかを確認できるよう、そのまま返されます。文字列、数値、ブール、配列、オブジェクト、null など任意の JSON 型を取りうるため、このスキーマはオブジェクトに狭めず、意図的に型なしのままにしています。プロバイダーが入力をそのまま返さない場合は存在しません。 型: [`RouterValidationErrorInput`](#routervalidationerrorinput) ### RouterValidationErrorInput 拒否された入力値です。プロバイダーがこれを含める場合に含まれます。 ### RouterValidationErrorResponse `422` 検証エラーのレスポンスボディです。カテゴリの確認には `X-Comfy-Error-Type` を参照してください。 **フィールド** リクエストで検出されたすべての検証失敗です。問題のあるフィールドごとに 1 件のエントリが含まれます。 型: [`RouterValidationErrorDetail`](#routervalidationerrordetail) の配列