https://api.comfy.org
以下每个端点都需要身份验证。请发送 X-API-Key: <api-key> 或 Authorization: Bearer <jwt>。
Comfy API 密钥也可以作为 Bearer token 发送。当同时提供两个凭证请求头时,以 X-API-Key 为准。有关 API 密钥与 JWT 的区别,请参阅身份验证请求头;有关访问要求,请参阅快速入门。
端点
GET /v2/models
列出 Comfy Router 可以运行的模型。
列出可用的模型 ID 和计费信息。当 has_more 为是时,使用 next_cursor。
参数
RouterPageCursor
不透明分页游标。类型:
RouterPageCursor — 作为 next_cursor 返回的不透明游标,1 至 512 个字符integer
单页返回的模型数量。最大 100,默认值:20
RouterModelListResponse
OK - 模型目录的一页。响应体:
RouterModelListResponse — 响应头:X-Comfy-Request-IdRouterErrorResponse
请求无效。请检查错误类型和请求体。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
凭据缺失或无效。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
该调用方或模型不允许此请求。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
Router 暂时不可用。请使用退避策略重试。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdGET /v2/models/{provider}/{model}
通过规范模型 ID 读取单个合作伙伴模型的目录条目。
无需列出完整目录即可读取单个模型的详情。
参数
RouterProviderSegment
必填
规范
{provider}/{model} 模型 ID 中的提供商部分。类型:RouterProviderSegment — 字母数字 slug,例如 anthropic,最多 64 个字符RouterModelSegment
必填
规范
{provider}/{model} 模型 ID 中的模型部分。类型:RouterModelSegment — 字母数字 slug,例如 claude-opus-4-6,最多 128 个字符RouterModelDetail
OK - 该模型的目录条目。响应体:
RouterModelDetail — 请求头:X-Comfy-Request-IdRouterErrorResponse
凭据缺失或无效。响应体:
RouterErrorResponse — 请求头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
该请求对此调用方或模型不被允许。响应体:
RouterErrorResponse — 请求头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
未找到该模型 ID。响应体:
RouterErrorResponse — 请求头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
Router 暂时不可用。请使用退避策略重试。响应体:
RouterErrorResponse — 请求头:X-Comfy-Error-Type、X-Comfy-Request-IdPOST /v2/models/{provider}/{model}
通过规范化模型 ID 同步运行合作伙伴模型。
运行模型并在同一响应中接收其已完成的结果。
参数
RouterProviderSegment
必填
规范化
{provider}/{model} 模型 ID 中的提供商部分。类型:RouterProviderSegment — 字母数字 slug,例如 anthropic,最多 64 个字符RouterModelSegment
必填
规范化
{provider}/{model} 模型 ID 中的模型部分。类型:RouterModelSegment — 字母数字 slug,例如 claude-opus-4-6,最多 128 个字符string
由调用方生成的键,用于让同一逻辑调用的重试变得安全。1 至 255 个字符
string
为此模型选择一个备用提供商,而不是它当前的默认提供商。
boolean
仅在配合
model_provider 时才有意义。默认:否string
控制当首次尝试失败的原因可归因于 Router 自身一侧或所尝试的特定提供商时(绝不可归因于请求本身,未重试的失败会像以往一样被原样拒绝),Router 是否针对该模型的其他已注册提供商重试此调用。
application/json — RouterModelInput(必填)
合作伙伴模型的原生 JSON 输入。在没有 model_provider 时,或在 strict_mode=true 时,原样转发给提供商;在 strict_mode=true 下,请求体必须已经是备用提供商自己的真实 schema,而不是此模型的原生 schema(参见 strict_mode)。当 model_provider 选择了备用提供商且 strict_mode=false(默认值)时,请求体会在发送前被转换为该提供商的真实 schema;任何无法精确表达的原生字段都会被丢弃,并通过响应的 X-Comfy-Router-Dropped-Params 头予以披露,绝不会静默处理。
响应
RouterModelOutput
OK - 在没有
model_provider 时,或在有 model_provider 且 strict_mode=false(默认值,在可能时转换回此模型的原生契约,转换失败时回退到备用提供商自己的原始响应,会记录日志,绝不静默)时,形状是此模型自己的原生输出;在 strict_mode=true 时,则是原样返回的备用提供商的响应。Body:RouterModelOutput — Headers:X-Comfy-Request-Id、X-Content-Type-Options、X-Comfy-Router-Fallback-Provider、X-Comfy-Router-Dropped-Params、Idempotent-Replayed、X-Committed-Spend-Limit、X-Committed-Spend-Current、X-Committed-Spend-RemainingRouterErrorResponse
无效请求。检查错误类型和请求体。Body:
RouterErrorResponse — Headers:X-Comfy-Error-Type、X-Comfy-Request-Id、X-Comfy-Upstream-Status、Idempotent-ReplayedRouterErrorResponse
凭证缺失或无效。Body:
RouterErrorResponse — Headers:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
该调用方或模型不允许发出此请求。Body:
RouterErrorResponse — Headers:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
未找到该模型 ID。Body:
RouterErrorResponse — Headers:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
检查
X-Comfy-Error-Type:concurrency_limit_exceeded 表示原始调用仍在运行,因此请等待 Retry-After 并复用同一个键;invalid_input 则需要使用新键。Body:RouterErrorResponse — Headers:X-Comfy-Error-Type、X-Comfy-Request-Id、Retry-After(当出现 concurrency_limit_exceeded 时)RouterErrorResponse
请求体过大。Body:
RouterErrorResponse — Headers:X-Comfy-Error-Type、X-Comfy-Request-IdRouterValidationErrorResponse
请求的内容未通过模型 schema 的校验而被拒绝。Body:
RouterValidationErrorResponse — Headers:X-Comfy-Error-Type、X-Comfy-Request-Id、Idempotent-ReplayedRouterErrorResponse
检查
X-Comfy-Error-Type:concurrency_limit_exceeded 表示减少在途调用数;rate_limited 表示等待配额窗口。Body:RouterErrorResponse — Headers:X-Comfy-Error-Type、X-Comfy-Request-Id、X-Committed-Spend-Limit、X-Committed-Spend-Current、X-Committed-Spend-RemainingRouterErrorResponse
提供商自身的响应无法被转换为结果(
provider_error)。Body:RouterErrorResponse — Headers:X-Comfy-Error-Type、X-Comfy-Request-Id、X-Comfy-Upstream-StatusRouterErrorResponse
Router 暂时不可用。请以退避策略重试。Body:
RouterErrorResponse — Headers:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
请求超出了截止时间。重试前请检查错误类型。请求体:
RouterErrorResponse;响应头:X-Comfy-Error-Type、X-Comfy-Request-Id、X-Comfy-Upstream-Status、Retry-AfterGET /v2/models/{provider}/{model}/openapi.json
以 OpenAPI 文档形式读取某个合作伙伴模型的输入和输出 schema。
以独立的 OpenAPI 文档形式读取某个模型的输入和输出 schema。
参数
RouterProviderSegment
必填
规范
{provider}/{model} 模型 ID 中的提供商部分。类型:RouterProviderSegment — 字母数字 slug,例如 anthropic,最多 64 个字符RouterModelSegment
必填
规范
{provider}/{model} 模型 ID 中的模型部分。类型:RouterModelSegment — 字母数字 slug,例如 claude-opus-4-6,最多 128 个字符string
调用方从先前的
200 响应中持有的 ETag。RouterModelInputSchemaDocument
OK - 该模型的输入和输出 schema,以独立的 OpenAPI 文档形式呈现。正文:
RouterModelInputSchemaDocument — 响应头:X-Comfy-Request-Id、ETag、Cache-Controlno body
Not Modified - 自调用方在
If-None-Match 中发送的 ETag 以来,文档未发生更改。响应头:X-Comfy-Request-Id、ETag、Cache-ControlRouterErrorResponse
凭证缺失或无效。正文:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
该调用方或模型无权发起此请求。正文:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
未找到该模型 ID。正文:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
Router 无法完成该请求。正文:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
Router 暂时不可用。请使用退避策略重试。正文:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdPOST /v2/models/{provider}/{model}/requests
将合作伙伴模型运行提交到队列并立即返回。
Comfy Router 的队列投递模式。请求体与该模型的 POST /v2/models/{provider}/{model} 所接受的合作伙伴原生 JSON 输入相同:同一套请求体结构,同一份按模型定义的 schema,两种投递模式。但此路由不会为获取结果而保持连接。它会接纳该次运行,返回 201 及一个句柄,调用方稍后可通过下面的三种读取操作获取结果。
参数
RouterProviderSegment
必填
规范
{provider}/{model} 模型 ID 中小写的提供商片段:即其模型正在被运行的合作伙伴。类型:RouterProviderSegment — 字母数字 slug,例如 anthropic,最多 64 个字符RouterModelSegment
必填
规范
{provider}/{model} 模型 ID 中小写的模型片段:即在该提供商内要运行的模型。类型:RouterModelSegment — 字母数字 slug,例如 claude-opus-4-6,最多 128 个字符string
由调用方生成的键,让重试单次逻辑调用变得安全。1–255 个字符
application/json — RouterModelInput(必填)
合作伙伴模型的原生 JSON 输入,与此模型的同步路由所接受的请求体完全相同。在接纳该次运行之前,会依据模型自身的输入 schema 进行校验,因此模型会拒绝的请求体在这里会得到 422,而不是变成几分钟后才失败的已排队请求。
响应
RouterQueueSubmitResponse
已创建:该次运行已被接纳进入队列。响应体:
RouterQueueSubmitResponse — 响应头:X-Comfy-Request-Id、Idempotent-ReplayedRouterErrorResponse
凭据缺失或无效。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
请求无效。请检查错误类型和请求体。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
请求体过大。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
Router 请求级失败:请求从未到达模型,或因模型自身未反馈的原因而失败。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
该请求对于此调用方或此模型不被允许。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
未找到该模型 ID。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
请检查
X-Comfy-Error-Type:concurrency_limit_exceeded 表示原始调用仍在运行,因此请等待 Retry-After 并复用同一个键;invalid_input 则需要使用新的键。响应体:RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-Id、Retry-After(当出现 concurrency_limit_exceeded 时)RouterValidationErrorResponse
请求的内容未通过模型 schema 的校验。响应体:
RouterValidationErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-Id、Idempotent-ReplayedRouterErrorResponse
Router 暂时不可用。请使用退避策略重试。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdGET /v2/models/{provider}/{model}/requests/{request_id}
采集单个已提交请求的结果。
采集端点。对于已成功完成的请求,它返回合作伙伴模型自身的原生输出,与同步路由在同一模型、同一输入下 200 所返回的内容逐字节一致,因此两种交付方式产生同一种结果形状,调用方无需第二个解析器即可在两者之间切换。
参数
RouterProviderSegment
必填
规范
{provider}/{model} 模型 ID 中的小写提供商片段,即正在运行其模型的合作伙伴。类型:RouterProviderSegment — 字母数字 slug,例如 anthropic,最多 64 个字符RouterModelSegment
必填
规范
{provider}/{model} 模型 ID 中的小写模型片段,即在该提供商内要运行的模型。类型:RouterModelSegment — 字母数字 slug,例如 claude-opus-4-6,最多 128 个字符RouterQueueRequestId
必填
要定位的已执行请求,即提交时在响应体中返回的
request_id。类型:RouterQueueRequestId — pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$,uuid,最多 36 个字符RouterModelOutput
OK:对于产生了输出的请求,返回合作伙伴模型的原生输出;无论是成功完成的请求,还是同时带有已记录费用和已存储结果的终端请求,都按合作伙伴自身的媒体类型原样返回,与同步路由的
200 返回方式完全一致。响应体:RouterModelOutput — 响应头:X-Comfy-Request-Id、X-Content-Type-OptionsRouterQueueStatusResponse
Accepted:请求尚未完成。响应体:
RouterQueueStatusResponse — 响应头:X-Comfy-Request-Id、Retry-AfterRouterErrorResponse
凭证缺失或无效。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
该调用方或模型不允许执行此请求。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
未找到该模型 ID。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
Router 请求级失败:请求从未到达模型,或因模型自身未反馈的原因而失败。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
Router 暂时不可用。请使用退避策略重试。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
请求处于与操作冲突的状态。请检查错误类型。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
请求超出了截止时间。重试前请检查错误类型。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterValidationErrorResponse
请求内容未通过模型 schema 的校验。响应体:
RouterValidationErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-Id、Idempotent-ReplayedRouterErrorResponse
Router 请求级失败:请求从未到达模型,或因模型自身未反馈的原因而失败。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdPUT /v2/models/{provider}/{model}/requests/{request_id}/cancel
请求取消某个已提交的请求。
请求 Comfy 停止一个尚未完成的请求。这只是请求,不是保证,202 恰恰说明了这一点:CANCELLATION_REQUESTED 表示该请求已被接受,而不是运行已停止。已经在合作伙伴侧上线的运行仍可能照常完成;而合作伙伴侧一旦完成生成就会被计费,无论是否有人去取回结果。因此,需要知道实际发生了什么的调用方,应随后读取状态端点:在那里,真正生效的取消是 COMPLETED,并像其他所有终端结果一样携带 error_type。
参数
RouterProviderSegment
必填
规范
{provider}/{model} 模型 ID 中的小写提供商段,即正在运行其模型的合作伙伴。Type: RouterProviderSegment — Alphanumeric slug, e.g. anthropic, Up to 64 charactersRouterModelSegment
必填
规范
{provider}/{model} 模型 ID 中的小写模型段,即在该提供商内要运行的模型。Type: RouterModelSegment — Alphanumeric slug, e.g. claude-opus-4-6, Up to 128 charactersRouterQueueRequestId
必填
要处理的排队请求,即提交时在响应体中返回的
request_id。Type: RouterQueueRequestId — pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$, uuid, Up to 36 charactersRouterQueueCancelResponse
已接受 -
CANCELLATION_REQUESTED。Body: RouterQueueCancelResponse — Headers: X-Comfy-Request-IdRouterQueueCancelResponse
冲突 -
ALREADY_COMPLETED。Body: RouterQueueCancelResponse — Headers: X-Comfy-Request-IdRouterErrorResponse
请求无效。请检查错误类型和请求体。Body:
RouterErrorResponse — Headers: X-Comfy-Error-Type, X-Comfy-Request-IdRouterErrorResponse
凭证缺失或无效。Body:
RouterErrorResponse — Headers: X-Comfy-Error-Type, X-Comfy-Request-IdRouterErrorResponse
该调用方或模型无权执行此请求。Body:
RouterErrorResponse — Headers: X-Comfy-Error-Type, X-Comfy-Request-IdRouterErrorResponse
未找到该模型 ID。Body:
RouterErrorResponse — Headers: X-Comfy-Error-Type, X-Comfy-Request-IdRouterErrorResponse
Router 暂时不可用。请使用退避策略重试。Body:
RouterErrorResponse — Headers: X-Comfy-Error-Type, X-Comfy-Request-IdRouterErrorResponse
Router 请求级失败,即请求从未到达模型,或因模型本身未反馈的原因而失败。Body:
RouterErrorResponse — Headers: X-Comfy-Error-Type, X-Comfy-Request-IdGET /v2/models/{provider}/{model}/requests/{request_id}/status
读取单个已提交请求的队列状态。
轮询端点。它返回请求的当前状态,而绝不返回结果,因此客户端可以监视长时间运行的生成过程,而无需在每次轮询时传输其输出。当此端点返回 COMPLETED 时,再通过下方的读取操作一次性获取结果。
参数
RouterProviderSegment
必填
规范
{provider}/{model} 模型 ID 中的小写提供商片段,即正在运行其模型的合作伙伴。类型:RouterProviderSegment — 字母数字 slug,例如 anthropic,最多 64 个字符RouterModelSegment
必填
规范
{provider}/{model} 模型 ID 中的小写模型片段,即要在该提供商内运行的模型。类型:RouterModelSegment — 字母数字 slug,例如 claude-opus-4-6,最多 128 个字符RouterQueueRequestId
必填
要处理的排队请求,即提交时在其响应体中返回的
request_id。类型:RouterQueueRequestId — pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$,uuid,最多 36 个字符RouterQueueStatusResponse
OK:请求的当前队列状态。响应体:
RouterQueueStatusResponse — 响应头:X-Comfy-Request-Id、Retry-AfterRouterErrorResponse
凭据缺失或无效。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
该请求不被允许用于此调用方或模型。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
未找到该模型 ID。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
Router 请求级失败:请求从未到达模型,或因模型本身未反馈的原因而失败。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
Router 暂时不可用。请使用退避策略重试。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-IdRouterErrorResponse
Router 请求级失败:请求从未到达模型,或因模型本身未反馈的原因而失败。响应体:
RouterErrorResponse — 响应头:X-Comfy-Error-Type、X-Comfy-Request-Id错误分类桶
Router 错误的机器可读类别,同时也会在X-Comfy-Error-Type 响应头中发送。
请求级分类桶
针对 Router 已接受但随后无法完成的请求抛出。传输级分类桶
由 Router 自身抛出,发生在调用模型之前或调用过程之中。响应头
string
所提供架构文档的新鲜度指令。
string
针对所提供文档字节的强实体标签,用于
GET /v2/models/{provider}/{model}/openapi.json。boolean
当此响应来自某条
Idempotency-Key 的记录,而不是通过再次运行模型产生时,该响应头会出现并且值为 true。integer
使用同一个
Idempotency-Key 重试同一请求之前需要等待的秒数。RouterErrorType
失败的粗粒度、机器可读分类,由 Router 在每个错误响应上设置。类型:
RouterErrorTypestring
服务器为此次调用生成的标识符,存在于每一个 Router 响应中:成功、4xx 和 5xx 响应均如此,因为错误响应恰恰是用户需要在支持请求中引用某个 ID 的时候。
string
一个 JSON 编码的字符串,内含一个字符串数组。请使用 JSON 解析器来解码,而不要按逗号对其分割,因为它在传输时是单个字符串,而不是逗号分隔的 OpenAPI 数组,并且每个条目本身就是一个带有逗号的句子。当一次转换生成了本次调用的请求体,却无法在所服务的提供商上精确表达一个或多个原生字段时,该响应头就会出现,并逐一列出每个被丢弃的字段及其原因;无论调用方是通过
model_provider(strict_mode=false,默认值)请求该转换,还是由自动的 fallback_provider 重试执行了该转换,都是如此。string
仅当
fallback_provider 确实针对第二个提供商重试了此调用,并且该重试成功时,该响应头才会出现并指明该提供商:即最终服务此调用的提供商,绝不是被尝试过但也失败了的那个。integer
模型提供商在此次调用中自身的 HTTP 状态。
integer
调用方当前已承诺给仍在途调用的美分数。
integer
调用方可承诺给仍在途调用的合作伙伴支出上限,单位为美分。这笔资金从调用被接纳的那一刻起即被保留,并在该调用结束时释放。
integer
上限之下剩余的可用额度,单位为美分,最低为零。
string
在 Router 模型的每次成功运行中都始终为
nosniff。结果资产
模型可以返回资产 URL、内联字节,或两者兼有。下面的提供商会将已选择的资产复制到 Comfy 存储上并替换其 URL。此行为取决于模型;没有任何请求头能选择它。
这些有效期从 URL 签名时开始计算,而不是从你打开它时开始。缓存或重放的 URL 可能剩余时间更少;重放不会为其续期。请及时下载资产。只有每一行中列出的资产会被复制:
byteplus/seedream-* 和 byteplus/seededit-* 图像不在 BytePlus 视频行的覆盖范围内。
Veo(veo/*)有单独的存储路径。 在 response.videos[] 中,读取其中存在的成员:bytesBase64Encoded 内联包含视频片段,而当环境配置为提供商直接写入 Comfy 存储时,gcsUri 包含一个 Comfy 签名的 HTTPS 链接。该链接自响应起 24 小时内有效。后一种情况是直接写入资产而非复制,因此 Veo 不在重新托管表中。
其他模型返回提供商资产引用或内联字节。提供商 URL 遵循提供商的过期时间,这可能比上述有效期短得多,且 Router 契约未对此作出规定。
复制是按资产尽力而为的。如果某个复制失败,该条目会保留其提供商引用;响应可以同时包含 Comfy 和提供商 URL,且没有明确的按资产复制状态字段。生成仍会成功并计费。不要根据一个成功重新托管的资产来推断每个 URL 的有效期。
结果是否由 Comfy 托管也决定了已完成的调用以后是否仍能从其 Idempotency-Key 记录中重放;上面的 Idempotency-Key 参数说明了无法重放时重试会得到怎样的回应。
各模型的输入和输出架构
通过GET /v2/models/{provider}/{model}/openapi.json 可读取每个模型的字段。该操作的 requestBody 描述了输入验证;在已编写的情况下,其 200 响应描述了输出形状和媒体类型。当 x-comfy-input-schema-authored 为否时,Router 接受任意 JSON 对象,而不进行特定于模型的预验证。提供商依赖项仍然适用。输出架构描述的是结果;Router 不会依据它们验证提供商返回的载荷。未编写的输出可能使用 */* 而非 application/json;在解码之前,请检查响应的内容类型。
模式
RouterChargesOnPolicyRejection
内容策略拒绝是否会对此模型收费。将未知值视为可能收费。 类型:string
RouterErrorResponse
认证、访问、模型查找、配额以及提供商传输失败时的错误响应体。 字段string
必填
对失败的可读描述,可安全地展示给最终用户。不会被机器解析,请改为根据
error_type 进行分支判断。RouterErrorType
必填
Router 失败的粗粒度、机器可读分类,同时会镜像到
X-Comfy-Error-Type 响应头中,以便调用方无需解析响应体即可分支处理。该集合固定为十五个值:六个请求级分类 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。类型:RouterErrorTypeRouterErrorType
机器可读的 Router 错误类别,同时也会在X-Comfy-Error-Type 请求头中发送。
类型:string
RouterModelBilling
调用模型之前需要检查的计费行为。它不包含价格或用量信息。 字段RouterChargesOnPolicyRejection
必填
模型因内容政策原因而拒绝的调用,是否仍会向调用方收费。各提供商的做法不同,这种差异在调用时不可见,而用户如果同时看到错误和同一调用被收费,也无从知晓其原因。因此这里在调用之前按模型明确说明,而不是留给各提供商的“民间说法”。类型:
RouterChargesOnPolicyRejectionRouterModelDetail
单个 Comfy Router 模型的详细信息:目录列表为其报告的全部内容,以及仅单模型路由携带的按模型字段。 组合RouterModelListEntry、RouterModelDetailFields。
类型:object
RouterModelDetailFields
模型详情端点返回的可选字段。 字段string
此模型的 OpenAPI 文档的 URL,包含其输入和输出 schema。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
针对单个模型输入与输出的独立 OpenAPI 文档。 类型:object
RouterModelListEntry
模型的 ID 与计费信息。 字段RouterModelId
必填
规范的 Comfy Router 模型 ID,格式为
{provider}/{model},正是用于在 POST /v2/models/{provider}/{model} 上寻址该模型的值,因此调用方可以直接将它插值到该路径中,而无需从其他来源重新推导。其 pattern 由 RouterProviderSegment 与 RouterModelSegment 通过单个 / 连接而成,maxLength 为两者之和加上该分隔符。类型:RouterModelId,模型 ID,例如 anthropic/claude-opus-4-6,最多 193 个字符RouterProviderSegment
必填
规范
{provider}/{model} 模型 ID 中的小写 provider 段,即被寻址模型所属的合作伙伴。调用路由的 provider 路径参数与目录条目的 provider 字段都引用同一个 schema,这正是让列表中的 ID 与可接受的 ID 保持一致、不会发生偏移的原因。类型:RouterProviderSegment,字母数字 slug,例如 anthropic,最多 64 个字符RouterModelSegment
必填
规范
{provider}/{model} 模型 ID 中的小写 model 段,即在该提供商下要运行的模型。调用路由的 model 路径参数与目录条目的 model 字段共享它,原因与 RouterProviderSegment 相同,都是为了避免发生偏移。类型:RouterModelSegment,字母数字 slug,例如 claude-opus-4-6,最多 128 个字符RouterModelBilling
必填
调用方在调用之前需要了解的各模型计费信息,而非价格。使用量和费用数字绝不会出现在这里。类型:
RouterModelBillingRouterModelListResponse
Router 模型目录的一页。 字段array of RouterModelListEntry
必填
本页的模型,最多
limit 个。类型:由 RouterModelListEntry 组成的数组boolean
必填
本页之后是否还存在另一页。只要该值为 true 就继续遍历;不要因为
data 较短或为空就推断目录已到末尾。RouterPageCursor
指向 Router 列表的不透明游标。它由服务器生成,并且只能原样往返传递:它不是偏移量,不是模型 ID,没有顺序,也不跨目录重建保持稳定,因此解析它、对它自增,或在其所属的那次遍历之外持久化它,都超出了约定范围。之所以使用游标而不是偏移量,是因为目录是一个不断变化的列表:当遍历过程中有条目被添加或删除时,基于偏移量的遍历会静默跳过或重复条目,而调用方无法察觉这种情况的发生。类型:
RouterPageCursor,即作为 next_cursor 返回的不透明游标,1–512 个字符integer
必填
实际提供的页大小。请求的
limit 若超过上限会被钳制到上限,而不是被拒绝,因此该值可能小于请求值。请用这个数字分页,而不是你发送的那个数字,否则你会误以为收到了从未返回的行。1–100RouterModelOutput
模型结果对象。请阅读已选择模型的输出 schema,以了解其确切形状。 类型:object
RouterModelSegment
{provider}/{model} 模型 ID 中的模型部分。
类型:string。字母数字 slug,例如 claude-opus-4-6,最多 128 个字符
RouterPageCursor
不透明的目录游标。请原样传回作为cursor。
类型:string — 不透明游标,作为 next_cursor 返回,1–512 个字符
RouterProviderSegment
{provider}/{model} 模型 ID 中的提供商部分。
类型:string,由字母数字组成的 slug,例如 anthropic,最多 64 个字符
RouterQueueCancelResponse
对取消请求的应答,覆盖描述此路由已处理的请求的两种状态:202 和 400。两者共用一个响应体形状,而不是成功信封加错误信封,因为二者表达的是同一个陈述,即取消操作发现了什么;而一个必须按状态码解析不同类型的客户端,从这种拆分中得不到任何好处。
字段
RouterQueueRequestId
必填
单个排队 Router 请求的标识符,即调用方用于轮询、取消和收集结果的句柄。类型:
RouterQueueRequestId,pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$、uuid、最多 36 个字符RouterQueueCancelStatus
必填
取消请求所发现的内容,对应描述此路由实际处理的请求的两种结果。两者都由 HTTP 状态码体现,因此客户端可以基于任一者进行分支。类型:
RouterQueueCancelStatusRouterQueueCancelStatus
取消请求所查找到的结果,适用于描述此路由实际已解析的请求的两种结果。两者都会由 HTTP 状态码反映,因此客户端可以基于其中任一进行分支判断。 类型:string
RouterQueuePosition
在响应生成的那一刻,队列中有多少个请求排在此请求之前。零表示此请求位于队首。 类型:integer,至少为 0
RouterQueueRequestId
一个排队中的 Router 请求的标识符,即调用方用于轮询、取消并收集结果的句柄。 类型: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 请求的状态。它恰好有三个取值,而且与RouterErrorType 不同,这一个确实是封闭的 enum,因为这两个 schema 是有意朝相反方向封闭的。RouterErrorType 用于对失败进行分类,其取值集合预期会不断增长,因此一个硬性拒绝无法识别类别的已生成客户端,恰恰会在已经出错的时候失败得最为严重。而这一项描述的是生命周期,日后若新增第四种状态,对每一个针对它编写的轮询循环而言都是破坏性变更,无论它是否被声明为 enum。因此它被声明为 enum,并且把这一约束写在了客户端能够看到的地方。
类型:string
RouterQueueStatusFields
RouterQueueStatusResponse 中不属于 URL 块的那一半:一个排队请求的身份标识、它当前的状态,以及(当该状态为终端且运行未成功时)说明原因的粗粒度分类桶。
字段
RouterQueueRequestId
必填
标识一个排队的 Router 请求,也就是调用方用于轮询、取消并获取结果的句柄。类型:
RouterQueueRequestId — 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 请求的状态。它恰好有三个取值,而且与
RouterErrorType 不同,它确实是一个封闭的 enum,因为这两个 schema 是有意朝相反方向封闭的。RouterErrorType 用于对失败进行分类,其取值集合预期会增长,因此一个会硬性拒绝无法识别分类桶的生成客户端,恰恰会在已经出错的时候失败得最严重。而这个是生命周期,日后为其新增第四个状态,对所有针对它编写的轮询循环来说都是破坏性变更,无论它是否被声明为 enum 都是如此;所以就把它声明为 enum,并把这一约束写在客户端能看到的地方。类型:RouterQueueStatusRouterQueuePosition
在响应被组合出来的那一刻,队列中排在该请求之前的请求数量。为零表示该请求位于队首。类型:
RouterQueuePosition — 至少 0RouterErrorType
仅出现在未成功的
COMPLETED 请求上,携带的是与结果读取在返回该失败时放在 X-Comfy-Error-Type 上的同一个粗粒度分类桶。它用于区分成功的终端请求与失败或被取消的终端请求:这两种情况都没有单独的终端状态。成功时它是缺失的,而不是 null,因此请依据其是否存在来分支判断。类型:RouterErrorTypeRouterQueueStatusResponse
单个排队中请求的当前状态,由提交时返回的同样三个 URL 组合而成。 组合了RouterQueueUrls 和 RouterQueueStatusFields。
类型:object
RouterQueueSubmitFields
RouterQueueSubmitResponse 中不属于 URL 块的那一半:新请求的身份标识,以及它被接纳那一刻的状态。
字段
RouterQueueRequestId
必填
一个已排队的 Router 请求的标识符:调用方据此轮询、取消并获取结果的句柄。类型:
RouterQueueRequestId — 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 请求的状态。它恰好有三个取值,而且与
RouterErrorType 不同,这个确实是封闭的 enum,因为这两个 schema 是有意朝相反方向封闭的。RouterErrorType 用于对失败进行分类,其取值集合预计会增长,因此,如果生成的客户端硬性拒绝一个无法识别的分类,那么它恰恰会在已经出错的时候失败得最严重。而这个描述的是生命周期,对一个生命周期而言,日后新增第四种状态,对所有针对它编写的轮询循环来说都是破坏性变更,无论它是否被声明为 enum 都一样。所以这里将其声明为 enum,并把该约束写在客户端能看到的地方。类型:RouterQueueStatusRouterQueuePosition
在响应生成的那一刻,队列中排在此请求前面的请求数量。零表示此请求位于最前面。类型:
RouterQueuePosition — 至少为 0RouterQueueSubmitResponse
当一次运行被准入队列时返回的句柄:包含请求的身份与状态,并组合了用于访问其生命周期其余部分的三个 URL。 组合了RouterQueueUrls、RouterQueueSubmitFields。
类型:object
RouterQueueUrls
用于处理某个已排队请求生命周期其余部分的三个 URL。每个携带活动句柄的响应都会返回这三个 URL,因此客户端永远不需要自行拼接队列 URL。 字段string
必填
读取此请求状态的绝对 URL。URI
string
必填
收集此请求结果的绝对 URL。URI
string
必填
请求取消此请求的绝对 URL。URI
RouterValidationErrorContext
提供商提供的、关于未通过的验证规则的详情。 类型:object
RouterValidationErrorDetail
单个字段级验证失败。 字段array of any
必填
出错字段的路径,最外层片段在前。例如
["body", "image_url"],或 ["body", "images", 0],其中整数表示数组中的索引。string
必填
对这一单个失败的人类可读描述。
string
必填
该失败具体且机器可读的原因,由提供商原样透传。类型化 SDK 异常层级正是依据此值进行分支判断;响应头中的
error_type 只是它粗粒度的归类。RouterValidationErrorContext
单个
RouterValidationErrorDetail 所违反的界限,由提供商逐字携带。例如 {"limit_value": 8} 搭配 greater_than,{"min_width": 512} 搭配 image_too_small,或 {"max_size_bytes": 10485760} 搭配 file_too_large。其键集合特定于提供商与错误类型,因此这里刻意保持为开放对象:将其收窄为固定字段列表,或把它并入 msg 字符串,正是移植集成后能够编译通过、却悄无声息地丢失读取该界限分支的原因。当错误类型不携带界限时此项缺省。类型:RouterValidationErrorContextRouterValidationErrorInput
出错的输入值,原样回显,让调用方无需从
loc 重新推导就能看到被拒绝的内容。可为任意 JSON 类型:字符串、数字、布尔、数组、对象或 null,因此该 schema 刻意不做类型约束,而不是收窄为对象。当提供商不回显输入时此项缺省。类型:RouterValidationErrorInputRouterValidationErrorInput
当提供商包含该值时,即为被拒绝的输入值。RouterValidationErrorResponse
422 验证错误响应体。读取 X-Comfy-Error-Type 以了解其类别。
字段
array of RouterValidationErrorDetail
必填
请求中发现的每一处验证失败,每个出错的字段对应一个条目。类型:
RouterValidationErrorDetail 数组