diff --git a/development/comfy-router/limitations.mdx b/development/comfy-router/limitations.mdx index 96b10b3ad..06e1e332f 100644 --- a/development/comfy-router/limitations.mdx +++ b/development/comfy-router/limitations.mdx @@ -4,24 +4,28 @@ sidebarTitle: "Capabilities and limits" description: "Choose Router or a partner proxy, plan for long-running calls, and understand recovery, rate limits, and asset storage." --- -Router supports synchronous and queued delivery. Synchronous delivery returns the finished result in one response. Queued delivery returns a request handle and is rolling out by workspace. +Router runs a partner model through one synchronous HTTP call or, in a gated preview, through a queued request that you submit and collect later. Use it when your application can wait for a finished result or collect one later, and can handle the model's own input and output fields. ## What Router supports | Requirement | Router support | Alternative or next step | | --- | --- | --- | | Generate with one request | `POST /v2/models/{provider}/{model}` returns the finished result. | Start with the [Quickstart](/development/comfy-router/quickstart). | -| Submit a request and collect it later | Supported through `POST /v2/models/{provider}/{model}/requests` and rolling out by workspace. | See [Queued delivery](/development/comfy-router/queue). | -| Show progress or stream output | Queued delivery reports queue state and can include queue position, but no percentage progress, streaming output, or preview frames. | Poll the returned `status_url`, or use a supported proxy operation for provider-specific progress. | -| Recover after a lost connection | After receiving a queued request handle, use its returned URLs. If submission is interrupted before that, retry with the same idempotency key. Synchronous calls can sometimes be collected the same way. | Preserve the idempotency key and follow [retry guidance](/development/comfy-router/api#retry-outcomes). | +| Submit a job and collect it later | Queued delivery, in a gated preview: `POST /v2/models/{provider}/{model}/requests` returns a `request_id` to poll and collect. No completion webhook. | Use [queued delivery](/development/comfy-router/queue) where it is enabled; otherwise run Router from a worker, or use a partner proxy with submit-and-poll operations. | +| Show progress or stream output | No live progress, streaming, or preview frames during the call. | Show an indeterminate state, or use a supported proxy operation. | +| Recover after a lost connection | Same-key collection is available when Router retained a handle to an accepted generation. | Preserve the key and follow [retry guidance](/development/comfy-router/api#retry-outcomes). | | Reconcile Comfy charges | No universal Comfy cost or credit-balance field on the response. | Use [workspace billing](https://platform.comfy.org). | | Store results permanently | Asset URLs can expire, including rehosted and replayed URLs. | Download the assets; see [result assets](/development/comfy-router/reference#result-assets). | -## Queued delivery availability + -Queued delivery returns a `request_id` and URLs for status, result collection, and cancellation. It is rolling out by workspace; workspaces without access receive `403` with `not_enabled`. Cancellation is best effort, and Router does not provide a completion webhook. See [Queued delivery](/development/comfy-router/queue) for examples and the full lifecycle. +## Queued submission is a gated preview -## Synchronous calls are cut off at a server deadline +Router holds the connection while the model runs. For asynchronous providers, it submits the job and polls internally. Queued delivery (submit, get a `request_id`, poll, collect) is in a gated preview: see [Queued delivery](/development/comfy-router/queue). It is scoped to the workspace behind the credential, so it needs a key created in your Comfy workspace and a workspace that is enabled; otherwise the submit route answers `403` with `not_enabled`. Outside the preview, Router does not expose a job ID, status endpoint, callback, or webhook. + +If your request cannot stay open long enough, call Router from a worker and track the job in your application. Use a [partner proxy](#router-does-not-cover-every-partner-operation) when you need the provider's submit-and-poll controls. + +## Calls are cut off at a server deadline Router's default deadline is **10 minutes**, configurable by the deployment. Set your client timeout above it so Router can return its error and request ID first. @@ -46,11 +50,11 @@ The request-rate limit applies to invocation and catalog/schema reads, including Cache catalog and schema reads. Revalidate schemas with `ETag` and `If-None-Match`. See [Headers](/development/comfy-router/headers) for retry and committed-spend fields. -## No live progress while a request runs +## No progress while a call runs -Synchronous delivery returns only the final response. Queued delivery exposes queue state and can include queue position, but neither mode provides streamed tokens, server-sent events, percentage updates, or intermediate preview frames. A provider's internal progress is not forwarded. +Router returns a final response, with no streamed tokens, server-sent events, percentage updates, or intermediate preview frames. A provider's internal polling state is not forwarded during the request. -Show an indeterminate progress indicator after a queued request begins running. If you need provider-specific progress or streaming, use a partner-proxy operation that exposes it. +Show an indeterminate progress indicator. If you need progress or streaming, use a partner-proxy operation that exposes it. diff --git a/development/comfy-router/models.mdx b/development/comfy-router/models.mdx index 75bc3dd27..d37a89958 100644 --- a/development/comfy-router/models.mdx +++ b/development/comfy-router/models.mdx @@ -65,13 +65,9 @@ Every model below is served by the same route, `POST /v2/models/{provider}/{mode - [Seed 2.0 Pro 260328](/development/comfy-router/models/byteplus/seed-2-0-pro-260328/code): `byteplus/seed-2-0-pro-260328` - [Seed Audio 1.0 Multilingual](/development/comfy-router/models/byteplus/seed-audio-1-0-multilingual/code): `byteplus/seed-audio-1.0-multilingual` - [Seed Audio 1.0](/development/comfy-router/models/byteplus/seed-audio-1-0/code): `byteplus/seed-audio-1.0` -- [Seedance 1.0 Lite I2V 250428](/development/comfy-router/models/byteplus/seedance-1-0-lite-i2v-250428/code): `byteplus/seedance-1-0-lite-i2v-250428` -- [Seedance 1.0 Lite T2V 250428](/development/comfy-router/models/byteplus/seedance-1-0-lite-t2v-250428/code): `byteplus/seedance-1-0-lite-t2v-250428` - [Seedance 1.0 Pro 250528](/development/comfy-router/models/byteplus/seedance-1-0-pro-250528/code): `byteplus/seedance-1-0-pro-250528` - [Seedance 1.0 Pro Fast 251015](/development/comfy-router/models/byteplus/seedance-1-0-pro-fast-251015/code): `byteplus/seedance-1-0-pro-fast-251015` - [Seedance 1.5 Pro 251215](/development/comfy-router/models/byteplus/seedance-1-5-pro-251215/code): `byteplus/seedance-1-5-pro-251215` -- [Seededit 3.0 I2I 250628](/development/comfy-router/models/byteplus/seededit-3-0-i2i-250628/code): `byteplus/seededit-3-0-i2i-250628` -- [Seedream 3.0 T2I 250415](/development/comfy-router/models/byteplus/seedream-3-0-t2i-250415/code): `byteplus/seedream-3-0-t2i-250415` - [Seedream 4.0 250828](/development/comfy-router/models/byteplus/seedream-4-0-250828/code): `byteplus/seedream-4-0-250828` - [Seedream 4.5 251128](/development/comfy-router/models/byteplus/seedream-4-5-251128/code): `byteplus/seedream-4-5-251128` - [Seedream 5.0 260128](/development/comfy-router/models/byteplus/seedream-5-0-260128/code): `byteplus/seedream-5-0-260128` diff --git a/development/comfy-router/models/byteplus/dreamina-seedance-2-0-260128/code.mdx b/development/comfy-router/models/byteplus/dreamina-seedance-2-0-260128/code.mdx index 6bfa06c76..04fffd7e9 100644 --- a/development/comfy-router/models/byteplus/dreamina-seedance-2-0-260128/code.mdx +++ b/development/comfy-router/models/byteplus/dreamina-seedance-2-0-260128/code.mdx @@ -258,7 +258,7 @@ false: The model outputs a silent video. - The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. + The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. @@ -411,8 +411,8 @@ Generated from the schema Router serves at `GET /v2/models/byteplus/dreamina-see ```json { "content": { - "last_frame_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame", - "video_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4" + "last_frame_url": "https://example.invalid/byteplus/seedance-1-0-pro-250528/last-frame", + "video_url": "https://example.invalid/byteplus/seedance-1-0-pro-250528/generated.mp4" }, "created_at": 1767225600, "duration": 5, diff --git a/development/comfy-router/models/byteplus/dreamina-seedance-2-0-fast-260128/code.mdx b/development/comfy-router/models/byteplus/dreamina-seedance-2-0-fast-260128/code.mdx index 5815b55ef..e3e05cf4c 100644 --- a/development/comfy-router/models/byteplus/dreamina-seedance-2-0-fast-260128/code.mdx +++ b/development/comfy-router/models/byteplus/dreamina-seedance-2-0-fast-260128/code.mdx @@ -258,7 +258,7 @@ false: The model outputs a silent video. - The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. + The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. @@ -411,8 +411,8 @@ Generated from the schema Router serves at `GET /v2/models/byteplus/dreamina-see ```json { "content": { - "last_frame_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame", - "video_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4" + "last_frame_url": "https://example.invalid/byteplus/seedance-1-0-pro-250528/last-frame", + "video_url": "https://example.invalid/byteplus/seedance-1-0-pro-250528/generated.mp4" }, "created_at": 1767225600, "duration": 5, diff --git a/development/comfy-router/models/byteplus/dreamina-seedance-2-0-mini/code.mdx b/development/comfy-router/models/byteplus/dreamina-seedance-2-0-mini/code.mdx index aa3541d23..6bd5fe425 100644 --- a/development/comfy-router/models/byteplus/dreamina-seedance-2-0-mini/code.mdx +++ b/development/comfy-router/models/byteplus/dreamina-seedance-2-0-mini/code.mdx @@ -258,7 +258,7 @@ false: The model outputs a silent video. - The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. + The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. @@ -411,8 +411,8 @@ Generated from the schema Router serves at `GET /v2/models/byteplus/dreamina-see ```json { "content": { - "last_frame_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame", - "video_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4" + "last_frame_url": "https://example.invalid/byteplus/seedance-1-0-pro-250528/last-frame", + "video_url": "https://example.invalid/byteplus/seedance-1-0-pro-250528/generated.mp4" }, "created_at": 1767225600, "duration": 5, diff --git a/development/comfy-router/models/byteplus/dreamina-seedance-2-5-260628/code.mdx b/development/comfy-router/models/byteplus/dreamina-seedance-2-5-260628/code.mdx index 1711969de..6076ccaf1 100644 --- a/development/comfy-router/models/byteplus/dreamina-seedance-2-5-260628/code.mdx +++ b/development/comfy-router/models/byteplus/dreamina-seedance-2-5-260628/code.mdx @@ -258,7 +258,7 @@ false: The model outputs a silent video. - The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. + The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. @@ -411,8 +411,8 @@ Generated from the schema Router serves at `GET /v2/models/byteplus/dreamina-see ```json { "content": { - "last_frame_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame", - "video_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4" + "last_frame_url": "https://example.invalid/byteplus/seedance-1-0-pro-250528/last-frame", + "video_url": "https://example.invalid/byteplus/seedance-1-0-pro-250528/generated.mp4" }, "created_at": 1767225600, "duration": 5, diff --git a/development/comfy-router/models/byteplus/seedance-1-0-lite-i2v-250428/code.mdx b/development/comfy-router/models/byteplus/seedance-1-0-lite-i2v-250428/code.mdx deleted file mode 100644 index 01f1798d8..000000000 --- a/development/comfy-router/models/byteplus/seedance-1-0-lite-i2v-250428/code.mdx +++ /dev/null @@ -1,431 +0,0 @@ ---- -title: "Use Seedance 1.0 Lite I2V 250428 with Comfy Router" -description: "Call byteplus/seedance-1-0-lite-i2v-250428 through Comfy Router: endpoint, request shape and the response Router returns." -sidebarTitle: "Seedance 1.0 Lite I2V 250428" ---- - -{/* GENERATED FILE. Generated from router-schemas/byteplus/seedance-1-0-lite-i2v-250428.json by `pnpm code-pages:gen`. */} - -import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; - -API Reference for `byteplus/seedance-1-0-lite-i2v-250428`, served by Comfy Router from BytePlus. - -## Quick start - -Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-keys) and export it as `COMFY_API_KEY`. The Python and TypeScript snippets use the Comfy SDKs (`pip install comfy-sdk`, `npm install @comfyorg/sdk`); the cURL snippet is the same call over raw HTTP. - -**Model ID:** `byteplus/seedance-1-0-lite-i2v-250428` - -**Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seedance-1-0-lite-i2v-250428` - - - - -```python Python -from comfy_sdk import Comfy - -# Reads COMFY_API_KEY from the environment. -# The SDK automatically creates an idempotency key and reuses it for automatic retries. -with Comfy() as client: - result = client.models.run( - "byteplus/seedance-1-0-lite-i2v-250428", - { - "content": [ - { - "text": "A red fox trotting through a snowy pine forest", - "type": "text", - }, - ], - "duration": 5, - "ratio": "16:9", - "resolution": "720p", - }, - ) - -print(result) -``` - -```typescript TypeScript -import { comfy } from "@comfyorg/sdk"; - -// Reads COMFY_API_KEY from the environment. -// The SDK automatically creates an idempotency key and reuses it for automatic retries. -const { data } = await comfy.models.run("byteplus/seedance-1-0-lite-i2v-250428", { - content: [ - { - text: "A red fox trotting through a snowy pine forest", - type: "text", - }, - ], - duration: 5, - ratio: "16:9", - resolution: "720p", -}); - -console.log(data); -``` - -```bash cURL -curl https://api.comfy.org/v2/models/byteplus/seedance-1-0-lite-i2v-250428 \ - -H "X-API-Key: $COMFY_API_KEY" \ - -H "Idempotency-Key: $(uuidgen)" \ - -H "Content-Type: application/json" \ - -d "{\"content\": [{\"text\":\"A red fox trotting through a snowy pine forest\",\"type\":\"text\"}], \"duration\": 5, \"ratio\": \"16:9\", \"resolution\": \"720p\"}" -``` - - - -The same body, sent to `POST https://api.comfy.org/v2/models/byteplus/seedance-1-0-lite-i2v-250428/requests`. Router answers `201` with a `request_id` as soon as the run is admitted, and the result is collected once it is ready, from this process or another one. [Queued delivery](/development/comfy-router/queue) walks through status, cancellation and collection. - - -```python Python -from comfy_sdk import Comfy - -# Reads COMFY_API_KEY from the environment. -# Each submit() call mints its own Idempotency-Key and reuses it for automatic retries. -with Comfy() as client: - handle = client.models.submit( - "byteplus/seedance-1-0-lite-i2v-250428", - { - "content": [ - { - "text": "A red fox trotting through a snowy pine forest", - "type": "text", - }, - ], - "duration": 5, - "ratio": "16:9", - "resolution": "720p", - }, - ) - print("request_id:", handle.request_id) # with the model ID, all another process needs - - # Poll until the request completes, waiting the Retry-After the server names. - for update in handle.iter_events(): - print(update.status, update.queue_position) - - # The provider's own payload, the same value models.run() returns. - # A request that failed or was cancelled raises the typed Router error here. - result = handle.get() - -print(result) -``` - -```typescript TypeScript -import { comfy } from "@comfyorg/sdk"; - -// Reads COMFY_API_KEY from the environment. -// Each submit() call mints its own Idempotency-Key and reuses it for automatic retries. -const handle = await comfy.models.submit("byteplus/seedance-1-0-lite-i2v-250428", { - content: [ - { - text: "A red fox trotting through a snowy pine forest", - type: "text", - }, - ], - duration: 5, - ratio: "16:9", - resolution: "720p", -}); -console.log("requestId:", handle.requestId); // with the model ID, all another process needs - -// Poll until the request completes, waiting the Retry-After the server names. -for await (const update of handle.events()) { - console.log(update.status, update.queuePosition); -} - -// The same result models.run() returns. A request that failed or was cancelled rejects here. -const result = await handle.get(); - -console.log(result.data); -``` - -```bash cURL -# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. -curl https://api.comfy.org/v2/models/byteplus/seedance-1-0-lite-i2v-250428/requests \ - -H "X-API-Key: $COMFY_API_KEY" \ - -H "Idempotency-Key: $(uuidgen)" \ - -H "Content-Type: application/json" \ - -d "{\"content\": [{\"text\":\"A red fox trotting through a snowy pine forest\",\"type\":\"text\"}], \"duration\": 5, \"ratio\": \"16:9\", \"resolution\": \"720p\"}" - -# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. -REQUEST_ID="" -curl -i https://api.comfy.org/v2/models/byteplus/seedance-1-0-lite-i2v-250428/requests/$REQUEST_ID/status \ - -H "X-API-Key: $COMFY_API_KEY" - -# 3. Collect. 200 with the model's native output, 202 with the status body while it is still running. -curl https://api.comfy.org/v2/models/byteplus/seedance-1-0-lite-i2v-250428/requests/$REQUEST_ID \ - -H "X-API-Key: $COMFY_API_KEY" -``` - - - - -## Schema - -### Input - - - Callback notification address for the result of this generation task - - Format: `uri` - - - - The input content for the model to generate a video - - - - Input audio object. Only Seedance 2.5, 2.0 & 2.0 fast support audio input. Seedance 2.0 & 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input. - - - - Audio URL, Base64 encoding, or Asset ID. -Audio URL: Public URL of the audio (wav, mp3). -Base64: Format data:audio/\;base64,\ -Asset ID: Format asset://\ - - - - - - - - Image content for image-to-video generation (when type is "image_url") -Image URL: Make sure that the image URL is accessible. -Base64-encoded content: Format must be data:image/\;base64,\ -Asset ID: Format asset://\ - - - - The role/position of the content item. -For images: first_frame, last_frame, or reference_image. -For videos: reference_video (Seedance 2.5, 2.0 & 2.0 fast only). -For audio: reference_audio (Seedance 2.5, 2.0 & 2.0 fast only). - - Possible values: `first_frame`, `last_frame`, `reference_image`, `reference_video`, `reference_audio` - - - - The input text information for the model. Includes text prompt and optional parameters. - -Text prompt (required): Description of the video to be generated using Chinese and English characters. - -Parameters (optional): Add --[parameters] after the text prompt to control video specifications: -- --resolution (--rs): 480p, 720p, 1080p (default: 720p) -- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive) -- --duration (--dur): 3-12 seconds (default: 5) -- --framepersecond (--fps): 24 (default: 24) -- --watermark (--wm): true/false (default: false) -- --seed (--seed): -1 to 2^32-1 (default: -1) -- --camerafixed (--cf): true/false (default: false) - -Example: "A beautiful landscape --ratio 16:9 --resolution 720p --duration 5" - - - - The type of the input content - - Possible values: `text`, `image_url`, `video_url`, `audio_url` - - - - Input video object. Only Seedance 2.5, 2.0 & 2.0 fast support video input. - - - - Video URL or Asset ID. -Video URL: Public URL of the video (mp4, mov). -Asset ID: Format asset://\ - - - - Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 & 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12]. - - Range: `2` to `30` - - - - Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200]. - - Range: `3600` to `259200` - - - - Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals. -true: The model outputs a video with synchronized audio. -false: The model outputs a silent video. - - - - The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. - - - - Seedance 2.5 only. Container format of the output video. -mp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size. -mov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size. - - Possible values: `mp4`, `mov` - - - - Aspect ratio of the generated video. Seedance 2.0 & 2.0 fast, 1.5 pro default: adaptive. - - Possible values: `16:9`, `4:3`, `1:1`, `3:4`, `9:16`, `21:9`, `9:21`, `adaptive` - - - - Video resolution. Seedance 2.5, 2.0 & 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro & pro-fast default: 1080p. -Note: Seedance 2.0 & 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p. - - Possible values: `480p`, `720p`, `1080p`, `4k` - - - - Whether to return the last frame image of the generated video. -true: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos. -false: Does not return the last frame image of the generated video. - - - - Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed. - - Range: `-1` to `4294967295` - - - - Service tier for processing. Seedance 2.5, 2.0 & 2.0 fast do not support flex (offline inference). - - Possible values: `default`, `flex` - - - - Whether the generated video includes a watermark. - - -Generated from the schema Router serves at `GET /v2/models/byteplus/seedance-1-0-lite-i2v-250428/openapi.json`, the same document it validates a call against before the request reaches the provider. - -### Output - - - The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null. - - - - Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL. - - - - Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present. - - - - Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL. - - - - The time when the task was created. The value is a UNIX timestamp in seconds. - - - - The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged. - - - - The error information. If the task succeeds, null is returned. If the task fails, the error information is returned. - - - - The error code - - - - The error message - - - - The ID of the video generation task - - - - The name and version of the model used by the task - - - - Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged. - - - - The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged. - - - - The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged. - - Format: `int64` - - - - The state of the task - - Possible values: `queued`, `running`, `cancelled`, `succeeded`, `failed`, `expired` - - - - The time when the task was last updated. The value is a UNIX timestamp in seconds. - - - - The token usage for the request - - - - The number of tokens generated by the model - - - - For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens. - - -## Examples - -### Input - -```json -{ - "content": [ - { - "text": "A red fox trotting through a snowy pine forest", - "type": "text" - } - ], - "duration": 5, - "ratio": "16:9", - "resolution": "720p" -} -``` - -### Output - -```json -{ - "content": { - "last_frame_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame", - "video_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4" - }, - "created_at": 1767225600, - "duration": 5, - "error": null, - "id": "3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60", - "model": "seedance-1-0-lite-i2v-250428", - "output_format": "mp4", - "resolution": "1080p", - "seed": 1234567890123, - "status": "succeeded", - "updated_at": 1767225730 -} -``` - - - diff --git a/development/comfy-router/models/byteplus/seedance-1-0-lite-t2v-250428/code.mdx b/development/comfy-router/models/byteplus/seedance-1-0-lite-t2v-250428/code.mdx deleted file mode 100644 index 36242d75a..000000000 --- a/development/comfy-router/models/byteplus/seedance-1-0-lite-t2v-250428/code.mdx +++ /dev/null @@ -1,431 +0,0 @@ ---- -title: "Use Seedance 1.0 Lite T2V 250428 with Comfy Router" -description: "Call byteplus/seedance-1-0-lite-t2v-250428 through Comfy Router: endpoint, request shape and the response Router returns." -sidebarTitle: "Seedance 1.0 Lite T2V 250428" ---- - -{/* GENERATED FILE. Generated from router-schemas/byteplus/seedance-1-0-lite-t2v-250428.json by `pnpm code-pages:gen`. */} - -import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; - -API Reference for `byteplus/seedance-1-0-lite-t2v-250428`, served by Comfy Router from BytePlus. - -## Quick start - -Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-keys) and export it as `COMFY_API_KEY`. The Python and TypeScript snippets use the Comfy SDKs (`pip install comfy-sdk`, `npm install @comfyorg/sdk`); the cURL snippet is the same call over raw HTTP. - -**Model ID:** `byteplus/seedance-1-0-lite-t2v-250428` - -**Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seedance-1-0-lite-t2v-250428` - - - - -```python Python -from comfy_sdk import Comfy - -# Reads COMFY_API_KEY from the environment. -# The SDK automatically creates an idempotency key and reuses it for automatic retries. -with Comfy() as client: - result = client.models.run( - "byteplus/seedance-1-0-lite-t2v-250428", - { - "content": [ - { - "text": "A red fox trotting through a snowy pine forest", - "type": "text", - }, - ], - "duration": 5, - "ratio": "16:9", - "resolution": "720p", - }, - ) - -print(result) -``` - -```typescript TypeScript -import { comfy } from "@comfyorg/sdk"; - -// Reads COMFY_API_KEY from the environment. -// The SDK automatically creates an idempotency key and reuses it for automatic retries. -const { data } = await comfy.models.run("byteplus/seedance-1-0-lite-t2v-250428", { - content: [ - { - text: "A red fox trotting through a snowy pine forest", - type: "text", - }, - ], - duration: 5, - ratio: "16:9", - resolution: "720p", -}); - -console.log(data); -``` - -```bash cURL -curl https://api.comfy.org/v2/models/byteplus/seedance-1-0-lite-t2v-250428 \ - -H "X-API-Key: $COMFY_API_KEY" \ - -H "Idempotency-Key: $(uuidgen)" \ - -H "Content-Type: application/json" \ - -d "{\"content\": [{\"text\":\"A red fox trotting through a snowy pine forest\",\"type\":\"text\"}], \"duration\": 5, \"ratio\": \"16:9\", \"resolution\": \"720p\"}" -``` - - - -The same body, sent to `POST https://api.comfy.org/v2/models/byteplus/seedance-1-0-lite-t2v-250428/requests`. Router answers `201` with a `request_id` as soon as the run is admitted, and the result is collected once it is ready, from this process or another one. [Queued delivery](/development/comfy-router/queue) walks through status, cancellation and collection. - - -```python Python -from comfy_sdk import Comfy - -# Reads COMFY_API_KEY from the environment. -# Each submit() call mints its own Idempotency-Key and reuses it for automatic retries. -with Comfy() as client: - handle = client.models.submit( - "byteplus/seedance-1-0-lite-t2v-250428", - { - "content": [ - { - "text": "A red fox trotting through a snowy pine forest", - "type": "text", - }, - ], - "duration": 5, - "ratio": "16:9", - "resolution": "720p", - }, - ) - print("request_id:", handle.request_id) # with the model ID, all another process needs - - # Poll until the request completes, waiting the Retry-After the server names. - for update in handle.iter_events(): - print(update.status, update.queue_position) - - # The provider's own payload, the same value models.run() returns. - # A request that failed or was cancelled raises the typed Router error here. - result = handle.get() - -print(result) -``` - -```typescript TypeScript -import { comfy } from "@comfyorg/sdk"; - -// Reads COMFY_API_KEY from the environment. -// Each submit() call mints its own Idempotency-Key and reuses it for automatic retries. -const handle = await comfy.models.submit("byteplus/seedance-1-0-lite-t2v-250428", { - content: [ - { - text: "A red fox trotting through a snowy pine forest", - type: "text", - }, - ], - duration: 5, - ratio: "16:9", - resolution: "720p", -}); -console.log("requestId:", handle.requestId); // with the model ID, all another process needs - -// Poll until the request completes, waiting the Retry-After the server names. -for await (const update of handle.events()) { - console.log(update.status, update.queuePosition); -} - -// The same result models.run() returns. A request that failed or was cancelled rejects here. -const result = await handle.get(); - -console.log(result.data); -``` - -```bash cURL -# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. -curl https://api.comfy.org/v2/models/byteplus/seedance-1-0-lite-t2v-250428/requests \ - -H "X-API-Key: $COMFY_API_KEY" \ - -H "Idempotency-Key: $(uuidgen)" \ - -H "Content-Type: application/json" \ - -d "{\"content\": [{\"text\":\"A red fox trotting through a snowy pine forest\",\"type\":\"text\"}], \"duration\": 5, \"ratio\": \"16:9\", \"resolution\": \"720p\"}" - -# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. -REQUEST_ID="" -curl -i https://api.comfy.org/v2/models/byteplus/seedance-1-0-lite-t2v-250428/requests/$REQUEST_ID/status \ - -H "X-API-Key: $COMFY_API_KEY" - -# 3. Collect. 200 with the model's native output, 202 with the status body while it is still running. -curl https://api.comfy.org/v2/models/byteplus/seedance-1-0-lite-t2v-250428/requests/$REQUEST_ID \ - -H "X-API-Key: $COMFY_API_KEY" -``` - - - - -## Schema - -### Input - - - Callback notification address for the result of this generation task - - Format: `uri` - - - - The input content for the model to generate a video - - - - Input audio object. Only Seedance 2.5, 2.0 & 2.0 fast support audio input. Seedance 2.0 & 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input. - - - - Audio URL, Base64 encoding, or Asset ID. -Audio URL: Public URL of the audio (wav, mp3). -Base64: Format data:audio/\;base64,\ -Asset ID: Format asset://\ - - - - - - - - Image content for image-to-video generation (when type is "image_url") -Image URL: Make sure that the image URL is accessible. -Base64-encoded content: Format must be data:image/\;base64,\ -Asset ID: Format asset://\ - - - - The role/position of the content item. -For images: first_frame, last_frame, or reference_image. -For videos: reference_video (Seedance 2.5, 2.0 & 2.0 fast only). -For audio: reference_audio (Seedance 2.5, 2.0 & 2.0 fast only). - - Possible values: `first_frame`, `last_frame`, `reference_image`, `reference_video`, `reference_audio` - - - - The input text information for the model. Includes text prompt and optional parameters. - -Text prompt (required): Description of the video to be generated using Chinese and English characters. - -Parameters (optional): Add --[parameters] after the text prompt to control video specifications: -- --resolution (--rs): 480p, 720p, 1080p (default: 720p) -- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive) -- --duration (--dur): 3-12 seconds (default: 5) -- --framepersecond (--fps): 24 (default: 24) -- --watermark (--wm): true/false (default: false) -- --seed (--seed): -1 to 2^32-1 (default: -1) -- --camerafixed (--cf): true/false (default: false) - -Example: "A beautiful landscape --ratio 16:9 --resolution 720p --duration 5" - - - - The type of the input content - - Possible values: `text`, `image_url`, `video_url`, `audio_url` - - - - Input video object. Only Seedance 2.5, 2.0 & 2.0 fast support video input. - - - - Video URL or Asset ID. -Video URL: Public URL of the video (mp4, mov). -Asset ID: Format asset://\ - - - - Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 & 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12]. - - Range: `2` to `30` - - - - Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200]. - - Range: `3600` to `259200` - - - - Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals. -true: The model outputs a video with synchronized audio. -false: The model outputs a silent video. - - - - The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. - - - - Seedance 2.5 only. Container format of the output video. -mp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size. -mov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size. - - Possible values: `mp4`, `mov` - - - - Aspect ratio of the generated video. Seedance 2.0 & 2.0 fast, 1.5 pro default: adaptive. - - Possible values: `16:9`, `4:3`, `1:1`, `3:4`, `9:16`, `21:9`, `9:21`, `adaptive` - - - - Video resolution. Seedance 2.5, 2.0 & 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro & pro-fast default: 1080p. -Note: Seedance 2.0 & 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p. - - Possible values: `480p`, `720p`, `1080p`, `4k` - - - - Whether to return the last frame image of the generated video. -true: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos. -false: Does not return the last frame image of the generated video. - - - - Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed. - - Range: `-1` to `4294967295` - - - - Service tier for processing. Seedance 2.5, 2.0 & 2.0 fast do not support flex (offline inference). - - Possible values: `default`, `flex` - - - - Whether the generated video includes a watermark. - - -Generated from the schema Router serves at `GET /v2/models/byteplus/seedance-1-0-lite-t2v-250428/openapi.json`, the same document it validates a call against before the request reaches the provider. - -### Output - - - The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null. - - - - Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL. - - - - Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present. - - - - Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL. - - - - The time when the task was created. The value is a UNIX timestamp in seconds. - - - - The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged. - - - - The error information. If the task succeeds, null is returned. If the task fails, the error information is returned. - - - - The error code - - - - The error message - - - - The ID of the video generation task - - - - The name and version of the model used by the task - - - - Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged. - - - - The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged. - - - - The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged. - - Format: `int64` - - - - The state of the task - - Possible values: `queued`, `running`, `cancelled`, `succeeded`, `failed`, `expired` - - - - The time when the task was last updated. The value is a UNIX timestamp in seconds. - - - - The token usage for the request - - - - The number of tokens generated by the model - - - - For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens. - - -## Examples - -### Input - -```json -{ - "content": [ - { - "text": "A red fox trotting through a snowy pine forest", - "type": "text" - } - ], - "duration": 5, - "ratio": "16:9", - "resolution": "720p" -} -``` - -### Output - -```json -{ - "content": { - "last_frame_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame", - "video_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4" - }, - "created_at": 1767225600, - "duration": 5, - "error": null, - "id": "3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60", - "model": "seedance-1-0-lite-t2v-250428", - "output_format": "mp4", - "resolution": "1080p", - "seed": 1234567890123, - "status": "succeeded", - "updated_at": 1767225730 -} -``` - - - diff --git a/development/comfy-router/models/byteplus/seedance-1-0-pro-250528/code.mdx b/development/comfy-router/models/byteplus/seedance-1-0-pro-250528/code.mdx index a7c42095f..460232c7f 100644 --- a/development/comfy-router/models/byteplus/seedance-1-0-pro-250528/code.mdx +++ b/development/comfy-router/models/byteplus/seedance-1-0-pro-250528/code.mdx @@ -258,7 +258,7 @@ false: The model outputs a silent video. - The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. + The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. @@ -411,8 +411,8 @@ Generated from the schema Router serves at `GET /v2/models/byteplus/seedance-1-0 ```json { "content": { - "last_frame_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame", - "video_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4" + "last_frame_url": "https://example.invalid/byteplus/seedance-1-0-pro-250528/last-frame", + "video_url": "https://example.invalid/byteplus/seedance-1-0-pro-250528/generated.mp4" }, "created_at": 1767225600, "duration": 5, diff --git a/development/comfy-router/models/byteplus/seedance-1-0-pro-fast-251015/code.mdx b/development/comfy-router/models/byteplus/seedance-1-0-pro-fast-251015/code.mdx index ecf1a5a05..c1a45d438 100644 --- a/development/comfy-router/models/byteplus/seedance-1-0-pro-fast-251015/code.mdx +++ b/development/comfy-router/models/byteplus/seedance-1-0-pro-fast-251015/code.mdx @@ -258,7 +258,7 @@ false: The model outputs a silent video. - The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. + The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. @@ -411,8 +411,8 @@ Generated from the schema Router serves at `GET /v2/models/byteplus/seedance-1-0 ```json { "content": { - "last_frame_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame", - "video_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4" + "last_frame_url": "https://example.invalid/byteplus/seedance-1-0-pro-250528/last-frame", + "video_url": "https://example.invalid/byteplus/seedance-1-0-pro-250528/generated.mp4" }, "created_at": 1767225600, "duration": 5, diff --git a/development/comfy-router/models/byteplus/seedance-1-5-pro-251215/code.mdx b/development/comfy-router/models/byteplus/seedance-1-5-pro-251215/code.mdx index c45d13c8e..40ec80a94 100644 --- a/development/comfy-router/models/byteplus/seedance-1-5-pro-251215/code.mdx +++ b/development/comfy-router/models/byteplus/seedance-1-5-pro-251215/code.mdx @@ -258,7 +258,7 @@ false: The model outputs a silent video. - The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. + The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. @@ -411,8 +411,8 @@ Generated from the schema Router serves at `GET /v2/models/byteplus/seedance-1-5 ```json { "content": { - "last_frame_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame", - "video_url": "https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4" + "last_frame_url": "https://example.invalid/byteplus/seedance-1-0-pro-250528/last-frame", + "video_url": "https://example.invalid/byteplus/seedance-1-0-pro-250528/generated.mp4" }, "created_at": 1767225600, "duration": 5, diff --git a/development/comfy-router/models/byteplus/seededit-3-0-i2i-250628/code.mdx b/development/comfy-router/models/byteplus/seededit-3-0-i2i-250628/code.mdx deleted file mode 100644 index 8871ac495..000000000 --- a/development/comfy-router/models/byteplus/seededit-3-0-i2i-250628/code.mdx +++ /dev/null @@ -1,386 +0,0 @@ ---- -title: "Use Seededit 3.0 I2I 250628 with Comfy Router" -description: "Call byteplus/seededit-3-0-i2i-250628 through Comfy Router: endpoint, request shape and the response Router returns." -sidebarTitle: "Seededit 3.0 I2I 250628" ---- - -{/* GENERATED FILE. Generated from router-schemas/byteplus/seededit-3-0-i2i-250628.json by `pnpm code-pages:gen`. */} - -import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; - -API Reference for `byteplus/seededit-3-0-i2i-250628`, served by Comfy Router from BytePlus. - -## Quick start - -Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-keys) and export it as `COMFY_API_KEY`. The Python and TypeScript snippets use the Comfy SDKs (`pip install comfy-sdk`, `npm install @comfyorg/sdk`); the cURL snippet is the same call over raw HTTP. - -**Model ID:** `byteplus/seededit-3-0-i2i-250628` - -**Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seededit-3-0-i2i-250628` - - - - -```python Python -from comfy_sdk import Comfy - -# Reads COMFY_API_KEY from the environment. -# The SDK automatically creates an idempotency key and reuses it for automatic retries. -with Comfy() as client: - result = client.models.run( - "byteplus/seededit-3-0-i2i-250628", - { - "prompt": "A red fox trotting through a snowy pine forest, cinematic lighting", - "response_format": "url", - "watermark": False, - }, - ) - -print(result) -``` - -```typescript TypeScript -import { comfy } from "@comfyorg/sdk"; - -// Reads COMFY_API_KEY from the environment. -// The SDK automatically creates an idempotency key and reuses it for automatic retries. -const { data } = await comfy.models.run("byteplus/seededit-3-0-i2i-250628", { - prompt: "A red fox trotting through a snowy pine forest, cinematic lighting", - response_format: "url", - watermark: false, -}); - -console.log(data); -``` - -```bash cURL -curl https://api.comfy.org/v2/models/byteplus/seededit-3-0-i2i-250628 \ - -H "X-API-Key: $COMFY_API_KEY" \ - -H "Idempotency-Key: $(uuidgen)" \ - -H "Content-Type: application/json" \ - -d "{\"prompt\": \"A red fox trotting through a snowy pine forest, cinematic lighting\", \"response_format\": \"url\", \"watermark\": false}" -``` - - - -The same body, sent to `POST https://api.comfy.org/v2/models/byteplus/seededit-3-0-i2i-250628/requests`. Router answers `201` with a `request_id` as soon as the run is admitted, and the result is collected once it is ready, from this process or another one. [Queued delivery](/development/comfy-router/queue) walks through status, cancellation and collection. - - -```python Python -from comfy_sdk import Comfy - -# Reads COMFY_API_KEY from the environment. -# Each submit() call mints its own Idempotency-Key and reuses it for automatic retries. -with Comfy() as client: - handle = client.models.submit( - "byteplus/seededit-3-0-i2i-250628", - { - "prompt": "A red fox trotting through a snowy pine forest, cinematic lighting", - "response_format": "url", - "watermark": False, - }, - ) - print("request_id:", handle.request_id) # with the model ID, all another process needs - - # Poll until the request completes, waiting the Retry-After the server names. - for update in handle.iter_events(): - print(update.status, update.queue_position) - - # The provider's own payload, the same value models.run() returns. - # A request that failed or was cancelled raises the typed Router error here. - result = handle.get() - -print(result) -``` - -```typescript TypeScript -import { comfy } from "@comfyorg/sdk"; - -// Reads COMFY_API_KEY from the environment. -// Each submit() call mints its own Idempotency-Key and reuses it for automatic retries. -const handle = await comfy.models.submit("byteplus/seededit-3-0-i2i-250628", { - prompt: "A red fox trotting through a snowy pine forest, cinematic lighting", - response_format: "url", - watermark: false, -}); -console.log("requestId:", handle.requestId); // with the model ID, all another process needs - -// Poll until the request completes, waiting the Retry-After the server names. -for await (const update of handle.events()) { - console.log(update.status, update.queuePosition); -} - -// The same result models.run() returns. A request that failed or was cancelled rejects here. -const result = await handle.get(); - -console.log(result.data); -``` - -```bash cURL -# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. -curl https://api.comfy.org/v2/models/byteplus/seededit-3-0-i2i-250628/requests \ - -H "X-API-Key: $COMFY_API_KEY" \ - -H "Idempotency-Key: $(uuidgen)" \ - -H "Content-Type: application/json" \ - -d "{\"prompt\": \"A red fox trotting through a snowy pine forest, cinematic lighting\", \"response_format\": \"url\", \"watermark\": false}" - -# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. -REQUEST_ID="" -curl -i https://api.comfy.org/v2/models/byteplus/seededit-3-0-i2i-250628/requests/$REQUEST_ID/status \ - -H "X-API-Key: $COMFY_API_KEY" - -# 3. Collect. 200 with the model's native output, 202 with the status body while it is still running. -curl https://api.comfy.org/v2/models/byteplus/seededit-3-0-i2i-250628/requests/$REQUEST_ID \ - -H "X-API-Key: $COMFY_API_KEY" -``` - - - - -## Schema - -### Input - - - Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Default 2.5 for seedream-3-0-t2i-250415 and 5.5 for seededit-3-0-i2i-250628. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0. - - Range: `1` to `10` - - Format: `float` - - - - Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0, and seededit-3.0-i2i support this parameter. - -Enter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example), while seededit-3.0-i2i only supports single-image input. - -• Image URL: Make sure that the image URL is accessible. -• Base64 encoding: The format must be data:image/\;base64,\. Note: \ must be in lowercase, e.g., data:image/png;base64,\. - -Comfy Router limits the entire JSON request to 10 MiB, including base64 expansion and all reference images. Use URLs for inputs that would exceed this transport limit. - -An input image must meet the following requirements: -• Image format: jpeg, png (seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 also support webp, bmp, tiff and gif; seedream-5.0-pro also supports heic and heif) -• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0; [1/3, 3] for seededit-3.0-i2i -• Width and height (px): > 14 -• Size: No more than 10 MB (30 MB for seedream-5.0-pro) -• Total pixels: No more than 6000x6000 (36,000,000 px) for seedream-5.0-pro -• Maximum of 14 reference images (10 for seedream-5.0-pro) - -In the layer-separation scenario (layer_decomposition enabled), image is required and only a single input image is supported (passing multiple images returns an error). Input images must be png, jpeg, webp, bmp, tiff or gif (heic and heif are not supported), up to 30 MB, with total pixels in the range [512x512, 6000x6000] and aspect ratio in [1/16, 16]. - - - - Controls whether layer separation is enabled. Only seedream-5.0-pro supports this parameter. -true: Layer-separation mode. The model decomposes the single input image into one base image plus multiple layers (up to 16), and returns the position and content information of each produced layer, including the stacking order (z_index), bounding box (bounding_box), name (name) and description (description). -false: Standard image-generation mode; no layer separation is performed. -Notes on layer-separation mode: only a single input image is supported (passing multiple images returns an error); if any single layer fails to generate, the whole request fails — partial success is not supported; at most 17 images are returned (1 base image + 16 layers). sequential_image_generation, sequential_image_generation_options, tools and stream return an error if passed. - - - - Model identifier. Supported models: seedream-3-0-t2i-250415, seededit-3-0-i2i-250628, seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. - - - - Configuration for prompt optimization feature. Only seedream-5.0-pro/5.0-lite/4.5 (only support standard mode) and seedream-4.0 support this parameter. - - - - Set the mode for the prompt optimization feature. standard = Higher quality, longer generation time. fast = Faster but at a more average quality. - - Possible values: `standard`, `fast` - - - - Specifies the format of the output image. Only seedream-5.0-pro and 5.0-lite support this parameter. In the layer-separation scenario, output_format only controls the format of the base image; every layer is always output as png. - - Possible values: `png`, `jpeg` - - - - Text description for image generation or transformation. -Optional in the layer-separation scenario (seedream-5.0-pro with layer_decomposition enabled): if a prompt is provided, the model recognizes and separates the elements you specify according to the prompt intent; if no prompt is provided, the model automatically detects all major elements in the image and separates them into independent layers. - - - - Specifies the format of the generated image returned in the response - - Possible values: `url`, `b64_json` - - - - Random seed to control the stochasticity of image generation. Range: [-1, 2147483647]. If not specified, a seed will be automatically generated. To reproduce the same output, use the same seed value. - - Range: `-1` to `2147483647` - - - - Controls whether to disable the batch generation feature. This parameter is only supported on seedream-5.0-lite, 4.5 and 4.0 (not supported by seedream-5.0-pro). Valid values: -auto: In automatic mode, the model automatically determines whether to return multiple images and how many images it will contain based on the user's prompt. -disabled: Disables batch generation feature. The model will only generate one image. - - Possible values: `auto`, `disabled` - - - - Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro). -Configuration for the batch image generation feature. This parameter is only effective when sequential_image_generation is set to auto. - - - - Specifies the maximum number of images to generate in this request. Number of input reference images + Number of generated images ≤ 15. - - Range: `1` to `15` - - - - "seedream-3-0-t2i-250415": Specifies the dimensions (width x height in pixels) of the generated image. Must be between [512x512, 2048x2048] -"seededit-3-0-i2i-250628": The width and height pixels of the generated image. Currently only supports adaptive. -"seedream-4-0-250828": Set the specification for the generated image. Two methods are available but cannot be used together. - Method 1 | Specify the resolution. Optional values: 1K, 2K, 4K - Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [1024x1024, 4096x4096], aspect ratio: [1/16, 16] -"seedream-4-5-251128": Two methods available. - Method 1 | Specify the resolution. Optional values: 2K, 4K - Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, 4096x4096], aspect ratio: [1/16, 16] -"seedream-5-0-260128": Two methods available. - Method 1 | Specify the resolution. Optional values: 2K, 3K - Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, ~3072x3072], aspect ratio: [1/16, 16] -"seedream-5-0-pro-260628": Two methods available (cannot be used together). - Method 1 | Specify the resolution and describe the aspect ratio, shape or purpose of the image in the prompt; the model decides the final size. Optional values: 1K, 2K - Method 2 | Specify width and height in pixels. Default: 1024x1024, total pixels: [1024x1024 (1048576), 2048x2048 (4194304)], aspect ratio: [1/16, 16] -"seedream-5-0-pro-260628" with layer_decomposition enabled: Only the resolution-level method is supported. Optional values: 1K, 1.5K, 2K, auto. Default: auto. - The base image is output at the specified resolution with the aspect ratio of the original input image; each layer is output close to the specified resolution, keeping the aspect ratio it had in the original image. - auto: Output is based on the size and aspect ratio of the input image. Inputs within [1280x720, ~2048x2048] are output at the original input size; inputs smaller than 1K are output at 1K; inputs larger than 2K are output at 2K. - - - - Comfy Router settles an explicitly supplied stream flag to false because it captures a complete JSON result. On the v1 proxy, this field controls whether to enable streaming output mode. Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro). false = All output images are returned at once. true = Each output image is returned immediately after generated. - - - - Specifies whether to add a watermark to the generated image. false = No watermark, true = Adds watermark with 'AI generated' label - - -Generated from the schema Router serves at `GET /v2/models/byteplus/seededit-3-0-i2i-250628/openapi.json`, the same document it validates a call against before the request reaches the provider. - -### Output - - - Unix timestamp (in seconds) indicating the time when the request was created - - - - Contains information about the generated image(s). -In the layer-separation scenario, the first element of the array is the base image (z_index=0), and the following elements are the layers, ordered by increasing z_index. - - - - Base64-encoded image data (if response_format is "b64_json") - - - - The bounding-box information of the region that the current layer occupies within the base image. Only layers return this field; the base image covers the whole canvas and does not return bounding_box. Returned only when layer_decomposition is true. - - - - The absolute pixel coordinates of the layer's bounding box, in the output base image's coordinate system with the top-left corner at (0, 0). Coordinate format: [left, top, right, bottom]. - - - - The per-mille quantized (normalized) coordinates of the layer's bounding box, proportionally mapped to a discrete integer range of [0, 1000] based on the base image size, truncated at a maximum of 1000. Coordinate format: [left, top, right, bottom]. - - - - A detailed description of the current separated element, providing richer layer characteristics (such as color, state, material) than name. Only layers return this field; the base image does not. Returned only when layer_decomposition is true. - - - - The name/label of the current separated element, automatically generated by the model from the characteristics of the separated subject. Only layers return this field; the base image does not. Returned only when layer_decomposition is true. - - - - The file format of the output image. Only seedream-5.0-pro supports this field. - - - - The width and height of the image in pixels, in the format \x\. Only seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter. - - - - URL for image download (if response_format is "url") - - Format: `uri` - - - - The stacking order of the layer, increasing from bottom to top: 0 is the bottom-most layer (the base image); larger values sit higher. Use it to recompose the layers into the complete image at the correct stacking order. Returned only when layer_decomposition is true. - - - - Error information (if any) - - - - Error code - - - - Error message - - - - The model ID used for the request - - - - - - - - Number of images generated by the model - - - - The number of images input to the model. Only seedream-5.0-pro supports this field. - - - - The number of tokens used for the picture generated by the model. - - - - The total number of tokens consumed by this request. - - -## Examples - -### Input - -```json -{ - "prompt": "A red fox trotting through a snowy pine forest, cinematic lighting", - "response_format": "url", - "watermark": false -} -``` - -### Output - -```json -{ - "created": 1767225600, - "data": [ - { - "size": "1024x1024", - "url": "https://example.invalid/byteplus/seedream-3-0-t2i-250415/generated.png" - } - ], - "model": "seededit-3-0-i2i-250628", - "usage": { - "generated_images": 1 - } -} -``` - - - diff --git a/development/comfy-router/models/byteplus/seedream-3-0-t2i-250415/code.mdx b/development/comfy-router/models/byteplus/seedream-3-0-t2i-250415/code.mdx deleted file mode 100644 index bb227efe7..000000000 --- a/development/comfy-router/models/byteplus/seedream-3-0-t2i-250415/code.mdx +++ /dev/null @@ -1,386 +0,0 @@ ---- -title: "Use Seedream 3.0 T2I 250415 with Comfy Router" -description: "Call byteplus/seedream-3-0-t2i-250415 through Comfy Router: endpoint, request shape and the response Router returns." -sidebarTitle: "Seedream 3.0 T2I 250415" ---- - -{/* GENERATED FILE. Generated from router-schemas/byteplus/seedream-3-0-t2i-250415.json by `pnpm code-pages:gen`. */} - -import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; - -API Reference for `byteplus/seedream-3-0-t2i-250415`, served by Comfy Router from BytePlus. - -## Quick start - -Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-keys) and export it as `COMFY_API_KEY`. The Python and TypeScript snippets use the Comfy SDKs (`pip install comfy-sdk`, `npm install @comfyorg/sdk`); the cURL snippet is the same call over raw HTTP. - -**Model ID:** `byteplus/seedream-3-0-t2i-250415` - -**Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seedream-3-0-t2i-250415` - - - - -```python Python -from comfy_sdk import Comfy - -# Reads COMFY_API_KEY from the environment. -# The SDK automatically creates an idempotency key and reuses it for automatic retries. -with Comfy() as client: - result = client.models.run( - "byteplus/seedream-3-0-t2i-250415", - { - "prompt": "A red fox trotting through a snowy pine forest, cinematic lighting", - "response_format": "url", - "watermark": False, - }, - ) - -print(result) -``` - -```typescript TypeScript -import { comfy } from "@comfyorg/sdk"; - -// Reads COMFY_API_KEY from the environment. -// The SDK automatically creates an idempotency key and reuses it for automatic retries. -const { data } = await comfy.models.run("byteplus/seedream-3-0-t2i-250415", { - prompt: "A red fox trotting through a snowy pine forest, cinematic lighting", - response_format: "url", - watermark: false, -}); - -console.log(data); -``` - -```bash cURL -curl https://api.comfy.org/v2/models/byteplus/seedream-3-0-t2i-250415 \ - -H "X-API-Key: $COMFY_API_KEY" \ - -H "Idempotency-Key: $(uuidgen)" \ - -H "Content-Type: application/json" \ - -d "{\"prompt\": \"A red fox trotting through a snowy pine forest, cinematic lighting\", \"response_format\": \"url\", \"watermark\": false}" -``` - - - -The same body, sent to `POST https://api.comfy.org/v2/models/byteplus/seedream-3-0-t2i-250415/requests`. Router answers `201` with a `request_id` as soon as the run is admitted, and the result is collected once it is ready, from this process or another one. [Queued delivery](/development/comfy-router/queue) walks through status, cancellation and collection. - - -```python Python -from comfy_sdk import Comfy - -# Reads COMFY_API_KEY from the environment. -# Each submit() call mints its own Idempotency-Key and reuses it for automatic retries. -with Comfy() as client: - handle = client.models.submit( - "byteplus/seedream-3-0-t2i-250415", - { - "prompt": "A red fox trotting through a snowy pine forest, cinematic lighting", - "response_format": "url", - "watermark": False, - }, - ) - print("request_id:", handle.request_id) # with the model ID, all another process needs - - # Poll until the request completes, waiting the Retry-After the server names. - for update in handle.iter_events(): - print(update.status, update.queue_position) - - # The provider's own payload, the same value models.run() returns. - # A request that failed or was cancelled raises the typed Router error here. - result = handle.get() - -print(result) -``` - -```typescript TypeScript -import { comfy } from "@comfyorg/sdk"; - -// Reads COMFY_API_KEY from the environment. -// Each submit() call mints its own Idempotency-Key and reuses it for automatic retries. -const handle = await comfy.models.submit("byteplus/seedream-3-0-t2i-250415", { - prompt: "A red fox trotting through a snowy pine forest, cinematic lighting", - response_format: "url", - watermark: false, -}); -console.log("requestId:", handle.requestId); // with the model ID, all another process needs - -// Poll until the request completes, waiting the Retry-After the server names. -for await (const update of handle.events()) { - console.log(update.status, update.queuePosition); -} - -// The same result models.run() returns. A request that failed or was cancelled rejects here. -const result = await handle.get(); - -console.log(result.data); -``` - -```bash cURL -# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. -curl https://api.comfy.org/v2/models/byteplus/seedream-3-0-t2i-250415/requests \ - -H "X-API-Key: $COMFY_API_KEY" \ - -H "Idempotency-Key: $(uuidgen)" \ - -H "Content-Type: application/json" \ - -d "{\"prompt\": \"A red fox trotting through a snowy pine forest, cinematic lighting\", \"response_format\": \"url\", \"watermark\": false}" - -# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. -REQUEST_ID="" -curl -i https://api.comfy.org/v2/models/byteplus/seedream-3-0-t2i-250415/requests/$REQUEST_ID/status \ - -H "X-API-Key: $COMFY_API_KEY" - -# 3. Collect. 200 with the model's native output, 202 with the status body while it is still running. -curl https://api.comfy.org/v2/models/byteplus/seedream-3-0-t2i-250415/requests/$REQUEST_ID \ - -H "X-API-Key: $COMFY_API_KEY" -``` - - - - -## Schema - -### Input - - - Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Default 2.5 for seedream-3-0-t2i-250415 and 5.5 for seededit-3-0-i2i-250628. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0. - - Range: `1` to `10` - - Format: `float` - - - - Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0, and seededit-3.0-i2i support this parameter. - -Enter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example), while seededit-3.0-i2i only supports single-image input. - -• Image URL: Make sure that the image URL is accessible. -• Base64 encoding: The format must be data:image/\;base64,\. Note: \ must be in lowercase, e.g., data:image/png;base64,\. - -Comfy Router limits the entire JSON request to 10 MiB, including base64 expansion and all reference images. Use URLs for inputs that would exceed this transport limit. - -An input image must meet the following requirements: -• Image format: jpeg, png (seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 also support webp, bmp, tiff and gif; seedream-5.0-pro also supports heic and heif) -• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0; [1/3, 3] for seededit-3.0-i2i -• Width and height (px): > 14 -• Size: No more than 10 MB (30 MB for seedream-5.0-pro) -• Total pixels: No more than 6000x6000 (36,000,000 px) for seedream-5.0-pro -• Maximum of 14 reference images (10 for seedream-5.0-pro) - -In the layer-separation scenario (layer_decomposition enabled), image is required and only a single input image is supported (passing multiple images returns an error). Input images must be png, jpeg, webp, bmp, tiff or gif (heic and heif are not supported), up to 30 MB, with total pixels in the range [512x512, 6000x6000] and aspect ratio in [1/16, 16]. - - - - Controls whether layer separation is enabled. Only seedream-5.0-pro supports this parameter. -true: Layer-separation mode. The model decomposes the single input image into one base image plus multiple layers (up to 16), and returns the position and content information of each produced layer, including the stacking order (z_index), bounding box (bounding_box), name (name) and description (description). -false: Standard image-generation mode; no layer separation is performed. -Notes on layer-separation mode: only a single input image is supported (passing multiple images returns an error); if any single layer fails to generate, the whole request fails — partial success is not supported; at most 17 images are returned (1 base image + 16 layers). sequential_image_generation, sequential_image_generation_options, tools and stream return an error if passed. - - - - Model identifier. Supported models: seedream-3-0-t2i-250415, seededit-3-0-i2i-250628, seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. - - - - Configuration for prompt optimization feature. Only seedream-5.0-pro/5.0-lite/4.5 (only support standard mode) and seedream-4.0 support this parameter. - - - - Set the mode for the prompt optimization feature. standard = Higher quality, longer generation time. fast = Faster but at a more average quality. - - Possible values: `standard`, `fast` - - - - Specifies the format of the output image. Only seedream-5.0-pro and 5.0-lite support this parameter. In the layer-separation scenario, output_format only controls the format of the base image; every layer is always output as png. - - Possible values: `png`, `jpeg` - - - - Text description for image generation or transformation. -Optional in the layer-separation scenario (seedream-5.0-pro with layer_decomposition enabled): if a prompt is provided, the model recognizes and separates the elements you specify according to the prompt intent; if no prompt is provided, the model automatically detects all major elements in the image and separates them into independent layers. - - - - Specifies the format of the generated image returned in the response - - Possible values: `url`, `b64_json` - - - - Random seed to control the stochasticity of image generation. Range: [-1, 2147483647]. If not specified, a seed will be automatically generated. To reproduce the same output, use the same seed value. - - Range: `-1` to `2147483647` - - - - Controls whether to disable the batch generation feature. This parameter is only supported on seedream-5.0-lite, 4.5 and 4.0 (not supported by seedream-5.0-pro). Valid values: -auto: In automatic mode, the model automatically determines whether to return multiple images and how many images it will contain based on the user's prompt. -disabled: Disables batch generation feature. The model will only generate one image. - - Possible values: `auto`, `disabled` - - - - Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro). -Configuration for the batch image generation feature. This parameter is only effective when sequential_image_generation is set to auto. - - - - Specifies the maximum number of images to generate in this request. Number of input reference images + Number of generated images ≤ 15. - - Range: `1` to `15` - - - - "seedream-3-0-t2i-250415": Specifies the dimensions (width x height in pixels) of the generated image. Must be between [512x512, 2048x2048] -"seededit-3-0-i2i-250628": The width and height pixels of the generated image. Currently only supports adaptive. -"seedream-4-0-250828": Set the specification for the generated image. Two methods are available but cannot be used together. - Method 1 | Specify the resolution. Optional values: 1K, 2K, 4K - Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [1024x1024, 4096x4096], aspect ratio: [1/16, 16] -"seedream-4-5-251128": Two methods available. - Method 1 | Specify the resolution. Optional values: 2K, 4K - Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, 4096x4096], aspect ratio: [1/16, 16] -"seedream-5-0-260128": Two methods available. - Method 1 | Specify the resolution. Optional values: 2K, 3K - Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, ~3072x3072], aspect ratio: [1/16, 16] -"seedream-5-0-pro-260628": Two methods available (cannot be used together). - Method 1 | Specify the resolution and describe the aspect ratio, shape or purpose of the image in the prompt; the model decides the final size. Optional values: 1K, 2K - Method 2 | Specify width and height in pixels. Default: 1024x1024, total pixels: [1024x1024 (1048576), 2048x2048 (4194304)], aspect ratio: [1/16, 16] -"seedream-5-0-pro-260628" with layer_decomposition enabled: Only the resolution-level method is supported. Optional values: 1K, 1.5K, 2K, auto. Default: auto. - The base image is output at the specified resolution with the aspect ratio of the original input image; each layer is output close to the specified resolution, keeping the aspect ratio it had in the original image. - auto: Output is based on the size and aspect ratio of the input image. Inputs within [1280x720, ~2048x2048] are output at the original input size; inputs smaller than 1K are output at 1K; inputs larger than 2K are output at 2K. - - - - Comfy Router settles an explicitly supplied stream flag to false because it captures a complete JSON result. On the v1 proxy, this field controls whether to enable streaming output mode. Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro). false = All output images are returned at once. true = Each output image is returned immediately after generated. - - - - Specifies whether to add a watermark to the generated image. false = No watermark, true = Adds watermark with 'AI generated' label - - -Generated from the schema Router serves at `GET /v2/models/byteplus/seedream-3-0-t2i-250415/openapi.json`, the same document it validates a call against before the request reaches the provider. - -### Output - - - Unix timestamp (in seconds) indicating the time when the request was created - - - - Contains information about the generated image(s). -In the layer-separation scenario, the first element of the array is the base image (z_index=0), and the following elements are the layers, ordered by increasing z_index. - - - - Base64-encoded image data (if response_format is "b64_json") - - - - The bounding-box information of the region that the current layer occupies within the base image. Only layers return this field; the base image covers the whole canvas and does not return bounding_box. Returned only when layer_decomposition is true. - - - - The absolute pixel coordinates of the layer's bounding box, in the output base image's coordinate system with the top-left corner at (0, 0). Coordinate format: [left, top, right, bottom]. - - - - The per-mille quantized (normalized) coordinates of the layer's bounding box, proportionally mapped to a discrete integer range of [0, 1000] based on the base image size, truncated at a maximum of 1000. Coordinate format: [left, top, right, bottom]. - - - - A detailed description of the current separated element, providing richer layer characteristics (such as color, state, material) than name. Only layers return this field; the base image does not. Returned only when layer_decomposition is true. - - - - The name/label of the current separated element, automatically generated by the model from the characteristics of the separated subject. Only layers return this field; the base image does not. Returned only when layer_decomposition is true. - - - - The file format of the output image. Only seedream-5.0-pro supports this field. - - - - The width and height of the image in pixels, in the format \x\. Only seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter. - - - - URL for image download (if response_format is "url") - - Format: `uri` - - - - The stacking order of the layer, increasing from bottom to top: 0 is the bottom-most layer (the base image); larger values sit higher. Use it to recompose the layers into the complete image at the correct stacking order. Returned only when layer_decomposition is true. - - - - Error information (if any) - - - - Error code - - - - Error message - - - - The model ID used for the request - - - - - - - - Number of images generated by the model - - - - The number of images input to the model. Only seedream-5.0-pro supports this field. - - - - The number of tokens used for the picture generated by the model. - - - - The total number of tokens consumed by this request. - - -## Examples - -### Input - -```json -{ - "prompt": "A red fox trotting through a snowy pine forest, cinematic lighting", - "response_format": "url", - "watermark": false -} -``` - -### Output - -```json -{ - "created": 1767225600, - "data": [ - { - "size": "1024x1024", - "url": "https://example.invalid/byteplus/seedream-3-0-t2i-250415/generated.png" - } - ], - "model": "seedream-3-0-t2i-250415", - "usage": { - "generated_images": 1 - } -} -``` - - - diff --git a/development/comfy-router/models/byteplus/seedream-4-0-250828/code.mdx b/development/comfy-router/models/byteplus/seedream-4-0-250828/code.mdx index edc46b1f4..24c952c95 100644 --- a/development/comfy-router/models/byteplus/seedream-4-0-250828/code.mdx +++ b/development/comfy-router/models/byteplus/seedream-4-0-250828/code.mdx @@ -142,7 +142,7 @@ curl https://api.comfy.org/v2/models/byteplus/seedream-4-0-250828/requests/$REQU ### Input - Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Default 2.5 for seedream-3-0-t2i-250415 and 5.5 for seededit-3-0-i2i-250628. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0. + Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0. Range: `1` to `10` @@ -150,9 +150,9 @@ curl https://api.comfy.org/v2/models/byteplus/seedream-4-0-250828/requests/$REQU - Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0, and seededit-3.0-i2i support this parameter. + Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter. -Enter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example), while seededit-3.0-i2i only supports single-image input. +Enter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example). • Image URL: Make sure that the image URL is accessible. • Base64 encoding: The format must be data:image/\;base64,\. Note: \ must be in lowercase, e.g., data:image/png;base64,\. @@ -161,7 +161,7 @@ Comfy Router limits the entire JSON request to 10 MiB, including base64 expansio An input image must meet the following requirements: • Image format: jpeg, png (seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 also support webp, bmp, tiff and gif; seedream-5.0-pro also supports heic and heif) -• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0; [1/3, 3] for seededit-3.0-i2i +• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 • Width and height (px): > 14 • Size: No more than 10 MB (30 MB for seedream-5.0-pro) • Total pixels: No more than 6000x6000 (36,000,000 px) for seedream-5.0-pro @@ -178,7 +178,7 @@ Notes on layer-separation mode: only a single input image is supported (passing - Model identifier. Supported models: seedream-3-0-t2i-250415, seededit-3-0-i2i-250628, seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. + Model identifier. Supported models: seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. @@ -234,9 +234,7 @@ Configuration for the batch image generation feature. This parameter is only eff - "seedream-3-0-t2i-250415": Specifies the dimensions (width x height in pixels) of the generated image. Must be between [512x512, 2048x2048] -"seededit-3-0-i2i-250628": The width and height pixels of the generated image. Currently only supports adaptive. -"seedream-4-0-250828": Set the specification for the generated image. Two methods are available but cannot be used together. + "seedream-4-0-250828": Set the specification for the generated image. Two methods are available but cannot be used together. Method 1 | Specify the resolution. Optional values: 1K, 2K, 4K Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [1024x1024, 4096x4096], aspect ratio: [1/16, 16] "seedream-4-5-251128": Two methods available. @@ -372,7 +370,7 @@ In the layer-separation scenario, the first element of the array is the base ima "data": [ { "size": "1024x1024", - "url": "https://example.invalid/byteplus/seedream-3-0-t2i-250415/generated.png" + "url": "https://example.invalid/byteplus/seedream-4-0-250828/generated.png" } ], "model": "seedream-4-0-250828", diff --git a/development/comfy-router/models/byteplus/seedream-4-5-251128/code.mdx b/development/comfy-router/models/byteplus/seedream-4-5-251128/code.mdx index deee46587..3a84f3d6b 100644 --- a/development/comfy-router/models/byteplus/seedream-4-5-251128/code.mdx +++ b/development/comfy-router/models/byteplus/seedream-4-5-251128/code.mdx @@ -142,7 +142,7 @@ curl https://api.comfy.org/v2/models/byteplus/seedream-4-5-251128/requests/$REQU ### Input - Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Default 2.5 for seedream-3-0-t2i-250415 and 5.5 for seededit-3-0-i2i-250628. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0. + Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0. Range: `1` to `10` @@ -150,9 +150,9 @@ curl https://api.comfy.org/v2/models/byteplus/seedream-4-5-251128/requests/$REQU - Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0, and seededit-3.0-i2i support this parameter. + Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter. -Enter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example), while seededit-3.0-i2i only supports single-image input. +Enter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example). • Image URL: Make sure that the image URL is accessible. • Base64 encoding: The format must be data:image/\;base64,\. Note: \ must be in lowercase, e.g., data:image/png;base64,\. @@ -161,7 +161,7 @@ Comfy Router limits the entire JSON request to 10 MiB, including base64 expansio An input image must meet the following requirements: • Image format: jpeg, png (seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 also support webp, bmp, tiff and gif; seedream-5.0-pro also supports heic and heif) -• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0; [1/3, 3] for seededit-3.0-i2i +• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 • Width and height (px): > 14 • Size: No more than 10 MB (30 MB for seedream-5.0-pro) • Total pixels: No more than 6000x6000 (36,000,000 px) for seedream-5.0-pro @@ -178,7 +178,7 @@ Notes on layer-separation mode: only a single input image is supported (passing - Model identifier. Supported models: seedream-3-0-t2i-250415, seededit-3-0-i2i-250628, seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. + Model identifier. Supported models: seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. @@ -234,9 +234,7 @@ Configuration for the batch image generation feature. This parameter is only eff - "seedream-3-0-t2i-250415": Specifies the dimensions (width x height in pixels) of the generated image. Must be between [512x512, 2048x2048] -"seededit-3-0-i2i-250628": The width and height pixels of the generated image. Currently only supports adaptive. -"seedream-4-0-250828": Set the specification for the generated image. Two methods are available but cannot be used together. + "seedream-4-0-250828": Set the specification for the generated image. Two methods are available but cannot be used together. Method 1 | Specify the resolution. Optional values: 1K, 2K, 4K Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [1024x1024, 4096x4096], aspect ratio: [1/16, 16] "seedream-4-5-251128": Two methods available. @@ -372,7 +370,7 @@ In the layer-separation scenario, the first element of the array is the base ima "data": [ { "size": "1024x1024", - "url": "https://example.invalid/byteplus/seedream-3-0-t2i-250415/generated.png" + "url": "https://example.invalid/byteplus/seedream-4-0-250828/generated.png" } ], "model": "seedream-4-5-251128", diff --git a/development/comfy-router/models/byteplus/seedream-5-0-260128/code.mdx b/development/comfy-router/models/byteplus/seedream-5-0-260128/code.mdx index 3a3fb796f..518620bf5 100644 --- a/development/comfy-router/models/byteplus/seedream-5-0-260128/code.mdx +++ b/development/comfy-router/models/byteplus/seedream-5-0-260128/code.mdx @@ -142,7 +142,7 @@ curl https://api.comfy.org/v2/models/byteplus/seedream-5-0-260128/requests/$REQU ### Input - Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Default 2.5 for seedream-3-0-t2i-250415 and 5.5 for seededit-3-0-i2i-250628. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0. + Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0. Range: `1` to `10` @@ -150,9 +150,9 @@ curl https://api.comfy.org/v2/models/byteplus/seedream-5-0-260128/requests/$REQU - Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0, and seededit-3.0-i2i support this parameter. + Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter. -Enter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example), while seededit-3.0-i2i only supports single-image input. +Enter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example). • Image URL: Make sure that the image URL is accessible. • Base64 encoding: The format must be data:image/\;base64,\. Note: \ must be in lowercase, e.g., data:image/png;base64,\. @@ -161,7 +161,7 @@ Comfy Router limits the entire JSON request to 10 MiB, including base64 expansio An input image must meet the following requirements: • Image format: jpeg, png (seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 also support webp, bmp, tiff and gif; seedream-5.0-pro also supports heic and heif) -• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0; [1/3, 3] for seededit-3.0-i2i +• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 • Width and height (px): > 14 • Size: No more than 10 MB (30 MB for seedream-5.0-pro) • Total pixels: No more than 6000x6000 (36,000,000 px) for seedream-5.0-pro @@ -178,7 +178,7 @@ Notes on layer-separation mode: only a single input image is supported (passing - Model identifier. Supported models: seedream-3-0-t2i-250415, seededit-3-0-i2i-250628, seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. + Model identifier. Supported models: seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. @@ -234,9 +234,7 @@ Configuration for the batch image generation feature. This parameter is only eff - "seedream-3-0-t2i-250415": Specifies the dimensions (width x height in pixels) of the generated image. Must be between [512x512, 2048x2048] -"seededit-3-0-i2i-250628": The width and height pixels of the generated image. Currently only supports adaptive. -"seedream-4-0-250828": Set the specification for the generated image. Two methods are available but cannot be used together. + "seedream-4-0-250828": Set the specification for the generated image. Two methods are available but cannot be used together. Method 1 | Specify the resolution. Optional values: 1K, 2K, 4K Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [1024x1024, 4096x4096], aspect ratio: [1/16, 16] "seedream-4-5-251128": Two methods available. @@ -372,7 +370,7 @@ In the layer-separation scenario, the first element of the array is the base ima "data": [ { "size": "1024x1024", - "url": "https://example.invalid/byteplus/seedream-3-0-t2i-250415/generated.png" + "url": "https://example.invalid/byteplus/seedream-4-0-250828/generated.png" } ], "model": "seedream-5-0-260128", diff --git a/development/comfy-router/models/byteplus/seedream-5-0-pro-260628/code.mdx b/development/comfy-router/models/byteplus/seedream-5-0-pro-260628/code.mdx index 620281822..b3b33b850 100644 --- a/development/comfy-router/models/byteplus/seedream-5-0-pro-260628/code.mdx +++ b/development/comfy-router/models/byteplus/seedream-5-0-pro-260628/code.mdx @@ -142,7 +142,7 @@ curl https://api.comfy.org/v2/models/byteplus/seedream-5-0-pro-260628/requests/$ ### Input - Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Default 2.5 for seedream-3-0-t2i-250415 and 5.5 for seededit-3-0-i2i-250628. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0. + Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0. Range: `1` to `10` @@ -150,9 +150,9 @@ curl https://api.comfy.org/v2/models/byteplus/seedream-5-0-pro-260628/requests/$ - Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0, and seededit-3.0-i2i support this parameter. + Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter. -Enter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example), while seededit-3.0-i2i only supports single-image input. +Enter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example). • Image URL: Make sure that the image URL is accessible. • Base64 encoding: The format must be data:image/\;base64,\. Note: \ must be in lowercase, e.g., data:image/png;base64,\. @@ -161,7 +161,7 @@ Comfy Router limits the entire JSON request to 10 MiB, including base64 expansio An input image must meet the following requirements: • Image format: jpeg, png (seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 also support webp, bmp, tiff and gif; seedream-5.0-pro also supports heic and heif) -• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0; [1/3, 3] for seededit-3.0-i2i +• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 • Width and height (px): > 14 • Size: No more than 10 MB (30 MB for seedream-5.0-pro) • Total pixels: No more than 6000x6000 (36,000,000 px) for seedream-5.0-pro @@ -178,7 +178,7 @@ Notes on layer-separation mode: only a single input image is supported (passing - Model identifier. Supported models: seedream-3-0-t2i-250415, seededit-3-0-i2i-250628, seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. + Model identifier. Supported models: seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/\{model}, so a Router caller omits it. @@ -234,9 +234,7 @@ Configuration for the batch image generation feature. This parameter is only eff - "seedream-3-0-t2i-250415": Specifies the dimensions (width x height in pixels) of the generated image. Must be between [512x512, 2048x2048] -"seededit-3-0-i2i-250628": The width and height pixels of the generated image. Currently only supports adaptive. -"seedream-4-0-250828": Set the specification for the generated image. Two methods are available but cannot be used together. + "seedream-4-0-250828": Set the specification for the generated image. Two methods are available but cannot be used together. Method 1 | Specify the resolution. Optional values: 1K, 2K, 4K Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [1024x1024, 4096x4096], aspect ratio: [1/16, 16] "seedream-4-5-251128": Two methods available. @@ -372,7 +370,7 @@ In the layer-separation scenario, the first element of the array is the base ima "data": [ { "size": "1024x1024", - "url": "https://example.invalid/byteplus/seedream-3-0-t2i-250415/generated.png" + "url": "https://example.invalid/byteplus/seedream-4-0-250828/generated.png" } ], "model": "seedream-5-0-pro-260628", diff --git a/development/comfy-router/models/gemini-interactions/gemini-omni-1-1-flash/code.mdx b/development/comfy-router/models/gemini-interactions/gemini-omni-1-1-flash/code.mdx index 22174db00..285235cd7 100644 --- a/development/comfy-router/models/gemini-interactions/gemini-omni-1-1-flash/code.mdx +++ b/development/comfy-router/models/gemini-interactions/gemini-omni-1-1-flash/code.mdx @@ -142,7 +142,7 @@ curl https://api.comfy.org/v2/models/gemini-interactions/gemini-omni-1.1-flash/r - Gemini model identifier (e.g. `gemini-omni-flash-preview`). On the Comfy Router route `POST /v2/models/gemini-interactions/{model}` it is supplied from the path and may be omitted. The spellings this operation serves — the set Comfy Router addresses as `gemini-interactions/` — are gemini-omni-flash-preview and gemini-omni-1.1-flash (supportedGeminiInteractionModels); they are written out here rather than constrained to an enum, because the proxy validates the model itself and answers its own 400 for a spelling it does not serve. + Gemini model identifier: `gemini-omni-1.1-flash` (generally available), or the deprecated `gemini-omni-flash-preview`. On the Comfy Router route `POST /v2/models/gemini-interactions/{model}` it is supplied from the path and may be omitted. Those two spellings — the set Comfy Router addresses as `gemini-interactions/` — are the ones this operation serves (supportedGeminiInteractionModels); they are written out here rather than constrained to an enum, because the proxy validates the model itself and answers its own 400 for a spelling it does not serve. diff --git a/development/comfy-router/models/gemini-interactions/gemini-omni-flash-preview/code.mdx b/development/comfy-router/models/gemini-interactions/gemini-omni-flash-preview/code.mdx index 405b5ba59..f3f7fac88 100644 --- a/development/comfy-router/models/gemini-interactions/gemini-omni-flash-preview/code.mdx +++ b/development/comfy-router/models/gemini-interactions/gemini-omni-flash-preview/code.mdx @@ -142,7 +142,7 @@ curl https://api.comfy.org/v2/models/gemini-interactions/gemini-omni-flash-previ - Gemini model identifier (e.g. `gemini-omni-flash-preview`). On the Comfy Router route `POST /v2/models/gemini-interactions/{model}` it is supplied from the path and may be omitted. The spellings this operation serves — the set Comfy Router addresses as `gemini-interactions/` — are gemini-omni-flash-preview and gemini-omni-1.1-flash (supportedGeminiInteractionModels); they are written out here rather than constrained to an enum, because the proxy validates the model itself and answers its own 400 for a spelling it does not serve. + Gemini model identifier: `gemini-omni-1.1-flash` (generally available), or the deprecated `gemini-omni-flash-preview`. On the Comfy Router route `POST /v2/models/gemini-interactions/{model}` it is supplied from the path and may be omitted. Those two spellings — the set Comfy Router addresses as `gemini-interactions/` — are the ones this operation serves (supportedGeminiInteractionModels); they are written out here rather than constrained to an enum, because the proxy validates the model itself and answers its own 400 for a spelling it does not serve. diff --git a/development/comfy-router/models/google/imagen-3-0-fast-generate-001/code.mdx b/development/comfy-router/models/google/imagen-3-0-fast-generate-001/code.mdx index 57224c002..9f458910b 100644 --- a/development/comfy-router/models/google/imagen-3-0-fast-generate-001/code.mdx +++ b/development/comfy-router/models/google/imagen-3-0-fast-generate-001/code.mdx @@ -213,7 +213,7 @@ curl https://api.comfy.org/v2/models/vertexai/imagen-3.0-fast-generate-001/reque Possible values: `block_most`, `block_some`, `block_few`, `block_fewest` - + Range: `1` to `4` diff --git a/development/comfy-router/models/google/imagen-3-0-generate-001/code.mdx b/development/comfy-router/models/google/imagen-3-0-generate-001/code.mdx index 4a045ff55..7638ef1d2 100644 --- a/development/comfy-router/models/google/imagen-3-0-generate-001/code.mdx +++ b/development/comfy-router/models/google/imagen-3-0-generate-001/code.mdx @@ -213,7 +213,7 @@ curl https://api.comfy.org/v2/models/vertexai/imagen-3.0-generate-001/requests/$ Possible values: `block_most`, `block_some`, `block_few`, `block_fewest` - + Range: `1` to `4` diff --git a/development/comfy-router/models/google/imagen-3-0-generate-002/code.mdx b/development/comfy-router/models/google/imagen-3-0-generate-002/code.mdx index ee5bafb14..747c6bdfc 100644 --- a/development/comfy-router/models/google/imagen-3-0-generate-002/code.mdx +++ b/development/comfy-router/models/google/imagen-3-0-generate-002/code.mdx @@ -213,7 +213,7 @@ curl https://api.comfy.org/v2/models/vertexai/imagen-3.0-generate-002/requests/$ Possible values: `block_most`, `block_some`, `block_few`, `block_fewest` - + Range: `1` to `4` diff --git a/development/comfy-router/models/heygen/starfish/code.mdx b/development/comfy-router/models/heygen/starfish/code.mdx index c955ac06e..82ff699dc 100644 --- a/development/comfy-router/models/heygen/starfish/code.mdx +++ b/development/comfy-router/models/heygen/starfish/code.mdx @@ -30,7 +30,7 @@ with Comfy() as client: result = client.models.run( "heygen/starfish", { - "text": "This is a billing verification test for HeyGen speech generation.", + "text": "Hello from Comfy. This voice is generated with the HeyGen Starfish engine.", "voice_id": "d2f4f24783d04e22ab49ee8fdc3715e0", }, ) @@ -44,7 +44,7 @@ import { comfy } from "@comfyorg/sdk"; // Reads COMFY_API_KEY from the environment. // The SDK automatically creates an idempotency key and reuses it for automatic retries. const { data } = await comfy.models.run("heygen/starfish", { - text: "This is a billing verification test for HeyGen speech generation.", + text: "Hello from Comfy. This voice is generated with the HeyGen Starfish engine.", voice_id: "d2f4f24783d04e22ab49ee8fdc3715e0", }); @@ -56,7 +56,7 @@ curl https://api.comfy.org/v2/models/heygen/starfish \ -H "X-API-Key: $COMFY_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ - -d "{\"text\": \"This is a billing verification test for HeyGen speech generation.\", \"voice_id\": \"d2f4f24783d04e22ab49ee8fdc3715e0\"}" + -d "{\"text\": \"Hello from Comfy. This voice is generated with the HeyGen Starfish engine.\", \"voice_id\": \"d2f4f24783d04e22ab49ee8fdc3715e0\"}" ``` @@ -73,7 +73,7 @@ with Comfy() as client: handle = client.models.submit( "heygen/starfish", { - "text": "This is a billing verification test for HeyGen speech generation.", + "text": "Hello from Comfy. This voice is generated with the HeyGen Starfish engine.", "voice_id": "d2f4f24783d04e22ab49ee8fdc3715e0", }, ) @@ -96,7 +96,7 @@ import { comfy } from "@comfyorg/sdk"; // Reads COMFY_API_KEY from the environment. // Each submit() call mints its own Idempotency-Key and reuses it for automatic retries. const handle = await comfy.models.submit("heygen/starfish", { - text: "This is a billing verification test for HeyGen speech generation.", + text: "Hello from Comfy. This voice is generated with the HeyGen Starfish engine.", voice_id: "d2f4f24783d04e22ab49ee8fdc3715e0", }); console.log("requestId:", handle.requestId); // with the model ID, all another process needs @@ -118,7 +118,7 @@ curl https://api.comfy.org/v2/models/heygen/starfish/requests \ -H "X-API-Key: $COMFY_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ - -d "{\"text\": \"This is a billing verification test for HeyGen speech generation.\", \"voice_id\": \"d2f4f24783d04e22ab49ee8fdc3715e0\"}" + -d "{\"text\": \"Hello from Comfy. This voice is generated with the HeyGen Starfish engine.\", \"voice_id\": \"d2f4f24783d04e22ab49ee8fdc3715e0\"}" # 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. REQUEST_ID="" @@ -213,7 +213,7 @@ Generated from the schema Router serves at `GET /v2/models/heygen/starfish/opena ```json { - "text": "This is a billing verification test for HeyGen speech generation.", + "text": "Hello from Comfy. This voice is generated with the HeyGen Starfish engine.", "voice_id": "d2f4f24783d04e22ab49ee8fdc3715e0" } ``` diff --git a/development/comfy-router/models/recraft/recraftv2/code.mdx b/development/comfy-router/models/recraft/recraftv2/code.mdx index cb70edfc6..9d19d4631 100644 --- a/development/comfy-router/models/recraft/recraftv2/code.mdx +++ b/development/comfy-router/models/recraft/recraftv2/code.mdx @@ -172,7 +172,7 @@ curl https://api.comfy.org/v2/models/recraft/recraftv2/requests/$REQUEST_ID \ - The number of images to generate + The number of images to generate. Recraft accepts 1-6. Range: `1` to `6` @@ -181,6 +181,10 @@ curl https://api.comfy.org/v2/models/recraft/recraftv2/requests/$REQUEST_ID \ The text prompt describing the image to generate + + Possible values: `url`, `b64_json` + + The size of the generated image (e.g., "1024x1024") @@ -209,12 +213,20 @@ Generated from the schema Router serves at `GET /v2/models/recraft/recraftv2/ope Array of generated image information + + Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`) + + Unique identifier for the generated image - URL to access the generated image + URL to access the generated image (present when `response_format` is `url`, the default) + + + + The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests. ## Examples diff --git a/development/comfy-router/models/recraft/recraftv3/code.mdx b/development/comfy-router/models/recraft/recraftv3/code.mdx index 8a995e5a7..185715217 100644 --- a/development/comfy-router/models/recraft/recraftv3/code.mdx +++ b/development/comfy-router/models/recraft/recraftv3/code.mdx @@ -172,7 +172,7 @@ curl https://api.comfy.org/v2/models/recraft/recraftv3/requests/$REQUEST_ID \ - The number of images to generate + The number of images to generate. Recraft accepts 1-6. Range: `1` to `6` @@ -181,6 +181,10 @@ curl https://api.comfy.org/v2/models/recraft/recraftv3/requests/$REQUEST_ID \ The text prompt describing the image to generate + + Possible values: `url`, `b64_json` + + The size of the generated image (e.g., "1024x1024") @@ -209,12 +213,20 @@ Generated from the schema Router serves at `GET /v2/models/recraft/recraftv3/ope Array of generated image information + + Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`) + + Unique identifier for the generated image - URL to access the generated image + URL to access the generated image (present when `response_format` is `url`, the default) + + + + The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests. ## Examples diff --git a/development/comfy-router/models/recraft/recraftv4-1-pro-vector/code.mdx b/development/comfy-router/models/recraft/recraftv4-1-pro-vector/code.mdx index a4b89c6ca..2fac14442 100644 --- a/development/comfy-router/models/recraft/recraftv4-1-pro-vector/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-1-pro-vector/code.mdx @@ -172,7 +172,7 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_pro_vector/requests/$RE - The number of images to generate + The number of images to generate. Recraft accepts 1-6. Range: `1` to `6` @@ -181,6 +181,10 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_pro_vector/requests/$RE The text prompt describing the image to generate + + Possible values: `url`, `b64_json` + + The size of the generated image (e.g., "1024x1024") @@ -209,12 +213,20 @@ Generated from the schema Router serves at `GET /v2/models/recraft/recraftv4_1_p Array of generated image information + + Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`) + + Unique identifier for the generated image - URL to access the generated image + URL to access the generated image (present when `response_format` is `url`, the default) + + + + The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests. ## Examples diff --git a/development/comfy-router/models/recraft/recraftv4-1-pro/code.mdx b/development/comfy-router/models/recraft/recraftv4-1-pro/code.mdx index c81643299..e61b15c52 100644 --- a/development/comfy-router/models/recraft/recraftv4-1-pro/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-1-pro/code.mdx @@ -172,7 +172,7 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_pro/requests/$REQUEST_I - The number of images to generate + The number of images to generate. Recraft accepts 1-6. Range: `1` to `6` @@ -181,6 +181,10 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_pro/requests/$REQUEST_I The text prompt describing the image to generate + + Possible values: `url`, `b64_json` + + The size of the generated image (e.g., "1024x1024") @@ -209,12 +213,20 @@ Generated from the schema Router serves at `GET /v2/models/recraft/recraftv4_1_p Array of generated image information + + Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`) + + Unique identifier for the generated image - URL to access the generated image + URL to access the generated image (present when `response_format` is `url`, the default) + + + + The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests. ## Examples diff --git a/development/comfy-router/models/recraft/recraftv4-1-utility-pro-vector/code.mdx b/development/comfy-router/models/recraft/recraftv4-1-utility-pro-vector/code.mdx index 734766dbe..2bbd67a5f 100644 --- a/development/comfy-router/models/recraft/recraftv4-1-utility-pro-vector/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-1-utility-pro-vector/code.mdx @@ -172,7 +172,7 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_pro_vector/requ - The number of images to generate + The number of images to generate. Recraft accepts 1-6. Range: `1` to `6` @@ -181,6 +181,10 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_pro_vector/requ The text prompt describing the image to generate + + Possible values: `url`, `b64_json` + + The size of the generated image (e.g., "1024x1024") @@ -209,12 +213,20 @@ Generated from the schema Router serves at `GET /v2/models/recraft/recraftv4_1_u Array of generated image information + + Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`) + + Unique identifier for the generated image - URL to access the generated image + URL to access the generated image (present when `response_format` is `url`, the default) + + + + The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests. ## Examples diff --git a/development/comfy-router/models/recraft/recraftv4-1-utility-pro/code.mdx b/development/comfy-router/models/recraft/recraftv4-1-utility-pro/code.mdx index 810e7571a..4d3845beb 100644 --- a/development/comfy-router/models/recraft/recraftv4-1-utility-pro/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-1-utility-pro/code.mdx @@ -172,7 +172,7 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_pro/requests/$R - The number of images to generate + The number of images to generate. Recraft accepts 1-6. Range: `1` to `6` @@ -181,6 +181,10 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_pro/requests/$R The text prompt describing the image to generate + + Possible values: `url`, `b64_json` + + The size of the generated image (e.g., "1024x1024") @@ -209,12 +213,20 @@ Generated from the schema Router serves at `GET /v2/models/recraft/recraftv4_1_u Array of generated image information + + Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`) + + Unique identifier for the generated image - URL to access the generated image + URL to access the generated image (present when `response_format` is `url`, the default) + + + + The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests. ## Examples diff --git a/development/comfy-router/models/recraft/recraftv4-1-utility-vector/code.mdx b/development/comfy-router/models/recraft/recraftv4-1-utility-vector/code.mdx index 7c7aeef21..eef98ebae 100644 --- a/development/comfy-router/models/recraft/recraftv4-1-utility-vector/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-1-utility-vector/code.mdx @@ -172,7 +172,7 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_vector/requests - The number of images to generate + The number of images to generate. Recraft accepts 1-6. Range: `1` to `6` @@ -181,6 +181,10 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_vector/requests The text prompt describing the image to generate + + Possible values: `url`, `b64_json` + + The size of the generated image (e.g., "1024x1024") @@ -209,12 +213,20 @@ Generated from the schema Router serves at `GET /v2/models/recraft/recraftv4_1_u Array of generated image information + + Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`) + + Unique identifier for the generated image - URL to access the generated image + URL to access the generated image (present when `response_format` is `url`, the default) + + + + The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests. ## Examples diff --git a/development/comfy-router/models/recraft/recraftv4-1-utility/code.mdx b/development/comfy-router/models/recraft/recraftv4-1-utility/code.mdx index af69de555..c5d5b9780 100644 --- a/development/comfy-router/models/recraft/recraftv4-1-utility/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-1-utility/code.mdx @@ -172,7 +172,7 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_utility/requests/$REQUE - The number of images to generate + The number of images to generate. Recraft accepts 1-6. Range: `1` to `6` @@ -181,6 +181,10 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_utility/requests/$REQUE The text prompt describing the image to generate + + Possible values: `url`, `b64_json` + + The size of the generated image (e.g., "1024x1024") @@ -209,12 +213,20 @@ Generated from the schema Router serves at `GET /v2/models/recraft/recraftv4_1_u Array of generated image information + + Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`) + + Unique identifier for the generated image - URL to access the generated image + URL to access the generated image (present when `response_format` is `url`, the default) + + + + The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests. ## Examples diff --git a/development/comfy-router/models/recraft/recraftv4-1-vector/code.mdx b/development/comfy-router/models/recraft/recraftv4-1-vector/code.mdx index 7d81badc9..3d71ec79d 100644 --- a/development/comfy-router/models/recraft/recraftv4-1-vector/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-1-vector/code.mdx @@ -172,7 +172,7 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_vector/requests/$REQUES - The number of images to generate + The number of images to generate. Recraft accepts 1-6. Range: `1` to `6` @@ -181,6 +181,10 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_vector/requests/$REQUES The text prompt describing the image to generate + + Possible values: `url`, `b64_json` + + The size of the generated image (e.g., "1024x1024") @@ -209,12 +213,20 @@ Generated from the schema Router serves at `GET /v2/models/recraft/recraftv4_1_v Array of generated image information + + Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`) + + Unique identifier for the generated image - URL to access the generated image + URL to access the generated image (present when `response_format` is `url`, the default) + + + + The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests. ## Examples diff --git a/development/comfy-router/models/recraft/recraftv4-1/code.mdx b/development/comfy-router/models/recraft/recraftv4-1/code.mdx index 9629e7832..251beb99f 100644 --- a/development/comfy-router/models/recraft/recraftv4-1/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-1/code.mdx @@ -172,7 +172,7 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1/requests/$REQUEST_ID \ - The number of images to generate + The number of images to generate. Recraft accepts 1-6. Range: `1` to `6` @@ -181,6 +181,10 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1/requests/$REQUEST_ID \ The text prompt describing the image to generate + + Possible values: `url`, `b64_json` + + The size of the generated image (e.g., "1024x1024") @@ -209,12 +213,20 @@ Generated from the schema Router serves at `GET /v2/models/recraft/recraftv4_1/o Array of generated image information + + Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`) + + Unique identifier for the generated image - URL to access the generated image + URL to access the generated image (present when `response_format` is `url`, the default) + + + + The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests. ## Examples diff --git a/development/comfy-router/models/recraft/recraftv4-pro/code.mdx b/development/comfy-router/models/recraft/recraftv4-pro/code.mdx index e1af50d6e..71ab948e6 100644 --- a/development/comfy-router/models/recraft/recraftv4-pro/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-pro/code.mdx @@ -172,7 +172,7 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_pro/requests/$REQUEST_ID - The number of images to generate + The number of images to generate. Recraft accepts 1-6. Range: `1` to `6` @@ -181,6 +181,10 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_pro/requests/$REQUEST_ID The text prompt describing the image to generate + + Possible values: `url`, `b64_json` + + The size of the generated image (e.g., "1024x1024") @@ -209,12 +213,20 @@ Generated from the schema Router serves at `GET /v2/models/recraft/recraftv4_pro Array of generated image information + + Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`) + + Unique identifier for the generated image - URL to access the generated image + URL to access the generated image (present when `response_format` is `url`, the default) + + + + The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests. ## Examples diff --git a/development/comfy-router/models/recraft/recraftv4-styles-pro-vector/code.mdx b/development/comfy-router/models/recraft/recraftv4-styles-pro-vector/code.mdx index 5255f8ae4..7b46be1b0 100644 --- a/development/comfy-router/models/recraft/recraftv4-styles-pro-vector/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-styles-pro-vector/code.mdx @@ -172,7 +172,7 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_styles_pro_vector/request - The number of images to generate + The number of images to generate. Recraft accepts 1-6. Range: `1` to `6` @@ -181,6 +181,10 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_styles_pro_vector/request The text prompt describing the image to generate + + Possible values: `url`, `b64_json` + + The size of the generated image (e.g., "1024x1024") @@ -209,12 +213,20 @@ Generated from the schema Router serves at `GET /v2/models/recraft/recraftv4_sty Array of generated image information + + Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`) + + Unique identifier for the generated image - URL to access the generated image + URL to access the generated image (present when `response_format` is `url`, the default) + + + + The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests. ## Examples diff --git a/development/comfy-router/models/recraft/recraftv4-styles-pro/code.mdx b/development/comfy-router/models/recraft/recraftv4-styles-pro/code.mdx index 5003015c8..2437ccc8f 100644 --- a/development/comfy-router/models/recraft/recraftv4-styles-pro/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-styles-pro/code.mdx @@ -172,7 +172,7 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_styles_pro/requests/$REQU - The number of images to generate + The number of images to generate. Recraft accepts 1-6. Range: `1` to `6` @@ -181,6 +181,10 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_styles_pro/requests/$REQU The text prompt describing the image to generate + + Possible values: `url`, `b64_json` + + The size of the generated image (e.g., "1024x1024") @@ -209,12 +213,20 @@ Generated from the schema Router serves at `GET /v2/models/recraft/recraftv4_sty Array of generated image information + + Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`) + + Unique identifier for the generated image - URL to access the generated image + URL to access the generated image (present when `response_format` is `url`, the default) + + + + The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests. ## Examples diff --git a/development/comfy-router/models/recraft/recraftv4-styles-vector/code.mdx b/development/comfy-router/models/recraft/recraftv4-styles-vector/code.mdx index 5f94d5aaa..4b96a0dd6 100644 --- a/development/comfy-router/models/recraft/recraftv4-styles-vector/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-styles-vector/code.mdx @@ -172,7 +172,7 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_styles_vector/requests/$R - The number of images to generate + The number of images to generate. Recraft accepts 1-6. Range: `1` to `6` @@ -181,6 +181,10 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_styles_vector/requests/$R The text prompt describing the image to generate + + Possible values: `url`, `b64_json` + + The size of the generated image (e.g., "1024x1024") @@ -209,12 +213,20 @@ Generated from the schema Router serves at `GET /v2/models/recraft/recraftv4_sty Array of generated image information + + Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`) + + Unique identifier for the generated image - URL to access the generated image + URL to access the generated image (present when `response_format` is `url`, the default) + + + + The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests. ## Examples diff --git a/development/comfy-router/models/recraft/recraftv4-styles/code.mdx b/development/comfy-router/models/recraft/recraftv4-styles/code.mdx index 791921e68..ce5e6f74b 100644 --- a/development/comfy-router/models/recraft/recraftv4-styles/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-styles/code.mdx @@ -172,7 +172,7 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_styles/requests/$REQUEST_ - The number of images to generate + The number of images to generate. Recraft accepts 1-6. Range: `1` to `6` @@ -181,6 +181,10 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_styles/requests/$REQUEST_ The text prompt describing the image to generate + + Possible values: `url`, `b64_json` + + The size of the generated image (e.g., "1024x1024") @@ -209,12 +213,20 @@ Generated from the schema Router serves at `GET /v2/models/recraft/recraftv4_sty Array of generated image information + + Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`) + + Unique identifier for the generated image - URL to access the generated image + URL to access the generated image (present when `response_format` is `url`, the default) + + + + The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests. ## Examples diff --git a/development/comfy-router/models/recraft/recraftv4/code.mdx b/development/comfy-router/models/recraft/recraftv4/code.mdx index 69b3ed545..458d2639b 100644 --- a/development/comfy-router/models/recraft/recraftv4/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4/code.mdx @@ -172,7 +172,7 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4/requests/$REQUEST_ID \ - The number of images to generate + The number of images to generate. Recraft accepts 1-6. Range: `1` to `6` @@ -181,6 +181,10 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4/requests/$REQUEST_ID \ The text prompt describing the image to generate + + Possible values: `url`, `b64_json` + + The size of the generated image (e.g., "1024x1024") @@ -209,12 +213,20 @@ Generated from the schema Router serves at `GET /v2/models/recraft/recraftv4/ope Array of generated image information + + Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`) + + Unique identifier for the generated image - URL to access the generated image + URL to access the generated image (present when `response_format` is `url`, the default) + + + + The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests. ## Examples diff --git a/development/comfy-router/models/xai/grok-imagine-image-2-0/code.mdx b/development/comfy-router/models/xai/grok-imagine-image-2-0/code.mdx index b2b7fbdb1..f66206780 100644 --- a/development/comfy-router/models/xai/grok-imagine-image-2-0/code.mdx +++ b/development/comfy-router/models/xai/grok-imagine-image-2-0/code.mdx @@ -170,7 +170,7 @@ curl https://api.comfy.org/v2/models/xai/grok-imagine-image-2.0/requests/$REQUES - Response format to return the image in. Can be url or b64_json. Comfy Router (`POST /v2/models/xai/{model}`) coerces this to `url` on the outbound request because it serves image results as re-hosted URLs either way; this `/proxy/` route honours it as written. + Response format to return the image in. Can be url or b64_json. Comfy coerces this to `url` on the outbound request — on the Comfy Router dispatch (`POST /v2/models/xai/{model}`) and on this `/proxy/` route too — because image results are served as re-hosted URLs either way. The field is accepted and ignored rather than rejected; send it or omit it, the answer is the same. Possible values: `url`, `b64_json` diff --git a/development/comfy-router/models/xai/grok-imagine-image-pro/code.mdx b/development/comfy-router/models/xai/grok-imagine-image-pro/code.mdx index c9e023070..89309206c 100644 --- a/development/comfy-router/models/xai/grok-imagine-image-pro/code.mdx +++ b/development/comfy-router/models/xai/grok-imagine-image-pro/code.mdx @@ -170,7 +170,7 @@ curl https://api.comfy.org/v2/models/xai/grok-imagine-image-pro/requests/$REQUES - Response format to return the image in. Can be url or b64_json. Comfy Router (`POST /v2/models/xai/{model}`) coerces this to `url` on the outbound request because it serves image results as re-hosted URLs either way; this `/proxy/` route honours it as written. + Response format to return the image in. Can be url or b64_json. Comfy coerces this to `url` on the outbound request — on the Comfy Router dispatch (`POST /v2/models/xai/{model}`) and on this `/proxy/` route too — because image results are served as re-hosted URLs either way. The field is accepted and ignored rather than rejected; send it or omit it, the answer is the same. Possible values: `url`, `b64_json` diff --git a/development/comfy-router/models/xai/grok-imagine-image-quality/code.mdx b/development/comfy-router/models/xai/grok-imagine-image-quality/code.mdx index f53dae6f7..81a0c9435 100644 --- a/development/comfy-router/models/xai/grok-imagine-image-quality/code.mdx +++ b/development/comfy-router/models/xai/grok-imagine-image-quality/code.mdx @@ -170,7 +170,7 @@ curl https://api.comfy.org/v2/models/xai/grok-imagine-image-quality/requests/$RE - Response format to return the image in. Can be url or b64_json. Comfy Router (`POST /v2/models/xai/{model}`) coerces this to `url` on the outbound request because it serves image results as re-hosted URLs either way; this `/proxy/` route honours it as written. + Response format to return the image in. Can be url or b64_json. Comfy coerces this to `url` on the outbound request — on the Comfy Router dispatch (`POST /v2/models/xai/{model}`) and on this `/proxy/` route too — because image results are served as re-hosted URLs either way. The field is accepted and ignored rather than rejected; send it or omit it, the answer is the same. Possible values: `url`, `b64_json` diff --git a/development/comfy-router/models/xai/grok-imagine-image/code.mdx b/development/comfy-router/models/xai/grok-imagine-image/code.mdx index db9ac1de7..27867a6d9 100644 --- a/development/comfy-router/models/xai/grok-imagine-image/code.mdx +++ b/development/comfy-router/models/xai/grok-imagine-image/code.mdx @@ -170,7 +170,7 @@ curl https://api.comfy.org/v2/models/xai/grok-imagine-image/requests/$REQUEST_ID - Response format to return the image in. Can be url or b64_json. Comfy Router (`POST /v2/models/xai/{model}`) coerces this to `url` on the outbound request because it serves image results as re-hosted URLs either way; this `/proxy/` route honours it as written. + Response format to return the image in. Can be url or b64_json. Comfy coerces this to `url` on the outbound request — on the Comfy Router dispatch (`POST /v2/models/xai/{model}`) and on this `/proxy/` route too — because image results are served as re-hosted URLs either way. The field is accepted and ignored rather than rejected; send it or omit it, the answer is the same. Possible values: `url`, `b64_json` diff --git a/development/comfy-router/quickstart.mdx b/development/comfy-router/quickstart.mdx index 6e6b812d9..f49f87edc 100644 --- a/development/comfy-router/quickstart.mdx +++ b/development/comfy-router/quickstart.mdx @@ -45,7 +45,7 @@ Comfy Router lets you call partner models through `https://api.comfy.org` with o ```python Python # Python 3.10+ - # Install: python -m pip install "comfy-sdk>=0.1.9" + # Install: python -m pip install "comfy-sdk>=0.3.0" # Save as quickstart.py, then run: python quickstart.py import os @@ -66,7 +66,7 @@ Comfy Router lets you call partner models through `https://api.comfy.org` with o ```typescript TypeScript // Node.js 22+ - // Install: npm install @comfyorg/sdk@^0.1.9 --save-dev tsx + // Install: npm install @comfyorg/sdk@^0.3.0 --save-dev tsx // Save as quickstart.mts, then run: npx tsx quickstart.mts import { comfy } from "@comfyorg/sdk"; @@ -112,7 +112,9 @@ Comfy Router lets you call partner models through `https://api.comfy.org` with o ## Queue instead of waiting -`run` holds the connection until the image is ready. To get a `request_id` back at once and collect the result later, from this process or another one, call `submit` instead (`comfy-sdk` and `@comfyorg/sdk` 0.3.0 or later), or send the same body to `POST /v2/models/{provider}/{model}/requests` over HTTP. Every model page has a **Queue and collect later** tab beside the synchronous snippet, and [Queued delivery](/development/comfy-router/queue) walks through status, cancellation and collection. Queued delivery is rolling out per workspace. +`run` holds the connection until the image is ready. To get a `request_id` back at once and collect the result later, from this process or another one, call `submit` instead (the SDK versions step 3 installs have it), or send the same body to `POST /v2/models/{provider}/{model}/requests` over HTTP. Send an `Idempotency-Key` with it as you did in step 2: a submit retried after a dropped connection then returns the original request instead of queueing and billing a second one. The SDKs mint one per `submit` call. Every model page has a **Queue and collect later** tab beside the synchronous snippet, and [Queued delivery](/development/comfy-router/queue) walks through status, cancellation and collection. + +Queued delivery is in a gated preview, scoped to the workspace behind your key. A key created in [your Comfy workspace](https://platform.comfy.org/profile/api-keys) carries that workspace; until the workspace is enabled, the submit route answers `403` with `not_enabled`. ## Choose a model diff --git a/development/comfy-router/reference.mdx b/development/comfy-router/reference.mdx index 45ee6c08e..596eea261 100644 --- a/development/comfy-router/reference.mdx +++ b/development/comfy-router/reference.mdx @@ -32,20 +32,49 @@ List available model IDs and billing facts. Use `next_cursor` while `has_more` i **Parameters** -| Name | In | Required | Type | Constraints | Description | -| --- | --- | --- | --- | --- | --- | -| `cursor` | query | no | [`RouterPageCursor`](#routerpagecursor) | Opaque cursor returned as `next_cursor`, 1–512 characters | Opaque pagination cursor. | -| `limit` | query | no | integer | Up to 100, Default: 20 | Number of models to return in one page. | + + Opaque pagination cursor. + + Type: [`RouterPageCursor`](#routerpagecursor) -- Opaque cursor returned as `next_cursor`, 1–512 characters + + + + Number of models to return in one page. + + Up to 100, Default: 20 + **Responses** -| Status | Body | Headers | Description | -| --- | --- | --- | --- | -| `200` | [`RouterModelListResponse`](#routermodellistresponse) | `X-Comfy-Request-Id` | OK - one page of the model catalog. | -| `400` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Invalid request. Check the error type and request body. | -| `401` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Missing or invalid credentials. | -| `403` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The request is not allowed for this caller or model. | -| `503` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Router is temporarily unavailable. Retry with backoff. | + + OK - one page of the model catalog. + + Body: [`RouterModelListResponse`](#routermodellistresponse) -- Headers: `X-Comfy-Request-Id` + + + + Invalid request. Check the error type and request body. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + Missing or invalid credentials. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The request is not allowed for this caller or model. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + Router is temporarily unavailable. Retry with backoff. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + ### `GET /v2/models/{provider}/{model}` @@ -55,20 +84,49 @@ Read details for one model without listing the full catalog. **Parameters** -| Name | In | Required | Type | Constraints | Description | -| --- | --- | --- | --- | --- | --- | -| `provider` | path | yes | [`RouterProviderSegment`](#routerprovidersegment) | Alphanumeric slug, e.g. `anthropic`, Up to 64 characters | Provider portion of the canonical `{provider}/{model}` model ID. | -| `model` | path | yes | [`RouterModelSegment`](#routermodelsegment) | Alphanumeric slug, e.g. `claude-opus-4-6`, Up to 128 characters | Model portion of the canonical `{provider}/{model}` model ID. | + + Provider portion of the canonical `{provider}/{model}` model ID. + + Type: [`RouterProviderSegment`](#routerprovidersegment) -- Alphanumeric slug, e.g. `anthropic`, Up to 64 characters + + + + Model portion of the canonical `{provider}/{model}` model ID. + + Type: [`RouterModelSegment`](#routermodelsegment) -- Alphanumeric slug, e.g. `claude-opus-4-6`, Up to 128 characters + **Responses** -| Status | Body | Headers | Description | -| --- | --- | --- | --- | -| `200` | [`RouterModelDetail`](#routermodeldetail) | `X-Comfy-Request-Id` | OK - the model's catalog entry. | -| `401` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Missing or invalid credentials. | -| `403` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The request is not allowed for this caller or model. | -| `404` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The model ID was not found. | -| `503` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Router is temporarily unavailable. Retry with backoff. | + + OK - the model's catalog entry. + + Body: [`RouterModelDetail`](#routermodeldetail) -- Headers: `X-Comfy-Request-Id` + + + + Missing or invalid credentials. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The request is not allowed for this caller or model. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The model ID was not found. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + Router is temporarily unavailable. Retry with backoff. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + ### `POST /v2/models/{provider}/{model}` @@ -78,34 +136,117 @@ Run a model and receive its finished result in the same response. **Parameters** -| Name | In | Required | Type | Constraints | Description | -| --- | --- | --- | --- | --- | --- | -| `provider` | path | yes | [`RouterProviderSegment`](#routerprovidersegment) | Alphanumeric slug, e.g. `anthropic`, Up to 64 characters | Provider portion of the canonical `{provider}/{model}` model ID. | -| `model` | path | yes | [`RouterModelSegment`](#routermodelsegment) | Alphanumeric slug, e.g. `claude-opus-4-6`, Up to 128 characters | Model portion of the canonical `{provider}/{model}` model ID. | -| `Idempotency-Key` | header | no | string | 1–255 characters | Caller-generated key that makes retrying ONE logical call safe. | + + Provider portion of the canonical `{provider}/{model}` model ID. + + Type: [`RouterProviderSegment`](#routerprovidersegment) -- Alphanumeric slug, e.g. `anthropic`, Up to 64 characters + + + + Model portion of the canonical `{provider}/{model}` model ID. + + Type: [`RouterModelSegment`](#routermodelsegment) -- Alphanumeric slug, e.g. `claude-opus-4-6`, Up to 128 characters + + + + Caller-generated key that makes retrying one logical call safe. + + 1–255 characters + + + + Selects an alternate provider for this model, instead of its current default. + + + + Only meaningful together with `model_provider`. + + Default: False + + + + Controls whether Router retries this call against the model's other registered provider when the first attempt fails for a reason attributable to Router's own side or to the specific provider tried - never for a reason attributable to the request itself (an unretried failure is refused exactly as it always was). + **Request body** `application/json` -- [`RouterModelInput`](#routermodelinput) (required) -The partner model's native JSON input, forwarded to the provider unchanged. +The partner model's native JSON input. Without `model_provider`, or with `strict_mode=true`, forwarded to the provider unchanged - under `strict_mode=true` the body must already be the alternate provider's own real schema, not this model's native one (see `strict_mode`). With `model_provider` selecting an alternate provider and `strict_mode=false` (the default), the body is translated into that provider's real schema before it is sent - any native field that cannot be expressed exactly is dropped and disclosed via the response's `X-Comfy-Router-Dropped-Params` header, never silently. **Responses** -| Status | Body | Headers | Description | -| --- | --- | --- | --- | -| `200` | [`RouterModelOutput`](#routermodeloutput) | `X-Comfy-Request-Id`, `X-Content-Type-Options`, `Idempotent-Replayed`, `X-Committed-Spend-Limit`, `X-Committed-Spend-Current`, `X-Committed-Spend-Remaining` | OK - the partner model's native output, returned unchanged, under the partner's OWN media type. | -| `400` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `X-Comfy-Upstream-Status`, `Idempotent-Replayed` | Invalid request. Check the error type and request body. | -| `401` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Missing or invalid credentials. | -| `403` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The request is not allowed for this caller or model. | -| `404` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The model ID was not found. | -| `409` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Retry-After` (when `concurrency_limit_exceeded`) | Inspect `X-Comfy-Error-Type`: `concurrency_limit_exceeded` means the original call is still running, so wait for `Retry-After` and reuse the same key; `invalid_input` requires a new key. | -| `413` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The request body is too large. | -| `422` | [`RouterValidationErrorResponse`](#routervalidationerrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Idempotent-Replayed` | The request's contents were rejected against the model's schema. | -| `429` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `X-Committed-Spend-Limit`, `X-Committed-Spend-Current`, `X-Committed-Spend-Remaining` | Inspect `X-Comfy-Error-Type`: `concurrency_limit_exceeded` means reduce in-flight calls; `rate_limited` means wait for the allowance window. | -| `502` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `X-Comfy-Upstream-Status` | The provider's own response could not be turned into a result (`provider_error`). | -| `503` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Router is temporarily unavailable. Retry with backoff. | -| `504` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `X-Comfy-Upstream-Status`, `Retry-After` | The request exceeded a deadline. Check the error type before retrying. | + + OK - without `model_provider`, or with `model_provider` and `strict_mode=false` (the default, translated back into this model's native contract when possible, falling back to the alternate provider's own raw response on a translation failure - logged, never silent), the shape is this model's own native output; with `strict_mode=true` it is the alternate provider's response returned unchanged. + + Body: [`RouterModelOutput`](#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-Remaining` + + + + Invalid request. Check the error type and request body. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `X-Comfy-Upstream-Status`, `Idempotent-Replayed` + + + + Missing or invalid credentials. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The request is not allowed for this caller or model. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The model ID was not found. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + Inspect `X-Comfy-Error-Type`: `concurrency_limit_exceeded` means the original call is still running, so wait for `Retry-After` and reuse the same key; `invalid_input` requires a new key. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Retry-After` (when `concurrency_limit_exceeded`) + + + + The request body is too large. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The request's contents were rejected against the model's schema. + + Body: [`RouterValidationErrorResponse`](#routervalidationerrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Idempotent-Replayed` + + + + Inspect `X-Comfy-Error-Type`: `concurrency_limit_exceeded` means reduce in-flight calls; `rate_limited` means wait for the allowance window. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `X-Committed-Spend-Limit`, `X-Committed-Spend-Current`, `X-Committed-Spend-Remaining` + + + + The provider's own response could not be turned into a result (`provider_error`). + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `X-Comfy-Upstream-Status` + + + + Router is temporarily unavailable. Retry with backoff. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The request exceeded a deadline. Check the error type before retrying. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `X-Comfy-Upstream-Status`, `Retry-After` + ### `GET /v2/models/{provider}/{model}/openapi.json` @@ -115,115 +256,329 @@ Read one model's input and output schemas as a standalone OpenAPI document. **Parameters** -| Name | In | Required | Type | Constraints | Description | -| --- | --- | --- | --- | --- | --- | -| `provider` | path | yes | [`RouterProviderSegment`](#routerprovidersegment) | Alphanumeric slug, e.g. `anthropic`, Up to 64 characters | Provider portion of the canonical `{provider}/{model}` model ID. | -| `model` | path | yes | [`RouterModelSegment`](#routermodelsegment) | Alphanumeric slug, e.g. `claude-opus-4-6`, Up to 128 characters | Model portion of the canonical `{provider}/{model}` model ID. | -| `If-None-Match` | header | no | string | - | The `ETag` a caller holds from an earlier `200`. | + + Provider portion of the canonical `{provider}/{model}` model ID. + + Type: [`RouterProviderSegment`](#routerprovidersegment) -- Alphanumeric slug, e.g. `anthropic`, Up to 64 characters + + + + Model portion of the canonical `{provider}/{model}` model ID. + + Type: [`RouterModelSegment`](#routermodelsegment) -- Alphanumeric slug, e.g. `claude-opus-4-6`, Up to 128 characters + + + + The `ETag` a caller holds from an earlier `200`. + **Responses** -| Status | Body | Headers | Description | -| --- | --- | --- | --- | -| `200` | [`RouterModelInputSchemaDocument`](#routermodelinputschemadocument) | `X-Comfy-Request-Id`, `ETag`, `Cache-Control` | OK - the model's input AND output schemas, as a standalone OpenAPI document. | -| `304` | - | `X-Comfy-Request-Id`, `ETag`, `Cache-Control` | Not Modified - the document is unchanged since the `ETag` the caller sent in `If-None-Match`. | -| `401` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Missing or invalid credentials. | -| `403` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The request is not allowed for this caller or model. | -| `404` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The model ID was not found. | -| `500` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Router could not complete the request. | -| `503` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Router is temporarily unavailable. Retry with backoff. | + + OK - the model's input and output schemas, as a standalone OpenAPI document. + + Body: [`RouterModelInputSchemaDocument`](#routermodelinputschemadocument) -- Headers: `X-Comfy-Request-Id`, `ETag`, `Cache-Control` + + + + Not Modified - the document is unchanged since the `ETag` the caller sent in `If-None-Match`. + + Headers: `X-Comfy-Request-Id`, `ETag`, `Cache-Control` + + + + Missing or invalid credentials. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The request is not allowed for this caller or model. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The model ID was not found. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + Router could not complete the request. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + Router is temporarily unavailable. Retry with backoff. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + ### `POST /v2/models/{provider}/{model}/requests` **Submit a partner model run to the queue and return immediately.** -Comfy Router's QUEUED delivery mode. The request body is the same partner-native JSON input `POST /v2/models/{provider}/{model}` accepts for this model - one body shape, one per-model schema, two delivery modes - but this route does NOT hold the connection for the result. It admits the run, answers `201` with a handle, and the caller collects the result later through the three reads below. +Comfy Router's queued delivery mode. The request body is the same partner-native JSON input `POST /v2/models/{provider}/{model}` accepts for this model - one body shape, one per-model schema, two delivery modes - but this route does not hold the connection for the result. It admits the run, answers `201` with a handle, and the caller collects the result later through the three reads below. **Parameters** -| Name | In | Required | Type | Constraints | Description | -| --- | --- | --- | --- | --- | --- | -| `provider` | path | yes | [`RouterProviderSegment`](#routerprovidersegment) | Alphanumeric slug, e.g. `anthropic`, Up to 64 characters | Lowercase provider segment of the canonical `{provider}/{model}` model ID - the partner whose model is being run. | -| `model` | path | yes | [`RouterModelSegment`](#routermodelsegment) | Alphanumeric slug, e.g. `claude-opus-4-6`, Up to 128 characters | Lowercase model segment of the canonical `{provider}/{model}` model ID - the model to run within that provider. | -| `Idempotency-Key` | header | no | string | 1–255 characters | Caller-generated key that makes retrying ONE logical call safe. | + + Lowercase provider segment of the canonical `{provider}/{model}` model ID - the partner whose model is being run. + + Type: [`RouterProviderSegment`](#routerprovidersegment) -- Alphanumeric slug, e.g. `anthropic`, Up to 64 characters + + + + Lowercase model segment of the canonical `{provider}/{model}` model ID - the model to run within that provider. + + Type: [`RouterModelSegment`](#routermodelsegment) -- Alphanumeric slug, e.g. `claude-opus-4-6`, Up to 128 characters + + + + Caller-generated key that makes retrying one logical call safe. + + 1–255 characters + **Request body** `application/json` -- [`RouterModelInput`](#routermodelinput) (required) -The partner model's native JSON input, identical to the body the synchronous route accepts for this model. Validated against the model's own input schema BEFORE the run is admitted, so a body the model would reject is a `422` here rather than a queued request that fails minutes later. +The partner model's native JSON input, identical to the body the synchronous route accepts for this model. Validated against the model's own input schema before the run is admitted, so a body the model would reject is a `422` here rather than a queued request that fails minutes later. **Responses** -| Status | Body | Headers | Description | -| --- | --- | --- | --- | -| `201` | [`RouterQueueSubmitResponse`](#routerqueuesubmitresponse) | `X-Comfy-Request-Id`, `Idempotent-Replayed` | Created - the run was admitted to the queue. | -| `401` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Missing or invalid credentials. | -| `400` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Invalid request. Check the error type and request body. | -| `413` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The request body is too large. | -| `402` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | A Router request-level failure - the request never reached the model, or failed for a reason the model itself did not report. | -| `403` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The request is not allowed for this caller or model. | -| `404` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The model ID was not found. | -| `409` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Retry-After` (when `concurrency_limit_exceeded`) | Inspect `X-Comfy-Error-Type`: `concurrency_limit_exceeded` means the original call is still running, so wait for `Retry-After` and reuse the same key; `invalid_input` requires a new key. | -| `422` | [`RouterValidationErrorResponse`](#routervalidationerrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Idempotent-Replayed` | The request's contents were rejected against the model's schema. | -| `503` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Router is temporarily unavailable. Retry with backoff. | + + Created - the run was admitted to the queue. + + Body: [`RouterQueueSubmitResponse`](#routerqueuesubmitresponse) -- Headers: `X-Comfy-Request-Id`, `Idempotent-Replayed` + + + + Missing or invalid credentials. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + Invalid request. Check the error type and request body. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The request body is too large. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + A Router request-level failure - the request never reached the model, or failed for a reason the model itself did not report. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The request is not allowed for this caller or model. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The model ID was not found. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + Inspect `X-Comfy-Error-Type`: `concurrency_limit_exceeded` means the original call is still running, so wait for `Retry-After` and reuse the same key; `invalid_input` requires a new key. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Retry-After` (when `concurrency_limit_exceeded`) + + + + The request's contents were rejected against the model's schema. + + Body: [`RouterValidationErrorResponse`](#routervalidationerrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Idempotent-Replayed` + + + + Router is temporarily unavailable. Retry with backoff. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + ### `GET /v2/models/{provider}/{model}/requests/{request_id}` **Collect the result of one submitted request.** -The collect endpoint. On a request that has finished successfully it returns the partner model's OWN native output, byte for byte what the synchronous route's `200` carries for the same model and the same input - so the two delivery modes produce one result shape and a caller can move between them without a second parser. +The collect endpoint. On a request that has finished successfully it returns the partner model's own native output, byte for byte what the synchronous route's `200` carries for the same model and the same input - so the two delivery modes produce one result shape and a caller can move between them without a second parser. **Parameters** -| Name | In | Required | Type | Constraints | Description | -| --- | --- | --- | --- | --- | --- | -| `provider` | path | yes | [`RouterProviderSegment`](#routerprovidersegment) | Alphanumeric slug, e.g. `anthropic`, Up to 64 characters | Lowercase provider segment of the canonical `{provider}/{model}` model ID - the partner whose model is being run. | -| `model` | path | yes | [`RouterModelSegment`](#routermodelsegment) | Alphanumeric slug, e.g. `claude-opus-4-6`, Up to 128 characters | Lowercase model segment of the canonical `{provider}/{model}` model ID - the model to run within that provider. | -| `request_id` | path | yes | [`RouterQueueRequestId`](#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 characters | The queued request to address - the `request_id` the submission returned, which is also the value that submission's `X-Comfy-Request-Id` header carried. | + + Lowercase provider segment of the canonical `{provider}/{model}` model ID - the partner whose model is being run. + + Type: [`RouterProviderSegment`](#routerprovidersegment) -- Alphanumeric slug, e.g. `anthropic`, Up to 64 characters + + + + Lowercase model segment of the canonical `{provider}/{model}` model ID - the model to run within that provider. + + Type: [`RouterModelSegment`](#routermodelsegment) -- Alphanumeric slug, e.g. `claude-opus-4-6`, Up to 128 characters + + + + The queued request to address - the `request_id` the submission returned in its body. + + Type: [`RouterQueueRequestId`](#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 characters + **Responses** -| Status | Body | Headers | Description | -| --- | --- | --- | --- | -| `200` | [`RouterModelOutput`](#routermodeloutput) | `X-Comfy-Request-Id`, `X-Content-Type-Options` | OK - the partner model's native output for a request that produced one - a request that completed successfully, or a terminal one that carries both a recorded charge and a stored result - returned unchanged under the partner's OWN media type, exactly as the synchronous route's `200` returns it. | -| `202` | [`RouterQueueStatusResponse`](#routerqueuestatusresponse) | `X-Comfy-Request-Id`, `Retry-After` | Accepted - the request has not finished. | -| `401` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Missing or invalid credentials. | -| `403` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The request is not allowed for this caller or model. | -| `404` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The model ID was not found. | -| `410` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | A Router request-level failure - the request never reached the model, or failed for a reason the model itself did not report. | -| `503` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Router is temporarily unavailable. Retry with backoff. | -| `409` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The request is in a state that conflicts with the operation. Check the error type. | -| `504` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The request exceeded a deadline. Check the error type before retrying. | -| `422` | [`RouterValidationErrorResponse`](#routervalidationerrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Idempotent-Replayed` | The request's contents were rejected against the model's schema. | -| `default` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | A Router request-level failure - the request never reached the model, or failed for a reason the model itself did not report. | + + OK - the partner model's native output for a request that produced one - a request that completed successfully, or a terminal one that carries both a recorded charge and a stored result - returned unchanged under the partner's own media type, exactly as the synchronous route's `200` returns it. + + Body: [`RouterModelOutput`](#routermodeloutput) -- Headers: `X-Comfy-Request-Id`, `X-Content-Type-Options` + + + + Accepted - the request has not finished. + + Body: [`RouterQueueStatusResponse`](#routerqueuestatusresponse) -- Headers: `X-Comfy-Request-Id`, `Retry-After` + + + + Missing or invalid credentials. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The request is not allowed for this caller or model. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The model ID was not found. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + A Router request-level failure - the request never reached the model, or failed for a reason the model itself did not report. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + Router is temporarily unavailable. Retry with backoff. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The request is in a state that conflicts with the operation. Check the error type. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The request exceeded a deadline. Check the error type before retrying. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The request's contents were rejected against the model's schema. + + Body: [`RouterValidationErrorResponse`](#routervalidationerrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id`, `Idempotent-Replayed` + + + + A Router request-level failure - the request never reached the model, or failed for a reason the model itself did not report. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + ### `PUT /v2/models/{provider}/{model}/requests/{request_id}/cancel` **Ask for one submitted request to be cancelled.** -Asks Comfy to stop a request that has not finished. It is a REQUEST, not a guarantee, and the `202` says exactly that: `CANCELLATION_REQUESTED` means the ask was accepted, not that the run has stopped. A run already on the wire at a partner may complete anyway - and a partner generation that completes is charged, whether or not anyone collected it - so a caller who needs to know what actually happened reads the status endpoint afterwards, where a cancellation that took effect is `COMPLETED` carrying an `error_type` like every other terminal outcome. +Asks Comfy to stop a request that has not finished. It is a request, not a guarantee, and the `202` says exactly that: `CANCELLATION_REQUESTED` means the ask was accepted, not that the run has stopped. A run already on the wire at a partner may complete anyway - and a partner generation that completes is charged, whether or not anyone collected it - so a caller who needs to know what actually happened reads the status endpoint afterwards, where a cancellation that took effect is `COMPLETED` carrying an `error_type` like every other terminal outcome. **Parameters** -| Name | In | Required | Type | Constraints | Description | -| --- | --- | --- | --- | --- | --- | -| `provider` | path | yes | [`RouterProviderSegment`](#routerprovidersegment) | Alphanumeric slug, e.g. `anthropic`, Up to 64 characters | Lowercase provider segment of the canonical `{provider}/{model}` model ID - the partner whose model is being run. | -| `model` | path | yes | [`RouterModelSegment`](#routermodelsegment) | Alphanumeric slug, e.g. `claude-opus-4-6`, Up to 128 characters | Lowercase model segment of the canonical `{provider}/{model}` model ID - the model to run within that provider. | -| `request_id` | path | yes | [`RouterQueueRequestId`](#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 characters | The queued request to address - the `request_id` the submission returned, which is also the value that submission's `X-Comfy-Request-Id` header carried. | + + Lowercase provider segment of the canonical `{provider}/{model}` model ID - the partner whose model is being run. + + Type: [`RouterProviderSegment`](#routerprovidersegment) -- Alphanumeric slug, e.g. `anthropic`, Up to 64 characters + + + + Lowercase model segment of the canonical `{provider}/{model}` model ID - the model to run within that provider. + + Type: [`RouterModelSegment`](#routermodelsegment) -- Alphanumeric slug, e.g. `claude-opus-4-6`, Up to 128 characters + + + + The queued request to address - the `request_id` the submission returned in its body. + + Type: [`RouterQueueRequestId`](#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 characters + **Responses** -| Status | Body | Headers | Description | -| --- | --- | --- | --- | -| `202` | [`RouterQueueCancelResponse`](#routerqueuecancelresponse) | `X-Comfy-Request-Id` | Accepted - `CANCELLATION_REQUESTED`. | -| `409` | [`RouterQueueCancelResponse`](#routerqueuecancelresponse) | `X-Comfy-Request-Id` | Conflict - `ALREADY_COMPLETED`. | -| `400` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Invalid request. Check the error type and request body. | -| `401` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Missing or invalid credentials. | -| `403` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The request is not allowed for this caller or model. | -| `404` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The model ID was not found. | -| `503` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Router is temporarily unavailable. Retry with backoff. | -| `default` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | A Router request-level failure - the request never reached the model, or failed for a reason the model itself did not report. | + + Accepted - `CANCELLATION_REQUESTED`. + + Body: [`RouterQueueCancelResponse`](#routerqueuecancelresponse) -- Headers: `X-Comfy-Request-Id` + + + + Conflict - `ALREADY_COMPLETED`. + + Body: [`RouterQueueCancelResponse`](#routerqueuecancelresponse) -- Headers: `X-Comfy-Request-Id` + + + + Invalid request. Check the error type and request body. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + Missing or invalid credentials. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The request is not allowed for this caller or model. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The model ID was not found. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + Router is temporarily unavailable. Retry with backoff. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + A Router request-level failure - the request never reached the model, or failed for a reason the model itself did not report. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + ### `GET /v2/models/{provider}/{model}/requests/{request_id}/status` @@ -233,25 +588,69 @@ The poll endpoint. It answers with the request's current state and never with th **Parameters** -| Name | In | Required | Type | Constraints | Description | -| --- | --- | --- | --- | --- | --- | -| `provider` | path | yes | [`RouterProviderSegment`](#routerprovidersegment) | Alphanumeric slug, e.g. `anthropic`, Up to 64 characters | Lowercase provider segment of the canonical `{provider}/{model}` model ID - the partner whose model is being run. | -| `model` | path | yes | [`RouterModelSegment`](#routermodelsegment) | Alphanumeric slug, e.g. `claude-opus-4-6`, Up to 128 characters | Lowercase model segment of the canonical `{provider}/{model}` model ID - the model to run within that provider. | -| `request_id` | path | yes | [`RouterQueueRequestId`](#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 characters | The queued request to address - the `request_id` the submission returned, which is also the value that submission's `X-Comfy-Request-Id` header carried. | + + Lowercase provider segment of the canonical `{provider}/{model}` model ID - the partner whose model is being run. + + Type: [`RouterProviderSegment`](#routerprovidersegment) -- Alphanumeric slug, e.g. `anthropic`, Up to 64 characters + + + + Lowercase model segment of the canonical `{provider}/{model}` model ID - the model to run within that provider. + + Type: [`RouterModelSegment`](#routermodelsegment) -- Alphanumeric slug, e.g. `claude-opus-4-6`, Up to 128 characters + + + + The queued request to address - the `request_id` the submission returned in its body. + + Type: [`RouterQueueRequestId`](#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 characters + **Responses** -| Status | Body | Headers | Description | -| --- | --- | --- | --- | -| `200` | [`RouterQueueStatusResponse`](#routerqueuestatusresponse) | `X-Comfy-Request-Id`, `Retry-After` | OK - the request's current queue state. | -| `401` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Missing or invalid credentials. | -| `403` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The request is not allowed for this caller or model. | -| `404` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | The model ID was not found. | -| `410` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | A Router request-level failure - the request never reached the model, or failed for a reason the model itself did not report. | -| `503` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | Router is temporarily unavailable. Retry with backoff. | -| `default` | [`RouterErrorResponse`](#routererrorresponse) | `X-Comfy-Error-Type`, `X-Comfy-Request-Id` | A Router request-level failure - the request never reached the model, or failed for a reason the model itself did not report. | + + OK - the request's current queue state. + + Body: [`RouterQueueStatusResponse`](#routerqueuestatusresponse) -- Headers: `X-Comfy-Request-Id`, `Retry-After` + + + + Missing or invalid credentials. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The request is not allowed for this caller or model. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + The model ID was not found. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + A Router request-level failure - the request never reached the model, or failed for a reason the model itself did not report. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + + + Router is temporarily unavailable. Retry with backoff. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + -Table descriptions are brief. Use [Using the Comfy Router API](/development/comfy-router/api) for model selection, validation, retries, and billing, and [Headers](/development/comfy-router/headers) for header behavior. + + A Router request-level failure - the request never reached the model, or failed for a reason the model itself did not report. + + Body: [`RouterErrorResponse`](#routererrorresponse) -- Headers: `X-Comfy-Error-Type`, `X-Comfy-Request-Id` + + +Descriptions here are brief. Use [Using the Comfy Router API](/development/comfy-router/api) for model selection, validation, retries, and billing, and [Headers](/development/comfy-router/headers) for header behavior. ## Error buckets @@ -284,26 +683,66 @@ Raised by Router itself, before or around the call to the model. | `deadline_exceeded` | Comfy stopped holding the connection at its own configured bound before an answer arrived. | | `not_enabled` | Comfy Router is not switched on for this caller yet. | | `service_unavailable` | A service Comfy Router depends on is temporarily unavailable and the caller did nothing wrong. | -| `rate_limited` | The caller has spent an allowance measured over a WINDOW and must wait for that window to roll. | -| `cancelled` | A queued request was withdrawn — through the cancel route, or by an operator — before it produced a result; it is TERMINAL, and it is not by itself a statement about the charge. | +| `rate_limited` | The caller has spent an allowance measured over a window and must wait for that window to roll. | +| `cancelled` | A queued request was withdrawn — through the cancel route, or by an operator — before it produced a result; it is terminal, and it is not by itself a statement about the charge. | | `queue_timeout` | A queued request waited past its queue timeout without ever being admitted. | | `request_not_found` | The `request_id` names no request of the caller's under this model. | ## Response headers -| Header | Type | Description | -| --- | --- | --- | -| `Cache-Control` | string | Freshness directives for the served schema document. | -| `ETag` | string | Strong entity tag over the served document's bytes, for `GET /v2/models/{provider}/{model}/openapi.json`. | -| `Idempotent-Replayed` | boolean | Present and `true` when this response was served from an `Idempotency-Key`'s record rather than by running the model again. | -| `Retry-After` | integer | Seconds to wait before retrying the SAME request with the SAME `Idempotency-Key`. | -| `X-Comfy-Error-Type` | [`RouterErrorType`](#routererrortype) | Coarse, machine-readable bucket for the failure, set by Router on every error response. | -| `X-Comfy-Request-Id` | string | Server-generated identifier for this call, present on EVERY Router response - success, 4xx and 5xx alike, because an error response is exactly when a user needs an id to quote in a support request. | -| `X-Comfy-Upstream-Status` | integer | The model provider's OWN HTTP status for this call. | -| `X-Committed-Spend-Current` | integer | The USD cents the caller currently has committed to calls still in flight. | -| `X-Committed-Spend-Limit` | integer | The ceiling, in USD cents, on the partner spend the caller may have committed to calls still in flight - money held from the moment a call is admitted and released when that call finishes. | -| `X-Committed-Spend-Remaining` | integer | The USD cents of headroom left under the ceiling, floored at zero. | -| `X-Content-Type-Options` | string | Always `nosniff`, on every successful run of a Router model. | + + Freshness directives for the served schema document. + + + + Strong entity tag over the served document's bytes, for `GET /v2/models/{provider}/{model}/openapi.json`. + + + + Present and `true` when this response was served from an `Idempotency-Key`'s record rather than by running the model again. + + + + Seconds to wait before retrying the same request with the same `Idempotency-Key`. + + + + Coarse, machine-readable bucket for the failure, set by Router on every error response. + + Type: [`RouterErrorType`](#routererrortype) + + + + Server-generated identifier for this call, present on every Router response - success, 4xx and 5xx alike, because an error response is exactly when a user needs an id to quote in a support request. + + + + One JSON-encoded string holding an array of strings - decode it with a JSON parser rather than splitting it on commas, because it is a single string on the wire, not a comma-separated OpenAPI array, and each entry is a sentence carrying commas of its own - present whenever a translation produced this call's request body and could not express one or more native fields exactly on the provider that served it, naming each dropped field and why, whether the caller asked for that translation with `model_provider` (`strict_mode=false`, the default) or an automatic `fallback_provider` retry ran it. + + + + Present, naming the provider, only when `fallback_provider` actually retried this call against a second provider and that retry succeeded - the provider that ultimately served the call, never one that was attempted and also failed. + + + + The model provider's own HTTP status for this call. + + + + The USD cents the caller currently has committed to calls still in flight. + + + + The ceiling, in USD cents, on the partner spend the caller may have committed to calls still in flight - money held from the moment a call is admitted and released when that call finishes. + + + + The USD cents of headroom left under the ceiling, floored at zero. + + + + Always `nosniff`, on every successful run of a Router model. + ## Result assets @@ -344,10 +783,17 @@ Type: `string` Error body for authentication, access, model lookup, quota, and provider transport failures. -| Field | Type | Required | Constraints | Description | -| --- | --- | --- | --- | --- | -| `detail` | string | yes | - | Human-readable description of the failure, safe to surface to an end user. Not machine-parsed - branch on `error_type` instead. | -| `error_type` | [`RouterErrorType`](#routererrortype) | yes | - | Coarse, machine-readable bucket for a Router failure, mirrored on the `X-Comfy-Error-Type` response header so a caller can branch without parsing the body. The set is closed at fifteen values: the six request-level buckets `invalid_input`, `content_policy_violation`, `provider_error`, `provider_timeout`, `insufficient_credits` and `model_not_found`, plus the transport-level `unauthorized`, `forbidden`, `concurrency_limit_exceeded`, `client_disconnected`, `internal_error`, `deadline_exceeded`, `not_enabled`, `service_unavailable` and `rate_limited`. | +**Fields** + + + Human-readable description of the failure, safe to surface to an end user. Not machine-parsed - branch on `error_type` instead. + + + + Coarse, machine-readable bucket for a Router failure, mirrored on the `X-Comfy-Error-Type` response header so a caller can branch without parsing the body. The set is closed at fifteen values: the six request-level buckets `invalid_input`, `content_policy_violation`, `provider_error`, `provider_timeout`, `insufficient_credits` and `model_not_found`, plus the transport-level `unauthorized`, `forbidden`, `concurrency_limit_exceeded`, `client_disconnected`, `internal_error`, `deadline_exceeded`, `not_enabled`, `service_unavailable` and `rate_limited`. + + Type: [`RouterErrorType`](#routererrortype) + ### RouterErrorType @@ -359,9 +805,13 @@ Type: `string` Billing behavior to check before invoking a model. It does not include prices or usage. -| Field | Type | Required | Constraints | Description | -| --- | --- | --- | --- | --- | -| `charges_on_policy_rejection` | [`RouterChargesOnPolicyRejection`](#routerchargesonpolicyrejection) | yes | - | Whether a call this model REFUSES on content-policy grounds is nevertheless charged to the caller. Providers differ, the difference is invisible at call time, and a user who sees an error and a charge for the same call has no way to have known - so it is stated per model, before the call, rather than left to per-provider folklore. | +**Fields** + + + Whether a call this model refuses on content-policy grounds is nevertheless charged to the caller. Providers differ, the difference is invisible at call time, and a user who sees an error and a charge for the same call has no way to have known - so it is stated per model, before the call, rather than left to per-provider folklore. + + Type: [`RouterChargesOnPolicyRejection`](#routerchargesonpolicyrejection) + ### RouterModelDetail @@ -375,9 +825,13 @@ Type: `object` Optional fields returned by the model-details endpoint. -| Field | Type | Required | Constraints | Description | -| --- | --- | --- | --- | --- | -| `input_schema_url` | string | no | HTTPS URL, e.g. `https://api.comfy.org/v2/models/bfl/flux-2-pro/openapi.json`, Up to 2048 characters | URL of this model's OpenAPI document, including its input and output schemas. | +**Fields** + + + URL of this model's OpenAPI document, including its input and output schemas. + + HTTPS URL, e.g. `https://api.comfy.org/v2/models/bfl/flux-2-pro/openapi.json`, Up to 2048 characters + ### RouterModelId @@ -401,23 +855,59 @@ Type: `object` A model's ID and billing facts. -| Field | Type | Required | Constraints | Description | -| --- | --- | --- | --- | --- | -| `id` | [`RouterModelId`](#routermodelid) | yes | Model ID, e.g. `anthropic/claude-opus-4-6`, Up to 193 characters | A canonical Comfy Router model ID, `{provider}/{model}` - exactly the value that addresses the model on `POST /v2/models/{provider}/{model}`, so a caller can interpolate it into that path without re-deriving it from anything. Its `pattern` is `RouterProviderSegment` and `RouterModelSegment` joined by a single `/`, and `maxLength` is their sum plus that separator. | -| `provider` | [`RouterProviderSegment`](#routerprovidersegment) | yes | Alphanumeric slug, e.g. `anthropic`, Up to 64 characters | Lowercase `provider` segment of the canonical `{provider}/{model}` model ID - the partner whose model is being addressed. The invocation route's `provider` path parameter and a catalog entry's `provider` field both reference this one schema, which is what keeps the listed IDs and the accepted IDs from drifting apart. | -| `model` | [`RouterModelSegment`](#routermodelsegment) | yes | Alphanumeric slug, e.g. `claude-opus-4-6`, Up to 128 characters | Lowercase `model` segment of the canonical `{provider}/{model}` model ID - the model to run within that provider. Shared by the invocation route's `model` path parameter and a catalog entry's `model` field, for the same no-drift reason as `RouterProviderSegment`. | -| `billing` | [`RouterModelBilling`](#routermodelbilling) | yes | - | Per-model billing FACTS a caller needs before invoking - not prices. Usage and cost figures never appear here. | +**Fields** + + + A canonical Comfy Router model ID, `{provider}/{model}` - exactly the value that addresses the model on `POST /v2/models/{provider}/{model}`, so a caller can interpolate it into that path without re-deriving it from anything. Its `pattern` is `RouterProviderSegment` and `RouterModelSegment` joined by a single `/`, and `maxLength` is their sum plus that separator. + + Type: [`RouterModelId`](#routermodelid) -- Model ID, e.g. `anthropic/claude-opus-4-6`, Up to 193 characters + + + + Lowercase `provider` segment of the canonical `{provider}/{model}` model ID - the partner whose model is being addressed. The invocation route's `provider` path parameter and a catalog entry's `provider` field both reference this one schema, which is what keeps the listed IDs and the accepted IDs from drifting apart. + + Type: [`RouterProviderSegment`](#routerprovidersegment) -- Alphanumeric slug, e.g. `anthropic`, Up to 64 characters + + + + Lowercase `model` segment of the canonical `{provider}/{model}` model ID - the model to run within that provider. Shared by the invocation route's `model` path parameter and a catalog entry's `model` field, for the same no-drift reason as `RouterProviderSegment`. + + Type: [`RouterModelSegment`](#routermodelsegment) -- Alphanumeric slug, e.g. `claude-opus-4-6`, Up to 128 characters + + + + Per-model billing facts a caller needs before invoking - not prices. Usage and cost figures never appear here. + + Type: [`RouterModelBilling`](#routermodelbilling) + ### RouterModelListResponse One page of the Router model catalog. -| Field | Type | Required | Constraints | Description | -| --- | --- | --- | --- | --- | -| `data` | array of [`RouterModelListEntry`](#routermodellistentry) | yes | - | The models on this page, at most `limit` of them. | -| `has_more` | boolean | yes | - | Whether another page exists beyond this one. Keep walking while this is true; do not infer the end of the catalog from a short or empty `data`. | -| `next_cursor` | [`RouterPageCursor`](#routerpagecursor) | no | Opaque cursor returned as `next_cursor`, 1–512 characters | An OPAQUE cursor into a Router list. It is produced by the server and only ever round-tripped: it is not an offset, not a model ID, not ordered, and not stable across catalog rebuilds, so parsing one, incrementing one, or persisting one beyond the walk it came from are all outside the contract. Cursor rather than offset because the catalog is a moving list - an offset walk silently skips or repeats entries when entries are added or removed mid-walk, and a caller cannot tell that it happened. | -| `limit` | integer | yes | 1–100 | The page size actually served. A requested `limit` above the maximum is CLAMPED down to the maximum rather than rejected, so this can be smaller than the value asked for - paginate with this number, not with the one you sent, or you will assume rows you never received. | +**Fields** + + + The models on this page, at most `limit` of them. + + Type: array of [`RouterModelListEntry`](#routermodellistentry) + + + + Whether another page exists beyond this one. Keep walking while this is true; do not infer the end of the catalog from a short or empty `data`. + + + + An opaque cursor into a Router list. It is produced by the server and only ever round-tripped: it is not an offset, not a model ID, not ordered, and not stable across catalog rebuilds, so parsing one, incrementing one, or persisting one beyond the walk it came from are all outside the contract. Cursor rather than offset because the catalog is a moving list - an offset walk silently skips or repeats entries when entries are added or removed mid-walk, and a caller cannot tell that it happened. + + Type: [`RouterPageCursor`](#routerpagecursor) -- Opaque cursor returned as `next_cursor`, 1–512 characters + + + + The page size actually served. A requested `limit` above the maximum is clamped down to the maximum rather than rejected, so this can be smaller than the value asked for - paginate with this number, not with the one you sent, or you will assume rows you never received. + + 1–100 + ### RouterModelOutput @@ -447,10 +937,19 @@ Type: `string` -- Alphanumeric slug, e.g. `anthropic`, Up to 64 characters The answer to a cancellation ask on the two statuses that describe a request this route resolved - the `202` and the `400`. One body shape across both rather than a success envelope plus an error envelope, because both are the same statement - what cancelling found - and a client that has to parse a different type per status code gains nothing from the split. -| Field | Type | Required | Constraints | Description | -| --- | --- | --- | --- | --- | -| `request_id` | [`RouterQueueRequestId`](#routerqueuerequestid) | yes | `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 characters | Identifier of one queued Router request - the handle a caller polls, cancels and collects a result by. | -| `status` | [`RouterQueueCancelStatus`](#routerqueuecancelstatus) | yes | - | What a cancellation ask found, for the two outcomes that describe a request this route actually resolved. Both are mirrored by the HTTP status, so a client may branch on either. | +**Fields** + + + Identifier of one queued Router request - the handle a caller polls, cancels and collects a result by. + + Type: [`RouterQueueRequestId`](#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 characters + + + + What a cancellation ask found, for the two outcomes that describe a request this route actually resolved. Both are mirrored by the HTTP status, so a client may branch on either. + + Type: [`RouterQueueCancelStatus`](#routerqueuecancelstatus) + ### RouterQueueCancelStatus @@ -472,7 +971,7 @@ Type: `string` -- `pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0- ### RouterQueueStatus -The state of a queued Router request. EXACTLY THREE VALUES, and unlike `RouterErrorType` this one IS a closed `enum`, because the two schemas are closed in opposite directions on purpose. `RouterErrorType` classifies failures and its set is expected to grow, so a generated client that hard-rejected an unrecognised bucket would fail hardest exactly when something had already gone wrong. This one is a lifecycle, and a lifecycle with a fourth state added later is a breaking change to every polling loop written against it whether it is declared as an enum or not - so it is declared as one, and the constraint is stated where a client can see it. +The state of a queued Router request. It has exactly three values, and unlike `RouterErrorType` this one is a closed `enum`, because the two schemas are closed in opposite directions on purpose. `RouterErrorType` classifies failures and its set is expected to grow, so a generated client that hard-rejected an unrecognised bucket would fail hardest exactly when something had already gone wrong. This one is a lifecycle, and a lifecycle with a fourth state added later is a breaking change to every polling loop written against it whether it is declared as an enum or not - so it is declared as one, and the constraint is stated where a client can see it. Type: `string` @@ -480,12 +979,31 @@ Type: `string` The half of `RouterQueueStatusResponse` that is not the URL block: one queued request's identity, its current state, and - when that state is terminal and the run did not succeed - the coarse bucket saying why. -| Field | Type | Required | Constraints | Description | -| --- | --- | --- | --- | --- | -| `request_id` | [`RouterQueueRequestId`](#routerqueuerequestid) | yes | `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 characters | Identifier of one queued Router request - the handle a caller polls, cancels and collects a result by. | -| `status` | [`RouterQueueStatus`](#routerqueuestatus) | yes | - | The state of a queued Router request. EXACTLY THREE VALUES, and unlike `RouterErrorType` this one IS a closed `enum`, because the two schemas are closed in opposite directions on purpose. `RouterErrorType` classifies failures and its set is expected to grow, so a generated client that hard-rejected an unrecognised bucket would fail hardest exactly when something had already gone wrong. This one is a lifecycle, and a lifecycle with a fourth state added later is a breaking change to every polling loop written against it whether it is declared as an enum or not - so it is declared as one, and the constraint is stated where a client can see it. | -| `queue_position` | [`RouterQueuePosition`](#routerqueueposition) | no | At least 0 | How many requests are ahead of this one in the queue, at the instant the response was composed. Zero means this request is at the front. | -| `error_type` | [`RouterErrorType`](#routererrortype) | no | - | Present ONLY on a `COMPLETED` request that did not succeed, carrying the same coarse bucket the result read puts on `X-Comfy-Error-Type` when it returns that failure. It is what distinguishes a terminal request that succeeded from one that failed or was cancelled - there is no separate terminal status for either - and it is ABSENT on success rather than null, so branch on its presence. | +**Fields** + + + Identifier of one queued Router request - the handle a caller polls, cancels and collects a result by. + + Type: [`RouterQueueRequestId`](#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 characters + + + + The state of a queued Router request. It has exactly three values, and unlike `RouterErrorType` this one is a closed `enum`, because the two schemas are closed in opposite directions on purpose. `RouterErrorType` classifies failures and its set is expected to grow, so a generated client that hard-rejected an unrecognised bucket would fail hardest exactly when something had already gone wrong. This one is a lifecycle, and a lifecycle with a fourth state added later is a breaking change to every polling loop written against it whether it is declared as an enum or not - so it is declared as one, and the constraint is stated where a client can see it. + + Type: [`RouterQueueStatus`](#routerqueuestatus) + + + + How many requests are ahead of this one in the queue, at the instant the response was composed. Zero means this request is at the front. + + Type: [`RouterQueuePosition`](#routerqueueposition) -- At least 0 + + + + Present only on a `COMPLETED` request that did not succeed, carrying the same coarse bucket the result read puts on `X-Comfy-Error-Type` when it returns that failure. It is what distinguishes a terminal request that succeeded from one that failed or was cancelled - there is no separate terminal status for either - and it is absent on success rather than null, so branch on its presence. + + Type: [`RouterErrorType`](#routererrortype) + ### RouterQueueStatusResponse @@ -499,11 +1017,25 @@ Type: `object` The half of `RouterQueueSubmitResponse` that is not the URL block: the new request's identity and its state at the instant it was admitted. -| Field | Type | Required | Constraints | Description | -| --- | --- | --- | --- | --- | -| `request_id` | [`RouterQueueRequestId`](#routerqueuerequestid) | yes | `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 characters | Identifier of one queued Router request - the handle a caller polls, cancels and collects a result by. | -| `status` | [`RouterQueueStatus`](#routerqueuestatus) | yes | - | The state of a queued Router request. EXACTLY THREE VALUES, and unlike `RouterErrorType` this one IS a closed `enum`, because the two schemas are closed in opposite directions on purpose. `RouterErrorType` classifies failures and its set is expected to grow, so a generated client that hard-rejected an unrecognised bucket would fail hardest exactly when something had already gone wrong. This one is a lifecycle, and a lifecycle with a fourth state added later is a breaking change to every polling loop written against it whether it is declared as an enum or not - so it is declared as one, and the constraint is stated where a client can see it. | -| `queue_position` | [`RouterQueuePosition`](#routerqueueposition) | no | At least 0 | How many requests are ahead of this one in the queue, at the instant the response was composed. Zero means this request is at the front. | +**Fields** + + + Identifier of one queued Router request - the handle a caller polls, cancels and collects a result by. + + Type: [`RouterQueueRequestId`](#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 characters + + + + The state of a queued Router request. It has exactly three values, and unlike `RouterErrorType` this one is a closed `enum`, because the two schemas are closed in opposite directions on purpose. `RouterErrorType` classifies failures and its set is expected to grow, so a generated client that hard-rejected an unrecognised bucket would fail hardest exactly when something had already gone wrong. This one is a lifecycle, and a lifecycle with a fourth state added later is a breaking change to every polling loop written against it whether it is declared as an enum or not - so it is declared as one, and the constraint is stated where a client can see it. + + Type: [`RouterQueueStatus`](#routerqueuestatus) + + + + How many requests are ahead of this one in the queue, at the instant the response was composed. Zero means this request is at the front. + + Type: [`RouterQueuePosition`](#routerqueueposition) -- At least 0 + ### RouterQueueSubmitResponse @@ -517,11 +1049,25 @@ Type: `object` The three URLs that address the rest of one queued request's lifetime, returned on every response that carries a live handle so a client never composes a queue URL itself. -| Field | Type | Required | Constraints | Description | -| --- | --- | --- | --- | --- | -| `status_url` | string | yes | URI | Absolute URL of this request's status read. | -| `response_url` | string | yes | URI | Absolute URL this request's result is collected from. | -| `cancel_url` | string | yes | URI | Absolute URL a cancellation is asked for at. | +**Fields** + + + Absolute URL of this request's status read. + + URI + + + + Absolute URL this request's result is collected from. + + URI + + + + Absolute URL a cancellation is asked for at. + + URI + ### RouterValidationErrorContext @@ -533,13 +1079,31 @@ Type: `object` One field-level validation failure. -| Field | Type | Required | Constraints | Description | -| --- | --- | --- | --- | --- | -| `loc` | array of any | yes | - | Path to the offending field, outermost segment first - for example `["body", "image_url"]`, or `["body", "images", 0]` where an integer indexes into an array. | -| `msg` | string | yes | - | Human-readable description of this single failure. | -| `type` | string | yes | - | Specific, machine-readable reason for this failure, passed through from the provider unchanged. This is the value a typed SDK exception hierarchy branches on; `error_type` on the response header is only its coarse bucket. | -| `ctx` | [`RouterValidationErrorContext`](#routervalidationerrorcontext) | no | - | The violated bound for one `RouterValidationErrorDetail`, carried from the provider verbatim - for example `{"limit_value": 8}` alongside `greater_than`, `{"min_width": 512}` alongside `image_too_small`, or `{"max_size_bytes": 10485760}` alongside `file_too_large`. The key set is specific to the provider and the error type, so this is deliberately an open object: narrowing it to a fixed field list, or folding it into the `msg` string, is precisely how a ported integration compiles and then silently loses the branch that read the bound. Absent when the error type carries no bound. | -| `input` | [`RouterValidationErrorInput`](#routervalidationerrorinput) | no | - | The offending input value, echoed back verbatim so a caller can see what was rejected without re-deriving it from `loc`. Any JSON type - string, number, boolean, array, object or null - so this schema is deliberately left untyped rather than narrowed to an object. Absent when the provider does not echo the input back. | +**Fields** + + + Path to the offending field, outermost segment first - for example `["body", "image_url"]`, or `["body", "images", 0]` where an integer indexes into an array. + + + + Human-readable description of this single failure. + + + + Specific, machine-readable reason for this failure, passed through from the provider unchanged. This is the value a typed SDK exception hierarchy branches on; `error_type` on the response header is only its coarse bucket. + + + + The violated bound for one `RouterValidationErrorDetail`, carried from the provider verbatim - for example `{"limit_value": 8}` alongside `greater_than`, `{"min_width": 512}` alongside `image_too_small`, or `{"max_size_bytes": 10485760}` alongside `file_too_large`. The key set is specific to the provider and the error type, so this is deliberately an open object: narrowing it to a fixed field list, or folding it into the `msg` string, is precisely how a ported integration compiles and then silently loses the branch that read the bound. Absent when the error type carries no bound. + + Type: [`RouterValidationErrorContext`](#routervalidationerrorcontext) + + + + The offending input value, echoed back verbatim so a caller can see what was rejected without re-deriving it from `loc`. Any JSON type - string, number, boolean, array, object or null - so this schema is deliberately left untyped rather than narrowed to an object. Absent when the provider does not echo the input back. + + Type: [`RouterValidationErrorInput`](#routervalidationerrorinput) + ### RouterValidationErrorInput @@ -549,6 +1113,10 @@ The rejected input value, when the provider includes it. The `422` validation error body. Read `X-Comfy-Error-Type` for its category. -| Field | Type | Required | Constraints | Description | -| --- | --- | --- | --- | --- | -| `detail` | array of [`RouterValidationErrorDetail`](#routervalidationerrordetail) | yes | - | Every validation failure found on the request, one entry per offending field. | +**Fields** + + + Every validation failure found on the request, one entry per offending field. + + Type: array of [`RouterValidationErrorDetail`](#routervalidationerrordetail) + diff --git a/docs.json b/docs.json index 6b1f54701..6bf4b22cc 100644 --- a/docs.json +++ b/docs.json @@ -3232,13 +3232,9 @@ "development/comfy-router/models/byteplus/seed-2-0-pro-260328/code", "development/comfy-router/models/byteplus/seed-audio-1-0-multilingual/code", "development/comfy-router/models/byteplus/seed-audio-1-0/code", - "development/comfy-router/models/byteplus/seedance-1-0-lite-i2v-250428/code", - "development/comfy-router/models/byteplus/seedance-1-0-lite-t2v-250428/code", "development/comfy-router/models/byteplus/seedance-1-0-pro-250528/code", "development/comfy-router/models/byteplus/seedance-1-0-pro-fast-251015/code", "development/comfy-router/models/byteplus/seedance-1-5-pro-251215/code", - "development/comfy-router/models/byteplus/seededit-3-0-i2i-250628/code", - "development/comfy-router/models/byteplus/seedream-3-0-t2i-250415/code", "development/comfy-router/models/byteplus/seedream-4-0-250828/code", "development/comfy-router/models/byteplus/seedream-4-5-251128/code", "development/comfy-router/models/byteplus/seedream-5-0-260128/code", diff --git a/openapi-v2.yaml b/openapi-v2.yaml index bc033dd0e..e6cff9c06 100644 --- a/openapi-v2.yaml +++ b/openapi-v2.yaml @@ -734,7 +734,9 @@ paths: summary: Request cancellation description: 'Requests cancellation and returns the current job object — - `canceling` (interruption takes effect at node/step boundaries) or + `canceling` (interruption takes effect at node/step boundaries), + + `canceled` where the provider''s record already shows the interrupt, or already-terminal. Idempotent: canceling a finished job is a no-op diff --git a/router-schemas/byteplus/dreamina-seedance-2-0-260128.json b/router-schemas/byteplus/dreamina-seedance-2-0-260128.json index cc7968fa8..490ca6f4a 100644 --- a/router-schemas/byteplus/dreamina-seedance-2-0-260128.json +++ b/router-schemas/byteplus/dreamina-seedance-2-0-260128.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"byteplus/dreamina-seedance-2-0-260128","description":"The request body Comfy Router accepts for the model \"byteplus/dreamina-seedance-2-0-260128\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"24f00ebf8e3f"},"paths":{"/v2/models/byteplus/dreamina-seedance-2-0-260128":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/dreamina-seedance-2-0-260128 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for a BytePlus Seedance / Dreamina video generation task. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks must add `model` to it. This text-to-video example requires an additional `content` item with `type: image_url` and an `image_url.url` for seedance-1-0-lite-i2v-250428. Text-only models must omit that image item.\n`content` is the whole `required` floor, and it is the floor the v1 surface already published and videoGenerationProxy's Rewrite already refuses an empty value for. Everything else BytePlus accepts varies by model — the per-model resolutions, durations, ratios and input kinds are documented on the individual fields — so the enums and bounds below are the union BytePlus admits across the family and BytePlus stays the authority on which member accepts which value.","example":{"content":[{"text":"A red fox trotting through a snowy pine forest","type":"text"}],"duration":5,"ratio":"16:9","resolution":"720p"},"properties":{"callback_url":{"description":"Callback notification address for the result of this generation task","format":"uri","type":"string"},"content":{"description":"The input content for the model to generate a video","items":{"$ref":"#/components/schemas/BytePlusVideoGenerationContent"},"minItems":1,"type":"array"},"duration":{"anyOf":[{"enum":[-1]},{"maximum":30,"minimum":2}],"description":"Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 \u0026 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12].\n","type":"integer"},"execution_expires_after":{"description":"Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200].\n","maximum":259200,"minimum":3600,"type":"integer"},"generate_audio":{"default":true,"description":"Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals.\ntrue: The model outputs a video with synchronized audio.\nfalse: The model outputs a silent video.\n","type":"boolean"},"model":{"description":"The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"output_format":{"default":"mp4","description":"Seedance 2.5 only. Container format of the output video.\nmp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size.\nmov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size.\n","enum":["mp4","mov"],"type":"string"},"ratio":{"description":"Aspect ratio of the generated video. Seedance 2.0 \u0026 2.0 fast, 1.5 pro default: adaptive.\n","enum":["16:9","4:3","1:1","3:4","9:16","21:9","9:21","adaptive"],"type":"string"},"resolution":{"description":"Video resolution. Seedance 2.5, 2.0 \u0026 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro \u0026 pro-fast default: 1080p.\nNote: Seedance 2.0 \u0026 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p.\n","enum":["480p","720p","1080p","4k"],"type":"string"},"return_last_frame":{"default":false,"description":"Whether to return the last frame image of the generated video.\ntrue: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos.\nfalse: Does not return the last frame image of the generated video.\n","type":"boolean"},"seed":{"description":"Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed.\n","maximum":4294967295,"minimum":-1,"type":"integer"},"service_tier":{"description":"Service tier for processing. Seedance 2.5, 2.0 \u0026 2.0 fast do not support flex (offline inference).\n","enum":["default","flex"],"type":"string"},"watermark":{"default":false,"description":"Whether the generated video includes a watermark.","type":"boolean"}},"required":["content"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusVideoGenerationQueryResponse"}],"description":"Comfy Router output schema for the BytePlus Seedance video models: the terminal task-query document, forwarded unchanged EXCEPT for the two re-hosted `content` URLs described below - every other field is BytePlus's own. The operation is submit-and-poll and Router polls on the caller's behalf, so the body a caller receives is the finished task (`status: succeeded`) rather than the task handle the underlying submit returns.\nThe generated video's download URL is at `content.video_url`, present once the task succeeds. A failed task carries `error.code` and `error.message` instead; `status` is BytePlus's own vocabulary (queued, running, cancelled, succeeded, failed, expired), forwarded unchanged.\nThat URL is RE-HOSTED: Router copies the finished video onto Comfy storage and answers a Comfy-signed URL valid for up to 24 hours in place of BytePlus's own, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Exactly two leaves are rewritten this way - `content.video_url` and `content.last_frame_url`, both modelled here. Any OTHER asset URL a task carries keeps BytePlus's own link and is NOT flagged as non-durable, so a stored or replayed document can still hand back a link that BytePlus has since cleared.\nDurability is per leaf, not per response: a leaf whose re-host could not be performed keeps BytePlus's own URL rather than a Comfy one, and the other is unaffected - so a caller that stores or replays this document should not assume every URL in it outlives the call. 24 hours is the CEILING, not a guarantee: the Comfy link is signed for 24 hours from the moment it is minted, and Router memoises it for 23 hours, so a later poll or an `Idempotency-Key` replay can hand back a link with as little as an hour left. Either way the link expires, so download the asset rather than storing it.","example":{"content":{"last_frame_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame","video_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4"},"created_at":1767225600,"duration":5,"error":null,"id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","model":"seedance-1-0-lite-t2v-250428","output_format":"mp4","resolution":"1080p","seed":1234567890123,"status":"succeeded","updated_at":1767225730}}}}}}}}},"components":{"schemas":{"BytePlusVideoGenerationContent":{"oneOf":[{"properties":{"type":{"enum":["text"]}},"required":["text"]},{"properties":{"type":{"enum":["image_url"]}},"required":["image_url"]},{"properties":{"type":{"enum":["video_url"]}},"required":["video_url"]},{"properties":{"type":{"enum":["audio_url"]}},"required":["audio_url"]}],"properties":{"audio_url":{"description":"Input audio object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support audio input. Seedance 2.0 \u0026 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input.","properties":{"url":{"description":"Audio URL, Base64 encoding, or Asset ID.\nAudio URL: Public URL of the audio (wav, mp3).\nBase64: Format data:audio/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"image_url":{"properties":{"url":{"description":"Image content for image-to-video generation (when type is \"image_url\")\nImage URL: Make sure that the image URL is accessible.\nBase64-encoded content: Format must be data:image/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"role":{"description":"The role/position of the content item.\nFor images: first_frame, last_frame, or reference_image.\nFor videos: reference_video (Seedance 2.5, 2.0 \u0026 2.0 fast only).\nFor audio: reference_audio (Seedance 2.5, 2.0 \u0026 2.0 fast only).\n","enum":["first_frame","last_frame","reference_image","reference_video","reference_audio"],"type":"string"},"text":{"description":"The input text information for the model. Includes text prompt and optional parameters.\n\nText prompt (required): Description of the video to be generated using Chinese and English characters.\n\nParameters (optional): Add --[parameters] after the text prompt to control video specifications:\n- --resolution (--rs): 480p, 720p, 1080p (default: 720p)\n- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive)\n- --duration (--dur): 3-12 seconds (default: 5)\n- --framepersecond (--fps): 24 (default: 24)\n- --watermark (--wm): true/false (default: false)\n- --seed (--seed): -1 to 2^32-1 (default: -1)\n- --camerafixed (--cf): true/false (default: false)\n\nExample: \"A beautiful landscape --ratio 16:9 --resolution 720p --duration 5\"\n","maxLength":4096,"type":"string"},"type":{"description":"The type of the input content","enum":["text","image_url","video_url","audio_url"],"type":"string"},"video_url":{"description":"Input video object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support video input.","properties":{"url":{"description":"Video URL or Asset ID.\nVideo URL: Public URL of the video (mp4, mov).\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"}},"required":["type"],"type":"object"},"BytePlusVideoGenerationQueryResponse":{"properties":{"content":{"description":"The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null.","nullable":true,"properties":{"last_frame_url":{"description":"Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL.","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present.","type":"string"},"video_url":{"description":"Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL.","type":"string"}},"type":"object"},"created_at":{"description":"The time when the task was created. The value is a UNIX timestamp in seconds.","type":"integer"},"duration":{"description":"The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"number"},"error":{"description":"The error information. If the task succeeds, null is returned. If the task fails, the error information is returned.","nullable":true,"properties":{"code":{"description":"The error code","type":"string"},"message":{"description":"The error message","type":"string"}},"type":"object"},"id":{"description":"The ID of the video generation task","type":"string"},"model":{"description":"The name and version of the model used by the task","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged.","type":"string"},"resolution":{"description":"The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"string"},"seed":{"description":"The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","format":"int64","type":"integer"},"status":{"description":"The state of the task","enum":["queued","running","cancelled","succeeded","failed","expired"],"type":"string"},"updated_at":{"description":"The time when the task was last updated. The value is a UNIX timestamp in seconds.","type":"integer"},"usage":{"description":"The token usage for the request","properties":{"completion_tokens":{"description":"The number of tokens generated by the model","type":"integer"},"total_tokens":{"description":"For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/dreamina-seedance-2-0-260128","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"byteplus/dreamina-seedance-2-0-260128","description":"The request body Comfy Router accepts for the model \"byteplus/dreamina-seedance-2-0-260128\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"4e57ccd98b5d"},"paths":{"/v2/models/byteplus/dreamina-seedance-2-0-260128":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/dreamina-seedance-2-0-260128 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for a BytePlus Seedance / Dreamina video generation task. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks must add `model` to it. This text-to-video example omits the `content` item with `type: image_url` and an `image_url.url` that an image-to-video call supplies; text-only models must omit that image item.\n`content` is the whole `required` floor, and it is the floor the v1 surface already published and videoGenerationProxy's Rewrite already refuses an empty value for. Everything else BytePlus accepts varies by model — the per-model resolutions, durations, ratios and input kinds are documented on the individual fields — so the enums and bounds below are the union BytePlus admits across the family and BytePlus stays the authority on which member accepts which value.","example":{"content":[{"text":"A red fox trotting through a snowy pine forest","type":"text"}],"duration":5,"ratio":"16:9","resolution":"720p"},"properties":{"callback_url":{"description":"Callback notification address for the result of this generation task","format":"uri","type":"string"},"content":{"description":"The input content for the model to generate a video","items":{"$ref":"#/components/schemas/BytePlusVideoGenerationContent"},"minItems":1,"type":"array"},"duration":{"anyOf":[{"enum":[-1]},{"maximum":30,"minimum":2}],"description":"Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 \u0026 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12].\n","type":"integer"},"execution_expires_after":{"description":"Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200].\n","maximum":259200,"minimum":3600,"type":"integer"},"generate_audio":{"default":true,"description":"Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals.\ntrue: The model outputs a video with synchronized audio.\nfalse: The model outputs a silent video.\n","type":"boolean"},"model":{"description":"The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"output_format":{"default":"mp4","description":"Seedance 2.5 only. Container format of the output video.\nmp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size.\nmov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size.\n","enum":["mp4","mov"],"type":"string"},"ratio":{"description":"Aspect ratio of the generated video. Seedance 2.0 \u0026 2.0 fast, 1.5 pro default: adaptive.\n","enum":["16:9","4:3","1:1","3:4","9:16","21:9","9:21","adaptive"],"type":"string"},"resolution":{"description":"Video resolution. Seedance 2.5, 2.0 \u0026 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro \u0026 pro-fast default: 1080p.\nNote: Seedance 2.0 \u0026 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p.\n","enum":["480p","720p","1080p","4k"],"type":"string"},"return_last_frame":{"default":false,"description":"Whether to return the last frame image of the generated video.\ntrue: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos.\nfalse: Does not return the last frame image of the generated video.\n","type":"boolean"},"seed":{"description":"Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed.\n","maximum":4294967295,"minimum":-1,"type":"integer"},"service_tier":{"description":"Service tier for processing. Seedance 2.5, 2.0 \u0026 2.0 fast do not support flex (offline inference).\n","enum":["default","flex"],"type":"string"},"watermark":{"default":false,"description":"Whether the generated video includes a watermark.","type":"boolean"}},"required":["content"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusVideoGenerationQueryResponse"}],"description":"Comfy Router output schema for the BytePlus Seedance video models: the terminal task-query document, forwarded unchanged EXCEPT for the two re-hosted `content` URLs described below - every other field is BytePlus's own. The operation is submit-and-poll and Router polls on the caller's behalf, so the body a caller receives is the finished task (`status: succeeded`) rather than the task handle the underlying submit returns.\nThe generated video's download URL is at `content.video_url`, present once the task succeeds. A failed task carries `error.code` and `error.message` instead; `status` is BytePlus's own vocabulary (queued, running, cancelled, succeeded, failed, expired), forwarded unchanged.\nThat URL is RE-HOSTED: Router copies the finished video onto Comfy storage and answers a Comfy-signed URL valid for up to 24 hours in place of BytePlus's own, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Exactly two leaves are rewritten this way - `content.video_url` and `content.last_frame_url`, both modelled here. Any OTHER asset URL a task carries keeps BytePlus's own link and is NOT flagged as non-durable, so a stored or replayed document can still hand back a link that BytePlus has since cleared.\nDurability is per leaf, not per response: a leaf whose re-host could not be performed keeps BytePlus's own URL rather than a Comfy one, and the other is unaffected - so a caller that stores or replays this document should not assume every URL in it outlives the call. 24 hours is the CEILING, not a guarantee: the Comfy link is signed for 24 hours from the moment it is minted, and Router memoises it for 23 hours, so a later poll or an `Idempotency-Key` replay can hand back a link with as little as an hour left. Either way the link expires, so download the asset rather than storing it.","example":{"content":{"last_frame_url":"https://example.invalid/byteplus/seedance-1-0-pro-250528/last-frame","video_url":"https://example.invalid/byteplus/seedance-1-0-pro-250528/generated.mp4"},"created_at":1767225600,"duration":5,"error":null,"id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","model":"seedance-1-0-pro-250528","output_format":"mp4","resolution":"1080p","seed":1234567890123,"status":"succeeded","updated_at":1767225730}}}}}}}}},"components":{"schemas":{"BytePlusVideoGenerationContent":{"oneOf":[{"properties":{"type":{"enum":["text"]}},"required":["text"]},{"properties":{"type":{"enum":["image_url"]}},"required":["image_url"]},{"properties":{"type":{"enum":["video_url"]}},"required":["video_url"]},{"properties":{"type":{"enum":["audio_url"]}},"required":["audio_url"]}],"properties":{"audio_url":{"description":"Input audio object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support audio input. Seedance 2.0 \u0026 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input.","properties":{"url":{"description":"Audio URL, Base64 encoding, or Asset ID.\nAudio URL: Public URL of the audio (wav, mp3).\nBase64: Format data:audio/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"image_url":{"properties":{"url":{"description":"Image content for image-to-video generation (when type is \"image_url\")\nImage URL: Make sure that the image URL is accessible.\nBase64-encoded content: Format must be data:image/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"role":{"description":"The role/position of the content item.\nFor images: first_frame, last_frame, or reference_image.\nFor videos: reference_video (Seedance 2.5, 2.0 \u0026 2.0 fast only).\nFor audio: reference_audio (Seedance 2.5, 2.0 \u0026 2.0 fast only).\n","enum":["first_frame","last_frame","reference_image","reference_video","reference_audio"],"type":"string"},"text":{"description":"The input text information for the model. Includes text prompt and optional parameters.\n\nText prompt (required): Description of the video to be generated using Chinese and English characters.\n\nParameters (optional): Add --[parameters] after the text prompt to control video specifications:\n- --resolution (--rs): 480p, 720p, 1080p (default: 720p)\n- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive)\n- --duration (--dur): 3-12 seconds (default: 5)\n- --framepersecond (--fps): 24 (default: 24)\n- --watermark (--wm): true/false (default: false)\n- --seed (--seed): -1 to 2^32-1 (default: -1)\n- --camerafixed (--cf): true/false (default: false)\n\nExample: \"A beautiful landscape --ratio 16:9 --resolution 720p --duration 5\"\n","maxLength":4096,"type":"string"},"type":{"description":"The type of the input content","enum":["text","image_url","video_url","audio_url"],"type":"string"},"video_url":{"description":"Input video object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support video input.","properties":{"url":{"description":"Video URL or Asset ID.\nVideo URL: Public URL of the video (mp4, mov).\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"}},"required":["type"],"type":"object"},"BytePlusVideoGenerationQueryResponse":{"properties":{"content":{"description":"The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null.","nullable":true,"properties":{"last_frame_url":{"description":"Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL.","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present.","type":"string"},"video_url":{"description":"Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL.","type":"string"}},"type":"object"},"created_at":{"description":"The time when the task was created. The value is a UNIX timestamp in seconds.","type":"integer"},"duration":{"description":"The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"number"},"error":{"description":"The error information. If the task succeeds, null is returned. If the task fails, the error information is returned.","nullable":true,"properties":{"code":{"description":"The error code","type":"string"},"message":{"description":"The error message","type":"string"}},"type":"object"},"id":{"description":"The ID of the video generation task","type":"string"},"model":{"description":"The name and version of the model used by the task","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged.","type":"string"},"resolution":{"description":"The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"string"},"seed":{"description":"The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","format":"int64","type":"integer"},"status":{"description":"The state of the task","enum":["queued","running","cancelled","succeeded","failed","expired"],"type":"string"},"updated_at":{"description":"The time when the task was last updated. The value is a UNIX timestamp in seconds.","type":"integer"},"usage":{"description":"The token usage for the request","properties":{"completion_tokens":{"description":"The number of tokens generated by the model","type":"integer"},"total_tokens":{"description":"For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/dreamina-seedance-2-0-260128","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/byteplus/dreamina-seedance-2-0-fast-260128.json b/router-schemas/byteplus/dreamina-seedance-2-0-fast-260128.json index 0e734e65f..a6bcbc9e6 100644 --- a/router-schemas/byteplus/dreamina-seedance-2-0-fast-260128.json +++ b/router-schemas/byteplus/dreamina-seedance-2-0-fast-260128.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"byteplus/dreamina-seedance-2-0-fast-260128","description":"The request body Comfy Router accepts for the model \"byteplus/dreamina-seedance-2-0-fast-260128\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"24f00ebf8e3f"},"paths":{"/v2/models/byteplus/dreamina-seedance-2-0-fast-260128":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/dreamina-seedance-2-0-fast-260128 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for a BytePlus Seedance / Dreamina video generation task. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks must add `model` to it. This text-to-video example requires an additional `content` item with `type: image_url` and an `image_url.url` for seedance-1-0-lite-i2v-250428. Text-only models must omit that image item.\n`content` is the whole `required` floor, and it is the floor the v1 surface already published and videoGenerationProxy's Rewrite already refuses an empty value for. Everything else BytePlus accepts varies by model — the per-model resolutions, durations, ratios and input kinds are documented on the individual fields — so the enums and bounds below are the union BytePlus admits across the family and BytePlus stays the authority on which member accepts which value.","example":{"content":[{"text":"A red fox trotting through a snowy pine forest","type":"text"}],"duration":5,"ratio":"16:9","resolution":"720p"},"properties":{"callback_url":{"description":"Callback notification address for the result of this generation task","format":"uri","type":"string"},"content":{"description":"The input content for the model to generate a video","items":{"$ref":"#/components/schemas/BytePlusVideoGenerationContent"},"minItems":1,"type":"array"},"duration":{"anyOf":[{"enum":[-1]},{"maximum":30,"minimum":2}],"description":"Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 \u0026 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12].\n","type":"integer"},"execution_expires_after":{"description":"Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200].\n","maximum":259200,"minimum":3600,"type":"integer"},"generate_audio":{"default":true,"description":"Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals.\ntrue: The model outputs a video with synchronized audio.\nfalse: The model outputs a silent video.\n","type":"boolean"},"model":{"description":"The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"output_format":{"default":"mp4","description":"Seedance 2.5 only. Container format of the output video.\nmp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size.\nmov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size.\n","enum":["mp4","mov"],"type":"string"},"ratio":{"description":"Aspect ratio of the generated video. Seedance 2.0 \u0026 2.0 fast, 1.5 pro default: adaptive.\n","enum":["16:9","4:3","1:1","3:4","9:16","21:9","9:21","adaptive"],"type":"string"},"resolution":{"description":"Video resolution. Seedance 2.5, 2.0 \u0026 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro \u0026 pro-fast default: 1080p.\nNote: Seedance 2.0 \u0026 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p.\n","enum":["480p","720p","1080p","4k"],"type":"string"},"return_last_frame":{"default":false,"description":"Whether to return the last frame image of the generated video.\ntrue: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos.\nfalse: Does not return the last frame image of the generated video.\n","type":"boolean"},"seed":{"description":"Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed.\n","maximum":4294967295,"minimum":-1,"type":"integer"},"service_tier":{"description":"Service tier for processing. Seedance 2.5, 2.0 \u0026 2.0 fast do not support flex (offline inference).\n","enum":["default","flex"],"type":"string"},"watermark":{"default":false,"description":"Whether the generated video includes a watermark.","type":"boolean"}},"required":["content"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusVideoGenerationQueryResponse"}],"description":"Comfy Router output schema for the BytePlus Seedance video models: the terminal task-query document, forwarded unchanged EXCEPT for the two re-hosted `content` URLs described below - every other field is BytePlus's own. The operation is submit-and-poll and Router polls on the caller's behalf, so the body a caller receives is the finished task (`status: succeeded`) rather than the task handle the underlying submit returns.\nThe generated video's download URL is at `content.video_url`, present once the task succeeds. A failed task carries `error.code` and `error.message` instead; `status` is BytePlus's own vocabulary (queued, running, cancelled, succeeded, failed, expired), forwarded unchanged.\nThat URL is RE-HOSTED: Router copies the finished video onto Comfy storage and answers a Comfy-signed URL valid for up to 24 hours in place of BytePlus's own, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Exactly two leaves are rewritten this way - `content.video_url` and `content.last_frame_url`, both modelled here. Any OTHER asset URL a task carries keeps BytePlus's own link and is NOT flagged as non-durable, so a stored or replayed document can still hand back a link that BytePlus has since cleared.\nDurability is per leaf, not per response: a leaf whose re-host could not be performed keeps BytePlus's own URL rather than a Comfy one, and the other is unaffected - so a caller that stores or replays this document should not assume every URL in it outlives the call. 24 hours is the CEILING, not a guarantee: the Comfy link is signed for 24 hours from the moment it is minted, and Router memoises it for 23 hours, so a later poll or an `Idempotency-Key` replay can hand back a link with as little as an hour left. Either way the link expires, so download the asset rather than storing it.","example":{"content":{"last_frame_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame","video_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4"},"created_at":1767225600,"duration":5,"error":null,"id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","model":"seedance-1-0-lite-t2v-250428","output_format":"mp4","resolution":"1080p","seed":1234567890123,"status":"succeeded","updated_at":1767225730}}}}}}}}},"components":{"schemas":{"BytePlusVideoGenerationContent":{"oneOf":[{"properties":{"type":{"enum":["text"]}},"required":["text"]},{"properties":{"type":{"enum":["image_url"]}},"required":["image_url"]},{"properties":{"type":{"enum":["video_url"]}},"required":["video_url"]},{"properties":{"type":{"enum":["audio_url"]}},"required":["audio_url"]}],"properties":{"audio_url":{"description":"Input audio object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support audio input. Seedance 2.0 \u0026 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input.","properties":{"url":{"description":"Audio URL, Base64 encoding, or Asset ID.\nAudio URL: Public URL of the audio (wav, mp3).\nBase64: Format data:audio/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"image_url":{"properties":{"url":{"description":"Image content for image-to-video generation (when type is \"image_url\")\nImage URL: Make sure that the image URL is accessible.\nBase64-encoded content: Format must be data:image/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"role":{"description":"The role/position of the content item.\nFor images: first_frame, last_frame, or reference_image.\nFor videos: reference_video (Seedance 2.5, 2.0 \u0026 2.0 fast only).\nFor audio: reference_audio (Seedance 2.5, 2.0 \u0026 2.0 fast only).\n","enum":["first_frame","last_frame","reference_image","reference_video","reference_audio"],"type":"string"},"text":{"description":"The input text information for the model. Includes text prompt and optional parameters.\n\nText prompt (required): Description of the video to be generated using Chinese and English characters.\n\nParameters (optional): Add --[parameters] after the text prompt to control video specifications:\n- --resolution (--rs): 480p, 720p, 1080p (default: 720p)\n- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive)\n- --duration (--dur): 3-12 seconds (default: 5)\n- --framepersecond (--fps): 24 (default: 24)\n- --watermark (--wm): true/false (default: false)\n- --seed (--seed): -1 to 2^32-1 (default: -1)\n- --camerafixed (--cf): true/false (default: false)\n\nExample: \"A beautiful landscape --ratio 16:9 --resolution 720p --duration 5\"\n","maxLength":4096,"type":"string"},"type":{"description":"The type of the input content","enum":["text","image_url","video_url","audio_url"],"type":"string"},"video_url":{"description":"Input video object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support video input.","properties":{"url":{"description":"Video URL or Asset ID.\nVideo URL: Public URL of the video (mp4, mov).\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"}},"required":["type"],"type":"object"},"BytePlusVideoGenerationQueryResponse":{"properties":{"content":{"description":"The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null.","nullable":true,"properties":{"last_frame_url":{"description":"Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL.","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present.","type":"string"},"video_url":{"description":"Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL.","type":"string"}},"type":"object"},"created_at":{"description":"The time when the task was created. The value is a UNIX timestamp in seconds.","type":"integer"},"duration":{"description":"The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"number"},"error":{"description":"The error information. If the task succeeds, null is returned. If the task fails, the error information is returned.","nullable":true,"properties":{"code":{"description":"The error code","type":"string"},"message":{"description":"The error message","type":"string"}},"type":"object"},"id":{"description":"The ID of the video generation task","type":"string"},"model":{"description":"The name and version of the model used by the task","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged.","type":"string"},"resolution":{"description":"The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"string"},"seed":{"description":"The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","format":"int64","type":"integer"},"status":{"description":"The state of the task","enum":["queued","running","cancelled","succeeded","failed","expired"],"type":"string"},"updated_at":{"description":"The time when the task was last updated. The value is a UNIX timestamp in seconds.","type":"integer"},"usage":{"description":"The token usage for the request","properties":{"completion_tokens":{"description":"The number of tokens generated by the model","type":"integer"},"total_tokens":{"description":"For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/dreamina-seedance-2-0-fast-260128","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"byteplus/dreamina-seedance-2-0-fast-260128","description":"The request body Comfy Router accepts for the model \"byteplus/dreamina-seedance-2-0-fast-260128\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"4e57ccd98b5d"},"paths":{"/v2/models/byteplus/dreamina-seedance-2-0-fast-260128":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/dreamina-seedance-2-0-fast-260128 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for a BytePlus Seedance / Dreamina video generation task. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks must add `model` to it. This text-to-video example omits the `content` item with `type: image_url` and an `image_url.url` that an image-to-video call supplies; text-only models must omit that image item.\n`content` is the whole `required` floor, and it is the floor the v1 surface already published and videoGenerationProxy's Rewrite already refuses an empty value for. Everything else BytePlus accepts varies by model — the per-model resolutions, durations, ratios and input kinds are documented on the individual fields — so the enums and bounds below are the union BytePlus admits across the family and BytePlus stays the authority on which member accepts which value.","example":{"content":[{"text":"A red fox trotting through a snowy pine forest","type":"text"}],"duration":5,"ratio":"16:9","resolution":"720p"},"properties":{"callback_url":{"description":"Callback notification address for the result of this generation task","format":"uri","type":"string"},"content":{"description":"The input content for the model to generate a video","items":{"$ref":"#/components/schemas/BytePlusVideoGenerationContent"},"minItems":1,"type":"array"},"duration":{"anyOf":[{"enum":[-1]},{"maximum":30,"minimum":2}],"description":"Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 \u0026 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12].\n","type":"integer"},"execution_expires_after":{"description":"Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200].\n","maximum":259200,"minimum":3600,"type":"integer"},"generate_audio":{"default":true,"description":"Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals.\ntrue: The model outputs a video with synchronized audio.\nfalse: The model outputs a silent video.\n","type":"boolean"},"model":{"description":"The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"output_format":{"default":"mp4","description":"Seedance 2.5 only. Container format of the output video.\nmp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size.\nmov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size.\n","enum":["mp4","mov"],"type":"string"},"ratio":{"description":"Aspect ratio of the generated video. Seedance 2.0 \u0026 2.0 fast, 1.5 pro default: adaptive.\n","enum":["16:9","4:3","1:1","3:4","9:16","21:9","9:21","adaptive"],"type":"string"},"resolution":{"description":"Video resolution. Seedance 2.5, 2.0 \u0026 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro \u0026 pro-fast default: 1080p.\nNote: Seedance 2.0 \u0026 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p.\n","enum":["480p","720p","1080p","4k"],"type":"string"},"return_last_frame":{"default":false,"description":"Whether to return the last frame image of the generated video.\ntrue: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos.\nfalse: Does not return the last frame image of the generated video.\n","type":"boolean"},"seed":{"description":"Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed.\n","maximum":4294967295,"minimum":-1,"type":"integer"},"service_tier":{"description":"Service tier for processing. Seedance 2.5, 2.0 \u0026 2.0 fast do not support flex (offline inference).\n","enum":["default","flex"],"type":"string"},"watermark":{"default":false,"description":"Whether the generated video includes a watermark.","type":"boolean"}},"required":["content"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusVideoGenerationQueryResponse"}],"description":"Comfy Router output schema for the BytePlus Seedance video models: the terminal task-query document, forwarded unchanged EXCEPT for the two re-hosted `content` URLs described below - every other field is BytePlus's own. The operation is submit-and-poll and Router polls on the caller's behalf, so the body a caller receives is the finished task (`status: succeeded`) rather than the task handle the underlying submit returns.\nThe generated video's download URL is at `content.video_url`, present once the task succeeds. A failed task carries `error.code` and `error.message` instead; `status` is BytePlus's own vocabulary (queued, running, cancelled, succeeded, failed, expired), forwarded unchanged.\nThat URL is RE-HOSTED: Router copies the finished video onto Comfy storage and answers a Comfy-signed URL valid for up to 24 hours in place of BytePlus's own, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Exactly two leaves are rewritten this way - `content.video_url` and `content.last_frame_url`, both modelled here. Any OTHER asset URL a task carries keeps BytePlus's own link and is NOT flagged as non-durable, so a stored or replayed document can still hand back a link that BytePlus has since cleared.\nDurability is per leaf, not per response: a leaf whose re-host could not be performed keeps BytePlus's own URL rather than a Comfy one, and the other is unaffected - so a caller that stores or replays this document should not assume every URL in it outlives the call. 24 hours is the CEILING, not a guarantee: the Comfy link is signed for 24 hours from the moment it is minted, and Router memoises it for 23 hours, so a later poll or an `Idempotency-Key` replay can hand back a link with as little as an hour left. Either way the link expires, so download the asset rather than storing it.","example":{"content":{"last_frame_url":"https://example.invalid/byteplus/seedance-1-0-pro-250528/last-frame","video_url":"https://example.invalid/byteplus/seedance-1-0-pro-250528/generated.mp4"},"created_at":1767225600,"duration":5,"error":null,"id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","model":"seedance-1-0-pro-250528","output_format":"mp4","resolution":"1080p","seed":1234567890123,"status":"succeeded","updated_at":1767225730}}}}}}}}},"components":{"schemas":{"BytePlusVideoGenerationContent":{"oneOf":[{"properties":{"type":{"enum":["text"]}},"required":["text"]},{"properties":{"type":{"enum":["image_url"]}},"required":["image_url"]},{"properties":{"type":{"enum":["video_url"]}},"required":["video_url"]},{"properties":{"type":{"enum":["audio_url"]}},"required":["audio_url"]}],"properties":{"audio_url":{"description":"Input audio object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support audio input. Seedance 2.0 \u0026 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input.","properties":{"url":{"description":"Audio URL, Base64 encoding, or Asset ID.\nAudio URL: Public URL of the audio (wav, mp3).\nBase64: Format data:audio/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"image_url":{"properties":{"url":{"description":"Image content for image-to-video generation (when type is \"image_url\")\nImage URL: Make sure that the image URL is accessible.\nBase64-encoded content: Format must be data:image/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"role":{"description":"The role/position of the content item.\nFor images: first_frame, last_frame, or reference_image.\nFor videos: reference_video (Seedance 2.5, 2.0 \u0026 2.0 fast only).\nFor audio: reference_audio (Seedance 2.5, 2.0 \u0026 2.0 fast only).\n","enum":["first_frame","last_frame","reference_image","reference_video","reference_audio"],"type":"string"},"text":{"description":"The input text information for the model. Includes text prompt and optional parameters.\n\nText prompt (required): Description of the video to be generated using Chinese and English characters.\n\nParameters (optional): Add --[parameters] after the text prompt to control video specifications:\n- --resolution (--rs): 480p, 720p, 1080p (default: 720p)\n- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive)\n- --duration (--dur): 3-12 seconds (default: 5)\n- --framepersecond (--fps): 24 (default: 24)\n- --watermark (--wm): true/false (default: false)\n- --seed (--seed): -1 to 2^32-1 (default: -1)\n- --camerafixed (--cf): true/false (default: false)\n\nExample: \"A beautiful landscape --ratio 16:9 --resolution 720p --duration 5\"\n","maxLength":4096,"type":"string"},"type":{"description":"The type of the input content","enum":["text","image_url","video_url","audio_url"],"type":"string"},"video_url":{"description":"Input video object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support video input.","properties":{"url":{"description":"Video URL or Asset ID.\nVideo URL: Public URL of the video (mp4, mov).\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"}},"required":["type"],"type":"object"},"BytePlusVideoGenerationQueryResponse":{"properties":{"content":{"description":"The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null.","nullable":true,"properties":{"last_frame_url":{"description":"Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL.","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present.","type":"string"},"video_url":{"description":"Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL.","type":"string"}},"type":"object"},"created_at":{"description":"The time when the task was created. The value is a UNIX timestamp in seconds.","type":"integer"},"duration":{"description":"The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"number"},"error":{"description":"The error information. If the task succeeds, null is returned. If the task fails, the error information is returned.","nullable":true,"properties":{"code":{"description":"The error code","type":"string"},"message":{"description":"The error message","type":"string"}},"type":"object"},"id":{"description":"The ID of the video generation task","type":"string"},"model":{"description":"The name and version of the model used by the task","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged.","type":"string"},"resolution":{"description":"The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"string"},"seed":{"description":"The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","format":"int64","type":"integer"},"status":{"description":"The state of the task","enum":["queued","running","cancelled","succeeded","failed","expired"],"type":"string"},"updated_at":{"description":"The time when the task was last updated. The value is a UNIX timestamp in seconds.","type":"integer"},"usage":{"description":"The token usage for the request","properties":{"completion_tokens":{"description":"The number of tokens generated by the model","type":"integer"},"total_tokens":{"description":"For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/dreamina-seedance-2-0-fast-260128","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/byteplus/dreamina-seedance-2-0-mini.json b/router-schemas/byteplus/dreamina-seedance-2-0-mini.json index 7ac052615..1b8edd085 100644 --- a/router-schemas/byteplus/dreamina-seedance-2-0-mini.json +++ b/router-schemas/byteplus/dreamina-seedance-2-0-mini.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"byteplus/dreamina-seedance-2-0-mini","description":"The request body Comfy Router accepts for the model \"byteplus/dreamina-seedance-2-0-mini\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"24f00ebf8e3f"},"paths":{"/v2/models/byteplus/dreamina-seedance-2-0-mini":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/dreamina-seedance-2-0-mini synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for a BytePlus Seedance / Dreamina video generation task. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks must add `model` to it. This text-to-video example requires an additional `content` item with `type: image_url` and an `image_url.url` for seedance-1-0-lite-i2v-250428. Text-only models must omit that image item.\n`content` is the whole `required` floor, and it is the floor the v1 surface already published and videoGenerationProxy's Rewrite already refuses an empty value for. Everything else BytePlus accepts varies by model — the per-model resolutions, durations, ratios and input kinds are documented on the individual fields — so the enums and bounds below are the union BytePlus admits across the family and BytePlus stays the authority on which member accepts which value.","example":{"content":[{"text":"A red fox trotting through a snowy pine forest","type":"text"}],"duration":5,"ratio":"16:9","resolution":"720p"},"properties":{"callback_url":{"description":"Callback notification address for the result of this generation task","format":"uri","type":"string"},"content":{"description":"The input content for the model to generate a video","items":{"$ref":"#/components/schemas/BytePlusVideoGenerationContent"},"minItems":1,"type":"array"},"duration":{"anyOf":[{"enum":[-1]},{"maximum":30,"minimum":2}],"description":"Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 \u0026 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12].\n","type":"integer"},"execution_expires_after":{"description":"Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200].\n","maximum":259200,"minimum":3600,"type":"integer"},"generate_audio":{"default":true,"description":"Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals.\ntrue: The model outputs a video with synchronized audio.\nfalse: The model outputs a silent video.\n","type":"boolean"},"model":{"description":"The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"output_format":{"default":"mp4","description":"Seedance 2.5 only. Container format of the output video.\nmp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size.\nmov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size.\n","enum":["mp4","mov"],"type":"string"},"ratio":{"description":"Aspect ratio of the generated video. Seedance 2.0 \u0026 2.0 fast, 1.5 pro default: adaptive.\n","enum":["16:9","4:3","1:1","3:4","9:16","21:9","9:21","adaptive"],"type":"string"},"resolution":{"description":"Video resolution. Seedance 2.5, 2.0 \u0026 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro \u0026 pro-fast default: 1080p.\nNote: Seedance 2.0 \u0026 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p.\n","enum":["480p","720p","1080p","4k"],"type":"string"},"return_last_frame":{"default":false,"description":"Whether to return the last frame image of the generated video.\ntrue: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos.\nfalse: Does not return the last frame image of the generated video.\n","type":"boolean"},"seed":{"description":"Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed.\n","maximum":4294967295,"minimum":-1,"type":"integer"},"service_tier":{"description":"Service tier for processing. Seedance 2.5, 2.0 \u0026 2.0 fast do not support flex (offline inference).\n","enum":["default","flex"],"type":"string"},"watermark":{"default":false,"description":"Whether the generated video includes a watermark.","type":"boolean"}},"required":["content"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusVideoGenerationQueryResponse"}],"description":"Comfy Router output schema for the BytePlus Seedance video models: the terminal task-query document, forwarded unchanged EXCEPT for the two re-hosted `content` URLs described below - every other field is BytePlus's own. The operation is submit-and-poll and Router polls on the caller's behalf, so the body a caller receives is the finished task (`status: succeeded`) rather than the task handle the underlying submit returns.\nThe generated video's download URL is at `content.video_url`, present once the task succeeds. A failed task carries `error.code` and `error.message` instead; `status` is BytePlus's own vocabulary (queued, running, cancelled, succeeded, failed, expired), forwarded unchanged.\nThat URL is RE-HOSTED: Router copies the finished video onto Comfy storage and answers a Comfy-signed URL valid for up to 24 hours in place of BytePlus's own, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Exactly two leaves are rewritten this way - `content.video_url` and `content.last_frame_url`, both modelled here. Any OTHER asset URL a task carries keeps BytePlus's own link and is NOT flagged as non-durable, so a stored or replayed document can still hand back a link that BytePlus has since cleared.\nDurability is per leaf, not per response: a leaf whose re-host could not be performed keeps BytePlus's own URL rather than a Comfy one, and the other is unaffected - so a caller that stores or replays this document should not assume every URL in it outlives the call. 24 hours is the CEILING, not a guarantee: the Comfy link is signed for 24 hours from the moment it is minted, and Router memoises it for 23 hours, so a later poll or an `Idempotency-Key` replay can hand back a link with as little as an hour left. Either way the link expires, so download the asset rather than storing it.","example":{"content":{"last_frame_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame","video_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4"},"created_at":1767225600,"duration":5,"error":null,"id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","model":"seedance-1-0-lite-t2v-250428","output_format":"mp4","resolution":"1080p","seed":1234567890123,"status":"succeeded","updated_at":1767225730}}}}}}}}},"components":{"schemas":{"BytePlusVideoGenerationContent":{"oneOf":[{"properties":{"type":{"enum":["text"]}},"required":["text"]},{"properties":{"type":{"enum":["image_url"]}},"required":["image_url"]},{"properties":{"type":{"enum":["video_url"]}},"required":["video_url"]},{"properties":{"type":{"enum":["audio_url"]}},"required":["audio_url"]}],"properties":{"audio_url":{"description":"Input audio object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support audio input. Seedance 2.0 \u0026 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input.","properties":{"url":{"description":"Audio URL, Base64 encoding, or Asset ID.\nAudio URL: Public URL of the audio (wav, mp3).\nBase64: Format data:audio/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"image_url":{"properties":{"url":{"description":"Image content for image-to-video generation (when type is \"image_url\")\nImage URL: Make sure that the image URL is accessible.\nBase64-encoded content: Format must be data:image/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"role":{"description":"The role/position of the content item.\nFor images: first_frame, last_frame, or reference_image.\nFor videos: reference_video (Seedance 2.5, 2.0 \u0026 2.0 fast only).\nFor audio: reference_audio (Seedance 2.5, 2.0 \u0026 2.0 fast only).\n","enum":["first_frame","last_frame","reference_image","reference_video","reference_audio"],"type":"string"},"text":{"description":"The input text information for the model. Includes text prompt and optional parameters.\n\nText prompt (required): Description of the video to be generated using Chinese and English characters.\n\nParameters (optional): Add --[parameters] after the text prompt to control video specifications:\n- --resolution (--rs): 480p, 720p, 1080p (default: 720p)\n- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive)\n- --duration (--dur): 3-12 seconds (default: 5)\n- --framepersecond (--fps): 24 (default: 24)\n- --watermark (--wm): true/false (default: false)\n- --seed (--seed): -1 to 2^32-1 (default: -1)\n- --camerafixed (--cf): true/false (default: false)\n\nExample: \"A beautiful landscape --ratio 16:9 --resolution 720p --duration 5\"\n","maxLength":4096,"type":"string"},"type":{"description":"The type of the input content","enum":["text","image_url","video_url","audio_url"],"type":"string"},"video_url":{"description":"Input video object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support video input.","properties":{"url":{"description":"Video URL or Asset ID.\nVideo URL: Public URL of the video (mp4, mov).\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"}},"required":["type"],"type":"object"},"BytePlusVideoGenerationQueryResponse":{"properties":{"content":{"description":"The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null.","nullable":true,"properties":{"last_frame_url":{"description":"Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL.","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present.","type":"string"},"video_url":{"description":"Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL.","type":"string"}},"type":"object"},"created_at":{"description":"The time when the task was created. The value is a UNIX timestamp in seconds.","type":"integer"},"duration":{"description":"The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"number"},"error":{"description":"The error information. If the task succeeds, null is returned. If the task fails, the error information is returned.","nullable":true,"properties":{"code":{"description":"The error code","type":"string"},"message":{"description":"The error message","type":"string"}},"type":"object"},"id":{"description":"The ID of the video generation task","type":"string"},"model":{"description":"The name and version of the model used by the task","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged.","type":"string"},"resolution":{"description":"The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"string"},"seed":{"description":"The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","format":"int64","type":"integer"},"status":{"description":"The state of the task","enum":["queued","running","cancelled","succeeded","failed","expired"],"type":"string"},"updated_at":{"description":"The time when the task was last updated. The value is a UNIX timestamp in seconds.","type":"integer"},"usage":{"description":"The token usage for the request","properties":{"completion_tokens":{"description":"The number of tokens generated by the model","type":"integer"},"total_tokens":{"description":"For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/dreamina-seedance-2-0-mini","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"byteplus/dreamina-seedance-2-0-mini","description":"The request body Comfy Router accepts for the model \"byteplus/dreamina-seedance-2-0-mini\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"4e57ccd98b5d"},"paths":{"/v2/models/byteplus/dreamina-seedance-2-0-mini":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/dreamina-seedance-2-0-mini synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for a BytePlus Seedance / Dreamina video generation task. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks must add `model` to it. This text-to-video example omits the `content` item with `type: image_url` and an `image_url.url` that an image-to-video call supplies; text-only models must omit that image item.\n`content` is the whole `required` floor, and it is the floor the v1 surface already published and videoGenerationProxy's Rewrite already refuses an empty value for. Everything else BytePlus accepts varies by model — the per-model resolutions, durations, ratios and input kinds are documented on the individual fields — so the enums and bounds below are the union BytePlus admits across the family and BytePlus stays the authority on which member accepts which value.","example":{"content":[{"text":"A red fox trotting through a snowy pine forest","type":"text"}],"duration":5,"ratio":"16:9","resolution":"720p"},"properties":{"callback_url":{"description":"Callback notification address for the result of this generation task","format":"uri","type":"string"},"content":{"description":"The input content for the model to generate a video","items":{"$ref":"#/components/schemas/BytePlusVideoGenerationContent"},"minItems":1,"type":"array"},"duration":{"anyOf":[{"enum":[-1]},{"maximum":30,"minimum":2}],"description":"Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 \u0026 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12].\n","type":"integer"},"execution_expires_after":{"description":"Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200].\n","maximum":259200,"minimum":3600,"type":"integer"},"generate_audio":{"default":true,"description":"Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals.\ntrue: The model outputs a video with synchronized audio.\nfalse: The model outputs a silent video.\n","type":"boolean"},"model":{"description":"The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"output_format":{"default":"mp4","description":"Seedance 2.5 only. Container format of the output video.\nmp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size.\nmov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size.\n","enum":["mp4","mov"],"type":"string"},"ratio":{"description":"Aspect ratio of the generated video. Seedance 2.0 \u0026 2.0 fast, 1.5 pro default: adaptive.\n","enum":["16:9","4:3","1:1","3:4","9:16","21:9","9:21","adaptive"],"type":"string"},"resolution":{"description":"Video resolution. Seedance 2.5, 2.0 \u0026 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro \u0026 pro-fast default: 1080p.\nNote: Seedance 2.0 \u0026 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p.\n","enum":["480p","720p","1080p","4k"],"type":"string"},"return_last_frame":{"default":false,"description":"Whether to return the last frame image of the generated video.\ntrue: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos.\nfalse: Does not return the last frame image of the generated video.\n","type":"boolean"},"seed":{"description":"Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed.\n","maximum":4294967295,"minimum":-1,"type":"integer"},"service_tier":{"description":"Service tier for processing. Seedance 2.5, 2.0 \u0026 2.0 fast do not support flex (offline inference).\n","enum":["default","flex"],"type":"string"},"watermark":{"default":false,"description":"Whether the generated video includes a watermark.","type":"boolean"}},"required":["content"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusVideoGenerationQueryResponse"}],"description":"Comfy Router output schema for the BytePlus Seedance video models: the terminal task-query document, forwarded unchanged EXCEPT for the two re-hosted `content` URLs described below - every other field is BytePlus's own. The operation is submit-and-poll and Router polls on the caller's behalf, so the body a caller receives is the finished task (`status: succeeded`) rather than the task handle the underlying submit returns.\nThe generated video's download URL is at `content.video_url`, present once the task succeeds. A failed task carries `error.code` and `error.message` instead; `status` is BytePlus's own vocabulary (queued, running, cancelled, succeeded, failed, expired), forwarded unchanged.\nThat URL is RE-HOSTED: Router copies the finished video onto Comfy storage and answers a Comfy-signed URL valid for up to 24 hours in place of BytePlus's own, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Exactly two leaves are rewritten this way - `content.video_url` and `content.last_frame_url`, both modelled here. Any OTHER asset URL a task carries keeps BytePlus's own link and is NOT flagged as non-durable, so a stored or replayed document can still hand back a link that BytePlus has since cleared.\nDurability is per leaf, not per response: a leaf whose re-host could not be performed keeps BytePlus's own URL rather than a Comfy one, and the other is unaffected - so a caller that stores or replays this document should not assume every URL in it outlives the call. 24 hours is the CEILING, not a guarantee: the Comfy link is signed for 24 hours from the moment it is minted, and Router memoises it for 23 hours, so a later poll or an `Idempotency-Key` replay can hand back a link with as little as an hour left. Either way the link expires, so download the asset rather than storing it.","example":{"content":{"last_frame_url":"https://example.invalid/byteplus/seedance-1-0-pro-250528/last-frame","video_url":"https://example.invalid/byteplus/seedance-1-0-pro-250528/generated.mp4"},"created_at":1767225600,"duration":5,"error":null,"id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","model":"seedance-1-0-pro-250528","output_format":"mp4","resolution":"1080p","seed":1234567890123,"status":"succeeded","updated_at":1767225730}}}}}}}}},"components":{"schemas":{"BytePlusVideoGenerationContent":{"oneOf":[{"properties":{"type":{"enum":["text"]}},"required":["text"]},{"properties":{"type":{"enum":["image_url"]}},"required":["image_url"]},{"properties":{"type":{"enum":["video_url"]}},"required":["video_url"]},{"properties":{"type":{"enum":["audio_url"]}},"required":["audio_url"]}],"properties":{"audio_url":{"description":"Input audio object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support audio input. Seedance 2.0 \u0026 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input.","properties":{"url":{"description":"Audio URL, Base64 encoding, or Asset ID.\nAudio URL: Public URL of the audio (wav, mp3).\nBase64: Format data:audio/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"image_url":{"properties":{"url":{"description":"Image content for image-to-video generation (when type is \"image_url\")\nImage URL: Make sure that the image URL is accessible.\nBase64-encoded content: Format must be data:image/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"role":{"description":"The role/position of the content item.\nFor images: first_frame, last_frame, or reference_image.\nFor videos: reference_video (Seedance 2.5, 2.0 \u0026 2.0 fast only).\nFor audio: reference_audio (Seedance 2.5, 2.0 \u0026 2.0 fast only).\n","enum":["first_frame","last_frame","reference_image","reference_video","reference_audio"],"type":"string"},"text":{"description":"The input text information for the model. Includes text prompt and optional parameters.\n\nText prompt (required): Description of the video to be generated using Chinese and English characters.\n\nParameters (optional): Add --[parameters] after the text prompt to control video specifications:\n- --resolution (--rs): 480p, 720p, 1080p (default: 720p)\n- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive)\n- --duration (--dur): 3-12 seconds (default: 5)\n- --framepersecond (--fps): 24 (default: 24)\n- --watermark (--wm): true/false (default: false)\n- --seed (--seed): -1 to 2^32-1 (default: -1)\n- --camerafixed (--cf): true/false (default: false)\n\nExample: \"A beautiful landscape --ratio 16:9 --resolution 720p --duration 5\"\n","maxLength":4096,"type":"string"},"type":{"description":"The type of the input content","enum":["text","image_url","video_url","audio_url"],"type":"string"},"video_url":{"description":"Input video object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support video input.","properties":{"url":{"description":"Video URL or Asset ID.\nVideo URL: Public URL of the video (mp4, mov).\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"}},"required":["type"],"type":"object"},"BytePlusVideoGenerationQueryResponse":{"properties":{"content":{"description":"The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null.","nullable":true,"properties":{"last_frame_url":{"description":"Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL.","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present.","type":"string"},"video_url":{"description":"Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL.","type":"string"}},"type":"object"},"created_at":{"description":"The time when the task was created. The value is a UNIX timestamp in seconds.","type":"integer"},"duration":{"description":"The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"number"},"error":{"description":"The error information. If the task succeeds, null is returned. If the task fails, the error information is returned.","nullable":true,"properties":{"code":{"description":"The error code","type":"string"},"message":{"description":"The error message","type":"string"}},"type":"object"},"id":{"description":"The ID of the video generation task","type":"string"},"model":{"description":"The name and version of the model used by the task","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged.","type":"string"},"resolution":{"description":"The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"string"},"seed":{"description":"The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","format":"int64","type":"integer"},"status":{"description":"The state of the task","enum":["queued","running","cancelled","succeeded","failed","expired"],"type":"string"},"updated_at":{"description":"The time when the task was last updated. The value is a UNIX timestamp in seconds.","type":"integer"},"usage":{"description":"The token usage for the request","properties":{"completion_tokens":{"description":"The number of tokens generated by the model","type":"integer"},"total_tokens":{"description":"For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/dreamina-seedance-2-0-mini","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/byteplus/dreamina-seedance-2-5-260628.json b/router-schemas/byteplus/dreamina-seedance-2-5-260628.json index 0b3b95c4f..c7ec2f719 100644 --- a/router-schemas/byteplus/dreamina-seedance-2-5-260628.json +++ b/router-schemas/byteplus/dreamina-seedance-2-5-260628.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"byteplus/dreamina-seedance-2-5-260628","description":"The request body Comfy Router accepts for the model \"byteplus/dreamina-seedance-2-5-260628\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"24f00ebf8e3f"},"paths":{"/v2/models/byteplus/dreamina-seedance-2-5-260628":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/dreamina-seedance-2-5-260628 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for a BytePlus Seedance / Dreamina video generation task. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks must add `model` to it. This text-to-video example requires an additional `content` item with `type: image_url` and an `image_url.url` for seedance-1-0-lite-i2v-250428. Text-only models must omit that image item.\n`content` is the whole `required` floor, and it is the floor the v1 surface already published and videoGenerationProxy's Rewrite already refuses an empty value for. Everything else BytePlus accepts varies by model — the per-model resolutions, durations, ratios and input kinds are documented on the individual fields — so the enums and bounds below are the union BytePlus admits across the family and BytePlus stays the authority on which member accepts which value.","example":{"content":[{"text":"A red fox trotting through a snowy pine forest","type":"text"}],"duration":5,"ratio":"16:9","resolution":"720p"},"properties":{"callback_url":{"description":"Callback notification address for the result of this generation task","format":"uri","type":"string"},"content":{"description":"The input content for the model to generate a video","items":{"$ref":"#/components/schemas/BytePlusVideoGenerationContent"},"minItems":1,"type":"array"},"duration":{"anyOf":[{"enum":[-1]},{"maximum":30,"minimum":2}],"description":"Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 \u0026 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12].\n","type":"integer"},"execution_expires_after":{"description":"Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200].\n","maximum":259200,"minimum":3600,"type":"integer"},"generate_audio":{"default":true,"description":"Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals.\ntrue: The model outputs a video with synchronized audio.\nfalse: The model outputs a silent video.\n","type":"boolean"},"model":{"description":"The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"output_format":{"default":"mp4","description":"Seedance 2.5 only. Container format of the output video.\nmp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size.\nmov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size.\n","enum":["mp4","mov"],"type":"string"},"ratio":{"description":"Aspect ratio of the generated video. Seedance 2.0 \u0026 2.0 fast, 1.5 pro default: adaptive.\n","enum":["16:9","4:3","1:1","3:4","9:16","21:9","9:21","adaptive"],"type":"string"},"resolution":{"description":"Video resolution. Seedance 2.5, 2.0 \u0026 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro \u0026 pro-fast default: 1080p.\nNote: Seedance 2.0 \u0026 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p.\n","enum":["480p","720p","1080p","4k"],"type":"string"},"return_last_frame":{"default":false,"description":"Whether to return the last frame image of the generated video.\ntrue: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos.\nfalse: Does not return the last frame image of the generated video.\n","type":"boolean"},"seed":{"description":"Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed.\n","maximum":4294967295,"minimum":-1,"type":"integer"},"service_tier":{"description":"Service tier for processing. Seedance 2.5, 2.0 \u0026 2.0 fast do not support flex (offline inference).\n","enum":["default","flex"],"type":"string"},"watermark":{"default":false,"description":"Whether the generated video includes a watermark.","type":"boolean"}},"required":["content"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusVideoGenerationQueryResponse"}],"description":"Comfy Router output schema for the BytePlus Seedance video models: the terminal task-query document, forwarded unchanged EXCEPT for the two re-hosted `content` URLs described below - every other field is BytePlus's own. The operation is submit-and-poll and Router polls on the caller's behalf, so the body a caller receives is the finished task (`status: succeeded`) rather than the task handle the underlying submit returns.\nThe generated video's download URL is at `content.video_url`, present once the task succeeds. A failed task carries `error.code` and `error.message` instead; `status` is BytePlus's own vocabulary (queued, running, cancelled, succeeded, failed, expired), forwarded unchanged.\nThat URL is RE-HOSTED: Router copies the finished video onto Comfy storage and answers a Comfy-signed URL valid for up to 24 hours in place of BytePlus's own, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Exactly two leaves are rewritten this way - `content.video_url` and `content.last_frame_url`, both modelled here. Any OTHER asset URL a task carries keeps BytePlus's own link and is NOT flagged as non-durable, so a stored or replayed document can still hand back a link that BytePlus has since cleared.\nDurability is per leaf, not per response: a leaf whose re-host could not be performed keeps BytePlus's own URL rather than a Comfy one, and the other is unaffected - so a caller that stores or replays this document should not assume every URL in it outlives the call. 24 hours is the CEILING, not a guarantee: the Comfy link is signed for 24 hours from the moment it is minted, and Router memoises it for 23 hours, so a later poll or an `Idempotency-Key` replay can hand back a link with as little as an hour left. Either way the link expires, so download the asset rather than storing it.","example":{"content":{"last_frame_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame","video_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4"},"created_at":1767225600,"duration":5,"error":null,"id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","model":"seedance-1-0-lite-t2v-250428","output_format":"mp4","resolution":"1080p","seed":1234567890123,"status":"succeeded","updated_at":1767225730}}}}}}}}},"components":{"schemas":{"BytePlusVideoGenerationContent":{"oneOf":[{"properties":{"type":{"enum":["text"]}},"required":["text"]},{"properties":{"type":{"enum":["image_url"]}},"required":["image_url"]},{"properties":{"type":{"enum":["video_url"]}},"required":["video_url"]},{"properties":{"type":{"enum":["audio_url"]}},"required":["audio_url"]}],"properties":{"audio_url":{"description":"Input audio object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support audio input. Seedance 2.0 \u0026 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input.","properties":{"url":{"description":"Audio URL, Base64 encoding, or Asset ID.\nAudio URL: Public URL of the audio (wav, mp3).\nBase64: Format data:audio/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"image_url":{"properties":{"url":{"description":"Image content for image-to-video generation (when type is \"image_url\")\nImage URL: Make sure that the image URL is accessible.\nBase64-encoded content: Format must be data:image/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"role":{"description":"The role/position of the content item.\nFor images: first_frame, last_frame, or reference_image.\nFor videos: reference_video (Seedance 2.5, 2.0 \u0026 2.0 fast only).\nFor audio: reference_audio (Seedance 2.5, 2.0 \u0026 2.0 fast only).\n","enum":["first_frame","last_frame","reference_image","reference_video","reference_audio"],"type":"string"},"text":{"description":"The input text information for the model. Includes text prompt and optional parameters.\n\nText prompt (required): Description of the video to be generated using Chinese and English characters.\n\nParameters (optional): Add --[parameters] after the text prompt to control video specifications:\n- --resolution (--rs): 480p, 720p, 1080p (default: 720p)\n- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive)\n- --duration (--dur): 3-12 seconds (default: 5)\n- --framepersecond (--fps): 24 (default: 24)\n- --watermark (--wm): true/false (default: false)\n- --seed (--seed): -1 to 2^32-1 (default: -1)\n- --camerafixed (--cf): true/false (default: false)\n\nExample: \"A beautiful landscape --ratio 16:9 --resolution 720p --duration 5\"\n","maxLength":4096,"type":"string"},"type":{"description":"The type of the input content","enum":["text","image_url","video_url","audio_url"],"type":"string"},"video_url":{"description":"Input video object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support video input.","properties":{"url":{"description":"Video URL or Asset ID.\nVideo URL: Public URL of the video (mp4, mov).\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"}},"required":["type"],"type":"object"},"BytePlusVideoGenerationQueryResponse":{"properties":{"content":{"description":"The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null.","nullable":true,"properties":{"last_frame_url":{"description":"Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL.","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present.","type":"string"},"video_url":{"description":"Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL.","type":"string"}},"type":"object"},"created_at":{"description":"The time when the task was created. The value is a UNIX timestamp in seconds.","type":"integer"},"duration":{"description":"The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"number"},"error":{"description":"The error information. If the task succeeds, null is returned. If the task fails, the error information is returned.","nullable":true,"properties":{"code":{"description":"The error code","type":"string"},"message":{"description":"The error message","type":"string"}},"type":"object"},"id":{"description":"The ID of the video generation task","type":"string"},"model":{"description":"The name and version of the model used by the task","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged.","type":"string"},"resolution":{"description":"The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"string"},"seed":{"description":"The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","format":"int64","type":"integer"},"status":{"description":"The state of the task","enum":["queued","running","cancelled","succeeded","failed","expired"],"type":"string"},"updated_at":{"description":"The time when the task was last updated. The value is a UNIX timestamp in seconds.","type":"integer"},"usage":{"description":"The token usage for the request","properties":{"completion_tokens":{"description":"The number of tokens generated by the model","type":"integer"},"total_tokens":{"description":"For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/dreamina-seedance-2-5-260628","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"byteplus/dreamina-seedance-2-5-260628","description":"The request body Comfy Router accepts for the model \"byteplus/dreamina-seedance-2-5-260628\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"4e57ccd98b5d"},"paths":{"/v2/models/byteplus/dreamina-seedance-2-5-260628":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/dreamina-seedance-2-5-260628 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for a BytePlus Seedance / Dreamina video generation task. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks must add `model` to it. This text-to-video example omits the `content` item with `type: image_url` and an `image_url.url` that an image-to-video call supplies; text-only models must omit that image item.\n`content` is the whole `required` floor, and it is the floor the v1 surface already published and videoGenerationProxy's Rewrite already refuses an empty value for. Everything else BytePlus accepts varies by model — the per-model resolutions, durations, ratios and input kinds are documented on the individual fields — so the enums and bounds below are the union BytePlus admits across the family and BytePlus stays the authority on which member accepts which value.","example":{"content":[{"text":"A red fox trotting through a snowy pine forest","type":"text"}],"duration":5,"ratio":"16:9","resolution":"720p"},"properties":{"callback_url":{"description":"Callback notification address for the result of this generation task","format":"uri","type":"string"},"content":{"description":"The input content for the model to generate a video","items":{"$ref":"#/components/schemas/BytePlusVideoGenerationContent"},"minItems":1,"type":"array"},"duration":{"anyOf":[{"enum":[-1]},{"maximum":30,"minimum":2}],"description":"Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 \u0026 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12].\n","type":"integer"},"execution_expires_after":{"description":"Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200].\n","maximum":259200,"minimum":3600,"type":"integer"},"generate_audio":{"default":true,"description":"Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals.\ntrue: The model outputs a video with synchronized audio.\nfalse: The model outputs a silent video.\n","type":"boolean"},"model":{"description":"The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"output_format":{"default":"mp4","description":"Seedance 2.5 only. Container format of the output video.\nmp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size.\nmov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size.\n","enum":["mp4","mov"],"type":"string"},"ratio":{"description":"Aspect ratio of the generated video. Seedance 2.0 \u0026 2.0 fast, 1.5 pro default: adaptive.\n","enum":["16:9","4:3","1:1","3:4","9:16","21:9","9:21","adaptive"],"type":"string"},"resolution":{"description":"Video resolution. Seedance 2.5, 2.0 \u0026 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro \u0026 pro-fast default: 1080p.\nNote: Seedance 2.0 \u0026 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p.\n","enum":["480p","720p","1080p","4k"],"type":"string"},"return_last_frame":{"default":false,"description":"Whether to return the last frame image of the generated video.\ntrue: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos.\nfalse: Does not return the last frame image of the generated video.\n","type":"boolean"},"seed":{"description":"Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed.\n","maximum":4294967295,"minimum":-1,"type":"integer"},"service_tier":{"description":"Service tier for processing. Seedance 2.5, 2.0 \u0026 2.0 fast do not support flex (offline inference).\n","enum":["default","flex"],"type":"string"},"watermark":{"default":false,"description":"Whether the generated video includes a watermark.","type":"boolean"}},"required":["content"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusVideoGenerationQueryResponse"}],"description":"Comfy Router output schema for the BytePlus Seedance video models: the terminal task-query document, forwarded unchanged EXCEPT for the two re-hosted `content` URLs described below - every other field is BytePlus's own. The operation is submit-and-poll and Router polls on the caller's behalf, so the body a caller receives is the finished task (`status: succeeded`) rather than the task handle the underlying submit returns.\nThe generated video's download URL is at `content.video_url`, present once the task succeeds. A failed task carries `error.code` and `error.message` instead; `status` is BytePlus's own vocabulary (queued, running, cancelled, succeeded, failed, expired), forwarded unchanged.\nThat URL is RE-HOSTED: Router copies the finished video onto Comfy storage and answers a Comfy-signed URL valid for up to 24 hours in place of BytePlus's own, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Exactly two leaves are rewritten this way - `content.video_url` and `content.last_frame_url`, both modelled here. Any OTHER asset URL a task carries keeps BytePlus's own link and is NOT flagged as non-durable, so a stored or replayed document can still hand back a link that BytePlus has since cleared.\nDurability is per leaf, not per response: a leaf whose re-host could not be performed keeps BytePlus's own URL rather than a Comfy one, and the other is unaffected - so a caller that stores or replays this document should not assume every URL in it outlives the call. 24 hours is the CEILING, not a guarantee: the Comfy link is signed for 24 hours from the moment it is minted, and Router memoises it for 23 hours, so a later poll or an `Idempotency-Key` replay can hand back a link with as little as an hour left. Either way the link expires, so download the asset rather than storing it.","example":{"content":{"last_frame_url":"https://example.invalid/byteplus/seedance-1-0-pro-250528/last-frame","video_url":"https://example.invalid/byteplus/seedance-1-0-pro-250528/generated.mp4"},"created_at":1767225600,"duration":5,"error":null,"id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","model":"seedance-1-0-pro-250528","output_format":"mp4","resolution":"1080p","seed":1234567890123,"status":"succeeded","updated_at":1767225730}}}}}}}}},"components":{"schemas":{"BytePlusVideoGenerationContent":{"oneOf":[{"properties":{"type":{"enum":["text"]}},"required":["text"]},{"properties":{"type":{"enum":["image_url"]}},"required":["image_url"]},{"properties":{"type":{"enum":["video_url"]}},"required":["video_url"]},{"properties":{"type":{"enum":["audio_url"]}},"required":["audio_url"]}],"properties":{"audio_url":{"description":"Input audio object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support audio input. Seedance 2.0 \u0026 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input.","properties":{"url":{"description":"Audio URL, Base64 encoding, or Asset ID.\nAudio URL: Public URL of the audio (wav, mp3).\nBase64: Format data:audio/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"image_url":{"properties":{"url":{"description":"Image content for image-to-video generation (when type is \"image_url\")\nImage URL: Make sure that the image URL is accessible.\nBase64-encoded content: Format must be data:image/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"role":{"description":"The role/position of the content item.\nFor images: first_frame, last_frame, or reference_image.\nFor videos: reference_video (Seedance 2.5, 2.0 \u0026 2.0 fast only).\nFor audio: reference_audio (Seedance 2.5, 2.0 \u0026 2.0 fast only).\n","enum":["first_frame","last_frame","reference_image","reference_video","reference_audio"],"type":"string"},"text":{"description":"The input text information for the model. Includes text prompt and optional parameters.\n\nText prompt (required): Description of the video to be generated using Chinese and English characters.\n\nParameters (optional): Add --[parameters] after the text prompt to control video specifications:\n- --resolution (--rs): 480p, 720p, 1080p (default: 720p)\n- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive)\n- --duration (--dur): 3-12 seconds (default: 5)\n- --framepersecond (--fps): 24 (default: 24)\n- --watermark (--wm): true/false (default: false)\n- --seed (--seed): -1 to 2^32-1 (default: -1)\n- --camerafixed (--cf): true/false (default: false)\n\nExample: \"A beautiful landscape --ratio 16:9 --resolution 720p --duration 5\"\n","maxLength":4096,"type":"string"},"type":{"description":"The type of the input content","enum":["text","image_url","video_url","audio_url"],"type":"string"},"video_url":{"description":"Input video object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support video input.","properties":{"url":{"description":"Video URL or Asset ID.\nVideo URL: Public URL of the video (mp4, mov).\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"}},"required":["type"],"type":"object"},"BytePlusVideoGenerationQueryResponse":{"properties":{"content":{"description":"The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null.","nullable":true,"properties":{"last_frame_url":{"description":"Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL.","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present.","type":"string"},"video_url":{"description":"Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL.","type":"string"}},"type":"object"},"created_at":{"description":"The time when the task was created. The value is a UNIX timestamp in seconds.","type":"integer"},"duration":{"description":"The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"number"},"error":{"description":"The error information. If the task succeeds, null is returned. If the task fails, the error information is returned.","nullable":true,"properties":{"code":{"description":"The error code","type":"string"},"message":{"description":"The error message","type":"string"}},"type":"object"},"id":{"description":"The ID of the video generation task","type":"string"},"model":{"description":"The name and version of the model used by the task","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged.","type":"string"},"resolution":{"description":"The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"string"},"seed":{"description":"The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","format":"int64","type":"integer"},"status":{"description":"The state of the task","enum":["queued","running","cancelled","succeeded","failed","expired"],"type":"string"},"updated_at":{"description":"The time when the task was last updated. The value is a UNIX timestamp in seconds.","type":"integer"},"usage":{"description":"The token usage for the request","properties":{"completion_tokens":{"description":"The number of tokens generated by the model","type":"integer"},"total_tokens":{"description":"For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/dreamina-seedance-2-5-260628","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/byteplus/seedance-1-0-lite-i2v-250428.json b/router-schemas/byteplus/seedance-1-0-lite-i2v-250428.json deleted file mode 100644 index 988f7c24c..000000000 --- a/router-schemas/byteplus/seedance-1-0-lite-i2v-250428.json +++ /dev/null @@ -1 +0,0 @@ -{"openapi":"3.0.2","info":{"title":"byteplus/seedance-1-0-lite-i2v-250428","description":"The request body Comfy Router accepts for the model \"byteplus/seedance-1-0-lite-i2v-250428\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"24f00ebf8e3f"},"paths":{"/v2/models/byteplus/seedance-1-0-lite-i2v-250428":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedance-1-0-lite-i2v-250428 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for a BytePlus Seedance / Dreamina video generation task. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks must add `model` to it. This text-to-video example requires an additional `content` item with `type: image_url` and an `image_url.url` for seedance-1-0-lite-i2v-250428. Text-only models must omit that image item.\n`content` is the whole `required` floor, and it is the floor the v1 surface already published and videoGenerationProxy's Rewrite already refuses an empty value for. Everything else BytePlus accepts varies by model — the per-model resolutions, durations, ratios and input kinds are documented on the individual fields — so the enums and bounds below are the union BytePlus admits across the family and BytePlus stays the authority on which member accepts which value.","example":{"content":[{"text":"A red fox trotting through a snowy pine forest","type":"text"}],"duration":5,"ratio":"16:9","resolution":"720p"},"properties":{"callback_url":{"description":"Callback notification address for the result of this generation task","format":"uri","type":"string"},"content":{"description":"The input content for the model to generate a video","items":{"$ref":"#/components/schemas/BytePlusVideoGenerationContent"},"minItems":1,"type":"array"},"duration":{"anyOf":[{"enum":[-1]},{"maximum":30,"minimum":2}],"description":"Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 \u0026 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12].\n","type":"integer"},"execution_expires_after":{"description":"Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200].\n","maximum":259200,"minimum":3600,"type":"integer"},"generate_audio":{"default":true,"description":"Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals.\ntrue: The model outputs a video with synchronized audio.\nfalse: The model outputs a silent video.\n","type":"boolean"},"model":{"description":"The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"output_format":{"default":"mp4","description":"Seedance 2.5 only. Container format of the output video.\nmp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size.\nmov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size.\n","enum":["mp4","mov"],"type":"string"},"ratio":{"description":"Aspect ratio of the generated video. Seedance 2.0 \u0026 2.0 fast, 1.5 pro default: adaptive.\n","enum":["16:9","4:3","1:1","3:4","9:16","21:9","9:21","adaptive"],"type":"string"},"resolution":{"description":"Video resolution. Seedance 2.5, 2.0 \u0026 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro \u0026 pro-fast default: 1080p.\nNote: Seedance 2.0 \u0026 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p.\n","enum":["480p","720p","1080p","4k"],"type":"string"},"return_last_frame":{"default":false,"description":"Whether to return the last frame image of the generated video.\ntrue: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos.\nfalse: Does not return the last frame image of the generated video.\n","type":"boolean"},"seed":{"description":"Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed.\n","maximum":4294967295,"minimum":-1,"type":"integer"},"service_tier":{"description":"Service tier for processing. Seedance 2.5, 2.0 \u0026 2.0 fast do not support flex (offline inference).\n","enum":["default","flex"],"type":"string"},"watermark":{"default":false,"description":"Whether the generated video includes a watermark.","type":"boolean"}},"required":["content"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusVideoGenerationQueryResponse"}],"description":"Comfy Router output schema for the BytePlus Seedance video models: the terminal task-query document, forwarded unchanged EXCEPT for the two re-hosted `content` URLs described below - every other field is BytePlus's own. The operation is submit-and-poll and Router polls on the caller's behalf, so the body a caller receives is the finished task (`status: succeeded`) rather than the task handle the underlying submit returns.\nThe generated video's download URL is at `content.video_url`, present once the task succeeds. A failed task carries `error.code` and `error.message` instead; `status` is BytePlus's own vocabulary (queued, running, cancelled, succeeded, failed, expired), forwarded unchanged.\nThat URL is RE-HOSTED: Router copies the finished video onto Comfy storage and answers a Comfy-signed URL valid for up to 24 hours in place of BytePlus's own, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Exactly two leaves are rewritten this way - `content.video_url` and `content.last_frame_url`, both modelled here. Any OTHER asset URL a task carries keeps BytePlus's own link and is NOT flagged as non-durable, so a stored or replayed document can still hand back a link that BytePlus has since cleared.\nDurability is per leaf, not per response: a leaf whose re-host could not be performed keeps BytePlus's own URL rather than a Comfy one, and the other is unaffected - so a caller that stores or replays this document should not assume every URL in it outlives the call. 24 hours is the CEILING, not a guarantee: the Comfy link is signed for 24 hours from the moment it is minted, and Router memoises it for 23 hours, so a later poll or an `Idempotency-Key` replay can hand back a link with as little as an hour left. Either way the link expires, so download the asset rather than storing it.","example":{"content":{"last_frame_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame","video_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4"},"created_at":1767225600,"duration":5,"error":null,"id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","model":"seedance-1-0-lite-t2v-250428","output_format":"mp4","resolution":"1080p","seed":1234567890123,"status":"succeeded","updated_at":1767225730}}}}}}}}},"components":{"schemas":{"BytePlusVideoGenerationContent":{"oneOf":[{"properties":{"type":{"enum":["text"]}},"required":["text"]},{"properties":{"type":{"enum":["image_url"]}},"required":["image_url"]},{"properties":{"type":{"enum":["video_url"]}},"required":["video_url"]},{"properties":{"type":{"enum":["audio_url"]}},"required":["audio_url"]}],"properties":{"audio_url":{"description":"Input audio object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support audio input. Seedance 2.0 \u0026 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input.","properties":{"url":{"description":"Audio URL, Base64 encoding, or Asset ID.\nAudio URL: Public URL of the audio (wav, mp3).\nBase64: Format data:audio/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"image_url":{"properties":{"url":{"description":"Image content for image-to-video generation (when type is \"image_url\")\nImage URL: Make sure that the image URL is accessible.\nBase64-encoded content: Format must be data:image/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"role":{"description":"The role/position of the content item.\nFor images: first_frame, last_frame, or reference_image.\nFor videos: reference_video (Seedance 2.5, 2.0 \u0026 2.0 fast only).\nFor audio: reference_audio (Seedance 2.5, 2.0 \u0026 2.0 fast only).\n","enum":["first_frame","last_frame","reference_image","reference_video","reference_audio"],"type":"string"},"text":{"description":"The input text information for the model. Includes text prompt and optional parameters.\n\nText prompt (required): Description of the video to be generated using Chinese and English characters.\n\nParameters (optional): Add --[parameters] after the text prompt to control video specifications:\n- --resolution (--rs): 480p, 720p, 1080p (default: 720p)\n- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive)\n- --duration (--dur): 3-12 seconds (default: 5)\n- --framepersecond (--fps): 24 (default: 24)\n- --watermark (--wm): true/false (default: false)\n- --seed (--seed): -1 to 2^32-1 (default: -1)\n- --camerafixed (--cf): true/false (default: false)\n\nExample: \"A beautiful landscape --ratio 16:9 --resolution 720p --duration 5\"\n","maxLength":4096,"type":"string"},"type":{"description":"The type of the input content","enum":["text","image_url","video_url","audio_url"],"type":"string"},"video_url":{"description":"Input video object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support video input.","properties":{"url":{"description":"Video URL or Asset ID.\nVideo URL: Public URL of the video (mp4, mov).\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"}},"required":["type"],"type":"object"},"BytePlusVideoGenerationQueryResponse":{"properties":{"content":{"description":"The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null.","nullable":true,"properties":{"last_frame_url":{"description":"Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL.","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present.","type":"string"},"video_url":{"description":"Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL.","type":"string"}},"type":"object"},"created_at":{"description":"The time when the task was created. The value is a UNIX timestamp in seconds.","type":"integer"},"duration":{"description":"The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"number"},"error":{"description":"The error information. If the task succeeds, null is returned. If the task fails, the error information is returned.","nullable":true,"properties":{"code":{"description":"The error code","type":"string"},"message":{"description":"The error message","type":"string"}},"type":"object"},"id":{"description":"The ID of the video generation task","type":"string"},"model":{"description":"The name and version of the model used by the task","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged.","type":"string"},"resolution":{"description":"The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"string"},"seed":{"description":"The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","format":"int64","type":"integer"},"status":{"description":"The state of the task","enum":["queued","running","cancelled","succeeded","failed","expired"],"type":"string"},"updated_at":{"description":"The time when the task was last updated. The value is a UNIX timestamp in seconds.","type":"integer"},"usage":{"description":"The token usage for the request","properties":{"completion_tokens":{"description":"The number of tokens generated by the model","type":"integer"},"total_tokens":{"description":"For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedance-1-0-lite-i2v-250428","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/byteplus/seedance-1-0-lite-t2v-250428.json b/router-schemas/byteplus/seedance-1-0-lite-t2v-250428.json deleted file mode 100644 index 7f753e8b8..000000000 --- a/router-schemas/byteplus/seedance-1-0-lite-t2v-250428.json +++ /dev/null @@ -1 +0,0 @@ -{"openapi":"3.0.2","info":{"title":"byteplus/seedance-1-0-lite-t2v-250428","description":"The request body Comfy Router accepts for the model \"byteplus/seedance-1-0-lite-t2v-250428\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"24f00ebf8e3f"},"paths":{"/v2/models/byteplus/seedance-1-0-lite-t2v-250428":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedance-1-0-lite-t2v-250428 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for a BytePlus Seedance / Dreamina video generation task. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks must add `model` to it. This text-to-video example requires an additional `content` item with `type: image_url` and an `image_url.url` for seedance-1-0-lite-i2v-250428. Text-only models must omit that image item.\n`content` is the whole `required` floor, and it is the floor the v1 surface already published and videoGenerationProxy's Rewrite already refuses an empty value for. Everything else BytePlus accepts varies by model — the per-model resolutions, durations, ratios and input kinds are documented on the individual fields — so the enums and bounds below are the union BytePlus admits across the family and BytePlus stays the authority on which member accepts which value.","example":{"content":[{"text":"A red fox trotting through a snowy pine forest","type":"text"}],"duration":5,"ratio":"16:9","resolution":"720p"},"properties":{"callback_url":{"description":"Callback notification address for the result of this generation task","format":"uri","type":"string"},"content":{"description":"The input content for the model to generate a video","items":{"$ref":"#/components/schemas/BytePlusVideoGenerationContent"},"minItems":1,"type":"array"},"duration":{"anyOf":[{"enum":[-1]},{"maximum":30,"minimum":2}],"description":"Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 \u0026 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12].\n","type":"integer"},"execution_expires_after":{"description":"Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200].\n","maximum":259200,"minimum":3600,"type":"integer"},"generate_audio":{"default":true,"description":"Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals.\ntrue: The model outputs a video with synchronized audio.\nfalse: The model outputs a silent video.\n","type":"boolean"},"model":{"description":"The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"output_format":{"default":"mp4","description":"Seedance 2.5 only. Container format of the output video.\nmp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size.\nmov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size.\n","enum":["mp4","mov"],"type":"string"},"ratio":{"description":"Aspect ratio of the generated video. Seedance 2.0 \u0026 2.0 fast, 1.5 pro default: adaptive.\n","enum":["16:9","4:3","1:1","3:4","9:16","21:9","9:21","adaptive"],"type":"string"},"resolution":{"description":"Video resolution. Seedance 2.5, 2.0 \u0026 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro \u0026 pro-fast default: 1080p.\nNote: Seedance 2.0 \u0026 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p.\n","enum":["480p","720p","1080p","4k"],"type":"string"},"return_last_frame":{"default":false,"description":"Whether to return the last frame image of the generated video.\ntrue: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos.\nfalse: Does not return the last frame image of the generated video.\n","type":"boolean"},"seed":{"description":"Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed.\n","maximum":4294967295,"minimum":-1,"type":"integer"},"service_tier":{"description":"Service tier for processing. Seedance 2.5, 2.0 \u0026 2.0 fast do not support flex (offline inference).\n","enum":["default","flex"],"type":"string"},"watermark":{"default":false,"description":"Whether the generated video includes a watermark.","type":"boolean"}},"required":["content"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusVideoGenerationQueryResponse"}],"description":"Comfy Router output schema for the BytePlus Seedance video models: the terminal task-query document, forwarded unchanged EXCEPT for the two re-hosted `content` URLs described below - every other field is BytePlus's own. The operation is submit-and-poll and Router polls on the caller's behalf, so the body a caller receives is the finished task (`status: succeeded`) rather than the task handle the underlying submit returns.\nThe generated video's download URL is at `content.video_url`, present once the task succeeds. A failed task carries `error.code` and `error.message` instead; `status` is BytePlus's own vocabulary (queued, running, cancelled, succeeded, failed, expired), forwarded unchanged.\nThat URL is RE-HOSTED: Router copies the finished video onto Comfy storage and answers a Comfy-signed URL valid for up to 24 hours in place of BytePlus's own, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Exactly two leaves are rewritten this way - `content.video_url` and `content.last_frame_url`, both modelled here. Any OTHER asset URL a task carries keeps BytePlus's own link and is NOT flagged as non-durable, so a stored or replayed document can still hand back a link that BytePlus has since cleared.\nDurability is per leaf, not per response: a leaf whose re-host could not be performed keeps BytePlus's own URL rather than a Comfy one, and the other is unaffected - so a caller that stores or replays this document should not assume every URL in it outlives the call. 24 hours is the CEILING, not a guarantee: the Comfy link is signed for 24 hours from the moment it is minted, and Router memoises it for 23 hours, so a later poll or an `Idempotency-Key` replay can hand back a link with as little as an hour left. Either way the link expires, so download the asset rather than storing it.","example":{"content":{"last_frame_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame","video_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4"},"created_at":1767225600,"duration":5,"error":null,"id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","model":"seedance-1-0-lite-t2v-250428","output_format":"mp4","resolution":"1080p","seed":1234567890123,"status":"succeeded","updated_at":1767225730}}}}}}}}},"components":{"schemas":{"BytePlusVideoGenerationContent":{"oneOf":[{"properties":{"type":{"enum":["text"]}},"required":["text"]},{"properties":{"type":{"enum":["image_url"]}},"required":["image_url"]},{"properties":{"type":{"enum":["video_url"]}},"required":["video_url"]},{"properties":{"type":{"enum":["audio_url"]}},"required":["audio_url"]}],"properties":{"audio_url":{"description":"Input audio object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support audio input. Seedance 2.0 \u0026 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input.","properties":{"url":{"description":"Audio URL, Base64 encoding, or Asset ID.\nAudio URL: Public URL of the audio (wav, mp3).\nBase64: Format data:audio/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"image_url":{"properties":{"url":{"description":"Image content for image-to-video generation (when type is \"image_url\")\nImage URL: Make sure that the image URL is accessible.\nBase64-encoded content: Format must be data:image/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"role":{"description":"The role/position of the content item.\nFor images: first_frame, last_frame, or reference_image.\nFor videos: reference_video (Seedance 2.5, 2.0 \u0026 2.0 fast only).\nFor audio: reference_audio (Seedance 2.5, 2.0 \u0026 2.0 fast only).\n","enum":["first_frame","last_frame","reference_image","reference_video","reference_audio"],"type":"string"},"text":{"description":"The input text information for the model. Includes text prompt and optional parameters.\n\nText prompt (required): Description of the video to be generated using Chinese and English characters.\n\nParameters (optional): Add --[parameters] after the text prompt to control video specifications:\n- --resolution (--rs): 480p, 720p, 1080p (default: 720p)\n- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive)\n- --duration (--dur): 3-12 seconds (default: 5)\n- --framepersecond (--fps): 24 (default: 24)\n- --watermark (--wm): true/false (default: false)\n- --seed (--seed): -1 to 2^32-1 (default: -1)\n- --camerafixed (--cf): true/false (default: false)\n\nExample: \"A beautiful landscape --ratio 16:9 --resolution 720p --duration 5\"\n","maxLength":4096,"type":"string"},"type":{"description":"The type of the input content","enum":["text","image_url","video_url","audio_url"],"type":"string"},"video_url":{"description":"Input video object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support video input.","properties":{"url":{"description":"Video URL or Asset ID.\nVideo URL: Public URL of the video (mp4, mov).\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"}},"required":["type"],"type":"object"},"BytePlusVideoGenerationQueryResponse":{"properties":{"content":{"description":"The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null.","nullable":true,"properties":{"last_frame_url":{"description":"Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL.","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present.","type":"string"},"video_url":{"description":"Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL.","type":"string"}},"type":"object"},"created_at":{"description":"The time when the task was created. The value is a UNIX timestamp in seconds.","type":"integer"},"duration":{"description":"The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"number"},"error":{"description":"The error information. If the task succeeds, null is returned. If the task fails, the error information is returned.","nullable":true,"properties":{"code":{"description":"The error code","type":"string"},"message":{"description":"The error message","type":"string"}},"type":"object"},"id":{"description":"The ID of the video generation task","type":"string"},"model":{"description":"The name and version of the model used by the task","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged.","type":"string"},"resolution":{"description":"The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"string"},"seed":{"description":"The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","format":"int64","type":"integer"},"status":{"description":"The state of the task","enum":["queued","running","cancelled","succeeded","failed","expired"],"type":"string"},"updated_at":{"description":"The time when the task was last updated. The value is a UNIX timestamp in seconds.","type":"integer"},"usage":{"description":"The token usage for the request","properties":{"completion_tokens":{"description":"The number of tokens generated by the model","type":"integer"},"total_tokens":{"description":"For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedance-1-0-lite-t2v-250428","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/byteplus/seedance-1-0-pro-250528.json b/router-schemas/byteplus/seedance-1-0-pro-250528.json index 269edfb42..4bdb74539 100644 --- a/router-schemas/byteplus/seedance-1-0-pro-250528.json +++ b/router-schemas/byteplus/seedance-1-0-pro-250528.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"byteplus/seedance-1-0-pro-250528","description":"The request body Comfy Router accepts for the model \"byteplus/seedance-1-0-pro-250528\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"24f00ebf8e3f"},"paths":{"/v2/models/byteplus/seedance-1-0-pro-250528":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedance-1-0-pro-250528 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for a BytePlus Seedance / Dreamina video generation task. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks must add `model` to it. This text-to-video example requires an additional `content` item with `type: image_url` and an `image_url.url` for seedance-1-0-lite-i2v-250428. Text-only models must omit that image item.\n`content` is the whole `required` floor, and it is the floor the v1 surface already published and videoGenerationProxy's Rewrite already refuses an empty value for. Everything else BytePlus accepts varies by model — the per-model resolutions, durations, ratios and input kinds are documented on the individual fields — so the enums and bounds below are the union BytePlus admits across the family and BytePlus stays the authority on which member accepts which value.","example":{"content":[{"text":"A red fox trotting through a snowy pine forest","type":"text"}],"duration":5,"ratio":"16:9","resolution":"720p"},"properties":{"callback_url":{"description":"Callback notification address for the result of this generation task","format":"uri","type":"string"},"content":{"description":"The input content for the model to generate a video","items":{"$ref":"#/components/schemas/BytePlusVideoGenerationContent"},"minItems":1,"type":"array"},"duration":{"anyOf":[{"enum":[-1]},{"maximum":30,"minimum":2}],"description":"Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 \u0026 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12].\n","type":"integer"},"execution_expires_after":{"description":"Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200].\n","maximum":259200,"minimum":3600,"type":"integer"},"generate_audio":{"default":true,"description":"Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals.\ntrue: The model outputs a video with synchronized audio.\nfalse: The model outputs a silent video.\n","type":"boolean"},"model":{"description":"The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"output_format":{"default":"mp4","description":"Seedance 2.5 only. Container format of the output video.\nmp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size.\nmov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size.\n","enum":["mp4","mov"],"type":"string"},"ratio":{"description":"Aspect ratio of the generated video. Seedance 2.0 \u0026 2.0 fast, 1.5 pro default: adaptive.\n","enum":["16:9","4:3","1:1","3:4","9:16","21:9","9:21","adaptive"],"type":"string"},"resolution":{"description":"Video resolution. Seedance 2.5, 2.0 \u0026 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro \u0026 pro-fast default: 1080p.\nNote: Seedance 2.0 \u0026 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p.\n","enum":["480p","720p","1080p","4k"],"type":"string"},"return_last_frame":{"default":false,"description":"Whether to return the last frame image of the generated video.\ntrue: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos.\nfalse: Does not return the last frame image of the generated video.\n","type":"boolean"},"seed":{"description":"Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed.\n","maximum":4294967295,"minimum":-1,"type":"integer"},"service_tier":{"description":"Service tier for processing. Seedance 2.5, 2.0 \u0026 2.0 fast do not support flex (offline inference).\n","enum":["default","flex"],"type":"string"},"watermark":{"default":false,"description":"Whether the generated video includes a watermark.","type":"boolean"}},"required":["content"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusVideoGenerationQueryResponse"}],"description":"Comfy Router output schema for the BytePlus Seedance video models: the terminal task-query document, forwarded unchanged EXCEPT for the two re-hosted `content` URLs described below - every other field is BytePlus's own. The operation is submit-and-poll and Router polls on the caller's behalf, so the body a caller receives is the finished task (`status: succeeded`) rather than the task handle the underlying submit returns.\nThe generated video's download URL is at `content.video_url`, present once the task succeeds. A failed task carries `error.code` and `error.message` instead; `status` is BytePlus's own vocabulary (queued, running, cancelled, succeeded, failed, expired), forwarded unchanged.\nThat URL is RE-HOSTED: Router copies the finished video onto Comfy storage and answers a Comfy-signed URL valid for up to 24 hours in place of BytePlus's own, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Exactly two leaves are rewritten this way - `content.video_url` and `content.last_frame_url`, both modelled here. Any OTHER asset URL a task carries keeps BytePlus's own link and is NOT flagged as non-durable, so a stored or replayed document can still hand back a link that BytePlus has since cleared.\nDurability is per leaf, not per response: a leaf whose re-host could not be performed keeps BytePlus's own URL rather than a Comfy one, and the other is unaffected - so a caller that stores or replays this document should not assume every URL in it outlives the call. 24 hours is the CEILING, not a guarantee: the Comfy link is signed for 24 hours from the moment it is minted, and Router memoises it for 23 hours, so a later poll or an `Idempotency-Key` replay can hand back a link with as little as an hour left. Either way the link expires, so download the asset rather than storing it.","example":{"content":{"last_frame_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame","video_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4"},"created_at":1767225600,"duration":5,"error":null,"id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","model":"seedance-1-0-lite-t2v-250428","output_format":"mp4","resolution":"1080p","seed":1234567890123,"status":"succeeded","updated_at":1767225730}}}}}}}}},"components":{"schemas":{"BytePlusVideoGenerationContent":{"oneOf":[{"properties":{"type":{"enum":["text"]}},"required":["text"]},{"properties":{"type":{"enum":["image_url"]}},"required":["image_url"]},{"properties":{"type":{"enum":["video_url"]}},"required":["video_url"]},{"properties":{"type":{"enum":["audio_url"]}},"required":["audio_url"]}],"properties":{"audio_url":{"description":"Input audio object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support audio input. Seedance 2.0 \u0026 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input.","properties":{"url":{"description":"Audio URL, Base64 encoding, or Asset ID.\nAudio URL: Public URL of the audio (wav, mp3).\nBase64: Format data:audio/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"image_url":{"properties":{"url":{"description":"Image content for image-to-video generation (when type is \"image_url\")\nImage URL: Make sure that the image URL is accessible.\nBase64-encoded content: Format must be data:image/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"role":{"description":"The role/position of the content item.\nFor images: first_frame, last_frame, or reference_image.\nFor videos: reference_video (Seedance 2.5, 2.0 \u0026 2.0 fast only).\nFor audio: reference_audio (Seedance 2.5, 2.0 \u0026 2.0 fast only).\n","enum":["first_frame","last_frame","reference_image","reference_video","reference_audio"],"type":"string"},"text":{"description":"The input text information for the model. Includes text prompt and optional parameters.\n\nText prompt (required): Description of the video to be generated using Chinese and English characters.\n\nParameters (optional): Add --[parameters] after the text prompt to control video specifications:\n- --resolution (--rs): 480p, 720p, 1080p (default: 720p)\n- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive)\n- --duration (--dur): 3-12 seconds (default: 5)\n- --framepersecond (--fps): 24 (default: 24)\n- --watermark (--wm): true/false (default: false)\n- --seed (--seed): -1 to 2^32-1 (default: -1)\n- --camerafixed (--cf): true/false (default: false)\n\nExample: \"A beautiful landscape --ratio 16:9 --resolution 720p --duration 5\"\n","maxLength":4096,"type":"string"},"type":{"description":"The type of the input content","enum":["text","image_url","video_url","audio_url"],"type":"string"},"video_url":{"description":"Input video object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support video input.","properties":{"url":{"description":"Video URL or Asset ID.\nVideo URL: Public URL of the video (mp4, mov).\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"}},"required":["type"],"type":"object"},"BytePlusVideoGenerationQueryResponse":{"properties":{"content":{"description":"The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null.","nullable":true,"properties":{"last_frame_url":{"description":"Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL.","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present.","type":"string"},"video_url":{"description":"Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL.","type":"string"}},"type":"object"},"created_at":{"description":"The time when the task was created. The value is a UNIX timestamp in seconds.","type":"integer"},"duration":{"description":"The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"number"},"error":{"description":"The error information. If the task succeeds, null is returned. If the task fails, the error information is returned.","nullable":true,"properties":{"code":{"description":"The error code","type":"string"},"message":{"description":"The error message","type":"string"}},"type":"object"},"id":{"description":"The ID of the video generation task","type":"string"},"model":{"description":"The name and version of the model used by the task","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged.","type":"string"},"resolution":{"description":"The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"string"},"seed":{"description":"The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","format":"int64","type":"integer"},"status":{"description":"The state of the task","enum":["queued","running","cancelled","succeeded","failed","expired"],"type":"string"},"updated_at":{"description":"The time when the task was last updated. The value is a UNIX timestamp in seconds.","type":"integer"},"usage":{"description":"The token usage for the request","properties":{"completion_tokens":{"description":"The number of tokens generated by the model","type":"integer"},"total_tokens":{"description":"For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedance-1-0-pro-250528","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"byteplus/seedance-1-0-pro-250528","description":"The request body Comfy Router accepts for the model \"byteplus/seedance-1-0-pro-250528\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"4e57ccd98b5d"},"paths":{"/v2/models/byteplus/seedance-1-0-pro-250528":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedance-1-0-pro-250528 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for a BytePlus Seedance / Dreamina video generation task. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks must add `model` to it. This text-to-video example omits the `content` item with `type: image_url` and an `image_url.url` that an image-to-video call supplies; text-only models must omit that image item.\n`content` is the whole `required` floor, and it is the floor the v1 surface already published and videoGenerationProxy's Rewrite already refuses an empty value for. Everything else BytePlus accepts varies by model — the per-model resolutions, durations, ratios and input kinds are documented on the individual fields — so the enums and bounds below are the union BytePlus admits across the family and BytePlus stays the authority on which member accepts which value.","example":{"content":[{"text":"A red fox trotting through a snowy pine forest","type":"text"}],"duration":5,"ratio":"16:9","resolution":"720p"},"properties":{"callback_url":{"description":"Callback notification address for the result of this generation task","format":"uri","type":"string"},"content":{"description":"The input content for the model to generate a video","items":{"$ref":"#/components/schemas/BytePlusVideoGenerationContent"},"minItems":1,"type":"array"},"duration":{"anyOf":[{"enum":[-1]},{"maximum":30,"minimum":2}],"description":"Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 \u0026 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12].\n","type":"integer"},"execution_expires_after":{"description":"Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200].\n","maximum":259200,"minimum":3600,"type":"integer"},"generate_audio":{"default":true,"description":"Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals.\ntrue: The model outputs a video with synchronized audio.\nfalse: The model outputs a silent video.\n","type":"boolean"},"model":{"description":"The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"output_format":{"default":"mp4","description":"Seedance 2.5 only. Container format of the output video.\nmp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size.\nmov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size.\n","enum":["mp4","mov"],"type":"string"},"ratio":{"description":"Aspect ratio of the generated video. Seedance 2.0 \u0026 2.0 fast, 1.5 pro default: adaptive.\n","enum":["16:9","4:3","1:1","3:4","9:16","21:9","9:21","adaptive"],"type":"string"},"resolution":{"description":"Video resolution. Seedance 2.5, 2.0 \u0026 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro \u0026 pro-fast default: 1080p.\nNote: Seedance 2.0 \u0026 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p.\n","enum":["480p","720p","1080p","4k"],"type":"string"},"return_last_frame":{"default":false,"description":"Whether to return the last frame image of the generated video.\ntrue: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos.\nfalse: Does not return the last frame image of the generated video.\n","type":"boolean"},"seed":{"description":"Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed.\n","maximum":4294967295,"minimum":-1,"type":"integer"},"service_tier":{"description":"Service tier for processing. Seedance 2.5, 2.0 \u0026 2.0 fast do not support flex (offline inference).\n","enum":["default","flex"],"type":"string"},"watermark":{"default":false,"description":"Whether the generated video includes a watermark.","type":"boolean"}},"required":["content"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusVideoGenerationQueryResponse"}],"description":"Comfy Router output schema for the BytePlus Seedance video models: the terminal task-query document, forwarded unchanged EXCEPT for the two re-hosted `content` URLs described below - every other field is BytePlus's own. The operation is submit-and-poll and Router polls on the caller's behalf, so the body a caller receives is the finished task (`status: succeeded`) rather than the task handle the underlying submit returns.\nThe generated video's download URL is at `content.video_url`, present once the task succeeds. A failed task carries `error.code` and `error.message` instead; `status` is BytePlus's own vocabulary (queued, running, cancelled, succeeded, failed, expired), forwarded unchanged.\nThat URL is RE-HOSTED: Router copies the finished video onto Comfy storage and answers a Comfy-signed URL valid for up to 24 hours in place of BytePlus's own, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Exactly two leaves are rewritten this way - `content.video_url` and `content.last_frame_url`, both modelled here. Any OTHER asset URL a task carries keeps BytePlus's own link and is NOT flagged as non-durable, so a stored or replayed document can still hand back a link that BytePlus has since cleared.\nDurability is per leaf, not per response: a leaf whose re-host could not be performed keeps BytePlus's own URL rather than a Comfy one, and the other is unaffected - so a caller that stores or replays this document should not assume every URL in it outlives the call. 24 hours is the CEILING, not a guarantee: the Comfy link is signed for 24 hours from the moment it is minted, and Router memoises it for 23 hours, so a later poll or an `Idempotency-Key` replay can hand back a link with as little as an hour left. Either way the link expires, so download the asset rather than storing it.","example":{"content":{"last_frame_url":"https://example.invalid/byteplus/seedance-1-0-pro-250528/last-frame","video_url":"https://example.invalid/byteplus/seedance-1-0-pro-250528/generated.mp4"},"created_at":1767225600,"duration":5,"error":null,"id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","model":"seedance-1-0-pro-250528","output_format":"mp4","resolution":"1080p","seed":1234567890123,"status":"succeeded","updated_at":1767225730}}}}}}}}},"components":{"schemas":{"BytePlusVideoGenerationContent":{"oneOf":[{"properties":{"type":{"enum":["text"]}},"required":["text"]},{"properties":{"type":{"enum":["image_url"]}},"required":["image_url"]},{"properties":{"type":{"enum":["video_url"]}},"required":["video_url"]},{"properties":{"type":{"enum":["audio_url"]}},"required":["audio_url"]}],"properties":{"audio_url":{"description":"Input audio object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support audio input. Seedance 2.0 \u0026 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input.","properties":{"url":{"description":"Audio URL, Base64 encoding, or Asset ID.\nAudio URL: Public URL of the audio (wav, mp3).\nBase64: Format data:audio/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"image_url":{"properties":{"url":{"description":"Image content for image-to-video generation (when type is \"image_url\")\nImage URL: Make sure that the image URL is accessible.\nBase64-encoded content: Format must be data:image/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"role":{"description":"The role/position of the content item.\nFor images: first_frame, last_frame, or reference_image.\nFor videos: reference_video (Seedance 2.5, 2.0 \u0026 2.0 fast only).\nFor audio: reference_audio (Seedance 2.5, 2.0 \u0026 2.0 fast only).\n","enum":["first_frame","last_frame","reference_image","reference_video","reference_audio"],"type":"string"},"text":{"description":"The input text information for the model. Includes text prompt and optional parameters.\n\nText prompt (required): Description of the video to be generated using Chinese and English characters.\n\nParameters (optional): Add --[parameters] after the text prompt to control video specifications:\n- --resolution (--rs): 480p, 720p, 1080p (default: 720p)\n- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive)\n- --duration (--dur): 3-12 seconds (default: 5)\n- --framepersecond (--fps): 24 (default: 24)\n- --watermark (--wm): true/false (default: false)\n- --seed (--seed): -1 to 2^32-1 (default: -1)\n- --camerafixed (--cf): true/false (default: false)\n\nExample: \"A beautiful landscape --ratio 16:9 --resolution 720p --duration 5\"\n","maxLength":4096,"type":"string"},"type":{"description":"The type of the input content","enum":["text","image_url","video_url","audio_url"],"type":"string"},"video_url":{"description":"Input video object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support video input.","properties":{"url":{"description":"Video URL or Asset ID.\nVideo URL: Public URL of the video (mp4, mov).\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"}},"required":["type"],"type":"object"},"BytePlusVideoGenerationQueryResponse":{"properties":{"content":{"description":"The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null.","nullable":true,"properties":{"last_frame_url":{"description":"Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL.","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present.","type":"string"},"video_url":{"description":"Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL.","type":"string"}},"type":"object"},"created_at":{"description":"The time when the task was created. The value is a UNIX timestamp in seconds.","type":"integer"},"duration":{"description":"The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"number"},"error":{"description":"The error information. If the task succeeds, null is returned. If the task fails, the error information is returned.","nullable":true,"properties":{"code":{"description":"The error code","type":"string"},"message":{"description":"The error message","type":"string"}},"type":"object"},"id":{"description":"The ID of the video generation task","type":"string"},"model":{"description":"The name and version of the model used by the task","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged.","type":"string"},"resolution":{"description":"The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"string"},"seed":{"description":"The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","format":"int64","type":"integer"},"status":{"description":"The state of the task","enum":["queued","running","cancelled","succeeded","failed","expired"],"type":"string"},"updated_at":{"description":"The time when the task was last updated. The value is a UNIX timestamp in seconds.","type":"integer"},"usage":{"description":"The token usage for the request","properties":{"completion_tokens":{"description":"The number of tokens generated by the model","type":"integer"},"total_tokens":{"description":"For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedance-1-0-pro-250528","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/byteplus/seedance-1-0-pro-fast-251015.json b/router-schemas/byteplus/seedance-1-0-pro-fast-251015.json index d89a8f309..9405e95e2 100644 --- a/router-schemas/byteplus/seedance-1-0-pro-fast-251015.json +++ b/router-schemas/byteplus/seedance-1-0-pro-fast-251015.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"byteplus/seedance-1-0-pro-fast-251015","description":"The request body Comfy Router accepts for the model \"byteplus/seedance-1-0-pro-fast-251015\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"24f00ebf8e3f"},"paths":{"/v2/models/byteplus/seedance-1-0-pro-fast-251015":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedance-1-0-pro-fast-251015 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for a BytePlus Seedance / Dreamina video generation task. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks must add `model` to it. This text-to-video example requires an additional `content` item with `type: image_url` and an `image_url.url` for seedance-1-0-lite-i2v-250428. Text-only models must omit that image item.\n`content` is the whole `required` floor, and it is the floor the v1 surface already published and videoGenerationProxy's Rewrite already refuses an empty value for. Everything else BytePlus accepts varies by model — the per-model resolutions, durations, ratios and input kinds are documented on the individual fields — so the enums and bounds below are the union BytePlus admits across the family and BytePlus stays the authority on which member accepts which value.","example":{"content":[{"text":"A red fox trotting through a snowy pine forest","type":"text"}],"duration":5,"ratio":"16:9","resolution":"720p"},"properties":{"callback_url":{"description":"Callback notification address for the result of this generation task","format":"uri","type":"string"},"content":{"description":"The input content for the model to generate a video","items":{"$ref":"#/components/schemas/BytePlusVideoGenerationContent"},"minItems":1,"type":"array"},"duration":{"anyOf":[{"enum":[-1]},{"maximum":30,"minimum":2}],"description":"Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 \u0026 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12].\n","type":"integer"},"execution_expires_after":{"description":"Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200].\n","maximum":259200,"minimum":3600,"type":"integer"},"generate_audio":{"default":true,"description":"Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals.\ntrue: The model outputs a video with synchronized audio.\nfalse: The model outputs a silent video.\n","type":"boolean"},"model":{"description":"The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"output_format":{"default":"mp4","description":"Seedance 2.5 only. Container format of the output video.\nmp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size.\nmov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size.\n","enum":["mp4","mov"],"type":"string"},"ratio":{"description":"Aspect ratio of the generated video. Seedance 2.0 \u0026 2.0 fast, 1.5 pro default: adaptive.\n","enum":["16:9","4:3","1:1","3:4","9:16","21:9","9:21","adaptive"],"type":"string"},"resolution":{"description":"Video resolution. Seedance 2.5, 2.0 \u0026 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro \u0026 pro-fast default: 1080p.\nNote: Seedance 2.0 \u0026 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p.\n","enum":["480p","720p","1080p","4k"],"type":"string"},"return_last_frame":{"default":false,"description":"Whether to return the last frame image of the generated video.\ntrue: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos.\nfalse: Does not return the last frame image of the generated video.\n","type":"boolean"},"seed":{"description":"Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed.\n","maximum":4294967295,"minimum":-1,"type":"integer"},"service_tier":{"description":"Service tier for processing. Seedance 2.5, 2.0 \u0026 2.0 fast do not support flex (offline inference).\n","enum":["default","flex"],"type":"string"},"watermark":{"default":false,"description":"Whether the generated video includes a watermark.","type":"boolean"}},"required":["content"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusVideoGenerationQueryResponse"}],"description":"Comfy Router output schema for the BytePlus Seedance video models: the terminal task-query document, forwarded unchanged EXCEPT for the two re-hosted `content` URLs described below - every other field is BytePlus's own. The operation is submit-and-poll and Router polls on the caller's behalf, so the body a caller receives is the finished task (`status: succeeded`) rather than the task handle the underlying submit returns.\nThe generated video's download URL is at `content.video_url`, present once the task succeeds. A failed task carries `error.code` and `error.message` instead; `status` is BytePlus's own vocabulary (queued, running, cancelled, succeeded, failed, expired), forwarded unchanged.\nThat URL is RE-HOSTED: Router copies the finished video onto Comfy storage and answers a Comfy-signed URL valid for up to 24 hours in place of BytePlus's own, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Exactly two leaves are rewritten this way - `content.video_url` and `content.last_frame_url`, both modelled here. Any OTHER asset URL a task carries keeps BytePlus's own link and is NOT flagged as non-durable, so a stored or replayed document can still hand back a link that BytePlus has since cleared.\nDurability is per leaf, not per response: a leaf whose re-host could not be performed keeps BytePlus's own URL rather than a Comfy one, and the other is unaffected - so a caller that stores or replays this document should not assume every URL in it outlives the call. 24 hours is the CEILING, not a guarantee: the Comfy link is signed for 24 hours from the moment it is minted, and Router memoises it for 23 hours, so a later poll or an `Idempotency-Key` replay can hand back a link with as little as an hour left. Either way the link expires, so download the asset rather than storing it.","example":{"content":{"last_frame_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame","video_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4"},"created_at":1767225600,"duration":5,"error":null,"id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","model":"seedance-1-0-lite-t2v-250428","output_format":"mp4","resolution":"1080p","seed":1234567890123,"status":"succeeded","updated_at":1767225730}}}}}}}}},"components":{"schemas":{"BytePlusVideoGenerationContent":{"oneOf":[{"properties":{"type":{"enum":["text"]}},"required":["text"]},{"properties":{"type":{"enum":["image_url"]}},"required":["image_url"]},{"properties":{"type":{"enum":["video_url"]}},"required":["video_url"]},{"properties":{"type":{"enum":["audio_url"]}},"required":["audio_url"]}],"properties":{"audio_url":{"description":"Input audio object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support audio input. Seedance 2.0 \u0026 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input.","properties":{"url":{"description":"Audio URL, Base64 encoding, or Asset ID.\nAudio URL: Public URL of the audio (wav, mp3).\nBase64: Format data:audio/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"image_url":{"properties":{"url":{"description":"Image content for image-to-video generation (when type is \"image_url\")\nImage URL: Make sure that the image URL is accessible.\nBase64-encoded content: Format must be data:image/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"role":{"description":"The role/position of the content item.\nFor images: first_frame, last_frame, or reference_image.\nFor videos: reference_video (Seedance 2.5, 2.0 \u0026 2.0 fast only).\nFor audio: reference_audio (Seedance 2.5, 2.0 \u0026 2.0 fast only).\n","enum":["first_frame","last_frame","reference_image","reference_video","reference_audio"],"type":"string"},"text":{"description":"The input text information for the model. Includes text prompt and optional parameters.\n\nText prompt (required): Description of the video to be generated using Chinese and English characters.\n\nParameters (optional): Add --[parameters] after the text prompt to control video specifications:\n- --resolution (--rs): 480p, 720p, 1080p (default: 720p)\n- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive)\n- --duration (--dur): 3-12 seconds (default: 5)\n- --framepersecond (--fps): 24 (default: 24)\n- --watermark (--wm): true/false (default: false)\n- --seed (--seed): -1 to 2^32-1 (default: -1)\n- --camerafixed (--cf): true/false (default: false)\n\nExample: \"A beautiful landscape --ratio 16:9 --resolution 720p --duration 5\"\n","maxLength":4096,"type":"string"},"type":{"description":"The type of the input content","enum":["text","image_url","video_url","audio_url"],"type":"string"},"video_url":{"description":"Input video object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support video input.","properties":{"url":{"description":"Video URL or Asset ID.\nVideo URL: Public URL of the video (mp4, mov).\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"}},"required":["type"],"type":"object"},"BytePlusVideoGenerationQueryResponse":{"properties":{"content":{"description":"The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null.","nullable":true,"properties":{"last_frame_url":{"description":"Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL.","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present.","type":"string"},"video_url":{"description":"Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL.","type":"string"}},"type":"object"},"created_at":{"description":"The time when the task was created. The value is a UNIX timestamp in seconds.","type":"integer"},"duration":{"description":"The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"number"},"error":{"description":"The error information. If the task succeeds, null is returned. If the task fails, the error information is returned.","nullable":true,"properties":{"code":{"description":"The error code","type":"string"},"message":{"description":"The error message","type":"string"}},"type":"object"},"id":{"description":"The ID of the video generation task","type":"string"},"model":{"description":"The name and version of the model used by the task","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged.","type":"string"},"resolution":{"description":"The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"string"},"seed":{"description":"The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","format":"int64","type":"integer"},"status":{"description":"The state of the task","enum":["queued","running","cancelled","succeeded","failed","expired"],"type":"string"},"updated_at":{"description":"The time when the task was last updated. The value is a UNIX timestamp in seconds.","type":"integer"},"usage":{"description":"The token usage for the request","properties":{"completion_tokens":{"description":"The number of tokens generated by the model","type":"integer"},"total_tokens":{"description":"For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedance-1-0-pro-fast-251015","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"byteplus/seedance-1-0-pro-fast-251015","description":"The request body Comfy Router accepts for the model \"byteplus/seedance-1-0-pro-fast-251015\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"4e57ccd98b5d"},"paths":{"/v2/models/byteplus/seedance-1-0-pro-fast-251015":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedance-1-0-pro-fast-251015 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for a BytePlus Seedance / Dreamina video generation task. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks must add `model` to it. This text-to-video example omits the `content` item with `type: image_url` and an `image_url.url` that an image-to-video call supplies; text-only models must omit that image item.\n`content` is the whole `required` floor, and it is the floor the v1 surface already published and videoGenerationProxy's Rewrite already refuses an empty value for. Everything else BytePlus accepts varies by model — the per-model resolutions, durations, ratios and input kinds are documented on the individual fields — so the enums and bounds below are the union BytePlus admits across the family and BytePlus stays the authority on which member accepts which value.","example":{"content":[{"text":"A red fox trotting through a snowy pine forest","type":"text"}],"duration":5,"ratio":"16:9","resolution":"720p"},"properties":{"callback_url":{"description":"Callback notification address for the result of this generation task","format":"uri","type":"string"},"content":{"description":"The input content for the model to generate a video","items":{"$ref":"#/components/schemas/BytePlusVideoGenerationContent"},"minItems":1,"type":"array"},"duration":{"anyOf":[{"enum":[-1]},{"maximum":30,"minimum":2}],"description":"Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 \u0026 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12].\n","type":"integer"},"execution_expires_after":{"description":"Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200].\n","maximum":259200,"minimum":3600,"type":"integer"},"generate_audio":{"default":true,"description":"Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals.\ntrue: The model outputs a video with synchronized audio.\nfalse: The model outputs a silent video.\n","type":"boolean"},"model":{"description":"The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"output_format":{"default":"mp4","description":"Seedance 2.5 only. Container format of the output video.\nmp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size.\nmov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size.\n","enum":["mp4","mov"],"type":"string"},"ratio":{"description":"Aspect ratio of the generated video. Seedance 2.0 \u0026 2.0 fast, 1.5 pro default: adaptive.\n","enum":["16:9","4:3","1:1","3:4","9:16","21:9","9:21","adaptive"],"type":"string"},"resolution":{"description":"Video resolution. Seedance 2.5, 2.0 \u0026 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro \u0026 pro-fast default: 1080p.\nNote: Seedance 2.0 \u0026 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p.\n","enum":["480p","720p","1080p","4k"],"type":"string"},"return_last_frame":{"default":false,"description":"Whether to return the last frame image of the generated video.\ntrue: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos.\nfalse: Does not return the last frame image of the generated video.\n","type":"boolean"},"seed":{"description":"Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed.\n","maximum":4294967295,"minimum":-1,"type":"integer"},"service_tier":{"description":"Service tier for processing. Seedance 2.5, 2.0 \u0026 2.0 fast do not support flex (offline inference).\n","enum":["default","flex"],"type":"string"},"watermark":{"default":false,"description":"Whether the generated video includes a watermark.","type":"boolean"}},"required":["content"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusVideoGenerationQueryResponse"}],"description":"Comfy Router output schema for the BytePlus Seedance video models: the terminal task-query document, forwarded unchanged EXCEPT for the two re-hosted `content` URLs described below - every other field is BytePlus's own. The operation is submit-and-poll and Router polls on the caller's behalf, so the body a caller receives is the finished task (`status: succeeded`) rather than the task handle the underlying submit returns.\nThe generated video's download URL is at `content.video_url`, present once the task succeeds. A failed task carries `error.code` and `error.message` instead; `status` is BytePlus's own vocabulary (queued, running, cancelled, succeeded, failed, expired), forwarded unchanged.\nThat URL is RE-HOSTED: Router copies the finished video onto Comfy storage and answers a Comfy-signed URL valid for up to 24 hours in place of BytePlus's own, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Exactly two leaves are rewritten this way - `content.video_url` and `content.last_frame_url`, both modelled here. Any OTHER asset URL a task carries keeps BytePlus's own link and is NOT flagged as non-durable, so a stored or replayed document can still hand back a link that BytePlus has since cleared.\nDurability is per leaf, not per response: a leaf whose re-host could not be performed keeps BytePlus's own URL rather than a Comfy one, and the other is unaffected - so a caller that stores or replays this document should not assume every URL in it outlives the call. 24 hours is the CEILING, not a guarantee: the Comfy link is signed for 24 hours from the moment it is minted, and Router memoises it for 23 hours, so a later poll or an `Idempotency-Key` replay can hand back a link with as little as an hour left. Either way the link expires, so download the asset rather than storing it.","example":{"content":{"last_frame_url":"https://example.invalid/byteplus/seedance-1-0-pro-250528/last-frame","video_url":"https://example.invalid/byteplus/seedance-1-0-pro-250528/generated.mp4"},"created_at":1767225600,"duration":5,"error":null,"id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","model":"seedance-1-0-pro-250528","output_format":"mp4","resolution":"1080p","seed":1234567890123,"status":"succeeded","updated_at":1767225730}}}}}}}}},"components":{"schemas":{"BytePlusVideoGenerationContent":{"oneOf":[{"properties":{"type":{"enum":["text"]}},"required":["text"]},{"properties":{"type":{"enum":["image_url"]}},"required":["image_url"]},{"properties":{"type":{"enum":["video_url"]}},"required":["video_url"]},{"properties":{"type":{"enum":["audio_url"]}},"required":["audio_url"]}],"properties":{"audio_url":{"description":"Input audio object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support audio input. Seedance 2.0 \u0026 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input.","properties":{"url":{"description":"Audio URL, Base64 encoding, or Asset ID.\nAudio URL: Public URL of the audio (wav, mp3).\nBase64: Format data:audio/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"image_url":{"properties":{"url":{"description":"Image content for image-to-video generation (when type is \"image_url\")\nImage URL: Make sure that the image URL is accessible.\nBase64-encoded content: Format must be data:image/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"role":{"description":"The role/position of the content item.\nFor images: first_frame, last_frame, or reference_image.\nFor videos: reference_video (Seedance 2.5, 2.0 \u0026 2.0 fast only).\nFor audio: reference_audio (Seedance 2.5, 2.0 \u0026 2.0 fast only).\n","enum":["first_frame","last_frame","reference_image","reference_video","reference_audio"],"type":"string"},"text":{"description":"The input text information for the model. Includes text prompt and optional parameters.\n\nText prompt (required): Description of the video to be generated using Chinese and English characters.\n\nParameters (optional): Add --[parameters] after the text prompt to control video specifications:\n- --resolution (--rs): 480p, 720p, 1080p (default: 720p)\n- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive)\n- --duration (--dur): 3-12 seconds (default: 5)\n- --framepersecond (--fps): 24 (default: 24)\n- --watermark (--wm): true/false (default: false)\n- --seed (--seed): -1 to 2^32-1 (default: -1)\n- --camerafixed (--cf): true/false (default: false)\n\nExample: \"A beautiful landscape --ratio 16:9 --resolution 720p --duration 5\"\n","maxLength":4096,"type":"string"},"type":{"description":"The type of the input content","enum":["text","image_url","video_url","audio_url"],"type":"string"},"video_url":{"description":"Input video object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support video input.","properties":{"url":{"description":"Video URL or Asset ID.\nVideo URL: Public URL of the video (mp4, mov).\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"}},"required":["type"],"type":"object"},"BytePlusVideoGenerationQueryResponse":{"properties":{"content":{"description":"The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null.","nullable":true,"properties":{"last_frame_url":{"description":"Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL.","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present.","type":"string"},"video_url":{"description":"Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL.","type":"string"}},"type":"object"},"created_at":{"description":"The time when the task was created. The value is a UNIX timestamp in seconds.","type":"integer"},"duration":{"description":"The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"number"},"error":{"description":"The error information. If the task succeeds, null is returned. If the task fails, the error information is returned.","nullable":true,"properties":{"code":{"description":"The error code","type":"string"},"message":{"description":"The error message","type":"string"}},"type":"object"},"id":{"description":"The ID of the video generation task","type":"string"},"model":{"description":"The name and version of the model used by the task","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged.","type":"string"},"resolution":{"description":"The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"string"},"seed":{"description":"The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","format":"int64","type":"integer"},"status":{"description":"The state of the task","enum":["queued","running","cancelled","succeeded","failed","expired"],"type":"string"},"updated_at":{"description":"The time when the task was last updated. The value is a UNIX timestamp in seconds.","type":"integer"},"usage":{"description":"The token usage for the request","properties":{"completion_tokens":{"description":"The number of tokens generated by the model","type":"integer"},"total_tokens":{"description":"For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedance-1-0-pro-fast-251015","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/byteplus/seedance-1-5-pro-251215.json b/router-schemas/byteplus/seedance-1-5-pro-251215.json index 4e9b28924..b8f58211e 100644 --- a/router-schemas/byteplus/seedance-1-5-pro-251215.json +++ b/router-schemas/byteplus/seedance-1-5-pro-251215.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"byteplus/seedance-1-5-pro-251215","description":"The request body Comfy Router accepts for the model \"byteplus/seedance-1-5-pro-251215\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"24f00ebf8e3f"},"paths":{"/v2/models/byteplus/seedance-1-5-pro-251215":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedance-1-5-pro-251215 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for a BytePlus Seedance / Dreamina video generation task. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks must add `model` to it. This text-to-video example requires an additional `content` item with `type: image_url` and an `image_url.url` for seedance-1-0-lite-i2v-250428. Text-only models must omit that image item.\n`content` is the whole `required` floor, and it is the floor the v1 surface already published and videoGenerationProxy's Rewrite already refuses an empty value for. Everything else BytePlus accepts varies by model — the per-model resolutions, durations, ratios and input kinds are documented on the individual fields — so the enums and bounds below are the union BytePlus admits across the family and BytePlus stays the authority on which member accepts which value.","example":{"content":[{"text":"A red fox trotting through a snowy pine forest","type":"text"}],"duration":5,"ratio":"16:9","resolution":"720p"},"properties":{"callback_url":{"description":"Callback notification address for the result of this generation task","format":"uri","type":"string"},"content":{"description":"The input content for the model to generate a video","items":{"$ref":"#/components/schemas/BytePlusVideoGenerationContent"},"minItems":1,"type":"array"},"duration":{"anyOf":[{"enum":[-1]},{"maximum":30,"minimum":2}],"description":"Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 \u0026 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12].\n","type":"integer"},"execution_expires_after":{"description":"Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200].\n","maximum":259200,"minimum":3600,"type":"integer"},"generate_audio":{"default":true,"description":"Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals.\ntrue: The model outputs a video with synchronized audio.\nfalse: The model outputs a silent video.\n","type":"boolean"},"model":{"description":"The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, seedance-1-0-lite-t2v-250428, seedance-1-0-lite-i2v-250428, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"output_format":{"default":"mp4","description":"Seedance 2.5 only. Container format of the output video.\nmp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size.\nmov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size.\n","enum":["mp4","mov"],"type":"string"},"ratio":{"description":"Aspect ratio of the generated video. Seedance 2.0 \u0026 2.0 fast, 1.5 pro default: adaptive.\n","enum":["16:9","4:3","1:1","3:4","9:16","21:9","9:21","adaptive"],"type":"string"},"resolution":{"description":"Video resolution. Seedance 2.5, 2.0 \u0026 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro \u0026 pro-fast default: 1080p.\nNote: Seedance 2.0 \u0026 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p.\n","enum":["480p","720p","1080p","4k"],"type":"string"},"return_last_frame":{"default":false,"description":"Whether to return the last frame image of the generated video.\ntrue: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos.\nfalse: Does not return the last frame image of the generated video.\n","type":"boolean"},"seed":{"description":"Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed.\n","maximum":4294967295,"minimum":-1,"type":"integer"},"service_tier":{"description":"Service tier for processing. Seedance 2.5, 2.0 \u0026 2.0 fast do not support flex (offline inference).\n","enum":["default","flex"],"type":"string"},"watermark":{"default":false,"description":"Whether the generated video includes a watermark.","type":"boolean"}},"required":["content"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusVideoGenerationQueryResponse"}],"description":"Comfy Router output schema for the BytePlus Seedance video models: the terminal task-query document, forwarded unchanged EXCEPT for the two re-hosted `content` URLs described below - every other field is BytePlus's own. The operation is submit-and-poll and Router polls on the caller's behalf, so the body a caller receives is the finished task (`status: succeeded`) rather than the task handle the underlying submit returns.\nThe generated video's download URL is at `content.video_url`, present once the task succeeds. A failed task carries `error.code` and `error.message` instead; `status` is BytePlus's own vocabulary (queued, running, cancelled, succeeded, failed, expired), forwarded unchanged.\nThat URL is RE-HOSTED: Router copies the finished video onto Comfy storage and answers a Comfy-signed URL valid for up to 24 hours in place of BytePlus's own, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Exactly two leaves are rewritten this way - `content.video_url` and `content.last_frame_url`, both modelled here. Any OTHER asset URL a task carries keeps BytePlus's own link and is NOT flagged as non-durable, so a stored or replayed document can still hand back a link that BytePlus has since cleared.\nDurability is per leaf, not per response: a leaf whose re-host could not be performed keeps BytePlus's own URL rather than a Comfy one, and the other is unaffected - so a caller that stores or replays this document should not assume every URL in it outlives the call. 24 hours is the CEILING, not a guarantee: the Comfy link is signed for 24 hours from the moment it is minted, and Router memoises it for 23 hours, so a later poll or an `Idempotency-Key` replay can hand back a link with as little as an hour left. Either way the link expires, so download the asset rather than storing it.","example":{"content":{"last_frame_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/last-frame","video_url":"https://example.invalid/byteplus/seedance-1-0-lite-t2v-250428/generated.mp4"},"created_at":1767225600,"duration":5,"error":null,"id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","model":"seedance-1-0-lite-t2v-250428","output_format":"mp4","resolution":"1080p","seed":1234567890123,"status":"succeeded","updated_at":1767225730}}}}}}}}},"components":{"schemas":{"BytePlusVideoGenerationContent":{"oneOf":[{"properties":{"type":{"enum":["text"]}},"required":["text"]},{"properties":{"type":{"enum":["image_url"]}},"required":["image_url"]},{"properties":{"type":{"enum":["video_url"]}},"required":["video_url"]},{"properties":{"type":{"enum":["audio_url"]}},"required":["audio_url"]}],"properties":{"audio_url":{"description":"Input audio object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support audio input. Seedance 2.0 \u0026 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input.","properties":{"url":{"description":"Audio URL, Base64 encoding, or Asset ID.\nAudio URL: Public URL of the audio (wav, mp3).\nBase64: Format data:audio/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"image_url":{"properties":{"url":{"description":"Image content for image-to-video generation (when type is \"image_url\")\nImage URL: Make sure that the image URL is accessible.\nBase64-encoded content: Format must be data:image/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"role":{"description":"The role/position of the content item.\nFor images: first_frame, last_frame, or reference_image.\nFor videos: reference_video (Seedance 2.5, 2.0 \u0026 2.0 fast only).\nFor audio: reference_audio (Seedance 2.5, 2.0 \u0026 2.0 fast only).\n","enum":["first_frame","last_frame","reference_image","reference_video","reference_audio"],"type":"string"},"text":{"description":"The input text information for the model. Includes text prompt and optional parameters.\n\nText prompt (required): Description of the video to be generated using Chinese and English characters.\n\nParameters (optional): Add --[parameters] after the text prompt to control video specifications:\n- --resolution (--rs): 480p, 720p, 1080p (default: 720p)\n- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive)\n- --duration (--dur): 3-12 seconds (default: 5)\n- --framepersecond (--fps): 24 (default: 24)\n- --watermark (--wm): true/false (default: false)\n- --seed (--seed): -1 to 2^32-1 (default: -1)\n- --camerafixed (--cf): true/false (default: false)\n\nExample: \"A beautiful landscape --ratio 16:9 --resolution 720p --duration 5\"\n","maxLength":4096,"type":"string"},"type":{"description":"The type of the input content","enum":["text","image_url","video_url","audio_url"],"type":"string"},"video_url":{"description":"Input video object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support video input.","properties":{"url":{"description":"Video URL or Asset ID.\nVideo URL: Public URL of the video (mp4, mov).\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"}},"required":["type"],"type":"object"},"BytePlusVideoGenerationQueryResponse":{"properties":{"content":{"description":"The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null.","nullable":true,"properties":{"last_frame_url":{"description":"Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL.","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present.","type":"string"},"video_url":{"description":"Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL.","type":"string"}},"type":"object"},"created_at":{"description":"The time when the task was created. The value is a UNIX timestamp in seconds.","type":"integer"},"duration":{"description":"The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"number"},"error":{"description":"The error information. If the task succeeds, null is returned. If the task fails, the error information is returned.","nullable":true,"properties":{"code":{"description":"The error code","type":"string"},"message":{"description":"The error message","type":"string"}},"type":"object"},"id":{"description":"The ID of the video generation task","type":"string"},"model":{"description":"The name and version of the model used by the task","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged.","type":"string"},"resolution":{"description":"The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"string"},"seed":{"description":"The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","format":"int64","type":"integer"},"status":{"description":"The state of the task","enum":["queued","running","cancelled","succeeded","failed","expired"],"type":"string"},"updated_at":{"description":"The time when the task was last updated. The value is a UNIX timestamp in seconds.","type":"integer"},"usage":{"description":"The token usage for the request","properties":{"completion_tokens":{"description":"The number of tokens generated by the model","type":"integer"},"total_tokens":{"description":"For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedance-1-5-pro-251215","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"byteplus/seedance-1-5-pro-251215","description":"The request body Comfy Router accepts for the model \"byteplus/seedance-1-5-pro-251215\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"4e57ccd98b5d"},"paths":{"/v2/models/byteplus/seedance-1-5-pro-251215":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedance-1-5-pro-251215 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for a BytePlus Seedance / Dreamina video generation task. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks must add `model` to it. This text-to-video example omits the `content` item with `type: image_url` and an `image_url.url` that an image-to-video call supplies; text-only models must omit that image item.\n`content` is the whole `required` floor, and it is the floor the v1 surface already published and videoGenerationProxy's Rewrite already refuses an empty value for. Everything else BytePlus accepts varies by model — the per-model resolutions, durations, ratios and input kinds are documented on the individual fields — so the enums and bounds below are the union BytePlus admits across the family and BytePlus stays the authority on which member accepts which value.","example":{"content":[{"text":"A red fox trotting through a snowy pine forest","type":"text"}],"duration":5,"ratio":"16:9","resolution":"720p"},"properties":{"callback_url":{"description":"Callback notification address for the result of this generation task","format":"uri","type":"string"},"content":{"description":"The input content for the model to generate a video","items":{"$ref":"#/components/schemas/BytePlusVideoGenerationContent"},"minItems":1,"type":"array"},"duration":{"anyOf":[{"enum":[-1]},{"maximum":30,"minimum":2}],"description":"Video duration in seconds. Seedance 2.5: [4,30] or -1 (auto; video editing tasks support only -1). Seedance 2.0 \u0026 2.0 fast: [4,15] or -1 (auto). Seedance 1.5 pro: [4,12] or -1. Seedance 1.0: [2,12].\n","type":"integer"},"execution_expires_after":{"description":"Task timeout threshold in seconds. Default 172800 (48h). Range: [3600, 259200].\n","maximum":259200,"minimum":3600,"type":"integer"},"generate_audio":{"default":true,"description":"Supported by Seedance 2.5, 2.0, 2.0 fast, and 1.5 pro. Whether the generated video includes audio synchronized with the visuals.\ntrue: The model outputs a video with synchronized audio.\nfalse: The model outputs a silent video.\n","type":"boolean"},"model":{"description":"The ID of the model to call. Supported models: seedance-1-5-pro-251215, seedance-1-0-pro-250528, seedance-1-0-pro-fast-251015, dreamina-seedance-2-0-260128, dreamina-seedance-2-0-fast-260128, dreamina-seedance-2-0-mini and dreamina-seedance-2-5-260628. A direct v1 call to POST /proxy/byteplus/api/v3/contents/generations/tasks MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"output_format":{"default":"mp4","description":"Seedance 2.5 only. Container format of the output video.\nmp4: General-purpose container (H.264/AAC, yuv420p) with broad compatibility and smaller file size.\nmov: Professional container (H.264 High 4:4:4 Predictive/PCM, yuv444p) with high color precision, suited for post-production; larger file size.\n","enum":["mp4","mov"],"type":"string"},"ratio":{"description":"Aspect ratio of the generated video. Seedance 2.0 \u0026 2.0 fast, 1.5 pro default: adaptive.\n","enum":["16:9","4:3","1:1","3:4","9:16","21:9","9:21","adaptive"],"type":"string"},"resolution":{"description":"Video resolution. Seedance 2.5, 2.0 \u0026 2.0 fast, 1.5 pro, 1.0 lite default: 720p. Seedance 1.0 pro \u0026 pro-fast default: 1080p.\nNote: Seedance 2.0 \u0026 2.0 fast do not support 1080p. Seedance 2.5 supports 480p, 720p, and 1080p.\n","enum":["480p","720p","1080p","4k"],"type":"string"},"return_last_frame":{"default":false,"description":"Whether to return the last frame image of the generated video.\ntrue: Returns the last frame image of the generated video. After setting this parameter to true, you can obtain the last frame image by calling the Querying the information about a video generation task. The last frame image is in PNG format, with its pixel width and height consistent with those of the generated video, and it contains no watermarks. Using this parameter allows the generation of multiple consecutive videos: the last frame of the previously generated video is used as the first frame of the next video task, enabling quick generation of multiple consecutive videos.\nfalse: Does not return the last frame image of the generated video.\n","type":"boolean"},"seed":{"description":"Seed integer for controlling randomness. Range: [-1, 2^32-1]. -1 uses a random seed.\n","maximum":4294967295,"minimum":-1,"type":"integer"},"service_tier":{"description":"Service tier for processing. Seedance 2.5, 2.0 \u0026 2.0 fast do not support flex (offline inference).\n","enum":["default","flex"],"type":"string"},"watermark":{"default":false,"description":"Whether the generated video includes a watermark.","type":"boolean"}},"required":["content"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusVideoGenerationQueryResponse"}],"description":"Comfy Router output schema for the BytePlus Seedance video models: the terminal task-query document, forwarded unchanged EXCEPT for the two re-hosted `content` URLs described below - every other field is BytePlus's own. The operation is submit-and-poll and Router polls on the caller's behalf, so the body a caller receives is the finished task (`status: succeeded`) rather than the task handle the underlying submit returns.\nThe generated video's download URL is at `content.video_url`, present once the task succeeds. A failed task carries `error.code` and `error.message` instead; `status` is BytePlus's own vocabulary (queued, running, cancelled, succeeded, failed, expired), forwarded unchanged.\nThat URL is RE-HOSTED: Router copies the finished video onto Comfy storage and answers a Comfy-signed URL valid for up to 24 hours in place of BytePlus's own, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Exactly two leaves are rewritten this way - `content.video_url` and `content.last_frame_url`, both modelled here. Any OTHER asset URL a task carries keeps BytePlus's own link and is NOT flagged as non-durable, so a stored or replayed document can still hand back a link that BytePlus has since cleared.\nDurability is per leaf, not per response: a leaf whose re-host could not be performed keeps BytePlus's own URL rather than a Comfy one, and the other is unaffected - so a caller that stores or replays this document should not assume every URL in it outlives the call. 24 hours is the CEILING, not a guarantee: the Comfy link is signed for 24 hours from the moment it is minted, and Router memoises it for 23 hours, so a later poll or an `Idempotency-Key` replay can hand back a link with as little as an hour left. Either way the link expires, so download the asset rather than storing it.","example":{"content":{"last_frame_url":"https://example.invalid/byteplus/seedance-1-0-pro-250528/last-frame","video_url":"https://example.invalid/byteplus/seedance-1-0-pro-250528/generated.mp4"},"created_at":1767225600,"duration":5,"error":null,"id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","model":"seedance-1-0-pro-250528","output_format":"mp4","resolution":"1080p","seed":1234567890123,"status":"succeeded","updated_at":1767225730}}}}}}}}},"components":{"schemas":{"BytePlusVideoGenerationContent":{"oneOf":[{"properties":{"type":{"enum":["text"]}},"required":["text"]},{"properties":{"type":{"enum":["image_url"]}},"required":["image_url"]},{"properties":{"type":{"enum":["video_url"]}},"required":["video_url"]},{"properties":{"type":{"enum":["audio_url"]}},"required":["audio_url"]}],"properties":{"audio_url":{"description":"Input audio object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support audio input. Seedance 2.0 \u0026 2.0 fast cannot use audio alone - they must include at least 1 image or video; Seedance 2.5 supports audio-only input.","properties":{"url":{"description":"Audio URL, Base64 encoding, or Asset ID.\nAudio URL: Public URL of the audio (wav, mp3).\nBase64: Format data:audio/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"image_url":{"properties":{"url":{"description":"Image content for image-to-video generation (when type is \"image_url\")\nImage URL: Make sure that the image URL is accessible.\nBase64-encoded content: Format must be data:image/\u003cformat\u003e;base64,\u003ccontent\u003e\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"},"role":{"description":"The role/position of the content item.\nFor images: first_frame, last_frame, or reference_image.\nFor videos: reference_video (Seedance 2.5, 2.0 \u0026 2.0 fast only).\nFor audio: reference_audio (Seedance 2.5, 2.0 \u0026 2.0 fast only).\n","enum":["first_frame","last_frame","reference_image","reference_video","reference_audio"],"type":"string"},"text":{"description":"The input text information for the model. Includes text prompt and optional parameters.\n\nText prompt (required): Description of the video to be generated using Chinese and English characters.\n\nParameters (optional): Add --[parameters] after the text prompt to control video specifications:\n- --resolution (--rs): 480p, 720p, 1080p (default: 720p)\n- --ratio (--rt): 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21, adaptive (default: 16:9 or adaptive)\n- --duration (--dur): 3-12 seconds (default: 5)\n- --framepersecond (--fps): 24 (default: 24)\n- --watermark (--wm): true/false (default: false)\n- --seed (--seed): -1 to 2^32-1 (default: -1)\n- --camerafixed (--cf): true/false (default: false)\n\nExample: \"A beautiful landscape --ratio 16:9 --resolution 720p --duration 5\"\n","maxLength":4096,"type":"string"},"type":{"description":"The type of the input content","enum":["text","image_url","video_url","audio_url"],"type":"string"},"video_url":{"description":"Input video object. Only Seedance 2.5, 2.0 \u0026 2.0 fast support video input.","properties":{"url":{"description":"Video URL or Asset ID.\nVideo URL: Public URL of the video (mp4, mov).\nAsset ID: Format asset://\u003cASSET_ID\u003e\n","type":"string"}},"required":["url"],"type":"object"}},"required":["type"],"type":"object"},"BytePlusVideoGenerationQueryResponse":{"properties":{"content":{"description":"The output after the video generation task is completed, which contains the download URL of the output video and, when BytePlus returns one, the download URL of its last frame. Both `video_url` and `last_frame_url` are RE-HOSTED onto Comfy storage; every other field here is BytePlus's own. Nullable - BytePlus clears the URLs 24 hours after the task, and a succeeded document polled after that can carry `content` absent or null.","nullable":true,"properties":{"last_frame_url":{"description":"Download URL for the last frame of the generated video, returned when the request set `return_last_frame`. Do not infer the image format from this URL: BytePlus documents the last frame as PNG on the request side, Router re-hosts whatever bytes it is served and types them from the upstream Content-Type or a content sniff, and `image/jpeg` is only the last-resort fallback when both fail. Router re-hosts the last frame onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task. Either way the link expires, so download the frame rather than storing the URL.","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), when BytePlus nests it inside `content`. Seedance models more commonly return it as a TOP-LEVEL sibling of `content` - see the top-level `output_format` field - and Router reads whichever of the two is present.","type":"string"},"video_url":{"description":"Download URL for the output video. Router re-hosts the video onto Comfy storage and rewrites this field, so it is normally a Comfy-signed URL valid for up to 24 hours - signed for 24 hours when minted and replayed from a 23-hour memo, so a later poll can hand back one with as little as an hour left. When the re-host could not be performed the field keeps BytePlus's own URL instead, which BytePlus clears 24 hours after the task and caps at 100 downloads on some models. Either way the link expires, so download the video rather than storing the URL.","type":"string"}},"type":"object"},"created_at":{"description":"The time when the task was created. The value is a UNIX timestamp in seconds.","type":"integer"},"duration":{"description":"The duration of the generated video in seconds. Declared as a number rather than an integer because BytePlus is not consistent about it - video tasks have been observed returning whole seconds and sibling BytePlus surfaces report fractional durations - so a client must not assume an integral value. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"number"},"error":{"description":"The error information. If the task succeeds, null is returned. If the task fails, the error information is returned.","nullable":true,"properties":{"code":{"description":"The error code","type":"string"},"message":{"description":"The error message","type":"string"}},"type":"object"},"id":{"description":"The ID of the video generation task","type":"string"},"model":{"description":"The name and version of the model used by the task","type":"string"},"output_format":{"description":"Container format of the generated video (mp4 or mov), returned at the TOP LEVEL as a sibling of `content` - this is where the Seedance video task query returns it. BytePlus's own field, forwarded unchanged.","type":"string"},"resolution":{"description":"The resolution of the generated video, for example `1080p`. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","type":"string"},"seed":{"description":"The generation seed actually used for the task. BytePlus's own field, returned on succeeded video tasks and forwarded unchanged.","format":"int64","type":"integer"},"status":{"description":"The state of the task","enum":["queued","running","cancelled","succeeded","failed","expired"],"type":"string"},"updated_at":{"description":"The time when the task was last updated. The value is a UNIX timestamp in seconds.","type":"integer"},"usage":{"description":"The token usage for the request","properties":{"completion_tokens":{"description":"The number of tokens generated by the model","type":"integer"},"total_tokens":{"description":"For the video generation model, the number of input tokens is not calculated and defaults to 0. Therefore, total_tokens = completion_tokens.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedance-1-5-pro-251215","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/byteplus/seededit-3-0-i2i-250628.json b/router-schemas/byteplus/seededit-3-0-i2i-250628.json deleted file mode 100644 index 61d2c2e82..000000000 --- a/router-schemas/byteplus/seededit-3-0-i2i-250628.json +++ /dev/null @@ -1 +0,0 @@ -{"openapi":"3.0.2","info":{"title":"byteplus/seededit-3-0-i2i-250628","description":"The request body Comfy Router accepts for the model \"byteplus/seededit-3-0-i2i-250628\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"9253dd6e4b11"},"paths":{"/v2/models/byteplus/seededit-3-0-i2i-250628":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seededit-3-0-i2i-250628 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"required":["prompt"]},{"required":["image"]}],"description":"Request body for a BytePlus Seedream / Seededit image generation. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/images/generations must add `model` to it. The example illustrates text-to-image calls. For seededit-3-0-i2i-250628, also supply the single `image` URL or base64 image to edit; omit `size` to retain that model's adaptive sizing. Layer decomposition accepts `image` without `prompt`. At least one of `prompt` or `image` is required; BytePlus validates the model-specific combination. The v1 wrapper separately requires `model`.","example":{"prompt":"A red fox trotting through a snowy pine forest, cinematic lighting","response_format":"url","watermark":false},"properties":{"guidance_scale":{"description":"Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Default 2.5 for seedream-3-0-t2i-250415 and 5.5 for seededit-3-0-i2i-250628. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0.","format":"float","maximum":10,"minimum":1,"type":"number"},"image":{"description":"Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0, and seededit-3.0-i2i support this parameter.\n\nEnter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example), while seededit-3.0-i2i only supports single-image input.\n\n• Image URL: Make sure that the image URL is accessible.\n• Base64 encoding: The format must be data:image/\u003cimage format\u003e;base64,\u003cBase64 encoding\u003e. Note: \u003cimage format\u003e must be in lowercase, e.g., data:image/png;base64,\u003cbase64_image\u003e.\n\nComfy Router limits the entire JSON request to 10 MiB, including base64 expansion and all reference images. Use URLs for inputs that would exceed this transport limit.\n\nAn input image must meet the following requirements:\n• Image format: jpeg, png (seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 also support webp, bmp, tiff and gif; seedream-5.0-pro also supports heic and heif)\n• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0; [1/3, 3] for seededit-3.0-i2i\n• Width and height (px): \u003e 14\n• Size: No more than 10 MB (30 MB for seedream-5.0-pro)\n• Total pixels: No more than 6000x6000 (36,000,000 px) for seedream-5.0-pro\n• Maximum of 14 reference images (10 for seedream-5.0-pro)\n\nIn the layer-separation scenario (layer_decomposition enabled), image is required and only a single input image is supported (passing multiple images returns an error). Input images must be png, jpeg, webp, bmp, tiff or gif (heic and heif are not supported), up to 30 MB, with total pixels in the range [512x512, 6000x6000] and aspect ratio in [1/16, 16].\n","oneOf":[{"description":"Single image (URL or Base64)","type":"string"},{"description":"Multiple images (URLs or Base64) - supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0","items":{"type":"string"},"maxItems":14,"minItems":1,"type":"array"}]},"layer_decomposition":{"default":false,"description":"Controls whether layer separation is enabled. Only seedream-5.0-pro supports this parameter.\ntrue: Layer-separation mode. The model decomposes the single input image into one base image plus multiple layers (up to 16), and returns the position and content information of each produced layer, including the stacking order (z_index), bounding box (bounding_box), name (name) and description (description).\nfalse: Standard image-generation mode; no layer separation is performed.\nNotes on layer-separation mode: only a single input image is supported (passing multiple images returns an error); if any single layer fails to generate, the whole request fails — partial success is not supported; at most 17 images are returned (1 base image + 16 layers). sequential_image_generation, sequential_image_generation_options, tools and stream return an error if passed.\n","type":"boolean"},"model":{"description":"Model identifier. Supported models: seedream-3-0-t2i-250415, seededit-3-0-i2i-250628, seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"optimize_prompt_options":{"description":"Configuration for prompt optimization feature. Only seedream-5.0-pro/5.0-lite/4.5 (only support standard mode) and seedream-4.0 support this parameter.\n","properties":{"mode":{"default":"standard","description":"Set the mode for the prompt optimization feature. standard = Higher quality, longer generation time. fast = Faster but at a more average quality.","enum":["standard","fast"],"type":"string"}},"type":"object"},"output_format":{"default":"jpeg","description":"Specifies the format of the output image. Only seedream-5.0-pro and 5.0-lite support this parameter. In the layer-separation scenario, output_format only controls the format of the base image; every layer is always output as png.","enum":["png","jpeg"],"type":"string"},"prompt":{"description":"Text description for image generation or transformation.\nOptional in the layer-separation scenario (seedream-5.0-pro with layer_decomposition enabled): if a prompt is provided, the model recognizes and separates the elements you specify according to the prompt intent; if no prompt is provided, the model automatically detects all major elements in the image and separates them into independent layers.\n","type":"string"},"response_format":{"default":"url","description":"Specifies the format of the generated image returned in the response","enum":["url","b64_json"],"type":"string"},"seed":{"default":-1,"description":"Random seed to control the stochasticity of image generation. Range: [-1, 2147483647]. If not specified, a seed will be automatically generated. To reproduce the same output, use the same seed value.","maximum":2147483647,"minimum":-1,"type":"integer"},"sequential_image_generation":{"description":"Controls whether to disable the batch generation feature. This parameter is only supported on seedream-5.0-lite, 4.5 and 4.0 (not supported by seedream-5.0-pro). Valid values:\nauto: In automatic mode, the model automatically determines whether to return multiple images and how many images it will contain based on the user's prompt.\ndisabled: Disables batch generation feature. The model will only generate one image.\n","enum":["auto","disabled"],"type":"string"},"sequential_image_generation_options":{"description":"Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro).\nConfiguration for the batch image generation feature. This parameter is only effective when sequential_image_generation is set to auto.\n","properties":{"max_images":{"default":15,"description":"Specifies the maximum number of images to generate in this request. Number of input reference images + Number of generated images ≤ 15.","maximum":15,"minimum":1,"type":"integer"}},"type":"object"},"size":{"description":"\"seedream-3-0-t2i-250415\": Specifies the dimensions (width x height in pixels) of the generated image. Must be between [512x512, 2048x2048]\n\"seededit-3-0-i2i-250628\": The width and height pixels of the generated image. Currently only supports adaptive.\n\"seedream-4-0-250828\": Set the specification for the generated image. Two methods are available but cannot be used together.\n Method 1 | Specify the resolution. Optional values: 1K, 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [1024x1024, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-4-5-251128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-5-0-260128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 3K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, ~3072x3072], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\": Two methods available (cannot be used together).\n Method 1 | Specify the resolution and describe the aspect ratio, shape or purpose of the image in the prompt; the model decides the final size. Optional values: 1K, 2K\n Method 2 | Specify width and height in pixels. Default: 1024x1024, total pixels: [1024x1024 (1048576), 2048x2048 (4194304)], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\" with layer_decomposition enabled: Only the resolution-level method is supported. Optional values: 1K, 1.5K, 2K, auto. Default: auto.\n The base image is output at the specified resolution with the aspect ratio of the original input image; each layer is output close to the specified resolution, keeping the aspect ratio it had in the original image.\n auto: Output is based on the size and aspect ratio of the input image. Inputs within [1280x720, ~2048x2048] are output at the original input size; inputs smaller than 1K are output at 1K; inputs larger than 2K are output at 2K.\n","type":"string"},"stream":{"default":false,"description":"Comfy Router settles an explicitly supplied stream flag to false because it captures a complete JSON result. On the v1 proxy, this field controls whether to enable streaming output mode. Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro). false = All output images are returned at once. true = Each output image is returned immediately after generated.","type":"boolean"},"watermark":{"default":true,"description":"Specifies whether to add a watermark to the generated image. false = No watermark, true = Adds watermark with 'AI generated' label","type":"boolean"}},"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusImageGenerationResponse"}],"description":"Comfy Router output schema for the BytePlus Seedream/Seededit image models: BytePlus's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `byteplus /api/v3/images/generations` as ReturnModeDirect), so the body a caller receives is this finished document from the one call.\nThe generated images are in `data`, each with either a download URL at `data[].url` or inline base64 bytes at `data[].b64_json`, depending on the request's `response_format`; select the leaf by which key is present. `usage` reports BytePlus's own generation accounting — BytePlus's numbers, not the Comfy charge.\nRouter does not re-host these images onto Comfy storage the way it re-hosts the Seedance VIDEO results: a `data[].url` here stays BytePlus's own link, which BytePlus clears 24 hours after the generation and caps at 100 downloads on some models. Download it rather than storing the URL.","example":{"created":1767225600,"data":[{"size":"1024x1024","url":"https://example.invalid/byteplus/seedream-3-0-t2i-250415/generated.png"}],"model":"seedream-3-0-t2i-250415","usage":{"generated_images":1}}}}}}}}}},"components":{"schemas":{"BytePlusImageGenerationResponse":{"properties":{"created":{"description":"Unix timestamp (in seconds) indicating the time when the request was created","type":"integer"},"data":{"description":"Contains information about the generated image(s).\nIn the layer-separation scenario, the first element of the array is the base image (z_index=0), and the following elements are the layers, ordered by increasing z_index.\n","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (if response_format is \"b64_json\")","type":"string"},"bounding_box":{"description":"The bounding-box information of the region that the current layer occupies within the base image. Only layers return this field; the base image covers the whole canvas and does not return bounding_box. Returned only when layer_decomposition is true.","properties":{"absolute":{"description":"The absolute pixel coordinates of the layer's bounding box, in the output base image's coordinate system with the top-left corner at (0, 0). Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"},"normalized":{"description":"The per-mille quantized (normalized) coordinates of the layer's bounding box, proportionally mapped to a discrete integer range of [0, 1000] based on the base image size, truncated at a maximum of 1000. Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"}},"type":"object"},"description":{"description":"A detailed description of the current separated element, providing richer layer characteristics (such as color, state, material) than name. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"name":{"description":"The name/label of the current separated element, automatically generated by the model from the characteristics of the separated subject. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"output_format":{"description":"The file format of the output image. Only seedream-5.0-pro supports this field.","type":"string"},"size":{"description":"The width and height of the image in pixels, in the format \u003cwidth\u003ex\u003cheight\u003e. Only seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter.","type":"string"},"url":{"description":"URL for image download (if response_format is \"url\")","format":"uri","type":"string"},"z_index":{"description":"The stacking order of the layer, increasing from bottom to top: 0 is the bottom-most layer (the base image); larger values sit higher. Use it to recompose the layers into the complete image at the correct stacking order. Returned only when layer_decomposition is true.","type":"integer"}},"type":"object"},"type":"array"},"error":{"description":"Error information (if any)","properties":{"code":{"description":"Error code","type":"string"},"message":{"description":"Error message","type":"string"}},"type":"object"},"model":{"description":"The model ID used for the request","example":"seedream-3-0-t2i-250415","type":"string"},"usage":{"properties":{"generated_images":{"description":"Number of images generated by the model","type":"integer"},"input_images":{"description":"The number of images input to the model. Only seedream-5.0-pro supports this field.","type":"integer"},"output_tokens":{"description":"The number of tokens used for the picture generated by the model.","type":"integer"},"total_tokens":{"description":"The total number of tokens consumed by this request.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seededit-3-0-i2i-250628","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/byteplus/seedream-3-0-t2i-250415.json b/router-schemas/byteplus/seedream-3-0-t2i-250415.json deleted file mode 100644 index bcadafcf1..000000000 --- a/router-schemas/byteplus/seedream-3-0-t2i-250415.json +++ /dev/null @@ -1 +0,0 @@ -{"openapi":"3.0.2","info":{"title":"byteplus/seedream-3-0-t2i-250415","description":"The request body Comfy Router accepts for the model \"byteplus/seedream-3-0-t2i-250415\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"9253dd6e4b11"},"paths":{"/v2/models/byteplus/seedream-3-0-t2i-250415":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedream-3-0-t2i-250415 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"required":["prompt"]},{"required":["image"]}],"description":"Request body for a BytePlus Seedream / Seededit image generation. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/images/generations must add `model` to it. The example illustrates text-to-image calls. For seededit-3-0-i2i-250628, also supply the single `image` URL or base64 image to edit; omit `size` to retain that model's adaptive sizing. Layer decomposition accepts `image` without `prompt`. At least one of `prompt` or `image` is required; BytePlus validates the model-specific combination. The v1 wrapper separately requires `model`.","example":{"prompt":"A red fox trotting through a snowy pine forest, cinematic lighting","response_format":"url","watermark":false},"properties":{"guidance_scale":{"description":"Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Default 2.5 for seedream-3-0-t2i-250415 and 5.5 for seededit-3-0-i2i-250628. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0.","format":"float","maximum":10,"minimum":1,"type":"number"},"image":{"description":"Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0, and seededit-3.0-i2i support this parameter.\n\nEnter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example), while seededit-3.0-i2i only supports single-image input.\n\n• Image URL: Make sure that the image URL is accessible.\n• Base64 encoding: The format must be data:image/\u003cimage format\u003e;base64,\u003cBase64 encoding\u003e. Note: \u003cimage format\u003e must be in lowercase, e.g., data:image/png;base64,\u003cbase64_image\u003e.\n\nComfy Router limits the entire JSON request to 10 MiB, including base64 expansion and all reference images. Use URLs for inputs that would exceed this transport limit.\n\nAn input image must meet the following requirements:\n• Image format: jpeg, png (seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 also support webp, bmp, tiff and gif; seedream-5.0-pro also supports heic and heif)\n• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0; [1/3, 3] for seededit-3.0-i2i\n• Width and height (px): \u003e 14\n• Size: No more than 10 MB (30 MB for seedream-5.0-pro)\n• Total pixels: No more than 6000x6000 (36,000,000 px) for seedream-5.0-pro\n• Maximum of 14 reference images (10 for seedream-5.0-pro)\n\nIn the layer-separation scenario (layer_decomposition enabled), image is required and only a single input image is supported (passing multiple images returns an error). Input images must be png, jpeg, webp, bmp, tiff or gif (heic and heif are not supported), up to 30 MB, with total pixels in the range [512x512, 6000x6000] and aspect ratio in [1/16, 16].\n","oneOf":[{"description":"Single image (URL or Base64)","type":"string"},{"description":"Multiple images (URLs or Base64) - supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0","items":{"type":"string"},"maxItems":14,"minItems":1,"type":"array"}]},"layer_decomposition":{"default":false,"description":"Controls whether layer separation is enabled. Only seedream-5.0-pro supports this parameter.\ntrue: Layer-separation mode. The model decomposes the single input image into one base image plus multiple layers (up to 16), and returns the position and content information of each produced layer, including the stacking order (z_index), bounding box (bounding_box), name (name) and description (description).\nfalse: Standard image-generation mode; no layer separation is performed.\nNotes on layer-separation mode: only a single input image is supported (passing multiple images returns an error); if any single layer fails to generate, the whole request fails — partial success is not supported; at most 17 images are returned (1 base image + 16 layers). sequential_image_generation, sequential_image_generation_options, tools and stream return an error if passed.\n","type":"boolean"},"model":{"description":"Model identifier. Supported models: seedream-3-0-t2i-250415, seededit-3-0-i2i-250628, seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"optimize_prompt_options":{"description":"Configuration for prompt optimization feature. Only seedream-5.0-pro/5.0-lite/4.5 (only support standard mode) and seedream-4.0 support this parameter.\n","properties":{"mode":{"default":"standard","description":"Set the mode for the prompt optimization feature. standard = Higher quality, longer generation time. fast = Faster but at a more average quality.","enum":["standard","fast"],"type":"string"}},"type":"object"},"output_format":{"default":"jpeg","description":"Specifies the format of the output image. Only seedream-5.0-pro and 5.0-lite support this parameter. In the layer-separation scenario, output_format only controls the format of the base image; every layer is always output as png.","enum":["png","jpeg"],"type":"string"},"prompt":{"description":"Text description for image generation or transformation.\nOptional in the layer-separation scenario (seedream-5.0-pro with layer_decomposition enabled): if a prompt is provided, the model recognizes and separates the elements you specify according to the prompt intent; if no prompt is provided, the model automatically detects all major elements in the image and separates them into independent layers.\n","type":"string"},"response_format":{"default":"url","description":"Specifies the format of the generated image returned in the response","enum":["url","b64_json"],"type":"string"},"seed":{"default":-1,"description":"Random seed to control the stochasticity of image generation. Range: [-1, 2147483647]. If not specified, a seed will be automatically generated. To reproduce the same output, use the same seed value.","maximum":2147483647,"minimum":-1,"type":"integer"},"sequential_image_generation":{"description":"Controls whether to disable the batch generation feature. This parameter is only supported on seedream-5.0-lite, 4.5 and 4.0 (not supported by seedream-5.0-pro). Valid values:\nauto: In automatic mode, the model automatically determines whether to return multiple images and how many images it will contain based on the user's prompt.\ndisabled: Disables batch generation feature. The model will only generate one image.\n","enum":["auto","disabled"],"type":"string"},"sequential_image_generation_options":{"description":"Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro).\nConfiguration for the batch image generation feature. This parameter is only effective when sequential_image_generation is set to auto.\n","properties":{"max_images":{"default":15,"description":"Specifies the maximum number of images to generate in this request. Number of input reference images + Number of generated images ≤ 15.","maximum":15,"minimum":1,"type":"integer"}},"type":"object"},"size":{"description":"\"seedream-3-0-t2i-250415\": Specifies the dimensions (width x height in pixels) of the generated image. Must be between [512x512, 2048x2048]\n\"seededit-3-0-i2i-250628\": The width and height pixels of the generated image. Currently only supports adaptive.\n\"seedream-4-0-250828\": Set the specification for the generated image. Two methods are available but cannot be used together.\n Method 1 | Specify the resolution. Optional values: 1K, 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [1024x1024, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-4-5-251128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-5-0-260128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 3K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, ~3072x3072], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\": Two methods available (cannot be used together).\n Method 1 | Specify the resolution and describe the aspect ratio, shape or purpose of the image in the prompt; the model decides the final size. Optional values: 1K, 2K\n Method 2 | Specify width and height in pixels. Default: 1024x1024, total pixels: [1024x1024 (1048576), 2048x2048 (4194304)], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\" with layer_decomposition enabled: Only the resolution-level method is supported. Optional values: 1K, 1.5K, 2K, auto. Default: auto.\n The base image is output at the specified resolution with the aspect ratio of the original input image; each layer is output close to the specified resolution, keeping the aspect ratio it had in the original image.\n auto: Output is based on the size and aspect ratio of the input image. Inputs within [1280x720, ~2048x2048] are output at the original input size; inputs smaller than 1K are output at 1K; inputs larger than 2K are output at 2K.\n","type":"string"},"stream":{"default":false,"description":"Comfy Router settles an explicitly supplied stream flag to false because it captures a complete JSON result. On the v1 proxy, this field controls whether to enable streaming output mode. Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro). false = All output images are returned at once. true = Each output image is returned immediately after generated.","type":"boolean"},"watermark":{"default":true,"description":"Specifies whether to add a watermark to the generated image. false = No watermark, true = Adds watermark with 'AI generated' label","type":"boolean"}},"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusImageGenerationResponse"}],"description":"Comfy Router output schema for the BytePlus Seedream/Seededit image models: BytePlus's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `byteplus /api/v3/images/generations` as ReturnModeDirect), so the body a caller receives is this finished document from the one call.\nThe generated images are in `data`, each with either a download URL at `data[].url` or inline base64 bytes at `data[].b64_json`, depending on the request's `response_format`; select the leaf by which key is present. `usage` reports BytePlus's own generation accounting — BytePlus's numbers, not the Comfy charge.\nRouter does not re-host these images onto Comfy storage the way it re-hosts the Seedance VIDEO results: a `data[].url` here stays BytePlus's own link, which BytePlus clears 24 hours after the generation and caps at 100 downloads on some models. Download it rather than storing the URL.","example":{"created":1767225600,"data":[{"size":"1024x1024","url":"https://example.invalid/byteplus/seedream-3-0-t2i-250415/generated.png"}],"model":"seedream-3-0-t2i-250415","usage":{"generated_images":1}}}}}}}}}},"components":{"schemas":{"BytePlusImageGenerationResponse":{"properties":{"created":{"description":"Unix timestamp (in seconds) indicating the time when the request was created","type":"integer"},"data":{"description":"Contains information about the generated image(s).\nIn the layer-separation scenario, the first element of the array is the base image (z_index=0), and the following elements are the layers, ordered by increasing z_index.\n","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (if response_format is \"b64_json\")","type":"string"},"bounding_box":{"description":"The bounding-box information of the region that the current layer occupies within the base image. Only layers return this field; the base image covers the whole canvas and does not return bounding_box. Returned only when layer_decomposition is true.","properties":{"absolute":{"description":"The absolute pixel coordinates of the layer's bounding box, in the output base image's coordinate system with the top-left corner at (0, 0). Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"},"normalized":{"description":"The per-mille quantized (normalized) coordinates of the layer's bounding box, proportionally mapped to a discrete integer range of [0, 1000] based on the base image size, truncated at a maximum of 1000. Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"}},"type":"object"},"description":{"description":"A detailed description of the current separated element, providing richer layer characteristics (such as color, state, material) than name. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"name":{"description":"The name/label of the current separated element, automatically generated by the model from the characteristics of the separated subject. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"output_format":{"description":"The file format of the output image. Only seedream-5.0-pro supports this field.","type":"string"},"size":{"description":"The width and height of the image in pixels, in the format \u003cwidth\u003ex\u003cheight\u003e. Only seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter.","type":"string"},"url":{"description":"URL for image download (if response_format is \"url\")","format":"uri","type":"string"},"z_index":{"description":"The stacking order of the layer, increasing from bottom to top: 0 is the bottom-most layer (the base image); larger values sit higher. Use it to recompose the layers into the complete image at the correct stacking order. Returned only when layer_decomposition is true.","type":"integer"}},"type":"object"},"type":"array"},"error":{"description":"Error information (if any)","properties":{"code":{"description":"Error code","type":"string"},"message":{"description":"Error message","type":"string"}},"type":"object"},"model":{"description":"The model ID used for the request","example":"seedream-3-0-t2i-250415","type":"string"},"usage":{"properties":{"generated_images":{"description":"Number of images generated by the model","type":"integer"},"input_images":{"description":"The number of images input to the model. Only seedream-5.0-pro supports this field.","type":"integer"},"output_tokens":{"description":"The number of tokens used for the picture generated by the model.","type":"integer"},"total_tokens":{"description":"The total number of tokens consumed by this request.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedream-3-0-t2i-250415","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/byteplus/seedream-4-0-250828.json b/router-schemas/byteplus/seedream-4-0-250828.json index 06df496e7..03df2bbf0 100644 --- a/router-schemas/byteplus/seedream-4-0-250828.json +++ b/router-schemas/byteplus/seedream-4-0-250828.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"byteplus/seedream-4-0-250828","description":"The request body Comfy Router accepts for the model \"byteplus/seedream-4-0-250828\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"9253dd6e4b11"},"paths":{"/v2/models/byteplus/seedream-4-0-250828":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedream-4-0-250828 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"required":["prompt"]},{"required":["image"]}],"description":"Request body for a BytePlus Seedream / Seededit image generation. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/images/generations must add `model` to it. The example illustrates text-to-image calls. For seededit-3-0-i2i-250628, also supply the single `image` URL or base64 image to edit; omit `size` to retain that model's adaptive sizing. Layer decomposition accepts `image` without `prompt`. At least one of `prompt` or `image` is required; BytePlus validates the model-specific combination. The v1 wrapper separately requires `model`.","example":{"prompt":"A red fox trotting through a snowy pine forest, cinematic lighting","response_format":"url","watermark":false},"properties":{"guidance_scale":{"description":"Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Default 2.5 for seedream-3-0-t2i-250415 and 5.5 for seededit-3-0-i2i-250628. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0.","format":"float","maximum":10,"minimum":1,"type":"number"},"image":{"description":"Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0, and seededit-3.0-i2i support this parameter.\n\nEnter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example), while seededit-3.0-i2i only supports single-image input.\n\n• Image URL: Make sure that the image URL is accessible.\n• Base64 encoding: The format must be data:image/\u003cimage format\u003e;base64,\u003cBase64 encoding\u003e. Note: \u003cimage format\u003e must be in lowercase, e.g., data:image/png;base64,\u003cbase64_image\u003e.\n\nComfy Router limits the entire JSON request to 10 MiB, including base64 expansion and all reference images. Use URLs for inputs that would exceed this transport limit.\n\nAn input image must meet the following requirements:\n• Image format: jpeg, png (seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 also support webp, bmp, tiff and gif; seedream-5.0-pro also supports heic and heif)\n• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0; [1/3, 3] for seededit-3.0-i2i\n• Width and height (px): \u003e 14\n• Size: No more than 10 MB (30 MB for seedream-5.0-pro)\n• Total pixels: No more than 6000x6000 (36,000,000 px) for seedream-5.0-pro\n• Maximum of 14 reference images (10 for seedream-5.0-pro)\n\nIn the layer-separation scenario (layer_decomposition enabled), image is required and only a single input image is supported (passing multiple images returns an error). Input images must be png, jpeg, webp, bmp, tiff or gif (heic and heif are not supported), up to 30 MB, with total pixels in the range [512x512, 6000x6000] and aspect ratio in [1/16, 16].\n","oneOf":[{"description":"Single image (URL or Base64)","type":"string"},{"description":"Multiple images (URLs or Base64) - supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0","items":{"type":"string"},"maxItems":14,"minItems":1,"type":"array"}]},"layer_decomposition":{"default":false,"description":"Controls whether layer separation is enabled. Only seedream-5.0-pro supports this parameter.\ntrue: Layer-separation mode. The model decomposes the single input image into one base image plus multiple layers (up to 16), and returns the position and content information of each produced layer, including the stacking order (z_index), bounding box (bounding_box), name (name) and description (description).\nfalse: Standard image-generation mode; no layer separation is performed.\nNotes on layer-separation mode: only a single input image is supported (passing multiple images returns an error); if any single layer fails to generate, the whole request fails — partial success is not supported; at most 17 images are returned (1 base image + 16 layers). sequential_image_generation, sequential_image_generation_options, tools and stream return an error if passed.\n","type":"boolean"},"model":{"description":"Model identifier. Supported models: seedream-3-0-t2i-250415, seededit-3-0-i2i-250628, seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"optimize_prompt_options":{"description":"Configuration for prompt optimization feature. Only seedream-5.0-pro/5.0-lite/4.5 (only support standard mode) and seedream-4.0 support this parameter.\n","properties":{"mode":{"default":"standard","description":"Set the mode for the prompt optimization feature. standard = Higher quality, longer generation time. fast = Faster but at a more average quality.","enum":["standard","fast"],"type":"string"}},"type":"object"},"output_format":{"default":"jpeg","description":"Specifies the format of the output image. Only seedream-5.0-pro and 5.0-lite support this parameter. In the layer-separation scenario, output_format only controls the format of the base image; every layer is always output as png.","enum":["png","jpeg"],"type":"string"},"prompt":{"description":"Text description for image generation or transformation.\nOptional in the layer-separation scenario (seedream-5.0-pro with layer_decomposition enabled): if a prompt is provided, the model recognizes and separates the elements you specify according to the prompt intent; if no prompt is provided, the model automatically detects all major elements in the image and separates them into independent layers.\n","type":"string"},"response_format":{"default":"url","description":"Specifies the format of the generated image returned in the response","enum":["url","b64_json"],"type":"string"},"seed":{"default":-1,"description":"Random seed to control the stochasticity of image generation. Range: [-1, 2147483647]. If not specified, a seed will be automatically generated. To reproduce the same output, use the same seed value.","maximum":2147483647,"minimum":-1,"type":"integer"},"sequential_image_generation":{"description":"Controls whether to disable the batch generation feature. This parameter is only supported on seedream-5.0-lite, 4.5 and 4.0 (not supported by seedream-5.0-pro). Valid values:\nauto: In automatic mode, the model automatically determines whether to return multiple images and how many images it will contain based on the user's prompt.\ndisabled: Disables batch generation feature. The model will only generate one image.\n","enum":["auto","disabled"],"type":"string"},"sequential_image_generation_options":{"description":"Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro).\nConfiguration for the batch image generation feature. This parameter is only effective when sequential_image_generation is set to auto.\n","properties":{"max_images":{"default":15,"description":"Specifies the maximum number of images to generate in this request. Number of input reference images + Number of generated images ≤ 15.","maximum":15,"minimum":1,"type":"integer"}},"type":"object"},"size":{"description":"\"seedream-3-0-t2i-250415\": Specifies the dimensions (width x height in pixels) of the generated image. Must be between [512x512, 2048x2048]\n\"seededit-3-0-i2i-250628\": The width and height pixels of the generated image. Currently only supports adaptive.\n\"seedream-4-0-250828\": Set the specification for the generated image. Two methods are available but cannot be used together.\n Method 1 | Specify the resolution. Optional values: 1K, 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [1024x1024, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-4-5-251128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-5-0-260128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 3K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, ~3072x3072], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\": Two methods available (cannot be used together).\n Method 1 | Specify the resolution and describe the aspect ratio, shape or purpose of the image in the prompt; the model decides the final size. Optional values: 1K, 2K\n Method 2 | Specify width and height in pixels. Default: 1024x1024, total pixels: [1024x1024 (1048576), 2048x2048 (4194304)], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\" with layer_decomposition enabled: Only the resolution-level method is supported. Optional values: 1K, 1.5K, 2K, auto. Default: auto.\n The base image is output at the specified resolution with the aspect ratio of the original input image; each layer is output close to the specified resolution, keeping the aspect ratio it had in the original image.\n auto: Output is based on the size and aspect ratio of the input image. Inputs within [1280x720, ~2048x2048] are output at the original input size; inputs smaller than 1K are output at 1K; inputs larger than 2K are output at 2K.\n","type":"string"},"stream":{"default":false,"description":"Comfy Router settles an explicitly supplied stream flag to false because it captures a complete JSON result. On the v1 proxy, this field controls whether to enable streaming output mode. Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro). false = All output images are returned at once. true = Each output image is returned immediately after generated.","type":"boolean"},"watermark":{"default":true,"description":"Specifies whether to add a watermark to the generated image. false = No watermark, true = Adds watermark with 'AI generated' label","type":"boolean"}},"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusImageGenerationResponse"}],"description":"Comfy Router output schema for the BytePlus Seedream/Seededit image models: BytePlus's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `byteplus /api/v3/images/generations` as ReturnModeDirect), so the body a caller receives is this finished document from the one call.\nThe generated images are in `data`, each with either a download URL at `data[].url` or inline base64 bytes at `data[].b64_json`, depending on the request's `response_format`; select the leaf by which key is present. `usage` reports BytePlus's own generation accounting — BytePlus's numbers, not the Comfy charge.\nRouter does not re-host these images onto Comfy storage the way it re-hosts the Seedance VIDEO results: a `data[].url` here stays BytePlus's own link, which BytePlus clears 24 hours after the generation and caps at 100 downloads on some models. Download it rather than storing the URL.","example":{"created":1767225600,"data":[{"size":"1024x1024","url":"https://example.invalid/byteplus/seedream-3-0-t2i-250415/generated.png"}],"model":"seedream-3-0-t2i-250415","usage":{"generated_images":1}}}}}}}}}},"components":{"schemas":{"BytePlusImageGenerationResponse":{"properties":{"created":{"description":"Unix timestamp (in seconds) indicating the time when the request was created","type":"integer"},"data":{"description":"Contains information about the generated image(s).\nIn the layer-separation scenario, the first element of the array is the base image (z_index=0), and the following elements are the layers, ordered by increasing z_index.\n","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (if response_format is \"b64_json\")","type":"string"},"bounding_box":{"description":"The bounding-box information of the region that the current layer occupies within the base image. Only layers return this field; the base image covers the whole canvas and does not return bounding_box. Returned only when layer_decomposition is true.","properties":{"absolute":{"description":"The absolute pixel coordinates of the layer's bounding box, in the output base image's coordinate system with the top-left corner at (0, 0). Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"},"normalized":{"description":"The per-mille quantized (normalized) coordinates of the layer's bounding box, proportionally mapped to a discrete integer range of [0, 1000] based on the base image size, truncated at a maximum of 1000. Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"}},"type":"object"},"description":{"description":"A detailed description of the current separated element, providing richer layer characteristics (such as color, state, material) than name. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"name":{"description":"The name/label of the current separated element, automatically generated by the model from the characteristics of the separated subject. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"output_format":{"description":"The file format of the output image. Only seedream-5.0-pro supports this field.","type":"string"},"size":{"description":"The width and height of the image in pixels, in the format \u003cwidth\u003ex\u003cheight\u003e. Only seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter.","type":"string"},"url":{"description":"URL for image download (if response_format is \"url\")","format":"uri","type":"string"},"z_index":{"description":"The stacking order of the layer, increasing from bottom to top: 0 is the bottom-most layer (the base image); larger values sit higher. Use it to recompose the layers into the complete image at the correct stacking order. Returned only when layer_decomposition is true.","type":"integer"}},"type":"object"},"type":"array"},"error":{"description":"Error information (if any)","properties":{"code":{"description":"Error code","type":"string"},"message":{"description":"Error message","type":"string"}},"type":"object"},"model":{"description":"The model ID used for the request","example":"seedream-3-0-t2i-250415","type":"string"},"usage":{"properties":{"generated_images":{"description":"Number of images generated by the model","type":"integer"},"input_images":{"description":"The number of images input to the model. Only seedream-5.0-pro supports this field.","type":"integer"},"output_tokens":{"description":"The number of tokens used for the picture generated by the model.","type":"integer"},"total_tokens":{"description":"The total number of tokens consumed by this request.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedream-4-0-250828","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"byteplus/seedream-4-0-250828","description":"The request body Comfy Router accepts for the model \"byteplus/seedream-4-0-250828\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"5b2ef5b0e394"},"paths":{"/v2/models/byteplus/seedream-4-0-250828":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedream-4-0-250828 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"required":["prompt"]},{"required":["image"]}],"description":"Request body for a BytePlus Seedream / Seededit image generation. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/images/generations must add `model` to it. The example illustrates text-to-image calls; an edit call also supplies the `image` URL or base64 image to edit. Layer decomposition accepts `image` without `prompt`. At least one of `prompt` or `image` is required; BytePlus validates the model-specific combination. The v1 wrapper separately requires `model`.","example":{"prompt":"A red fox trotting through a snowy pine forest, cinematic lighting","response_format":"url","watermark":false},"properties":{"guidance_scale":{"description":"Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0.","format":"float","maximum":10,"minimum":1,"type":"number"},"image":{"description":"Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter.\n\nEnter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example).\n\n• Image URL: Make sure that the image URL is accessible.\n• Base64 encoding: The format must be data:image/\u003cimage format\u003e;base64,\u003cBase64 encoding\u003e. Note: \u003cimage format\u003e must be in lowercase, e.g., data:image/png;base64,\u003cbase64_image\u003e.\n\nComfy Router limits the entire JSON request to 10 MiB, including base64 expansion and all reference images. Use URLs for inputs that would exceed this transport limit.\n\nAn input image must meet the following requirements:\n• Image format: jpeg, png (seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 also support webp, bmp, tiff and gif; seedream-5.0-pro also supports heic and heif)\n• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0\n• Width and height (px): \u003e 14\n• Size: No more than 10 MB (30 MB for seedream-5.0-pro)\n• Total pixels: No more than 6000x6000 (36,000,000 px) for seedream-5.0-pro\n• Maximum of 14 reference images (10 for seedream-5.0-pro)\n\nIn the layer-separation scenario (layer_decomposition enabled), image is required and only a single input image is supported (passing multiple images returns an error). Input images must be png, jpeg, webp, bmp, tiff or gif (heic and heif are not supported), up to 30 MB, with total pixels in the range [512x512, 6000x6000] and aspect ratio in [1/16, 16].\n","oneOf":[{"description":"Single image (URL or Base64)","type":"string"},{"description":"Multiple images (URLs or Base64) - supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0","items":{"type":"string"},"maxItems":14,"minItems":1,"type":"array"}]},"layer_decomposition":{"default":false,"description":"Controls whether layer separation is enabled. Only seedream-5.0-pro supports this parameter.\ntrue: Layer-separation mode. The model decomposes the single input image into one base image plus multiple layers (up to 16), and returns the position and content information of each produced layer, including the stacking order (z_index), bounding box (bounding_box), name (name) and description (description).\nfalse: Standard image-generation mode; no layer separation is performed.\nNotes on layer-separation mode: only a single input image is supported (passing multiple images returns an error); if any single layer fails to generate, the whole request fails — partial success is not supported; at most 17 images are returned (1 base image + 16 layers). sequential_image_generation, sequential_image_generation_options, tools and stream return an error if passed.\n","type":"boolean"},"model":{"description":"Model identifier. Supported models: seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"optimize_prompt_options":{"description":"Configuration for prompt optimization feature. Only seedream-5.0-pro/5.0-lite/4.5 (only support standard mode) and seedream-4.0 support this parameter.\n","properties":{"mode":{"default":"standard","description":"Set the mode for the prompt optimization feature. standard = Higher quality, longer generation time. fast = Faster but at a more average quality.","enum":["standard","fast"],"type":"string"}},"type":"object"},"output_format":{"default":"jpeg","description":"Specifies the format of the output image. Only seedream-5.0-pro and 5.0-lite support this parameter. In the layer-separation scenario, output_format only controls the format of the base image; every layer is always output as png.","enum":["png","jpeg"],"type":"string"},"prompt":{"description":"Text description for image generation or transformation.\nOptional in the layer-separation scenario (seedream-5.0-pro with layer_decomposition enabled): if a prompt is provided, the model recognizes and separates the elements you specify according to the prompt intent; if no prompt is provided, the model automatically detects all major elements in the image and separates them into independent layers.\n","type":"string"},"response_format":{"default":"url","description":"Specifies the format of the generated image returned in the response","enum":["url","b64_json"],"type":"string"},"seed":{"default":-1,"description":"Random seed to control the stochasticity of image generation. Range: [-1, 2147483647]. If not specified, a seed will be automatically generated. To reproduce the same output, use the same seed value.","maximum":2147483647,"minimum":-1,"type":"integer"},"sequential_image_generation":{"description":"Controls whether to disable the batch generation feature. This parameter is only supported on seedream-5.0-lite, 4.5 and 4.0 (not supported by seedream-5.0-pro). Valid values:\nauto: In automatic mode, the model automatically determines whether to return multiple images and how many images it will contain based on the user's prompt.\ndisabled: Disables batch generation feature. The model will only generate one image.\n","enum":["auto","disabled"],"type":"string"},"sequential_image_generation_options":{"description":"Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro).\nConfiguration for the batch image generation feature. This parameter is only effective when sequential_image_generation is set to auto.\n","properties":{"max_images":{"default":15,"description":"Specifies the maximum number of images to generate in this request. Number of input reference images + Number of generated images ≤ 15.","maximum":15,"minimum":1,"type":"integer"}},"type":"object"},"size":{"description":"\"seedream-4-0-250828\": Set the specification for the generated image. Two methods are available but cannot be used together.\n Method 1 | Specify the resolution. Optional values: 1K, 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [1024x1024, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-4-5-251128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-5-0-260128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 3K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, ~3072x3072], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\": Two methods available (cannot be used together).\n Method 1 | Specify the resolution and describe the aspect ratio, shape or purpose of the image in the prompt; the model decides the final size. Optional values: 1K, 2K\n Method 2 | Specify width and height in pixels. Default: 1024x1024, total pixels: [1024x1024 (1048576), 2048x2048 (4194304)], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\" with layer_decomposition enabled: Only the resolution-level method is supported. Optional values: 1K, 1.5K, 2K, auto. Default: auto.\n The base image is output at the specified resolution with the aspect ratio of the original input image; each layer is output close to the specified resolution, keeping the aspect ratio it had in the original image.\n auto: Output is based on the size and aspect ratio of the input image. Inputs within [1280x720, ~2048x2048] are output at the original input size; inputs smaller than 1K are output at 1K; inputs larger than 2K are output at 2K.\n","type":"string"},"stream":{"default":false,"description":"Comfy Router settles an explicitly supplied stream flag to false because it captures a complete JSON result. On the v1 proxy, this field controls whether to enable streaming output mode. Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro). false = All output images are returned at once. true = Each output image is returned immediately after generated.","type":"boolean"},"watermark":{"default":true,"description":"Specifies whether to add a watermark to the generated image. false = No watermark, true = Adds watermark with 'AI generated' label","type":"boolean"}},"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusImageGenerationResponse"}],"description":"Comfy Router output schema for the BytePlus Seedream/Seededit image models: BytePlus's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `byteplus /api/v3/images/generations` as ReturnModeDirect), so the body a caller receives is this finished document from the one call.\nThe generated images are in `data`, each with either a download URL at `data[].url` or inline base64 bytes at `data[].b64_json`, depending on the request's `response_format`; select the leaf by which key is present. `usage` reports BytePlus's own generation accounting — BytePlus's numbers, not the Comfy charge.\nRouter does not re-host these images onto Comfy storage the way it re-hosts the Seedance VIDEO results: a `data[].url` here stays BytePlus's own link, which BytePlus clears 24 hours after the generation and caps at 100 downloads on some models. Download it rather than storing the URL.","example":{"created":1767225600,"data":[{"size":"1024x1024","url":"https://example.invalid/byteplus/seedream-4-0-250828/generated.png"}],"model":"seedream-4-0-250828","usage":{"generated_images":1}}}}}}}}}},"components":{"schemas":{"BytePlusImageGenerationResponse":{"properties":{"created":{"description":"Unix timestamp (in seconds) indicating the time when the request was created","type":"integer"},"data":{"description":"Contains information about the generated image(s).\nIn the layer-separation scenario, the first element of the array is the base image (z_index=0), and the following elements are the layers, ordered by increasing z_index.\n","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (if response_format is \"b64_json\")","type":"string"},"bounding_box":{"description":"The bounding-box information of the region that the current layer occupies within the base image. Only layers return this field; the base image covers the whole canvas and does not return bounding_box. Returned only when layer_decomposition is true.","properties":{"absolute":{"description":"The absolute pixel coordinates of the layer's bounding box, in the output base image's coordinate system with the top-left corner at (0, 0). Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"},"normalized":{"description":"The per-mille quantized (normalized) coordinates of the layer's bounding box, proportionally mapped to a discrete integer range of [0, 1000] based on the base image size, truncated at a maximum of 1000. Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"}},"type":"object"},"description":{"description":"A detailed description of the current separated element, providing richer layer characteristics (such as color, state, material) than name. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"name":{"description":"The name/label of the current separated element, automatically generated by the model from the characteristics of the separated subject. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"output_format":{"description":"The file format of the output image. Only seedream-5.0-pro supports this field.","type":"string"},"size":{"description":"The width and height of the image in pixels, in the format \u003cwidth\u003ex\u003cheight\u003e. Only seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter.","type":"string"},"url":{"description":"URL for image download (if response_format is \"url\")","format":"uri","type":"string"},"z_index":{"description":"The stacking order of the layer, increasing from bottom to top: 0 is the bottom-most layer (the base image); larger values sit higher. Use it to recompose the layers into the complete image at the correct stacking order. Returned only when layer_decomposition is true.","type":"integer"}},"type":"object"},"type":"array"},"error":{"description":"Error information (if any)","properties":{"code":{"description":"Error code","type":"string"},"message":{"description":"Error message","type":"string"}},"type":"object"},"model":{"description":"The model ID used for the request","example":"seedream-4-0-250828","type":"string"},"usage":{"properties":{"generated_images":{"description":"Number of images generated by the model","type":"integer"},"input_images":{"description":"The number of images input to the model. Only seedream-5.0-pro supports this field.","type":"integer"},"output_tokens":{"description":"The number of tokens used for the picture generated by the model.","type":"integer"},"total_tokens":{"description":"The total number of tokens consumed by this request.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedream-4-0-250828","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/byteplus/seedream-4-5-251128.json b/router-schemas/byteplus/seedream-4-5-251128.json index 789609b0b..05cdce443 100644 --- a/router-schemas/byteplus/seedream-4-5-251128.json +++ b/router-schemas/byteplus/seedream-4-5-251128.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"byteplus/seedream-4-5-251128","description":"The request body Comfy Router accepts for the model \"byteplus/seedream-4-5-251128\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"9253dd6e4b11"},"paths":{"/v2/models/byteplus/seedream-4-5-251128":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedream-4-5-251128 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"required":["prompt"]},{"required":["image"]}],"description":"Request body for a BytePlus Seedream / Seededit image generation. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/images/generations must add `model` to it. The example illustrates text-to-image calls. For seededit-3-0-i2i-250628, also supply the single `image` URL or base64 image to edit; omit `size` to retain that model's adaptive sizing. Layer decomposition accepts `image` without `prompt`. At least one of `prompt` or `image` is required; BytePlus validates the model-specific combination. The v1 wrapper separately requires `model`.","example":{"prompt":"A red fox trotting through a snowy pine forest, cinematic lighting","response_format":"url","watermark":false},"properties":{"guidance_scale":{"description":"Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Default 2.5 for seedream-3-0-t2i-250415 and 5.5 for seededit-3-0-i2i-250628. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0.","format":"float","maximum":10,"minimum":1,"type":"number"},"image":{"description":"Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0, and seededit-3.0-i2i support this parameter.\n\nEnter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example), while seededit-3.0-i2i only supports single-image input.\n\n• Image URL: Make sure that the image URL is accessible.\n• Base64 encoding: The format must be data:image/\u003cimage format\u003e;base64,\u003cBase64 encoding\u003e. Note: \u003cimage format\u003e must be in lowercase, e.g., data:image/png;base64,\u003cbase64_image\u003e.\n\nComfy Router limits the entire JSON request to 10 MiB, including base64 expansion and all reference images. Use URLs for inputs that would exceed this transport limit.\n\nAn input image must meet the following requirements:\n• Image format: jpeg, png (seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 also support webp, bmp, tiff and gif; seedream-5.0-pro also supports heic and heif)\n• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0; [1/3, 3] for seededit-3.0-i2i\n• Width and height (px): \u003e 14\n• Size: No more than 10 MB (30 MB for seedream-5.0-pro)\n• Total pixels: No more than 6000x6000 (36,000,000 px) for seedream-5.0-pro\n• Maximum of 14 reference images (10 for seedream-5.0-pro)\n\nIn the layer-separation scenario (layer_decomposition enabled), image is required and only a single input image is supported (passing multiple images returns an error). Input images must be png, jpeg, webp, bmp, tiff or gif (heic and heif are not supported), up to 30 MB, with total pixels in the range [512x512, 6000x6000] and aspect ratio in [1/16, 16].\n","oneOf":[{"description":"Single image (URL or Base64)","type":"string"},{"description":"Multiple images (URLs or Base64) - supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0","items":{"type":"string"},"maxItems":14,"minItems":1,"type":"array"}]},"layer_decomposition":{"default":false,"description":"Controls whether layer separation is enabled. Only seedream-5.0-pro supports this parameter.\ntrue: Layer-separation mode. The model decomposes the single input image into one base image plus multiple layers (up to 16), and returns the position and content information of each produced layer, including the stacking order (z_index), bounding box (bounding_box), name (name) and description (description).\nfalse: Standard image-generation mode; no layer separation is performed.\nNotes on layer-separation mode: only a single input image is supported (passing multiple images returns an error); if any single layer fails to generate, the whole request fails — partial success is not supported; at most 17 images are returned (1 base image + 16 layers). sequential_image_generation, sequential_image_generation_options, tools and stream return an error if passed.\n","type":"boolean"},"model":{"description":"Model identifier. Supported models: seedream-3-0-t2i-250415, seededit-3-0-i2i-250628, seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"optimize_prompt_options":{"description":"Configuration for prompt optimization feature. Only seedream-5.0-pro/5.0-lite/4.5 (only support standard mode) and seedream-4.0 support this parameter.\n","properties":{"mode":{"default":"standard","description":"Set the mode for the prompt optimization feature. standard = Higher quality, longer generation time. fast = Faster but at a more average quality.","enum":["standard","fast"],"type":"string"}},"type":"object"},"output_format":{"default":"jpeg","description":"Specifies the format of the output image. Only seedream-5.0-pro and 5.0-lite support this parameter. In the layer-separation scenario, output_format only controls the format of the base image; every layer is always output as png.","enum":["png","jpeg"],"type":"string"},"prompt":{"description":"Text description for image generation or transformation.\nOptional in the layer-separation scenario (seedream-5.0-pro with layer_decomposition enabled): if a prompt is provided, the model recognizes and separates the elements you specify according to the prompt intent; if no prompt is provided, the model automatically detects all major elements in the image and separates them into independent layers.\n","type":"string"},"response_format":{"default":"url","description":"Specifies the format of the generated image returned in the response","enum":["url","b64_json"],"type":"string"},"seed":{"default":-1,"description":"Random seed to control the stochasticity of image generation. Range: [-1, 2147483647]. If not specified, a seed will be automatically generated. To reproduce the same output, use the same seed value.","maximum":2147483647,"minimum":-1,"type":"integer"},"sequential_image_generation":{"description":"Controls whether to disable the batch generation feature. This parameter is only supported on seedream-5.0-lite, 4.5 and 4.0 (not supported by seedream-5.0-pro). Valid values:\nauto: In automatic mode, the model automatically determines whether to return multiple images and how many images it will contain based on the user's prompt.\ndisabled: Disables batch generation feature. The model will only generate one image.\n","enum":["auto","disabled"],"type":"string"},"sequential_image_generation_options":{"description":"Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro).\nConfiguration for the batch image generation feature. This parameter is only effective when sequential_image_generation is set to auto.\n","properties":{"max_images":{"default":15,"description":"Specifies the maximum number of images to generate in this request. Number of input reference images + Number of generated images ≤ 15.","maximum":15,"minimum":1,"type":"integer"}},"type":"object"},"size":{"description":"\"seedream-3-0-t2i-250415\": Specifies the dimensions (width x height in pixels) of the generated image. Must be between [512x512, 2048x2048]\n\"seededit-3-0-i2i-250628\": The width and height pixels of the generated image. Currently only supports adaptive.\n\"seedream-4-0-250828\": Set the specification for the generated image. Two methods are available but cannot be used together.\n Method 1 | Specify the resolution. Optional values: 1K, 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [1024x1024, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-4-5-251128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-5-0-260128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 3K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, ~3072x3072], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\": Two methods available (cannot be used together).\n Method 1 | Specify the resolution and describe the aspect ratio, shape or purpose of the image in the prompt; the model decides the final size. Optional values: 1K, 2K\n Method 2 | Specify width and height in pixels. Default: 1024x1024, total pixels: [1024x1024 (1048576), 2048x2048 (4194304)], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\" with layer_decomposition enabled: Only the resolution-level method is supported. Optional values: 1K, 1.5K, 2K, auto. Default: auto.\n The base image is output at the specified resolution with the aspect ratio of the original input image; each layer is output close to the specified resolution, keeping the aspect ratio it had in the original image.\n auto: Output is based on the size and aspect ratio of the input image. Inputs within [1280x720, ~2048x2048] are output at the original input size; inputs smaller than 1K are output at 1K; inputs larger than 2K are output at 2K.\n","type":"string"},"stream":{"default":false,"description":"Comfy Router settles an explicitly supplied stream flag to false because it captures a complete JSON result. On the v1 proxy, this field controls whether to enable streaming output mode. Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro). false = All output images are returned at once. true = Each output image is returned immediately after generated.","type":"boolean"},"watermark":{"default":true,"description":"Specifies whether to add a watermark to the generated image. false = No watermark, true = Adds watermark with 'AI generated' label","type":"boolean"}},"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusImageGenerationResponse"}],"description":"Comfy Router output schema for the BytePlus Seedream/Seededit image models: BytePlus's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `byteplus /api/v3/images/generations` as ReturnModeDirect), so the body a caller receives is this finished document from the one call.\nThe generated images are in `data`, each with either a download URL at `data[].url` or inline base64 bytes at `data[].b64_json`, depending on the request's `response_format`; select the leaf by which key is present. `usage` reports BytePlus's own generation accounting — BytePlus's numbers, not the Comfy charge.\nRouter does not re-host these images onto Comfy storage the way it re-hosts the Seedance VIDEO results: a `data[].url` here stays BytePlus's own link, which BytePlus clears 24 hours after the generation and caps at 100 downloads on some models. Download it rather than storing the URL.","example":{"created":1767225600,"data":[{"size":"1024x1024","url":"https://example.invalid/byteplus/seedream-3-0-t2i-250415/generated.png"}],"model":"seedream-3-0-t2i-250415","usage":{"generated_images":1}}}}}}}}}},"components":{"schemas":{"BytePlusImageGenerationResponse":{"properties":{"created":{"description":"Unix timestamp (in seconds) indicating the time when the request was created","type":"integer"},"data":{"description":"Contains information about the generated image(s).\nIn the layer-separation scenario, the first element of the array is the base image (z_index=0), and the following elements are the layers, ordered by increasing z_index.\n","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (if response_format is \"b64_json\")","type":"string"},"bounding_box":{"description":"The bounding-box information of the region that the current layer occupies within the base image. Only layers return this field; the base image covers the whole canvas and does not return bounding_box. Returned only when layer_decomposition is true.","properties":{"absolute":{"description":"The absolute pixel coordinates of the layer's bounding box, in the output base image's coordinate system with the top-left corner at (0, 0). Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"},"normalized":{"description":"The per-mille quantized (normalized) coordinates of the layer's bounding box, proportionally mapped to a discrete integer range of [0, 1000] based on the base image size, truncated at a maximum of 1000. Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"}},"type":"object"},"description":{"description":"A detailed description of the current separated element, providing richer layer characteristics (such as color, state, material) than name. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"name":{"description":"The name/label of the current separated element, automatically generated by the model from the characteristics of the separated subject. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"output_format":{"description":"The file format of the output image. Only seedream-5.0-pro supports this field.","type":"string"},"size":{"description":"The width and height of the image in pixels, in the format \u003cwidth\u003ex\u003cheight\u003e. Only seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter.","type":"string"},"url":{"description":"URL for image download (if response_format is \"url\")","format":"uri","type":"string"},"z_index":{"description":"The stacking order of the layer, increasing from bottom to top: 0 is the bottom-most layer (the base image); larger values sit higher. Use it to recompose the layers into the complete image at the correct stacking order. Returned only when layer_decomposition is true.","type":"integer"}},"type":"object"},"type":"array"},"error":{"description":"Error information (if any)","properties":{"code":{"description":"Error code","type":"string"},"message":{"description":"Error message","type":"string"}},"type":"object"},"model":{"description":"The model ID used for the request","example":"seedream-3-0-t2i-250415","type":"string"},"usage":{"properties":{"generated_images":{"description":"Number of images generated by the model","type":"integer"},"input_images":{"description":"The number of images input to the model. Only seedream-5.0-pro supports this field.","type":"integer"},"output_tokens":{"description":"The number of tokens used for the picture generated by the model.","type":"integer"},"total_tokens":{"description":"The total number of tokens consumed by this request.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedream-4-5-251128","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"byteplus/seedream-4-5-251128","description":"The request body Comfy Router accepts for the model \"byteplus/seedream-4-5-251128\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"5b2ef5b0e394"},"paths":{"/v2/models/byteplus/seedream-4-5-251128":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedream-4-5-251128 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"required":["prompt"]},{"required":["image"]}],"description":"Request body for a BytePlus Seedream / Seededit image generation. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/images/generations must add `model` to it. The example illustrates text-to-image calls; an edit call also supplies the `image` URL or base64 image to edit. Layer decomposition accepts `image` without `prompt`. At least one of `prompt` or `image` is required; BytePlus validates the model-specific combination. The v1 wrapper separately requires `model`.","example":{"prompt":"A red fox trotting through a snowy pine forest, cinematic lighting","response_format":"url","watermark":false},"properties":{"guidance_scale":{"description":"Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0.","format":"float","maximum":10,"minimum":1,"type":"number"},"image":{"description":"Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter.\n\nEnter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example).\n\n• Image URL: Make sure that the image URL is accessible.\n• Base64 encoding: The format must be data:image/\u003cimage format\u003e;base64,\u003cBase64 encoding\u003e. Note: \u003cimage format\u003e must be in lowercase, e.g., data:image/png;base64,\u003cbase64_image\u003e.\n\nComfy Router limits the entire JSON request to 10 MiB, including base64 expansion and all reference images. Use URLs for inputs that would exceed this transport limit.\n\nAn input image must meet the following requirements:\n• Image format: jpeg, png (seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 also support webp, bmp, tiff and gif; seedream-5.0-pro also supports heic and heif)\n• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0\n• Width and height (px): \u003e 14\n• Size: No more than 10 MB (30 MB for seedream-5.0-pro)\n• Total pixels: No more than 6000x6000 (36,000,000 px) for seedream-5.0-pro\n• Maximum of 14 reference images (10 for seedream-5.0-pro)\n\nIn the layer-separation scenario (layer_decomposition enabled), image is required and only a single input image is supported (passing multiple images returns an error). Input images must be png, jpeg, webp, bmp, tiff or gif (heic and heif are not supported), up to 30 MB, with total pixels in the range [512x512, 6000x6000] and aspect ratio in [1/16, 16].\n","oneOf":[{"description":"Single image (URL or Base64)","type":"string"},{"description":"Multiple images (URLs or Base64) - supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0","items":{"type":"string"},"maxItems":14,"minItems":1,"type":"array"}]},"layer_decomposition":{"default":false,"description":"Controls whether layer separation is enabled. Only seedream-5.0-pro supports this parameter.\ntrue: Layer-separation mode. The model decomposes the single input image into one base image plus multiple layers (up to 16), and returns the position and content information of each produced layer, including the stacking order (z_index), bounding box (bounding_box), name (name) and description (description).\nfalse: Standard image-generation mode; no layer separation is performed.\nNotes on layer-separation mode: only a single input image is supported (passing multiple images returns an error); if any single layer fails to generate, the whole request fails — partial success is not supported; at most 17 images are returned (1 base image + 16 layers). sequential_image_generation, sequential_image_generation_options, tools and stream return an error if passed.\n","type":"boolean"},"model":{"description":"Model identifier. Supported models: seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"optimize_prompt_options":{"description":"Configuration for prompt optimization feature. Only seedream-5.0-pro/5.0-lite/4.5 (only support standard mode) and seedream-4.0 support this parameter.\n","properties":{"mode":{"default":"standard","description":"Set the mode for the prompt optimization feature. standard = Higher quality, longer generation time. fast = Faster but at a more average quality.","enum":["standard","fast"],"type":"string"}},"type":"object"},"output_format":{"default":"jpeg","description":"Specifies the format of the output image. Only seedream-5.0-pro and 5.0-lite support this parameter. In the layer-separation scenario, output_format only controls the format of the base image; every layer is always output as png.","enum":["png","jpeg"],"type":"string"},"prompt":{"description":"Text description for image generation or transformation.\nOptional in the layer-separation scenario (seedream-5.0-pro with layer_decomposition enabled): if a prompt is provided, the model recognizes and separates the elements you specify according to the prompt intent; if no prompt is provided, the model automatically detects all major elements in the image and separates them into independent layers.\n","type":"string"},"response_format":{"default":"url","description":"Specifies the format of the generated image returned in the response","enum":["url","b64_json"],"type":"string"},"seed":{"default":-1,"description":"Random seed to control the stochasticity of image generation. Range: [-1, 2147483647]. If not specified, a seed will be automatically generated. To reproduce the same output, use the same seed value.","maximum":2147483647,"minimum":-1,"type":"integer"},"sequential_image_generation":{"description":"Controls whether to disable the batch generation feature. This parameter is only supported on seedream-5.0-lite, 4.5 and 4.0 (not supported by seedream-5.0-pro). Valid values:\nauto: In automatic mode, the model automatically determines whether to return multiple images and how many images it will contain based on the user's prompt.\ndisabled: Disables batch generation feature. The model will only generate one image.\n","enum":["auto","disabled"],"type":"string"},"sequential_image_generation_options":{"description":"Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro).\nConfiguration for the batch image generation feature. This parameter is only effective when sequential_image_generation is set to auto.\n","properties":{"max_images":{"default":15,"description":"Specifies the maximum number of images to generate in this request. Number of input reference images + Number of generated images ≤ 15.","maximum":15,"minimum":1,"type":"integer"}},"type":"object"},"size":{"description":"\"seedream-4-0-250828\": Set the specification for the generated image. Two methods are available but cannot be used together.\n Method 1 | Specify the resolution. Optional values: 1K, 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [1024x1024, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-4-5-251128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-5-0-260128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 3K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, ~3072x3072], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\": Two methods available (cannot be used together).\n Method 1 | Specify the resolution and describe the aspect ratio, shape or purpose of the image in the prompt; the model decides the final size. Optional values: 1K, 2K\n Method 2 | Specify width and height in pixels. Default: 1024x1024, total pixels: [1024x1024 (1048576), 2048x2048 (4194304)], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\" with layer_decomposition enabled: Only the resolution-level method is supported. Optional values: 1K, 1.5K, 2K, auto. Default: auto.\n The base image is output at the specified resolution with the aspect ratio of the original input image; each layer is output close to the specified resolution, keeping the aspect ratio it had in the original image.\n auto: Output is based on the size and aspect ratio of the input image. Inputs within [1280x720, ~2048x2048] are output at the original input size; inputs smaller than 1K are output at 1K; inputs larger than 2K are output at 2K.\n","type":"string"},"stream":{"default":false,"description":"Comfy Router settles an explicitly supplied stream flag to false because it captures a complete JSON result. On the v1 proxy, this field controls whether to enable streaming output mode. Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro). false = All output images are returned at once. true = Each output image is returned immediately after generated.","type":"boolean"},"watermark":{"default":true,"description":"Specifies whether to add a watermark to the generated image. false = No watermark, true = Adds watermark with 'AI generated' label","type":"boolean"}},"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusImageGenerationResponse"}],"description":"Comfy Router output schema for the BytePlus Seedream/Seededit image models: BytePlus's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `byteplus /api/v3/images/generations` as ReturnModeDirect), so the body a caller receives is this finished document from the one call.\nThe generated images are in `data`, each with either a download URL at `data[].url` or inline base64 bytes at `data[].b64_json`, depending on the request's `response_format`; select the leaf by which key is present. `usage` reports BytePlus's own generation accounting — BytePlus's numbers, not the Comfy charge.\nRouter does not re-host these images onto Comfy storage the way it re-hosts the Seedance VIDEO results: a `data[].url` here stays BytePlus's own link, which BytePlus clears 24 hours after the generation and caps at 100 downloads on some models. Download it rather than storing the URL.","example":{"created":1767225600,"data":[{"size":"1024x1024","url":"https://example.invalid/byteplus/seedream-4-0-250828/generated.png"}],"model":"seedream-4-0-250828","usage":{"generated_images":1}}}}}}}}}},"components":{"schemas":{"BytePlusImageGenerationResponse":{"properties":{"created":{"description":"Unix timestamp (in seconds) indicating the time when the request was created","type":"integer"},"data":{"description":"Contains information about the generated image(s).\nIn the layer-separation scenario, the first element of the array is the base image (z_index=0), and the following elements are the layers, ordered by increasing z_index.\n","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (if response_format is \"b64_json\")","type":"string"},"bounding_box":{"description":"The bounding-box information of the region that the current layer occupies within the base image. Only layers return this field; the base image covers the whole canvas and does not return bounding_box. Returned only when layer_decomposition is true.","properties":{"absolute":{"description":"The absolute pixel coordinates of the layer's bounding box, in the output base image's coordinate system with the top-left corner at (0, 0). Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"},"normalized":{"description":"The per-mille quantized (normalized) coordinates of the layer's bounding box, proportionally mapped to a discrete integer range of [0, 1000] based on the base image size, truncated at a maximum of 1000. Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"}},"type":"object"},"description":{"description":"A detailed description of the current separated element, providing richer layer characteristics (such as color, state, material) than name. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"name":{"description":"The name/label of the current separated element, automatically generated by the model from the characteristics of the separated subject. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"output_format":{"description":"The file format of the output image. Only seedream-5.0-pro supports this field.","type":"string"},"size":{"description":"The width and height of the image in pixels, in the format \u003cwidth\u003ex\u003cheight\u003e. Only seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter.","type":"string"},"url":{"description":"URL for image download (if response_format is \"url\")","format":"uri","type":"string"},"z_index":{"description":"The stacking order of the layer, increasing from bottom to top: 0 is the bottom-most layer (the base image); larger values sit higher. Use it to recompose the layers into the complete image at the correct stacking order. Returned only when layer_decomposition is true.","type":"integer"}},"type":"object"},"type":"array"},"error":{"description":"Error information (if any)","properties":{"code":{"description":"Error code","type":"string"},"message":{"description":"Error message","type":"string"}},"type":"object"},"model":{"description":"The model ID used for the request","example":"seedream-4-0-250828","type":"string"},"usage":{"properties":{"generated_images":{"description":"Number of images generated by the model","type":"integer"},"input_images":{"description":"The number of images input to the model. Only seedream-5.0-pro supports this field.","type":"integer"},"output_tokens":{"description":"The number of tokens used for the picture generated by the model.","type":"integer"},"total_tokens":{"description":"The total number of tokens consumed by this request.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedream-4-5-251128","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/byteplus/seedream-5-0-260128.json b/router-schemas/byteplus/seedream-5-0-260128.json index d60619cd1..93f3fc358 100644 --- a/router-schemas/byteplus/seedream-5-0-260128.json +++ b/router-schemas/byteplus/seedream-5-0-260128.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"byteplus/seedream-5-0-260128","description":"The request body Comfy Router accepts for the model \"byteplus/seedream-5-0-260128\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"9253dd6e4b11"},"paths":{"/v2/models/byteplus/seedream-5-0-260128":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedream-5-0-260128 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"required":["prompt"]},{"required":["image"]}],"description":"Request body for a BytePlus Seedream / Seededit image generation. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/images/generations must add `model` to it. The example illustrates text-to-image calls. For seededit-3-0-i2i-250628, also supply the single `image` URL or base64 image to edit; omit `size` to retain that model's adaptive sizing. Layer decomposition accepts `image` without `prompt`. At least one of `prompt` or `image` is required; BytePlus validates the model-specific combination. The v1 wrapper separately requires `model`.","example":{"prompt":"A red fox trotting through a snowy pine forest, cinematic lighting","response_format":"url","watermark":false},"properties":{"guidance_scale":{"description":"Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Default 2.5 for seedream-3-0-t2i-250415 and 5.5 for seededit-3-0-i2i-250628. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0.","format":"float","maximum":10,"minimum":1,"type":"number"},"image":{"description":"Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0, and seededit-3.0-i2i support this parameter.\n\nEnter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example), while seededit-3.0-i2i only supports single-image input.\n\n• Image URL: Make sure that the image URL is accessible.\n• Base64 encoding: The format must be data:image/\u003cimage format\u003e;base64,\u003cBase64 encoding\u003e. Note: \u003cimage format\u003e must be in lowercase, e.g., data:image/png;base64,\u003cbase64_image\u003e.\n\nComfy Router limits the entire JSON request to 10 MiB, including base64 expansion and all reference images. Use URLs for inputs that would exceed this transport limit.\n\nAn input image must meet the following requirements:\n• Image format: jpeg, png (seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 also support webp, bmp, tiff and gif; seedream-5.0-pro also supports heic and heif)\n• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0; [1/3, 3] for seededit-3.0-i2i\n• Width and height (px): \u003e 14\n• Size: No more than 10 MB (30 MB for seedream-5.0-pro)\n• Total pixels: No more than 6000x6000 (36,000,000 px) for seedream-5.0-pro\n• Maximum of 14 reference images (10 for seedream-5.0-pro)\n\nIn the layer-separation scenario (layer_decomposition enabled), image is required and only a single input image is supported (passing multiple images returns an error). Input images must be png, jpeg, webp, bmp, tiff or gif (heic and heif are not supported), up to 30 MB, with total pixels in the range [512x512, 6000x6000] and aspect ratio in [1/16, 16].\n","oneOf":[{"description":"Single image (URL or Base64)","type":"string"},{"description":"Multiple images (URLs or Base64) - supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0","items":{"type":"string"},"maxItems":14,"minItems":1,"type":"array"}]},"layer_decomposition":{"default":false,"description":"Controls whether layer separation is enabled. Only seedream-5.0-pro supports this parameter.\ntrue: Layer-separation mode. The model decomposes the single input image into one base image plus multiple layers (up to 16), and returns the position and content information of each produced layer, including the stacking order (z_index), bounding box (bounding_box), name (name) and description (description).\nfalse: Standard image-generation mode; no layer separation is performed.\nNotes on layer-separation mode: only a single input image is supported (passing multiple images returns an error); if any single layer fails to generate, the whole request fails — partial success is not supported; at most 17 images are returned (1 base image + 16 layers). sequential_image_generation, sequential_image_generation_options, tools and stream return an error if passed.\n","type":"boolean"},"model":{"description":"Model identifier. Supported models: seedream-3-0-t2i-250415, seededit-3-0-i2i-250628, seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"optimize_prompt_options":{"description":"Configuration for prompt optimization feature. Only seedream-5.0-pro/5.0-lite/4.5 (only support standard mode) and seedream-4.0 support this parameter.\n","properties":{"mode":{"default":"standard","description":"Set the mode for the prompt optimization feature. standard = Higher quality, longer generation time. fast = Faster but at a more average quality.","enum":["standard","fast"],"type":"string"}},"type":"object"},"output_format":{"default":"jpeg","description":"Specifies the format of the output image. Only seedream-5.0-pro and 5.0-lite support this parameter. In the layer-separation scenario, output_format only controls the format of the base image; every layer is always output as png.","enum":["png","jpeg"],"type":"string"},"prompt":{"description":"Text description for image generation or transformation.\nOptional in the layer-separation scenario (seedream-5.0-pro with layer_decomposition enabled): if a prompt is provided, the model recognizes and separates the elements you specify according to the prompt intent; if no prompt is provided, the model automatically detects all major elements in the image and separates them into independent layers.\n","type":"string"},"response_format":{"default":"url","description":"Specifies the format of the generated image returned in the response","enum":["url","b64_json"],"type":"string"},"seed":{"default":-1,"description":"Random seed to control the stochasticity of image generation. Range: [-1, 2147483647]. If not specified, a seed will be automatically generated. To reproduce the same output, use the same seed value.","maximum":2147483647,"minimum":-1,"type":"integer"},"sequential_image_generation":{"description":"Controls whether to disable the batch generation feature. This parameter is only supported on seedream-5.0-lite, 4.5 and 4.0 (not supported by seedream-5.0-pro). Valid values:\nauto: In automatic mode, the model automatically determines whether to return multiple images and how many images it will contain based on the user's prompt.\ndisabled: Disables batch generation feature. The model will only generate one image.\n","enum":["auto","disabled"],"type":"string"},"sequential_image_generation_options":{"description":"Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro).\nConfiguration for the batch image generation feature. This parameter is only effective when sequential_image_generation is set to auto.\n","properties":{"max_images":{"default":15,"description":"Specifies the maximum number of images to generate in this request. Number of input reference images + Number of generated images ≤ 15.","maximum":15,"minimum":1,"type":"integer"}},"type":"object"},"size":{"description":"\"seedream-3-0-t2i-250415\": Specifies the dimensions (width x height in pixels) of the generated image. Must be between [512x512, 2048x2048]\n\"seededit-3-0-i2i-250628\": The width and height pixels of the generated image. Currently only supports adaptive.\n\"seedream-4-0-250828\": Set the specification for the generated image. Two methods are available but cannot be used together.\n Method 1 | Specify the resolution. Optional values: 1K, 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [1024x1024, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-4-5-251128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-5-0-260128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 3K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, ~3072x3072], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\": Two methods available (cannot be used together).\n Method 1 | Specify the resolution and describe the aspect ratio, shape or purpose of the image in the prompt; the model decides the final size. Optional values: 1K, 2K\n Method 2 | Specify width and height in pixels. Default: 1024x1024, total pixels: [1024x1024 (1048576), 2048x2048 (4194304)], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\" with layer_decomposition enabled: Only the resolution-level method is supported. Optional values: 1K, 1.5K, 2K, auto. Default: auto.\n The base image is output at the specified resolution with the aspect ratio of the original input image; each layer is output close to the specified resolution, keeping the aspect ratio it had in the original image.\n auto: Output is based on the size and aspect ratio of the input image. Inputs within [1280x720, ~2048x2048] are output at the original input size; inputs smaller than 1K are output at 1K; inputs larger than 2K are output at 2K.\n","type":"string"},"stream":{"default":false,"description":"Comfy Router settles an explicitly supplied stream flag to false because it captures a complete JSON result. On the v1 proxy, this field controls whether to enable streaming output mode. Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro). false = All output images are returned at once. true = Each output image is returned immediately after generated.","type":"boolean"},"watermark":{"default":true,"description":"Specifies whether to add a watermark to the generated image. false = No watermark, true = Adds watermark with 'AI generated' label","type":"boolean"}},"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusImageGenerationResponse"}],"description":"Comfy Router output schema for the BytePlus Seedream/Seededit image models: BytePlus's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `byteplus /api/v3/images/generations` as ReturnModeDirect), so the body a caller receives is this finished document from the one call.\nThe generated images are in `data`, each with either a download URL at `data[].url` or inline base64 bytes at `data[].b64_json`, depending on the request's `response_format`; select the leaf by which key is present. `usage` reports BytePlus's own generation accounting — BytePlus's numbers, not the Comfy charge.\nRouter does not re-host these images onto Comfy storage the way it re-hosts the Seedance VIDEO results: a `data[].url` here stays BytePlus's own link, which BytePlus clears 24 hours after the generation and caps at 100 downloads on some models. Download it rather than storing the URL.","example":{"created":1767225600,"data":[{"size":"1024x1024","url":"https://example.invalid/byteplus/seedream-3-0-t2i-250415/generated.png"}],"model":"seedream-3-0-t2i-250415","usage":{"generated_images":1}}}}}}}}}},"components":{"schemas":{"BytePlusImageGenerationResponse":{"properties":{"created":{"description":"Unix timestamp (in seconds) indicating the time when the request was created","type":"integer"},"data":{"description":"Contains information about the generated image(s).\nIn the layer-separation scenario, the first element of the array is the base image (z_index=0), and the following elements are the layers, ordered by increasing z_index.\n","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (if response_format is \"b64_json\")","type":"string"},"bounding_box":{"description":"The bounding-box information of the region that the current layer occupies within the base image. Only layers return this field; the base image covers the whole canvas and does not return bounding_box. Returned only when layer_decomposition is true.","properties":{"absolute":{"description":"The absolute pixel coordinates of the layer's bounding box, in the output base image's coordinate system with the top-left corner at (0, 0). Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"},"normalized":{"description":"The per-mille quantized (normalized) coordinates of the layer's bounding box, proportionally mapped to a discrete integer range of [0, 1000] based on the base image size, truncated at a maximum of 1000. Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"}},"type":"object"},"description":{"description":"A detailed description of the current separated element, providing richer layer characteristics (such as color, state, material) than name. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"name":{"description":"The name/label of the current separated element, automatically generated by the model from the characteristics of the separated subject. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"output_format":{"description":"The file format of the output image. Only seedream-5.0-pro supports this field.","type":"string"},"size":{"description":"The width and height of the image in pixels, in the format \u003cwidth\u003ex\u003cheight\u003e. Only seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter.","type":"string"},"url":{"description":"URL for image download (if response_format is \"url\")","format":"uri","type":"string"},"z_index":{"description":"The stacking order of the layer, increasing from bottom to top: 0 is the bottom-most layer (the base image); larger values sit higher. Use it to recompose the layers into the complete image at the correct stacking order. Returned only when layer_decomposition is true.","type":"integer"}},"type":"object"},"type":"array"},"error":{"description":"Error information (if any)","properties":{"code":{"description":"Error code","type":"string"},"message":{"description":"Error message","type":"string"}},"type":"object"},"model":{"description":"The model ID used for the request","example":"seedream-3-0-t2i-250415","type":"string"},"usage":{"properties":{"generated_images":{"description":"Number of images generated by the model","type":"integer"},"input_images":{"description":"The number of images input to the model. Only seedream-5.0-pro supports this field.","type":"integer"},"output_tokens":{"description":"The number of tokens used for the picture generated by the model.","type":"integer"},"total_tokens":{"description":"The total number of tokens consumed by this request.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedream-5-0-260128","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"byteplus/seedream-5-0-260128","description":"The request body Comfy Router accepts for the model \"byteplus/seedream-5-0-260128\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"5b2ef5b0e394"},"paths":{"/v2/models/byteplus/seedream-5-0-260128":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedream-5-0-260128 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"required":["prompt"]},{"required":["image"]}],"description":"Request body for a BytePlus Seedream / Seededit image generation. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/images/generations must add `model` to it. The example illustrates text-to-image calls; an edit call also supplies the `image` URL or base64 image to edit. Layer decomposition accepts `image` without `prompt`. At least one of `prompt` or `image` is required; BytePlus validates the model-specific combination. The v1 wrapper separately requires `model`.","example":{"prompt":"A red fox trotting through a snowy pine forest, cinematic lighting","response_format":"url","watermark":false},"properties":{"guidance_scale":{"description":"Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0.","format":"float","maximum":10,"minimum":1,"type":"number"},"image":{"description":"Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter.\n\nEnter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example).\n\n• Image URL: Make sure that the image URL is accessible.\n• Base64 encoding: The format must be data:image/\u003cimage format\u003e;base64,\u003cBase64 encoding\u003e. Note: \u003cimage format\u003e must be in lowercase, e.g., data:image/png;base64,\u003cbase64_image\u003e.\n\nComfy Router limits the entire JSON request to 10 MiB, including base64 expansion and all reference images. Use URLs for inputs that would exceed this transport limit.\n\nAn input image must meet the following requirements:\n• Image format: jpeg, png (seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 also support webp, bmp, tiff and gif; seedream-5.0-pro also supports heic and heif)\n• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0\n• Width and height (px): \u003e 14\n• Size: No more than 10 MB (30 MB for seedream-5.0-pro)\n• Total pixels: No more than 6000x6000 (36,000,000 px) for seedream-5.0-pro\n• Maximum of 14 reference images (10 for seedream-5.0-pro)\n\nIn the layer-separation scenario (layer_decomposition enabled), image is required and only a single input image is supported (passing multiple images returns an error). Input images must be png, jpeg, webp, bmp, tiff or gif (heic and heif are not supported), up to 30 MB, with total pixels in the range [512x512, 6000x6000] and aspect ratio in [1/16, 16].\n","oneOf":[{"description":"Single image (URL or Base64)","type":"string"},{"description":"Multiple images (URLs or Base64) - supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0","items":{"type":"string"},"maxItems":14,"minItems":1,"type":"array"}]},"layer_decomposition":{"default":false,"description":"Controls whether layer separation is enabled. Only seedream-5.0-pro supports this parameter.\ntrue: Layer-separation mode. The model decomposes the single input image into one base image plus multiple layers (up to 16), and returns the position and content information of each produced layer, including the stacking order (z_index), bounding box (bounding_box), name (name) and description (description).\nfalse: Standard image-generation mode; no layer separation is performed.\nNotes on layer-separation mode: only a single input image is supported (passing multiple images returns an error); if any single layer fails to generate, the whole request fails — partial success is not supported; at most 17 images are returned (1 base image + 16 layers). sequential_image_generation, sequential_image_generation_options, tools and stream return an error if passed.\n","type":"boolean"},"model":{"description":"Model identifier. Supported models: seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"optimize_prompt_options":{"description":"Configuration for prompt optimization feature. Only seedream-5.0-pro/5.0-lite/4.5 (only support standard mode) and seedream-4.0 support this parameter.\n","properties":{"mode":{"default":"standard","description":"Set the mode for the prompt optimization feature. standard = Higher quality, longer generation time. fast = Faster but at a more average quality.","enum":["standard","fast"],"type":"string"}},"type":"object"},"output_format":{"default":"jpeg","description":"Specifies the format of the output image. Only seedream-5.0-pro and 5.0-lite support this parameter. In the layer-separation scenario, output_format only controls the format of the base image; every layer is always output as png.","enum":["png","jpeg"],"type":"string"},"prompt":{"description":"Text description for image generation or transformation.\nOptional in the layer-separation scenario (seedream-5.0-pro with layer_decomposition enabled): if a prompt is provided, the model recognizes and separates the elements you specify according to the prompt intent; if no prompt is provided, the model automatically detects all major elements in the image and separates them into independent layers.\n","type":"string"},"response_format":{"default":"url","description":"Specifies the format of the generated image returned in the response","enum":["url","b64_json"],"type":"string"},"seed":{"default":-1,"description":"Random seed to control the stochasticity of image generation. Range: [-1, 2147483647]. If not specified, a seed will be automatically generated. To reproduce the same output, use the same seed value.","maximum":2147483647,"minimum":-1,"type":"integer"},"sequential_image_generation":{"description":"Controls whether to disable the batch generation feature. This parameter is only supported on seedream-5.0-lite, 4.5 and 4.0 (not supported by seedream-5.0-pro). Valid values:\nauto: In automatic mode, the model automatically determines whether to return multiple images and how many images it will contain based on the user's prompt.\ndisabled: Disables batch generation feature. The model will only generate one image.\n","enum":["auto","disabled"],"type":"string"},"sequential_image_generation_options":{"description":"Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro).\nConfiguration for the batch image generation feature. This parameter is only effective when sequential_image_generation is set to auto.\n","properties":{"max_images":{"default":15,"description":"Specifies the maximum number of images to generate in this request. Number of input reference images + Number of generated images ≤ 15.","maximum":15,"minimum":1,"type":"integer"}},"type":"object"},"size":{"description":"\"seedream-4-0-250828\": Set the specification for the generated image. Two methods are available but cannot be used together.\n Method 1 | Specify the resolution. Optional values: 1K, 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [1024x1024, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-4-5-251128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-5-0-260128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 3K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, ~3072x3072], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\": Two methods available (cannot be used together).\n Method 1 | Specify the resolution and describe the aspect ratio, shape or purpose of the image in the prompt; the model decides the final size. Optional values: 1K, 2K\n Method 2 | Specify width and height in pixels. Default: 1024x1024, total pixels: [1024x1024 (1048576), 2048x2048 (4194304)], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\" with layer_decomposition enabled: Only the resolution-level method is supported. Optional values: 1K, 1.5K, 2K, auto. Default: auto.\n The base image is output at the specified resolution with the aspect ratio of the original input image; each layer is output close to the specified resolution, keeping the aspect ratio it had in the original image.\n auto: Output is based on the size and aspect ratio of the input image. Inputs within [1280x720, ~2048x2048] are output at the original input size; inputs smaller than 1K are output at 1K; inputs larger than 2K are output at 2K.\n","type":"string"},"stream":{"default":false,"description":"Comfy Router settles an explicitly supplied stream flag to false because it captures a complete JSON result. On the v1 proxy, this field controls whether to enable streaming output mode. Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro). false = All output images are returned at once. true = Each output image is returned immediately after generated.","type":"boolean"},"watermark":{"default":true,"description":"Specifies whether to add a watermark to the generated image. false = No watermark, true = Adds watermark with 'AI generated' label","type":"boolean"}},"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusImageGenerationResponse"}],"description":"Comfy Router output schema for the BytePlus Seedream/Seededit image models: BytePlus's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `byteplus /api/v3/images/generations` as ReturnModeDirect), so the body a caller receives is this finished document from the one call.\nThe generated images are in `data`, each with either a download URL at `data[].url` or inline base64 bytes at `data[].b64_json`, depending on the request's `response_format`; select the leaf by which key is present. `usage` reports BytePlus's own generation accounting — BytePlus's numbers, not the Comfy charge.\nRouter does not re-host these images onto Comfy storage the way it re-hosts the Seedance VIDEO results: a `data[].url` here stays BytePlus's own link, which BytePlus clears 24 hours after the generation and caps at 100 downloads on some models. Download it rather than storing the URL.","example":{"created":1767225600,"data":[{"size":"1024x1024","url":"https://example.invalid/byteplus/seedream-4-0-250828/generated.png"}],"model":"seedream-4-0-250828","usage":{"generated_images":1}}}}}}}}}},"components":{"schemas":{"BytePlusImageGenerationResponse":{"properties":{"created":{"description":"Unix timestamp (in seconds) indicating the time when the request was created","type":"integer"},"data":{"description":"Contains information about the generated image(s).\nIn the layer-separation scenario, the first element of the array is the base image (z_index=0), and the following elements are the layers, ordered by increasing z_index.\n","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (if response_format is \"b64_json\")","type":"string"},"bounding_box":{"description":"The bounding-box information of the region that the current layer occupies within the base image. Only layers return this field; the base image covers the whole canvas and does not return bounding_box. Returned only when layer_decomposition is true.","properties":{"absolute":{"description":"The absolute pixel coordinates of the layer's bounding box, in the output base image's coordinate system with the top-left corner at (0, 0). Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"},"normalized":{"description":"The per-mille quantized (normalized) coordinates of the layer's bounding box, proportionally mapped to a discrete integer range of [0, 1000] based on the base image size, truncated at a maximum of 1000. Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"}},"type":"object"},"description":{"description":"A detailed description of the current separated element, providing richer layer characteristics (such as color, state, material) than name. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"name":{"description":"The name/label of the current separated element, automatically generated by the model from the characteristics of the separated subject. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"output_format":{"description":"The file format of the output image. Only seedream-5.0-pro supports this field.","type":"string"},"size":{"description":"The width and height of the image in pixels, in the format \u003cwidth\u003ex\u003cheight\u003e. Only seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter.","type":"string"},"url":{"description":"URL for image download (if response_format is \"url\")","format":"uri","type":"string"},"z_index":{"description":"The stacking order of the layer, increasing from bottom to top: 0 is the bottom-most layer (the base image); larger values sit higher. Use it to recompose the layers into the complete image at the correct stacking order. Returned only when layer_decomposition is true.","type":"integer"}},"type":"object"},"type":"array"},"error":{"description":"Error information (if any)","properties":{"code":{"description":"Error code","type":"string"},"message":{"description":"Error message","type":"string"}},"type":"object"},"model":{"description":"The model ID used for the request","example":"seedream-4-0-250828","type":"string"},"usage":{"properties":{"generated_images":{"description":"Number of images generated by the model","type":"integer"},"input_images":{"description":"The number of images input to the model. Only seedream-5.0-pro supports this field.","type":"integer"},"output_tokens":{"description":"The number of tokens used for the picture generated by the model.","type":"integer"},"total_tokens":{"description":"The total number of tokens consumed by this request.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedream-5-0-260128","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/byteplus/seedream-5-0-pro-260628.json b/router-schemas/byteplus/seedream-5-0-pro-260628.json index bc1445746..1e52140c9 100644 --- a/router-schemas/byteplus/seedream-5-0-pro-260628.json +++ b/router-schemas/byteplus/seedream-5-0-pro-260628.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"byteplus/seedream-5-0-pro-260628","description":"The request body Comfy Router accepts for the model \"byteplus/seedream-5-0-pro-260628\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"9253dd6e4b11"},"paths":{"/v2/models/byteplus/seedream-5-0-pro-260628":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedream-5-0-pro-260628 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"required":["prompt"]},{"required":["image"]}],"description":"Request body for a BytePlus Seedream / Seededit image generation. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/images/generations must add `model` to it. The example illustrates text-to-image calls. For seededit-3-0-i2i-250628, also supply the single `image` URL or base64 image to edit; omit `size` to retain that model's adaptive sizing. Layer decomposition accepts `image` without `prompt`. At least one of `prompt` or `image` is required; BytePlus validates the model-specific combination. The v1 wrapper separately requires `model`.","example":{"prompt":"A red fox trotting through a snowy pine forest, cinematic lighting","response_format":"url","watermark":false},"properties":{"guidance_scale":{"description":"Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Default 2.5 for seedream-3-0-t2i-250415 and 5.5 for seededit-3-0-i2i-250628. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0.","format":"float","maximum":10,"minimum":1,"type":"number"},"image":{"description":"Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0, and seededit-3.0-i2i support this parameter.\n\nEnter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example), while seededit-3.0-i2i only supports single-image input.\n\n• Image URL: Make sure that the image URL is accessible.\n• Base64 encoding: The format must be data:image/\u003cimage format\u003e;base64,\u003cBase64 encoding\u003e. Note: \u003cimage format\u003e must be in lowercase, e.g., data:image/png;base64,\u003cbase64_image\u003e.\n\nComfy Router limits the entire JSON request to 10 MiB, including base64 expansion and all reference images. Use URLs for inputs that would exceed this transport limit.\n\nAn input image must meet the following requirements:\n• Image format: jpeg, png (seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 also support webp, bmp, tiff and gif; seedream-5.0-pro also supports heic and heif)\n• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0; [1/3, 3] for seededit-3.0-i2i\n• Width and height (px): \u003e 14\n• Size: No more than 10 MB (30 MB for seedream-5.0-pro)\n• Total pixels: No more than 6000x6000 (36,000,000 px) for seedream-5.0-pro\n• Maximum of 14 reference images (10 for seedream-5.0-pro)\n\nIn the layer-separation scenario (layer_decomposition enabled), image is required and only a single input image is supported (passing multiple images returns an error). Input images must be png, jpeg, webp, bmp, tiff or gif (heic and heif are not supported), up to 30 MB, with total pixels in the range [512x512, 6000x6000] and aspect ratio in [1/16, 16].\n","oneOf":[{"description":"Single image (URL or Base64)","type":"string"},{"description":"Multiple images (URLs or Base64) - supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0","items":{"type":"string"},"maxItems":14,"minItems":1,"type":"array"}]},"layer_decomposition":{"default":false,"description":"Controls whether layer separation is enabled. Only seedream-5.0-pro supports this parameter.\ntrue: Layer-separation mode. The model decomposes the single input image into one base image plus multiple layers (up to 16), and returns the position and content information of each produced layer, including the stacking order (z_index), bounding box (bounding_box), name (name) and description (description).\nfalse: Standard image-generation mode; no layer separation is performed.\nNotes on layer-separation mode: only a single input image is supported (passing multiple images returns an error); if any single layer fails to generate, the whole request fails — partial success is not supported; at most 17 images are returned (1 base image + 16 layers). sequential_image_generation, sequential_image_generation_options, tools and stream return an error if passed.\n","type":"boolean"},"model":{"description":"Model identifier. Supported models: seedream-3-0-t2i-250415, seededit-3-0-i2i-250628, seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"optimize_prompt_options":{"description":"Configuration for prompt optimization feature. Only seedream-5.0-pro/5.0-lite/4.5 (only support standard mode) and seedream-4.0 support this parameter.\n","properties":{"mode":{"default":"standard","description":"Set the mode for the prompt optimization feature. standard = Higher quality, longer generation time. fast = Faster but at a more average quality.","enum":["standard","fast"],"type":"string"}},"type":"object"},"output_format":{"default":"jpeg","description":"Specifies the format of the output image. Only seedream-5.0-pro and 5.0-lite support this parameter. In the layer-separation scenario, output_format only controls the format of the base image; every layer is always output as png.","enum":["png","jpeg"],"type":"string"},"prompt":{"description":"Text description for image generation or transformation.\nOptional in the layer-separation scenario (seedream-5.0-pro with layer_decomposition enabled): if a prompt is provided, the model recognizes and separates the elements you specify according to the prompt intent; if no prompt is provided, the model automatically detects all major elements in the image and separates them into independent layers.\n","type":"string"},"response_format":{"default":"url","description":"Specifies the format of the generated image returned in the response","enum":["url","b64_json"],"type":"string"},"seed":{"default":-1,"description":"Random seed to control the stochasticity of image generation. Range: [-1, 2147483647]. If not specified, a seed will be automatically generated. To reproduce the same output, use the same seed value.","maximum":2147483647,"minimum":-1,"type":"integer"},"sequential_image_generation":{"description":"Controls whether to disable the batch generation feature. This parameter is only supported on seedream-5.0-lite, 4.5 and 4.0 (not supported by seedream-5.0-pro). Valid values:\nauto: In automatic mode, the model automatically determines whether to return multiple images and how many images it will contain based on the user's prompt.\ndisabled: Disables batch generation feature. The model will only generate one image.\n","enum":["auto","disabled"],"type":"string"},"sequential_image_generation_options":{"description":"Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro).\nConfiguration for the batch image generation feature. This parameter is only effective when sequential_image_generation is set to auto.\n","properties":{"max_images":{"default":15,"description":"Specifies the maximum number of images to generate in this request. Number of input reference images + Number of generated images ≤ 15.","maximum":15,"minimum":1,"type":"integer"}},"type":"object"},"size":{"description":"\"seedream-3-0-t2i-250415\": Specifies the dimensions (width x height in pixels) of the generated image. Must be between [512x512, 2048x2048]\n\"seededit-3-0-i2i-250628\": The width and height pixels of the generated image. Currently only supports adaptive.\n\"seedream-4-0-250828\": Set the specification for the generated image. Two methods are available but cannot be used together.\n Method 1 | Specify the resolution. Optional values: 1K, 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [1024x1024, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-4-5-251128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-5-0-260128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 3K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, ~3072x3072], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\": Two methods available (cannot be used together).\n Method 1 | Specify the resolution and describe the aspect ratio, shape or purpose of the image in the prompt; the model decides the final size. Optional values: 1K, 2K\n Method 2 | Specify width and height in pixels. Default: 1024x1024, total pixels: [1024x1024 (1048576), 2048x2048 (4194304)], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\" with layer_decomposition enabled: Only the resolution-level method is supported. Optional values: 1K, 1.5K, 2K, auto. Default: auto.\n The base image is output at the specified resolution with the aspect ratio of the original input image; each layer is output close to the specified resolution, keeping the aspect ratio it had in the original image.\n auto: Output is based on the size and aspect ratio of the input image. Inputs within [1280x720, ~2048x2048] are output at the original input size; inputs smaller than 1K are output at 1K; inputs larger than 2K are output at 2K.\n","type":"string"},"stream":{"default":false,"description":"Comfy Router settles an explicitly supplied stream flag to false because it captures a complete JSON result. On the v1 proxy, this field controls whether to enable streaming output mode. Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro). false = All output images are returned at once. true = Each output image is returned immediately after generated.","type":"boolean"},"watermark":{"default":true,"description":"Specifies whether to add a watermark to the generated image. false = No watermark, true = Adds watermark with 'AI generated' label","type":"boolean"}},"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusImageGenerationResponse"}],"description":"Comfy Router output schema for the BytePlus Seedream/Seededit image models: BytePlus's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `byteplus /api/v3/images/generations` as ReturnModeDirect), so the body a caller receives is this finished document from the one call.\nThe generated images are in `data`, each with either a download URL at `data[].url` or inline base64 bytes at `data[].b64_json`, depending on the request's `response_format`; select the leaf by which key is present. `usage` reports BytePlus's own generation accounting — BytePlus's numbers, not the Comfy charge.\nRouter does not re-host these images onto Comfy storage the way it re-hosts the Seedance VIDEO results: a `data[].url` here stays BytePlus's own link, which BytePlus clears 24 hours after the generation and caps at 100 downloads on some models. Download it rather than storing the URL.","example":{"created":1767225600,"data":[{"size":"1024x1024","url":"https://example.invalid/byteplus/seedream-3-0-t2i-250415/generated.png"}],"model":"seedream-3-0-t2i-250415","usage":{"generated_images":1}}}}}}}}}},"components":{"schemas":{"BytePlusImageGenerationResponse":{"properties":{"created":{"description":"Unix timestamp (in seconds) indicating the time when the request was created","type":"integer"},"data":{"description":"Contains information about the generated image(s).\nIn the layer-separation scenario, the first element of the array is the base image (z_index=0), and the following elements are the layers, ordered by increasing z_index.\n","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (if response_format is \"b64_json\")","type":"string"},"bounding_box":{"description":"The bounding-box information of the region that the current layer occupies within the base image. Only layers return this field; the base image covers the whole canvas and does not return bounding_box. Returned only when layer_decomposition is true.","properties":{"absolute":{"description":"The absolute pixel coordinates of the layer's bounding box, in the output base image's coordinate system with the top-left corner at (0, 0). Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"},"normalized":{"description":"The per-mille quantized (normalized) coordinates of the layer's bounding box, proportionally mapped to a discrete integer range of [0, 1000] based on the base image size, truncated at a maximum of 1000. Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"}},"type":"object"},"description":{"description":"A detailed description of the current separated element, providing richer layer characteristics (such as color, state, material) than name. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"name":{"description":"The name/label of the current separated element, automatically generated by the model from the characteristics of the separated subject. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"output_format":{"description":"The file format of the output image. Only seedream-5.0-pro supports this field.","type":"string"},"size":{"description":"The width and height of the image in pixels, in the format \u003cwidth\u003ex\u003cheight\u003e. Only seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter.","type":"string"},"url":{"description":"URL for image download (if response_format is \"url\")","format":"uri","type":"string"},"z_index":{"description":"The stacking order of the layer, increasing from bottom to top: 0 is the bottom-most layer (the base image); larger values sit higher. Use it to recompose the layers into the complete image at the correct stacking order. Returned only when layer_decomposition is true.","type":"integer"}},"type":"object"},"type":"array"},"error":{"description":"Error information (if any)","properties":{"code":{"description":"Error code","type":"string"},"message":{"description":"Error message","type":"string"}},"type":"object"},"model":{"description":"The model ID used for the request","example":"seedream-3-0-t2i-250415","type":"string"},"usage":{"properties":{"generated_images":{"description":"Number of images generated by the model","type":"integer"},"input_images":{"description":"The number of images input to the model. Only seedream-5.0-pro supports this field.","type":"integer"},"output_tokens":{"description":"The number of tokens used for the picture generated by the model.","type":"integer"},"total_tokens":{"description":"The total number of tokens consumed by this request.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedream-5-0-pro-260628","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"byteplus/seedream-5-0-pro-260628","description":"The request body Comfy Router accepts for the model \"byteplus/seedream-5-0-pro-260628\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"5b2ef5b0e394"},"paths":{"/v2/models/byteplus/seedream-5-0-pro-260628":{"post":{"operationId":"runRouterModel","summary":"Run byteplus/seedream-5-0-pro-260628 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"required":["prompt"]},{"required":["image"]}],"description":"Request body for a BytePlus Seedream / Seededit image generation. The `example` below is the COMFY ROUTER form and deliberately omits `model`, which Router fills from the `{model}` path segment; a direct v1 call to POST /proxy/byteplus/api/v3/images/generations must add `model` to it. The example illustrates text-to-image calls; an edit call also supplies the `image` URL or base64 image to edit. Layer decomposition accepts `image` without `prompt`. At least one of `prompt` or `image` is required; BytePlus validates the model-specific combination. The v1 wrapper separately requires `model`.","example":{"prompt":"A red fox trotting through a snowy pine forest, cinematic lighting","response_format":"url","watermark":false},"properties":{"guidance_scale":{"description":"Controls how closely the output image aligns with the input prompt. Range [1, 10]. Higher values result in stronger prompt adherence. Not supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0.","format":"float","maximum":10,"minimum":1,"type":"number"},"image":{"description":"Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter.\n\nEnter the Base64 encoding or an accessible URL of the image to edit. Seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support inputting a single image or multiple images (see the multi-image blending example).\n\n• Image URL: Make sure that the image URL is accessible.\n• Base64 encoding: The format must be data:image/\u003cimage format\u003e;base64,\u003cBase64 encoding\u003e. Note: \u003cimage format\u003e must be in lowercase, e.g., data:image/png;base64,\u003cbase64_image\u003e.\n\nComfy Router limits the entire JSON request to 10 MiB, including base64 expansion and all reference images. Use URLs for inputs that would exceed this transport limit.\n\nAn input image must meet the following requirements:\n• Image format: jpeg, png (seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 also support webp, bmp, tiff and gif; seedream-5.0-pro also supports heic and heif)\n• Aspect ratio (width/height): In the range [1/16, 16] for seedream-5.0-pro, 5.0-lite, 4.5 and 4.0\n• Width and height (px): \u003e 14\n• Size: No more than 10 MB (30 MB for seedream-5.0-pro)\n• Total pixels: No more than 6000x6000 (36,000,000 px) for seedream-5.0-pro\n• Maximum of 14 reference images (10 for seedream-5.0-pro)\n\nIn the layer-separation scenario (layer_decomposition enabled), image is required and only a single input image is supported (passing multiple images returns an error). Input images must be png, jpeg, webp, bmp, tiff or gif (heic and heif are not supported), up to 30 MB, with total pixels in the range [512x512, 6000x6000] and aspect ratio in [1/16, 16].\n","oneOf":[{"description":"Single image (URL or Base64)","type":"string"},{"description":"Multiple images (URLs or Base64) - supported by seedream-5.0-pro, 5.0-lite, 4.5 and 4.0","items":{"type":"string"},"maxItems":14,"minItems":1,"type":"array"}]},"layer_decomposition":{"default":false,"description":"Controls whether layer separation is enabled. Only seedream-5.0-pro supports this parameter.\ntrue: Layer-separation mode. The model decomposes the single input image into one base image plus multiple layers (up to 16), and returns the position and content information of each produced layer, including the stacking order (z_index), bounding box (bounding_box), name (name) and description (description).\nfalse: Standard image-generation mode; no layer separation is performed.\nNotes on layer-separation mode: only a single input image is supported (passing multiple images returns an error); if any single layer fails to generate, the whole request fails — partial success is not supported; at most 17 images are returned (1 base image + 16 layers). sequential_image_generation, sequential_image_generation_options, tools and stream return an error if passed.\n","type":"boolean"},"model":{"description":"Model identifier. Supported models: seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128 and seedream-5-0-pro-260628. A direct v1 call to POST /proxy/byteplus/api/v3/images/generations MUST supply it — the proxy refuses any other value, and an omitted one, with a 400. It is NOT in this schema's `required` list because Comfy Router fills it from the `{model}` path segment of /v2/models/byteplus/{model}, so a Router caller omits it.","nullable":true,"type":"string"},"optimize_prompt_options":{"description":"Configuration for prompt optimization feature. Only seedream-5.0-pro/5.0-lite/4.5 (only support standard mode) and seedream-4.0 support this parameter.\n","properties":{"mode":{"default":"standard","description":"Set the mode for the prompt optimization feature. standard = Higher quality, longer generation time. fast = Faster but at a more average quality.","enum":["standard","fast"],"type":"string"}},"type":"object"},"output_format":{"default":"jpeg","description":"Specifies the format of the output image. Only seedream-5.0-pro and 5.0-lite support this parameter. In the layer-separation scenario, output_format only controls the format of the base image; every layer is always output as png.","enum":["png","jpeg"],"type":"string"},"prompt":{"description":"Text description for image generation or transformation.\nOptional in the layer-separation scenario (seedream-5.0-pro with layer_decomposition enabled): if a prompt is provided, the model recognizes and separates the elements you specify according to the prompt intent; if no prompt is provided, the model automatically detects all major elements in the image and separates them into independent layers.\n","type":"string"},"response_format":{"default":"url","description":"Specifies the format of the generated image returned in the response","enum":["url","b64_json"],"type":"string"},"seed":{"default":-1,"description":"Random seed to control the stochasticity of image generation. Range: [-1, 2147483647]. If not specified, a seed will be automatically generated. To reproduce the same output, use the same seed value.","maximum":2147483647,"minimum":-1,"type":"integer"},"sequential_image_generation":{"description":"Controls whether to disable the batch generation feature. This parameter is only supported on seedream-5.0-lite, 4.5 and 4.0 (not supported by seedream-5.0-pro). Valid values:\nauto: In automatic mode, the model automatically determines whether to return multiple images and how many images it will contain based on the user's prompt.\ndisabled: Disables batch generation feature. The model will only generate one image.\n","enum":["auto","disabled"],"type":"string"},"sequential_image_generation_options":{"description":"Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro).\nConfiguration for the batch image generation feature. This parameter is only effective when sequential_image_generation is set to auto.\n","properties":{"max_images":{"default":15,"description":"Specifies the maximum number of images to generate in this request. Number of input reference images + Number of generated images ≤ 15.","maximum":15,"minimum":1,"type":"integer"}},"type":"object"},"size":{"description":"\"seedream-4-0-250828\": Set the specification for the generated image. Two methods are available but cannot be used together.\n Method 1 | Specify the resolution. Optional values: 1K, 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [1024x1024, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-4-5-251128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 4K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, 4096x4096], aspect ratio: [1/16, 16]\n\"seedream-5-0-260128\": Two methods available.\n Method 1 | Specify the resolution. Optional values: 2K, 3K\n Method 2 | Specify width and height in pixels. Default: 2048x2048, total pixels: [2560x1440, ~3072x3072], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\": Two methods available (cannot be used together).\n Method 1 | Specify the resolution and describe the aspect ratio, shape or purpose of the image in the prompt; the model decides the final size. Optional values: 1K, 2K\n Method 2 | Specify width and height in pixels. Default: 1024x1024, total pixels: [1024x1024 (1048576), 2048x2048 (4194304)], aspect ratio: [1/16, 16]\n\"seedream-5-0-pro-260628\" with layer_decomposition enabled: Only the resolution-level method is supported. Optional values: 1K, 1.5K, 2K, auto. Default: auto.\n The base image is output at the specified resolution with the aspect ratio of the original input image; each layer is output close to the specified resolution, keeping the aspect ratio it had in the original image.\n auto: Output is based on the size and aspect ratio of the input image. Inputs within [1280x720, ~2048x2048] are output at the original input size; inputs smaller than 1K are output at 1K; inputs larger than 2K are output at 2K.\n","type":"string"},"stream":{"default":false,"description":"Comfy Router settles an explicitly supplied stream flag to false because it captures a complete JSON result. On the v1 proxy, this field controls whether to enable streaming output mode. Only seedream-5.0-lite, 4.5 and 4.0 support this parameter (not supported by seedream-5.0-pro). false = All output images are returned at once. true = Each output image is returned immediately after generated.","type":"boolean"},"watermark":{"default":true,"description":"Specifies whether to add a watermark to the generated image. false = No watermark, true = Adds watermark with 'AI generated' label","type":"boolean"}},"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BytePlusImageGenerationResponse"}],"description":"Comfy Router output schema for the BytePlus Seedream/Seededit image models: BytePlus's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `byteplus /api/v3/images/generations` as ReturnModeDirect), so the body a caller receives is this finished document from the one call.\nThe generated images are in `data`, each with either a download URL at `data[].url` or inline base64 bytes at `data[].b64_json`, depending on the request's `response_format`; select the leaf by which key is present. `usage` reports BytePlus's own generation accounting — BytePlus's numbers, not the Comfy charge.\nRouter does not re-host these images onto Comfy storage the way it re-hosts the Seedance VIDEO results: a `data[].url` here stays BytePlus's own link, which BytePlus clears 24 hours after the generation and caps at 100 downloads on some models. Download it rather than storing the URL.","example":{"created":1767225600,"data":[{"size":"1024x1024","url":"https://example.invalid/byteplus/seedream-4-0-250828/generated.png"}],"model":"seedream-4-0-250828","usage":{"generated_images":1}}}}}}}}}},"components":{"schemas":{"BytePlusImageGenerationResponse":{"properties":{"created":{"description":"Unix timestamp (in seconds) indicating the time when the request was created","type":"integer"},"data":{"description":"Contains information about the generated image(s).\nIn the layer-separation scenario, the first element of the array is the base image (z_index=0), and the following elements are the layers, ordered by increasing z_index.\n","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (if response_format is \"b64_json\")","type":"string"},"bounding_box":{"description":"The bounding-box information of the region that the current layer occupies within the base image. Only layers return this field; the base image covers the whole canvas and does not return bounding_box. Returned only when layer_decomposition is true.","properties":{"absolute":{"description":"The absolute pixel coordinates of the layer's bounding box, in the output base image's coordinate system with the top-left corner at (0, 0). Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"},"normalized":{"description":"The per-mille quantized (normalized) coordinates of the layer's bounding box, proportionally mapped to a discrete integer range of [0, 1000] based on the base image size, truncated at a maximum of 1000. Coordinate format: [left, top, right, bottom].","items":{"type":"integer"},"type":"array"}},"type":"object"},"description":{"description":"A detailed description of the current separated element, providing richer layer characteristics (such as color, state, material) than name. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"name":{"description":"The name/label of the current separated element, automatically generated by the model from the characteristics of the separated subject. Only layers return this field; the base image does not. Returned only when layer_decomposition is true.","type":"string"},"output_format":{"description":"The file format of the output image. Only seedream-5.0-pro supports this field.","type":"string"},"size":{"description":"The width and height of the image in pixels, in the format \u003cwidth\u003ex\u003cheight\u003e. Only seedream-5.0-pro, 5.0-lite, 4.5 and 4.0 support this parameter.","type":"string"},"url":{"description":"URL for image download (if response_format is \"url\")","format":"uri","type":"string"},"z_index":{"description":"The stacking order of the layer, increasing from bottom to top: 0 is the bottom-most layer (the base image); larger values sit higher. Use it to recompose the layers into the complete image at the correct stacking order. Returned only when layer_decomposition is true.","type":"integer"}},"type":"object"},"type":"array"},"error":{"description":"Error information (if any)","properties":{"code":{"description":"Error code","type":"string"},"message":{"description":"Error message","type":"string"}},"type":"object"},"model":{"description":"The model ID used for the request","example":"seedream-4-0-250828","type":"string"},"usage":{"properties":{"generated_images":{"description":"Number of images generated by the model","type":"integer"},"input_images":{"description":"The number of images input to the model. Only seedream-5.0-pro supports this field.","type":"integer"},"output_tokens":{"description":"The number of tokens used for the picture generated by the model.","type":"integer"},"total_tokens":{"description":"The total number of tokens consumed by this request.","type":"integer"}},"type":"object"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"byteplus/seedream-5-0-pro-260628","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/gemini-interactions/gemini-omni-1.1-flash.json b/router-schemas/gemini-interactions/gemini-omni-1.1-flash.json index c9f37956f..7d6f10951 100644 --- a/router-schemas/gemini-interactions/gemini-omni-1.1-flash.json +++ b/router-schemas/gemini-interactions/gemini-omni-1.1-flash.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"gemini-interactions/gemini-omni-1.1-flash","description":"The request body Comfy Router accepts for the model \"gemini-interactions/gemini-omni-1.1-flash\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"8a2f9a08058c"},"paths":{"/v2/models/gemini-interactions/gemini-omni-1.1-flash":{"post":{"operationId":"runRouterModel","summary":"Run gemini-interactions/gemini-omni-1.1-flash synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":true,"description":"The Gemini Interactions fields, shared by the v1 `POST /proxy/gemini-interactions` request body and the Comfy Router input schema for the `gemini-interactions/*` models. Mirrors the upstream `/v1beta/interactions` schema with strict typing only on the fields the proxy reads (model, `input` for prompt extraction); all other fields (`response_format`, `generation_config`, `store`, `safety_settings`, ...) pass through unchanged via `additionalProperties`. TWO EXCEPTIONS, refused rather than forwarded: `background` and `stream`. Both are honoured by Google and both produce a 2xx this proxy cannot meter — `background: true` answers a queued `in_progress` document carrying no `usage`, whose finished generation is only ever reachable through `GET /proxy/gemini-interactions/{id}`, which meters nothing; `stream: true` answers a `text/event-stream` the billing path cannot decode. Naming either with a value other than `false` or `null` is a 400; omitting them, or sending them false/null, is the synchronous request this surface serves. On the Comfy Router route `POST /v2/models/gemini-interactions/{model}` both fields are settled to `false` before dispatch (routerSettledBoolFields) rather than refused. `required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes; the v1 wrapper `GeminiInteractionRequest` re-adds it.","example":{"input":"Reply with the single word: ok","stream":false},"properties":{"input":{"description":"Either a prompt string or an array of typed content parts (text, image, audio, video, document)."},"model":{"description":"Gemini model identifier (e.g. `gemini-omni-flash-preview`). On the Comfy Router route `POST /v2/models/gemini-interactions/{model}` it is supplied from the path and may be omitted. The spellings this operation serves — the set Comfy Router addresses as `gemini-interactions/\u003cmodel\u003e` — are gemini-omni-flash-preview and gemini-omni-1.1-flash (supportedGeminiInteractionModels); they are written out here rather than constrained to an enum, because the proxy validates the model itself and answers its own 400 for a spelling it does not serve.","nullable":true,"type":"string"},"previous_interaction_id":{"description":"ID of a prior stored interaction, enabling stateful multi-turn video editing.","type":"string"}},"required":["input"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GeminiInteraction"},{"properties":{"status":{"description":"Always `completed` on a Router response. The provider's other statuses (`in_progress`, `requires_action`, `failed`, `cancelled`, `incomplete`, `budget_exceeded`) do not reach a caller through Router as a 200; they are returned as a Comfy Router error carrying the provider's body.","enum":["completed"],"type":"string"},"steps":{"description":"The interaction timeline, in order. Narrowed here from the untyped `steps` on `GeminiInteraction` so the output leaf is addressable; the provider keeps adding step types, so an item is `additionalProperties: true` and only the fields a Router caller reads are declared.","items":{"additionalProperties":true,"properties":{"content":{"description":"The typed content blocks of this step.","items":{"additionalProperties":true,"properties":{"data":{"description":"Base64-encoded inline media, on a media block delivered inline. Google caps inline media at 4 MB and requires `delivery: uri` above it.","type":"string"},"mime_type":{"description":"Media type of `data` or `uri`, on a media block.","type":"string"},"text":{"description":"The generated text. Present on a `text` block, and this is the leaf the nightly Router SDK case asserts — on a `model_output` step specifically (`steps[type=model_output].content[].text`).","type":"string"},"type":{"description":"Block kind — `text`, `image`, `audio`, `video` or `document`.","type":"string"},"uri":{"description":"Reference to media delivered out of band, fetched by the caller from the URI it names.","type":"string"}},"type":"object"},"type":"array"},"type":{"description":"Step kind. `model_output` is the generated answer; `user_input` is the caller's own turn echoed back by the retrieval route; `thought` is internal reasoning. The tool steps (`function_call`, `function_result`, `code_execution_call`, `google_search_call`, ...) are open-ended and Google adds to them.","type":"string"}},"type":"object"},"type":"array"}},"required":["status","steps"],"type":"object"}],"description":"Comfy Router output schema for the Gemini Interactions omni models: the `POST /v1beta/interactions` response document, forwarded unchanged. The operation is direct-return — one call answers with the finished document, and Router never continues the interaction on the caller's behalf. Driving an interaction across turns is the caller's own business against the Gemini Interactions proxy routes.\nThe generated text is at `steps[].content[].text`, under a step whose `type` is `model_output`. `steps` is the interaction timeline: each step carries a `type` discriminator (`model_output`, `user_input`, `thought`, the `*_call`/`*_result` tool steps) and, for the output steps, a `content` array of typed blocks — `text` blocks carry `text`, and the media blocks carry `data` (base64) or `uri` plus `mime_type`. A Router call answers with the model's output steps only; a caller that reads an interaction back over the proxy's own retrieval route gets the whole timeline, user input included, and must select on `type: model_output` rather than assume the first step is the answer. Field names follow Google's current reference: the pre-May-2026 `outputs[]` array this family used to answer with was removed on 2026-06-08 and is NOT part of this contract.\n`status` is the caller's completion key, and it is the only one. Router pins it: a document is answered to a Router caller ONLY for `status: completed`, which is why this schema requires that value. `in_progress` and `requires_action` — a queued handle shaped like a result — and every other terminal status (`failed`, `cancelled`, `incomplete`, `budget_exceeded`, or one Comfy does not recognise) are surfaced as a Comfy Router error carrying the provider's untouched body, not as a 200. On a captured, non-streamed response an `in_progress` is a FAILURE of this contract, not a partial success.\nTwo request fields are accepted and ignored rather than honoured: `stream` and `background` are both forwarded to the provider as false, so a Router call always resolves to one captured, synchronous document. Sending either as true is not an error and does not change the result.\n`usage` is Google's own per-modality token accounting — Google's numbers, not the Comfy charge. Note that the presence of `usage` is what makes a call billable: a document that reports usage is metered even when its `status` is a refusal such as `failed` or `incomplete`, because the model ran and consumed tokens. A call that reports no `usage` is not metered. Media returned with `delivery: uri` is referenced by URI; Router returns the referencing document and does not relay the fetch, so retrieving the asset is the caller's.","example":{"id":"interactions/3f6c1a90-2b47-4d18-9a55-7c0e8b21d4f3","object":"interaction","status":"completed","steps":[{"content":[{"text":"ok","type":"text"}],"type":"model_output"}],"usage":{"input_tokens_by_modality":[{"modality":"text","tokens":9}],"output_tokens_by_modality":[{"modality":"text","tokens":2}],"total_cached_tokens":0,"total_input_tokens":9,"total_output_tokens":2,"total_thought_tokens":0,"total_tokens":11}}}}}}}}}},"components":{"schemas":{"GeminiInteraction":{"additionalProperties":true,"description":"A Gemini Interactions API resource. Most fields pass through; the proxy reads `status` and `usage` for billing.","properties":{"id":{"type":"string"},"model":{"type":"string"},"object":{"type":"string"},"status":{"description":"One of `in_progress`, `requires_action`, `completed`, `failed`, `cancelled`, `incomplete`, `budget_exceeded`.","type":"string"},"steps":{"description":"Interaction history (user input, thoughts, model outputs with inline media)."},"usage":{"$ref":"#/components/schemas/GeminiInteractionUsage"}},"type":"object"},"GeminiInteractionModalityTokens":{"description":"Token count for one modality.","properties":{"modality":{"description":"One of `text`, `image`, `audio`, `video`, `document`.","type":"string"},"tokens":{"type":"integer"}},"type":"object"},"GeminiInteractionUsage":{"additionalProperties":true,"description":"Token usage for a Gemini interaction.","properties":{"input_tokens_by_modality":{"items":{"$ref":"#/components/schemas/GeminiInteractionModalityTokens"},"type":"array"},"output_tokens_by_modality":{"items":{"$ref":"#/components/schemas/GeminiInteractionModalityTokens"},"type":"array"},"total_cached_tokens":{"type":"integer"},"total_input_tokens":{"type":"integer"},"total_output_tokens":{"type":"integer"},"total_thought_tokens":{"type":"integer"},"total_tokens":{"type":"integer"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"gemini-interactions/gemini-omni-1.1-flash","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"gemini-interactions/gemini-omni-1.1-flash","description":"The request body Comfy Router accepts for the model \"gemini-interactions/gemini-omni-1.1-flash\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"eab6c2ee2a38"},"paths":{"/v2/models/gemini-interactions/gemini-omni-1.1-flash":{"post":{"operationId":"runRouterModel","summary":"Run gemini-interactions/gemini-omni-1.1-flash synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":true,"description":"The Gemini Interactions fields, shared by the v1 `POST /proxy/gemini-interactions` request body and the Comfy Router input schema for the `gemini-interactions/*` models. Mirrors the upstream `/v1beta/interactions` schema with strict typing only on the fields the proxy reads (model, `input` for prompt extraction); all other fields (`response_format`, `generation_config`, `store`, `safety_settings`, ...) pass through unchanged via `additionalProperties`. TWO EXCEPTIONS, refused rather than forwarded: `background` and `stream`. Both are honoured by Google and both produce a 2xx this proxy cannot meter — `background: true` answers a queued `in_progress` document carrying no `usage`, whose finished generation is only ever reachable through `GET /proxy/gemini-interactions/{id}`, which meters nothing; `stream: true` answers a `text/event-stream` the billing path cannot decode. Naming either with a value other than `false` or `null` is a 400; omitting them, or sending them false/null, is the synchronous request this surface serves. On the Comfy Router route `POST /v2/models/gemini-interactions/{model}` both fields are settled to `false` before dispatch (routerSettledBoolFields) rather than refused. `required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes; the v1 wrapper `GeminiInteractionRequest` re-adds it.","example":{"input":"Reply with the single word: ok","stream":false},"properties":{"input":{"description":"Either a prompt string or an array of typed content parts (text, image, audio, video, document)."},"model":{"description":"Gemini model identifier: `gemini-omni-1.1-flash` (generally available), or the deprecated `gemini-omni-flash-preview`. On the Comfy Router route `POST /v2/models/gemini-interactions/{model}` it is supplied from the path and may be omitted. Those two spellings — the set Comfy Router addresses as `gemini-interactions/\u003cmodel\u003e` — are the ones this operation serves (supportedGeminiInteractionModels); they are written out here rather than constrained to an enum, because the proxy validates the model itself and answers its own 400 for a spelling it does not serve.","nullable":true,"type":"string"},"previous_interaction_id":{"description":"ID of a prior stored interaction, enabling stateful multi-turn video editing.","type":"string"}},"required":["input"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GeminiInteraction"},{"properties":{"status":{"description":"Always `completed` on a Router response. The provider's other statuses (`in_progress`, `requires_action`, `failed`, `cancelled`, `incomplete`, `budget_exceeded`) do not reach a caller through Router as a 200; they are returned as a Comfy Router error carrying the provider's body.","enum":["completed"],"type":"string"},"steps":{"description":"The interaction timeline, in order. Narrowed here from the untyped `steps` on `GeminiInteraction` so the output leaf is addressable; the provider keeps adding step types, so an item is `additionalProperties: true` and only the fields a Router caller reads are declared.","items":{"additionalProperties":true,"properties":{"content":{"description":"The typed content blocks of this step.","items":{"additionalProperties":true,"properties":{"data":{"description":"Base64-encoded inline media, on a media block delivered inline. Google caps inline media at 4 MB and requires `delivery: uri` above it.","type":"string"},"mime_type":{"description":"Media type of `data` or `uri`, on a media block.","type":"string"},"text":{"description":"The generated text. Present on a `text` block, and this is the leaf the nightly Router SDK case asserts — on a `model_output` step specifically (`steps[type=model_output].content[].text`).","type":"string"},"type":{"description":"Block kind — `text`, `image`, `audio`, `video` or `document`.","type":"string"},"uri":{"description":"Reference to media delivered out of band, fetched by the caller from the URI it names.","type":"string"}},"type":"object"},"type":"array"},"type":{"description":"Step kind. `model_output` is the generated answer; `user_input` is the caller's own turn echoed back by the retrieval route; `thought` is internal reasoning. The tool steps (`function_call`, `function_result`, `code_execution_call`, `google_search_call`, ...) are open-ended and Google adds to them.","type":"string"}},"type":"object"},"type":"array"}},"required":["status","steps"],"type":"object"}],"description":"Comfy Router output schema for the Gemini Interactions omni models: the `POST /v1beta/interactions` response document, forwarded unchanged. The operation is direct-return — one call answers with the finished document, and Router never continues the interaction on the caller's behalf. Driving an interaction across turns is the caller's own business against the Gemini Interactions proxy routes.\nThe generated text is at `steps[].content[].text`, under a step whose `type` is `model_output`. `steps` is the interaction timeline: each step carries a `type` discriminator (`model_output`, `user_input`, `thought`, the `*_call`/`*_result` tool steps) and, for the output steps, a `content` array of typed blocks — `text` blocks carry `text`, and the media blocks carry `data` (base64) or `uri` plus `mime_type`. A Router call answers with the model's output steps only; a caller that reads an interaction back over the proxy's own retrieval route gets the whole timeline, user input included, and must select on `type: model_output` rather than assume the first step is the answer. Field names follow Google's current reference: the pre-May-2026 `outputs[]` array this family used to answer with was removed on 2026-06-08 and is NOT part of this contract.\n`status` is the caller's completion key, and it is the only one. Router pins it: a document is answered to a Router caller ONLY for `status: completed`, which is why this schema requires that value. `in_progress` and `requires_action` — a queued handle shaped like a result — and every other terminal status (`failed`, `cancelled`, `incomplete`, `budget_exceeded`, or one Comfy does not recognise) are surfaced as a Comfy Router error carrying the provider's untouched body, not as a 200. On a captured, non-streamed response an `in_progress` is a FAILURE of this contract, not a partial success.\nTwo request fields are accepted and ignored rather than honoured: `stream` and `background` are both forwarded to the provider as false, so a Router call always resolves to one captured, synchronous document. Sending either as true is not an error and does not change the result.\n`usage` is Google's own per-modality token accounting — Google's numbers, not the Comfy charge. Note that the presence of `usage` is what makes a call billable: a document that reports usage is metered even when its `status` is a refusal such as `failed` or `incomplete`, because the model ran and consumed tokens. A call that reports no `usage` is not metered. Media returned with `delivery: uri` is referenced by URI; Router returns the referencing document and does not relay the fetch, so retrieving the asset is the caller's.","example":{"id":"interactions/3f6c1a90-2b47-4d18-9a55-7c0e8b21d4f3","object":"interaction","status":"completed","steps":[{"content":[{"text":"ok","type":"text"}],"type":"model_output"}],"usage":{"input_tokens_by_modality":[{"modality":"text","tokens":9}],"output_tokens_by_modality":[{"modality":"text","tokens":2}],"total_cached_tokens":0,"total_input_tokens":9,"total_output_tokens":2,"total_thought_tokens":0,"total_tokens":11}}}}}}}}}},"components":{"schemas":{"GeminiInteraction":{"additionalProperties":true,"description":"A Gemini Interactions API resource. Most fields pass through; the proxy reads `status` and `usage` for billing.","properties":{"id":{"type":"string"},"model":{"type":"string"},"object":{"type":"string"},"status":{"description":"One of `in_progress`, `requires_action`, `completed`, `failed`, `cancelled`, `incomplete`, `budget_exceeded`.","type":"string"},"steps":{"description":"Interaction history (user input, thoughts, model outputs with inline media)."},"usage":{"$ref":"#/components/schemas/GeminiInteractionUsage"}},"type":"object"},"GeminiInteractionModalityTokens":{"description":"Token count for one modality.","properties":{"modality":{"description":"One of `text`, `image`, `audio`, `video`, `document`.","type":"string"},"tokens":{"type":"integer"}},"type":"object"},"GeminiInteractionUsage":{"additionalProperties":true,"description":"Token usage for a Gemini interaction.","properties":{"input_tokens_by_modality":{"items":{"$ref":"#/components/schemas/GeminiInteractionModalityTokens"},"type":"array"},"output_tokens_by_modality":{"items":{"$ref":"#/components/schemas/GeminiInteractionModalityTokens"},"type":"array"},"total_cached_tokens":{"type":"integer"},"total_input_tokens":{"type":"integer"},"total_output_tokens":{"type":"integer"},"total_thought_tokens":{"type":"integer"},"total_tokens":{"type":"integer"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"gemini-interactions/gemini-omni-1.1-flash","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/gemini-interactions/gemini-omni-flash-preview.json b/router-schemas/gemini-interactions/gemini-omni-flash-preview.json index 0bd0295b7..989c44e01 100644 --- a/router-schemas/gemini-interactions/gemini-omni-flash-preview.json +++ b/router-schemas/gemini-interactions/gemini-omni-flash-preview.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"gemini-interactions/gemini-omni-flash-preview","description":"The request body Comfy Router accepts for the model \"gemini-interactions/gemini-omni-flash-preview\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"8a2f9a08058c"},"paths":{"/v2/models/gemini-interactions/gemini-omni-flash-preview":{"post":{"operationId":"runRouterModel","summary":"Run gemini-interactions/gemini-omni-flash-preview synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":true,"description":"The Gemini Interactions fields, shared by the v1 `POST /proxy/gemini-interactions` request body and the Comfy Router input schema for the `gemini-interactions/*` models. Mirrors the upstream `/v1beta/interactions` schema with strict typing only on the fields the proxy reads (model, `input` for prompt extraction); all other fields (`response_format`, `generation_config`, `store`, `safety_settings`, ...) pass through unchanged via `additionalProperties`. TWO EXCEPTIONS, refused rather than forwarded: `background` and `stream`. Both are honoured by Google and both produce a 2xx this proxy cannot meter — `background: true` answers a queued `in_progress` document carrying no `usage`, whose finished generation is only ever reachable through `GET /proxy/gemini-interactions/{id}`, which meters nothing; `stream: true` answers a `text/event-stream` the billing path cannot decode. Naming either with a value other than `false` or `null` is a 400; omitting them, or sending them false/null, is the synchronous request this surface serves. On the Comfy Router route `POST /v2/models/gemini-interactions/{model}` both fields are settled to `false` before dispatch (routerSettledBoolFields) rather than refused. `required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes; the v1 wrapper `GeminiInteractionRequest` re-adds it.","example":{"input":"Reply with the single word: ok","stream":false},"properties":{"input":{"description":"Either a prompt string or an array of typed content parts (text, image, audio, video, document)."},"model":{"description":"Gemini model identifier (e.g. `gemini-omni-flash-preview`). On the Comfy Router route `POST /v2/models/gemini-interactions/{model}` it is supplied from the path and may be omitted. The spellings this operation serves — the set Comfy Router addresses as `gemini-interactions/\u003cmodel\u003e` — are gemini-omni-flash-preview and gemini-omni-1.1-flash (supportedGeminiInteractionModels); they are written out here rather than constrained to an enum, because the proxy validates the model itself and answers its own 400 for a spelling it does not serve.","nullable":true,"type":"string"},"previous_interaction_id":{"description":"ID of a prior stored interaction, enabling stateful multi-turn video editing.","type":"string"}},"required":["input"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GeminiInteraction"},{"properties":{"status":{"description":"Always `completed` on a Router response. The provider's other statuses (`in_progress`, `requires_action`, `failed`, `cancelled`, `incomplete`, `budget_exceeded`) do not reach a caller through Router as a 200; they are returned as a Comfy Router error carrying the provider's body.","enum":["completed"],"type":"string"},"steps":{"description":"The interaction timeline, in order. Narrowed here from the untyped `steps` on `GeminiInteraction` so the output leaf is addressable; the provider keeps adding step types, so an item is `additionalProperties: true` and only the fields a Router caller reads are declared.","items":{"additionalProperties":true,"properties":{"content":{"description":"The typed content blocks of this step.","items":{"additionalProperties":true,"properties":{"data":{"description":"Base64-encoded inline media, on a media block delivered inline. Google caps inline media at 4 MB and requires `delivery: uri` above it.","type":"string"},"mime_type":{"description":"Media type of `data` or `uri`, on a media block.","type":"string"},"text":{"description":"The generated text. Present on a `text` block, and this is the leaf the nightly Router SDK case asserts — on a `model_output` step specifically (`steps[type=model_output].content[].text`).","type":"string"},"type":{"description":"Block kind — `text`, `image`, `audio`, `video` or `document`.","type":"string"},"uri":{"description":"Reference to media delivered out of band, fetched by the caller from the URI it names.","type":"string"}},"type":"object"},"type":"array"},"type":{"description":"Step kind. `model_output` is the generated answer; `user_input` is the caller's own turn echoed back by the retrieval route; `thought` is internal reasoning. The tool steps (`function_call`, `function_result`, `code_execution_call`, `google_search_call`, ...) are open-ended and Google adds to them.","type":"string"}},"type":"object"},"type":"array"}},"required":["status","steps"],"type":"object"}],"description":"Comfy Router output schema for the Gemini Interactions omni models: the `POST /v1beta/interactions` response document, forwarded unchanged. The operation is direct-return — one call answers with the finished document, and Router never continues the interaction on the caller's behalf. Driving an interaction across turns is the caller's own business against the Gemini Interactions proxy routes.\nThe generated text is at `steps[].content[].text`, under a step whose `type` is `model_output`. `steps` is the interaction timeline: each step carries a `type` discriminator (`model_output`, `user_input`, `thought`, the `*_call`/`*_result` tool steps) and, for the output steps, a `content` array of typed blocks — `text` blocks carry `text`, and the media blocks carry `data` (base64) or `uri` plus `mime_type`. A Router call answers with the model's output steps only; a caller that reads an interaction back over the proxy's own retrieval route gets the whole timeline, user input included, and must select on `type: model_output` rather than assume the first step is the answer. Field names follow Google's current reference: the pre-May-2026 `outputs[]` array this family used to answer with was removed on 2026-06-08 and is NOT part of this contract.\n`status` is the caller's completion key, and it is the only one. Router pins it: a document is answered to a Router caller ONLY for `status: completed`, which is why this schema requires that value. `in_progress` and `requires_action` — a queued handle shaped like a result — and every other terminal status (`failed`, `cancelled`, `incomplete`, `budget_exceeded`, or one Comfy does not recognise) are surfaced as a Comfy Router error carrying the provider's untouched body, not as a 200. On a captured, non-streamed response an `in_progress` is a FAILURE of this contract, not a partial success.\nTwo request fields are accepted and ignored rather than honoured: `stream` and `background` are both forwarded to the provider as false, so a Router call always resolves to one captured, synchronous document. Sending either as true is not an error and does not change the result.\n`usage` is Google's own per-modality token accounting — Google's numbers, not the Comfy charge. Note that the presence of `usage` is what makes a call billable: a document that reports usage is metered even when its `status` is a refusal such as `failed` or `incomplete`, because the model ran and consumed tokens. A call that reports no `usage` is not metered. Media returned with `delivery: uri` is referenced by URI; Router returns the referencing document and does not relay the fetch, so retrieving the asset is the caller's.","example":{"id":"interactions/3f6c1a90-2b47-4d18-9a55-7c0e8b21d4f3","object":"interaction","status":"completed","steps":[{"content":[{"text":"ok","type":"text"}],"type":"model_output"}],"usage":{"input_tokens_by_modality":[{"modality":"text","tokens":9}],"output_tokens_by_modality":[{"modality":"text","tokens":2}],"total_cached_tokens":0,"total_input_tokens":9,"total_output_tokens":2,"total_thought_tokens":0,"total_tokens":11}}}}}}}}}},"components":{"schemas":{"GeminiInteraction":{"additionalProperties":true,"description":"A Gemini Interactions API resource. Most fields pass through; the proxy reads `status` and `usage` for billing.","properties":{"id":{"type":"string"},"model":{"type":"string"},"object":{"type":"string"},"status":{"description":"One of `in_progress`, `requires_action`, `completed`, `failed`, `cancelled`, `incomplete`, `budget_exceeded`.","type":"string"},"steps":{"description":"Interaction history (user input, thoughts, model outputs with inline media)."},"usage":{"$ref":"#/components/schemas/GeminiInteractionUsage"}},"type":"object"},"GeminiInteractionModalityTokens":{"description":"Token count for one modality.","properties":{"modality":{"description":"One of `text`, `image`, `audio`, `video`, `document`.","type":"string"},"tokens":{"type":"integer"}},"type":"object"},"GeminiInteractionUsage":{"additionalProperties":true,"description":"Token usage for a Gemini interaction.","properties":{"input_tokens_by_modality":{"items":{"$ref":"#/components/schemas/GeminiInteractionModalityTokens"},"type":"array"},"output_tokens_by_modality":{"items":{"$ref":"#/components/schemas/GeminiInteractionModalityTokens"},"type":"array"},"total_cached_tokens":{"type":"integer"},"total_input_tokens":{"type":"integer"},"total_output_tokens":{"type":"integer"},"total_thought_tokens":{"type":"integer"},"total_tokens":{"type":"integer"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"gemini-interactions/gemini-omni-flash-preview","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"gemini-interactions/gemini-omni-flash-preview","description":"The request body Comfy Router accepts for the model \"gemini-interactions/gemini-omni-flash-preview\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"eab6c2ee2a38"},"paths":{"/v2/models/gemini-interactions/gemini-omni-flash-preview":{"post":{"operationId":"runRouterModel","summary":"Run gemini-interactions/gemini-omni-flash-preview synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":true,"description":"The Gemini Interactions fields, shared by the v1 `POST /proxy/gemini-interactions` request body and the Comfy Router input schema for the `gemini-interactions/*` models. Mirrors the upstream `/v1beta/interactions` schema with strict typing only on the fields the proxy reads (model, `input` for prompt extraction); all other fields (`response_format`, `generation_config`, `store`, `safety_settings`, ...) pass through unchanged via `additionalProperties`. TWO EXCEPTIONS, refused rather than forwarded: `background` and `stream`. Both are honoured by Google and both produce a 2xx this proxy cannot meter — `background: true` answers a queued `in_progress` document carrying no `usage`, whose finished generation is only ever reachable through `GET /proxy/gemini-interactions/{id}`, which meters nothing; `stream: true` answers a `text/event-stream` the billing path cannot decode. Naming either with a value other than `false` or `null` is a 400; omitting them, or sending them false/null, is the synchronous request this surface serves. On the Comfy Router route `POST /v2/models/gemini-interactions/{model}` both fields are settled to `false` before dispatch (routerSettledBoolFields) rather than refused. `required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes; the v1 wrapper `GeminiInteractionRequest` re-adds it.","example":{"input":"Reply with the single word: ok","stream":false},"properties":{"input":{"description":"Either a prompt string or an array of typed content parts (text, image, audio, video, document)."},"model":{"description":"Gemini model identifier: `gemini-omni-1.1-flash` (generally available), or the deprecated `gemini-omni-flash-preview`. On the Comfy Router route `POST /v2/models/gemini-interactions/{model}` it is supplied from the path and may be omitted. Those two spellings — the set Comfy Router addresses as `gemini-interactions/\u003cmodel\u003e` — are the ones this operation serves (supportedGeminiInteractionModels); they are written out here rather than constrained to an enum, because the proxy validates the model itself and answers its own 400 for a spelling it does not serve.","nullable":true,"type":"string"},"previous_interaction_id":{"description":"ID of a prior stored interaction, enabling stateful multi-turn video editing.","type":"string"}},"required":["input"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/GeminiInteraction"},{"properties":{"status":{"description":"Always `completed` on a Router response. The provider's other statuses (`in_progress`, `requires_action`, `failed`, `cancelled`, `incomplete`, `budget_exceeded`) do not reach a caller through Router as a 200; they are returned as a Comfy Router error carrying the provider's body.","enum":["completed"],"type":"string"},"steps":{"description":"The interaction timeline, in order. Narrowed here from the untyped `steps` on `GeminiInteraction` so the output leaf is addressable; the provider keeps adding step types, so an item is `additionalProperties: true` and only the fields a Router caller reads are declared.","items":{"additionalProperties":true,"properties":{"content":{"description":"The typed content blocks of this step.","items":{"additionalProperties":true,"properties":{"data":{"description":"Base64-encoded inline media, on a media block delivered inline. Google caps inline media at 4 MB and requires `delivery: uri` above it.","type":"string"},"mime_type":{"description":"Media type of `data` or `uri`, on a media block.","type":"string"},"text":{"description":"The generated text. Present on a `text` block, and this is the leaf the nightly Router SDK case asserts — on a `model_output` step specifically (`steps[type=model_output].content[].text`).","type":"string"},"type":{"description":"Block kind — `text`, `image`, `audio`, `video` or `document`.","type":"string"},"uri":{"description":"Reference to media delivered out of band, fetched by the caller from the URI it names.","type":"string"}},"type":"object"},"type":"array"},"type":{"description":"Step kind. `model_output` is the generated answer; `user_input` is the caller's own turn echoed back by the retrieval route; `thought` is internal reasoning. The tool steps (`function_call`, `function_result`, `code_execution_call`, `google_search_call`, ...) are open-ended and Google adds to them.","type":"string"}},"type":"object"},"type":"array"}},"required":["status","steps"],"type":"object"}],"description":"Comfy Router output schema for the Gemini Interactions omni models: the `POST /v1beta/interactions` response document, forwarded unchanged. The operation is direct-return — one call answers with the finished document, and Router never continues the interaction on the caller's behalf. Driving an interaction across turns is the caller's own business against the Gemini Interactions proxy routes.\nThe generated text is at `steps[].content[].text`, under a step whose `type` is `model_output`. `steps` is the interaction timeline: each step carries a `type` discriminator (`model_output`, `user_input`, `thought`, the `*_call`/`*_result` tool steps) and, for the output steps, a `content` array of typed blocks — `text` blocks carry `text`, and the media blocks carry `data` (base64) or `uri` plus `mime_type`. A Router call answers with the model's output steps only; a caller that reads an interaction back over the proxy's own retrieval route gets the whole timeline, user input included, and must select on `type: model_output` rather than assume the first step is the answer. Field names follow Google's current reference: the pre-May-2026 `outputs[]` array this family used to answer with was removed on 2026-06-08 and is NOT part of this contract.\n`status` is the caller's completion key, and it is the only one. Router pins it: a document is answered to a Router caller ONLY for `status: completed`, which is why this schema requires that value. `in_progress` and `requires_action` — a queued handle shaped like a result — and every other terminal status (`failed`, `cancelled`, `incomplete`, `budget_exceeded`, or one Comfy does not recognise) are surfaced as a Comfy Router error carrying the provider's untouched body, not as a 200. On a captured, non-streamed response an `in_progress` is a FAILURE of this contract, not a partial success.\nTwo request fields are accepted and ignored rather than honoured: `stream` and `background` are both forwarded to the provider as false, so a Router call always resolves to one captured, synchronous document. Sending either as true is not an error and does not change the result.\n`usage` is Google's own per-modality token accounting — Google's numbers, not the Comfy charge. Note that the presence of `usage` is what makes a call billable: a document that reports usage is metered even when its `status` is a refusal such as `failed` or `incomplete`, because the model ran and consumed tokens. A call that reports no `usage` is not metered. Media returned with `delivery: uri` is referenced by URI; Router returns the referencing document and does not relay the fetch, so retrieving the asset is the caller's.","example":{"id":"interactions/3f6c1a90-2b47-4d18-9a55-7c0e8b21d4f3","object":"interaction","status":"completed","steps":[{"content":[{"text":"ok","type":"text"}],"type":"model_output"}],"usage":{"input_tokens_by_modality":[{"modality":"text","tokens":9}],"output_tokens_by_modality":[{"modality":"text","tokens":2}],"total_cached_tokens":0,"total_input_tokens":9,"total_output_tokens":2,"total_thought_tokens":0,"total_tokens":11}}}}}}}}}},"components":{"schemas":{"GeminiInteraction":{"additionalProperties":true,"description":"A Gemini Interactions API resource. Most fields pass through; the proxy reads `status` and `usage` for billing.","properties":{"id":{"type":"string"},"model":{"type":"string"},"object":{"type":"string"},"status":{"description":"One of `in_progress`, `requires_action`, `completed`, `failed`, `cancelled`, `incomplete`, `budget_exceeded`.","type":"string"},"steps":{"description":"Interaction history (user input, thoughts, model outputs with inline media)."},"usage":{"$ref":"#/components/schemas/GeminiInteractionUsage"}},"type":"object"},"GeminiInteractionModalityTokens":{"description":"Token count for one modality.","properties":{"modality":{"description":"One of `text`, `image`, `audio`, `video`, `document`.","type":"string"},"tokens":{"type":"integer"}},"type":"object"},"GeminiInteractionUsage":{"additionalProperties":true,"description":"Token usage for a Gemini interaction.","properties":{"input_tokens_by_modality":{"items":{"$ref":"#/components/schemas/GeminiInteractionModalityTokens"},"type":"array"},"output_tokens_by_modality":{"items":{"$ref":"#/components/schemas/GeminiInteractionModalityTokens"},"type":"array"},"total_cached_tokens":{"type":"integer"},"total_input_tokens":{"type":"integer"},"total_output_tokens":{"type":"integer"},"total_thought_tokens":{"type":"integer"},"total_tokens":{"type":"integer"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"gemini-interactions/gemini-omni-flash-preview","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/heygen/starfish.json b/router-schemas/heygen/starfish.json index 210a94405..e38710c78 100644 --- a/router-schemas/heygen/starfish.json +++ b/router-schemas/heygen/starfish.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"heygen/starfish","description":"The request body Comfy Router accepts for the model \"heygen/starfish\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"383bceb2948a"},"paths":{"/v2/models/heygen/starfish":{"post":{"operationId":"runRouterModel","summary":"Run heygen/starfish synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for HeyGen v3 text-to-speech generation","example":{"text":"This is a billing verification test for HeyGen speech generation.","voice_id":"d2f4f24783d04e22ab49ee8fdc3715e0"},"properties":{"input_type":{"description":"Type of the input: 'text' for plain text, 'ssml' for SSML markup. Defaults to 'text'","type":"string"},"language":{"description":"Base language code (e.g. 'en'). Auto-detected from text when omitted","type":"string"},"locale":{"description":"BCP-47 locale tag (e.g. 'en-US'). When set, language is inferred from locale","type":"string"},"speed":{"description":"Speed multiplier (0.5-2.0)","format":"double","maximum":2,"minimum":0.5,"type":"number"},"text":{"description":"Text to synthesize (1-5000 characters)","maxLength":5000,"minLength":1,"type":"string"},"voice_id":{"description":"Voice ID to use. The voice must support the starfish engine","type":"string"}},"required":["text","voice_id"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/HeyGenSpeechResponse"},{"properties":{"data":{"allOf":[{"$ref":"#/components/schemas/HeyGenSpeechData"},{"required":["audio_url"],"type":"object"}]}},"required":["data"],"type":"object"}],"description":"Comfy Router output schema for HeyGen's `starfish` text-to-speech voice model: the `POST /proxy/heygen/v3/voices/speech` response, forwarded unchanged. Unlike HeyGen's video operations this one is SYNCHRONOUS — it enrols no task and Router never polls it — so the first response is the finished generation.\nThe generated AUDIO is at `data.audio_url`. This id generates audio and not video: its three avatar/video siblings on the same provider are not enrolled in the Comfy Router catalog. Comfy Router requires that URL — a `200` carrying no `data.audio_url` is answered as a Comfy Router error rather than with this document — so through Router the field is always present. Fetch it; nothing is inlined.\n`data.duration` is the audio's length in seconds and is what HeyGen bills the call by. It is deliberately NOT required: HeyGen forwards a success carrying audio and no duration, and Comfy Router serves that body rather than denying the caller a result they legitimately got. `data.request_id` identifies this generation to HeyGen, and `data.word_timestamps` carries word-level timing data for the spoken text when HeyGen returns it.","example":{"data":{"audio_url":"https://example.invalid/heygen/starfish/speech.mp3","duration":12.5,"request_id":"018f2c7a-4b1e-7c3d-9a05-6e2f8b41d0c9"}}}}}}}}}},"components":{"schemas":{"HeyGenSpeechData":{"description":"Payload of a successful HeyGen text-to-speech response","properties":{"audio_url":{"description":"URL of the generated audio file","type":"string"},"duration":{"description":"Duration of the audio in seconds","format":"double","type":"number"},"request_id":{"description":"Unique identifier for this generation request","type":"string"},"word_timestamps":{"description":"Word-level timing data","items":{"$ref":"#/components/schemas/HeyGenWordTimestamp"},"type":"array"}},"type":"object"},"HeyGenSpeechResponse":{"description":"Response envelope for HeyGen text-to-speech","properties":{"data":{"$ref":"#/components/schemas/HeyGenSpeechData"}},"type":"object"},"HeyGenWordTimestamp":{"description":"Word-level timing data from TTS generation","properties":{"end":{"description":"End time in seconds","format":"double","type":"number"},"start":{"description":"Start time in seconds","format":"double","type":"number"},"word":{"description":"The word","type":"string"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"heygen/starfish","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"heygen/starfish","description":"The request body Comfy Router accepts for the model \"heygen/starfish\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"4c0ceb6eff5b"},"paths":{"/v2/models/heygen/starfish":{"post":{"operationId":"runRouterModel","summary":"Run heygen/starfish synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for HeyGen v3 text-to-speech generation","example":{"text":"Hello from Comfy. This voice is generated with the HeyGen Starfish engine.","voice_id":"d2f4f24783d04e22ab49ee8fdc3715e0"},"properties":{"input_type":{"description":"Type of the input: 'text' for plain text, 'ssml' for SSML markup. Defaults to 'text'","type":"string"},"language":{"description":"Base language code (e.g. 'en'). Auto-detected from text when omitted","type":"string"},"locale":{"description":"BCP-47 locale tag (e.g. 'en-US'). When set, language is inferred from locale","type":"string"},"speed":{"description":"Speed multiplier (0.5-2.0)","format":"double","maximum":2,"minimum":0.5,"type":"number"},"text":{"description":"Text to synthesize (1-5000 characters)","maxLength":5000,"minLength":1,"type":"string"},"voice_id":{"description":"Voice ID to use. The voice must support the starfish engine","type":"string"}},"required":["text","voice_id"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/HeyGenSpeechResponse"},{"properties":{"data":{"allOf":[{"$ref":"#/components/schemas/HeyGenSpeechData"},{"required":["audio_url"],"type":"object"}]}},"required":["data"],"type":"object"}],"description":"Comfy Router output schema for HeyGen's `starfish` text-to-speech voice model: the `POST /proxy/heygen/v3/voices/speech` response, forwarded unchanged. Unlike HeyGen's video operations this one is SYNCHRONOUS — it enrols no task and Router never polls it — so the first response is the finished generation.\nThe generated AUDIO is at `data.audio_url`. This id generates audio and not video: its three avatar/video siblings on the same provider are not enrolled in the Comfy Router catalog. Comfy Router requires that URL — a `200` carrying no `data.audio_url` is answered as a Comfy Router error rather than with this document — so through Router the field is always present. Fetch it; nothing is inlined.\n`data.duration` is the audio's length in seconds and is what HeyGen bills the call by. It is deliberately NOT required: HeyGen forwards a success carrying audio and no duration, and Comfy Router serves that body rather than denying the caller a result they legitimately got. `data.request_id` identifies this generation to HeyGen, and `data.word_timestamps` carries word-level timing data for the spoken text when HeyGen returns it.","example":{"data":{"audio_url":"https://example.invalid/heygen/starfish/speech.mp3","duration":12.5,"request_id":"018f2c7a-4b1e-7c3d-9a05-6e2f8b41d0c9"}}}}}}}}}},"components":{"schemas":{"HeyGenSpeechData":{"description":"Payload of a successful HeyGen text-to-speech response","properties":{"audio_url":{"description":"URL of the generated audio file","type":"string"},"duration":{"description":"Duration of the audio in seconds","format":"double","type":"number"},"request_id":{"description":"Unique identifier for this generation request","type":"string"},"word_timestamps":{"description":"Word-level timing data","items":{"$ref":"#/components/schemas/HeyGenWordTimestamp"},"type":"array"}},"type":"object"},"HeyGenSpeechResponse":{"description":"Response envelope for HeyGen text-to-speech","properties":{"data":{"$ref":"#/components/schemas/HeyGenSpeechData"}},"type":"object"},"HeyGenWordTimestamp":{"description":"Word-level timing data from TTS generation","properties":{"end":{"description":"End time in seconds","format":"double","type":"number"},"start":{"description":"Start time in seconds","format":"double","type":"number"},"word":{"description":"The word","type":"string"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"heygen/starfish","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/recraft/recraftv2.json b/router-schemas/recraft/recraftv2.json index 9f399a643..3dae0a508 100644 --- a/router-schemas/recraft/recraftv2.json +++ b/router-schemas/recraft/recraftv2.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"recraft/recraftv2","description":"The request body Comfy Router accepts for the model \"recraft/recraftv2\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"73390c432ccc"},"paths":{"/v2/models/recraft/recraftv2":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv2 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with its URL at `data[].url` and Recraft's identifier at `data[].image_id`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image","type":"string"}},"type":"object"},"type":"array"}},"required":["created","credits","data"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv2","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"recraft/recraftv2","description":"The request body Comfy Router accepts for the model \"recraft/recraftv2\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"ed94c85c3b0d"},"paths":{"/v2/models/recraft/recraftv2":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv2 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate. Recraft accepts 1-6.","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"response_format":{"$ref":"#/components/schemas/RecraftResponseFormat"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with Recraft's identifier at `data[].image_id` and the image itself at `data[].url` — or, when the request set `response_format: b64_json`, inline at `data[].b64_json` with no `url`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`)","type":"string"},"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image (present when `response_format` is `url`, the default)","type":"string"}},"type":"object"},"type":"array"},"style_id":{"description":"The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests.","type":"string"}},"required":["created","credits","data"],"type":"object"},"RecraftResponseFormat":{"enum":["url","b64_json"],"type":"string"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv2","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/recraft/recraftv3.json b/router-schemas/recraft/recraftv3.json index c98558e87..ce059af9e 100644 --- a/router-schemas/recraft/recraftv3.json +++ b/router-schemas/recraft/recraftv3.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"recraft/recraftv3","description":"The request body Comfy Router accepts for the model \"recraft/recraftv3\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"73390c432ccc"},"paths":{"/v2/models/recraft/recraftv3":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv3 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with its URL at `data[].url` and Recraft's identifier at `data[].image_id`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image","type":"string"}},"type":"object"},"type":"array"}},"required":["created","credits","data"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv3","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"recraft/recraftv3","description":"The request body Comfy Router accepts for the model \"recraft/recraftv3\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"ed94c85c3b0d"},"paths":{"/v2/models/recraft/recraftv3":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv3 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate. Recraft accepts 1-6.","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"response_format":{"$ref":"#/components/schemas/RecraftResponseFormat"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with Recraft's identifier at `data[].image_id` and the image itself at `data[].url` — or, when the request set `response_format: b64_json`, inline at `data[].b64_json` with no `url`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`)","type":"string"},"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image (present when `response_format` is `url`, the default)","type":"string"}},"type":"object"},"type":"array"},"style_id":{"description":"The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests.","type":"string"}},"required":["created","credits","data"],"type":"object"},"RecraftResponseFormat":{"enum":["url","b64_json"],"type":"string"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv3","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/recraft/recraftv4.json b/router-schemas/recraft/recraftv4.json index f20688751..9b5e18a69 100644 --- a/router-schemas/recraft/recraftv4.json +++ b/router-schemas/recraft/recraftv4.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"recraft/recraftv4","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"73390c432ccc"},"paths":{"/v2/models/recraft/recraftv4":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with its URL at `data[].url` and Recraft's identifier at `data[].image_id`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image","type":"string"}},"type":"object"},"type":"array"}},"required":["created","credits","data"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"recraft/recraftv4","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"ed94c85c3b0d"},"paths":{"/v2/models/recraft/recraftv4":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate. Recraft accepts 1-6.","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"response_format":{"$ref":"#/components/schemas/RecraftResponseFormat"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with Recraft's identifier at `data[].image_id` and the image itself at `data[].url` — or, when the request set `response_format: b64_json`, inline at `data[].b64_json` with no `url`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`)","type":"string"},"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image (present when `response_format` is `url`, the default)","type":"string"}},"type":"object"},"type":"array"},"style_id":{"description":"The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests.","type":"string"}},"required":["created","credits","data"],"type":"object"},"RecraftResponseFormat":{"enum":["url","b64_json"],"type":"string"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/recraft/recraftv4_1.json b/router-schemas/recraft/recraftv4_1.json index a82e12966..c1589ccf0 100644 --- a/router-schemas/recraft/recraftv4_1.json +++ b/router-schemas/recraft/recraftv4_1.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_1","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_1\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"73390c432ccc"},"paths":{"/v2/models/recraft/recraftv4_1":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_1 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with its URL at `data[].url` and Recraft's identifier at `data[].image_id`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image","type":"string"}},"type":"object"},"type":"array"}},"required":["created","credits","data"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_1","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_1","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_1\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"ed94c85c3b0d"},"paths":{"/v2/models/recraft/recraftv4_1":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_1 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate. Recraft accepts 1-6.","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"response_format":{"$ref":"#/components/schemas/RecraftResponseFormat"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with Recraft's identifier at `data[].image_id` and the image itself at `data[].url` — or, when the request set `response_format: b64_json`, inline at `data[].b64_json` with no `url`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`)","type":"string"},"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image (present when `response_format` is `url`, the default)","type":"string"}},"type":"object"},"type":"array"},"style_id":{"description":"The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests.","type":"string"}},"required":["created","credits","data"],"type":"object"},"RecraftResponseFormat":{"enum":["url","b64_json"],"type":"string"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_1","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/recraft/recraftv4_1_pro.json b/router-schemas/recraft/recraftv4_1_pro.json index b222c0ca6..f095365cd 100644 --- a/router-schemas/recraft/recraftv4_1_pro.json +++ b/router-schemas/recraft/recraftv4_1_pro.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_1_pro","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_1_pro\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"73390c432ccc"},"paths":{"/v2/models/recraft/recraftv4_1_pro":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_1_pro synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with its URL at `data[].url` and Recraft's identifier at `data[].image_id`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image","type":"string"}},"type":"object"},"type":"array"}},"required":["created","credits","data"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_1_pro","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_1_pro","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_1_pro\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"ed94c85c3b0d"},"paths":{"/v2/models/recraft/recraftv4_1_pro":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_1_pro synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate. Recraft accepts 1-6.","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"response_format":{"$ref":"#/components/schemas/RecraftResponseFormat"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with Recraft's identifier at `data[].image_id` and the image itself at `data[].url` — or, when the request set `response_format: b64_json`, inline at `data[].b64_json` with no `url`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`)","type":"string"},"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image (present when `response_format` is `url`, the default)","type":"string"}},"type":"object"},"type":"array"},"style_id":{"description":"The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests.","type":"string"}},"required":["created","credits","data"],"type":"object"},"RecraftResponseFormat":{"enum":["url","b64_json"],"type":"string"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_1_pro","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/recraft/recraftv4_1_pro_vector.json b/router-schemas/recraft/recraftv4_1_pro_vector.json index 479b37115..0aedc6c43 100644 --- a/router-schemas/recraft/recraftv4_1_pro_vector.json +++ b/router-schemas/recraft/recraftv4_1_pro_vector.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_1_pro_vector","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_1_pro_vector\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"73390c432ccc"},"paths":{"/v2/models/recraft/recraftv4_1_pro_vector":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_1_pro_vector synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with its URL at `data[].url` and Recraft's identifier at `data[].image_id`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image","type":"string"}},"type":"object"},"type":"array"}},"required":["created","credits","data"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_1_pro_vector","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_1_pro_vector","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_1_pro_vector\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"ed94c85c3b0d"},"paths":{"/v2/models/recraft/recraftv4_1_pro_vector":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_1_pro_vector synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate. Recraft accepts 1-6.","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"response_format":{"$ref":"#/components/schemas/RecraftResponseFormat"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with Recraft's identifier at `data[].image_id` and the image itself at `data[].url` — or, when the request set `response_format: b64_json`, inline at `data[].b64_json` with no `url`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`)","type":"string"},"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image (present when `response_format` is `url`, the default)","type":"string"}},"type":"object"},"type":"array"},"style_id":{"description":"The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests.","type":"string"}},"required":["created","credits","data"],"type":"object"},"RecraftResponseFormat":{"enum":["url","b64_json"],"type":"string"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_1_pro_vector","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/recraft/recraftv4_1_utility.json b/router-schemas/recraft/recraftv4_1_utility.json index 572a105a2..d29697689 100644 --- a/router-schemas/recraft/recraftv4_1_utility.json +++ b/router-schemas/recraft/recraftv4_1_utility.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_1_utility","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_1_utility\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"73390c432ccc"},"paths":{"/v2/models/recraft/recraftv4_1_utility":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_1_utility synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with its URL at `data[].url` and Recraft's identifier at `data[].image_id`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image","type":"string"}},"type":"object"},"type":"array"}},"required":["created","credits","data"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_1_utility","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_1_utility","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_1_utility\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"ed94c85c3b0d"},"paths":{"/v2/models/recraft/recraftv4_1_utility":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_1_utility synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate. Recraft accepts 1-6.","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"response_format":{"$ref":"#/components/schemas/RecraftResponseFormat"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with Recraft's identifier at `data[].image_id` and the image itself at `data[].url` — or, when the request set `response_format: b64_json`, inline at `data[].b64_json` with no `url`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`)","type":"string"},"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image (present when `response_format` is `url`, the default)","type":"string"}},"type":"object"},"type":"array"},"style_id":{"description":"The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests.","type":"string"}},"required":["created","credits","data"],"type":"object"},"RecraftResponseFormat":{"enum":["url","b64_json"],"type":"string"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_1_utility","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/recraft/recraftv4_1_utility_pro.json b/router-schemas/recraft/recraftv4_1_utility_pro.json index d2b6ba79f..160fb812e 100644 --- a/router-schemas/recraft/recraftv4_1_utility_pro.json +++ b/router-schemas/recraft/recraftv4_1_utility_pro.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_1_utility_pro","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_1_utility_pro\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"73390c432ccc"},"paths":{"/v2/models/recraft/recraftv4_1_utility_pro":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_1_utility_pro synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with its URL at `data[].url` and Recraft's identifier at `data[].image_id`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image","type":"string"}},"type":"object"},"type":"array"}},"required":["created","credits","data"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_1_utility_pro","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_1_utility_pro","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_1_utility_pro\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"ed94c85c3b0d"},"paths":{"/v2/models/recraft/recraftv4_1_utility_pro":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_1_utility_pro synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate. Recraft accepts 1-6.","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"response_format":{"$ref":"#/components/schemas/RecraftResponseFormat"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with Recraft's identifier at `data[].image_id` and the image itself at `data[].url` — or, when the request set `response_format: b64_json`, inline at `data[].b64_json` with no `url`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`)","type":"string"},"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image (present when `response_format` is `url`, the default)","type":"string"}},"type":"object"},"type":"array"},"style_id":{"description":"The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests.","type":"string"}},"required":["created","credits","data"],"type":"object"},"RecraftResponseFormat":{"enum":["url","b64_json"],"type":"string"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_1_utility_pro","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/recraft/recraftv4_1_utility_pro_vector.json b/router-schemas/recraft/recraftv4_1_utility_pro_vector.json index 7e39f2a6c..e3cc70c0e 100644 --- a/router-schemas/recraft/recraftv4_1_utility_pro_vector.json +++ b/router-schemas/recraft/recraftv4_1_utility_pro_vector.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_1_utility_pro_vector","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_1_utility_pro_vector\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"73390c432ccc"},"paths":{"/v2/models/recraft/recraftv4_1_utility_pro_vector":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_1_utility_pro_vector synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with its URL at `data[].url` and Recraft's identifier at `data[].image_id`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image","type":"string"}},"type":"object"},"type":"array"}},"required":["created","credits","data"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_1_utility_pro_vector","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_1_utility_pro_vector","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_1_utility_pro_vector\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"ed94c85c3b0d"},"paths":{"/v2/models/recraft/recraftv4_1_utility_pro_vector":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_1_utility_pro_vector synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate. Recraft accepts 1-6.","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"response_format":{"$ref":"#/components/schemas/RecraftResponseFormat"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with Recraft's identifier at `data[].image_id` and the image itself at `data[].url` — or, when the request set `response_format: b64_json`, inline at `data[].b64_json` with no `url`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`)","type":"string"},"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image (present when `response_format` is `url`, the default)","type":"string"}},"type":"object"},"type":"array"},"style_id":{"description":"The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests.","type":"string"}},"required":["created","credits","data"],"type":"object"},"RecraftResponseFormat":{"enum":["url","b64_json"],"type":"string"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_1_utility_pro_vector","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/recraft/recraftv4_1_utility_vector.json b/router-schemas/recraft/recraftv4_1_utility_vector.json index fd2402eae..da81324a6 100644 --- a/router-schemas/recraft/recraftv4_1_utility_vector.json +++ b/router-schemas/recraft/recraftv4_1_utility_vector.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_1_utility_vector","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_1_utility_vector\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"73390c432ccc"},"paths":{"/v2/models/recraft/recraftv4_1_utility_vector":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_1_utility_vector synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with its URL at `data[].url` and Recraft's identifier at `data[].image_id`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image","type":"string"}},"type":"object"},"type":"array"}},"required":["created","credits","data"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_1_utility_vector","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_1_utility_vector","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_1_utility_vector\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"ed94c85c3b0d"},"paths":{"/v2/models/recraft/recraftv4_1_utility_vector":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_1_utility_vector synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate. Recraft accepts 1-6.","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"response_format":{"$ref":"#/components/schemas/RecraftResponseFormat"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with Recraft's identifier at `data[].image_id` and the image itself at `data[].url` — or, when the request set `response_format: b64_json`, inline at `data[].b64_json` with no `url`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`)","type":"string"},"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image (present when `response_format` is `url`, the default)","type":"string"}},"type":"object"},"type":"array"},"style_id":{"description":"The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests.","type":"string"}},"required":["created","credits","data"],"type":"object"},"RecraftResponseFormat":{"enum":["url","b64_json"],"type":"string"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_1_utility_vector","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/recraft/recraftv4_1_vector.json b/router-schemas/recraft/recraftv4_1_vector.json index 082a40cb0..2aaa960a3 100644 --- a/router-schemas/recraft/recraftv4_1_vector.json +++ b/router-schemas/recraft/recraftv4_1_vector.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_1_vector","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_1_vector\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"73390c432ccc"},"paths":{"/v2/models/recraft/recraftv4_1_vector":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_1_vector synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with its URL at `data[].url` and Recraft's identifier at `data[].image_id`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image","type":"string"}},"type":"object"},"type":"array"}},"required":["created","credits","data"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_1_vector","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_1_vector","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_1_vector\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"ed94c85c3b0d"},"paths":{"/v2/models/recraft/recraftv4_1_vector":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_1_vector synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate. Recraft accepts 1-6.","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"response_format":{"$ref":"#/components/schemas/RecraftResponseFormat"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with Recraft's identifier at `data[].image_id` and the image itself at `data[].url` — or, when the request set `response_format: b64_json`, inline at `data[].b64_json` with no `url`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`)","type":"string"},"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image (present when `response_format` is `url`, the default)","type":"string"}},"type":"object"},"type":"array"},"style_id":{"description":"The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests.","type":"string"}},"required":["created","credits","data"],"type":"object"},"RecraftResponseFormat":{"enum":["url","b64_json"],"type":"string"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_1_vector","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/recraft/recraftv4_pro.json b/router-schemas/recraft/recraftv4_pro.json index dc8995030..a378919b9 100644 --- a/router-schemas/recraft/recraftv4_pro.json +++ b/router-schemas/recraft/recraftv4_pro.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_pro","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_pro\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"73390c432ccc"},"paths":{"/v2/models/recraft/recraftv4_pro":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_pro synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with its URL at `data[].url` and Recraft's identifier at `data[].image_id`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image","type":"string"}},"type":"object"},"type":"array"}},"required":["created","credits","data"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_pro","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_pro","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_pro\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"ed94c85c3b0d"},"paths":{"/v2/models/recraft/recraftv4_pro":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_pro synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate. Recraft accepts 1-6.","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"response_format":{"$ref":"#/components/schemas/RecraftResponseFormat"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with Recraft's identifier at `data[].image_id` and the image itself at `data[].url` — or, when the request set `response_format: b64_json`, inline at `data[].b64_json` with no `url`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`)","type":"string"},"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image (present when `response_format` is `url`, the default)","type":"string"}},"type":"object"},"type":"array"},"style_id":{"description":"The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests.","type":"string"}},"required":["created","credits","data"],"type":"object"},"RecraftResponseFormat":{"enum":["url","b64_json"],"type":"string"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_pro","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/recraft/recraftv4_styles.json b/router-schemas/recraft/recraftv4_styles.json index 136432068..bc7a9f1ae 100644 --- a/router-schemas/recraft/recraftv4_styles.json +++ b/router-schemas/recraft/recraftv4_styles.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_styles","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_styles\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"73390c432ccc"},"paths":{"/v2/models/recraft/recraftv4_styles":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_styles synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with its URL at `data[].url` and Recraft's identifier at `data[].image_id`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image","type":"string"}},"type":"object"},"type":"array"}},"required":["created","credits","data"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_styles","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_styles","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_styles\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"ed94c85c3b0d"},"paths":{"/v2/models/recraft/recraftv4_styles":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_styles synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate. Recraft accepts 1-6.","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"response_format":{"$ref":"#/components/schemas/RecraftResponseFormat"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with Recraft's identifier at `data[].image_id` and the image itself at `data[].url` — or, when the request set `response_format: b64_json`, inline at `data[].b64_json` with no `url`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`)","type":"string"},"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image (present when `response_format` is `url`, the default)","type":"string"}},"type":"object"},"type":"array"},"style_id":{"description":"The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests.","type":"string"}},"required":["created","credits","data"],"type":"object"},"RecraftResponseFormat":{"enum":["url","b64_json"],"type":"string"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_styles","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/recraft/recraftv4_styles_pro.json b/router-schemas/recraft/recraftv4_styles_pro.json index aa6aa97e5..2d0ddf8e6 100644 --- a/router-schemas/recraft/recraftv4_styles_pro.json +++ b/router-schemas/recraft/recraftv4_styles_pro.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_styles_pro","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_styles_pro\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"73390c432ccc"},"paths":{"/v2/models/recraft/recraftv4_styles_pro":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_styles_pro synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with its URL at `data[].url` and Recraft's identifier at `data[].image_id`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image","type":"string"}},"type":"object"},"type":"array"}},"required":["created","credits","data"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_styles_pro","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_styles_pro","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_styles_pro\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"ed94c85c3b0d"},"paths":{"/v2/models/recraft/recraftv4_styles_pro":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_styles_pro synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate. Recraft accepts 1-6.","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"response_format":{"$ref":"#/components/schemas/RecraftResponseFormat"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with Recraft's identifier at `data[].image_id` and the image itself at `data[].url` — or, when the request set `response_format: b64_json`, inline at `data[].b64_json` with no `url`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`)","type":"string"},"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image (present when `response_format` is `url`, the default)","type":"string"}},"type":"object"},"type":"array"},"style_id":{"description":"The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests.","type":"string"}},"required":["created","credits","data"],"type":"object"},"RecraftResponseFormat":{"enum":["url","b64_json"],"type":"string"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_styles_pro","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/recraft/recraftv4_styles_pro_vector.json b/router-schemas/recraft/recraftv4_styles_pro_vector.json index 46a947bc8..ac70ca0b0 100644 --- a/router-schemas/recraft/recraftv4_styles_pro_vector.json +++ b/router-schemas/recraft/recraftv4_styles_pro_vector.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_styles_pro_vector","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_styles_pro_vector\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"73390c432ccc"},"paths":{"/v2/models/recraft/recraftv4_styles_pro_vector":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_styles_pro_vector synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with its URL at `data[].url` and Recraft's identifier at `data[].image_id`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image","type":"string"}},"type":"object"},"type":"array"}},"required":["created","credits","data"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_styles_pro_vector","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_styles_pro_vector","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_styles_pro_vector\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"ed94c85c3b0d"},"paths":{"/v2/models/recraft/recraftv4_styles_pro_vector":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_styles_pro_vector synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate. Recraft accepts 1-6.","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"response_format":{"$ref":"#/components/schemas/RecraftResponseFormat"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with Recraft's identifier at `data[].image_id` and the image itself at `data[].url` — or, when the request set `response_format: b64_json`, inline at `data[].b64_json` with no `url`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`)","type":"string"},"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image (present when `response_format` is `url`, the default)","type":"string"}},"type":"object"},"type":"array"},"style_id":{"description":"The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests.","type":"string"}},"required":["created","credits","data"],"type":"object"},"RecraftResponseFormat":{"enum":["url","b64_json"],"type":"string"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_styles_pro_vector","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/recraft/recraftv4_styles_vector.json b/router-schemas/recraft/recraftv4_styles_vector.json index e5aba83f2..07e6165c7 100644 --- a/router-schemas/recraft/recraftv4_styles_vector.json +++ b/router-schemas/recraft/recraftv4_styles_vector.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_styles_vector","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_styles_vector\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"73390c432ccc"},"paths":{"/v2/models/recraft/recraftv4_styles_vector":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_styles_vector synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with its URL at `data[].url` and Recraft's identifier at `data[].image_id`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image","type":"string"}},"type":"object"},"type":"array"}},"required":["created","credits","data"],"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_styles_vector","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"recraft/recraftv4_styles_vector","description":"The request body Comfy Router accepts for the model \"recraft/recraftv4_styles_vector\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"ed94c85c3b0d"},"paths":{"/v2/models/recraft/recraftv4_styles_vector":{"post":{"operationId":"runRouterModel","summary":"Run recraft/recraftv4_styles_vector synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"The Recraft image-generation fields, shared by the v1 `POST /proxy/recraft/image_generation` request body and the Comfy Router input schema for the `recraft/*` models. See the note above this component for why the two surfaces share properties but not `required`.\n`required` here is the ROUTER-SAFE floor: `model` is absent from it because Router writes the path's model into the body after routervalidate.Guard has already validated the caller's bytes. The v1 wrapper `RecraftImageGenerationRequest` re-adds it.","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"controls":{"description":"The controls for the generated image","properties":{"artistic_level":{"description":"Defines artistic tone of your image. At a simple level, the person looks straight at the camera in a static and clean style. Dynamic and eccentric levels introduce movement and creativity.","maximum":5,"minimum":0,"nullable":true,"type":"integer"},"background_color":{"$ref":"#/components/schemas/RGBColor"},"colors":{"description":"An array of preferable colors","items":{"$ref":"#/components/schemas/RGBColor"},"type":"array"},"no_text":{"description":"Do not embed text layouts","type":"boolean"}},"type":"object"},"model":{"description":"The model to use for generation (e.g., \"recraftv3\"). This field is NOT constrained to an enum: the proxy forwards whatever the caller sends. The spellings Comfy ships — the set Comfy Router addresses as `recraft/\u003cmodel\u003e` — are recraftv2, recraftv3, recraftv4, recraftv4_pro, recraftv4_1, recraftv4_1_utility, recraftv4_1_pro, recraftv4_1_utility_pro, recraftv4_styles, recraftv4_styles_pro, recraftv4_1_vector, recraftv4_1_utility_vector, recraftv4_1_pro_vector, recraftv4_1_utility_pro_vector, recraftv4_styles_vector and recraftv4_styles_pro_vector. They are written out here rather than named by reference because the RecraftGenerationModel component that declares them is `$ref`-ed by nothing and is therefore pruned from the spec served at GET /openapi, so a pointer to it would dangle in the served document. The four `recraftv4_styles*` spellings additionally require `style_id` — see that field.","nullable":true,"type":"string"},"n":{"description":"The number of images to generate. Recraft accepts 1-6.","maximum":6,"minimum":1,"type":"integer"},"prompt":{"description":"The text prompt describing the image to generate","type":"string"},"response_format":{"$ref":"#/components/schemas/RecraftResponseFormat"},"size":{"description":"The size of the generated image (e.g., \"1024x1024\")","type":"string"},"style":{"description":"The style to apply to the generated image (e.g., \"digital_illustration\")","type":"string"},"style_id":{"description":"The style ID to apply to the generated image (e.g., \"123e4567-e89b-12d3-a456-426614174000\"). If style_id is provided, style should not be provided. REQUIRED by the four `recraftv4_styles*` models: Recraft rejects those without a style_id or style reference. Mint one with `POST /proxy/recraft/styles`, which this same proxy serves under the same credentials. Nothing on this route enforces the pairing — the body is forwarded to Recraft unchanged, so a `recraftv4_styles*` call without it reaches the partner and comes back 4xx.","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/RecraftImageGenerationResponse"}],"description":"Comfy Router output schema for the Recraft generation models: Recraft's own image-generation response, forwarded unchanged. The operation is direct-return (`routerresult/classification.go` classifies `recraft /image_generation` as ReturnModeDirect), so the body a caller receives is this finished document from the one call — there is no task handle and no poll.\nThe generated images are in `data`, each with Recraft's identifier at `data[].image_id` and the image itself at `data[].url` — or, when the request set `response_format: b64_json`, inline at `data[].b64_json` with no `url`. `created` is the generation's Unix timestamp, and `credits` is Recraft's own cost figure for the call — Recraft's number, not the Comfy charge.","example":{"created":1767225600,"credits":1,"data":[{"image_id":"3f7a1b28-5c0d-4e91-8a6f-1b2c3d4e5f60","url":"https://example.invalid/recraft/recraftv3/generated.png"}]}}}}}}}}},"components":{"schemas":{"RGBColor":{"description":"RGB color values","example":{"rgb":[255,0,0]},"properties":{"rgb":{"items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["rgb"],"type":"object"},"RecraftImageGenerationResponse":{"description":"Response from the Recraft image generation API.","properties":{"created":{"description":"Unix timestamp when the generation was created","type":"integer"},"credits":{"description":"Number of credits used for the generation","type":"integer"},"data":{"description":"Array of generated image information","items":{"properties":{"b64_json":{"description":"Base64-encoded image data (present instead of `url` when the request set `response_format: b64_json`)","type":"string"},"image_id":{"description":"Unique identifier for the generated image","type":"string"},"url":{"description":"URL to access the generated image (present when `response_format` is `url`, the default)","type":"string"}},"type":"object"},"type":"array"},"style_id":{"description":"The resolved style id, returned by Recraft when style references are used (notably required-input models recraftv4_styles*); reusable as `style_id` in later requests.","type":"string"}},"required":["created","credits","data"],"type":"object"},"RecraftResponseFormat":{"enum":["url","b64_json"],"type":"string"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"recraft/recraftv4_styles_vector","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/vertexai/imagen-3.0-fast-generate-001.json b/router-schemas/vertexai/imagen-3.0-fast-generate-001.json index 77187290f..a7cb86c7d 100644 --- a/router-schemas/vertexai/imagen-3.0-fast-generate-001.json +++ b/router-schemas/vertexai/imagen-3.0-fast-generate-001.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"vertexai/imagen-3.0-fast-generate-001","description":"The request body Comfy Router accepts for the model \"vertexai/imagen-3.0-fast-generate-001\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"f7c5c24423f4"},"paths":{"/v2/models/vertexai/imagen-3.0-fast-generate-001":{"post":{"operationId":"runRouterModel","summary":"Run vertexai/imagen-3.0-fast-generate-001 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"example":{"instances":[{"prompt":"A single red maple leaf on a plain white background."}],"parameters":{"sampleCount":1}},"properties":{"instances":{"items":{"$ref":"#/components/schemas/ImagenImageGenerationInstance"},"minItems":1,"type":"array"},"parameters":{"$ref":"#/components/schemas/ImagenImageGenerationParameters"}},"required":["instances"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ImagenGenerateImageResponse"}],"description":"Comfy Router output schema for the Vertex AI Imagen 3.0 models: the Vertex AI `:predict` response, forwarded unchanged. The operation is DIRECT-RETURN — `routerresult/classification.go` records `{provider: vertexai, endpoint: /imagen/:model}` as `ReturnModeDirect`, metering the original 200 through the synchronous `TrackUsage`, registering no task checker and declaring no status route — so the body a caller receives is the finished generation from the one call. There is no task handle and nothing to poll.\nThis is NOT the document the Gemini ids on the sibling `/proxy/vertexai/gemini/{model}` route answer, and mixing them up is the one mistake this page exists to prevent. The generated images are in `predictions`, one element per image, with the bytes at `predictions[].bytesBase64Encoded` and the media type at `predictions[].mimeType`. There is no `candidates[]`, no `content.parts[]` and no `inlineData` anywhere in an Imagen response.\nRead the ELEMENT field, not the `predictions` container. `ImagenImagePrediction` also carries `prompt`, which is the ENHANCED or rewritten prompt Vertex used rather than output — so an element carrying only a `prompt` is a non-empty array holding no image, exactly as a Kling `videos[]` element with no `url` is.\nThe image arrives INLINE as base64 and Router does not re-host it: there is no partner URL in this document to rewrite, which is also why `routerresult/classification.go` sizes the row with `BinaryResultMaxBytes` rather than the JSON default. This component describes that inline shape and only that shape: `ImagenImagePrediction` declares `mimeType`, `prompt` and `bytesBase64Encoded` and no object reference of any kind, so a request that sets `storageUri` receives a document this schema does not model — treat the parameter as unsupported on this route. `sampleCount` governs how many elements `predictions` carries.\nThe example's `bytesBase64Encoded` is the PLACEHOLDER `PGJhc2U2ND4=`, which decodes to the literal text `\u003cbase64\u003e` — a real image would be megabytes, and a real provider response does not belong in a published spec. It is spelled as valid base64 rather than as a bare `\u003cbase64\u003e` marker because `ImagenImagePrediction.bytesBase64Encoded` declares `format: byte`, which this document's own example validation enforces.","example":{"predictions":[{"bytesBase64Encoded":"PGJhc2U2ND4=","mimeType":"image/png","prompt":"A lighthouse at the edge of the harbour at dawn, warm low sun"}]}}}}}}}}},"components":{"schemas":{"ImagenGenerateImageResponse":{"properties":{"predictions":{"items":{"$ref":"#/components/schemas/ImagenImagePrediction"},"type":"array"}},"type":"object"},"ImagenImageGenerationInstance":{"properties":{"prompt":{"description":"Text prompt for image generation","type":"string"}},"required":["prompt"],"type":"object"},"ImagenImageGenerationParameters":{"properties":{"addWatermark":{"type":"boolean"},"aspectRatio":{"enum":["1:1","9:16","16:9","3:4","4:3"],"type":"string"},"enhancePrompt":{"type":"boolean"},"includeRaiReason":{"type":"boolean"},"includeSafetyAttributes":{"type":"boolean"},"outputOptions":{"$ref":"#/components/schemas/ImagenOutputOptions"},"personGeneration":{"enum":["dont_allow","allow_adult","allow_all"],"type":"string"},"safetySetting":{"enum":["block_most","block_some","block_few","block_fewest"],"type":"string"},"sampleCount":{"maximum":4,"minimum":1,"type":"integer"},"seed":{"format":"uint32","type":"integer"},"storageUri":{"type":"string"}},"type":"object"},"ImagenImagePrediction":{"properties":{"bytesBase64Encoded":{"description":"Base64-encoded image content","format":"byte","type":"string"},"mimeType":{"description":"MIME type of the generated image","type":"string"},"prompt":{"description":"Enhanced or rewritten prompt used to generate this image","type":"string"}},"type":"object"},"ImagenOutputOptions":{"properties":{"compressionQuality":{"maximum":100,"minimum":0,"type":"integer"},"mimeType":{"enum":["image/png","image/jpeg"],"type":"string"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"vertexai/imagen-3.0-fast-generate-001","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"vertexai/imagen-3.0-fast-generate-001","description":"The request body Comfy Router accepts for the model \"vertexai/imagen-3.0-fast-generate-001\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"0cd04bca58ed"},"paths":{"/v2/models/vertexai/imagen-3.0-fast-generate-001":{"post":{"operationId":"runRouterModel","summary":"Run vertexai/imagen-3.0-fast-generate-001 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"example":{"instances":[{"prompt":"A single red maple leaf on a plain white background."}],"parameters":{"sampleCount":1}},"properties":{"instances":{"items":{"$ref":"#/components/schemas/ImagenImageGenerationInstance"},"minItems":1,"type":"array"},"parameters":{"$ref":"#/components/schemas/ImagenImageGenerationParameters"}},"required":["instances"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ImagenGenerateImageResponse"}],"description":"Comfy Router output schema for the Vertex AI Imagen 3.0 models: the Vertex AI `:predict` response, forwarded unchanged. The operation is DIRECT-RETURN — `routerresult/classification.go` records `{provider: vertexai, endpoint: /imagen/:model}` as `ReturnModeDirect`, metering the original 200 through the synchronous `TrackUsage`, registering no task checker and declaring no status route — so the body a caller receives is the finished generation from the one call. There is no task handle and nothing to poll.\nThis is NOT the document the Gemini ids on the sibling `/proxy/vertexai/gemini/{model}` route answer, and mixing them up is the one mistake this page exists to prevent. The generated images are in `predictions`, one element per image, with the bytes at `predictions[].bytesBase64Encoded` and the media type at `predictions[].mimeType`. There is no `candidates[]`, no `content.parts[]` and no `inlineData` anywhere in an Imagen response.\nRead the ELEMENT field, not the `predictions` container. `ImagenImagePrediction` also carries `prompt`, which is the ENHANCED or rewritten prompt Vertex used rather than output — so an element carrying only a `prompt` is a non-empty array holding no image, exactly as a Kling `videos[]` element with no `url` is.\nThe image arrives INLINE as base64 and Router does not re-host it: there is no partner URL in this document to rewrite, which is also why `routerresult/classification.go` sizes the row with `BinaryResultMaxBytes` rather than the JSON default. This component describes that inline shape and only that shape: `ImagenImagePrediction` declares `mimeType`, `prompt` and `bytesBase64Encoded` and no object reference of any kind, so a request that sets `storageUri` receives a document this schema does not model — treat the parameter as unsupported on this route. `sampleCount` governs how many elements `predictions` carries.\nThe example's `bytesBase64Encoded` is the PLACEHOLDER `PGJhc2U2ND4=`, which decodes to the literal text `\u003cbase64\u003e` — a real image would be megabytes, and a real provider response does not belong in a published spec. It is spelled as valid base64 rather than as a bare `\u003cbase64\u003e` marker because `ImagenImagePrediction.bytesBase64Encoded` declares `format: byte`, which this document's own example validation enforces.","example":{"predictions":[{"bytesBase64Encoded":"PGJhc2U2ND4=","mimeType":"image/png","prompt":"A lighthouse at the edge of the harbour at dawn, warm low sun"}]}}}}}}}}},"components":{"schemas":{"ImagenGenerateImageResponse":{"properties":{"predictions":{"items":{"$ref":"#/components/schemas/ImagenImagePrediction"},"type":"array"}},"type":"object"},"ImagenImageGenerationInstance":{"properties":{"prompt":{"description":"Text prompt for image generation","type":"string"}},"required":["prompt"],"type":"object"},"ImagenImageGenerationParameters":{"properties":{"addWatermark":{"type":"boolean"},"aspectRatio":{"enum":["1:1","9:16","16:9","3:4","4:3"],"type":"string"},"enhancePrompt":{"type":"boolean"},"includeRaiReason":{"type":"boolean"},"includeSafetyAttributes":{"type":"boolean"},"outputOptions":{"$ref":"#/components/schemas/ImagenOutputOptions"},"personGeneration":{"enum":["dont_allow","allow_adult","allow_all"],"type":"string"},"safetySetting":{"enum":["block_most","block_some","block_few","block_fewest"],"type":"string"},"sampleCount":{"default":4,"maximum":4,"minimum":1,"type":"integer"},"seed":{"format":"uint32","type":"integer"},"storageUri":{"type":"string"}},"type":"object"},"ImagenImagePrediction":{"properties":{"bytesBase64Encoded":{"description":"Base64-encoded image content","format":"byte","type":"string"},"mimeType":{"description":"MIME type of the generated image","type":"string"},"prompt":{"description":"Enhanced or rewritten prompt used to generate this image","type":"string"}},"type":"object"},"ImagenOutputOptions":{"properties":{"compressionQuality":{"maximum":100,"minimum":0,"type":"integer"},"mimeType":{"enum":["image/png","image/jpeg"],"type":"string"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"vertexai/imagen-3.0-fast-generate-001","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/vertexai/imagen-3.0-generate-001.json b/router-schemas/vertexai/imagen-3.0-generate-001.json index 513ce7506..3bfcca919 100644 --- a/router-schemas/vertexai/imagen-3.0-generate-001.json +++ b/router-schemas/vertexai/imagen-3.0-generate-001.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"vertexai/imagen-3.0-generate-001","description":"The request body Comfy Router accepts for the model \"vertexai/imagen-3.0-generate-001\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"f7c5c24423f4"},"paths":{"/v2/models/vertexai/imagen-3.0-generate-001":{"post":{"operationId":"runRouterModel","summary":"Run vertexai/imagen-3.0-generate-001 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"example":{"instances":[{"prompt":"A single red maple leaf on a plain white background."}],"parameters":{"sampleCount":1}},"properties":{"instances":{"items":{"$ref":"#/components/schemas/ImagenImageGenerationInstance"},"minItems":1,"type":"array"},"parameters":{"$ref":"#/components/schemas/ImagenImageGenerationParameters"}},"required":["instances"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ImagenGenerateImageResponse"}],"description":"Comfy Router output schema for the Vertex AI Imagen 3.0 models: the Vertex AI `:predict` response, forwarded unchanged. The operation is DIRECT-RETURN — `routerresult/classification.go` records `{provider: vertexai, endpoint: /imagen/:model}` as `ReturnModeDirect`, metering the original 200 through the synchronous `TrackUsage`, registering no task checker and declaring no status route — so the body a caller receives is the finished generation from the one call. There is no task handle and nothing to poll.\nThis is NOT the document the Gemini ids on the sibling `/proxy/vertexai/gemini/{model}` route answer, and mixing them up is the one mistake this page exists to prevent. The generated images are in `predictions`, one element per image, with the bytes at `predictions[].bytesBase64Encoded` and the media type at `predictions[].mimeType`. There is no `candidates[]`, no `content.parts[]` and no `inlineData` anywhere in an Imagen response.\nRead the ELEMENT field, not the `predictions` container. `ImagenImagePrediction` also carries `prompt`, which is the ENHANCED or rewritten prompt Vertex used rather than output — so an element carrying only a `prompt` is a non-empty array holding no image, exactly as a Kling `videos[]` element with no `url` is.\nThe image arrives INLINE as base64 and Router does not re-host it: there is no partner URL in this document to rewrite, which is also why `routerresult/classification.go` sizes the row with `BinaryResultMaxBytes` rather than the JSON default. This component describes that inline shape and only that shape: `ImagenImagePrediction` declares `mimeType`, `prompt` and `bytesBase64Encoded` and no object reference of any kind, so a request that sets `storageUri` receives a document this schema does not model — treat the parameter as unsupported on this route. `sampleCount` governs how many elements `predictions` carries.\nThe example's `bytesBase64Encoded` is the PLACEHOLDER `PGJhc2U2ND4=`, which decodes to the literal text `\u003cbase64\u003e` — a real image would be megabytes, and a real provider response does not belong in a published spec. It is spelled as valid base64 rather than as a bare `\u003cbase64\u003e` marker because `ImagenImagePrediction.bytesBase64Encoded` declares `format: byte`, which this document's own example validation enforces.","example":{"predictions":[{"bytesBase64Encoded":"PGJhc2U2ND4=","mimeType":"image/png","prompt":"A lighthouse at the edge of the harbour at dawn, warm low sun"}]}}}}}}}}},"components":{"schemas":{"ImagenGenerateImageResponse":{"properties":{"predictions":{"items":{"$ref":"#/components/schemas/ImagenImagePrediction"},"type":"array"}},"type":"object"},"ImagenImageGenerationInstance":{"properties":{"prompt":{"description":"Text prompt for image generation","type":"string"}},"required":["prompt"],"type":"object"},"ImagenImageGenerationParameters":{"properties":{"addWatermark":{"type":"boolean"},"aspectRatio":{"enum":["1:1","9:16","16:9","3:4","4:3"],"type":"string"},"enhancePrompt":{"type":"boolean"},"includeRaiReason":{"type":"boolean"},"includeSafetyAttributes":{"type":"boolean"},"outputOptions":{"$ref":"#/components/schemas/ImagenOutputOptions"},"personGeneration":{"enum":["dont_allow","allow_adult","allow_all"],"type":"string"},"safetySetting":{"enum":["block_most","block_some","block_few","block_fewest"],"type":"string"},"sampleCount":{"maximum":4,"minimum":1,"type":"integer"},"seed":{"format":"uint32","type":"integer"},"storageUri":{"type":"string"}},"type":"object"},"ImagenImagePrediction":{"properties":{"bytesBase64Encoded":{"description":"Base64-encoded image content","format":"byte","type":"string"},"mimeType":{"description":"MIME type of the generated image","type":"string"},"prompt":{"description":"Enhanced or rewritten prompt used to generate this image","type":"string"}},"type":"object"},"ImagenOutputOptions":{"properties":{"compressionQuality":{"maximum":100,"minimum":0,"type":"integer"},"mimeType":{"enum":["image/png","image/jpeg"],"type":"string"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"vertexai/imagen-3.0-generate-001","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"vertexai/imagen-3.0-generate-001","description":"The request body Comfy Router accepts for the model \"vertexai/imagen-3.0-generate-001\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"0cd04bca58ed"},"paths":{"/v2/models/vertexai/imagen-3.0-generate-001":{"post":{"operationId":"runRouterModel","summary":"Run vertexai/imagen-3.0-generate-001 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"example":{"instances":[{"prompt":"A single red maple leaf on a plain white background."}],"parameters":{"sampleCount":1}},"properties":{"instances":{"items":{"$ref":"#/components/schemas/ImagenImageGenerationInstance"},"minItems":1,"type":"array"},"parameters":{"$ref":"#/components/schemas/ImagenImageGenerationParameters"}},"required":["instances"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ImagenGenerateImageResponse"}],"description":"Comfy Router output schema for the Vertex AI Imagen 3.0 models: the Vertex AI `:predict` response, forwarded unchanged. The operation is DIRECT-RETURN — `routerresult/classification.go` records `{provider: vertexai, endpoint: /imagen/:model}` as `ReturnModeDirect`, metering the original 200 through the synchronous `TrackUsage`, registering no task checker and declaring no status route — so the body a caller receives is the finished generation from the one call. There is no task handle and nothing to poll.\nThis is NOT the document the Gemini ids on the sibling `/proxy/vertexai/gemini/{model}` route answer, and mixing them up is the one mistake this page exists to prevent. The generated images are in `predictions`, one element per image, with the bytes at `predictions[].bytesBase64Encoded` and the media type at `predictions[].mimeType`. There is no `candidates[]`, no `content.parts[]` and no `inlineData` anywhere in an Imagen response.\nRead the ELEMENT field, not the `predictions` container. `ImagenImagePrediction` also carries `prompt`, which is the ENHANCED or rewritten prompt Vertex used rather than output — so an element carrying only a `prompt` is a non-empty array holding no image, exactly as a Kling `videos[]` element with no `url` is.\nThe image arrives INLINE as base64 and Router does not re-host it: there is no partner URL in this document to rewrite, which is also why `routerresult/classification.go` sizes the row with `BinaryResultMaxBytes` rather than the JSON default. This component describes that inline shape and only that shape: `ImagenImagePrediction` declares `mimeType`, `prompt` and `bytesBase64Encoded` and no object reference of any kind, so a request that sets `storageUri` receives a document this schema does not model — treat the parameter as unsupported on this route. `sampleCount` governs how many elements `predictions` carries.\nThe example's `bytesBase64Encoded` is the PLACEHOLDER `PGJhc2U2ND4=`, which decodes to the literal text `\u003cbase64\u003e` — a real image would be megabytes, and a real provider response does not belong in a published spec. It is spelled as valid base64 rather than as a bare `\u003cbase64\u003e` marker because `ImagenImagePrediction.bytesBase64Encoded` declares `format: byte`, which this document's own example validation enforces.","example":{"predictions":[{"bytesBase64Encoded":"PGJhc2U2ND4=","mimeType":"image/png","prompt":"A lighthouse at the edge of the harbour at dawn, warm low sun"}]}}}}}}}}},"components":{"schemas":{"ImagenGenerateImageResponse":{"properties":{"predictions":{"items":{"$ref":"#/components/schemas/ImagenImagePrediction"},"type":"array"}},"type":"object"},"ImagenImageGenerationInstance":{"properties":{"prompt":{"description":"Text prompt for image generation","type":"string"}},"required":["prompt"],"type":"object"},"ImagenImageGenerationParameters":{"properties":{"addWatermark":{"type":"boolean"},"aspectRatio":{"enum":["1:1","9:16","16:9","3:4","4:3"],"type":"string"},"enhancePrompt":{"type":"boolean"},"includeRaiReason":{"type":"boolean"},"includeSafetyAttributes":{"type":"boolean"},"outputOptions":{"$ref":"#/components/schemas/ImagenOutputOptions"},"personGeneration":{"enum":["dont_allow","allow_adult","allow_all"],"type":"string"},"safetySetting":{"enum":["block_most","block_some","block_few","block_fewest"],"type":"string"},"sampleCount":{"default":4,"maximum":4,"minimum":1,"type":"integer"},"seed":{"format":"uint32","type":"integer"},"storageUri":{"type":"string"}},"type":"object"},"ImagenImagePrediction":{"properties":{"bytesBase64Encoded":{"description":"Base64-encoded image content","format":"byte","type":"string"},"mimeType":{"description":"MIME type of the generated image","type":"string"},"prompt":{"description":"Enhanced or rewritten prompt used to generate this image","type":"string"}},"type":"object"},"ImagenOutputOptions":{"properties":{"compressionQuality":{"maximum":100,"minimum":0,"type":"integer"},"mimeType":{"enum":["image/png","image/jpeg"],"type":"string"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"vertexai/imagen-3.0-generate-001","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/vertexai/imagen-3.0-generate-002.json b/router-schemas/vertexai/imagen-3.0-generate-002.json index 2cfb17a21..c1d7cc421 100644 --- a/router-schemas/vertexai/imagen-3.0-generate-002.json +++ b/router-schemas/vertexai/imagen-3.0-generate-002.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"vertexai/imagen-3.0-generate-002","description":"The request body Comfy Router accepts for the model \"vertexai/imagen-3.0-generate-002\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"f7c5c24423f4"},"paths":{"/v2/models/vertexai/imagen-3.0-generate-002":{"post":{"operationId":"runRouterModel","summary":"Run vertexai/imagen-3.0-generate-002 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"example":{"instances":[{"prompt":"A single red maple leaf on a plain white background."}],"parameters":{"sampleCount":1}},"properties":{"instances":{"items":{"$ref":"#/components/schemas/ImagenImageGenerationInstance"},"minItems":1,"type":"array"},"parameters":{"$ref":"#/components/schemas/ImagenImageGenerationParameters"}},"required":["instances"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ImagenGenerateImageResponse"}],"description":"Comfy Router output schema for the Vertex AI Imagen 3.0 models: the Vertex AI `:predict` response, forwarded unchanged. The operation is DIRECT-RETURN — `routerresult/classification.go` records `{provider: vertexai, endpoint: /imagen/:model}` as `ReturnModeDirect`, metering the original 200 through the synchronous `TrackUsage`, registering no task checker and declaring no status route — so the body a caller receives is the finished generation from the one call. There is no task handle and nothing to poll.\nThis is NOT the document the Gemini ids on the sibling `/proxy/vertexai/gemini/{model}` route answer, and mixing them up is the one mistake this page exists to prevent. The generated images are in `predictions`, one element per image, with the bytes at `predictions[].bytesBase64Encoded` and the media type at `predictions[].mimeType`. There is no `candidates[]`, no `content.parts[]` and no `inlineData` anywhere in an Imagen response.\nRead the ELEMENT field, not the `predictions` container. `ImagenImagePrediction` also carries `prompt`, which is the ENHANCED or rewritten prompt Vertex used rather than output — so an element carrying only a `prompt` is a non-empty array holding no image, exactly as a Kling `videos[]` element with no `url` is.\nThe image arrives INLINE as base64 and Router does not re-host it: there is no partner URL in this document to rewrite, which is also why `routerresult/classification.go` sizes the row with `BinaryResultMaxBytes` rather than the JSON default. This component describes that inline shape and only that shape: `ImagenImagePrediction` declares `mimeType`, `prompt` and `bytesBase64Encoded` and no object reference of any kind, so a request that sets `storageUri` receives a document this schema does not model — treat the parameter as unsupported on this route. `sampleCount` governs how many elements `predictions` carries.\nThe example's `bytesBase64Encoded` is the PLACEHOLDER `PGJhc2U2ND4=`, which decodes to the literal text `\u003cbase64\u003e` — a real image would be megabytes, and a real provider response does not belong in a published spec. It is spelled as valid base64 rather than as a bare `\u003cbase64\u003e` marker because `ImagenImagePrediction.bytesBase64Encoded` declares `format: byte`, which this document's own example validation enforces.","example":{"predictions":[{"bytesBase64Encoded":"PGJhc2U2ND4=","mimeType":"image/png","prompt":"A lighthouse at the edge of the harbour at dawn, warm low sun"}]}}}}}}}}},"components":{"schemas":{"ImagenGenerateImageResponse":{"properties":{"predictions":{"items":{"$ref":"#/components/schemas/ImagenImagePrediction"},"type":"array"}},"type":"object"},"ImagenImageGenerationInstance":{"properties":{"prompt":{"description":"Text prompt for image generation","type":"string"}},"required":["prompt"],"type":"object"},"ImagenImageGenerationParameters":{"properties":{"addWatermark":{"type":"boolean"},"aspectRatio":{"enum":["1:1","9:16","16:9","3:4","4:3"],"type":"string"},"enhancePrompt":{"type":"boolean"},"includeRaiReason":{"type":"boolean"},"includeSafetyAttributes":{"type":"boolean"},"outputOptions":{"$ref":"#/components/schemas/ImagenOutputOptions"},"personGeneration":{"enum":["dont_allow","allow_adult","allow_all"],"type":"string"},"safetySetting":{"enum":["block_most","block_some","block_few","block_fewest"],"type":"string"},"sampleCount":{"maximum":4,"minimum":1,"type":"integer"},"seed":{"format":"uint32","type":"integer"},"storageUri":{"type":"string"}},"type":"object"},"ImagenImagePrediction":{"properties":{"bytesBase64Encoded":{"description":"Base64-encoded image content","format":"byte","type":"string"},"mimeType":{"description":"MIME type of the generated image","type":"string"},"prompt":{"description":"Enhanced or rewritten prompt used to generate this image","type":"string"}},"type":"object"},"ImagenOutputOptions":{"properties":{"compressionQuality":{"maximum":100,"minimum":0,"type":"integer"},"mimeType":{"enum":["image/png","image/jpeg"],"type":"string"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"vertexai/imagen-3.0-generate-002","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"vertexai/imagen-3.0-generate-002","description":"The request body Comfy Router accepts for the model \"vertexai/imagen-3.0-generate-002\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"0cd04bca58ed"},"paths":{"/v2/models/vertexai/imagen-3.0-generate-002":{"post":{"operationId":"runRouterModel","summary":"Run vertexai/imagen-3.0-generate-002 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"example":{"instances":[{"prompt":"A single red maple leaf on a plain white background."}],"parameters":{"sampleCount":1}},"properties":{"instances":{"items":{"$ref":"#/components/schemas/ImagenImageGenerationInstance"},"minItems":1,"type":"array"},"parameters":{"$ref":"#/components/schemas/ImagenImageGenerationParameters"}},"required":["instances"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ImagenGenerateImageResponse"}],"description":"Comfy Router output schema for the Vertex AI Imagen 3.0 models: the Vertex AI `:predict` response, forwarded unchanged. The operation is DIRECT-RETURN — `routerresult/classification.go` records `{provider: vertexai, endpoint: /imagen/:model}` as `ReturnModeDirect`, metering the original 200 through the synchronous `TrackUsage`, registering no task checker and declaring no status route — so the body a caller receives is the finished generation from the one call. There is no task handle and nothing to poll.\nThis is NOT the document the Gemini ids on the sibling `/proxy/vertexai/gemini/{model}` route answer, and mixing them up is the one mistake this page exists to prevent. The generated images are in `predictions`, one element per image, with the bytes at `predictions[].bytesBase64Encoded` and the media type at `predictions[].mimeType`. There is no `candidates[]`, no `content.parts[]` and no `inlineData` anywhere in an Imagen response.\nRead the ELEMENT field, not the `predictions` container. `ImagenImagePrediction` also carries `prompt`, which is the ENHANCED or rewritten prompt Vertex used rather than output — so an element carrying only a `prompt` is a non-empty array holding no image, exactly as a Kling `videos[]` element with no `url` is.\nThe image arrives INLINE as base64 and Router does not re-host it: there is no partner URL in this document to rewrite, which is also why `routerresult/classification.go` sizes the row with `BinaryResultMaxBytes` rather than the JSON default. This component describes that inline shape and only that shape: `ImagenImagePrediction` declares `mimeType`, `prompt` and `bytesBase64Encoded` and no object reference of any kind, so a request that sets `storageUri` receives a document this schema does not model — treat the parameter as unsupported on this route. `sampleCount` governs how many elements `predictions` carries.\nThe example's `bytesBase64Encoded` is the PLACEHOLDER `PGJhc2U2ND4=`, which decodes to the literal text `\u003cbase64\u003e` — a real image would be megabytes, and a real provider response does not belong in a published spec. It is spelled as valid base64 rather than as a bare `\u003cbase64\u003e` marker because `ImagenImagePrediction.bytesBase64Encoded` declares `format: byte`, which this document's own example validation enforces.","example":{"predictions":[{"bytesBase64Encoded":"PGJhc2U2ND4=","mimeType":"image/png","prompt":"A lighthouse at the edge of the harbour at dawn, warm low sun"}]}}}}}}}}},"components":{"schemas":{"ImagenGenerateImageResponse":{"properties":{"predictions":{"items":{"$ref":"#/components/schemas/ImagenImagePrediction"},"type":"array"}},"type":"object"},"ImagenImageGenerationInstance":{"properties":{"prompt":{"description":"Text prompt for image generation","type":"string"}},"required":["prompt"],"type":"object"},"ImagenImageGenerationParameters":{"properties":{"addWatermark":{"type":"boolean"},"aspectRatio":{"enum":["1:1","9:16","16:9","3:4","4:3"],"type":"string"},"enhancePrompt":{"type":"boolean"},"includeRaiReason":{"type":"boolean"},"includeSafetyAttributes":{"type":"boolean"},"outputOptions":{"$ref":"#/components/schemas/ImagenOutputOptions"},"personGeneration":{"enum":["dont_allow","allow_adult","allow_all"],"type":"string"},"safetySetting":{"enum":["block_most","block_some","block_few","block_fewest"],"type":"string"},"sampleCount":{"default":4,"maximum":4,"minimum":1,"type":"integer"},"seed":{"format":"uint32","type":"integer"},"storageUri":{"type":"string"}},"type":"object"},"ImagenImagePrediction":{"properties":{"bytesBase64Encoded":{"description":"Base64-encoded image content","format":"byte","type":"string"},"mimeType":{"description":"MIME type of the generated image","type":"string"},"prompt":{"description":"Enhanced or rewritten prompt used to generate this image","type":"string"}},"type":"object"},"ImagenOutputOptions":{"properties":{"compressionQuality":{"maximum":100,"minimum":0,"type":"integer"},"mimeType":{"enum":["image/png","image/jpeg"],"type":"string"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"vertexai/imagen-3.0-generate-002","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/xai/grok-imagine-image-2.0.json b/router-schemas/xai/grok-imagine-image-2.0.json index 53eb0116f..1d37bfaab 100644 --- a/router-schemas/xai/grok-imagine-image-2.0.json +++ b/router-schemas/xai/grok-imagine-image-2.0.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"xai/grok-imagine-image-2.0","description":"The request body Comfy Router accepts for the model \"xai/grok-imagine-image-2.0\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"0678f5c6cbeb"},"paths":{"/v2/models/xai/grok-imagine-image-2.0":{"post":{"operationId":"runRouterModel","summary":"Run xai/grok-imagine-image-2.0 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for xAI Grok Imagine image generation","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"aspect_ratio":{"default":"auto","description":"Aspect ratio of the generated image. Defaults to auto for automatically selecting the best ratio for the prompt.","enum":["1:1","3:4","4:3","9:16","16:9","2:3","3:2","9:19.5","19.5:9","9:20","20:9","1:2","2:1","auto"],"type":"string"},"model":{"default":"grok-imagine-image","description":"Model to be used. Supported: grok-imagine-image (default), grok-imagine-image-pro, grok-imagine-image-quality, grok-imagine-image-2.0. Deprecated -beta ids are aliased to their GA model.","nullable":true,"type":"string"},"n":{"default":1,"description":"Number of images to be generated","maximum":10,"minimum":1,"type":"integer"},"prompt":{"description":"Prompt for image generation","type":"string"},"quality":{"description":"Quality of the output image. For grok-imagine-image-2.0 this selects the price tier (low/medium; medium is the default); other models currently ignore it.","enum":["low","medium","high"],"type":"string"},"resolution":{"default":"1k","description":"Resolution of the generated image. Defaults to 1k.","enum":["1k","2k"],"type":"string"},"response_format":{"default":"url","description":"Response format to return the image in. Can be url or b64_json. Comfy Router (`POST /v2/models/xai/{model}`) coerces this to `url` on the outbound request because it serves image results as re-hosted URLs either way; this `/proxy/` route honours it as written.","enum":["url","b64_json"],"type":"string"},"size":{"description":"Size of the image (not supported)","type":"string"},"style":{"description":"Style of the image (not supported)","type":"string"},"user":{"description":"A unique identifier representing your end-user, which can help xAI to monitor and detect abuse","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/XAIImageGenerationResponse"}],"description":"Comfy Router output schema for the xAI Grok Imagine image models: the `POST /v1/images/generations` document xAI returns, forwarded unchanged EXCEPT for the re-hosted `data[]` entries described below - every other field is xAI's own. This family is DIRECT-RETURN — `routerresult/classification.go` records `{provider: xai, endpoint: /v1/images/generations}` as `ReturnModeDirect` with no poll route — so the body a caller receives is the finished generation on the original call rather than a task handle.\nThe generated images are in `data`, and on THIS surface an entry is addressed by its `url`. Router coerces the outbound `response_format` to `url` for this family and re-hosts every image it can fetch onto Comfy storage, replacing xAI's URL with a signed Comfy one and clearing `b64_json`, so a request that asked for `b64_json` is answered exactly as a `url` request is. `mime_type` names the encoding. The `/proxy/` route reached directly is the one that still answers in the format the caller asked for.\nDurability is per entry, not per response: an image whose re-host fails keeps xAI's own answer — under the coerced `response_format` that is xAI's short-lived URL — rather than a Comfy one, and the rest of the response is unaffected. So one `data` array can mix durable Comfy URLs with expiring partner ones, and a caller that stores or replays this document should not assume every URL in it outlives the call. Such a response IS the answer to the call that produced it, returned and charged exactly as a fully re-hosted one is — but it is replayable only BRIEFLY. A prompt retry carrying the same `Idempotency-Key` — within a few minutes of the original, which is where a connection dropped mid-call puts an SDK's automatic re-send — is answered from the record exactly as any other replay is, because the partner's own link is still alive that soon. A retry after that is answered `409 invalid_input` rather than handed a document whose links may already have expired. The key is consumed either way, so no retry ever re-runs or re-charges; once the replay window has passed, use a new key to run the generation again. A response whose every entry re-hosted cleanly replays normally for the full 24 hours, because a Comfy signed URL is minted with the same lifetime the record is kept for.\n`block_reason` and `usage` are populated WITHOUT any `data` when xAI's input moderation refuses the request, so a caller must key completion off `data` rather than off a `200` alone — which is exactly why the nightly SDK case for this family asserts `data` and nothing else (`testing/e2e/router_sdk/cases.json`).","example":{"data":[{"mime_type":"image/jpeg","url":"https://example.invalid/xai/grok-imagine-image/generated.jpg"},{"mime_type":"image/jpeg","url":"https://example.invalid/xai/grok-imagine-image/generated-2.jpg"}],"usage":{"cost_in_usd_ticks":200000000}}}}}}}}}},"components":{"schemas":{"XAIGeneratedImage":{"description":"A generated image from xAI","properties":{"b64_json":{"description":"A base64-encoded string representation of the generated image in jpeg encoding (if response_format is b64_json)","type":"string"},"mime_type":{"description":"The MIME type of the generated image (e.g. image/png, image/jpeg, image/webp).","type":"string"},"url":{"description":"A url to the generated image (if response_format is url)","type":"string"}},"type":"object"},"XAIImageGenerationResponse":{"description":"Response from xAI image generation or editing","properties":{"block_reason":{"description":"If the request was blocked by input moderation, contains the block reason","type":"string"},"data":{"description":"A list of generated image objects","items":{"$ref":"#/components/schemas/XAIGeneratedImage"},"type":"array"},"usage":{"$ref":"#/components/schemas/XAIImageUsage"}},"type":"object"},"XAIImageUsage":{"description":"Usage information for the image generation request","properties":{"cost_in_usd_ticks":{"description":"Accurate cost of this request in USD ticks (10,000,000,000 ticks = 1 USD)","type":"integer"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"xai/grok-imagine-image-2.0","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"xai/grok-imagine-image-2.0","description":"The request body Comfy Router accepts for the model \"xai/grok-imagine-image-2.0\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"7bb3b789169f"},"paths":{"/v2/models/xai/grok-imagine-image-2.0":{"post":{"operationId":"runRouterModel","summary":"Run xai/grok-imagine-image-2.0 synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for xAI Grok Imagine image generation","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"aspect_ratio":{"default":"auto","description":"Aspect ratio of the generated image. Defaults to auto for automatically selecting the best ratio for the prompt.","enum":["1:1","3:4","4:3","9:16","16:9","2:3","3:2","9:19.5","19.5:9","9:20","20:9","1:2","2:1","auto"],"type":"string"},"model":{"default":"grok-imagine-image","description":"Model to be used. Supported: grok-imagine-image (default), grok-imagine-image-pro, grok-imagine-image-quality, grok-imagine-image-2.0. Deprecated -beta ids are aliased to their GA model.","nullable":true,"type":"string"},"n":{"default":1,"description":"Number of images to be generated","maximum":10,"minimum":1,"type":"integer"},"prompt":{"description":"Prompt for image generation","type":"string"},"quality":{"description":"Quality of the output image. For grok-imagine-image-2.0 this selects the price tier (low/medium; medium is the default); other models currently ignore it.","enum":["low","medium","high"],"type":"string"},"resolution":{"default":"1k","description":"Resolution of the generated image. Defaults to 1k.","enum":["1k","2k"],"type":"string"},"response_format":{"default":"url","description":"Response format to return the image in. Can be url or b64_json. Comfy coerces this to `url` on the outbound request — on the Comfy Router dispatch (`POST /v2/models/xai/{model}`) and on this `/proxy/` route too — because image results are served as re-hosted URLs either way. The field is accepted and ignored rather than rejected; send it or omit it, the answer is the same.","enum":["url","b64_json"],"type":"string"},"size":{"description":"Size of the image (not supported)","type":"string"},"style":{"description":"Style of the image (not supported)","type":"string"},"user":{"description":"A unique identifier representing your end-user, which can help xAI to monitor and detect abuse","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/XAIImageGenerationResponse"}],"description":"Comfy Router output schema for the xAI Grok Imagine image models: the `POST /v1/images/generations` document xAI returns, forwarded unchanged EXCEPT for the re-hosted `data[]` entries described below - every other field is xAI's own. This family is DIRECT-RETURN — `routerresult/classification.go` records `{provider: xai, endpoint: /v1/images/generations}` as `ReturnModeDirect` with no poll route — so the body a caller receives is the finished generation on the original call rather than a task handle.\nThe generated images are in `data`, and on THIS surface an entry is addressed by its `url`. Router coerces the outbound `response_format` to `url` for this family and re-hosts every image it can fetch onto Comfy storage, replacing xAI's URL with a signed Comfy one and clearing `b64_json`, so a request that asked for `b64_json` is answered exactly as a `url` request is. `mime_type` names the encoding. The `/proxy/` route reached directly is the one that still answers in the format the caller asked for.\nDurability is per entry, not per response: an image whose re-host fails keeps xAI's own answer — under the coerced `response_format` that is xAI's short-lived URL — rather than a Comfy one, and the rest of the response is unaffected. So one `data` array can mix durable Comfy URLs with expiring partner ones, and a caller that stores or replays this document should not assume every URL in it outlives the call. Such a response IS the answer to the call that produced it, returned and charged exactly as a fully re-hosted one is — but it is replayable only BRIEFLY. A prompt retry carrying the same `Idempotency-Key` — within a few minutes of the original, which is where a connection dropped mid-call puts an SDK's automatic re-send — is answered from the record exactly as any other replay is, because the partner's own link is still alive that soon. A retry after that is answered `409 invalid_input` rather than handed a document whose links may already have expired. The key is consumed either way, so no retry ever re-runs or re-charges; once the replay window has passed, use a new key to run the generation again. A response whose every entry re-hosted cleanly replays normally for the full 24 hours, because a Comfy signed URL is minted with the same lifetime the record is kept for.\n`block_reason` and `usage` are populated WITHOUT any `data` when xAI's input moderation refuses the request, so a caller must key completion off `data` rather than off a `200` alone — which is exactly why the nightly SDK case for this family asserts `data` and nothing else (`testing/e2e/router_sdk/cases.json`).","example":{"data":[{"mime_type":"image/jpeg","url":"https://example.invalid/xai/grok-imagine-image/generated.jpg"},{"mime_type":"image/jpeg","url":"https://example.invalid/xai/grok-imagine-image/generated-2.jpg"}],"usage":{"cost_in_usd_ticks":200000000}}}}}}}}}},"components":{"schemas":{"XAIGeneratedImage":{"description":"A generated image from xAI","properties":{"b64_json":{"description":"A base64-encoded string representation of the generated image in jpeg encoding (if response_format is b64_json)","type":"string"},"mime_type":{"description":"The MIME type of the generated image (e.g. image/png, image/jpeg, image/webp).","type":"string"},"url":{"description":"A url to the generated image (if response_format is url)","type":"string"}},"type":"object"},"XAIImageGenerationResponse":{"description":"Response from xAI image generation or editing","properties":{"block_reason":{"description":"If the request was blocked by input moderation, contains the block reason","type":"string"},"data":{"description":"A list of generated image objects","items":{"$ref":"#/components/schemas/XAIGeneratedImage"},"type":"array"},"usage":{"$ref":"#/components/schemas/XAIImageUsage"}},"type":"object"},"XAIImageUsage":{"description":"Usage information for the image generation request","properties":{"cost_in_usd_ticks":{"description":"Accurate cost of this request in USD ticks (10,000,000,000 ticks = 1 USD)","type":"integer"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"xai/grok-imagine-image-2.0","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/xai/grok-imagine-image-pro.json b/router-schemas/xai/grok-imagine-image-pro.json index d1c02d8ba..6d7648fda 100644 --- a/router-schemas/xai/grok-imagine-image-pro.json +++ b/router-schemas/xai/grok-imagine-image-pro.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"xai/grok-imagine-image-pro","description":"The request body Comfy Router accepts for the model \"xai/grok-imagine-image-pro\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"0678f5c6cbeb"},"paths":{"/v2/models/xai/grok-imagine-image-pro":{"post":{"operationId":"runRouterModel","summary":"Run xai/grok-imagine-image-pro synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for xAI Grok Imagine image generation","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"aspect_ratio":{"default":"auto","description":"Aspect ratio of the generated image. Defaults to auto for automatically selecting the best ratio for the prompt.","enum":["1:1","3:4","4:3","9:16","16:9","2:3","3:2","9:19.5","19.5:9","9:20","20:9","1:2","2:1","auto"],"type":"string"},"model":{"default":"grok-imagine-image","description":"Model to be used. Supported: grok-imagine-image (default), grok-imagine-image-pro, grok-imagine-image-quality, grok-imagine-image-2.0. Deprecated -beta ids are aliased to their GA model.","nullable":true,"type":"string"},"n":{"default":1,"description":"Number of images to be generated","maximum":10,"minimum":1,"type":"integer"},"prompt":{"description":"Prompt for image generation","type":"string"},"quality":{"description":"Quality of the output image. For grok-imagine-image-2.0 this selects the price tier (low/medium; medium is the default); other models currently ignore it.","enum":["low","medium","high"],"type":"string"},"resolution":{"default":"1k","description":"Resolution of the generated image. Defaults to 1k.","enum":["1k","2k"],"type":"string"},"response_format":{"default":"url","description":"Response format to return the image in. Can be url or b64_json. Comfy Router (`POST /v2/models/xai/{model}`) coerces this to `url` on the outbound request because it serves image results as re-hosted URLs either way; this `/proxy/` route honours it as written.","enum":["url","b64_json"],"type":"string"},"size":{"description":"Size of the image (not supported)","type":"string"},"style":{"description":"Style of the image (not supported)","type":"string"},"user":{"description":"A unique identifier representing your end-user, which can help xAI to monitor and detect abuse","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/XAIImageGenerationResponse"}],"description":"Comfy Router output schema for the xAI Grok Imagine image models: the `POST /v1/images/generations` document xAI returns, forwarded unchanged EXCEPT for the re-hosted `data[]` entries described below - every other field is xAI's own. This family is DIRECT-RETURN — `routerresult/classification.go` records `{provider: xai, endpoint: /v1/images/generations}` as `ReturnModeDirect` with no poll route — so the body a caller receives is the finished generation on the original call rather than a task handle.\nThe generated images are in `data`, and on THIS surface an entry is addressed by its `url`. Router coerces the outbound `response_format` to `url` for this family and re-hosts every image it can fetch onto Comfy storage, replacing xAI's URL with a signed Comfy one and clearing `b64_json`, so a request that asked for `b64_json` is answered exactly as a `url` request is. `mime_type` names the encoding. The `/proxy/` route reached directly is the one that still answers in the format the caller asked for.\nDurability is per entry, not per response: an image whose re-host fails keeps xAI's own answer — under the coerced `response_format` that is xAI's short-lived URL — rather than a Comfy one, and the rest of the response is unaffected. So one `data` array can mix durable Comfy URLs with expiring partner ones, and a caller that stores or replays this document should not assume every URL in it outlives the call. Such a response IS the answer to the call that produced it, returned and charged exactly as a fully re-hosted one is — but it is replayable only BRIEFLY. A prompt retry carrying the same `Idempotency-Key` — within a few minutes of the original, which is where a connection dropped mid-call puts an SDK's automatic re-send — is answered from the record exactly as any other replay is, because the partner's own link is still alive that soon. A retry after that is answered `409 invalid_input` rather than handed a document whose links may already have expired. The key is consumed either way, so no retry ever re-runs or re-charges; once the replay window has passed, use a new key to run the generation again. A response whose every entry re-hosted cleanly replays normally for the full 24 hours, because a Comfy signed URL is minted with the same lifetime the record is kept for.\n`block_reason` and `usage` are populated WITHOUT any `data` when xAI's input moderation refuses the request, so a caller must key completion off `data` rather than off a `200` alone — which is exactly why the nightly SDK case for this family asserts `data` and nothing else (`testing/e2e/router_sdk/cases.json`).","example":{"data":[{"mime_type":"image/jpeg","url":"https://example.invalid/xai/grok-imagine-image/generated.jpg"},{"mime_type":"image/jpeg","url":"https://example.invalid/xai/grok-imagine-image/generated-2.jpg"}],"usage":{"cost_in_usd_ticks":200000000}}}}}}}}}},"components":{"schemas":{"XAIGeneratedImage":{"description":"A generated image from xAI","properties":{"b64_json":{"description":"A base64-encoded string representation of the generated image in jpeg encoding (if response_format is b64_json)","type":"string"},"mime_type":{"description":"The MIME type of the generated image (e.g. image/png, image/jpeg, image/webp).","type":"string"},"url":{"description":"A url to the generated image (if response_format is url)","type":"string"}},"type":"object"},"XAIImageGenerationResponse":{"description":"Response from xAI image generation or editing","properties":{"block_reason":{"description":"If the request was blocked by input moderation, contains the block reason","type":"string"},"data":{"description":"A list of generated image objects","items":{"$ref":"#/components/schemas/XAIGeneratedImage"},"type":"array"},"usage":{"$ref":"#/components/schemas/XAIImageUsage"}},"type":"object"},"XAIImageUsage":{"description":"Usage information for the image generation request","properties":{"cost_in_usd_ticks":{"description":"Accurate cost of this request in USD ticks (10,000,000,000 ticks = 1 USD)","type":"integer"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"xai/grok-imagine-image-pro","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"xai/grok-imagine-image-pro","description":"The request body Comfy Router accepts for the model \"xai/grok-imagine-image-pro\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"7bb3b789169f"},"paths":{"/v2/models/xai/grok-imagine-image-pro":{"post":{"operationId":"runRouterModel","summary":"Run xai/grok-imagine-image-pro synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for xAI Grok Imagine image generation","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"aspect_ratio":{"default":"auto","description":"Aspect ratio of the generated image. Defaults to auto for automatically selecting the best ratio for the prompt.","enum":["1:1","3:4","4:3","9:16","16:9","2:3","3:2","9:19.5","19.5:9","9:20","20:9","1:2","2:1","auto"],"type":"string"},"model":{"default":"grok-imagine-image","description":"Model to be used. Supported: grok-imagine-image (default), grok-imagine-image-pro, grok-imagine-image-quality, grok-imagine-image-2.0. Deprecated -beta ids are aliased to their GA model.","nullable":true,"type":"string"},"n":{"default":1,"description":"Number of images to be generated","maximum":10,"minimum":1,"type":"integer"},"prompt":{"description":"Prompt for image generation","type":"string"},"quality":{"description":"Quality of the output image. For grok-imagine-image-2.0 this selects the price tier (low/medium; medium is the default); other models currently ignore it.","enum":["low","medium","high"],"type":"string"},"resolution":{"default":"1k","description":"Resolution of the generated image. Defaults to 1k.","enum":["1k","2k"],"type":"string"},"response_format":{"default":"url","description":"Response format to return the image in. Can be url or b64_json. Comfy coerces this to `url` on the outbound request — on the Comfy Router dispatch (`POST /v2/models/xai/{model}`) and on this `/proxy/` route too — because image results are served as re-hosted URLs either way. The field is accepted and ignored rather than rejected; send it or omit it, the answer is the same.","enum":["url","b64_json"],"type":"string"},"size":{"description":"Size of the image (not supported)","type":"string"},"style":{"description":"Style of the image (not supported)","type":"string"},"user":{"description":"A unique identifier representing your end-user, which can help xAI to monitor and detect abuse","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/XAIImageGenerationResponse"}],"description":"Comfy Router output schema for the xAI Grok Imagine image models: the `POST /v1/images/generations` document xAI returns, forwarded unchanged EXCEPT for the re-hosted `data[]` entries described below - every other field is xAI's own. This family is DIRECT-RETURN — `routerresult/classification.go` records `{provider: xai, endpoint: /v1/images/generations}` as `ReturnModeDirect` with no poll route — so the body a caller receives is the finished generation on the original call rather than a task handle.\nThe generated images are in `data`, and on THIS surface an entry is addressed by its `url`. Router coerces the outbound `response_format` to `url` for this family and re-hosts every image it can fetch onto Comfy storage, replacing xAI's URL with a signed Comfy one and clearing `b64_json`, so a request that asked for `b64_json` is answered exactly as a `url` request is. `mime_type` names the encoding. The `/proxy/` route reached directly is the one that still answers in the format the caller asked for.\nDurability is per entry, not per response: an image whose re-host fails keeps xAI's own answer — under the coerced `response_format` that is xAI's short-lived URL — rather than a Comfy one, and the rest of the response is unaffected. So one `data` array can mix durable Comfy URLs with expiring partner ones, and a caller that stores or replays this document should not assume every URL in it outlives the call. Such a response IS the answer to the call that produced it, returned and charged exactly as a fully re-hosted one is — but it is replayable only BRIEFLY. A prompt retry carrying the same `Idempotency-Key` — within a few minutes of the original, which is where a connection dropped mid-call puts an SDK's automatic re-send — is answered from the record exactly as any other replay is, because the partner's own link is still alive that soon. A retry after that is answered `409 invalid_input` rather than handed a document whose links may already have expired. The key is consumed either way, so no retry ever re-runs or re-charges; once the replay window has passed, use a new key to run the generation again. A response whose every entry re-hosted cleanly replays normally for the full 24 hours, because a Comfy signed URL is minted with the same lifetime the record is kept for.\n`block_reason` and `usage` are populated WITHOUT any `data` when xAI's input moderation refuses the request, so a caller must key completion off `data` rather than off a `200` alone — which is exactly why the nightly SDK case for this family asserts `data` and nothing else (`testing/e2e/router_sdk/cases.json`).","example":{"data":[{"mime_type":"image/jpeg","url":"https://example.invalid/xai/grok-imagine-image/generated.jpg"},{"mime_type":"image/jpeg","url":"https://example.invalid/xai/grok-imagine-image/generated-2.jpg"}],"usage":{"cost_in_usd_ticks":200000000}}}}}}}}}},"components":{"schemas":{"XAIGeneratedImage":{"description":"A generated image from xAI","properties":{"b64_json":{"description":"A base64-encoded string representation of the generated image in jpeg encoding (if response_format is b64_json)","type":"string"},"mime_type":{"description":"The MIME type of the generated image (e.g. image/png, image/jpeg, image/webp).","type":"string"},"url":{"description":"A url to the generated image (if response_format is url)","type":"string"}},"type":"object"},"XAIImageGenerationResponse":{"description":"Response from xAI image generation or editing","properties":{"block_reason":{"description":"If the request was blocked by input moderation, contains the block reason","type":"string"},"data":{"description":"A list of generated image objects","items":{"$ref":"#/components/schemas/XAIGeneratedImage"},"type":"array"},"usage":{"$ref":"#/components/schemas/XAIImageUsage"}},"type":"object"},"XAIImageUsage":{"description":"Usage information for the image generation request","properties":{"cost_in_usd_ticks":{"description":"Accurate cost of this request in USD ticks (10,000,000,000 ticks = 1 USD)","type":"integer"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"xai/grok-imagine-image-pro","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/xai/grok-imagine-image-quality.json b/router-schemas/xai/grok-imagine-image-quality.json index 00bcaad1f..247104525 100644 --- a/router-schemas/xai/grok-imagine-image-quality.json +++ b/router-schemas/xai/grok-imagine-image-quality.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"xai/grok-imagine-image-quality","description":"The request body Comfy Router accepts for the model \"xai/grok-imagine-image-quality\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"0678f5c6cbeb"},"paths":{"/v2/models/xai/grok-imagine-image-quality":{"post":{"operationId":"runRouterModel","summary":"Run xai/grok-imagine-image-quality synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for xAI Grok Imagine image generation","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"aspect_ratio":{"default":"auto","description":"Aspect ratio of the generated image. Defaults to auto for automatically selecting the best ratio for the prompt.","enum":["1:1","3:4","4:3","9:16","16:9","2:3","3:2","9:19.5","19.5:9","9:20","20:9","1:2","2:1","auto"],"type":"string"},"model":{"default":"grok-imagine-image","description":"Model to be used. Supported: grok-imagine-image (default), grok-imagine-image-pro, grok-imagine-image-quality, grok-imagine-image-2.0. Deprecated -beta ids are aliased to their GA model.","nullable":true,"type":"string"},"n":{"default":1,"description":"Number of images to be generated","maximum":10,"minimum":1,"type":"integer"},"prompt":{"description":"Prompt for image generation","type":"string"},"quality":{"description":"Quality of the output image. For grok-imagine-image-2.0 this selects the price tier (low/medium; medium is the default); other models currently ignore it.","enum":["low","medium","high"],"type":"string"},"resolution":{"default":"1k","description":"Resolution of the generated image. Defaults to 1k.","enum":["1k","2k"],"type":"string"},"response_format":{"default":"url","description":"Response format to return the image in. Can be url or b64_json. Comfy Router (`POST /v2/models/xai/{model}`) coerces this to `url` on the outbound request because it serves image results as re-hosted URLs either way; this `/proxy/` route honours it as written.","enum":["url","b64_json"],"type":"string"},"size":{"description":"Size of the image (not supported)","type":"string"},"style":{"description":"Style of the image (not supported)","type":"string"},"user":{"description":"A unique identifier representing your end-user, which can help xAI to monitor and detect abuse","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/XAIImageGenerationResponse"}],"description":"Comfy Router output schema for the xAI Grok Imagine image models: the `POST /v1/images/generations` document xAI returns, forwarded unchanged EXCEPT for the re-hosted `data[]` entries described below - every other field is xAI's own. This family is DIRECT-RETURN — `routerresult/classification.go` records `{provider: xai, endpoint: /v1/images/generations}` as `ReturnModeDirect` with no poll route — so the body a caller receives is the finished generation on the original call rather than a task handle.\nThe generated images are in `data`, and on THIS surface an entry is addressed by its `url`. Router coerces the outbound `response_format` to `url` for this family and re-hosts every image it can fetch onto Comfy storage, replacing xAI's URL with a signed Comfy one and clearing `b64_json`, so a request that asked for `b64_json` is answered exactly as a `url` request is. `mime_type` names the encoding. The `/proxy/` route reached directly is the one that still answers in the format the caller asked for.\nDurability is per entry, not per response: an image whose re-host fails keeps xAI's own answer — under the coerced `response_format` that is xAI's short-lived URL — rather than a Comfy one, and the rest of the response is unaffected. So one `data` array can mix durable Comfy URLs with expiring partner ones, and a caller that stores or replays this document should not assume every URL in it outlives the call. Such a response IS the answer to the call that produced it, returned and charged exactly as a fully re-hosted one is — but it is replayable only BRIEFLY. A prompt retry carrying the same `Idempotency-Key` — within a few minutes of the original, which is where a connection dropped mid-call puts an SDK's automatic re-send — is answered from the record exactly as any other replay is, because the partner's own link is still alive that soon. A retry after that is answered `409 invalid_input` rather than handed a document whose links may already have expired. The key is consumed either way, so no retry ever re-runs or re-charges; once the replay window has passed, use a new key to run the generation again. A response whose every entry re-hosted cleanly replays normally for the full 24 hours, because a Comfy signed URL is minted with the same lifetime the record is kept for.\n`block_reason` and `usage` are populated WITHOUT any `data` when xAI's input moderation refuses the request, so a caller must key completion off `data` rather than off a `200` alone — which is exactly why the nightly SDK case for this family asserts `data` and nothing else (`testing/e2e/router_sdk/cases.json`).","example":{"data":[{"mime_type":"image/jpeg","url":"https://example.invalid/xai/grok-imagine-image/generated.jpg"},{"mime_type":"image/jpeg","url":"https://example.invalid/xai/grok-imagine-image/generated-2.jpg"}],"usage":{"cost_in_usd_ticks":200000000}}}}}}}}}},"components":{"schemas":{"XAIGeneratedImage":{"description":"A generated image from xAI","properties":{"b64_json":{"description":"A base64-encoded string representation of the generated image in jpeg encoding (if response_format is b64_json)","type":"string"},"mime_type":{"description":"The MIME type of the generated image (e.g. image/png, image/jpeg, image/webp).","type":"string"},"url":{"description":"A url to the generated image (if response_format is url)","type":"string"}},"type":"object"},"XAIImageGenerationResponse":{"description":"Response from xAI image generation or editing","properties":{"block_reason":{"description":"If the request was blocked by input moderation, contains the block reason","type":"string"},"data":{"description":"A list of generated image objects","items":{"$ref":"#/components/schemas/XAIGeneratedImage"},"type":"array"},"usage":{"$ref":"#/components/schemas/XAIImageUsage"}},"type":"object"},"XAIImageUsage":{"description":"Usage information for the image generation request","properties":{"cost_in_usd_ticks":{"description":"Accurate cost of this request in USD ticks (10,000,000,000 ticks = 1 USD)","type":"integer"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"xai/grok-imagine-image-quality","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"xai/grok-imagine-image-quality","description":"The request body Comfy Router accepts for the model \"xai/grok-imagine-image-quality\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"7bb3b789169f"},"paths":{"/v2/models/xai/grok-imagine-image-quality":{"post":{"operationId":"runRouterModel","summary":"Run xai/grok-imagine-image-quality synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for xAI Grok Imagine image generation","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"aspect_ratio":{"default":"auto","description":"Aspect ratio of the generated image. Defaults to auto for automatically selecting the best ratio for the prompt.","enum":["1:1","3:4","4:3","9:16","16:9","2:3","3:2","9:19.5","19.5:9","9:20","20:9","1:2","2:1","auto"],"type":"string"},"model":{"default":"grok-imagine-image","description":"Model to be used. Supported: grok-imagine-image (default), grok-imagine-image-pro, grok-imagine-image-quality, grok-imagine-image-2.0. Deprecated -beta ids are aliased to their GA model.","nullable":true,"type":"string"},"n":{"default":1,"description":"Number of images to be generated","maximum":10,"minimum":1,"type":"integer"},"prompt":{"description":"Prompt for image generation","type":"string"},"quality":{"description":"Quality of the output image. For grok-imagine-image-2.0 this selects the price tier (low/medium; medium is the default); other models currently ignore it.","enum":["low","medium","high"],"type":"string"},"resolution":{"default":"1k","description":"Resolution of the generated image. Defaults to 1k.","enum":["1k","2k"],"type":"string"},"response_format":{"default":"url","description":"Response format to return the image in. Can be url or b64_json. Comfy coerces this to `url` on the outbound request — on the Comfy Router dispatch (`POST /v2/models/xai/{model}`) and on this `/proxy/` route too — because image results are served as re-hosted URLs either way. The field is accepted and ignored rather than rejected; send it or omit it, the answer is the same.","enum":["url","b64_json"],"type":"string"},"size":{"description":"Size of the image (not supported)","type":"string"},"style":{"description":"Style of the image (not supported)","type":"string"},"user":{"description":"A unique identifier representing your end-user, which can help xAI to monitor and detect abuse","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/XAIImageGenerationResponse"}],"description":"Comfy Router output schema for the xAI Grok Imagine image models: the `POST /v1/images/generations` document xAI returns, forwarded unchanged EXCEPT for the re-hosted `data[]` entries described below - every other field is xAI's own. This family is DIRECT-RETURN — `routerresult/classification.go` records `{provider: xai, endpoint: /v1/images/generations}` as `ReturnModeDirect` with no poll route — so the body a caller receives is the finished generation on the original call rather than a task handle.\nThe generated images are in `data`, and on THIS surface an entry is addressed by its `url`. Router coerces the outbound `response_format` to `url` for this family and re-hosts every image it can fetch onto Comfy storage, replacing xAI's URL with a signed Comfy one and clearing `b64_json`, so a request that asked for `b64_json` is answered exactly as a `url` request is. `mime_type` names the encoding. The `/proxy/` route reached directly is the one that still answers in the format the caller asked for.\nDurability is per entry, not per response: an image whose re-host fails keeps xAI's own answer — under the coerced `response_format` that is xAI's short-lived URL — rather than a Comfy one, and the rest of the response is unaffected. So one `data` array can mix durable Comfy URLs with expiring partner ones, and a caller that stores or replays this document should not assume every URL in it outlives the call. Such a response IS the answer to the call that produced it, returned and charged exactly as a fully re-hosted one is — but it is replayable only BRIEFLY. A prompt retry carrying the same `Idempotency-Key` — within a few minutes of the original, which is where a connection dropped mid-call puts an SDK's automatic re-send — is answered from the record exactly as any other replay is, because the partner's own link is still alive that soon. A retry after that is answered `409 invalid_input` rather than handed a document whose links may already have expired. The key is consumed either way, so no retry ever re-runs or re-charges; once the replay window has passed, use a new key to run the generation again. A response whose every entry re-hosted cleanly replays normally for the full 24 hours, because a Comfy signed URL is minted with the same lifetime the record is kept for.\n`block_reason` and `usage` are populated WITHOUT any `data` when xAI's input moderation refuses the request, so a caller must key completion off `data` rather than off a `200` alone — which is exactly why the nightly SDK case for this family asserts `data` and nothing else (`testing/e2e/router_sdk/cases.json`).","example":{"data":[{"mime_type":"image/jpeg","url":"https://example.invalid/xai/grok-imagine-image/generated.jpg"},{"mime_type":"image/jpeg","url":"https://example.invalid/xai/grok-imagine-image/generated-2.jpg"}],"usage":{"cost_in_usd_ticks":200000000}}}}}}}}}},"components":{"schemas":{"XAIGeneratedImage":{"description":"A generated image from xAI","properties":{"b64_json":{"description":"A base64-encoded string representation of the generated image in jpeg encoding (if response_format is b64_json)","type":"string"},"mime_type":{"description":"The MIME type of the generated image (e.g. image/png, image/jpeg, image/webp).","type":"string"},"url":{"description":"A url to the generated image (if response_format is url)","type":"string"}},"type":"object"},"XAIImageGenerationResponse":{"description":"Response from xAI image generation or editing","properties":{"block_reason":{"description":"If the request was blocked by input moderation, contains the block reason","type":"string"},"data":{"description":"A list of generated image objects","items":{"$ref":"#/components/schemas/XAIGeneratedImage"},"type":"array"},"usage":{"$ref":"#/components/schemas/XAIImageUsage"}},"type":"object"},"XAIImageUsage":{"description":"Usage information for the image generation request","properties":{"cost_in_usd_ticks":{"description":"Accurate cost of this request in USD ticks (10,000,000,000 ticks = 1 USD)","type":"integer"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"xai/grok-imagine-image-quality","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} diff --git a/router-schemas/xai/grok-imagine-image.json b/router-schemas/xai/grok-imagine-image.json index a012c15cd..a1dbff510 100644 --- a/router-schemas/xai/grok-imagine-image.json +++ b/router-schemas/xai/grok-imagine-image.json @@ -1 +1 @@ -{"openapi":"3.0.2","info":{"title":"xai/grok-imagine-image","description":"The request body Comfy Router accepts for the model \"xai/grok-imagine-image\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"0678f5c6cbeb"},"paths":{"/v2/models/xai/grok-imagine-image":{"post":{"operationId":"runRouterModel","summary":"Run xai/grok-imagine-image synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for xAI Grok Imagine image generation","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"aspect_ratio":{"default":"auto","description":"Aspect ratio of the generated image. Defaults to auto for automatically selecting the best ratio for the prompt.","enum":["1:1","3:4","4:3","9:16","16:9","2:3","3:2","9:19.5","19.5:9","9:20","20:9","1:2","2:1","auto"],"type":"string"},"model":{"default":"grok-imagine-image","description":"Model to be used. Supported: grok-imagine-image (default), grok-imagine-image-pro, grok-imagine-image-quality, grok-imagine-image-2.0. Deprecated -beta ids are aliased to their GA model.","nullable":true,"type":"string"},"n":{"default":1,"description":"Number of images to be generated","maximum":10,"minimum":1,"type":"integer"},"prompt":{"description":"Prompt for image generation","type":"string"},"quality":{"description":"Quality of the output image. For grok-imagine-image-2.0 this selects the price tier (low/medium; medium is the default); other models currently ignore it.","enum":["low","medium","high"],"type":"string"},"resolution":{"default":"1k","description":"Resolution of the generated image. Defaults to 1k.","enum":["1k","2k"],"type":"string"},"response_format":{"default":"url","description":"Response format to return the image in. Can be url or b64_json. Comfy Router (`POST /v2/models/xai/{model}`) coerces this to `url` on the outbound request because it serves image results as re-hosted URLs either way; this `/proxy/` route honours it as written.","enum":["url","b64_json"],"type":"string"},"size":{"description":"Size of the image (not supported)","type":"string"},"style":{"description":"Style of the image (not supported)","type":"string"},"user":{"description":"A unique identifier representing your end-user, which can help xAI to monitor and detect abuse","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/XAIImageGenerationResponse"}],"description":"Comfy Router output schema for the xAI Grok Imagine image models: the `POST /v1/images/generations` document xAI returns, forwarded unchanged EXCEPT for the re-hosted `data[]` entries described below - every other field is xAI's own. This family is DIRECT-RETURN — `routerresult/classification.go` records `{provider: xai, endpoint: /v1/images/generations}` as `ReturnModeDirect` with no poll route — so the body a caller receives is the finished generation on the original call rather than a task handle.\nThe generated images are in `data`, and on THIS surface an entry is addressed by its `url`. Router coerces the outbound `response_format` to `url` for this family and re-hosts every image it can fetch onto Comfy storage, replacing xAI's URL with a signed Comfy one and clearing `b64_json`, so a request that asked for `b64_json` is answered exactly as a `url` request is. `mime_type` names the encoding. The `/proxy/` route reached directly is the one that still answers in the format the caller asked for.\nDurability is per entry, not per response: an image whose re-host fails keeps xAI's own answer — under the coerced `response_format` that is xAI's short-lived URL — rather than a Comfy one, and the rest of the response is unaffected. So one `data` array can mix durable Comfy URLs with expiring partner ones, and a caller that stores or replays this document should not assume every URL in it outlives the call. Such a response IS the answer to the call that produced it, returned and charged exactly as a fully re-hosted one is — but it is replayable only BRIEFLY. A prompt retry carrying the same `Idempotency-Key` — within a few minutes of the original, which is where a connection dropped mid-call puts an SDK's automatic re-send — is answered from the record exactly as any other replay is, because the partner's own link is still alive that soon. A retry after that is answered `409 invalid_input` rather than handed a document whose links may already have expired. The key is consumed either way, so no retry ever re-runs or re-charges; once the replay window has passed, use a new key to run the generation again. A response whose every entry re-hosted cleanly replays normally for the full 24 hours, because a Comfy signed URL is minted with the same lifetime the record is kept for.\n`block_reason` and `usage` are populated WITHOUT any `data` when xAI's input moderation refuses the request, so a caller must key completion off `data` rather than off a `200` alone — which is exactly why the nightly SDK case for this family asserts `data` and nothing else (`testing/e2e/router_sdk/cases.json`).","example":{"data":[{"mime_type":"image/jpeg","url":"https://example.invalid/xai/grok-imagine-image/generated.jpg"},{"mime_type":"image/jpeg","url":"https://example.invalid/xai/grok-imagine-image/generated-2.jpg"}],"usage":{"cost_in_usd_ticks":200000000}}}}}}}}}},"components":{"schemas":{"XAIGeneratedImage":{"description":"A generated image from xAI","properties":{"b64_json":{"description":"A base64-encoded string representation of the generated image in jpeg encoding (if response_format is b64_json)","type":"string"},"mime_type":{"description":"The MIME type of the generated image (e.g. image/png, image/jpeg, image/webp).","type":"string"},"url":{"description":"A url to the generated image (if response_format is url)","type":"string"}},"type":"object"},"XAIImageGenerationResponse":{"description":"Response from xAI image generation or editing","properties":{"block_reason":{"description":"If the request was blocked by input moderation, contains the block reason","type":"string"},"data":{"description":"A list of generated image objects","items":{"$ref":"#/components/schemas/XAIGeneratedImage"},"type":"array"},"usage":{"$ref":"#/components/schemas/XAIImageUsage"}},"type":"object"},"XAIImageUsage":{"description":"Usage information for the image generation request","properties":{"cost_in_usd_ticks":{"description":"Accurate cost of this request in USD ticks (10,000,000,000 ticks = 1 USD)","type":"integer"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"xai/grok-imagine-image","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true} +{"openapi":"3.0.2","info":{"title":"xai/grok-imagine-image","description":"The request body Comfy Router accepts for the model \"xai/grok-imagine-image\", and the response body it returns. The INPUT schema is the same schema the server validates a call against before it reaches the provider, so what is published and what is enforced cannot differ. The OUTPUT schema describes the provider's native result document exactly as Router returns it: Router does not validate, narrow or re-envelope the response, so the output schema is descriptive rather than enforced, and Comfy owns no output shape of its own.","version":"7bb3b789169f"},"paths":{"/v2/models/xai/grok-imagine-image":{"post":{"operationId":"runRouterModel","summary":"Run xai/grok-imagine-image synchronously.","security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for xAI Grok Imagine image generation","example":{"n":1,"prompt":"A single red maple leaf on a plain white background."},"properties":{"aspect_ratio":{"default":"auto","description":"Aspect ratio of the generated image. Defaults to auto for automatically selecting the best ratio for the prompt.","enum":["1:1","3:4","4:3","9:16","16:9","2:3","3:2","9:19.5","19.5:9","9:20","20:9","1:2","2:1","auto"],"type":"string"},"model":{"default":"grok-imagine-image","description":"Model to be used. Supported: grok-imagine-image (default), grok-imagine-image-pro, grok-imagine-image-quality, grok-imagine-image-2.0. Deprecated -beta ids are aliased to their GA model.","nullable":true,"type":"string"},"n":{"default":1,"description":"Number of images to be generated","maximum":10,"minimum":1,"type":"integer"},"prompt":{"description":"Prompt for image generation","type":"string"},"quality":{"description":"Quality of the output image. For grok-imagine-image-2.0 this selects the price tier (low/medium; medium is the default); other models currently ignore it.","enum":["low","medium","high"],"type":"string"},"resolution":{"default":"1k","description":"Resolution of the generated image. Defaults to 1k.","enum":["1k","2k"],"type":"string"},"response_format":{"default":"url","description":"Response format to return the image in. Can be url or b64_json. Comfy coerces this to `url` on the outbound request — on the Comfy Router dispatch (`POST /v2/models/xai/{model}`) and on this `/proxy/` route too — because image results are served as re-hosted URLs either way. The field is accepted and ignored rather than rejected; send it or omit it, the answer is the same.","enum":["url","b64_json"],"type":"string"},"size":{"description":"Size of the image (not supported)","type":"string"},"style":{"description":"Style of the image (not supported)","type":"string"},"user":{"description":"A unique identifier representing your end-user, which can help xAI to monitor and detect abuse","type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"description":"OK - the model's native JSON output, returned unchanged; the schema describes the provider's terminal result document as Router returns it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/XAIImageGenerationResponse"}],"description":"Comfy Router output schema for the xAI Grok Imagine image models: the `POST /v1/images/generations` document xAI returns, forwarded unchanged EXCEPT for the re-hosted `data[]` entries described below - every other field is xAI's own. This family is DIRECT-RETURN — `routerresult/classification.go` records `{provider: xai, endpoint: /v1/images/generations}` as `ReturnModeDirect` with no poll route — so the body a caller receives is the finished generation on the original call rather than a task handle.\nThe generated images are in `data`, and on THIS surface an entry is addressed by its `url`. Router coerces the outbound `response_format` to `url` for this family and re-hosts every image it can fetch onto Comfy storage, replacing xAI's URL with a signed Comfy one and clearing `b64_json`, so a request that asked for `b64_json` is answered exactly as a `url` request is. `mime_type` names the encoding. The `/proxy/` route reached directly is the one that still answers in the format the caller asked for.\nDurability is per entry, not per response: an image whose re-host fails keeps xAI's own answer — under the coerced `response_format` that is xAI's short-lived URL — rather than a Comfy one, and the rest of the response is unaffected. So one `data` array can mix durable Comfy URLs with expiring partner ones, and a caller that stores or replays this document should not assume every URL in it outlives the call. Such a response IS the answer to the call that produced it, returned and charged exactly as a fully re-hosted one is — but it is replayable only BRIEFLY. A prompt retry carrying the same `Idempotency-Key` — within a few minutes of the original, which is where a connection dropped mid-call puts an SDK's automatic re-send — is answered from the record exactly as any other replay is, because the partner's own link is still alive that soon. A retry after that is answered `409 invalid_input` rather than handed a document whose links may already have expired. The key is consumed either way, so no retry ever re-runs or re-charges; once the replay window has passed, use a new key to run the generation again. A response whose every entry re-hosted cleanly replays normally for the full 24 hours, because a Comfy signed URL is minted with the same lifetime the record is kept for.\n`block_reason` and `usage` are populated WITHOUT any `data` when xAI's input moderation refuses the request, so a caller must key completion off `data` rather than off a `200` alone — which is exactly why the nightly SDK case for this family asserts `data` and nothing else (`testing/e2e/router_sdk/cases.json`).","example":{"data":[{"mime_type":"image/jpeg","url":"https://example.invalid/xai/grok-imagine-image/generated.jpg"},{"mime_type":"image/jpeg","url":"https://example.invalid/xai/grok-imagine-image/generated-2.jpg"}],"usage":{"cost_in_usd_ticks":200000000}}}}}}}}}},"components":{"schemas":{"XAIGeneratedImage":{"description":"A generated image from xAI","properties":{"b64_json":{"description":"A base64-encoded string representation of the generated image in jpeg encoding (if response_format is b64_json)","type":"string"},"mime_type":{"description":"The MIME type of the generated image (e.g. image/png, image/jpeg, image/webp).","type":"string"},"url":{"description":"A url to the generated image (if response_format is url)","type":"string"}},"type":"object"},"XAIImageGenerationResponse":{"description":"Response from xAI image generation or editing","properties":{"block_reason":{"description":"If the request was blocked by input moderation, contains the block reason","type":"string"},"data":{"description":"A list of generated image objects","items":{"$ref":"#/components/schemas/XAIGeneratedImage"},"type":"array"},"usage":{"$ref":"#/components/schemas/XAIImageUsage"}},"type":"object"},"XAIImageUsage":{"description":"Usage information for the image generation request","properties":{"cost_in_usd_ticks":{"description":"Accurate cost of this request in USD ticks (10,000,000,000 ticks = 1 USD)","type":"integer"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"x-comfy-router-model-id":"xai/grok-imagine-image","x-comfy-input-schema-authored":true,"x-comfy-output-schema-authored":true}