diff --git a/.github/scripts/snippets/README.md b/.github/scripts/snippets/README.md index 6086cada8..219e3aae3 100644 --- a/.github/scripts/snippets/README.md +++ b/.github/scripts/snippets/README.md @@ -75,6 +75,16 @@ is deleted. The banner is a rollout artifact, so retiring it is one `rm` plus a regen rather than an edit to the template and every generated page in the same commit. +## The two delivery tabs + +Every runnable Quick start is a tab pair: **Wait for the result** is the +`models.run` call, **Queue and collect later** is the same body through +`models.submit`, polled to completion and collected. Both tabs are emitted from +the one `example`, so they cannot disagree about the request. The queued tab +opens with `snippets/comfy-router/queue-preview-notice.mdx` while that file +exists, on the same existence rule as the preview banner: once queued delivery +is on for every workspace, `rm` the snippet and regen. + ## Schema sections Every Code page includes a Schema section and the examples available for it. diff --git a/.github/scripts/snippets/gen-code-pages.ts b/.github/scripts/snippets/gen-code-pages.ts index 095399f30..0609d230e 100644 --- a/.github/scripts/snippets/gen-code-pages.ts +++ b/.github/scripts/snippets/gen-code-pages.ts @@ -9,7 +9,8 @@ * * The template below is the only place the page shape lives. Python, TypeScript * and cURL are all emitted from the same `example` object, so the three cannot - * disagree about the request body. + * disagree about the request body, and both delivery modes (wait for the + * result, or queue it and collect later) are emitted from that one object too. */ import { readFileSync, writeFileSync, existsSync, mkdirSync, mkdtempSync, rmSync } from "node:fs"; import { join, dirname, relative } from "node:path"; @@ -21,6 +22,7 @@ const SCHEMA_GLOB = "router-schemas/*/*.json"; const MODELS_DIR = "development/comfy-router/models"; const DOCS_JSON = "docs.json"; const PREVIEW_NOTICE = "snippets/comfy-router/preview-notice.mdx"; +const QUEUE_NOTICE = "snippets/comfy-router/queue-preview-notice.mdx"; const BASE_URL = "https://api.comfy.org"; const ROUTE = "/v2/models"; @@ -357,6 +359,152 @@ function curlSnippet(model: string, example: Record, files: Fil -d "${json}"`; } +// --------------------------------------------------------------------------- +// Queued delivery +// +// Every runnable page carries its request twice: through `models.run`, which +// holds the connection until the result is ready, and through `models.submit`, +// which returns a request handle at once and collects the result later. The +// queued builders take the same `example` and file inputs as the synchronous +// ones above, so the two tabs cannot disagree about the body either. +// --------------------------------------------------------------------------- + +/** + * Python, queued. An empty `resultPath` means the page has no authored result + * path (a derived page), so the snippet prints the whole payload. + */ +function pythonQueueSnippet(model: string, example: Record, files: FileInput[], resultPath: string, label: string): string { + const reads = files + .map((f) => `with open(${JSON.stringify(f.path)}, "rb") as f:\n ${f.varName} = base64.b64encode(f.read()).decode()`) + .join("\n\n"); + const body = Object.entries(example) + .map(([k, v]) => ` ${JSON.stringify(k)}: ${pyLiteral(v, 12, files, k)},`) + .join("\n"); + const show = resultPath ? `print("${label}:", result${pyPath(resultPath)})` : "print(result)"; + return `${files.length ? "import base64\n\n" : ""}from comfy_sdk import Comfy +${reads ? `\n${reads}\n` : ""} +# 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( + "${model}", + { +${body} + }, + ) + 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() + +${show}`; +} + +/** TypeScript, queued. As `pythonQueueSnippet`, an empty `resultPath` prints the whole payload. */ +function typescriptQueueSnippet(model: string, example: Record, files: FileInput[], resultPath: string, label: string): string { + const imports = `import { comfy } from "@comfyorg/sdk";\n${files.length ? `import { readFile } from "node:fs/promises";\n` : ""}`; + const reads = files + .map((f) => `const ${camel(f.varName)} = (await readFile(${JSON.stringify(f.path)})).toString("base64");`) + .join("\n"); + const body = Object.entries(example) + .map(([k, v]) => ` ${/^[a-zA-Z_$][\w$]*$/.test(k) ? k : JSON.stringify(k)}: ${tsLiteral(v, 2, files, k)},`) + .join("\n"); + const typed = resultPath ? `type Result = ${tsResultType(resultPath)};\n` : ""; + const generic = resultPath ? "" : ""; + const show = resultPath + ? `const result = await handle.get(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("${label}:", result.data${tsPath(resultPath)});` + : `const result = await handle.get(); + +console.log(result.data);`; + return `${imports} +${reads ? `${reads}\n\n` : ""}// Reads COMFY_API_KEY from the environment. +// Each submit() call mints its own Idempotency-Key and reuses it for automatic retries. +${typed}const handle = await comfy.models.submit${generic}("${model}", { +${body} +}); +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. +${show}`; +} + +/** cURL, queued: submit, then poll and collect by request id. */ +function curlQueueSnippet(model: string, example: Record, files: FileInput[]): string { + const reads = files.map((f) => `${shellVar(f.varName)}=$(base64 < ${f.path} | tr -d '\\n')`).join("\n"); + const esc = (v: unknown) => JSON.stringify(v).replace(/[\\$`"]/g, (c) => `\\${c}`); + const entries = Object.entries(example).map(([k, v]) => { + const f = files.find((x) => x.key === k); + const value = f ? `\\"$${shellVar(f.varName)}\\"` : esc(v); + return `${esc(k)}: ${value}`; + }); + const json = `{${entries.join(", ")}}`; + const requests = `${BASE_URL}${ROUTE}/${model}/requests`; + return `${reads ? `${reads}\n\n` : ""}# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl ${requests} \\ + -H "X-API-Key: $COMFY_API_KEY" \\ + -H "Idempotency-Key: $(uuidgen)" \\ + -H "Content-Type: application/json" \\ + -d "${json}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i ${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 ${requests}/$REQUEST_ID \\ + -H "X-API-Key: $COMFY_API_KEY"`; +} + +/** The three languages of one delivery mode. */ +function codeGroup(python: string, typescript: string, curl: string): string { + return ` +\`\`\`python Python +${python} +\`\`\` + +\`\`\`typescript TypeScript +${typescript} +\`\`\` + +\`\`\`bash cURL +${curl} +\`\`\` +`; +} + +/** + * The two delivery modes of one request as a tab pair: `sync` waits for the + * result, `queued` submits the same body and collects it later. The queued tab + * opens with the rollout notice while `snippets/comfy-router/queue-preview-notice.mdx` + * exists (see `queueNotice` below). + */ +function deliveryTabs(model: string, sync: string, queued: string): string { + return ` + +${sync} + + +${queueNotice.body}The same body, sent to \`POST ${BASE_URL}${ROUTE}/${model}/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. + +${queued} + +`; +} + function possessive(name: string): string { return name.endsWith("s") ? `${name}'` : `${name}'s`; } @@ -627,23 +775,14 @@ function quickStart(v: Variant, spec: Spec): string { const example = v.example ?? spec.example; const files = fileInputs(example); const label = spec.result.label; + const path = spec.result.path; + const sync = codeGroup(pythonSnippet(v.model, example, files, path, label), typescriptSnippet(v.model, example, files, path, label), curlSnippet(v.model, example, files)); + const queued = codeGroup(pythonQueueSnippet(v.model, example, files, path, label), typescriptQueueSnippet(v.model, example, files, path, label), curlQueueSnippet(v.model, example, files)); return `**Model ID:** \`${v.model}\` **Endpoint:** \`POST ${BASE_URL}${ROUTE}/${v.model}\` - -\`\`\`python Python -${pythonSnippet(v.model, example, files, spec.result.path, label)} -\`\`\` - -\`\`\`typescript TypeScript -${typescriptSnippet(v.model, example, files, spec.result.path, label)} -\`\`\` - -\`\`\`bash cURL -${curlSnippet(v.model, example, files)} -\`\`\` -`; +${deliveryTabs(v.model, sync, queued)}`; } /** Schema + Examples for one variant. `html` headings keep them out of the TOC when rendered inside tabs. */ @@ -697,6 +836,19 @@ const previewNotice = (() => { }; })(); +/** + * As `previewNotice`: the queued-delivery rollout note at the top of every + * "Queue and collect later" tab, rendered while its snippet exists and retired + * with one `rm` plus a regen once the queue is on for everyone. + */ +const queueNotice = (() => { + const present = existsSync(join(ROOT, QUEUE_NOTICE)); + return { + imports: present ? `import QueuedDeliveryNotice from "/${QUEUE_NOTICE}";\n` : "", + body: present ? "\n\n" : "", + }; +})(); + function renderPage(spec: Spec, dir: string): string { const both = spec.variants.length > 1; // The one-time setup a snippet cannot run without. Everything else that is @@ -721,7 +873,7 @@ sidebarTitle: ${JSON.stringify(spec.name)} {/* GENERATED FILE. Edit code.yaml in this directory and run \`pnpm code-pages:gen\`. */} -${previewNotice.imports}import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; +${previewNotice.imports}${queueNotice.imports}import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; ${spec.intro ?? `API Reference for ${spec.name}. ${spec.summary.replace(/\s+/g, " ").trim()}`} ${previewNotice.body} @@ -796,20 +948,9 @@ ${tsBody} }); console.log(data);`; - const curl = curlSnippet(model, body, []); - return ` -\`\`\`python Python -${python} -\`\`\` - -\`\`\`typescript TypeScript -${typescript} -\`\`\` - -\`\`\`bash cURL -${curl} -\`\`\` -`; + const sync = codeGroup(python, typescript, curlSnippet(model, body, [])); + const queued = codeGroup(pythonQueueSnippet(model, body, [], "", ""), typescriptQueueSnippet(model, body, [], "", ""), curlQueueSnippet(model, body, [])); + return deliveryTabs(model, sync, queued); } // Adapt shared response fixtures for display only; never rewrite synced schemas. @@ -877,7 +1018,7 @@ sidebarTitle: ${JSON.stringify(title)} {/* GENERATED FILE. Generated from router-schemas/${model}.json by \`pnpm code-pages:gen\`. */} -${previewNotice.imports}import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; +${previewNotice.imports}${queueNotice.imports}import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for \`${model}\`, served by Comfy Router from ${provider}. ${previewNotice.body} diff --git a/development/comfy-router/api.mdx b/development/comfy-router/api.mdx index eaee53d8a..12aa70fe8 100644 --- a/development/comfy-router/api.mdx +++ b/development/comfy-router/api.mdx @@ -192,7 +192,7 @@ Do not mint a brand-new key just because a call timed out or the connection drop #### Timeouts and collection -One Router call may hold the connection for 10 minutes by default. Set your client timeout above that bound so you keep the typed `504` and the request ID rather than an opaque local abort. +One Router call may hold the connection for 10 minutes by default. Set your client timeout above that bound so you keep the typed `504` and the request ID rather than an opaque local abort. If your application cannot hold a connection that long, [queued delivery](/development/comfy-router/queue) returns a `request_id` at once and lets you collect the result later. `deadline_exceeded` is Router's waiting limit; `provider_timeout` is the provider's deadline. A provider generation that completes can be billed even if the caller received a timeout or disconnected. Client cancellation stops the wait and SDK retries, but does not necessarily cancel accepted provider work. @@ -262,4 +262,5 @@ Provider payloads may include their own cost or usage numbers; those are not the ## Next - [Quickstart](/development/comfy-router/quickstart): installation, invocation, and saving the image. +- [Queued delivery](/development/comfy-router/queue): submit a request, follow its status, collect the result or cancel it without holding the connection. - [API reference](/development/comfy-router/reference): endpoint parameters, schemas, and response codes. diff --git a/development/comfy-router/headers.mdx b/development/comfy-router/headers.mdx index 1e619bd74..215e2db16 100644 --- a/development/comfy-router/headers.mdx +++ b/development/comfy-router/headers.mdx @@ -41,11 +41,11 @@ The Comfy SDKs (`comfy-sdk` for Python, `@comfyorg/sdk` for TypeScript) handle a - Present and `true` when Router serves a stored result instead of running the model again. It is absent on a fresh run. + Present and `true` when Router serves a stored result instead of running the model again. It is absent on a fresh run. On the queued submit route, a replayed `201` returns the original request handle rather than queueing a second run. - Seconds to wait before retrying. On `409` / `concurrency_limit_exceeded` or `504` / `deadline_exceeded`, retry the same request and key after the wait. On `429` / `rate_limited`, it tells you when the rate limit resets. + Seconds to wait before retrying. On `409` / `concurrency_limit_exceeded` or `504` / `deadline_exceeded`, retry the same request and key after the wait. On `429` / `rate_limited`, it tells you when the rate limit resets. On a queued request's status read and its `202` result read, it is Router's hint for when polling again is worth the round trip. diff --git a/development/comfy-router/limitations.mdx b/development/comfy-router/limitations.mdx index 87fb75707..c377726ee 100644 --- a/development/comfy-router/limitations.mdx +++ b/development/comfy-router/limitations.mdx @@ -19,7 +19,7 @@ Router runs a partner model through one synchronous HTTP call. Use it when your ## No queued submission -Router holds the connection while the model runs. For asynchronous providers, it submits the job and polls internally. It does not expose a Router job ID, status endpoint, callback, or webhook. +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). 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. diff --git a/development/comfy-router/models/anthropic/claude-fable-5-1/code.mdx b/development/comfy-router/models/anthropic/claude-fable-5-1/code.mdx index ba6472eea..8c76d769b 100644 --- a/development/comfy-router/models/anthropic/claude-fable-5-1/code.mdx +++ b/development/comfy-router/models/anthropic/claude-fable-5-1/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Claude Fable 5.1" {/* GENERATED FILE. Generated from router-schemas/anthropic/claude-fable-5-1.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `anthropic/claude-fable-5-1`, served by Comfy Router from Anthropic. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/anthropic/claude-fable-5-1` + + ```python Python from comfy_sdk import Comfy @@ -67,6 +70,91 @@ curl https://api.comfy.org/v2/models/anthropic/claude-fable-5-1 \ -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/anthropic/claude-fable-5-1/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( + "anthropic/claude-fable-5-1", + { + "max_tokens": 16, + "messages": [ + { + "content": "Reply with the single word: ok", + "role": "user", + }, + ], + }, + ) + 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("anthropic/claude-fable-5-1", { + max_tokens: 16, + messages: [ + { + content: "Reply with the single word: ok", + role: "user", + }, + ], +}); +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/anthropic/claude-fable-5-1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/anthropic/claude-fable-5-1/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/anthropic/claude-fable-5-1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/anthropic/claude-fable-5/code.mdx b/development/comfy-router/models/anthropic/claude-fable-5/code.mdx index fb5d13983..6563108ed 100644 --- a/development/comfy-router/models/anthropic/claude-fable-5/code.mdx +++ b/development/comfy-router/models/anthropic/claude-fable-5/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Claude Fable 5" {/* GENERATED FILE. Generated from router-schemas/anthropic/claude-fable-5.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `anthropic/claude-fable-5`, served by Comfy Router from Anthropic. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/anthropic/claude-fable-5` + + ```python Python from comfy_sdk import Comfy @@ -67,6 +70,91 @@ curl https://api.comfy.org/v2/models/anthropic/claude-fable-5 \ -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/anthropic/claude-fable-5/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( + "anthropic/claude-fable-5", + { + "max_tokens": 16, + "messages": [ + { + "content": "Reply with the single word: ok", + "role": "user", + }, + ], + }, + ) + 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("anthropic/claude-fable-5", { + max_tokens: 16, + messages: [ + { + content: "Reply with the single word: ok", + role: "user", + }, + ], +}); +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/anthropic/claude-fable-5/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/anthropic/claude-fable-5/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/anthropic/claude-fable-5/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/anthropic/claude-haiku-4-5-20251001/code.mdx b/development/comfy-router/models/anthropic/claude-haiku-4-5-20251001/code.mdx index 39634c0b8..7e0725ddf 100644 --- a/development/comfy-router/models/anthropic/claude-haiku-4-5-20251001/code.mdx +++ b/development/comfy-router/models/anthropic/claude-haiku-4-5-20251001/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Claude Haiku 4.5 20251001" {/* GENERATED FILE. Generated from router-schemas/anthropic/claude-haiku-4-5-20251001.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `anthropic/claude-haiku-4-5-20251001`, served by Comfy Router from Anthropic. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/anthropic/claude-haiku-4-5-20251001` + + ```python Python from comfy_sdk import Comfy @@ -67,6 +70,91 @@ curl https://api.comfy.org/v2/models/anthropic/claude-haiku-4-5-20251001 \ -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/anthropic/claude-haiku-4-5-20251001/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( + "anthropic/claude-haiku-4-5-20251001", + { + "max_tokens": 16, + "messages": [ + { + "content": "Reply with the single word: ok", + "role": "user", + }, + ], + }, + ) + 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("anthropic/claude-haiku-4-5-20251001", { + max_tokens: 16, + messages: [ + { + content: "Reply with the single word: ok", + role: "user", + }, + ], +}); +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/anthropic/claude-haiku-4-5-20251001/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/anthropic/claude-haiku-4-5-20251001/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/anthropic/claude-haiku-4-5-20251001/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/anthropic/claude-opus-4-6/code.mdx b/development/comfy-router/models/anthropic/claude-opus-4-6/code.mdx index f91c290b7..866ca6d99 100644 --- a/development/comfy-router/models/anthropic/claude-opus-4-6/code.mdx +++ b/development/comfy-router/models/anthropic/claude-opus-4-6/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Claude Opus 4.6" {/* GENERATED FILE. Generated from router-schemas/anthropic/claude-opus-4-6.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `anthropic/claude-opus-4-6`, served by Comfy Router from Anthropic. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/anthropic/claude-opus-4-6` + + ```python Python from comfy_sdk import Comfy @@ -67,6 +70,91 @@ curl https://api.comfy.org/v2/models/anthropic/claude-opus-4-6 \ -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/anthropic/claude-opus-4-6/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( + "anthropic/claude-opus-4-6", + { + "max_tokens": 16, + "messages": [ + { + "content": "Reply with the single word: ok", + "role": "user", + }, + ], + }, + ) + 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("anthropic/claude-opus-4-6", { + max_tokens: 16, + messages: [ + { + content: "Reply with the single word: ok", + role: "user", + }, + ], +}); +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/anthropic/claude-opus-4-6/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/anthropic/claude-opus-4-6/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/anthropic/claude-opus-4-6/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/anthropic/claude-opus-4-7/code.mdx b/development/comfy-router/models/anthropic/claude-opus-4-7/code.mdx index 4aba66f8a..b3f2bb907 100644 --- a/development/comfy-router/models/anthropic/claude-opus-4-7/code.mdx +++ b/development/comfy-router/models/anthropic/claude-opus-4-7/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Claude Opus 4.7" {/* GENERATED FILE. Generated from router-schemas/anthropic/claude-opus-4-7.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `anthropic/claude-opus-4-7`, served by Comfy Router from Anthropic. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/anthropic/claude-opus-4-7` + + ```python Python from comfy_sdk import Comfy @@ -67,6 +70,91 @@ curl https://api.comfy.org/v2/models/anthropic/claude-opus-4-7 \ -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/anthropic/claude-opus-4-7/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( + "anthropic/claude-opus-4-7", + { + "max_tokens": 16, + "messages": [ + { + "content": "Reply with the single word: ok", + "role": "user", + }, + ], + }, + ) + 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("anthropic/claude-opus-4-7", { + max_tokens: 16, + messages: [ + { + content: "Reply with the single word: ok", + role: "user", + }, + ], +}); +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/anthropic/claude-opus-4-7/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/anthropic/claude-opus-4-7/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/anthropic/claude-opus-4-7/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/anthropic/claude-opus-4-8/code.mdx b/development/comfy-router/models/anthropic/claude-opus-4-8/code.mdx index cc38632f1..ca17d4c2e 100644 --- a/development/comfy-router/models/anthropic/claude-opus-4-8/code.mdx +++ b/development/comfy-router/models/anthropic/claude-opus-4-8/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Claude Opus 4.8" {/* GENERATED FILE. Generated from router-schemas/anthropic/claude-opus-4-8.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `anthropic/claude-opus-4-8`, served by Comfy Router from Anthropic. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/anthropic/claude-opus-4-8` + + ```python Python from comfy_sdk import Comfy @@ -67,6 +70,91 @@ curl https://api.comfy.org/v2/models/anthropic/claude-opus-4-8 \ -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/anthropic/claude-opus-4-8/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( + "anthropic/claude-opus-4-8", + { + "max_tokens": 16, + "messages": [ + { + "content": "Reply with the single word: ok", + "role": "user", + }, + ], + }, + ) + 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("anthropic/claude-opus-4-8", { + max_tokens: 16, + messages: [ + { + content: "Reply with the single word: ok", + role: "user", + }, + ], +}); +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/anthropic/claude-opus-4-8/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/anthropic/claude-opus-4-8/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/anthropic/claude-opus-4-8/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/anthropic/claude-opus-5/code.mdx b/development/comfy-router/models/anthropic/claude-opus-5/code.mdx index f16ba89cf..8e895780b 100644 --- a/development/comfy-router/models/anthropic/claude-opus-5/code.mdx +++ b/development/comfy-router/models/anthropic/claude-opus-5/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Claude Opus 5" {/* GENERATED FILE. Generated from router-schemas/anthropic/claude-opus-5.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `anthropic/claude-opus-5`, served by Comfy Router from Anthropic. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/anthropic/claude-opus-5` + + ```python Python from comfy_sdk import Comfy @@ -67,6 +70,91 @@ curl https://api.comfy.org/v2/models/anthropic/claude-opus-5 \ -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/anthropic/claude-opus-5/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( + "anthropic/claude-opus-5", + { + "max_tokens": 16, + "messages": [ + { + "content": "Reply with the single word: ok", + "role": "user", + }, + ], + }, + ) + 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("anthropic/claude-opus-5", { + max_tokens: 16, + messages: [ + { + content: "Reply with the single word: ok", + role: "user", + }, + ], +}); +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/anthropic/claude-opus-5/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/anthropic/claude-opus-5/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/anthropic/claude-opus-5/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/anthropic/claude-sonnet-4-5-20250929/code.mdx b/development/comfy-router/models/anthropic/claude-sonnet-4-5-20250929/code.mdx index 0df0713bf..4ba0d1056 100644 --- a/development/comfy-router/models/anthropic/claude-sonnet-4-5-20250929/code.mdx +++ b/development/comfy-router/models/anthropic/claude-sonnet-4-5-20250929/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Claude Sonnet 4.5 20250929" {/* GENERATED FILE. Generated from router-schemas/anthropic/claude-sonnet-4-5-20250929.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `anthropic/claude-sonnet-4-5-20250929`, served by Comfy Router from Anthropic. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/anthropic/claude-sonnet-4-5-20250929` + + ```python Python from comfy_sdk import Comfy @@ -67,6 +70,91 @@ curl https://api.comfy.org/v2/models/anthropic/claude-sonnet-4-5-20250929 \ -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/anthropic/claude-sonnet-4-5-20250929/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( + "anthropic/claude-sonnet-4-5-20250929", + { + "max_tokens": 16, + "messages": [ + { + "content": "Reply with the single word: ok", + "role": "user", + }, + ], + }, + ) + 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("anthropic/claude-sonnet-4-5-20250929", { + max_tokens: 16, + messages: [ + { + content: "Reply with the single word: ok", + role: "user", + }, + ], +}); +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/anthropic/claude-sonnet-4-5-20250929/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/anthropic/claude-sonnet-4-5-20250929/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/anthropic/claude-sonnet-4-5-20250929/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/anthropic/claude-sonnet-4-6/code.mdx b/development/comfy-router/models/anthropic/claude-sonnet-4-6/code.mdx index fb12227b7..0b3b35e28 100644 --- a/development/comfy-router/models/anthropic/claude-sonnet-4-6/code.mdx +++ b/development/comfy-router/models/anthropic/claude-sonnet-4-6/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Claude Sonnet 4.6" {/* GENERATED FILE. Generated from router-schemas/anthropic/claude-sonnet-4-6.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `anthropic/claude-sonnet-4-6`, served by Comfy Router from Anthropic. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/anthropic/claude-sonnet-4-6` + + ```python Python from comfy_sdk import Comfy @@ -67,6 +70,91 @@ curl https://api.comfy.org/v2/models/anthropic/claude-sonnet-4-6 \ -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/anthropic/claude-sonnet-4-6/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( + "anthropic/claude-sonnet-4-6", + { + "max_tokens": 16, + "messages": [ + { + "content": "Reply with the single word: ok", + "role": "user", + }, + ], + }, + ) + 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("anthropic/claude-sonnet-4-6", { + max_tokens: 16, + messages: [ + { + content: "Reply with the single word: ok", + role: "user", + }, + ], +}); +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/anthropic/claude-sonnet-4-6/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/anthropic/claude-sonnet-4-6/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/anthropic/claude-sonnet-4-6/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/anthropic/claude-sonnet-5/code.mdx b/development/comfy-router/models/anthropic/claude-sonnet-5/code.mdx index ba865ca46..ff0122e42 100644 --- a/development/comfy-router/models/anthropic/claude-sonnet-5/code.mdx +++ b/development/comfy-router/models/anthropic/claude-sonnet-5/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Claude Sonnet 5" {/* GENERATED FILE. Generated from router-schemas/anthropic/claude-sonnet-5.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `anthropic/claude-sonnet-5`, served by Comfy Router from Anthropic. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/anthropic/claude-sonnet-5` + + ```python Python from comfy_sdk import Comfy @@ -67,6 +70,91 @@ curl https://api.comfy.org/v2/models/anthropic/claude-sonnet-5 \ -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/anthropic/claude-sonnet-5/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( + "anthropic/claude-sonnet-5", + { + "max_tokens": 16, + "messages": [ + { + "content": "Reply with the single word: ok", + "role": "user", + }, + ], + }, + ) + 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("anthropic/claude-sonnet-5", { + max_tokens: 16, + messages: [ + { + content: "Reply with the single word: ok", + role: "user", + }, + ], +}); +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/anthropic/claude-sonnet-5/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"max_tokens\": 16, \"messages\": [{\"content\":\"Reply with the single word: ok\",\"role\":\"user\"}]}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/anthropic/claude-sonnet-5/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/anthropic/claude-sonnet-5/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/beeble/switchx/code.mdx b/development/comfy-router/models/beeble/switchx/code.mdx index ee1d5fba9..022c2c69a 100644 --- a/development/comfy-router/models/beeble/switchx/code.mdx +++ b/development/comfy-router/models/beeble/switchx/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "SwitchX" {/* GENERATED FILE. Generated from router-schemas/beeble/switchx.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `beeble/switchx`, served by Comfy Router from Beeble. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/beeble/switchx` + + ```python Python from comfy_sdk import Comfy @@ -63,6 +66,87 @@ curl https://api.comfy.org/v2/models/beeble/switchx \ -d "{\"alpha_mode\": \"auto\", \"generation_type\": \"image\", \"max_resolution\": 720, \"prompt\": \"A cinematic product photo of a glass lamp on a marble table\", \"source_uri\": \"https://img.freepik.com/free-photo/portrait-woman_395237-33.jpg?w=740&q=80\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/beeble/switchx/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( + "beeble/switchx", + { + "alpha_mode": "auto", + "generation_type": "image", + "max_resolution": 720, + "prompt": "A cinematic product photo of a glass lamp on a marble table", + "source_uri": "https://img.freepik.com/free-photo/portrait-woman_395237-33.jpg?w=740&q=80", + }, + ) + 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("beeble/switchx", { + alpha_mode: "auto", + generation_type: "image", + max_resolution: 720, + prompt: "A cinematic product photo of a glass lamp on a marble table", + source_uri: "https://img.freepik.com/free-photo/portrait-woman_395237-33.jpg?w=740&q=80", +}); +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/beeble/switchx/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"alpha_mode\": \"auto\", \"generation_type\": \"image\", \"max_resolution\": 720, \"prompt\": \"A cinematic product photo of a glass lamp on a marble table\", \"source_uri\": \"https://img.freepik.com/free-photo/portrait-woman_395237-33.jpg?w=740&q=80\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/beeble/switchx/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/beeble/switchx/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/black-forest-labs/erase-v1/code.mdx b/development/comfy-router/models/black-forest-labs/erase-v1/code.mdx index fbf27d4cc..340904fc0 100644 --- a/development/comfy-router/models/black-forest-labs/erase-v1/code.mdx +++ b/development/comfy-router/models/black-forest-labs/erase-v1/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Erase V1" {/* GENERATED FILE. Generated from router-schemas/bfl/erase-v1.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bfl/erase-v1`, served by Comfy Router from Black Forest Labs. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bfl/erase-v1` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/bfl/erase-v1 \ -d "{\"image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\", \"mask\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAB+UlEQVR42u3TMQ0AAAzDsPIn3d7DMBtCpKTwWCTAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAbAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGgGvctyzUB/Dz3wAAAABJRU5ErkJggg==\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bfl/erase-v1/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( + "bfl/erase-v1", + { + "image": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + "mask": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAB+UlEQVR42u3TMQ0AAAzDsPIn3d7DMBtCpKTwWCTAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAbAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGgGvctyzUB/Dz3wAAAABJRU5ErkJggg==", + }, + ) + 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("bfl/erase-v1", { + image: "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + mask: "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAB+UlEQVR42u3TMQ0AAAzDsPIn3d7DMBtCpKTwWCTAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAbAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGgGvctyzUB/Dz3wAAAABJRU5ErkJggg==", +}); +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/bfl/erase-v1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\", \"mask\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAB+UlEQVR42u3TMQ0AAAzDsPIn3d7DMBtCpKTwWCTAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAbAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGgGvctyzUB/Dz3wAAAABJRU5ErkJggg==\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bfl/erase-v1/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/bfl/erase-v1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/black-forest-labs/flux-1-1-pro-ultra-image/code.mdx b/development/comfy-router/models/black-forest-labs/flux-1-1-pro-ultra-image/code.mdx index 591b6997c..06902dac0 100644 --- a/development/comfy-router/models/black-forest-labs/flux-1-1-pro-ultra-image/code.mdx +++ b/development/comfy-router/models/black-forest-labs/flux-1-1-pro-ultra-image/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Flux 1.1 Pro Ultra Image" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Flux 1.1 Pro Ultra Image. FLUX 1.1 [pro] is a text-to-image model from Black Forest Labs. Ultra mode generates images at up to 4MP resolution. @@ -22,6 +23,8 @@ Pick the model you want to call. Everything below, from the snippets to the sche **Endpoint:** `POST https://api.comfy.org/v2/models/bfl/flux-pro-1.1-ultra` + + ```python Python from comfy_sdk import Comfy @@ -64,6 +67,85 @@ curl https://api.comfy.org/v2/models/bfl/flux-pro-1.1-ultra \ -d "{\"prompt\": \"a single red maple leaf on a plain white background, studio lighting\", \"aspect_ratio\": \"16:9\", \"raw\": false}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bfl/flux-pro-1.1-ultra/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( + "bfl/flux-pro-1.1-ultra", + { + "prompt": "a single red maple leaf on a plain white background, studio lighting", + "aspect_ratio": "16:9", + "raw": 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("image:", result["result"]["sample"]) +``` + +```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. +type Result = { result: { sample: string } }; +const handle = await comfy.models.submit("bfl/flux-pro-1.1-ultra", { + prompt: "a single red maple leaf on a plain white background, studio lighting", + aspect_ratio: "16:9", + raw: 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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("image:", result.data.result.sample); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/bfl/flux-pro-1.1-ultra/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"prompt\": \"a single red maple leaf on a plain white background, studio lighting\", \"aspect_ratio\": \"16:9\", \"raw\": 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/bfl/flux-pro-1.1-ultra/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/bfl/flux-pro-1.1-ultra/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + +

Schema

@@ -224,6 +306,8 @@ The URL is temporary. Download the image promptly if you need to keep it. **Endpoint:** `POST https://api.comfy.org/v2/models/bfl/flux-pro-1.1` + + ```python Python from comfy_sdk import Comfy @@ -266,6 +350,85 @@ curl https://api.comfy.org/v2/models/bfl/flux-pro-1.1 \ -d "{\"prompt\": \"a single red maple leaf on a plain white background, studio lighting\", \"width\": 1024, \"height\": 768}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bfl/flux-pro-1.1/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( + "bfl/flux-pro-1.1", + { + "prompt": "a single red maple leaf on a plain white background, studio lighting", + "width": 1024, + "height": 768, + }, + ) + 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("image:", result["result"]["sample"]) +``` + +```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. +type Result = { result: { sample: string } }; +const handle = await comfy.models.submit("bfl/flux-pro-1.1", { + prompt: "a single red maple leaf on a plain white background, studio lighting", + width: 1024, + height: 768, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("image:", result.data.result.sample); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/bfl/flux-pro-1.1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"prompt\": \"a single red maple leaf on a plain white background, studio lighting\", \"width\": 1024, \"height\": 768}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bfl/flux-pro-1.1/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/bfl/flux-pro-1.1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + +

Schema

diff --git a/development/comfy-router/models/black-forest-labs/flux-1-kontext/code.mdx b/development/comfy-router/models/black-forest-labs/flux-1-kontext/code.mdx index 13ba6a06a..32a73867b 100644 --- a/development/comfy-router/models/black-forest-labs/flux-1-kontext/code.mdx +++ b/development/comfy-router/models/black-forest-labs/flux-1-kontext/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "FLUX.1 Kontext" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for FLUX.1 Kontext. FLUX.1 Kontext is Black Forest Labs' instruction-driven image editing model: send an image and a text instruction, get the edited image back with the rest of the scene preserved. @@ -22,6 +23,8 @@ Pick the model you want to call. Everything below, from the snippets to the sche **Endpoint:** `POST https://api.comfy.org/v2/models/bfl/flux-kontext-pro` + + ```python Python import base64 @@ -74,6 +77,95 @@ curl https://api.comfy.org/v2/models/bfl/flux-kontext-pro \ -d "{\"prompt\": \"replace the background with a sunlit beach, keep the subject unchanged\", \"input_image\": \"$INPUT_IMAGE\", \"aspect_ratio\": \"1:1\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bfl/flux-kontext-pro/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 +import base64 + +from comfy_sdk import Comfy + +with open("input.jpg", "rb") as f: + input_image = base64.b64encode(f.read()).decode() + +# 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( + "bfl/flux-kontext-pro", + { + "prompt": "replace the background with a sunlit beach, keep the subject unchanged", + "input_image": input_image, + "aspect_ratio": "1:1", + }, + ) + 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("image:", result["result"]["sample"]) +``` + +```typescript TypeScript +import { comfy } from "@comfyorg/sdk"; +import { readFile } from "node:fs/promises"; + +const inputImage = (await readFile("input.jpg")).toString("base64"); + +// Reads COMFY_API_KEY from the environment. +// Each submit() call mints its own Idempotency-Key and reuses it for automatic retries. +type Result = { result: { sample: string } }; +const handle = await comfy.models.submit("bfl/flux-kontext-pro", { + prompt: "replace the background with a sunlit beach, keep the subject unchanged", + input_image: inputImage, + aspect_ratio: "1:1", +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("image:", result.data.result.sample); +``` + +```bash cURL +INPUT_IMAGE=$(base64 < input.jpg | tr -d '\n') + +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/bfl/flux-kontext-pro/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"prompt\": \"replace the background with a sunlit beach, keep the subject unchanged\", \"input_image\": \"$INPUT_IMAGE\", \"aspect_ratio\": \"1:1\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bfl/flux-kontext-pro/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/bfl/flux-kontext-pro/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + +

Schema

@@ -236,6 +328,8 @@ The URL is temporary. Download the image promptly if you need to keep it. **Endpoint:** `POST https://api.comfy.org/v2/models/bfl/flux-kontext-max` + + ```python Python import base64 @@ -288,6 +382,95 @@ curl https://api.comfy.org/v2/models/bfl/flux-kontext-max \ -d "{\"prompt\": \"replace the background with a sunlit beach, keep the subject unchanged\", \"input_image\": \"$INPUT_IMAGE\", \"aspect_ratio\": \"1:1\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bfl/flux-kontext-max/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 +import base64 + +from comfy_sdk import Comfy + +with open("input.jpg", "rb") as f: + input_image = base64.b64encode(f.read()).decode() + +# 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( + "bfl/flux-kontext-max", + { + "prompt": "replace the background with a sunlit beach, keep the subject unchanged", + "input_image": input_image, + "aspect_ratio": "1:1", + }, + ) + 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("image:", result["result"]["sample"]) +``` + +```typescript TypeScript +import { comfy } from "@comfyorg/sdk"; +import { readFile } from "node:fs/promises"; + +const inputImage = (await readFile("input.jpg")).toString("base64"); + +// Reads COMFY_API_KEY from the environment. +// Each submit() call mints its own Idempotency-Key and reuses it for automatic retries. +type Result = { result: { sample: string } }; +const handle = await comfy.models.submit("bfl/flux-kontext-max", { + prompt: "replace the background with a sunlit beach, keep the subject unchanged", + input_image: inputImage, + aspect_ratio: "1:1", +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("image:", result.data.result.sample); +``` + +```bash cURL +INPUT_IMAGE=$(base64 < input.jpg | tr -d '\n') + +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/bfl/flux-kontext-max/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"prompt\": \"replace the background with a sunlit beach, keep the subject unchanged\", \"input_image\": \"$INPUT_IMAGE\", \"aspect_ratio\": \"1:1\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bfl/flux-kontext-max/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/bfl/flux-kontext-max/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + +

Schema

diff --git a/development/comfy-router/models/black-forest-labs/flux-2-max/code.mdx b/development/comfy-router/models/black-forest-labs/flux-2-max/code.mdx index ba9a21503..327c13a55 100644 --- a/development/comfy-router/models/black-forest-labs/flux-2-max/code.mdx +++ b/development/comfy-router/models/black-forest-labs/flux-2-max/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "FLUX 2 Max" {/* GENERATED FILE. Generated from router-schemas/bfl/flux-2-max.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bfl/flux-2-max`, served by Comfy Router from Black Forest Labs. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bfl/flux-2-max` + + ```python Python from comfy_sdk import Comfy @@ -55,6 +58,79 @@ curl https://api.comfy.org/v2/models/bfl/flux-2-max \ -d "{\"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bfl/flux-2-max/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( + "bfl/flux-2-max", + { + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("bfl/flux-2-max", { + prompt: "A single red maple leaf on a plain white background.", +}); +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/bfl/flux-2-max/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bfl/flux-2-max/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/bfl/flux-2-max/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/black-forest-labs/flux-2-pro/code.mdx b/development/comfy-router/models/black-forest-labs/flux-2-pro/code.mdx index d24fc8057..4974b4461 100644 --- a/development/comfy-router/models/black-forest-labs/flux-2-pro/code.mdx +++ b/development/comfy-router/models/black-forest-labs/flux-2-pro/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "FLUX 2 Pro" {/* GENERATED FILE. Generated from router-schemas/bfl/flux-2-pro.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bfl/flux-2-pro`, served by Comfy Router from Black Forest Labs. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bfl/flux-2-pro` + + ```python Python from comfy_sdk import Comfy @@ -55,6 +58,79 @@ curl https://api.comfy.org/v2/models/bfl/flux-2-pro \ -d "{\"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bfl/flux-2-pro/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( + "bfl/flux-2-pro", + { + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("bfl/flux-2-pro", { + prompt: "A single red maple leaf on a plain white background.", +}); +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/bfl/flux-2-pro/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bfl/flux-2-pro/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/bfl/flux-2-pro/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/black-forest-labs/flux-3-video/code.mdx b/development/comfy-router/models/black-forest-labs/flux-3-video/code.mdx index 1200cb640..7b6bdbfc6 100644 --- a/development/comfy-router/models/black-forest-labs/flux-3-video/code.mdx +++ b/development/comfy-router/models/black-forest-labs/flux-3-video/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "FLUX 3 Video" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for FLUX 3 Video. FLUX 3 Video is Black Forest Labs' video generation model, turning a text prompt into a short clip with synchronized audio. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bfl/flux-3-video` + + ```python Python from comfy_sdk import Comfy @@ -64,6 +67,89 @@ curl https://api.comfy.org/v2/models/bfl/flux-3-video \ -d "{\"mode\": \"t2v\", \"prompt\": \"a single red maple leaf falling onto still water, slow motion\", \"duration\": 5, \"aspect_ratio\": \"16:9\", \"generate_audio\": true}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bfl/flux-3-video/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( + "bfl/flux-3-video", + { + "mode": "t2v", + "prompt": "a single red maple leaf falling onto still water, slow motion", + "duration": 5, + "aspect_ratio": "16:9", + "generate_audio": True, + }, + ) + 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("video:", result["result"]["sample"]) +``` + +```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. +type Result = { result: { sample: string } }; +const handle = await comfy.models.submit("bfl/flux-3-video", { + mode: "t2v", + prompt: "a single red maple leaf falling onto still water, slow motion", + duration: 5, + aspect_ratio: "16:9", + generate_audio: true, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.result.sample); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/bfl/flux-3-video/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"mode\": \"t2v\", \"prompt\": \"a single red maple leaf falling onto still water, slow motion\", \"duration\": 5, \"aspect_ratio\": \"16:9\", \"generate_audio\": true}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bfl/flux-3-video/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/bfl/flux-3-video/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/black-forest-labs/flux-pro-1-0-canny/code.mdx b/development/comfy-router/models/black-forest-labs/flux-pro-1-0-canny/code.mdx index d7519b7b7..3e2cd298f 100644 --- a/development/comfy-router/models/black-forest-labs/flux-pro-1-0-canny/code.mdx +++ b/development/comfy-router/models/black-forest-labs/flux-pro-1-0-canny/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "FLUX Pro 1.0 Canny" {/* GENERATED FILE. Generated from router-schemas/bfl/flux-pro-1.0-canny.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bfl/flux-pro-1.0-canny`, served by Comfy Router from Black Forest Labs. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bfl/flux-pro-1.0-canny` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/bfl/flux-pro-1.0-canny \ -d "{\"control_image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\", \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bfl/flux-pro-1.0-canny/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( + "bfl/flux-pro-1.0-canny", + { + "control_image": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("bfl/flux-pro-1.0-canny", { + control_image: "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + prompt: "A single red maple leaf on a plain white background.", +}); +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/bfl/flux-pro-1.0-canny/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"control_image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\", \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bfl/flux-pro-1.0-canny/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/bfl/flux-pro-1.0-canny/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/black-forest-labs/flux-pro-1-0-depth/code.mdx b/development/comfy-router/models/black-forest-labs/flux-pro-1-0-depth/code.mdx index 611d0fa6e..1098394e9 100644 --- a/development/comfy-router/models/black-forest-labs/flux-pro-1-0-depth/code.mdx +++ b/development/comfy-router/models/black-forest-labs/flux-pro-1-0-depth/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "FLUX Pro 1.0 Depth" {/* GENERATED FILE. Generated from router-schemas/bfl/flux-pro-1.0-depth.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bfl/flux-pro-1.0-depth`, served by Comfy Router from Black Forest Labs. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bfl/flux-pro-1.0-depth` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/bfl/flux-pro-1.0-depth \ -d "{\"control_image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\", \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bfl/flux-pro-1.0-depth/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( + "bfl/flux-pro-1.0-depth", + { + "control_image": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("bfl/flux-pro-1.0-depth", { + control_image: "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + prompt: "A single red maple leaf on a plain white background.", +}); +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/bfl/flux-pro-1.0-depth/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"control_image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\", \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bfl/flux-pro-1.0-depth/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/bfl/flux-pro-1.0-depth/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/black-forest-labs/flux-pro-1-0-expand/code.mdx b/development/comfy-router/models/black-forest-labs/flux-pro-1-0-expand/code.mdx index f7c5b9854..c04020591 100644 --- a/development/comfy-router/models/black-forest-labs/flux-pro-1-0-expand/code.mdx +++ b/development/comfy-router/models/black-forest-labs/flux-pro-1-0-expand/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "FLUX Pro 1.0 Expand" {/* GENERATED FILE. Generated from router-schemas/bfl/flux-pro-1.0-expand.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bfl/flux-pro-1.0-expand`, served by Comfy Router from Black Forest Labs. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bfl/flux-pro-1.0-expand` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/bfl/flux-pro-1.0-expand \ -d "{\"image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\", \"prompt\": \"extend the plain white background upward\", \"top\": 64}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bfl/flux-pro-1.0-expand/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( + "bfl/flux-pro-1.0-expand", + { + "image": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + "prompt": "extend the plain white background upward", + "top": 64, + }, + ) + 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("bfl/flux-pro-1.0-expand", { + image: "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + prompt: "extend the plain white background upward", + top: 64, +}); +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/bfl/flux-pro-1.0-expand/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\", \"prompt\": \"extend the plain white background upward\", \"top\": 64}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bfl/flux-pro-1.0-expand/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/bfl/flux-pro-1.0-expand/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/black-forest-labs/flux-pro-1-0-fill/code.mdx b/development/comfy-router/models/black-forest-labs/flux-pro-1-0-fill/code.mdx index c4a990db6..a92f7984a 100644 --- a/development/comfy-router/models/black-forest-labs/flux-pro-1-0-fill/code.mdx +++ b/development/comfy-router/models/black-forest-labs/flux-pro-1-0-fill/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "FLUX Pro 1.0 Fill" {/* GENERATED FILE. Generated from router-schemas/bfl/flux-pro-1.0-fill.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bfl/flux-pro-1.0-fill`, served by Comfy Router from Black Forest Labs. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bfl/flux-pro-1.0-fill` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/bfl/flux-pro-1.0-fill \ -d "{\"image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\", \"mask\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAB+UlEQVR42u3TMQ0AAAzDsPIn3d7DMBtCpKTwWCTAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAbAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGgGvctyzUB/Dz3wAAAABJRU5ErkJggg==\", \"prompt\": \"plain white background\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bfl/flux-pro-1.0-fill/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( + "bfl/flux-pro-1.0-fill", + { + "image": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + "mask": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAB+UlEQVR42u3TMQ0AAAzDsPIn3d7DMBtCpKTwWCTAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAbAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGgGvctyzUB/Dz3wAAAABJRU5ErkJggg==", + "prompt": "plain white background", + }, + ) + 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("bfl/flux-pro-1.0-fill", { + image: "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + mask: "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAB+UlEQVR42u3TMQ0AAAzDsPIn3d7DMBtCpKTwWCTAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAbAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGgGvctyzUB/Dz3wAAAABJRU5ErkJggg==", + prompt: "plain white background", +}); +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/bfl/flux-pro-1.0-fill/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\", \"mask\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAB+UlEQVR42u3TMQ0AAAzDsPIn3d7DMBtCpKTwWCTAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAbAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGgGvctyzUB/Dz3wAAAABJRU5ErkJggg==\", \"prompt\": \"plain white background\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bfl/flux-pro-1.0-fill/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/bfl/flux-pro-1.0-fill/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/black-forest-labs/flux-video-upscale/code.mdx b/development/comfy-router/models/black-forest-labs/flux-video-upscale/code.mdx index f5312b4e3..1665ffaf6 100644 --- a/development/comfy-router/models/black-forest-labs/flux-video-upscale/code.mdx +++ b/development/comfy-router/models/black-forest-labs/flux-video-upscale/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "FLUX Video Upscale" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for FLUX Video Upscale. FLUX Video Upscale is Black Forest Labs' video upscaler: send a video, get a higher-resolution version back. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bfl/video-upscale-v1` + + ```python Python from comfy_sdk import Comfy @@ -60,6 +63,85 @@ curl https://api.comfy.org/v2/models/bfl/video-upscale-v1 \ -d "{\"input_video\": \"https://your-host.example/clip.mp4\", \"upscale_factor\": 2, \"creativity\": 1}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bfl/video-upscale-v1/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( + "bfl/video-upscale-v1", + { + "input_video": "https://your-host.example/clip.mp4", + "upscale_factor": 2, + "creativity": 1, + }, + ) + 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("video:", result["result"]["sample"]) +``` + +```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. +type Result = { result: { sample: string } }; +const handle = await comfy.models.submit("bfl/video-upscale-v1", { + input_video: "https://your-host.example/clip.mp4", + upscale_factor: 2, + creativity: 1, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.result.sample); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/bfl/video-upscale-v1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input_video\": \"https://your-host.example/clip.mp4\", \"upscale_factor\": 2, \"creativity\": 1}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bfl/video-upscale-v1/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/bfl/video-upscale-v1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/black-forest-labs/video-edit-v1/code.mdx b/development/comfy-router/models/black-forest-labs/video-edit-v1/code.mdx index 258d44c15..9b1bc7c25 100644 --- a/development/comfy-router/models/black-forest-labs/video-edit-v1/code.mdx +++ b/development/comfy-router/models/black-forest-labs/video-edit-v1/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Video Edit V1" {/* GENERATED FILE. Generated from router-schemas/bfl/video-edit-v1.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bfl/video-edit-v1`, served by Comfy Router from Black Forest Labs. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bfl/video-edit-v1` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/bfl/video-edit-v1 \ -d "{\"prompt\": \"Remove the orange bucket.\", \"video\": \"https://example.com/clip.mp4\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bfl/video-edit-v1/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( + "bfl/video-edit-v1", + { + "prompt": "Remove the orange bucket.", + "video": "https://example.com/clip.mp4", + }, + ) + 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("bfl/video-edit-v1", { + prompt: "Remove the orange bucket.", + video: "https://example.com/clip.mp4", +}); +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/bfl/video-edit-v1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"prompt\": \"Remove the orange bucket.\", \"video\": \"https://example.com/clip.mp4\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bfl/video-edit-v1/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/bfl/video-edit-v1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/black-forest-labs/vto-v1/code.mdx b/development/comfy-router/models/black-forest-labs/vto-v1/code.mdx index 84ee9ab25..1fc502117 100644 --- a/development/comfy-router/models/black-forest-labs/vto-v1/code.mdx +++ b/development/comfy-router/models/black-forest-labs/vto-v1/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "VTO V1" {/* GENERATED FILE. Generated from router-schemas/bfl/vto-v1.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bfl/vto-v1`, served by Comfy Router from Black Forest Labs. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bfl/vto-v1` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/bfl/vto-v1 \ -d "{\"garment\": \"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\", \"person\": \"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\", \"prompt\": \"TRY-ON: The person of image 1 wearing the garments of image 2.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bfl/vto-v1/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( + "bfl/vto-v1", + { + "garment": "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", + "person": "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", + "prompt": "TRY-ON: The person of image 1 wearing the garments of image 2.", + }, + ) + 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("bfl/vto-v1", { + garment: "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBAUEBAYFBQUGBgYHCQ4JCQgICRINDQoOFRIWFhUSFBQXGiEcFxgfGRQUHScdHyIjJSUlFhwpLCgkKyEkJST/2wBDAQYGBgkICREJCREkGBQYJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCT/wAARCAEgAYADASIAAhEBAxEB/8QAHAABAAIDAQEBAAAAAAAAAAAAAAEGBAUHAwgC/8QAXxAAAQIEBAMCBgsLBgoIBwEAAQIDAAQFEQYHCCESMUETURQiYXGR0RUjMkJygaGisbLBFiQzQ1JigpKjs+EXGCU0VcImKDVTY2Rlc3WDRVR0k7TD0uI2RmaElKTw8f/EABgBAQEBAQEAAAAAAAAAAAAAAAABAgME/8QAKREBAQABAwQBBQADAAMAAAAAAAECETFBITJRcQMSIkJhgRORsTNS0f/aAAwDAQACEQMRAD8A+qekRE9IiAQhCIEIQihCEIgfHERMReKG8N4XheAQ3hE3gEIQgEIQgJtC0ReF4CbRESYiAQhcd8Rcd4gJhEXHeImAQhEwEWhE3iIBCEIgQhCAQhCARFom8ReKEIQgG8N4XheARMIXgIhvAmJgEIQiAOUIdIiKF4XhCAQhCAXheEIBeEIQCEIQCEIQC8TERNoBCEIBCEV+uY+wzh2YTKT9YlUzy1BDck2rtJhxR9ylLSbqJPQWhJrsLBeODYjxY5mBmIrDycV1bDtOkph6UbFOnESrjzraLqcWoglQ4rpSnltfmdrbI5nu1nNmWwomVfkGJeTedebeKe0ceskpSeEkWSkk2udz5I+Tc3qEhrNKtKmJqVYaRUnkr7Z3hJSXCq4FiTsoR2xw03Z1fUjOVFd4QZLNjHIBFwXHWnhb40x7t5a45YUkt5uYk8U7BynS67+e43j44DqJIXanKmw2DYLQFBPpBEZcm9V5qXdnZWexG8y0oJW6yHlpQTcgXB25GOl+OS7pK+vF5Z4vmiUzebOLFJB3MvKsMfKExgzeUzwQVTuZOPnwnxrKqqWQSBfoB1j5GmahNtfh6pXAVEm73apJ/WMa18NTI41zE06AFKJUQTbrzMJhPJq+6MA1NVJrpwwqvzVdYelVzrEzOTaJh9socShbZWnmmy0KF9x43MWt0UGPjbSvLeA5lAttONh2nvqPHw7psgg7E7cucdgpGfVIw5iGv4exS++huQqrrEtOpbLgDRUSlLlt/F3AIB2tflHPP47b9qy+XaDCMKj1um4gkG6hSZ6XnpR33LzCwtJ8lx18nOM2OOjRCEIBEXiYi0AvCEIBCEIBCEIBCEIBCEIBCEIBEiIgICekRE9IiAQhCAQhCAQhCAQhCAQhC0AtEwhAIRUseZm0DL5lAqbrrk482pxiUZTdx0J5m52A859MVrDVbxtmMlFSnEHCuHnfGYl2PGnpxJ5EuKHtaD3hIUelucbnx2zXhNeHUeNNyniFxzF4pOZObmHctJIKqD3hNQdTxS9PYUO1c8p/IT+cfivHOc1s9JLBLbuGsHhmcrY9rccT7Y3KK/OJJLjvkJIHvj0ji+EcJ/drjyWlMY1abamqhMpQ9xguTTy1C4BvsjbqeQtZMdcPh5y2ZuXhcG8yM2c6Kq7TcPvKpkn+NEmS01LoPV173R8wNz0THTaHgXBOQ1DTiGrvGerRup2fdHE/MLI3Sygnxb8r87XKlRps4cYz2SkjSMNYGkaXTpZ+WdeLi2S44lSVAX3NlKN91KBMZWodhVVybp9ZSltT/bSUw64U+MsLQRz7rrBtyje+knSVHOaZmCZrOyiYzmpL2NlKjNcHDx8aQ0sFkK4rWVve5G10nuj2zpmZPBubdbqM/Llxh5piaQUtBakqUlIBF/zkEGNDiekuTWTeC60luzrLs7JLWkWt7cpxB+VcWvO9pjF2EMFY4cbLjNQk0yU8AbHiHjWv0PEl0R0s1vT9z/4kq3VTUXltizDL1KqdGrMxJz8vwOtCWbANx0PHsQdwehAMcPxHUcGU2nyzeDxjyR4ZpK3yuoI4ezseIpQg+7uE7nuMdcy7wHkzMYdSKtMyLU5KOradTM1dTarXuklPGLbEdOkb+ao+niWaMs49hsX24vDnFEfphW3pjjphtpWta4RhecwFiKkrVjmo47mZuXmXBLsNPIWhLRCbeMse7NrEi3IR2GmZt5IVGVaoU7RhKMS8umVbE9SUuENpTwgcaAo3t1PWNyjLbIiUQiZXUaWWli6QquEpI8njxqncmslcRTcxN0isoZ7NBUsU6rJc4QBueBfEbxZMP2a1qMoZGg0bMfElVolWmqnQKTSEFqcmkgLKFBKuE+Kn3KW1AEgGKFlRQqfmljups4ge4E1VM1NIT2vAsuqIKSjfdSe0Krb34eVosWFy1Scl8xKpK8aG52Z9j5ZSj4xQAlsC/fZw/LGwyUwiyjLPGWIZogXp77Eur3yClsrUsHoeIgAjfYxu9JdPSbtDVcOZg6eK6ufpU0tylOrAE0hBVLTHcl5s+5X/APyVR3HK7PejZhJRT5kJpddt/VHFXQ+epaV774J8YeXnFd044tqeOKLXaZiOeXV5eX7BKEziQ54iwsKQokeMPFHO8cUrdAksS5kzWHsE092RqDc3MNtS6JjiZJZKjxoWbKb2TexJAPIiJljMrcct5yTp1j7AqmMJXDp7SusuSMmTYT4Bcl0/DUBdvzqAT5Y3EnPylRlkTUlMsTLC90usrC0K8xG0cGy/zirNDnhg3NSTdlJopDbdRmUDhWk7BL/Sx3Ac5H33fGPmHlJX8Jvu4qysnZyQH4WZpUo4QCOfE0nkodS2Qfze6OP+KbVrV9EQjhGUepGXxA4zQ8Y9lJVNSg21PJHAy+rlZY/Fr+afJyjuDU7KvzD0s1MNLfY4S60lYKm+IXTxDmLjlfnHPLC43SrLq97RETCMqiELQgEIQgEIQgEIQgEIQgEIQgJ6RET0iIBCEIBCEIBCEIBCETALQhAmAXsI5nm9nbSstpVUlLdnP11xF25UHxWQeS3SOQ7k8z5BvGnzrz4l8EodoOH3GpivKFnHNlNyIPVXQr7k9OZ7jU8oskF1ZwY0x+FvdqozTMnNm5dJ37Z+/TqEnznbaO2HxyT6s9mbeI1+VeX+I8e4jTmVj6YSaekKfYZnk7TAAJSspJCUNJ2I6Gw2tuent1tGa9MmW8N4gek6S28qWnJuWbKJl02B4Wiq3AggjxwLnkmw3PKM1cwqrm5idGBcEds9TUngJYPCJ1Y5qUejKfLt1/Jjp+ReBJjL9uvUKcfbmVtzjEwHUJISsrYQSRfoFcQHmv5I6Z66a3/ST9ONaYwlzM5+XmJRnsRJTAaSpseKtK0eML9bX357mN1jot0rUvLTHIGoyDh/SS2DGJkSjwfOx5oCwAn0W8yj6onOIKXqJpkuk+M9N00/Kj1R02zvpneNjq4llOVbDbzaiPvaZQfLZaPXFqzMK0aaKY2o8anJOmoUs9BdBv8AJGm1YNkTWGiP83ND5zcWDH7fbaa6eHeYkacd+/ibjE7cPa81W6LRkYg0vqShF3JJ9+aR+g8ri+YpUYmB5T7tNOWIaLYLmaPMOTDCeoKbPC3nu4Pji2ZRPy0vkpLeEHgkXJ6Zam1hN0tsqK0qUruSLgk9I5vkxmXSMIt4spbEvM1ZDykBC2rIZWB2iOLiO9iCDyN4ty0+qfsk2a/COVcrmW/Rqm1V0Uwz0uuRmFGX7Xjm5fl74WKmSlXl4VR0RekmnmSdbexZPqWU7FuTQAD5io39IjhOB8yK9RsQuYeEy21S0znbqZbl0qIcaBCVJNwpJ2G6VD4+UdQns9n8c104bdl0S03IKcU1Ny61MtzOydihR4kEedXXlGf8lt0xukX6fLeSWkXs+EPYuHAlNh2dP8Y+e64o1QyklMrsR1iqrrLVXFFp6ptREt2ZYfc8SXQrcjiUpQVYckpPfHYMwcYT8rlsGqJJzU7NyUk3MzUyl8pS0psBSkcV7uL28ZI2te56H5nzGxliKkzDtAcm1uSlUZl56fYeAWXpk3JWVWve+221gNov+TLTXKp9M4dMxFKKw3psw9JLFnapNomF35kqK3d/iDcdHpVOFC021JsJ4XF0R19Z/OdbK/oWI5ZnVjGmYkw9g6jU9D0imTCmHGn08IDnA2hNlA2IsFb+m0dqx683JZOYwl2SC3JSxkkkcjwNNI+m8TLLWT2unWqbpGpoTQ8QThB8eeZbv5ENk/34pmnSnh/OWbnXFcSxLzrwJ58SlgE/OMdA0llxWEa6Tsj2RFvP2Kb/AGRRNNbpVms+km/3lNfXRGr+aeHjnpLv1jPlmSKzw3kJRIBtZKuEkfPVHYce46kMjk0aWYkJibpc666jwUP+NKoQEm7RV0ur3BNh0tHMMzR/jJSNhcqnKb9CIzdXswF1DDcsD4wl5ly3wlIA+iH06/TP0a71s85svsOYiwa7mbRlexTz0miaeQ63wCbQu1rpF+F43AvuDffvjyorUvjCUl8XZVTL1LxJRZZmTmaZNL4vDGUJslt0k2WSAeFfI8vFIFuqVKsYbw1RMO0LES5dErUmkSTSJhAUypSWh4q77Achc7XI5RxrGGHJjT7j2RxlQWnnsMza/B5yUCrlkK3LVzzG3EgnkU2J784XWaf6W9HZ8tc0qbmDKOMFtVOrkn4k7TH9nGVA2JF9ym/XmORtF3jj2KcFU7MmVksfYBqzcliBtIclp9k8KZmw/BvDor3tyNuSgRy3+WeaQxU69h/EEqaRiuQHDNSLg4e1t+Mb7x1tva/UWMccsOYsroULQhHNpEImItAIQhAIQhAIQhAIQhAT0iInpEQCEIQCEIQCJtCEAiQIcogmAk7RwTPPUCjDomMNYUmEuVPduankEFMp3pQeRc7zyT5+Wtz21BiU8Iwvg+au9u1N1Fk34ehbaI69CocuQ33HnkjkKmnJaxhjdhKX0jt5WnzFuGXA3Dr19uIcwk+55nfYd8MJjPqzZt16R45H5IrJRjbGzXCB98ysnNHc++7d7i9IB+EegjUZxZ0T2Pah9yODu3cprrgYUtgEuVJwnZKRz7O/Ie+5naGdOc83jyd+4/B5fepzrgZccZBLlRWTshI59nf9bnyjoeV2V9Gycw89ivFb8umrJZ4nn1niRJIP4tvvWeRI3J2G3Prbp92W/EZ/UeOBsMUfT1geZxBiRaHKzOAJeDZBUVHdEs0eveo8rgnkBGZkPjirY5rGKajVQUpW5LmXQkHs2UALHZpPW1wT1uq/WOUVapV7UXmMxJSKHJSkyt+zCxdMoxccTq+hWrYW77JGwJj6YwvR6DhZqXw5SChpUjLBZZvdfApX4RZ71KSd+tj3Rj5OmP3b1Z122fPOSjYTnjNKvsk1BXzj64/GYqvZHVFTEtpuliZpqFHy+Kr7RHlp9UutZx1N5o+1MSs24pXfxupH2xscRpaVqaY4QP8AKsmD5w2iO10ud9M7RuNVr4E1h1q24amV3+NAjdZvlQ090osnhT2NOvb8nhT/AAiuasnAioYd2uVS8yPnIix5j+36aaetXMSNNV8rcc524e15r9ZCt+FZIzsqCT7ZPtelN/70UzSkbYlrbCwFBdObUQd/cuf+6LxpoAcyvnmyNhPzA9LaIo2l7xMd1NI5GmLB+J1uLdszw0s3Rae5qTmaZUJVt2RnKq42pBFrdo0bEEcjdQ5RjTeV9KpWpFmguTM6xJTpCmXeJJWQuXNtyLe7SRyjc4vSGtSjJR7o1iSI85Dd46RmNhOQrmbFBnETTzU7KUx6YUGSUqQlDoShQUNweJ1XTYJNt+UzsmlvgmrVT9UpuB8STeB2ZRsKq9+BbahxTCQylTj7oHuVbKQeXFZJtsTHzhm0y5Vs0ky0u3clMu0kdBy5+mOh0jCUzUtTdTk5NxEu2A9wuLJXwDwdNwLm5sSYx80sOyuFs2ZeRYWt5REipx5fulqKhfzDyRjHH6rpWrdI2GemXL9IpVMfqbCE8c6tCUocBCx2d77eWOhy8q01pPU2hoJSaWparc1Httye87Q1XvIaw/QCrl4e4P2ZjLlXW/5q6l38X2GcN/0zFkn0439pb1rG0ovJOGa7Lpt4k+lW35zQ/wDTFA03tqTm3MXvtJTQP66Iuekt1C6diXgVcCal/qKisZHONy2eVQZRYoX7INpt5HL/AN2Ol3zZ8PDNd1TOoyWUnmJqmkfs49tV/E5jSjNC/wDk4pHkJeWPsEeebQtqJk1dRNU0+fdEbzVXJtIruF56/tjiH2Fi3vUuIUD6VGLjvj6LyvOcuV01mLhamO0yYtUKayVMS7lg3MhSU8Sb9FeKLHl0PO453lBin7uKbWMrMaF5xxLS25YTGzyUJ2U1c78bZAUm+4AI5CLZmPmrN5ZZh0IOpcmKJN0poTcsnmLLUO1QPywOnUbdxFQzzww8mo0/NvBMwFN8LT0xMyu/CR+DmPKCPEXfuF+ZjGGukxv8W76q2xM4104Yq7FweF0yYVcoNxL1Bse+SfeOAfGOtxHaJuQwxnrQJXEOH6gunVyRIMtPteLMyLo3DboHNP8A/qTzBx8GZgYVzzw6vDWI5OXbqhb4nZJRsHCB+FYVzBHOw8ZPlG8cfxRhPF2njFTdcoc24/SXl8DU0U3bdTe/YTCRtfuPXmkg7C910vTI29O/YBzGn36mcHY2l0U3FLCboUNmKk2PxrJ5E96R8XUDo0cfolfwhqEwyGHQuSq8lZ7gbc4Zqnu9HWV8ym/XkeSgDG/wli+rUWqM4QxwpHsk5dNOqyBwsVZI6fmPAc0HnzEcM8PDUroMIAwjk0gwiYi0AhCEAhCEAhCEBPSIiekRAIQhAICETAInlECPy882w0t11aW20JKlrWbBIHMknkICVKCElSiAALknpHzNnjn+7U1O4TwU84tp1XYTE6xcrmCduyZtvY8iobq5Dbc+ebudj+OJlzCOEFvmTeX2PbMg8dRWduzSOYQen5XWwjeZXZV0nLSRcxbiyYlU1JhHE4+4oFqnDlwoPvnDyKh12T3n04fHMfuy3Yt16R+MmcjJXCDKcX41DAqLKO3al3lDsqckC/GsnYuAfEnyncVLNnOKpZlVAYSwg3MqpTzoa9qSe2qS77C3MN33CevNW2w/OOMdYmztrSMMYVkZlFI4rolh4qpix/CvnklI5hJ2HW55dHw7hbCWnmgGtV2Zbna/MIKEqQLrWerbCTyT3rNr9bbCOm11y63iJ+ps/eWmWFDyYoTuK8WTMsKqlu7j6jxIk0n8W3+Us8iRueQ258wxVibFGf8Ai1ijUWVcZpjSipiWUbIaTyL75G17ejkLkm+5lqdjLUVXPDZxz2Nw9KuFKCAS0z3pQNu0dtzUeXk5Rcq3jXBuRFJcw7hiWana0d3uNV7Ktsp9Y69yBy/NG8NLL5y/4mvT9Ng4rDOnTA3YMlM5VpocQCtnJ54C3EfyW03+Id5O+gyFn63UJbG2Na2p1xc2hJEwsWStTaXFKSgfkpBSLchy740WEcp8TZr1YYpxnNzDEi+QsFY4XphHMJbT+Lb7j6AecdgxK9S0ZX4mkMMLlQxTqdNSaUS/4NlaWjdFxzIvv5ee94xnpJ9O9u6zy4vpNlEtYirk0qyVCQQFXN1ErcuSf1Y09Vm3JvVG202TwIr7KSR5Am/0RuNIckDUsTvKUVnweWTcnvWs/ZGDKtNuamVkWua+snzgH1R0/PL0nEWDVgjin8NgJvZiZ+siLPmAng02SKFDfwCnD5W4qWrCdQzVqCharWk31D9dPqiyZvTng+nOQLQuVS1MSB5+A/ZGJ24e15rN022ayxqC7j+vzB9DaI55pXnfCseVbgR4qaYo8XndRF203tuqyfqC3CQpc3OG3d7WkRSdJ7BYxhVgORpY/eohdszw88SntdT8sDuBWpQfMbjskivtc/amkhI7HDUulPfvMLPxRxOrqV/OmbStW3s5L2H6CI7PSz/jB1rb/wCW5ff/AJxifJtPSxz6jKRKarJ1pO3auPXHwpUKPyiK5qESljOKVd2upiSWfiWR9kWOX8XVi7sLFxW//wBnFY1Gsdpm9KHiI+9ZMfPVG8e6embs6BqvZS5hihlQvaorHpaV6o9Keyl3Sm4jp7DPj0OKiNVqkownRiSf8pH90uP1R3QnSo6q3/Q0zb/vF2jE/wDHj7a5rUaRmA1TsTWPOalj8xcU3JW8rqEm2FHxe1qQF/IVRdNI/EabiZR2vNSw+YqKfk8C9qEfcI2MxUj9eNXfNJtGdnY+zKZ70yZ2PZinurHfZz1CNzq9lnktYZnW1AhKptopPeQhQPyRU9SzK5bN2TmWrn7zlFKt5HFfYI6HquKFYRoriuEWqRTci9rtL2+SLjeuBeVrxjgKnZsZf01l9bbFREk1Myc1a5ZWpsc+pQrkR5LjcRyDJrHL+XWI53L3GzYlpF11TQ8JsW5V5XMG+xacB58rkHkoxnYgxtVsKYVywxjS1grTIOyEyyongmEI4AW1fqEg8wReLVirCGG9QmFWcR4efblq2yjsgt3YpI3Mu+B59ldL3FwbRmTSaZbG+yoZv5ETuGXjirAgf8FYV27kpLqPbSZG/aMkblA52G6elxysOVWddMzEkDg/HTUqqfmUdilx5I7Cog+9UOSXPkJ3FjtFYy6zhr2VtTOEMdSs4ZGWUGwXBxPyI6W/zjXdbp7kkbRZMz8iqZjeS+67ADsqX5lPbqlmVAMTl9+Js8kL8nInuMW+M/5SeYpGZOUdfygq6cXYOmps0yXX2iXWzd6Q70uflN9OI7W2UOp6dl5mlhvO2iKw1iSWYaq/CFLluIpS+U7h5hXNKxzsDxJ5i4ioZYZ8TNGd+5XMLtuzaJl0z0wg9qwRt2cwk7kdOLmOtxvH7zV093ti3Lc9m8kiZ8BlF2CuocllA7Hrwg2PvbcjMpxlv5J+nbKHU6jh19qi4gmlTjCyG5GrrABe7mn7bJd7le5c8itjbbx89ZP57S2MWhhHHAZRVVgy6Hn0BLc90LbiTsl3ybBR5WO0dikpp/DqhLTr7kxTSrhZmXTdct0CHSeaegWfIFb+MeGeFjcqxwgIRzUMREwIgIhCEAhCEBPSIiekRAIQhABExAiYCRGpxXhuSxfh+dodQ7US0432ay0spUnqCD5CAbHY9do2whCUcCwvgLDuSNMqNfr8+09U2OJC5xbdgw2SQlLKeZWsW3G5N0iwBjmFTxPibPrELNEo8s6xLMqK5SUUolptHIuvqHvuvFyF+EcwT9QZj5cUbMqgLpVURwOoPaSs0gePLOW2UO8b2I6gnzxQUz+D9OmDTKS7XhNbf2U0qyX5x0D3aj71oX26AGwuq8enD5NevLFn+nvMzmHdN+Afcom6m+LJvZLtRmLcz1S2m/6I71HfjGB6BibPrGT9Zr8y+KYyseFzKfFAHMS7I5A2/VG5uSL7fC+CcSZ/15zEGIHnJenIXwOTYTZJSD+AYSdtvyuQ63MdCzFzPw9k9QUYQwdLyxqrLfZoaQOJuRvzW4ffOHnY7k7q22O+uN0nXKpv6Y2cWbktltRm8HYRQzK1PsQ2AyBw05ojY/7wjcA8r8R6XreQ2TxqHBjfF6eKUF35NiaOzx5l93i951F+fujta+JktkvNY0nxjHGCXXpBxwvtNTBJXUHCb8a7/i7/AK3wee8zQx9P5lYiZy0wKtK5Z1fZTs237hwJ90kEfikAeMR7oiw25tvsx/tP3XnjPNnE+aNbmMJZbScw7IoHDMTzaw2Xk3sVFZt2bZOw34lfJFhyslO0ybxVhxwMmakHKjIv9kviSpZbvcHqN7X8kc2r1fq2XeJJnAuXE2hclS5LtqxOJlkOremglSluOLseBLaQLAGySLc4tWm6opdw5i+WWpxTKeB3icPjLK2nOJR8p4b+iJZLh9uxz1YekMhM5iVFgCqXlVfOXGjlkKa1QXubGvufKFeuNnpCbV7N4gWo2CpJiw/TO8eM4yJfUulR2vXGz+skeuN6ffl6TiMvVnT/AAmuYfWpRAEi+Pnj1xc81mEHT7TAU3AYpp9ARFf1VItUMOqNhdiYTv8ACR64sGZjyXdN8jM3HCiSpyz6WxGJ24X9rzWRp9ATlJOhIt98zf1BFC0rqT92VUSCN6X/AOaiLhpvmVzOUtRXvbw2cAv/ALtEUDScw6nG9TWpW3sUdv8AmtxbemZ4MWpDWpdlwbKTWpM386W/XHYaRZWoHEBubt4flUnu3dJji2M2nntTKAlXi+zUl9DUdkooW9nxjJoEWNHkfGI5G5jPyds9GKh09KX9WMwu5JS658VpQCK7qMuc3ZNKeZlpMD/vFRvsP9pMarJ5ZKQG3H02A58MsE3PlPOK9n2y7NZ4STfHZARIIHxr/jGse6ei7OgaruzVhSipUCVmpK4d+XtSr/ZH7kwG9KSr/wBjOj0uKjD1YcPsTh0KCyPDHz4qgD+DHeN4zHUhOlThSqwNHG6h3udbX74xOzH2vNYOkhA9g8RL33nmRz7m/wCMUXIUmYzzeeKlHafXz71H1x0PSewWMJ1x0qbUFVEboVfk0n1xQdNrSX82Zl9DyXCmTm3CEpVYXWkcyB3xq75p4Zufcq1PZshCw4VJl5FCbLsBdauY63vFx1YKQcKURgjdVSUoEdLNK9cVPNZ0TeerkoniUvipjdtrD21s+f35je6tpptMjhyVLiQsvTDxTfewSlINvOYuPdgXarLl/hGhYlyIochiRtpUsplbqX3VBCpdS3F8KkLPuVeNt38t72jmlWwZi7T5VkYnoE4KrRXCETCuApStBOyXki4F/euJ2B7r2PQc6CxhXJ6k4flCEMurlZNJVyKUI49/OUC/njmWD8W4typpUjOV2S9lsC15S2kyjqwstE34ggH3F7K8RXiqseR3hhrZbxbsXw6pNyWDNSGEhMy6zJ1aVTwhZAMxIrPvVj37ZPxHmLGOPYexbjDTxit2i1iWW/THFcbspxXafQTbtmFHYH6eSgDuNlX8OP4Gel8zMq6guYoCye1Qm6zJ3PjNPIO5b8+6drnkqOnUusYQ1GYQXTKkymVqsunjWyFDtpRzl2rSj7pB/gocjDtnnH/hv7eWN8B4Xz3w23iXDc2w3VCizM4BbjI/EzCeYI5XO6fKI5Jl7mniXJutrwriWRm3qa27wOyKt3ZUk+7ZPIpPPh9yrmCDGKj7t9OmM+zSnwiVmlWCAD4NU2wen5Kxf4ST3g79un6fg3ULhczUo8mUrEqjsg8AkzEgs7lC7e7bJvyNjvwkG8O2aXrDf2r+Z2U9EzTpRxjgmZlPZd5JPatqAbnbc0r/ACHenEd+h7xgZGZs1+emprBOLKbPTMzT21IM243dbSU7dlM37+QVzPI35xoMpcMZk4FzMew7Lyo8GAS7UEOqPgrzFyEuoP5RsQkje4IVsCI+iPuRW9MOzDrzLTjxBcLTW6rCwudr2G28c/ky+mfTusmvVm4anmHpQSjSFNlgWCSoqATfaxO+3K3kjddIwqZTGaWyW2rqKjdS1c1GM3pHnbRCEIgiEIRQhCEBPSIiekRAIQhAIAwhATExAMIgmKfmJltRswJOWFRlQ5MSbgdaUlfApab3U0VDcJUNj3GxHKLhC0alsusHzrm5nqzhCQGEMFyiqfOMtBl9xTPZ+x4t+DQk7cdj7rcC9wTe41uT2R66+GsXY4ZWiVPt7Uo+bGb69q/fcJ62O6uZ259vxFlhhfE2JKfiSpUxD9QkBZBPuHbbp7RPv+E7pvyJ68o5TiSu4ozprk1h+jJmsP4XprhTUpyaBaVxJPjdpe24ts3f85W1o9GGWs0x6eaxZ16mYOZtVx/OHAuWzLr7To7OZnmPEC0cilCuSGuhXtfkNudGrtZlMl6TNYXwvNtzeKptPZVSrMjaWHSXY63vzPO/lsE7rEmZNPwrSzhfKiXUkzDvZTFWQjimJt07WbFr3O9lWtz4QLXj0pGXdMyowrMY3xspt2vcCjTpBR4y1MFJKBb371977hG55i8demOPXb/vtnet1kdJS8rkTiiYfYQ2p1ypCZdUnxnQhvhFzzNrH47x56VpGXqGHsUIePtr0y2hSe5sslKfpXH4y4W6xpUrLbh4XWpWoBSifdKuSTfruTGo0vOuyWGsT1JMw5YTbfEAfettFX94xymv05RrmJ01LFFzFqlHeAQ4uTdY4fz2nE3Ho4o1eYNURTNSzLQbIUqp09YI68Qa/jGt0z0+o4nzHrGIrq7ZmXcmEqW4UgLfcsT5duL0x71mQdq2p9lU6vtSisyzW3LhbSi30GOn1a52zwmnTRbdXlRZbThgN+O8VTQ27va4ycc9t/NZpCHFHjck6ck+YrSfVGn1ddkxO4caQkcQlplXpUj1Rbc0WRL6bqS2BYJlaYPkRGJtjFu9eum5sNZOzwH/AFucPzExTNKQvi6rq7qYB+1T6ou2nLfKCoD/AFubH7NMUfSirhxfWU99MSf2qfXFu2aeGDiAl7U+0m+3s5LD0JR6o7FhVsKz2xy5fdNOp6Of5pMccqe+qJu/Sus/UTHZcFHtM6MwlWHiNU9F/wDlGJ8m38XFznCQUvVPVl7WD03+5AjS54KUc9pJKRvxU8X/AExG3wE8XtT9f8Ungen9/MAI0OcIfntREmylPChMzTW7+W6CfpjU7v4l2XHVwVexeGUpJH33MHn+Yn1xspu7OlJPFufYVv5XB640+ru6pXC6Be/bTStvM2I3mJGzLaWG0nn7DSg9K2/XGJ24+15rx0nuBzBtaTbb2S+llEUbTHwJzPqIHWQmAPidRF50pDhwJWV/7SV8jKIoWlxHHmZPrPSnPn0utxq/mnhn4qPBqg7OaVdpyfpykk8hs2QD8YEYurqWCcUUGdClq7WnuoIJ28Ry+360euYSkr1IbHdM7Sx85mM/WCyhKsMuAAHgnEfF7WYuPdj6LtW21MPleX2Fljk5NIV/+ufXFIq1YrNJwPhCXqco9O4HmaaHKiEMlawS6pKh2lj2ZR4riLW8YdRtFw1DXfyiwhMf6aWPplTHpxz8lkngOt09sPmTT2MzKObtTcu6FpW04OqTwjzGxiTLTCe101rnnHinIbELczIzCKlQ6kgLadIvK1WXIuAockr4T5xe4ukxsK1hyVmZRGZWVExMyvgq+OepbRvMUxw8ylI900d7jcW5bXA6xhHCNIk8B07B2IZlVUolTF6cZxIQ5LEjjTL8YJ8dIJKFi17EW2API8V4MxNkLXkVujTLz0o6soYngm6OC9+xfRyKj5djzTY8tY5/V7/6zZo6rg7HOHc7sPO4VxM0w1Wg0S400rh4yBYuy6uihfcDlvzTHJv5O8b5U5pUeSoMy485UHuCSmWEApmGAR2gdbvYBKTdQOw2IN7RrJyTpuK6rS8Q4LcVSKxMTzbUzRpY+2yj5uozEtyBZsFKNyOC1jsQI+uKJh5uVmBVp4NzVZXLpl1zqmwlfZA34Bb3KSfGIHUxzzymHSc8NSa7thIyRlwp15YdmHLcawLDyJSOiR3fHzjLhCPM2CBhEEwExF4QgEIQgEIQgJ6RET0iIBCEIBCEIAImIiYBExEICSLxynPzCGIq7hThwt2i7zAcnaewAkzoISkKJ2uU2FwdiNz7kR1aIIvGscvpusSzV894BomHspGFzk+6itYrcRZQZN2ZO/vEq5X718zyFhzo+ZtZquL53wmZK5h5KVBphpJ4WkAXUEp7rC5PPbeOz4syimp6u+EURyWl5SaJW8lwkBhXUpA5g93Q+SPXEmDaRl7lliedZHbzxpb6FzjoHGeJBTwpHvU3PIfHeNfXcstaaaRzTCynJ3S7XkIc4ezTP2t1HElX0ExmaXaQmby0xI5ue2nHm7dCfB0gfWjTYPmyzphxQlPukrnWx+klsf3oumk4IRgKqSo9yipqFvhNI9Ud8+kvtmcKRpImDLYorcorkqmtrH6LgB+tH4YV2upcg8xXlfIDGPpnfS1mtPyqPcmRmkE+RLiPVGRPgymqdIRsFVlon9JpPrjf5ZemeI2uq5KF1yhBSQSJF4i45eOIt2cCP8X+nNg29qpw+RMUnVo+5L17D6gjiSqQfHxhYi55yTKE5BUt0+5UinH0pTGJtgt5e+ndrsco5/yzc2fmJih6VkWxpVfLS/8AzURftP7iVZOzjiSLF+cPzRFF0rWOL6sq42pg/eIi3bM8NVXmVs6o2nE+5NcliR50ojs2BnQnNbMl42IQ5IIsP9yecckrakq1MtAnf2bl7fElEddy8CXc08ylFI/rEkg7c7MmM/J2/wAMd3PMt222dSuJU3bcUpU8pK0G43UhX22jSZkX/nIy97cPsjTvoajc5ZtoRqQxEQkBXaVDf/mJjQ5pvFjUbLgC5XP036G43j0z/iXZZtWqHFqwyUoUpCBNKUR0/B9O7yxYMdDh0xsJvsaXTx85qNBqzeSj7l7LKHAqasQbEfg94sGPnFPaaZd0Hc06nk3AI90305RiduHtrmvHS+kN5b1ZQ5+yDp/YoigaV0j+UGoL33pbn71uOhaYPbsuaolVj/SLo8VISPwSO6OdaYZhYzInGeBpsKprwPZthJNnG+sW/mnhkY8Sr+ceLgpDlTpiUX99bsibeQW5xs9YBunDA8k4f3caXHJCNTDHcKpIfVaja6vF3mcMt9zE0r5zYjWM+7H0cVsc+98kMInr2kl/4VUWzBCWl5CUBt5IKVyrKRf8ovWHymKjn1f+Q/CH+8kr/wD4qotGHFmX0/YeWOaWJFXpmkeuMZdk9rN1pk8HM13Csm2tSUuNJKAh5HaMupSslIWg93RQspPQxrDU5ij0+eomMZN+rU7sSmy2+3ecRyCFWHtqSbAOABQ24wLccXzDieCjy6e7i+sYyKhTZepM9m+i9t0qGykHvBjzatuPZZZdUfBE45OFhKZycdPaqK+08GZKrpYSs7lKdrq5rIudgBHaor8thFtt5K3ppTiEm/AE2v5zeLDE1t60IiEIBEWiYgwCEIQCEIQCEIQE9IiJ6REAhCEAhCEAgIQgJhCEAiYiJEBBii55gHKXE9+QkifQpMXqOf5+OhrKDE6j1lQn0uJH2xrHuhXGcH0xatMdfmA4LOCbdKU9D2qEkehHyxZtKTpGHq+2eSag2r0tfwjBykllVDTRiNkgkFupBPxAK+kRlaUDxYfxEevh7X7mPTb9uXtz5ijaZwBmzMqtuuUnPrpjOrav8adq39syw/ZojB02E/ysL8spN/SmMysEnVI3/wAbl/qIjen3X0nDZauFcNVw9te8nMfXTFnzgbLmnWkJ69jTPqpirauD/TGHR/qcx9dMW/OJXZafqQP9HTR81Mc5ti1d6/en9tTeSc8nr2s99WKHpKbcbxZWipXEPYxH71MdByIUf5E51R/Lnz82KNpO3xNWz3U1v94IXbM8NbPP9rqgCSlQKa80N+tkpjs2Wr3aZn5mbDxZ2TT+yMcamrfzo0KUkkezqR8fAI7Flck/yi5mOHh3qsukWHQNH1w+Tt/hi5tljN9rqUxJYbJcqJPxOARo8xQqo6nZXjHChuo05q3fYNn7Y3eR8sqYz9xdNLA8UT5Bt3zKRGjxS2XNTzZJv/TkoPQGo1O7+Jwsmr9PE5hcDYhM2flbiyY+cVK6YpZKhcimU5PpU1FZ1drvOYaTfkzNH5zcWvNazWnGXR3yVNT8rcYm2K815aVXuPLypqO39Jufum45xpleS5mlMBJv/R8yfnojo+mJAZyqqDu28/Mq9DSI53pUl2/5Qqg7Y3RSnDv5XG41/wC54MxTw6kUEdKnTz81qNrq6J9lMODp4LNfXRGmx06mZ1MJQP7XkEegNRvdXaLTuHF7by82PnIjWPdj6Z4rcZ9ME5E4ZV/mnJD5ZdQjclwSmmqmulXCEUySUT3e3Nm8YefbYOQ9MHVC6eU/qWjzrD6ZzSal5tZSE0VgeL3pdSD8ojG+M9tcu10K3sY3blxL+sY2EaTBby5jDNPcc/CKZQpfwikE/TG7jytkIgmEAhCEAiIQgEIQgEIQgEIQgJ6RET0iIBCEIBCEIBCEIBExEICYQEIBFEzzl5KayoxI3UJlMsx4Lx9oo2HGlQUgeW6glNvLF7jmGpFN8o6qqwPC7LK3/wB8mNYd0S7KlkWVuafq32jPZM/0iGgRzR2e5/W4owNJC+Ki4kbvynJc+lo+qLDlooNabH3UiylU6orPnu76oq+kRweB4kSSAPCZU/MX6o9F2y9s+FU02ptm04D0lJv6RHvU18WqRH/HmR81MfnTmkDOGdAIPBLzo2/3giJ/bVIkH+32vqpjpe6+mZs2+rf/AC5h7/sL/wBcRbs6jbICkfBp31BFS1a/5dw//wBhf/eCLbnYbZBUjzU76gjnNsGryysjLJyMnFcv6+fkMUbSYOLEldV09j2h+0i7ZILKshp09bVH6FRStJI/p2vHukGR88wu2aThrH2u01QJVxnavpNvMkR17LFC3cc5mBopSoVtk8V+ftXKOOsKVM6qeAA8KK6sn4kH1R2fKQWxtmWbAXrifj9rifL1x/kWOfZCrC868aLuASibPZgGyfvoRWasXJzVOhsCyE11i/l4UJP2RZshyBnRjI96Jv8A8UIrj6uLVOCP7dQP2Yjf5X0nDa6uFE1vDyAbcMlMK9K0+qLpnSC1p/lGwfxVOT9T1RSNWqh90dCH+znv3kXbPYkZFSlu+n/QIzNsFvJp09qybn1f6zOK+Yn1RQdJ6AcZ1dfUUofK6j1RfMgFcOSE+rudnz8yKLpLT/hXWj/stH71MW7Zp4a+uJ8I1QpTz/p6WHoSj1RuNXzhVUsNtj/qsyr0rRGqUO31TW52rwP6qP4RnatHOPFGG2b8pFw+l0D7I1+WPo4q7ahEiSyXpcqTv4RJND9Fon7I10hLrOk1xpZuXZBxLY7yZohIHxkRnap19jl3RmgOdRb28zK4ipNGU0vU/gPCpMjIupINrKMy2q/pMYnZPa8uxYXZ8Ho0uzy7McHo2+yNt1jAodvY5HwlX/WMZ/WPK2iEIQCIiTEQCEIQCEIQCEIQCEIQE9IiJ6REAhCEAhCEAhCEAhCEAETERMAjnmoJlD2UGIuL3jTSx5w6giOhxzrUK8Gcn8Q39+hlA+N5Eaw7ol2VXLxfZ6ZHiTypdRPznYrGkSVDtKxC+b8SpyXR8QbJ+2NxhKa7HSzMFIJtSqgLj4bg+2PHR8yE4RrbnU1NA9DSfXHe9Jkz4UrTYngzbm0/6pOfvEx61xJa1UNjvrcsfS2iPPTgeHOGaB6y06P2iYy8bIErqoklHbjqVPc9KED7I6XvvpmbMzVttXKAf9RfH7QRa87CVafaSpP5FNPzBFZ1dt2qWG1/lS0yn0LR64tGaqfC9N1Nd58MpTF/UH2xibYtc1+shiXciZ5HM8VQT80+uKVpGdSrEFeRf/o9k/tIvOm9HbZQT7RG3hc4j0tp9cUTSbLdjjKsJJ2VSxt5nUeuF2zPDElVIl9Uatxc11Yt8JB9cdjylB+7LMlRN714Dn/o445VpdtnVG0oDhvXWFHykoT646/lW83K4hzEfUFWViRSNtzsgQ+Xt/kMXPsgBx5zYyWEn8HN7n/tQjRPgI1SjbY1xPytiN1p3ZeRmzjMuuJK0NvpISbi5mv4RXH5kvapwB0r6E7fmpA+yNa/dfScNrq4RxYlofP/ACa7+8i8Z+qLOSEkm34yQT83+EUjVyq+IqCE+6NPe/eRd9RHiZMSSe+Ykh8wxmbYLeUZE7ZEz6vLUD80xSNJQviauH/ZrX7wRd8kPEyDnVD8mon5FRSdJJ/wkrv/AA5n95Fu2aeGBTLO6qFjurj59DavVHrqhcD2ZGHmOfDItD9aYV6o86Bvqpe/43Nfu1xOfrXshnjQ5RaglBZkG/1nlX+mNflPRwu2rdwIwpQmfyqis+hpXrjYYgb4dNVOasTxU6mpAHW7rPrjQ6vpgCn4blgdy/Mu+hKB/ejfY3JltOVOQlXCrwOlIB8pcZMc524rzXXqJ/UE/DX9YxsOsa+h/wBQT8Nf1o2EeZtEIQgIMIQgEIQgEIQgEIQgEIQgJ6RET0iIBCEIBCEIBCEIBCEIBExETAI5TqceU1lHUQkGzkzLIV5B2qT9kdWjl2pV6Xayhq4fCiVuS6GgP852qbfFsY1h3RLso+Cl9rpZqI58MjUU+haz9sZWkE/4HVod1USf2SI12WvFM6ZK2juYqYHoJjM0fqvhSuj/AGk2f2SY9GXbWZvFJ08HhzmfT3szw+cIzM2F+Dal6S9y++KYr5wEYeQI4c73kjomfHzo9s8+NrP6nPIBJSacrbyORu9/8ThY9XrP/wALO26zaP3ZjfYwUH9LkgpfM06n284W3Gt1apSZTDBVbiS9NqA8nC3GwzTApOm+ksdBL05Cvmn6YxO3D2t3rN06DsMpqgs8jOTSvQ2kfZFA0szTTeMqwoqG1L/81EW7IyqLRkfUn2mySF1BY/RRFO0fyKfZzEEw9ZbvgLAF+gKyT9Ahb3EmzXzfaV3VWlIK2pZutIG2xJbaH2pjsmTjKFV3MRJAU390jgCVbjZAjkNOJGqNQP8Abr31FR2HJhV63mENtsSvcvgiHydv8hi5tpr4Gsx8XpuLllfyTJ9caCnpbmtVRSn3teeV8aUKP2RvtNBR/KTjFPCCotqN+775Pr+SNNg9KXNT7yiLn2anT812Nc5ek4jK1Zvf4X0Vo+9pa1el1Xqi+akTw5QU8HrOSY/ZqiharWO1x9TAf7LQB/3rkX7U+goyvpzY5eyEuPQ0uJPwW8pybHZ6eptfL2ipK+v6opWkhF69iBXdIsD9ofVF1ywPg+muac7pGpK+VyKlpEavUMTOd0vKp+cv1RLtkeGjoCv8at+39tzX7tce2oAeDZ3UN/ldqQV6H1eqMTDC+01TuHvrk4fmuRnanR2GZ1BfG33kwq/wZhUbndPScM/V8tQqOHE3NgxNm36aIueaB7HIuis292qjt27/ABm/VFT1hSqwrDU6PwZE2wT5SEKHyAxZc7HTL5T4ZZHJU/SknyAJv9kY/HFea67hZ7wijtO2I4io2PTeNvGgwOoqw7L3573jfx5a2iEIGAiEIQCEIQCEIQCEIQCEIQE9IiJ6REAhCEAhCEAhCEAhCEAiYgRMAjkGqcKOVDwSQLz8tck9OIx1+OL6sXg3liw3fd2qMJ9CVn7I38fdEuzQ5RMgacqsFqBSWap9VUNHgP3K12//AF9r90I/WXqvAdL1Retbikakv0qWmP3pCb4ML17u9kG/kaEdsu3JmbxTcgmuLOycWPeIn1fPt9sZuZbQqmpWnymygJunNEebhUfpiNNrYmc1KzMjcIk5ld/hPpjHrc6leqZlTh9zWZdsX8jaQI6XvvpOG11dTZRU6A0TZAlJhY85WkfZGzzrnnJ3T3RyBYOppgP6gP2RWNYE0mZrWHWWjuJKYUrzcaQPoMXTO2UQxkDS0NiyUextv1AI5zbGNeXrkSwDkFNtDmRUUkjyhUUrSK4tOI660eSqc0r0Ofxi9afPHyTnUnkHp8fNij6SGv8ACatr6Cmtj0uD1ReMk8Ncy6GNVBSra9eUB+kg+uOzZLJJqmP18NgrE7/x2SneOPFlud1SBQ5prt/jQj/2x17KJt0z+PGmVhLzeKX1L32KeFJAifL0x/kMXOdLvCcd4vWTdZaufJeYVGhw197aqHAg3SqtzgI86XI3+mAgY7xglLRbQWrhJN7ffCrD4or1O4mNU6trA1975yVeuN3fL0nEZuqyaCMeUniHDelJN+/21cdE1Ne25WU9y/Kflj6WlxzvV21x4roiuppiwD5nVeuLzqNdcGTlOdI4gJqSUT521euMz8FvL3y5PHpmnUjpT6kPlcivaRGwHMUK8koP3kb/ACcWJzTtPN3uCxUkfIv1xXdIj48IxKz1U3KOfK4Pthe3P2cxVMAnwnUytfdV59XoDsZGqx0jH9KSL3RS0H9q5H5y1Z4NS76TzTUal9DsfjVMb5mSKT0pjA9Ljkb/ADnpOF+1aSvbZcUec/GM1BAB+Gwu/wBEM7an4Tk1hZ9lvj8Kmaa6FAbJs3xfZaM3VMAcspBs9akwP2TkV2tvrrWlSkTKRxOSSZNJJ972b/Zk+iOeG0v7W7123L5faYbYVe+53+MxZopeULinMC05S/dlsE+kxdOsee7togYQiCIQhAIQhAIQhAIQhAIQhAT0iInpEQCEIQCEIQCEIQCEIQARMQImARwPV/NhvB1DlT+NqRX8SWlf+qO+R806xZoLcwtIm9kiamFd34tI+2OnxTXKJls2VKQZXSe6eHhDlJdN+/tHz64ydMiTTstcQz/IeGuqH6DCY/OPVnDumKlSJHAp+TkJcj4RSsj0Ax7ZITTErkVUnSoeMqoKV5wi30AR1vZfbPKnaVH0nFtccUfGNMSo/G6m8aKsJ9kdVqWGDf8Apto7fmtpJ+gxlaTmHZyv19+9ginsoP6Tl/7seFJb7PVOpSjdXs+4m/6CgI1ldcrSdJGy1YSwYxDQAALimu7/APNMX/Orx9P8gv8AMpp+RMUrVwn+n8PqtzkHh+0Hri45yrH83imX98zTPqpiTbE8mQzvg+RVWeOwQuoL9DcVzSKwDN4kf6pYlUekrP2Ru8tkqpumSrzPIuytSdHx8SfsjRaS5lSVYmQ2kqUpcogHoPwkLtkThXsMzAf1ROE3Vw1mdXYfmod9UdnygcIxfmOzZKQmupVwjoVNAmOJZRo8M1Gzc08ONxUzU3Ld2zg+2O2ZS3GOcyxZI/pxvYdPaofJt/COdZAPdhnRjCUTsjs5sW+DNC30mNFV7SWqduxsDXWCf00I/wDVG5yIB/lvxovuTOWHnmxFcxEszGqRIHSvyqfQG/VGvyvpOG41dgpxDQF99PeHocHri7agCF5ISAVbxnZDn8C8UvV7vWcOn/Upj66YuWoAD+Q2nKPR2nn5kZn4reUZEtn+QWooBPOogfGkxTNIUyr7oa82o/8AR7KvQ5/GLxkV4uRM+fLUD80xRNJLfFiWvK7qa0PS4PVC7ZHhGFAmR1UTSDYBVUnUj9NpZ+2MLVQ2RmZIOd9NYPoccjzS8tjVYQCeFVft6UW+2NpqxYDWLKDOD8ZT1JP6DpP96NTvnpLtV21TuhOXtLSeSqm3+5cjW4fku20pT6ed5CceHnS+pQ+rGw1RqD+WFLdTuDUWFA+QsuR+cEAv6W5psjf2KqAHxLcMZnZPa8ul5YBBwlION2CFyzBA/wCWD9sW6OcZDT3huXdJWVXIlW0/q3T9gjo8ebLetxEIQMQRCEIBCEIBCEIBCEIBCEICekRE9IiAQhCAQhCAQhCAQhAQEwhCAR8z6vJQqquF3lG7a2phpQHTx2zf0GPpmKXmbl1Ssd0gmbkBMT8qk+DOocU24kEgqSFJI5gdesbwy+nLVLNY5nqlcclssKfLMpS3LpqMu2kJ6JS05b6BGNlXJpZ02T76T4y5KpuE/ne2D7BHjmNQ8w8c4aNFk22J5lhxt3spqQKHQUAgAOjxb2J90n443eGaVPYIydnsNYkYYky5LzbbbyXkJSVPJUQjhUQoqubbDfujeOcs0NFL0gJSio4mSBv4JLH5640yCW9U5H/1CflH8Y3ekxPg2IMRy5Kg6ZFkqacQUOIIcN7pPnjTTqSzqqSCCCa+2d+4pTv8sdfyvpniN5q7FqthxW/9TmB89MWHO+YEvkFhpgmyn/Y9FvgsFX2RXtXB46xhtoe6MpMfKtIjdaoUexuWuF5QbJam22rfBliIk2xPLJps41J6T3ikgFdImh8anVj7YwdHsuEUPEbpHjqnmEk9bBs+uPGnSqzpRfddJt7GuLT5jMkxm6RSPYDEFv7QZ/dxL22r4UrJRQVn7NL71VI/KqOyZQq7TGeZbtieLECU3HkaAjimRzl89nySLn2S/vR2vJhXFiLMZQUDfEixty9wIvycpi5vp39vzcxtMAG3BMbnyzf8Ira0KmdVVuf+EIP6qb/ZFn0z2VmDjVRO/CflmVxXsMgTmqt1Z3Ca3OK/VQ56ot3vo8M7V1ME4gw+yOaac8v0uW/uxedQqSxkbINKPjJdkE/GEfwjneq9ztsf0tgb8FLQLfCdcjoeqJzwfKynS/IqqEui3wWlmJPxLy9ck/E0+Tbh2u1UlfIr1RTdIjd6tiNy3KTlk+lavVF0yrHgemt5w7Xp9Sd9Jd9UVTSA37didf8Ao5RHyuGF2yOYrklaa1TqtvbEDnzUq9UZ+rp5SMQ4fb5pTTnjbzufwjX4NCprVC6Rvw1qecPkAS7Gx1TSblUx7RJJpQLxpoQhlCVLcWpTq7BKEgkk2i6/dPScLnn4FO5FUlbw4XEuU9Rv+UWiD9JjJyxUJzTU8yCEqFOqTRKuQILu/wAsZmc1GmcVYFkcMUtl12aD8stRdQtttKW0EHxuE73I2j2wDQZnD+WRwdUGmkOLRMtLeYd7QcLpV4wBHMBXI9RHO5SY6Xy1p1frTW8V4AkUk3HAeHyjY/bHXoo+XGHpPC0oxSaf265aXaKQt1XEo8tybAegCLyI42621qIgYQiCIQhAIQhAIQhAIQhAIQhAT0iInpEQCEIQCEIQCEIQCJiIQEwiIXgP1eHOIhATaNdXcPUnE1PXTq1TZWoyjnumZlsLT5xfkfKN42F4m8BR8M5RYZwY+5MUmTecWSez8KmFOmXQfeNFR8VPk+WOMYgk6wrPKn1D7laxJTCpxp1ll4h5Ez2YspxK/GRbhAJAUki3Inn9Px5vyzUy2W3UBaD0MbxzsSx806naLUqjWaFOiS7QMsOthDD6VLNlhRUEEBRTuNxyjcZu+DZ14Zp1Mwk49OTknPoddQthxlDYLSgeJak2FuIRf8x8l6VmMiWVNVaqycxKJUlhbbiXEpCiCQpKweLkOZvHplzlxM5f0RymOTqautyYL3hCyprawCRwXUBYDex3J5CN/XNJ+k0c4oC1VPJd7LtEq+useAPyrIZKVodUFqWkAkp3sLb2F4/GnNCMBN1+lYmmE0abXNS7yGaiPBlrTwKFwF7KFxzBMWXA+V+NMM4ubqdUnaTO05Ie9rlnFBxKlA8Oy0C4F/yoxc0MN42qGKPC6ThxVQpvYsgqS62FpUL8QCS4L+jrF+qbGjlmVsmMP56LfqTzUmwt6oIC5jiaSeILIsVgA388doyMDLszjmYYeZeS9iZ9xK2nAsFPCmx2Me+c8pWJ3DsiukUacqy2poKclm0EuJSUEAhNjexO/dGmkMGzOJcsuzek6lQ6siWmmlSq2i0txZJKbm297iyvLbpDLLWEio6XWeyxVjN2ZcaQ6S2CkrFx7c4Tfu3ivZXSqZrUZPTyphgobnai5cKPM8YAva1/G5Xiz5BYepdOnqxIVWiVORmHkNPJVVmXG0uBJUCAVJSkkcQNt+sZdBl6xTc1CtvClWTTG6k7eal5VamQhRICwQkAp8YG4PK/dGrl1poqmftFnK9mxKraamBKty8oyXjLOdnbjJUeK1rDiNz5D3RctVgcnMNUOVl7lvw5x5ai2spSA3YXISbe66xtc5aViaaq1PmqFQpmrIWx2KwyglTS0qJHFcgAEK2N+hjcZiUPGmMsP0RVCkmZKYuFzMrPuJQthRTb3Y4kmxBBABvcEHpE+rY0aSiBFH0x9k7MS7a1UJ/cuCxU4V25b78Q6XiqaXX2aFKYmeWmZfUosK4W2Fe5QlxR7z17rnoI6i5lHKV3ADeH6xKSUjPKZAW/IrU4lDoVxBaeIJ4gTuUkW3I7oz8tcqpTLaSmJWUrNSnUzCgtaHuzQ0lY98hKEjhJ5Hc8hGbnNLDRxTKaboNVzOnp1Xsy7Upt951pVOaPBKlwq4u1CASjZVgpZvf3qY6QNPkjM4nVWZrEdaMuohZZS5wTLivz5kHj4fzU8MdVlZCVke08FlmWO1WXHOzQE8ajzUq3M+Ux7xjLO3ZdHkzLNMNpQhJISkJutRUbDvJuTHmumyTi+0VKtFXfwxkwjCvy20hocLaEoHckWj9QheAQiLwgEIQgEIQgEIQgEIQgEIQgJ6RET0iIBCEIBCEIBCEIBCEIBCEIBC8IQEwiPiiYBE3iIQAwhCAQhCAQhCAggHmL+eJhCAc4QhAIQhAIQhAIQhAQTCEIBCEIBCEIBCEIBCEIBCEIBCEBAf/Z", + person: "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBAUEBAYFBQUGBgYHCQ4JCQgICRINDQoOFRIWFhUSFBQXGiEcFxgfGRQUHScdHyIjJSUlFhwpLCgkKyEkJST/2wBDAQYGBgkICREJCREkGBQYJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCT/wAARCAIAAYADASIAAhEBAxEB/8QAHAAAAwACAwEAAAAAAAAAAAAAAAECAwQFBgcI/8QATBAAAgEDAgMFBAYFCQUHBQAAAAECAwQRBRIGITEHE0FRYSJxgZEIFDKhscEVI0JS0SQzNGJygpKishYXJVOzQ3OTo8Lh8FRjdIOE/8QAGgEBAQADAQEAAAAAAAAAAAAAAAECBAUDBv/EACYRAQEAAgICAQMFAQEAAAAAAAABAhEDBBIhMQUiQRMyM1FhgSP/2gAMAwEAAhEDEQA/AO/pDwCQ8AGB4DAwDA8ANIBYHgeAwAYHgMDwAYAeB4AWB4GGAFgeBhgAwA8BgoWAwPA8ATgMFYDBBOAwMAFgMDDAE4DBWBYAWBYKDAE4E0UGAJwLBQsASJlCaAklopgwIwJooQEsTRWBAS0LBTE0BImisCwVE4FgrAmgNhIMDHgilgeB4AAHgB4ABpBgeADA8BgeAFgeB4HgBJDwGB4AQ8DDACwPAwKFgMDAgWAGcLxLxfovCdvGtq17Gi5/YpRW6pU90Vzx69AOYA8suO2S91DL0PRKcaH/ANRe1c/HbH+JxkO2XWbKs1eLTblp4dGFNw+CkpPJh5xn+nk9mDB0rgvtW0TjC5/R6UrHUebjb1XlVcddkvF+jw/ed16mc9sLNAQwAQsFYACQHgMASLBWBAS0IpiaAlktF4EBDEymJoCWJlMWAJE0UICcCaKYmES0JlCYGwkPADwFGB4AYBgeAQ0gEkPA8DSASQ0h4HgBYGCGAsDwPAYAMBgeAwAAPAYAQDDAHH67rVpw9pVxqd9PbRoRzhdZvwivVvkfOWvcQXfF2sVNY1a6tLKjH2KcZP7EE+UV4vqew9tFJz4Ozl7Y3MG4pcpcn1Oo9mfZZp+tqOt6pCNak3i3t2vZil1k14vJ4c2fi2evx+VeX6nXur64UdGpuWeXeWylifvWFn5GjPhHiJqdR2F01j21tfI+yLXh/TLG1XcW1KG392KRxmsxUXJKPLHI1rz5Yz4bk62GV1t8hW9a70+/t7qbq29xRnGXeYacWual700fUPAvaLpPG1vCFvW7vUI0lUq281tePGUf3lny6Hm3G1nbVqlaU7enGSTX2Tzay1m54Z13Tr+zk4VLGopRw+qT5xfo1lfE9+Hm85trdnrfpXW318GCaNSFelCtT+xUipx9zWV+JZtNMsAMMEE4AeAAliKFgCRNFCAlolosTAgTKwICWIpoTQE4E0UJoCRMpoQEtCKaE0BsYGPA8ALA8AisBCwPA8DwFJIeAwMAwMMDwAsDwMMACQwwPACHgeAAWB4DA8ALAYHgMAdM7WaEq3BF24ptQqUpyx4LdjP3ow9l9eOn8GU7q9qRo0KUp+3LklFPGTtOvaZDWNMq6fVcY0bj2Krkukebz6c0uZxHDOgOfCFppznGMsVJqokpYbnLEo55eqZp9my3TodTCzHy/FbL7T+GnUdpG5qTb/b7qSj82jjOIOOdH0mylUuLiO6Ud9PKftJ+XmaH+6SyWrSud93VjJqU51rucmsLovecP20abb1aGg77f+SUqjpzcHtfklk177sjcxmpufLpfEHFuma1OUoTrre8qcqeInTOItL/AEfqMe9wo1qPeeifNHfNT4EoObudOhSt1UxKb71uLXkotckcFxNpsrjR7O+rpVI28p2j57e8fJxX4nvxXGfta/Yxzy15Po7QFJaDpil9pWdFP/w4m+dU7K9RudU4B0i4u3N1YwnR3S6yjCbjF/JL5HbMG5Lubc3LHxtlIWCsCKxLAmisCAnAimhAS0IpiAkRTJYEsWChASLBTEESxNFMTAloWChYCpEU0IDZwMBgCGA8AGBgMADA8BgAHgEPABgeASGUGAwMADADDBAh4GACwMBgROnGrTlTmsxmnFr0ZNWn3EaUYSS7tKMXHyRlNW/ahRyuXPJr8+G55Nvrctl8GK61C4uZOlawi40oOVSUpY3yxygn6+LPG+1jXdcrULC2udMoS7rnXjRm5U4OXTDeG36npVxO6r3MqdpXp0aUItylODm5Sb8FlfedB42vajVa3nXuJzyvs2tNb5JcsvrjmamF97ro63PXpwlxrdWvoNspVIxruMYyUX4+ZXEelvUeFNE0GyU53F5ftNxWcz2PDb8Flr4I4CjbzdHFdvvXNz+zhRgln8j2vsysXb6FCrOOHOMeq8er/FI9uLj96jw7HPfVv4dk0fS6Wi6TZ6ZQ/mrShCjF+e1Yz8Xl/E3MDA3XKt37IBhgCcCwUJoCWhNFCYEiKaEBLQmihNAQ0IoTAkTRTQgJaEUJoCWhFNCYRImUxBWyPADSAENAMAHgBgA0CHgoQxgiAQwHgADAwwABgeAwAYDA8AAsBgYALBhvKaqW1SL8vkZzBc1YqM6efaXJry8TDlsmF29eHG3OSOq1NWo6bOcK8FDHPL6SOp8R8b0bmNSlRoRliOI+znmdx1XTaN7FqrHoeb8VaFGzhKrb1XHa+cWc7HKX1XXy48p7xcFSqqfeXuo7YweEor8F7z3Dgiv9Z4atKuEt27kvDmfN2pXtevOhSlLMab6Lpk9t4I400bSdEtLDUruFo9qlTq1M7J7njGfBp+fmbnHZK0OfG3F6EGATyk1zT5p+YzYaRYAYASIpiAloRQMCGhNFCKJEUxNEECKYmgJaE0UICRFMTKJaEUSwiQYxEG1gYDCgeAGkADwCQwAaAeADAAMAwMBoASGAyhYHgMDIFgMDMztakcbljKyBhwZIW8pdeSMsKO3ngypFE06EIc/HzfgaupWzuI7opd4uq816G/gUorHPmY54TKarPj5Lhl5R07UKc6cJcmseDR5zxJdUr6VSnCOZ9Ht8z2q5oqomnGLXlJZOFXCulwuZXUNNtlWk8uS8X546GnepZfVdLD6jjrWUfNfEFi9NlQoyT7+t7Sglz+RVtoetXtGn9YhUpUqaahGaw8eb8kfRd7w9bTrOurW2VbGHUUFux5ZOGuuHVJ5lFyS8F0NjDi1PbT5ux537Zp59wtq3EPDm2lbXlSdH/kVvbg17n0+GD03R+N6F5FQv7edpU/eWZU3+aOKjw/Hd9hG9baLHC9n5Hs1XbKdSFWCqU5xnCXSUXlMo67Ss7mwlm2qThnnhdH8Deoay4zjTuqag5SUVOHTL814AcoLAwIpCYwAliKZLQEiZTEwIYmUxMCWIolgSJlMTAliZTEBImMTKjbQwGgBDQhkUxiGA8DAEAYHgBgCGAwABhgAwPAIaWeS6gbdjQi815rlHlFPxZnlVUnz55HUSo0o0ovG1ff4mrObxkoyucds5J8o9RQl3mWn7K8TUrQdw42ybUKlVzqNcvYik2vi2kbqcduIJKK8ugBklvAEyYGOfUhr5Fzl5kKXPARiqw5eHQ1pW6kvxN2eMPq8kJLxA42paKLylnzFSo8sw5yXgzfnjrjJqzShPfCSjJeD6MAhUp1t8FzdNqLXk+uDqfE15s1VWlN47i3+sSx4ty2r5JP5nOXN1G01GlcRzGncyVKtF/s1EvZfuayvgjpvE1ynxld08+y9Jg/j3mfzCu8cP6l+ktPhKTzUh7MvXyZyZ0XgfUk72rRUswlOUfvePwO9ECEVgTARJTEwJYmimiQJYmUycASxMpiAlklMTAliKYgJEUJgbSGCGAIaAaABoEPAAkMEMoMDAZAIYAgHgAGgAy26zXpp/vIxpGW2X6+Ho8gXd12qj6YNKpeRgmpSWVnqZLhbpvr5nHXdrJxe188ey/NeRRsaXeR1KuoYfd0YZqJ/tzb5L3LDfyOZck/I6Twxd1bfUriyqyblOWU312rng7cqifJAW5epMmTKWF4/Axzqeq5BCqT6vnyMdKq5fAwXFwop8yLSru5gcj4MxSSz5/ArfmGUYZ1MLqwJqSXmcfd14wi8+XiZrittTeDqmv61G3pyTePQDjOKNejRtbqlCTVSFN1afvi1Jx+SyvJo6lqvESvuItTv6HOP1Sla08/vy2v8ABNnF8QapWrwrXKSm1GVOnFvCk5ezz92c/A4zTLetcxhSotvLe2b5bm+Uqj9XjCXgkRXfeBLpxvYy3ew6sacG/wBrHV/M9hZ4TYVvqCpVbf7NKSp0F+88pyn9x7rTqKtTjUj0mlJfFZAAGDQEiaKYmgJZLKEwJZLKaEwJZLKYmBLEMQEiZTEwJYihAbSKQkMAGgGgGhiQ0AxoQwGMSGADAAGNIRQAZ7ZYc5/ux+9mA4rX6mqUaVOpp2o0rVZxKlUtY1Y1H5ttprC8ETLKYzdZYYXPKYxytSLlnHvT8jWrtKDTwl6/ss4u11fVIwX1ulY12usqW+k/k9xi1DiS3p05KrTr0WlhtJTj/H7jznY47+Xrl1eWfh13UtUpWXE9Cp9Y7qcqdSEIpZdSbwlFevNs7tb36pU6cbnFKptTcG+aPM9I1J6px5ThpytateFpVqRqyTfcNyispeEmsr5nfLXRKlOo5V7h17mpyb8IntLt4WWeq3LrWIJpxUowxlSfLcYLm+nC1pVZZUquWsvojWuqKvNcVtTX6umlTXuXUNdkqmqULSmlsppLCKi/bnBTm8ZWUbNl0z45LuqeynGKSWFjBFD2YZ5dcEHI1JYoNt9EaKq5pTllvbBvGTbuGladVg421mpU6kcvowOGpanK7UefKT6HQeJtRV/qFWnRcowpycJbvFp/gdn0us6Oo3VnJ/zdRuK9GdE4kzZa3eR5c6jl8+YquscTX1D6zS06G7vaP6yXk1JY+J2HRaGLCCWIOovan4xj4/HwR0jXr1S1ii6sYr2GlPzWeh3vS9Rt6FhTzSrVHtXJYj97MLnjj81njx5Z/tm3IWlnUu6nfd26dCnHbSjjw8z13he7+uaFazbzOEe6l748v4Hhz4xrTnGFHTaUYvlmrVcn8kj2LgC0qW+iOtUuKVaNzU72EadNwVNYSw+by/XkMc8cvUXPiywm8o7IIoRk8ywSUxMCWSymJgSyWUxNASySmSwESymJgSxFEgITGJgbaGCGADQIYDQxIYDGhDAYAhgAwGAIYhgBoavHdTp8+jbOQOP1WSSjnwR49j+Otjq/yxxuFtydT4lr4t5vPXJ2G6vI0aUot82sI6ZxNdpw2o5c91256m1cH6NLTOJtH1OMtsdUsa6qP1p1cL7mj1uChb0p1Fzai3lnTFpc6NDg1r2Y0qVSNR+W6Cl+J2a5lG2tGsPEn4s7OE1jI+f5LvK1raDSUr24up89uXlmnafyzWatZ5aUuTwchav6tpVSo+UqjNfRqezL/afPmZvNvXmMLPXy8TWbcKcEusp9DYvGnlY9TVqyfe0cvOHyIN66f8mx0eDh7Oqo15wz1XmcnezxQXg5Z+R1ylW2XvLx6Adc1ao9P4yUm8QuIrPvOq9oVPbqUa6fKpBPK9DsfaJGVG6s7yPVM6/xfL6/pVG4jluHUVY6PU0CWp6Nret+1t0qVrGP/wC2o0/uX3nZdMp79PpPHgjmeDdFnedlnHE2sqvCDp++lHf/AAOO0LE9Mpvw2pml2viV0+hfdjiLe3xeQptct7j957/wVS7nh22p+KyeGX9N0brvorPNSPcuCq6udAoVI9Hz+5DrXdO9NSOdEMDccxIihMCWSUxMCWSUxMCGJlMlgSIolgJiY2JgJiY2JgbY0IYDGhFIAKQkMoaGJDRAwQDQANAMAGAABxGp1VUr92nlRXM5dvEW/JZOt1KnKUn1k8s1O3lrGY/23elhvK5f06lxXqLsZx9pZk84XgjrNGU9c1S1s4v2q9WNP5vn92TluLqTuZTcfacp4+/kZ+CdLp0OOranKUJTo0alWUY89klHCz68zW4cZbHQ5s7jhXqGo29P6pFxS22zU4eiXLHyNO7lO8uYW8Iy2xWWzlasVOjOD6NNGva28KG6Tm5ylzlLodVwmrqslTpU6EekY8/InTYtU859l9Wa19Vde48svlk5G3iqVJRSxyCMdZOUm3jGfmaNTdK9pxz0fRHIzkk8vPLqcYpN3Dn4t8gNy+m+7yvBYOpSrOOowWW3nLO0XrxS9y5nS3PdqlR5xzAxcf0FV0ndjnFpnTaFZXWl1KEuuDv3EUVdaXVT6OGFhcjzSzm6NedPz6Eqx6z2V6Ov9gpWtWCUb2pcRf8AWjJbE/uPItLqzsLeVpVWKlCTpST8HF4f4HtnZpqKvOGadu+VSyqSotf1ftRfyf3HlGpWtGvx7r1CSxGN/V2rw+1nBr9ifbtu9PLWdjfo6SrmzVaazy6Y6HbeyrVUqV3o1WX6y3e+CfjH/wBjWt7aNPTpRfXb8Dh+Dqvccf0FDkqlOcWvPkanBlrON7s4+fFd/h7CAAzpuITEMQCJZQmBJLKZLAliZTJYEsTGxMBMT6DYgJEMQG2ihIaAYxIYDQ0IaAoaEMAGCABoaBDABiGBFZpUpt/us6hK6pyhKMnzjJrqdsvJbLSq/wCqefTnGdSbbfXcjn93L3I6n0/HcyrhtYqLdKal0lle/JyHZpQ3cTV62M7bWbb9ZSijhtTzOvtX2U2kvzOydlclUv8AUWvChTX+dmPW/dHt3PXHXoNaWEorqzBdT7m3cY53S5LBU5N1JTfKCeMs1LjdXnzXLPJPwR03FYLSlurb2+nryRvt56tsihBQioqmkl6jlNJvnheSCMdZqMXj8TjYP9cuXz5G3c1X08TUp4jPvJS6eoFajVapPmm2dRlHZWlLKyzsmoVt/JLOPU69XWaqXrySAzXz32koYXJPnk8z1GDtL6T5ezLw8j0C4uI4lDEuazlvB0vXqO64eElFrxeSVY7T2Va0rTiSenTninqFHEF/9yGZL5rcjjdYsnQ7S9ehjlO4VZe6cIy/M6hbalW0bU7K/hL27OtCqmv6rTx8so9E4mcZ9pmoSh9ipQt5w9U6awa3Pfsrd6s1yRyU33di8/unVeEa6l2hWST/AHvwOZ124nRspbG0sYwl4tHTuB68v94FlOUuk3H38jT4f3x0ef1xV9DAwA6rgkJjEwEyWUyWBLEymSwJZJTEwJZLKZLATF4DfQQCJZRIG4NCGA0NCQ0AykSigGhiQwGMQ0AxiGAwAANXVXt0+u302nm1WpKmlVgk30afQ9J1aG/TblLr3bfyPOKMd8J8llHN7s+6Ov8ATr9mTr2q3EKcK1RNbllL3s7T2NRc6WqXL6bqdNP/ABP+B0viahK0s0s531Op6R2R2TteEYXElh3dedX+6vZX4Mz6mPvad/LWOnI3PC15UuHcUOIr63hGTbp7Izjt8sMwyu9W0iTV5GFxQz7FzTTXwlH9l+vQ536xTpPE5ybbziCyRLWdOblGpUWejU44+46DkuG/TdW4kowi17mcha0HGlK6u2404rKUvEt6xpFnHNKFLl0UIpHA6rrlXVZKnGO2l4RzjIRleoO4qycW3HOct8jG67k8ZhLPmzFRp91btbYp+SZs2unQhT76rFSb5pZA176r3UMza6eZx1Kp3kpSWWkvB4MuqSdWrhPas5bz1NBXKhT2qSxl9UBilUjDvK1eD2LxlLCXxOp8Qa1bQUqjgoQ/ZS+1U/gjLxXqtSnVhSjGU6cY5UF0cvNnTK9lqWrV906VRRJWUcnwvN8TcRWWnVqNvQtr2q6Cqyhu2y2trnn4fE9K45s46dxrZ1KaahW06lBN+Pdtw/DB5losKui6jaznCVPuq9Oqml0cZJ5+R7N2o2qqVdHv4LKhVqUW1+7JKS/0nhzTeFbXXuuXF1LXbjNrNrOdmV70dS4OTXGmmJPMnWWX5tnbtdpRp2im14Pr4o4Ps2sVd8fW6jHNOg5VF7kso0uCfc6XZuuOvfgADqOETExsTATJZTJYEsTKZLAlkspiYEsllMlgJiY2JgSIYgNwYhgNFIQ0AIoSGA0MQwGNCGgGMQwGgEMBTgqkJQfSSa+Z5raqFC8rUanKTbj6HpZ5rrKVrrd3uXJVW8Y5/A0u5PUro/T792WLqvHlaMYRoxX8293xaPYNFs1pPDljaQWO4tqcP721Z+9s8a4loyuLuhKo+Ve5pweOmG0j2/U591SjBJ+1PaseSMupPttT6hfukatSagspJZ/afJmvXtrW8WKij7+mPiZasuSfP3M1akt79l7WbjnNSrw1SclKFeSXgmyI8P7JZ75e9Gac60X7E9y9DBKvVS9pSSAzfVKVulmpF4ecYNa/vUqbbqxfgkTKW/rJ/M19QglRSTy28Z8gOGuZzq7s1YeOOb8jgalWdGKjJxk4t88nM1e7juST+ZrSq28Z+3RjL4IDgbutbzcalRRcovK3FWt5d3lVQtaUY0l9qe32UjsEalnVfsabQm/VZN2EHKm96jb0kucY4RFdL1KhXlZ9/XwoyqKMMtRc1nwXkes8ebKnC9tWxiMK9CfuTTX5nm+vunewVOjHvMZb28lHl5s73qlw77swpVZc5d1Rz481NI8s/iz/AB78V1ljf9dF4ounKwjCU1LYly80zkuxK3lcX99dyScaUHGLxzTk1/A6vxXcKnbqMU+8wqePNY5nofYnaqlw/d18c6ldL5R/9zV62P3bb/dy1hp6IIYjfckMQ2SwESUICWSyiWAiWUyWBLJZTJYCZLKZLATENiYG4MQwKGhDQDQxIaAY0JDAY0IaAYxDABiGgA6BxRTU9auMfabWPkjv50Li60qW+t1LhNyjXhFxXr0a+77zV7c3g3uhZOX/AI6hxRHZToVXLnQqQrYX9WSbOe7We018F6vo9tT0+neq5oVLieazpuC3JLGE+uH1OM1vTqtxaPD6xkkvFp+B5/2xXFbUp8MVaicrqnp8rOvFfv059V6SUk/mYdPKe8a9vqPHfWcdvofSBsKqX1jQr6n60rmE/wAUjdpduXDNT+dpavRz13W8Zr7pHgvOnLu5Y3Lql4FOR0dOW+haXbNwZU+3qs6X/fWVSPL3qLNul2pcF117PEelc/CpOUPxSPm/evEPZl5MniPpuHGXCtx/N6/oss+V7BfizFea1o1aEVS1OwmvF072n/E+ZpUaT60qb98Ua9WlRjHEKVNefsomh9KK40h+1KtbT9HeU/4mN6loVBvdV0+P9u+p4Pmz6vRw33VP/CjG6VPwp01/dQ0afSlTizh+g/a1LRqf/wDdF/gaN12gcMU+X6a0b4VJT/A+d9qXhFe5Ck/UaNPXNZ4+0Kq9lK/0ya840Zv8Tv3C3EFnxH2eK3sruFXu7xW1Vxg4bF9vCTx4YPmDDqTUU+bPdez7hq+4W4YuaupTdGpeTjcO38aPs7Vn+s89PA1+fKY43/W11cLnnJ+I1eKZq8vVFbYxlJqEfLy/D7z0/secf9lakV1jdTT+SPIOIYSd/TinKbUs7U+iR7r2faPDRuFrSCy6lyndVG/3p8/uWEePVjZ79nw7GIYjccwCGICRMpkgSSUSwEyWUyWBLJKZLAliGxMBMljYmBujEhoCkNCQ0UMYhkDQxIYDGhDQDGhDQACAEAzrPF0FOvbLCyoS5vwy0jsx13iim5XNvJJZ7uSWenVHj2J/51s9T+WODdpTna4WF1bk+iPN+L9Ple1LmnCo5VZylVppr7PLov8A54nfpajSoWtXvJxjtfKOcts8vrahdVeMlGLlOLp1IRfPDfLJo4bl3Pw7OeMssy/LzmtTVOo1hpp4afmJe82eInXoa9d0rl5qOe5vzyjT6o6+OW5t8/nj45XFeIvxQbF5mKUaeec1n0MU2l0mVizSnGPLfz8jDUbbxldefMxQl7efIxU571PzzkmxnrVcrEei8TBlvxMsVmDMaivFgL4ifQrESJdAO69kfDkdZ4lV9c04ztNOxVal0lVf2I+vRy+CPatZcLi0U3PdTzvfPq/B/A8r7Ne807hDVL7nHvrjbSfnthhv5s7dwpqlPWOF7mc5vFCc7eT6vKXX3c0czn3lnf8AHb6mMw45/ddevk7jUaC+zJOpnn0wn/A+jdGedHsHjH8mp8v7qPnelVpXOt1KlLbGlHLTlzz4Nr15to+hOH5Oeg6dKTbbtqeX5+yj36800+9d3bkBMYjZaAENiAkQxASxMZLARLGxMCWSUyWBLExsTAliY2SwN5DQkNAUhkopAMYkNANDEMBjQhoBggABggABnXOOrOdbRnc0m1Ut5ZePGEuT/JnYyK1GncUZ0asFOnUi4yi+jT6oxyx8ppnx53DKZT8PDKu9TjGctymm4vPPK6J//PA4691G30m30d3FRwp22pVVUm+kYVqSSfwlTeTvnEnAWoWne1tMpq6obnOFOL/WQXXGH1x5o851vRp6pCdKvbtVYPLoVI+1Tl4NJ9feaUlwusvh2ryY82MuF9z24DtU4TvbBUNd/VTtqk+6cqc08J84tryfM6RGbcEbnEVTVtPa0m5vbipaQanTpOT2fBPpg46jPMDe4ZrHTk9jLy5LdaYpLm36k7mnzK6+JE3HOFk9HgvPJ4Na1knVqrxwmzPB5izk9B4eeo6BxFrEVJ/oqFs3h8kqlbY8ko0qX2GYpdcIy0/5tkJNvKKCFN9WYpcot9cGxLKSyzDNYyiUeu69X0Xg7gLTdPo6hRu9QlQT7qlJNb5LLlyfRNvn6EaXt4f7PLCl3spVtR3Xc88lBS8Pkl8zpnAvCtjqXeavqlWH1K2qqCtV9q5njOH5R5rPn0PQpaNqXGN13NrZVHHCUdkcRhHyS6JevQ0csZL4z/rr8WduPnfUk1HDaBQudSube1oxzcXc1Tjjltzy5fM+nKNGFvSp0aaShTioRS8ElhfgdL4D7OIcL1pX9/Vp3N7KChCKjmNBeOH4yfmd3Njjw1N1odjlmd1PwBDEejXBI2JgJiGSwEyWUyWBLExslgSyWUyWAmSxsTAkTGyWBvIpEoYFIYkNFDRSJQwKGICCgEhgMYkMBgJDAYAADPM/pBuVLgWnc0pSp1oX1KPeQe2W1qWVlc8dD0w82+kFDd2bV5fuXlu/va/MsHy9q97d31eNS8uatxOMVFSqycml5GCk9sX7jPqMM1INeMIv7jWXKEvcXWl3v5DMM3tllGZ9MmCryCMkX4+Z7p2S8FSuuxHjC5lTzW1qnVVD1jbxbi/jPd8jwmnLEcvoubPtPsy0p6T2e8O6dXp7ZRsKbqwa8Zpykn/jIPjWD3Ut3nzHCOTd1vTpaPq2oabNYdpdVaGP7M2l9yRqQTawZKUl4+CMFTqzPV8IoxVViTFRsaRqd7p1WcbO4lR79KM9qWWviuXvR7r9G+8r3l9xHO4r1a1Turdbqk3J43T8zwK0/pNP+0j3L6Msm9T4iXh3NF/55GOou7rT3sAAiAQxAJiYxMBEsbEwJYmNksBMllMlgSyWUyWBLJZTJYEsTGyWBvoaJRSAaGhIZRSGSUgGhoSGQMZIyigEMgY0IAGPIgAZ0Ht1o992Y6pjn3dS3qfKql+Z306v2o2n13s64hopZf1KVRe+LUvyLB8iV47+79KcTUmsQkcht3TS8oL8DRrrEX7zJWJc1gw1FmLXijL0Rjqcnn5kRynB+kviDibSdKS3fXLylRkv6rkt33ZPuN4y1FYj4JeC8D5N+j3pn17tOsajWY2dGtde5qG1ffNH1iQfJ3bfpf6M7S9XSWIXUqd3H+/BN/5lI6Qntiz2P6S+nd1xFo+opcrizlSb83Tn/CaPHJLkkZQRCOXuZjqrMmzNLktqMdZYXwAi2WK1KX9dfie6fRkpv69xHU8O7oR/zzf5HhtNbVRf9ZfifQH0ZbbFhxHdeErihST90Zyf+olHtYDEYhAAmAEsYgExMbJYCZLKZLAlkspksBMljZLATJY2JgSyRslgb6GSUA0UShoCkMlFFDGJMCChkjQFAIYDQyRoBjEADNXVbFanpd7Yvmrq3qUf8UWvzNocPtx96A+JoUZU61SnNNTpx2ST8GuTOMuV7LXjk7XxFBf7Ua80kkr2vhLw/WSOr3Xsy+J6X4GonmJjk88mVP2JZ8GY31x1MB7f9FywU9c1y+a/mbSnRi/WdTL+6B9FHiP0X7ZQ0jX7jHOVxRp590JP8z23JB5F9JHT1ccN6Re4/o95Km36Thn8YHzs3mTkfVPbjZ/W+zi/ljLt61GsvTE9r+6R8ryX7JlBEI7nuZjrvPyM0uijEwV8cl6FVbjijSfqfTn0e9NdjwBK5lHDvb6tVXrGOIL/AEs+ZanK0jNfs5Z9l8FafQ0rhDRbK3z3VOypNN9W5RUm/i5MlRzYgAxAJjEAmIbJYCYmMTAkXiMTAlkspksCWSymSwJZLLZDAlklMlgbyKRKGgKQ0JABQ0JDRQ0MQ0QNDECAoBDAYxAAxiABji/aj70IFyaYHyNxTT7viXiBeV/XX/mSOo3fN4O88cUu44u16j4y1Cu/83/udGu+U8M9L8DTnzWGRBYlllTftAujeOibMB9M/RstJUOCr64lHCuL57X57YRT/E9aOv8AAOhUeG+DdI0yivsW0KlRvrKpNKcm/i/uOfIOtdp1s7vs+1+lGLk1Zymkv6rUvyPkKryqSS8z7hnTp1oSpVoRnSmnCcZLKlF8mn8MnxfxTpn6F4j1PTVFxja3VWjFPwjGTS+7BliOLefAw1sLCRmWZZSRgnzaKNhrdYS9P4H2fwrLfwvo0vOwt/8ApxPjOgt1nVT8mfY/Bk9/B+hS89Pt/wDpolHMgAGITAAAkTGDAkQ2JgSIolgSxMbEwJZLKZLAlkspksCGSy2QwN1FEjAoYvAYDQxDKhoYkMimMSGA0MkYDHkQAMYgAYdQHD7cfevxA+Vu0KUbnjniCtB4pxvqiz65x+KOiagl9aqbecfA57jDUXLW9QjF5buq05Pzk5yOtupNv25JeO3B6UarTcsG/omnT1XVbTT6Scp3NaFFJecpJfmarSjOMvDPP3He+xS0o1e1HRoV47ownUqwX9eNOUov5rJiPrJQjTXdw+zD2V7lyQxDMQYPmP6Qeiw0vjt3dNrbqVCNy15TXsS+bjn4n04fPn0mLef6f0atj2ZWUor3qq8/6kWDx5/q7Zy8ZvCNfGTPeNRnGkulNYfv8TUqqcnujLkvDyMhv2WGu7zzkmvmfYPAUt/A/D8vPTqH+hHxjbV5U6kZeKZ9k9nNSFXgHh6dOSlF2FLDXuwSjsYABiEAAAhMAYCZJQgJJLJwBLJZbRLQEslltEsIhkstoloKhkMyNENAbaKRapj7sCEMvux92BCGX3Y+7AgZfdj2AQMrYPYUSBewNhBIF7B7AIAvb6BtAnBq6rdTsdLvbuCzOhb1asffGDa+9G7tNbVKPe6Xe02sqVvVjj3wkB8VOLrTlXrS3Tk90m/FvmzQu3mu36I5K4ymoYwkkcXdf0h+5GdEZysM9E7DqbrdpOiTisuKrOXwpT/iedeB6X9Hld52jWib+zQuJL/w8EH1LgMF7Q2mIk8a+khSpqx0G6lFOVOrXWfTbB4+aR7PtPGvpML/AIDosfO4rf6IlnyPnScnOTk+bbywx7EvcNoH9iXuMlTTjv5L7S6ep9TdgF5Vuuza1p1cv6rdV6Ec/uqSkv8AUz5YpvElg+ruwejGHZvZySx3lzcTf+PH5GKO/wCAwXtHtIMYjJsDYBjwIy7BbAMWBYMuwNgGFoloz92LuwMDQmjP3Yu7A12iWjZ7oXdegGs0S0bLpegnS9ANVoho23RJdEDf7ofdGzsDYBrqmPu/Q2NnoGwDX7sfdmfYGwDB3Y9hn2BtAw7A2GbaG0DDsHsMu0NoGLYGwzbQ2gYdobTLtDaBi2iqUu8pzh+9Fx+awZ9o4R9uPvQHw5qEO7uJxf7LaOHuv6RL3I7Brsdup3P/AHs/9TOvXX9Il8DOjG2emfR0We0q1/8Axrn/AKZ5k+h6d9HTH+8yxWcZtrr/AKZiPqvb6D2mTaG0gx7TxP6TcsafoEM9atxLH92H8T3DaeDfShrKM+HaOeey4nj4wX5Fg8BfUJfZl7gl1E/sy9xkqKa9pH1x2GQx2ZaW8dald/8AmM+SKX20fXnYbJT7MtLSX2KlxB/CrL+JijvG0e0ybQ2kGPb6BsMu0NoGLYGwy7Q2gYtgthm2htAw7BbDPtDaBg7sXd+hsbRbQMHdh3Zn2htA1+7E6RsbQ2ga3degnS9Da2BsAz4DBQATgMFABOAwUAE4DBQATgMFABOAwUAE4DBQATgMFABOCqa/WQ/tL8QwVSX6yH9pfiB8R8RR/wCJXLX/AD6sflUkdYuv6RP4fgdr4hj/AMR1OOMOnfV17k6kjqd1/SZmdGNvkeh9gtfuO1HQVnHeOtT/AMVKf8Dztvkdz7H63c9qPCz6ZvoQ+cZL8zEfZ6XIeBpckPBBOD55+lNSf6W4dqOT2u1rxS9VUi/zPojB4H9Kmi9vDVbw/lMP+mywfP0g/ZfuBoH9l+4yU7SO6vBeGcs+r/o91HV7MrbP7N7dL/On+Z8pWnsqpUfhF/efUf0aqvedm84f8vUq6+agyVHqeB4GBiDAYGAE4HgYALADDICDAxAGAwAZAWAHkQAGAAAwLA8iyBmGJMAGAZAAAQwAAAAAYAAAAAAAAAAAIqn/ADkP7S/ERiurhWlpXuZPCo0p1X/di3+QHxXq0u81nV4Np7rmu8p5y1Ukzqd0/wCUVPec9Go3V7+XWctz9c9fxOv33s3laPlJozoxtnaeyucn2l8LyhFt/pOh/qOqKEp+h6D2FWCu+1fh6O3Ko1alw/7lKb/HBiPskeASAgWDxL6UtDdoPD9f9y8rQ+dNP/0ntuefieR/Saod5wLY1sfzWpQ/zU5osHy8yZfZZkaIcc8jJVN93bY8Zs+lvovVt/BGqUv+XqbfzpQ/gfMlWe6oorpHkfR30WKv/AuIaH7t5Rnj302v/SSo9wAWQyYh5DIsiyBWQyTkWQLyGSNwZArIZI3C3AXkMkbhbgMmRZMe4NwGTIbjFvDeBk3BuMW8NwG6AAAwEMAABgIYhgAAAAAAAAAAAANAI4Pjy7+o8E6/c7tuzT62H6uLX5nOnSu2ejcXHZbxHC2zv+rRk8ddiqQcvuTLB8j17mhB7e8SS5HF3KpVLmpUUk9zzn4F1bCTbypNmpXsnSSack35czKjNtjjkes/RlsHc9o9a6xmNnp1aefJzlGC/FnjsFUXqfRP0UtMXd8R6tLq3Qs48v7VR/8ApJR9AAJsWTEM8z+kVRVTsxuKj/7G9tp/5nH8z0ts6D262VTUOynXoU4uUqMKVxheUKkW/uyWD47qXiT9mOSPry6OLizNChFeGQr0FUpyTWOWc+Rl7GKFxHPgfQv0WK0ZU+JKafjbS/6iPnONpPwZ9D/RU065oUOI76cf5POVvQhLznHfJ/JSj8zEe/5DJG4W4gvPwE5epDkJzAvcLcY94nMDLuFuMO8W8DNvFuMLqeqFvAzbgczDvFvAzbxbzC5huAyuYbzDuHkDLvFvMeR5A5YeAAAwAAAxAMAAQAMBAAwAQDAAAAAQFGG8tKGoWlezuYb6FxTlRqR84yTT+5mQUpRjFyk9sYrMm/BeLA+KeKNBuOGNZvdIuoVO9tqsqaex+3FN4kuXRpZydcuZPduw9uOXI9C7Qr+fFHFl9K0m7hVq0qtWUpy/U08+zFtclmKSUUspL1On6jR2T7twpvm3hZ5/NjzZeLg3W588M+xuxPhN8I9n1hSrx23l/wDy+4WPsymltj8IKPxyfL3CGi2NzrFGtfUHVtKFSE6tPdhSipLK9zXL4n205JP2ViK6Y6YG9sbDeAwiHMl1PUDI2a93RoXltWtbmmqtCtCVKpTl0nCSw18UxusvMl1QPjPj/g+vwLxPd6PUcpUIPfbVX/2lGXOEvfjk/VM4HuKkoOSpzcX+1jl82fQ3a/Tt9T4jp06tvSqTsrWDg5RTftNyZ41r9KW/lGFSTk4x3S/Ly8x5spHV4ZmsRhJvGcY5s+w+y3QYcMcA6PYqKVWdBXNdr9qpU9p/LKXwPk+WmztbelcN5t44jVnClulRXhNL0Z792Wa3WoaBD6ptq0beEqlWzpPMa1GOHUqUfKpDcpOPScJLpKOW3tLHrjqCdQ11UUoqUZKUWk1JdGn0YnPHiEZ3PnyYnUNd1fUnvSDZdQnejX3NjWWBmcxbyFFspQYBuHnIbCtgEYyPGC9gbSiMPzGi9g9gEYDBe0e0CMDwVtHtA5QAGACAMgABkMgAACAYgDIAABhAGQyLINoB5Anehb0BR5t2pcaYsq3D+kXeyvWzTvLimsujDxhB9N76N89q9enauNdclofDd5dUakadxKKpUHJ/ty5cvXGX8D511TiG2hTdOorqNxJ4yklBerfVktWRNd2WkadK2tadGinnK6yk/Ft+L9TpGqfrZZUunNNGbWL1UbvH1t14eLpZ/M1Z3dOulGhSmkus5+RjpntyGnanT0lQoOl30t0alVp4i/FJv7+R9e/pWFSEZRTxJJpe9Hx3YaDquv6lOnQpKnTlLEZ9fZ8Gkup9O6HLVLihTVzbxppRUc+LwsGUYV2R6g30TBXFSfgFvaUopOc+ZuQVvHo8lRgiqj6mRQkZ99NfZQpVH4YQHhPa1qztONqlOtQUqVK3pLdTyp7XHLz54fToed3VvCVzc1dyrKsm6c+iUeqSXr1Z7f2j9mFzxVfy1jTb6FO8dOMJ0K6xCaisLbJfZePNNe48b1fS9Q4bvoWOpxoQvreCjVp0JqSjn2lh+PstZx4mNjLGtHQrpUasqVRQcXlNS8fQ7bwVPTuHNRnSuKUq+i3T3ztm3m2qc0qlNpp4xKUZR8Yya59DpV3Usa1ZunOvQkk25zXj5JING4khbVJUrr61W/dcJLHxyFr6po31O4owq0JwnSnFOEofZcfDHoWpzn0POexzXKWoVrvTK09mYqvRpOWcYeJY8uqeD1ylb0Y+CKwcbGjUl5maNrJ+ZycYU10SKUY+RRxytPQuNs16m/heQYQGmqBXc46mzyBpeQGuqQ+69DPhC5eQGHuw7szYQAYe7DYZWIDHsDYZMiAjCDb6Fg0UbgE7gyQUBGQyBQZJACsoW4WAwA3MNwsAAbmDbDIsgAhhgCRPkVgW3IHXOOeHq3E/D1WxtqsKdxGSq0e8eISks+zJ45J5fPwPmDizQeItAuprVeHtSt4p8qtOKqUn6qceTR9gunkXdJ59eoHwjXv6VZ4lCupesFn8TsXDPBnEnFUo09M0W7q0spO4uKfdUYrzcpcvlln2NLTLWUtzt6Ll592s/gZPqsOWV06DRt0LgngK34W0u3t5qFxdRgu9qqOFKXjj0O2RoTS5ROTjRhHwRW1eCA4xUZ/usfcz8jktotiA49UZh3c/CTN900S6aA0JKojyntM7MNT1/VK2taPVo161WMe8tas1TeYxSzCT5c0lyePeexukiHQi+sUB8d6tw1xPo1SSveGdYpvPOSo74v3SjlM4u203W72uo23D2r1ajfJQoSz/AKT7XVCMfsxS9xSi1+1L5jRt4f2R9nnE1jfx1bWbWWmQjBxhSqTTqyz4tLoe3QWIpdSlHBSfoBPMabK3LyDK8gFufmPew5BhAPew3+gtvqLaBW5BuROGJpgZMoMmJ5DLXmBkBmPcG9gXyETvDcBQhbg3AbQyRgMBBgB5FkMDwAh8wwPACDA0h4An4MMFYABYDAwKFgYZAgBDEyhPoJjABAMQAIYvgAIWBr4jaz4EEtZEoJLGMFYYbSiHEW0yYDAGNxFtMuBYIMLi0/QRmaI9nPUCMPxAv2fNCwAshuYNBgB7g3E4FgCsoHggMgU0LAt2BbgHjAg3BnICYZDIMo//2Q==", + prompt: "TRY-ON: The person of image 1 wearing the garments of image 2.", +}); +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/bfl/vto-v1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"garment\": \"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\", \"person\": \"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\", \"prompt\": \"TRY-ON: The person of image 1 wearing the garments of image 2.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bfl/vto-v1/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/bfl/vto-v1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/bria/fibo/code.mdx b/development/comfy-router/models/bria/fibo/code.mdx index 6c1aef20c..16ca38500 100644 --- a/development/comfy-router/models/bria/fibo/code.mdx +++ b/development/comfy-router/models/bria/fibo/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Fibo" {/* GENERATED FILE. Generated from router-schemas/bria/fibo.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bria/fibo`, served by Comfy Router from Bria. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bria/fibo` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/bria/fibo \ -d "{\"images\": [\"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\"], \"instruction\": \"make the background light blue\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bria/fibo/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( + "bria/fibo", + { + "images": ["iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg=="], + "instruction": "make the background light blue", + }, + ) + 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("bria/fibo", { + images: ["iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg=="], + instruction: "make the background light blue", +}); +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/bria/fibo/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"images\": [\"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\"], \"instruction\": \"make the background light blue\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bria/fibo/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/bria/fibo/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/bria/image-edit-erase/code.mdx b/development/comfy-router/models/bria/image-edit-erase/code.mdx index c9edaa2e0..e55cd5089 100644 --- a/development/comfy-router/models/bria/image-edit-erase/code.mdx +++ b/development/comfy-router/models/bria/image-edit-erase/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Image Edit Erase" {/* GENERATED FILE. Generated from router-schemas/bria/image-edit-erase.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bria/image-edit-erase`, served by Comfy Router from Bria. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bria/image-edit-erase` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/bria/image-edit-erase \ -d "{\"image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\", \"mask\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAB+UlEQVR42u3TMQ0AAAzDsPIn3d7DMBtCpKTwWCTAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAbAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGgGvctyzUB/Dz3wAAAABJRU5ErkJggg==\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bria/image-edit-erase/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( + "bria/image-edit-erase", + { + "image": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + "mask": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAB+UlEQVR42u3TMQ0AAAzDsPIn3d7DMBtCpKTwWCTAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAbAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGgGvctyzUB/Dz3wAAAABJRU5ErkJggg==", + }, + ) + 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("bria/image-edit-erase", { + image: "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + mask: "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAB+UlEQVR42u3TMQ0AAAzDsPIn3d7DMBtCpKTwWCTAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAbAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGgGvctyzUB/Dz3wAAAABJRU5ErkJggg==", +}); +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/bria/image-edit-erase/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\", \"mask\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAB+UlEQVR42u3TMQ0AAAzDsPIn3d7DMBtCpKTwWCTAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAbAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGgGvctyzUB/Dz3wAAAABJRU5ErkJggg==\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bria/image-edit-erase/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/bria/image-edit-erase/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/bria/image-edit-expand/code.mdx b/development/comfy-router/models/bria/image-edit-expand/code.mdx index ddddc584f..f0c95ef70 100644 --- a/development/comfy-router/models/bria/image-edit-expand/code.mdx +++ b/development/comfy-router/models/bria/image-edit-expand/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Image Edit Expand" {/* GENERATED FILE. Generated from router-schemas/bria/image-edit-expand.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bria/image-edit-expand`, served by Comfy Router from Bria. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bria/image-edit-expand` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/bria/image-edit-expand \ -d "{\"aspect_ratio\": \"3:2\", \"image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bria/image-edit-expand/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( + "bria/image-edit-expand", + { + "aspect_ratio": "3:2", + "image": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + }, + ) + 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("bria/image-edit-expand", { + aspect_ratio: "3:2", + image: "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", +}); +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/bria/image-edit-expand/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"3:2\", \"image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bria/image-edit-expand/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/bria/image-edit-expand/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/bria/image-edit-gen-fill/code.mdx b/development/comfy-router/models/bria/image-edit-gen-fill/code.mdx index a70feae7e..75e57cd4f 100644 --- a/development/comfy-router/models/bria/image-edit-gen-fill/code.mdx +++ b/development/comfy-router/models/bria/image-edit-gen-fill/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Image Edit Gen Fill" {/* GENERATED FILE. Generated from router-schemas/bria/image-edit-gen-fill.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bria/image-edit-gen-fill`, served by Comfy Router from Bria. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bria/image-edit-gen-fill` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/bria/image-edit-gen-fill \ -d "{\"image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\", \"mask\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAB+UlEQVR42u3TMQ0AAAzDsPIn3d7DMBtCpKTwWCTAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAbAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGgGvctyzUB/Dz3wAAAABJRU5ErkJggg==\", \"prompt\": \"a small green leaf\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bria/image-edit-gen-fill/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( + "bria/image-edit-gen-fill", + { + "image": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + "mask": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAB+UlEQVR42u3TMQ0AAAzDsPIn3d7DMBtCpKTwWCTAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAbAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGgGvctyzUB/Dz3wAAAABJRU5ErkJggg==", + "prompt": "a small green leaf", + }, + ) + 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("bria/image-edit-gen-fill", { + image: "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + mask: "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAB+UlEQVR42u3TMQ0AAAzDsPIn3d7DMBtCpKTwWCTAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAbAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGgGvctyzUB/Dz3wAAAABJRU5ErkJggg==", + prompt: "a small green leaf", +}); +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/bria/image-edit-gen-fill/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\", \"mask\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAB+UlEQVR42u3TMQ0AAAzDsPIn3d7DMBtCpKTwWCTAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgADAAGAAMAAbAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADAAGgGvctyzUB/Dz3wAAAABJRU5ErkJggg==\", \"prompt\": \"a small green leaf\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bria/image-edit-gen-fill/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/bria/image-edit-gen-fill/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/bria/image-edit-increase-resolution/code.mdx b/development/comfy-router/models/bria/image-edit-increase-resolution/code.mdx index 12776fc20..6a540631f 100644 --- a/development/comfy-router/models/bria/image-edit-increase-resolution/code.mdx +++ b/development/comfy-router/models/bria/image-edit-increase-resolution/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Image Edit Increase Resolution" {/* GENERATED FILE. Generated from router-schemas/bria/image-edit-increase-resolution.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bria/image-edit-increase-resolution`, served by Comfy Router from Bria. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bria/image-edit-increase-resolution` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/bria/image-edit-increase-resolution \ -d "{\"desired_increase\": 2, \"image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bria/image-edit-increase-resolution/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( + "bria/image-edit-increase-resolution", + { + "desired_increase": 2, + "image": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + }, + ) + 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("bria/image-edit-increase-resolution", { + desired_increase: 2, + image: "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", +}); +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/bria/image-edit-increase-resolution/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"desired_increase\": 2, \"image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bria/image-edit-increase-resolution/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/bria/image-edit-increase-resolution/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/bria/image-edit-remove-background/code.mdx b/development/comfy-router/models/bria/image-edit-remove-background/code.mdx index da7442a2f..3b69721b6 100644 --- a/development/comfy-router/models/bria/image-edit-remove-background/code.mdx +++ b/development/comfy-router/models/bria/image-edit-remove-background/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Image Edit Remove Background" {/* GENERATED FILE. Generated from router-schemas/bria/image-edit-remove-background.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bria/image-edit-remove-background`, served by Comfy Router from Bria. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bria/image-edit-remove-background` + + ```python Python from comfy_sdk import Comfy @@ -55,6 +58,79 @@ curl https://api.comfy.org/v2/models/bria/image-edit-remove-background \ -d "{\"image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bria/image-edit-remove-background/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( + "bria/image-edit-remove-background", + { + "image": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + }, + ) + 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("bria/image-edit-remove-background", { + image: "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", +}); +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/bria/image-edit-remove-background/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"image\": \"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bria/image-edit-remove-background/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/bria/image-edit-remove-background/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/bria/structured-instruction/code.mdx b/development/comfy-router/models/bria/structured-instruction/code.mdx index 5c94c6942..6662c0b22 100644 --- a/development/comfy-router/models/bria/structured-instruction/code.mdx +++ b/development/comfy-router/models/bria/structured-instruction/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Structured Instruction" {/* GENERATED FILE. Generated from router-schemas/bria/structured-instruction.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bria/structured-instruction`, served by Comfy Router from Bria. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bria/structured-instruction` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/bria/structured-instruction \ -d "{\"images\": [\"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\"], \"instruction\": \"make the background light blue\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bria/structured-instruction/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( + "bria/structured-instruction", + { + "images": ["iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg=="], + "instruction": "make the background light blue", + }, + ) + 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("bria/structured-instruction", { + images: ["iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg=="], + instruction: "make the background light blue", +}); +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/bria/structured-instruction/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"images\": [\"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\"], \"instruction\": \"make the background light blue\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bria/structured-instruction/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/bria/structured-instruction/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/bria/video-edit-green-screen/code.mdx b/development/comfy-router/models/bria/video-edit-green-screen/code.mdx index 9657c5a04..286898b90 100644 --- a/development/comfy-router/models/bria/video-edit-green-screen/code.mdx +++ b/development/comfy-router/models/bria/video-edit-green-screen/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Video Edit Green Screen" {/* GENERATED FILE. Generated from router-schemas/bria/video-edit-green-screen.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bria/video-edit-green-screen`, served by Comfy Router from Bria. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bria/video-edit-green-screen` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/bria/video-edit-green-screen \ -d "{\"green_shade\": \"broadcast_green\", \"video\": \"https://example.com/input.mp4\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bria/video-edit-green-screen/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( + "bria/video-edit-green-screen", + { + "green_shade": "broadcast_green", + "video": "https://example.com/input.mp4", + }, + ) + 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("bria/video-edit-green-screen", { + green_shade: "broadcast_green", + video: "https://example.com/input.mp4", +}); +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/bria/video-edit-green-screen/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"green_shade\": \"broadcast_green\", \"video\": \"https://example.com/input.mp4\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bria/video-edit-green-screen/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/bria/video-edit-green-screen/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/bria/video-edit-remove-background/code.mdx b/development/comfy-router/models/bria/video-edit-remove-background/code.mdx index a6d319cf5..fdb75016c 100644 --- a/development/comfy-router/models/bria/video-edit-remove-background/code.mdx +++ b/development/comfy-router/models/bria/video-edit-remove-background/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Video Edit Remove Background" {/* GENERATED FILE. Generated from router-schemas/bria/video-edit-remove-background.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bria/video-edit-remove-background`, served by Comfy Router from Bria. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bria/video-edit-remove-background` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/bria/video-edit-remove-background \ -d "{\"background_color\": \"Transparent\", \"output_container_and_codec\": \"webm_vp9\", \"video\": \"https://example.com/input.mp4\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bria/video-edit-remove-background/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( + "bria/video-edit-remove-background", + { + "background_color": "Transparent", + "output_container_and_codec": "webm_vp9", + "video": "https://example.com/input.mp4", + }, + ) + 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("bria/video-edit-remove-background", { + background_color: "Transparent", + output_container_and_codec: "webm_vp9", + video: "https://example.com/input.mp4", +}); +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/bria/video-edit-remove-background/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"background_color\": \"Transparent\", \"output_container_and_codec\": \"webm_vp9\", \"video\": \"https://example.com/input.mp4\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bria/video-edit-remove-background/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/bria/video-edit-remove-background/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/bria/video-edit-replace-background/code.mdx b/development/comfy-router/models/bria/video-edit-replace-background/code.mdx index 56ef2b734..c94085eb0 100644 --- a/development/comfy-router/models/bria/video-edit-replace-background/code.mdx +++ b/development/comfy-router/models/bria/video-edit-replace-background/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Video Edit Replace Background" {/* GENERATED FILE. Generated from router-schemas/bria/video-edit-replace-background.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `bria/video-edit-replace-background`, served by Comfy Router from Bria. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/bria/video-edit-replace-background` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/bria/video-edit-replace-background \ -d "{\"background_url\": \"https://example.com/background.mp4\", \"video\": \"https://example.com/input.mp4\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/bria/video-edit-replace-background/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( + "bria/video-edit-replace-background", + { + "background_url": "https://example.com/background.mp4", + "video": "https://example.com/input.mp4", + }, + ) + 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("bria/video-edit-replace-background", { + background_url: "https://example.com/background.mp4", + video: "https://example.com/input.mp4", +}); +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/bria/video-edit-replace-background/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"background_url\": \"https://example.com/background.mp4\", \"video\": \"https://example.com/input.mp4\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/bria/video-edit-replace-background/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/bria/video-edit-replace-background/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 fe473459b..36df589a2 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 @@ -6,6 +6,7 @@ sidebarTitle: "Dreamina Seedance 2.0 260128" {/* GENERATED FILE. Generated from router-schemas/byteplus/dreamina-seedance-2-0-260128.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `byteplus/dreamina-seedance-2-0-260128`, served by Comfy Router from BytePlus. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/dreamina-seedance-2-0-260128` + + ```python Python from comfy_sdk import Comfy @@ -71,6 +74,95 @@ curl https://api.comfy.org/v2/models/byteplus/dreamina-seedance-2-0-260128 \ -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/dreamina-seedance-2-0-260128/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/dreamina-seedance-2-0-260128", + { + "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/dreamina-seedance-2-0-260128", { + 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/dreamina-seedance-2-0-260128/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/dreamina-seedance-2-0-260128/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/dreamina-seedance-2-0-260128/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 baece3512..fb2e0407e 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 @@ -6,6 +6,7 @@ sidebarTitle: "Dreamina Seedance 2.0 Fast 260128" {/* GENERATED FILE. Generated from router-schemas/byteplus/dreamina-seedance-2-0-fast-260128.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `byteplus/dreamina-seedance-2-0-fast-260128`, served by Comfy Router from BytePlus. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/dreamina-seedance-2-0-fast-260128` + + ```python Python from comfy_sdk import Comfy @@ -71,6 +74,95 @@ curl https://api.comfy.org/v2/models/byteplus/dreamina-seedance-2-0-fast-260128 -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/dreamina-seedance-2-0-fast-260128/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/dreamina-seedance-2-0-fast-260128", + { + "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/dreamina-seedance-2-0-fast-260128", { + 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/dreamina-seedance-2-0-fast-260128/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/dreamina-seedance-2-0-fast-260128/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/dreamina-seedance-2-0-fast-260128/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 297cb7b14..13279ce7b 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 @@ -6,6 +6,7 @@ sidebarTitle: "Dreamina Seedance 2.0 Mini" {/* GENERATED FILE. Generated from router-schemas/byteplus/dreamina-seedance-2-0-mini.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `byteplus/dreamina-seedance-2-0-mini`, served by Comfy Router from BytePlus. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/dreamina-seedance-2-0-mini` + + ```python Python from comfy_sdk import Comfy @@ -71,6 +74,95 @@ curl https://api.comfy.org/v2/models/byteplus/dreamina-seedance-2-0-mini \ -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/dreamina-seedance-2-0-mini/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/dreamina-seedance-2-0-mini", + { + "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/dreamina-seedance-2-0-mini", { + 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/dreamina-seedance-2-0-mini/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/dreamina-seedance-2-0-mini/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/dreamina-seedance-2-0-mini/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 3fc2f3f28..820df6c4e 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 @@ -6,6 +6,7 @@ sidebarTitle: "Dreamina Seedance 2.5 260628" {/* GENERATED FILE. Generated from router-schemas/byteplus/dreamina-seedance-2-5-260628.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `byteplus/dreamina-seedance-2-5-260628`, served by Comfy Router from BytePlus. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/dreamina-seedance-2-5-260628` + + ```python Python from comfy_sdk import Comfy @@ -71,6 +74,95 @@ curl https://api.comfy.org/v2/models/byteplus/dreamina-seedance-2-5-260628 \ -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/dreamina-seedance-2-5-260628/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/dreamina-seedance-2-5-260628", + { + "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/dreamina-seedance-2-5-260628", { + 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/dreamina-seedance-2-5-260628/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/dreamina-seedance-2-5-260628/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/dreamina-seedance-2-5-260628/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/byteplus/seed-2-0-lite-260228/code.mdx b/development/comfy-router/models/byteplus/seed-2-0-lite-260228/code.mdx index 511f9bdfe..7e7563c62 100644 --- a/development/comfy-router/models/byteplus/seed-2-0-lite-260228/code.mdx +++ b/development/comfy-router/models/byteplus/seed-2-0-lite-260228/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Seed 2.0 Lite 260228" {/* GENERATED FILE. Generated from router-schemas/byteplus/seed-2-0-lite-260228.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `byteplus/seed-2-0-lite-260228`, served by Comfy Router from BytePlus. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seed-2-0-lite-260228` + + ```python Python from comfy_sdk import Comfy @@ -55,6 +58,79 @@ curl https://api.comfy.org/v2/models/byteplus/seed-2-0-lite-260228 \ -d "{\"input\": \"Reply with the single word: ok\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/byteplus/seed-2-0-lite-260228/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/seed-2-0-lite-260228", + { + "input": "Reply with the single word: ok", + }, + ) + 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/seed-2-0-lite-260228", { + input: "Reply with the single word: ok", +}); +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/seed-2-0-lite-260228/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\"}" + +# 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/seed-2-0-lite-260228/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/seed-2-0-lite-260228/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/byteplus/seed-2-0-mini-260215/code.mdx b/development/comfy-router/models/byteplus/seed-2-0-mini-260215/code.mdx index cbe0d5b13..593e9b074 100644 --- a/development/comfy-router/models/byteplus/seed-2-0-mini-260215/code.mdx +++ b/development/comfy-router/models/byteplus/seed-2-0-mini-260215/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Seed 2.0 Mini 260215" {/* GENERATED FILE. Generated from router-schemas/byteplus/seed-2-0-mini-260215.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `byteplus/seed-2-0-mini-260215`, served by Comfy Router from BytePlus. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seed-2-0-mini-260215` + + ```python Python from comfy_sdk import Comfy @@ -55,6 +58,79 @@ curl https://api.comfy.org/v2/models/byteplus/seed-2-0-mini-260215 \ -d "{\"input\": \"Reply with the single word: ok\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/byteplus/seed-2-0-mini-260215/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/seed-2-0-mini-260215", + { + "input": "Reply with the single word: ok", + }, + ) + 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/seed-2-0-mini-260215", { + input: "Reply with the single word: ok", +}); +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/seed-2-0-mini-260215/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\"}" + +# 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/seed-2-0-mini-260215/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/seed-2-0-mini-260215/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/byteplus/seed-2-0-pro-260328/code.mdx b/development/comfy-router/models/byteplus/seed-2-0-pro-260328/code.mdx index c1d1baf85..300913026 100644 --- a/development/comfy-router/models/byteplus/seed-2-0-pro-260328/code.mdx +++ b/development/comfy-router/models/byteplus/seed-2-0-pro-260328/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Seed 2.0 Pro 260328" {/* GENERATED FILE. Generated from router-schemas/byteplus/seed-2-0-pro-260328.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `byteplus/seed-2-0-pro-260328`, served by Comfy Router from BytePlus. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seed-2-0-pro-260328` + + ```python Python from comfy_sdk import Comfy @@ -55,6 +58,79 @@ curl https://api.comfy.org/v2/models/byteplus/seed-2-0-pro-260328 \ -d "{\"input\": \"Reply with the single word: ok\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/byteplus/seed-2-0-pro-260328/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/seed-2-0-pro-260328", + { + "input": "Reply with the single word: ok", + }, + ) + 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/seed-2-0-pro-260328", { + input: "Reply with the single word: ok", +}); +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/seed-2-0-pro-260328/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\"}" + +# 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/seed-2-0-pro-260328/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/seed-2-0-pro-260328/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/byteplus/seed-audio-1-0-multilingual/code.mdx b/development/comfy-router/models/byteplus/seed-audio-1-0-multilingual/code.mdx index 384ac035b..b886d0a72 100644 --- a/development/comfy-router/models/byteplus/seed-audio-1-0-multilingual/code.mdx +++ b/development/comfy-router/models/byteplus/seed-audio-1-0-multilingual/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Seed Audio 1.0 Multilingual" {/* GENERATED FILE. Generated from router-schemas/byteplus/seed-audio-1.0-multilingual.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `byteplus/seed-audio-1.0-multilingual`, served by Comfy Router from BytePlus. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seed-audio-1.0-multilingual` + + ```python Python from comfy_sdk import Comfy @@ -63,6 +66,87 @@ curl https://api.comfy.org/v2/models/byteplus/seed-audio-1.0-multilingual \ -d "{\"audio_config\": {\"format\":\"wav\",\"sample_rate\":24000}, \"text_prompt\": \"Hello from Comfy Router.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/byteplus/seed-audio-1.0-multilingual/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/seed-audio-1.0-multilingual", + { + "audio_config": { + "format": "wav", + "sample_rate": 24000, + }, + "text_prompt": "Hello from Comfy Router.", + }, + ) + 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/seed-audio-1.0-multilingual", { + audio_config: { + format: "wav", + sample_rate: 24000, + }, + text_prompt: "Hello from Comfy Router.", +}); +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/seed-audio-1.0-multilingual/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"audio_config\": {\"format\":\"wav\",\"sample_rate\":24000}, \"text_prompt\": \"Hello from Comfy Router.\"}" + +# 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/seed-audio-1.0-multilingual/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/seed-audio-1.0-multilingual/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/byteplus/seed-audio-1-0/code.mdx b/development/comfy-router/models/byteplus/seed-audio-1-0/code.mdx index ccbb0001a..c4fd1f614 100644 --- a/development/comfy-router/models/byteplus/seed-audio-1-0/code.mdx +++ b/development/comfy-router/models/byteplus/seed-audio-1-0/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Seed Audio 1.0" {/* GENERATED FILE. Generated from router-schemas/byteplus/seed-audio-1.0.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `byteplus/seed-audio-1.0`, served by Comfy Router from BytePlus. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seed-audio-1.0` + + ```python Python from comfy_sdk import Comfy @@ -63,6 +66,87 @@ curl https://api.comfy.org/v2/models/byteplus/seed-audio-1.0 \ -d "{\"audio_config\": {\"format\":\"wav\",\"sample_rate\":24000}, \"text_prompt\": \"Hello from Comfy Router.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/byteplus/seed-audio-1.0/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/seed-audio-1.0", + { + "audio_config": { + "format": "wav", + "sample_rate": 24000, + }, + "text_prompt": "Hello from Comfy Router.", + }, + ) + 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/seed-audio-1.0", { + audio_config: { + format: "wav", + sample_rate: 24000, + }, + text_prompt: "Hello from Comfy Router.", +}); +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/seed-audio-1.0/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"audio_config\": {\"format\":\"wav\",\"sample_rate\":24000}, \"text_prompt\": \"Hello from Comfy Router.\"}" + +# 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/seed-audio-1.0/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/seed-audio-1.0/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 index d523b2410..1fe529a78 100644 --- 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 @@ -6,6 +6,7 @@ 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 QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; 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. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seedance-1-0-lite-i2v-250428` + + ```python Python from comfy_sdk import Comfy @@ -71,6 +74,95 @@ curl https://api.comfy.org/v2/models/byteplus/seedance-1-0-lite-i2v-250428 \ -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 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 index f14afdeaf..cd0731e0d 100644 --- 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 @@ -6,6 +6,7 @@ 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 QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; 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. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seedance-1-0-lite-t2v-250428` + + ```python Python from comfy_sdk import Comfy @@ -71,6 +74,95 @@ curl https://api.comfy.org/v2/models/byteplus/seedance-1-0-lite-t2v-250428 \ -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 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 2b1af2a27..653700457 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 @@ -6,6 +6,7 @@ sidebarTitle: "Seedance 1.0 Pro 250528" {/* GENERATED FILE. Generated from router-schemas/byteplus/seedance-1-0-pro-250528.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `byteplus/seedance-1-0-pro-250528`, served by Comfy Router from BytePlus. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seedance-1-0-pro-250528` + + ```python Python from comfy_sdk import Comfy @@ -71,6 +74,95 @@ curl https://api.comfy.org/v2/models/byteplus/seedance-1-0-pro-250528 \ -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-pro-250528/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-pro-250528", + { + "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-pro-250528", { + 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-pro-250528/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-pro-250528/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-pro-250528/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 2f08aa49c..6fbd647ee 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 @@ -6,6 +6,7 @@ sidebarTitle: "Seedance 1.0 Pro Fast 251015" {/* GENERATED FILE. Generated from router-schemas/byteplus/seedance-1-0-pro-fast-251015.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `byteplus/seedance-1-0-pro-fast-251015`, served by Comfy Router from BytePlus. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seedance-1-0-pro-fast-251015` + + ```python Python from comfy_sdk import Comfy @@ -71,6 +74,95 @@ curl https://api.comfy.org/v2/models/byteplus/seedance-1-0-pro-fast-251015 \ -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-pro-fast-251015/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-pro-fast-251015", + { + "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-pro-fast-251015", { + 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-pro-fast-251015/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-pro-fast-251015/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-pro-fast-251015/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 48c87f282..67cef1b5c 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 @@ -6,6 +6,7 @@ sidebarTitle: "Seedance 1.5 Pro 251215" {/* GENERATED FILE. Generated from router-schemas/byteplus/seedance-1-5-pro-251215.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `byteplus/seedance-1-5-pro-251215`, served by Comfy Router from BytePlus. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seedance-1-5-pro-251215` + + ```python Python from comfy_sdk import Comfy @@ -71,6 +74,95 @@ curl https://api.comfy.org/v2/models/byteplus/seedance-1-5-pro-251215 \ -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-5-pro-251215/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-5-pro-251215", + { + "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-5-pro-251215", { + 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-5-pro-251215/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-5-pro-251215/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-5-pro-251215/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 index fb7e06f29..230295528 100644 --- 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 @@ -6,6 +6,7 @@ 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 QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; 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. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seededit-3-0-i2i-250628` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/byteplus/seededit-3-0-i2i-250628 \ -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 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 index c40f09508..9ab602eb7 100644 --- 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 @@ -6,6 +6,7 @@ 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 QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; 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. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seedream-3-0-t2i-250415` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/byteplus/seedream-3-0-t2i-250415 \ -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 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 89642762f..59e01c29e 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 @@ -6,6 +6,7 @@ sidebarTitle: "Seedream 4.0 250828" {/* GENERATED FILE. Generated from router-schemas/byteplus/seedream-4-0-250828.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `byteplus/seedream-4-0-250828`, served by Comfy Router from BytePlus. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seedream-4-0-250828` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/byteplus/seedream-4-0-250828 \ -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-4-0-250828/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-4-0-250828", + { + "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-4-0-250828", { + 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-4-0-250828/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-4-0-250828/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-4-0-250828/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 4b69a7e0e..06718c6e3 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 @@ -6,6 +6,7 @@ sidebarTitle: "Seedream 4.5 251128" {/* GENERATED FILE. Generated from router-schemas/byteplus/seedream-4-5-251128.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `byteplus/seedream-4-5-251128`, served by Comfy Router from BytePlus. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seedream-4-5-251128` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/byteplus/seedream-4-5-251128 \ -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-4-5-251128/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-4-5-251128", + { + "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-4-5-251128", { + 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-4-5-251128/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-4-5-251128/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-4-5-251128/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 2c474f465..65099452c 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 @@ -6,6 +6,7 @@ sidebarTitle: "Seedream 5.0 260128" {/* GENERATED FILE. Generated from router-schemas/byteplus/seedream-5-0-260128.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `byteplus/seedream-5-0-260128`, served by Comfy Router from BytePlus. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seedream-5-0-260128` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/byteplus/seedream-5-0-260128 \ -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-5-0-260128/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-5-0-260128", + { + "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-5-0-260128", { + 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-5-0-260128/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-5-0-260128/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-5-0-260128/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 505557975..d212aa810 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 @@ -6,6 +6,7 @@ sidebarTitle: "Seedream 5.0 Pro 260628" {/* GENERATED FILE. Generated from router-schemas/byteplus/seedream-5-0-pro-260628.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `byteplus/seedream-5-0-pro-260628`, served by Comfy Router from BytePlus. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/byteplus/seedream-5-0-pro-260628` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/byteplus/seedream-5-0-pro-260628 \ -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-5-0-pro-260628/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-5-0-pro-260628", + { + "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-5-0-pro-260628", { + 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-5-0-pro-260628/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-5-0-pro-260628/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-5-0-pro-260628/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/elevenlabs/eleven-sfx-v2/code.mdx b/development/comfy-router/models/elevenlabs/eleven-sfx-v2/code.mdx index b9f232707..a22fd7339 100644 --- a/development/comfy-router/models/elevenlabs/eleven-sfx-v2/code.mdx +++ b/development/comfy-router/models/elevenlabs/eleven-sfx-v2/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Eleven Sfx V2" {/* GENERATED FILE. Generated from router-schemas/elevenlabs/eleven_sfx_v2.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `elevenlabs/eleven_sfx_v2`, served by Comfy Router from Elevenlabs. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/elevenlabs/eleven_sfx_v2` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/elevenlabs/eleven_sfx_v2 \ -d "{\"duration_seconds\": 5, \"text\": \"A distant rumble of thunder rolling across a valley.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/elevenlabs/eleven_sfx_v2/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( + "elevenlabs/eleven_sfx_v2", + { + "duration_seconds": 5, + "text": "A distant rumble of thunder rolling across a valley.", + }, + ) + 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("elevenlabs/eleven_sfx_v2", { + duration_seconds: 5, + text: "A distant rumble of thunder rolling across a valley.", +}); +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/elevenlabs/eleven_sfx_v2/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"duration_seconds\": 5, \"text\": \"A distant rumble of thunder rolling across a valley.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/elevenlabs/eleven_sfx_v2/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/elevenlabs/eleven_sfx_v2/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/elevenlabs/eleven-v3/code.mdx b/development/comfy-router/models/elevenlabs/eleven-v3/code.mdx index 6464eb9bc..1428559a2 100644 --- a/development/comfy-router/models/elevenlabs/eleven-v3/code.mdx +++ b/development/comfy-router/models/elevenlabs/eleven-v3/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Eleven V3" {/* GENERATED FILE. Generated from router-schemas/elevenlabs/eleven_v3.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `elevenlabs/eleven_v3`, served by Comfy Router from Elevenlabs. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/elevenlabs/eleven_v3` + + ```python Python from comfy_sdk import Comfy @@ -65,6 +68,89 @@ curl https://api.comfy.org/v2/models/elevenlabs/eleven_v3 \ -d "{\"inputs\": [{\"text\":\"Hello from Comfy Router.\",\"voice_id\":\"21m00Tcm4TlvDq8ikWAM\"}]}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/elevenlabs/eleven_v3/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( + "elevenlabs/eleven_v3", + { + "inputs": [ + { + "text": "Hello from Comfy Router.", + "voice_id": "21m00Tcm4TlvDq8ikWAM", + }, + ], + }, + ) + 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("elevenlabs/eleven_v3", { + inputs: [ + { + text: "Hello from Comfy Router.", + voice_id: "21m00Tcm4TlvDq8ikWAM", + }, + ], +}); +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/elevenlabs/eleven_v3/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"inputs\": [{\"text\":\"Hello from Comfy Router.\",\"voice_id\":\"21m00Tcm4TlvDq8ikWAM\"}]}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/elevenlabs/eleven_v3/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/elevenlabs/eleven_v3/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/fal/h3-max-turbo/code.mdx b/development/comfy-router/models/fal/h3-max-turbo/code.mdx index fc06ae25c..53804f898 100644 --- a/development/comfy-router/models/fal/h3-max-turbo/code.mdx +++ b/development/comfy-router/models/fal/h3-max-turbo/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "H3 Max Turbo" {/* GENERATED FILE. Generated from router-schemas/fal/h3-max-turbo.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `fal/h3-max-turbo`, served by Comfy Router from fal. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/fal/h3-max-turbo` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/fal/h3-max-turbo \ -d "{\"duration\": 5, \"prompt\": \"a red fox running through a snowy forest\", \"prompt_expansion_mode\": \"balanced\", \"resolution\": \"480P\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/fal/h3-max-turbo/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( + "fal/h3-max-turbo", + { + "duration": 5, + "prompt": "a red fox running through a snowy forest", + "prompt_expansion_mode": "balanced", + "resolution": "480P", + }, + ) + 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("fal/h3-max-turbo", { + duration: 5, + prompt: "a red fox running through a snowy forest", + prompt_expansion_mode: "balanced", + resolution: "480P", +}); +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/fal/h3-max-turbo/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"duration\": 5, \"prompt\": \"a red fox running through a snowy forest\", \"prompt_expansion_mode\": \"balanced\", \"resolution\": \"480P\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/fal/h3-max-turbo/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/fal/h3-max-turbo/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/fal/h3-max/code.mdx b/development/comfy-router/models/fal/h3-max/code.mdx index 7b6c1c764..a00343bbe 100644 --- a/development/comfy-router/models/fal/h3-max/code.mdx +++ b/development/comfy-router/models/fal/h3-max/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "H3 Max" {/* GENERATED FILE. Generated from router-schemas/fal/h3-max.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `fal/h3-max`, served by Comfy Router from fal. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/fal/h3-max` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/fal/h3-max \ -d "{\"duration\": 5, \"prompt\": \"a red fox running through a snowy forest\", \"prompt_expansion_mode\": \"balanced\", \"resolution\": \"480P\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/fal/h3-max/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( + "fal/h3-max", + { + "duration": 5, + "prompt": "a red fox running through a snowy forest", + "prompt_expansion_mode": "balanced", + "resolution": "480P", + }, + ) + 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("fal/h3-max", { + duration: 5, + prompt: "a red fox running through a snowy forest", + prompt_expansion_mode: "balanced", + resolution: "480P", +}); +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/fal/h3-max/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"duration\": 5, \"prompt\": \"a red fox running through a snowy forest\", \"prompt_expansion_mode\": \"balanced\", \"resolution\": \"480P\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/fal/h3-max/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/fal/h3-max/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/fal/patina/code.mdx b/development/comfy-router/models/fal/patina/code.mdx index 1012a4f75..1ff8c84f5 100644 --- a/development/comfy-router/models/fal/patina/code.mdx +++ b/development/comfy-router/models/fal/patina/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Patina" {/* GENERATED FILE. Generated from router-schemas/fal/patina.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `fal/patina`, served by Comfy Router from fal. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/fal/patina` + + ```python Python from comfy_sdk import Comfy @@ -55,6 +58,79 @@ curl https://api.comfy.org/v2/models/fal/patina \ -d "{\"image_url\": \"https://storage.googleapis.com/falserverless/gallery/patina-blog-hero-render.png\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/fal/patina/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( + "fal/patina", + { + "image_url": "https://storage.googleapis.com/falserverless/gallery/patina-blog-hero-render.png", + }, + ) + 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("fal/patina", { + image_url: "https://storage.googleapis.com/falserverless/gallery/patina-blog-hero-render.png", +}); +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/fal/patina/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"image_url\": \"https://storage.googleapis.com/falserverless/gallery/patina-blog-hero-render.png\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/fal/patina/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/fal/patina/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/freepik/ai-image-upscaler-precision-v2/code.mdx b/development/comfy-router/models/freepik/ai-image-upscaler-precision-v2/code.mdx index 5f001e185..644a216a6 100644 --- a/development/comfy-router/models/freepik/ai-image-upscaler-precision-v2/code.mdx +++ b/development/comfy-router/models/freepik/ai-image-upscaler-precision-v2/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "AI Image Upscaler Precision V2" {/* GENERATED FILE. Generated from router-schemas/freepik/ai-image-upscaler-precision-v2.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `freepik/ai-image-upscaler-precision-v2`, served by Comfy Router from Freepik. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/freepik/ai-image-upscaler-precision-v2` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/freepik/ai-image-upscaler-precision-v2 \ -d "{\"image\": \"https://img.magnific.com/free-photo/light-through-mountains_395237-33.jpg?semt=ais_hybrid&w=740&q=80\", \"scale_factor\": 8}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/freepik/ai-image-upscaler-precision-v2/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( + "freepik/ai-image-upscaler-precision-v2", + { + "image": "https://img.magnific.com/free-photo/light-through-mountains_395237-33.jpg?semt=ais_hybrid&w=740&q=80", + "scale_factor": 8, + }, + ) + 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("freepik/ai-image-upscaler-precision-v2", { + image: "https://img.magnific.com/free-photo/light-through-mountains_395237-33.jpg?semt=ais_hybrid&w=740&q=80", + scale_factor: 8, +}); +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/freepik/ai-image-upscaler-precision-v2/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"image\": \"https://img.magnific.com/free-photo/light-through-mountains_395237-33.jpg?semt=ais_hybrid&w=740&q=80\", \"scale_factor\": 8}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/freepik/ai-image-upscaler-precision-v2/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/freepik/ai-image-upscaler-precision-v2/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/freepik/ai-skin-enhancer-creative/code.mdx b/development/comfy-router/models/freepik/ai-skin-enhancer-creative/code.mdx index 8fe7a6e6a..d2e28d1b8 100644 --- a/development/comfy-router/models/freepik/ai-skin-enhancer-creative/code.mdx +++ b/development/comfy-router/models/freepik/ai-skin-enhancer-creative/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "AI Skin Enhancer Creative" {/* GENERATED FILE. Generated from router-schemas/freepik/ai-skin-enhancer-creative.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `freepik/ai-skin-enhancer-creative`, served by Comfy Router from Freepik. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/freepik/ai-skin-enhancer-creative` + + ```python Python from comfy_sdk import Comfy @@ -55,6 +58,79 @@ curl https://api.comfy.org/v2/models/freepik/ai-skin-enhancer-creative \ -d "{\"image\": \"https://img.magnific.com/free-photo/portrait-woman_395237-33.jpg?w=740&q=80\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/freepik/ai-skin-enhancer-creative/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( + "freepik/ai-skin-enhancer-creative", + { + "image": "https://img.magnific.com/free-photo/portrait-woman_395237-33.jpg?w=740&q=80", + }, + ) + 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("freepik/ai-skin-enhancer-creative", { + image: "https://img.magnific.com/free-photo/portrait-woman_395237-33.jpg?w=740&q=80", +}); +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/freepik/ai-skin-enhancer-creative/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"image\": \"https://img.magnific.com/free-photo/portrait-woman_395237-33.jpg?w=740&q=80\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/freepik/ai-skin-enhancer-creative/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/freepik/ai-skin-enhancer-creative/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/freepik/ai-skin-enhancer-faithful/code.mdx b/development/comfy-router/models/freepik/ai-skin-enhancer-faithful/code.mdx index 794710f03..d91af6078 100644 --- a/development/comfy-router/models/freepik/ai-skin-enhancer-faithful/code.mdx +++ b/development/comfy-router/models/freepik/ai-skin-enhancer-faithful/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "AI Skin Enhancer Faithful" {/* GENERATED FILE. Generated from router-schemas/freepik/ai-skin-enhancer-faithful.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `freepik/ai-skin-enhancer-faithful`, served by Comfy Router from Freepik. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/freepik/ai-skin-enhancer-faithful` + + ```python Python from comfy_sdk import Comfy @@ -55,6 +58,79 @@ curl https://api.comfy.org/v2/models/freepik/ai-skin-enhancer-faithful \ -d "{\"image\": \"https://img.magnific.com/free-photo/portrait-woman_395237-33.jpg?w=740&q=80\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/freepik/ai-skin-enhancer-faithful/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( + "freepik/ai-skin-enhancer-faithful", + { + "image": "https://img.magnific.com/free-photo/portrait-woman_395237-33.jpg?w=740&q=80", + }, + ) + 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("freepik/ai-skin-enhancer-faithful", { + image: "https://img.magnific.com/free-photo/portrait-woman_395237-33.jpg?w=740&q=80", +}); +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/freepik/ai-skin-enhancer-faithful/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"image\": \"https://img.magnific.com/free-photo/portrait-woman_395237-33.jpg?w=740&q=80\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/freepik/ai-skin-enhancer-faithful/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/freepik/ai-skin-enhancer-faithful/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/freepik/ai-skin-enhancer-flexible/code.mdx b/development/comfy-router/models/freepik/ai-skin-enhancer-flexible/code.mdx index 135ba3924..b58db692c 100644 --- a/development/comfy-router/models/freepik/ai-skin-enhancer-flexible/code.mdx +++ b/development/comfy-router/models/freepik/ai-skin-enhancer-flexible/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "AI Skin Enhancer Flexible" {/* GENERATED FILE. Generated from router-schemas/freepik/ai-skin-enhancer-flexible.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `freepik/ai-skin-enhancer-flexible`, served by Comfy Router from Freepik. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/freepik/ai-skin-enhancer-flexible` + + ```python Python from comfy_sdk import Comfy @@ -55,6 +58,79 @@ curl https://api.comfy.org/v2/models/freepik/ai-skin-enhancer-flexible \ -d "{\"image\": \"https://img.magnific.com/free-photo/portrait-woman_395237-33.jpg?w=740&q=80\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/freepik/ai-skin-enhancer-flexible/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( + "freepik/ai-skin-enhancer-flexible", + { + "image": "https://img.magnific.com/free-photo/portrait-woman_395237-33.jpg?w=740&q=80", + }, + ) + 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("freepik/ai-skin-enhancer-flexible", { + image: "https://img.magnific.com/free-photo/portrait-woman_395237-33.jpg?w=740&q=80", +}); +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/freepik/ai-skin-enhancer-flexible/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"image\": \"https://img.magnific.com/free-photo/portrait-woman_395237-33.jpg?w=740&q=80\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/freepik/ai-skin-enhancer-flexible/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/freepik/ai-skin-enhancer-flexible/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 98a2b424f..7fd61d891 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 @@ -6,6 +6,7 @@ sidebarTitle: "Gemini Omni 1.1 Flash" {/* GENERATED FILE. Generated from router-schemas/gemini-interactions/gemini-omni-1.1-flash.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `gemini-interactions/gemini-omni-1.1-flash`, served by Comfy Router from Gemini Interactions. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/gemini-interactions/gemini-omni-1.1-flash` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/gemini-interactions/gemini-omni-1.1-flash \ -d "{\"input\": \"Reply with the single word: ok\", \"stream\": false}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/gemini-interactions/gemini-omni-1.1-flash/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( + "gemini-interactions/gemini-omni-1.1-flash", + { + "input": "Reply with the single word: ok", + "stream": 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("gemini-interactions/gemini-omni-1.1-flash", { + input: "Reply with the single word: ok", + stream: 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/gemini-interactions/gemini-omni-1.1-flash/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"stream\": 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/gemini-interactions/gemini-omni-1.1-flash/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/gemini-interactions/gemini-omni-1.1-flash/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 3cc70c4ae..3eda2ede7 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 @@ -6,6 +6,7 @@ sidebarTitle: "Gemini Omni Flash Preview" {/* GENERATED FILE. Generated from router-schemas/gemini-interactions/gemini-omni-flash-preview.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `gemini-interactions/gemini-omni-flash-preview`, served by Comfy Router from Gemini Interactions. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/gemini-interactions/gemini-omni-flash-preview` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/gemini-interactions/gemini-omni-flash-previ -d "{\"input\": \"Reply with the single word: ok\", \"stream\": false}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/gemini-interactions/gemini-omni-flash-preview/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( + "gemini-interactions/gemini-omni-flash-preview", + { + "input": "Reply with the single word: ok", + "stream": 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("gemini-interactions/gemini-omni-flash-preview", { + input: "Reply with the single word: ok", + stream: 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/gemini-interactions/gemini-omni-flash-preview/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"stream\": 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/gemini-interactions/gemini-omni-flash-preview/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/gemini-interactions/gemini-omni-flash-preview/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/google/gemini-2-5-flash-image/code.mdx b/development/comfy-router/models/google/gemini-2-5-flash-image/code.mdx index 1e2364366..54aad0bd5 100644 --- a/development/comfy-router/models/google/gemini-2-5-flash-image/code.mdx +++ b/development/comfy-router/models/google/gemini-2-5-flash-image/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Gemini 2.5 Flash Image" {/* GENERATED FILE. Generated from router-schemas/vertexai/gemini-2.5-flash-image.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `vertexai/gemini-2.5-flash-image`, served by Comfy Router from Google. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/vertexai/gemini-2.5-flash-image` + + ```python Python from comfy_sdk import Comfy @@ -73,6 +76,97 @@ curl https://api.comfy.org/v2/models/vertexai/gemini-2.5-flash-image \ -d "{\"contents\": [{\"parts\":[{\"text\":\"Describe a robot learning to paint, in two sentences.\"}],\"role\":\"user\"}]}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/vertexai/gemini-2.5-flash-image/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( + "vertexai/gemini-2.5-flash-image", + { + "contents": [ + { + "parts": [ + { + "text": "Describe a robot learning to paint, in two sentences.", + }, + ], + "role": "user", + }, + ], + }, + ) + 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("vertexai/gemini-2.5-flash-image", { + contents: [ + { + parts: [ + { + text: "Describe a robot learning to paint, in two sentences.", + }, + ], + role: "user", + }, + ], +}); +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/vertexai/gemini-2.5-flash-image/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"contents\": [{\"parts\":[{\"text\":\"Describe a robot learning to paint, in two sentences.\"}],\"role\":\"user\"}]}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/vertexai/gemini-2.5-flash-image/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/vertexai/gemini-2.5-flash-image/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/google/gemini-3-1-flash-lite/code.mdx b/development/comfy-router/models/google/gemini-3-1-flash-lite/code.mdx index a0285cd9c..f45aa2f7c 100644 --- a/development/comfy-router/models/google/gemini-3-1-flash-lite/code.mdx +++ b/development/comfy-router/models/google/gemini-3-1-flash-lite/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Gemini 3.1 Flash Lite" {/* GENERATED FILE. Generated from router-schemas/vertexai/gemini-3.1-flash-lite.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `vertexai/gemini-3.1-flash-lite`, served by Comfy Router from Google. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/vertexai/gemini-3.1-flash-lite` + + ```python Python from comfy_sdk import Comfy @@ -73,6 +76,97 @@ curl https://api.comfy.org/v2/models/vertexai/gemini-3.1-flash-lite \ -d "{\"contents\": [{\"parts\":[{\"text\":\"Describe a robot learning to paint, in two sentences.\"}],\"role\":\"user\"}]}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/vertexai/gemini-3.1-flash-lite/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( + "vertexai/gemini-3.1-flash-lite", + { + "contents": [ + { + "parts": [ + { + "text": "Describe a robot learning to paint, in two sentences.", + }, + ], + "role": "user", + }, + ], + }, + ) + 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("vertexai/gemini-3.1-flash-lite", { + contents: [ + { + parts: [ + { + text: "Describe a robot learning to paint, in two sentences.", + }, + ], + role: "user", + }, + ], +}); +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/vertexai/gemini-3.1-flash-lite/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"contents\": [{\"parts\":[{\"text\":\"Describe a robot learning to paint, in two sentences.\"}],\"role\":\"user\"}]}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/vertexai/gemini-3.1-flash-lite/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/vertexai/gemini-3.1-flash-lite/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/google/gemini-3-7-flash/code.mdx b/development/comfy-router/models/google/gemini-3-7-flash/code.mdx index a5c687754..2590d8274 100644 --- a/development/comfy-router/models/google/gemini-3-7-flash/code.mdx +++ b/development/comfy-router/models/google/gemini-3-7-flash/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Gemini 3.7 Flash" {/* GENERATED FILE. Generated from router-schemas/vertexai/gemini-3.7-flash.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `vertexai/gemini-3.7-flash`, served by Comfy Router from Google. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/vertexai/gemini-3.7-flash` + + ```python Python from comfy_sdk import Comfy @@ -73,6 +76,97 @@ curl https://api.comfy.org/v2/models/vertexai/gemini-3.7-flash \ -d "{\"contents\": [{\"parts\":[{\"text\":\"Describe a robot learning to paint, in two sentences.\"}],\"role\":\"user\"}]}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/vertexai/gemini-3.7-flash/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( + "vertexai/gemini-3.7-flash", + { + "contents": [ + { + "parts": [ + { + "text": "Describe a robot learning to paint, in two sentences.", + }, + ], + "role": "user", + }, + ], + }, + ) + 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("vertexai/gemini-3.7-flash", { + contents: [ + { + parts: [ + { + text: "Describe a robot learning to paint, in two sentences.", + }, + ], + role: "user", + }, + ], +}); +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/vertexai/gemini-3.7-flash/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"contents\": [{\"parts\":[{\"text\":\"Describe a robot learning to paint, in two sentences.\"}],\"role\":\"user\"}]}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/vertexai/gemini-3.7-flash/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/vertexai/gemini-3.7-flash/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/google/gemini-3-8-flash/code.mdx b/development/comfy-router/models/google/gemini-3-8-flash/code.mdx index 9bb5b73ae..498da7eef 100644 --- a/development/comfy-router/models/google/gemini-3-8-flash/code.mdx +++ b/development/comfy-router/models/google/gemini-3-8-flash/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Gemini 3.8 Flash" {/* GENERATED FILE. Generated from router-schemas/vertexai/gemini-3.8-flash.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `vertexai/gemini-3.8-flash`, served by Comfy Router from Google. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/vertexai/gemini-3.8-flash` + + ```python Python from comfy_sdk import Comfy @@ -73,6 +76,97 @@ curl https://api.comfy.org/v2/models/vertexai/gemini-3.8-flash \ -d "{\"contents\": [{\"parts\":[{\"text\":\"Describe a robot learning to paint, in two sentences.\"}],\"role\":\"user\"}]}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/vertexai/gemini-3.8-flash/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( + "vertexai/gemini-3.8-flash", + { + "contents": [ + { + "parts": [ + { + "text": "Describe a robot learning to paint, in two sentences.", + }, + ], + "role": "user", + }, + ], + }, + ) + 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("vertexai/gemini-3.8-flash", { + contents: [ + { + parts: [ + { + text: "Describe a robot learning to paint, in two sentences.", + }, + ], + role: "user", + }, + ], +}); +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/vertexai/gemini-3.8-flash/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"contents\": [{\"parts\":[{\"text\":\"Describe a robot learning to paint, in two sentences.\"}],\"role\":\"user\"}]}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/vertexai/gemini-3.8-flash/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/vertexai/gemini-3.8-flash/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/google/gemini/code.mdx b/development/comfy-router/models/google/gemini/code.mdx index a76548658..6f5b6216c 100644 --- a/development/comfy-router/models/google/gemini/code.mdx +++ b/development/comfy-router/models/google/gemini/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Google Gemini" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Google Gemini. Google Gemini is Google's family of multimodal text models, covering fast drafting through deep reasoning across the Flash and Pro tiers. @@ -22,6 +23,8 @@ Pick the model you want to call. The models share one request and response shape **Endpoint:** `POST https://api.comfy.org/v2/models/vertexai/gemini-3.1-pro-preview` + + ```python Python from comfy_sdk import Comfy @@ -86,12 +89,115 @@ curl https://api.comfy.org/v2/models/vertexai/gemini-3.1-pro-preview \ -d "{\"contents\": [{\"role\":\"user\",\"parts\":[{\"text\":\"Describe a single red maple leaf on a white background in one sentence.\"}]}], \"generationConfig\": {\"temperature\":0.7,\"maxOutputTokens\":256}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/vertexai/gemini-3.1-pro-preview/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( + "vertexai/gemini-3.1-pro-preview", + { + "contents": [ + { + "role": "user", + "parts": [ + { + "text": "Describe a single red maple leaf on a white background in one sentence.", + }, + ], + }, + ], + "generationConfig": { + "temperature": 0.7, + "maxOutputTokens": 256, + }, + }, + ) + 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("text:", result["candidates"][0]["content"]["parts"][0]["text"]) +``` + +```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. +type Result = { candidates: { content: { parts: { text: string }[] } }[] }; +const handle = await comfy.models.submit("vertexai/gemini-3.1-pro-preview", { + contents: [ + { + role: "user", + parts: [ + { + text: "Describe a single red maple leaf on a white background in one sentence.", + }, + ], + }, + ], + generationConfig: { + temperature: 0.7, + maxOutputTokens: 256, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("text:", result.data.candidates[0].content.parts[0].text); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/vertexai/gemini-3.1-pro-preview/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"contents\": [{\"role\":\"user\",\"parts\":[{\"text\":\"Describe a single red maple leaf on a white background in one sentence.\"}]}], \"generationConfig\": {\"temperature\":0.7,\"maxOutputTokens\":256}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/vertexai/gemini-3.1-pro-preview/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/vertexai/gemini-3.1-pro-preview/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + **Model ID:** `vertexai/gemini-3.5-flash` **Endpoint:** `POST https://api.comfy.org/v2/models/vertexai/gemini-3.5-flash` + + ```python Python from comfy_sdk import Comfy @@ -156,12 +262,115 @@ curl https://api.comfy.org/v2/models/vertexai/gemini-3.5-flash \ -d "{\"contents\": [{\"role\":\"user\",\"parts\":[{\"text\":\"Describe a single red maple leaf on a white background in one sentence.\"}]}], \"generationConfig\": {\"temperature\":0.7,\"maxOutputTokens\":256}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/vertexai/gemini-3.5-flash/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( + "vertexai/gemini-3.5-flash", + { + "contents": [ + { + "role": "user", + "parts": [ + { + "text": "Describe a single red maple leaf on a white background in one sentence.", + }, + ], + }, + ], + "generationConfig": { + "temperature": 0.7, + "maxOutputTokens": 256, + }, + }, + ) + 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("text:", result["candidates"][0]["content"]["parts"][0]["text"]) +``` + +```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. +type Result = { candidates: { content: { parts: { text: string }[] } }[] }; +const handle = await comfy.models.submit("vertexai/gemini-3.5-flash", { + contents: [ + { + role: "user", + parts: [ + { + text: "Describe a single red maple leaf on a white background in one sentence.", + }, + ], + }, + ], + generationConfig: { + temperature: 0.7, + maxOutputTokens: 256, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("text:", result.data.candidates[0].content.parts[0].text); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/vertexai/gemini-3.5-flash/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"contents\": [{\"role\":\"user\",\"parts\":[{\"text\":\"Describe a single red maple leaf on a white background in one sentence.\"}]}], \"generationConfig\": {\"temperature\":0.7,\"maxOutputTokens\":256}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/vertexai/gemini-3.5-flash/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/vertexai/gemini-3.5-flash/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + **Model ID:** `vertexai/gemini-2.5-pro` **Endpoint:** `POST https://api.comfy.org/v2/models/vertexai/gemini-2.5-pro` + + ```python Python from comfy_sdk import Comfy @@ -226,12 +435,115 @@ curl https://api.comfy.org/v2/models/vertexai/gemini-2.5-pro \ -d "{\"contents\": [{\"role\":\"user\",\"parts\":[{\"text\":\"Describe a single red maple leaf on a white background in one sentence.\"}]}], \"generationConfig\": {\"temperature\":0.7,\"maxOutputTokens\":256}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/vertexai/gemini-2.5-pro/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( + "vertexai/gemini-2.5-pro", + { + "contents": [ + { + "role": "user", + "parts": [ + { + "text": "Describe a single red maple leaf on a white background in one sentence.", + }, + ], + }, + ], + "generationConfig": { + "temperature": 0.7, + "maxOutputTokens": 256, + }, + }, + ) + 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("text:", result["candidates"][0]["content"]["parts"][0]["text"]) +``` + +```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. +type Result = { candidates: { content: { parts: { text: string }[] } }[] }; +const handle = await comfy.models.submit("vertexai/gemini-2.5-pro", { + contents: [ + { + role: "user", + parts: [ + { + text: "Describe a single red maple leaf on a white background in one sentence.", + }, + ], + }, + ], + generationConfig: { + temperature: 0.7, + maxOutputTokens: 256, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("text:", result.data.candidates[0].content.parts[0].text); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/vertexai/gemini-2.5-pro/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"contents\": [{\"role\":\"user\",\"parts\":[{\"text\":\"Describe a single red maple leaf on a white background in one sentence.\"}]}], \"generationConfig\": {\"temperature\":0.7,\"maxOutputTokens\":256}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/vertexai/gemini-2.5-pro/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/vertexai/gemini-2.5-pro/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + **Model ID:** `vertexai/gemini-2.5-flash` **Endpoint:** `POST https://api.comfy.org/v2/models/vertexai/gemini-2.5-flash` + + ```python Python from comfy_sdk import Comfy @@ -297,6 +609,107 @@ curl https://api.comfy.org/v2/models/vertexai/gemini-2.5-flash \ ``` + + + +The same body, sent to `POST https://api.comfy.org/v2/models/vertexai/gemini-2.5-flash/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( + "vertexai/gemini-2.5-flash", + { + "contents": [ + { + "role": "user", + "parts": [ + { + "text": "Describe a single red maple leaf on a white background in one sentence.", + }, + ], + }, + ], + "generationConfig": { + "temperature": 0.7, + "maxOutputTokens": 256, + }, + }, + ) + 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("text:", result["candidates"][0]["content"]["parts"][0]["text"]) +``` + +```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. +type Result = { candidates: { content: { parts: { text: string }[] } }[] }; +const handle = await comfy.models.submit("vertexai/gemini-2.5-flash", { + contents: [ + { + role: "user", + parts: [ + { + text: "Describe a single red maple leaf on a white background in one sentence.", + }, + ], + }, + ], + generationConfig: { + temperature: 0.7, + maxOutputTokens: 256, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("text:", result.data.candidates[0].content.parts[0].text); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/vertexai/gemini-2.5-flash/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"contents\": [{\"role\":\"user\",\"parts\":[{\"text\":\"Describe a single red maple leaf on a white background in one sentence.\"}]}], \"generationConfig\": {\"temperature\":0.7,\"maxOutputTokens\":256}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/vertexai/gemini-2.5-flash/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/vertexai/gemini-2.5-flash/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + + ## Schema 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 8aa55be6c..77de7c348 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 @@ -6,6 +6,7 @@ sidebarTitle: "Imagen 3.0 Fast Generate 001" {/* GENERATED FILE. Generated from router-schemas/vertexai/imagen-3.0-fast-generate-001.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `vertexai/imagen-3.0-fast-generate-001`, served by Comfy Router from Google. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/vertexai/imagen-3.0-fast-generate-001` + + ```python Python from comfy_sdk import Comfy @@ -69,6 +72,93 @@ curl https://api.comfy.org/v2/models/vertexai/imagen-3.0-fast-generate-001 \ -d "{\"instances\": [{\"prompt\":\"A single red maple leaf on a plain white background.\"}], \"parameters\": {\"sampleCount\":1}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/vertexai/imagen-3.0-fast-generate-001/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( + "vertexai/imagen-3.0-fast-generate-001", + { + "instances": [ + { + "prompt": "A single red maple leaf on a plain white background.", + }, + ], + "parameters": { + "sampleCount": 1, + }, + }, + ) + 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("vertexai/imagen-3.0-fast-generate-001", { + instances: [ + { + prompt: "A single red maple leaf on a plain white background.", + }, + ], + parameters: { + sampleCount: 1, + }, +}); +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/vertexai/imagen-3.0-fast-generate-001/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"instances\": [{\"prompt\":\"A single red maple leaf on a plain white background.\"}], \"parameters\": {\"sampleCount\":1}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/vertexai/imagen-3.0-fast-generate-001/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/vertexai/imagen-3.0-fast-generate-001/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 879debf60..47b2aff14 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 @@ -6,6 +6,7 @@ sidebarTitle: "Imagen 3.0 Generate 001" {/* GENERATED FILE. Generated from router-schemas/vertexai/imagen-3.0-generate-001.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `vertexai/imagen-3.0-generate-001`, served by Comfy Router from Google. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/vertexai/imagen-3.0-generate-001` + + ```python Python from comfy_sdk import Comfy @@ -69,6 +72,93 @@ curl https://api.comfy.org/v2/models/vertexai/imagen-3.0-generate-001 \ -d "{\"instances\": [{\"prompt\":\"A single red maple leaf on a plain white background.\"}], \"parameters\": {\"sampleCount\":1}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/vertexai/imagen-3.0-generate-001/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( + "vertexai/imagen-3.0-generate-001", + { + "instances": [ + { + "prompt": "A single red maple leaf on a plain white background.", + }, + ], + "parameters": { + "sampleCount": 1, + }, + }, + ) + 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("vertexai/imagen-3.0-generate-001", { + instances: [ + { + prompt: "A single red maple leaf on a plain white background.", + }, + ], + parameters: { + sampleCount: 1, + }, +}); +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/vertexai/imagen-3.0-generate-001/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"instances\": [{\"prompt\":\"A single red maple leaf on a plain white background.\"}], \"parameters\": {\"sampleCount\":1}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/vertexai/imagen-3.0-generate-001/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/vertexai/imagen-3.0-generate-001/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 8c8f5a9f8..8c06e74e9 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 @@ -6,6 +6,7 @@ sidebarTitle: "Imagen 3.0 Generate 002" {/* GENERATED FILE. Generated from router-schemas/vertexai/imagen-3.0-generate-002.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `vertexai/imagen-3.0-generate-002`, served by Comfy Router from Google. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/vertexai/imagen-3.0-generate-002` + + ```python Python from comfy_sdk import Comfy @@ -69,6 +72,93 @@ curl https://api.comfy.org/v2/models/vertexai/imagen-3.0-generate-002 \ -d "{\"instances\": [{\"prompt\":\"A single red maple leaf on a plain white background.\"}], \"parameters\": {\"sampleCount\":1}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/vertexai/imagen-3.0-generate-002/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( + "vertexai/imagen-3.0-generate-002", + { + "instances": [ + { + "prompt": "A single red maple leaf on a plain white background.", + }, + ], + "parameters": { + "sampleCount": 1, + }, + }, + ) + 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("vertexai/imagen-3.0-generate-002", { + instances: [ + { + prompt: "A single red maple leaf on a plain white background.", + }, + ], + parameters: { + sampleCount: 1, + }, +}); +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/vertexai/imagen-3.0-generate-002/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"instances\": [{\"prompt\":\"A single red maple leaf on a plain white background.\"}], \"parameters\": {\"sampleCount\":1}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/vertexai/imagen-3.0-generate-002/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/vertexai/imagen-3.0-generate-002/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/google/nano-banana-2-lite/code.mdx b/development/comfy-router/models/google/nano-banana-2-lite/code.mdx index 6bd7e0c62..7bbf23a75 100644 --- a/development/comfy-router/models/google/nano-banana-2-lite/code.mdx +++ b/development/comfy-router/models/google/nano-banana-2-lite/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Nano Banana 2 Lite" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Nano Banana 2 Lite. Nano Banana 2 Lite (Gemini 3.1 Flash-Lite Image) is the Flash-Lite tier of Google's Nano Banana image generation family, tuned for lower latency and cost. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/vertexai/gemini-3.1-flash-lite-image` + + ```python Python from comfy_sdk import Comfy @@ -86,6 +89,111 @@ curl https://api.comfy.org/v2/models/vertexai/gemini-3.1-flash-lite-image \ -d "{\"contents\": [{\"role\":\"user\",\"parts\":[{\"text\":\"a single red maple leaf on a plain white background, studio lighting\"}]}], \"generationConfig\": {\"responseModalities\":[\"IMAGE\"],\"imageConfig\":{\"aspectRatio\":\"1:1\"}}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/vertexai/gemini-3.1-flash-lite-image/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( + "vertexai/gemini-3.1-flash-lite-image", + { + "contents": [ + { + "role": "user", + "parts": [ + { + "text": "a single red maple leaf on a plain white background, studio lighting", + }, + ], + }, + ], + "generationConfig": { + "responseModalities": ["IMAGE"], + "imageConfig": { + "aspectRatio": "1:1", + }, + }, + }, + ) + 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("image (base64):", result["candidates"][0]["content"]["parts"][0]["inlineData"]["data"]) +``` + +```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. +type Result = { candidates: { content: { parts: { inlineData: { data: string } }[] } }[] }; +const handle = await comfy.models.submit("vertexai/gemini-3.1-flash-lite-image", { + contents: [ + { + role: "user", + parts: [ + { + text: "a single red maple leaf on a plain white background, studio lighting", + }, + ], + }, + ], + generationConfig: { + responseModalities: ["IMAGE"], + imageConfig: { + aspectRatio: "1:1", + }, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("image (base64):", result.data.candidates[0].content.parts[0].inlineData.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/vertexai/gemini-3.1-flash-lite-image/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"contents\": [{\"role\":\"user\",\"parts\":[{\"text\":\"a single red maple leaf on a plain white background, studio lighting\"}]}], \"generationConfig\": {\"responseModalities\":[\"IMAGE\"],\"imageConfig\":{\"aspectRatio\":\"1:1\"}}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/vertexai/gemini-3.1-flash-lite-image/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/vertexai/gemini-3.1-flash-lite-image/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/google/nano-banana-2/code.mdx b/development/comfy-router/models/google/nano-banana-2/code.mdx index 45949b621..f67283492 100644 --- a/development/comfy-router/models/google/nano-banana-2/code.mdx +++ b/development/comfy-router/models/google/nano-banana-2/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Nano Banana 2" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Nano Banana 2. Nano Banana 2 (Gemini 3.1 Flash Image) generates images from text and edits an input image when one is provided. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/vertexai/gemini-3.1-flash-image` + + ```python Python from comfy_sdk import Comfy @@ -86,6 +89,111 @@ curl https://api.comfy.org/v2/models/vertexai/gemini-3.1-flash-image \ -d "{\"contents\": [{\"role\":\"user\",\"parts\":[{\"text\":\"a single red maple leaf on a plain white background, studio lighting\"}]}], \"generationConfig\": {\"responseModalities\":[\"IMAGE\"],\"imageConfig\":{\"aspectRatio\":\"1:1\"}}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/vertexai/gemini-3.1-flash-image/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( + "vertexai/gemini-3.1-flash-image", + { + "contents": [ + { + "role": "user", + "parts": [ + { + "text": "a single red maple leaf on a plain white background, studio lighting", + }, + ], + }, + ], + "generationConfig": { + "responseModalities": ["IMAGE"], + "imageConfig": { + "aspectRatio": "1:1", + }, + }, + }, + ) + 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("image (base64):", result["candidates"][0]["content"]["parts"][0]["inlineData"]["data"]) +``` + +```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. +type Result = { candidates: { content: { parts: { inlineData: { data: string } }[] } }[] }; +const handle = await comfy.models.submit("vertexai/gemini-3.1-flash-image", { + contents: [ + { + role: "user", + parts: [ + { + text: "a single red maple leaf on a plain white background, studio lighting", + }, + ], + }, + ], + generationConfig: { + responseModalities: ["IMAGE"], + imageConfig: { + aspectRatio: "1:1", + }, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("image (base64):", result.data.candidates[0].content.parts[0].inlineData.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/vertexai/gemini-3.1-flash-image/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"contents\": [{\"role\":\"user\",\"parts\":[{\"text\":\"a single red maple leaf on a plain white background, studio lighting\"}]}], \"generationConfig\": {\"responseModalities\":[\"IMAGE\"],\"imageConfig\":{\"aspectRatio\":\"1:1\"}}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/vertexai/gemini-3.1-flash-image/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/vertexai/gemini-3.1-flash-image/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/google/nano-banana-pro/code.mdx b/development/comfy-router/models/google/nano-banana-pro/code.mdx index ccc0be0f5..d9148897f 100644 --- a/development/comfy-router/models/google/nano-banana-pro/code.mdx +++ b/development/comfy-router/models/google/nano-banana-pro/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Nano Banana Pro" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Nano Banana Pro. Nano Banana Pro (Gemini 3 Pro Image) is the Pro tier of Google's Nano Banana image generation family, aimed at complex scenes and legible text. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/vertexai/gemini-3-pro-image` + + ```python Python from comfy_sdk import Comfy @@ -86,6 +89,111 @@ curl https://api.comfy.org/v2/models/vertexai/gemini-3-pro-image \ -d "{\"contents\": [{\"role\":\"user\",\"parts\":[{\"text\":\"a single red maple leaf on a plain white background, studio lighting\"}]}], \"generationConfig\": {\"responseModalities\":[\"IMAGE\"],\"imageConfig\":{\"aspectRatio\":\"1:1\"}}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/vertexai/gemini-3-pro-image/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( + "vertexai/gemini-3-pro-image", + { + "contents": [ + { + "role": "user", + "parts": [ + { + "text": "a single red maple leaf on a plain white background, studio lighting", + }, + ], + }, + ], + "generationConfig": { + "responseModalities": ["IMAGE"], + "imageConfig": { + "aspectRatio": "1:1", + }, + }, + }, + ) + 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("image (base64):", result["candidates"][0]["content"]["parts"][0]["inlineData"]["data"]) +``` + +```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. +type Result = { candidates: { content: { parts: { inlineData: { data: string } }[] } }[] }; +const handle = await comfy.models.submit("vertexai/gemini-3-pro-image", { + contents: [ + { + role: "user", + parts: [ + { + text: "a single red maple leaf on a plain white background, studio lighting", + }, + ], + }, + ], + generationConfig: { + responseModalities: ["IMAGE"], + imageConfig: { + aspectRatio: "1:1", + }, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("image (base64):", result.data.candidates[0].content.parts[0].inlineData.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/vertexai/gemini-3-pro-image/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"contents\": [{\"role\":\"user\",\"parts\":[{\"text\":\"a single red maple leaf on a plain white background, studio lighting\"}]}], \"generationConfig\": {\"responseModalities\":[\"IMAGE\"],\"imageConfig\":{\"aspectRatio\":\"1:1\"}}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/vertexai/gemini-3-pro-image/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/vertexai/gemini-3-pro-image/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/heygen/starfish/code.mdx b/development/comfy-router/models/heygen/starfish/code.mdx index 811fc8f14..0c7f50d51 100644 --- a/development/comfy-router/models/heygen/starfish/code.mdx +++ b/development/comfy-router/models/heygen/starfish/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Starfish" {/* GENERATED FILE. Generated from router-schemas/heygen/starfish.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `heygen/starfish`, served by Comfy Router from HeyGen. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/heygen/starfish` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/heygen/starfish \ -d "{\"text\": \"This is a billing verification test for HeyGen speech generation.\", \"voice_id\": \"d2f4f24783d04e22ab49ee8fdc3715e0\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/heygen/starfish/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( + "heygen/starfish", + { + "text": "This is a billing verification test for HeyGen speech generation.", + "voice_id": "d2f4f24783d04e22ab49ee8fdc3715e0", + }, + ) + 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("heygen/starfish", { + text: "This is a billing verification test for HeyGen speech generation.", + voice_id: "d2f4f24783d04e22ab49ee8fdc3715e0", +}); +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/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\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/heygen/starfish/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/heygen/starfish/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/ideogram/ideogram-v3/code.mdx b/development/comfy-router/models/ideogram/ideogram-v3/code.mdx index 1ced750c2..c9840356a 100644 --- a/development/comfy-router/models/ideogram/ideogram-v3/code.mdx +++ b/development/comfy-router/models/ideogram/ideogram-v3/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Ideogram V3" {/* GENERATED FILE. Generated from router-schemas/ideogram/ideogram-v3.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `ideogram/ideogram-v3`, served by Comfy Router from Ideogram. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/ideogram/ideogram-v3` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/ideogram/ideogram-v3 \ -d "{\"prompt\": \"A beautiful mountain landscape\", \"rendering_speed\": \"TURBO\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/ideogram/ideogram-v3/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( + "ideogram/ideogram-v3", + { + "prompt": "A beautiful mountain landscape", + "rendering_speed": "TURBO", + }, + ) + 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("ideogram/ideogram-v3", { + prompt: "A beautiful mountain landscape", + rendering_speed: "TURBO", +}); +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/ideogram/ideogram-v3/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"prompt\": \"A beautiful mountain landscape\", \"rendering_speed\": \"TURBO\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/ideogram/ideogram-v3/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/ideogram/ideogram-v3/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/ideogram/ideogram-v4/code.mdx b/development/comfy-router/models/ideogram/ideogram-v4/code.mdx index 6d4dae66d..9a6f05a52 100644 --- a/development/comfy-router/models/ideogram/ideogram-v4/code.mdx +++ b/development/comfy-router/models/ideogram/ideogram-v4/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Ideogram 4.0" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Ideogram 4.0. Ideogram 4.0 is Ideogram's text-to-image model, which renders legible text inside generated images. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/ideogram/ideogram-v4` + + ```python Python from comfy_sdk import Comfy @@ -60,6 +63,85 @@ curl https://api.comfy.org/v2/models/ideogram/ideogram-v4 \ -d "{\"text_prompt\": \"a single red maple leaf on a plain white background, studio lighting\", \"resolution\": \"1024x1024\", \"rendering_speed\": \"DEFAULT\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/ideogram/ideogram-v4/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( + "ideogram/ideogram-v4", + { + "text_prompt": "a single red maple leaf on a plain white background, studio lighting", + "resolution": "1024x1024", + "rendering_speed": "DEFAULT", + }, + ) + 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("image:", result["data"][0]["url"]) +``` + +```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. +type Result = { data: { url: string }[] }; +const handle = await comfy.models.submit("ideogram/ideogram-v4", { + text_prompt: "a single red maple leaf on a plain white background, studio lighting", + resolution: "1024x1024", + rendering_speed: "DEFAULT", +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("image:", result.data.data[0].url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/ideogram/ideogram-v4/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"text_prompt\": \"a single red maple leaf on a plain white background, studio lighting\", \"resolution\": \"1024x1024\", \"rendering_speed\": \"DEFAULT\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/ideogram/ideogram-v4/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/ideogram/ideogram-v4/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/ideogram/p-image-ideogram/code.mdx b/development/comfy-router/models/ideogram/p-image-ideogram/code.mdx index 0b0b0c12e..b951d6bcf 100644 --- a/development/comfy-router/models/ideogram/p-image-ideogram/code.mdx +++ b/development/comfy-router/models/ideogram/p-image-ideogram/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "P Image Ideogram" {/* GENERATED FILE. Generated from router-schemas/ideogram/p-image-ideogram.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `ideogram/p-image-ideogram`, served by Comfy Router from Ideogram. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/ideogram/p-image-ideogram` + + ```python Python from comfy_sdk import Comfy @@ -55,6 +58,79 @@ curl https://api.comfy.org/v2/models/ideogram/p-image-ideogram \ -d "{\"prompt\": \"A beautiful mountain landscape\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/ideogram/p-image-ideogram/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( + "ideogram/p-image-ideogram", + { + "prompt": "A beautiful mountain landscape", + }, + ) + 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("ideogram/p-image-ideogram", { + prompt: "A beautiful mountain landscape", +}); +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/ideogram/p-image-ideogram/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"prompt\": \"A beautiful mountain landscape\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/ideogram/p-image-ideogram/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/ideogram/p-image-ideogram/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/kling/kling-3-0-turbo/code.mdx b/development/comfy-router/models/kling/kling-3-0-turbo/code.mdx index 1d5f9488e..715f74c6d 100644 --- a/development/comfy-router/models/kling/kling-3-0-turbo/code.mdx +++ b/development/comfy-router/models/kling/kling-3-0-turbo/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Kling 3.0 Turbo" {/* GENERATED FILE. Generated from router-schemas/kling/kling-3.0-turbo.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `kling/kling-3.0-turbo`, served by Comfy Router from Kling. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/kling/kling-3.0-turbo` + + ```python Python from comfy_sdk import Comfy @@ -65,6 +68,89 @@ curl https://api.comfy.org/v2/models/kling/kling-3.0-turbo \ -d "{\"prompt\": \"A neon-lit alley in the rain, slow dolly forward.\", \"settings\": {\"aspect_ratio\":\"16:9\",\"duration\":5,\"resolution\":\"1080p\"}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/kling/kling-3.0-turbo/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( + "kling/kling-3.0-turbo", + { + "prompt": "A neon-lit alley in the rain, slow dolly forward.", + "settings": { + "aspect_ratio": "16:9", + "duration": 5, + "resolution": "1080p", + }, + }, + ) + 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("kling/kling-3.0-turbo", { + prompt: "A neon-lit alley in the rain, slow dolly forward.", + settings: { + aspect_ratio: "16:9", + duration: 5, + resolution: "1080p", + }, +}); +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/kling/kling-3.0-turbo/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"prompt\": \"A neon-lit alley in the rain, slow dolly forward.\", \"settings\": {\"aspect_ratio\":\"16:9\",\"duration\":5,\"resolution\":\"1080p\"}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/kling/kling-3.0-turbo/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/kling/kling-3.0-turbo/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/kling/kling-image-o1/code.mdx b/development/comfy-router/models/kling/kling-image-o1/code.mdx index 2f218da9c..00d1a7f86 100644 --- a/development/comfy-router/models/kling/kling-image-o1/code.mdx +++ b/development/comfy-router/models/kling/kling-image-o1/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Kling Image O1" {/* GENERATED FILE. Generated from router-schemas/kling/kling-image-o1.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `kling/kling-image-o1`, served by Comfy Router from Kling. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/kling/kling-image-o1` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/kling/kling-image-o1 \ -d "{\"aspect_ratio\": \"1:1\", \"n\": 1, \"prompt\": \"A watercolour koi pond at dawn, soft light.\", \"resolution\": \"1k\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/kling/kling-image-o1/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( + "kling/kling-image-o1", + { + "aspect_ratio": "1:1", + "n": 1, + "prompt": "A watercolour koi pond at dawn, soft light.", + "resolution": "1k", + }, + ) + 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("kling/kling-image-o1", { + aspect_ratio: "1:1", + n: 1, + prompt: "A watercolour koi pond at dawn, soft light.", + resolution: "1k", +}); +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/kling/kling-image-o1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"1:1\", \"n\": 1, \"prompt\": \"A watercolour koi pond at dawn, soft light.\", \"resolution\": \"1k\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/kling/kling-image-o1/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/kling/kling-image-o1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/kling/kling-v1-5/code.mdx b/development/comfy-router/models/kling/kling-v1-5/code.mdx index c04d77ec6..5386ed921 100644 --- a/development/comfy-router/models/kling/kling-v1-5/code.mdx +++ b/development/comfy-router/models/kling/kling-v1-5/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Kling V1.5" {/* GENERATED FILE. Generated from router-schemas/kling/kling-v1-5.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `kling/kling-v1-5`, served by Comfy Router from Kling. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/kling/kling-v1-5` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/kling/kling-v1-5 \ -d "{\"duration\": \"5\", \"image\": \"https://example.invalid/kling/reference.png\", \"mode\": \"std\", \"prompt\": \"The fox turns its head towards the camera.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/kling/kling-v1-5/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( + "kling/kling-v1-5", + { + "duration": "5", + "image": "https://example.invalid/kling/reference.png", + "mode": "std", + "prompt": "The fox turns its head towards the camera.", + }, + ) + 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("kling/kling-v1-5", { + duration: "5", + image: "https://example.invalid/kling/reference.png", + mode: "std", + prompt: "The fox turns its head towards the camera.", +}); +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/kling/kling-v1-5/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"duration\": \"5\", \"image\": \"https://example.invalid/kling/reference.png\", \"mode\": \"std\", \"prompt\": \"The fox turns its head towards the camera.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/kling/kling-v1-5/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/kling/kling-v1-5/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/kling/kling-v1-6/code.mdx b/development/comfy-router/models/kling/kling-v1-6/code.mdx index 590912127..f5906f594 100644 --- a/development/comfy-router/models/kling/kling-v1-6/code.mdx +++ b/development/comfy-router/models/kling/kling-v1-6/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Kling V1.6" {/* GENERATED FILE. Generated from router-schemas/kling/kling-v1-6.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `kling/kling-v1-6`, served by Comfy Router from Kling. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/kling/kling-v1-6` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/kling/kling-v1-6 \ -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"std\", \"prompt\": \"A red fox trotting through falling snow, cinematic lighting.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/kling/kling-v1-6/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( + "kling/kling-v1-6", + { + "aspect_ratio": "16:9", + "duration": "5", + "mode": "std", + "prompt": "A red fox trotting through falling snow, cinematic lighting.", + }, + ) + 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("kling/kling-v1-6", { + aspect_ratio: "16:9", + duration: "5", + mode: "std", + prompt: "A red fox trotting through falling snow, cinematic lighting.", +}); +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/kling/kling-v1-6/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"std\", \"prompt\": \"A red fox trotting through falling snow, cinematic lighting.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/kling/kling-v1-6/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/kling/kling-v1-6/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/kling/kling-v1/code.mdx b/development/comfy-router/models/kling/kling-v1/code.mdx index 241725780..80650a20d 100644 --- a/development/comfy-router/models/kling/kling-v1/code.mdx +++ b/development/comfy-router/models/kling/kling-v1/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Kling V1" {/* GENERATED FILE. Generated from router-schemas/kling/kling-v1.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `kling/kling-v1`, served by Comfy Router from Kling. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/kling/kling-v1` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/kling/kling-v1 \ -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"std\", \"prompt\": \"A red fox trotting through falling snow, cinematic lighting.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/kling/kling-v1/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( + "kling/kling-v1", + { + "aspect_ratio": "16:9", + "duration": "5", + "mode": "std", + "prompt": "A red fox trotting through falling snow, cinematic lighting.", + }, + ) + 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("kling/kling-v1", { + aspect_ratio: "16:9", + duration: "5", + mode: "std", + prompt: "A red fox trotting through falling snow, cinematic lighting.", +}); +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/kling/kling-v1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"std\", \"prompt\": \"A red fox trotting through falling snow, cinematic lighting.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/kling/kling-v1/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/kling/kling-v1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/kling/kling-v2-1-master/code.mdx b/development/comfy-router/models/kling/kling-v2-1-master/code.mdx index 42343f54f..43cba8c0a 100644 --- a/development/comfy-router/models/kling/kling-v2-1-master/code.mdx +++ b/development/comfy-router/models/kling/kling-v2-1-master/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Kling V2.1 Master" {/* GENERATED FILE. Generated from router-schemas/kling/kling-v2-1-master.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `kling/kling-v2-1-master`, served by Comfy Router from Kling. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/kling/kling-v2-1-master` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/kling/kling-v2-1-master \ -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"std\", \"prompt\": \"A red fox trotting through falling snow, cinematic lighting.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/kling/kling-v2-1-master/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( + "kling/kling-v2-1-master", + { + "aspect_ratio": "16:9", + "duration": "5", + "mode": "std", + "prompt": "A red fox trotting through falling snow, cinematic lighting.", + }, + ) + 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("kling/kling-v2-1-master", { + aspect_ratio: "16:9", + duration: "5", + mode: "std", + prompt: "A red fox trotting through falling snow, cinematic lighting.", +}); +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/kling/kling-v2-1-master/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"std\", \"prompt\": \"A red fox trotting through falling snow, cinematic lighting.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/kling/kling-v2-1-master/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/kling/kling-v2-1-master/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/kling/kling-v2-1/code.mdx b/development/comfy-router/models/kling/kling-v2-1/code.mdx index 223bff325..c6559d6c9 100644 --- a/development/comfy-router/models/kling/kling-v2-1/code.mdx +++ b/development/comfy-router/models/kling/kling-v2-1/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Kling V2.1" {/* GENERATED FILE. Generated from router-schemas/kling/kling-v2-1.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `kling/kling-v2-1`, served by Comfy Router from Kling. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/kling/kling-v2-1` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/kling/kling-v2-1 \ -d "{\"duration\": \"5\", \"image\": \"https://example.invalid/kling/reference.png\", \"mode\": \"std\", \"prompt\": \"The fox turns its head towards the camera.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/kling/kling-v2-1/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( + "kling/kling-v2-1", + { + "duration": "5", + "image": "https://example.invalid/kling/reference.png", + "mode": "std", + "prompt": "The fox turns its head towards the camera.", + }, + ) + 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("kling/kling-v2-1", { + duration: "5", + image: "https://example.invalid/kling/reference.png", + mode: "std", + prompt: "The fox turns its head towards the camera.", +}); +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/kling/kling-v2-1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"duration\": \"5\", \"image\": \"https://example.invalid/kling/reference.png\", \"mode\": \"std\", \"prompt\": \"The fox turns its head towards the camera.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/kling/kling-v2-1/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/kling/kling-v2-1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/kling/kling-v2-5-turbo/code.mdx b/development/comfy-router/models/kling/kling-v2-5-turbo/code.mdx index e1e674cdb..3f2260ca0 100644 --- a/development/comfy-router/models/kling/kling-v2-5-turbo/code.mdx +++ b/development/comfy-router/models/kling/kling-v2-5-turbo/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Kling V2.5 Turbo" {/* GENERATED FILE. Generated from router-schemas/kling/kling-v2-5-turbo.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `kling/kling-v2-5-turbo`, served by Comfy Router from Kling. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/kling/kling-v2-5-turbo` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/kling/kling-v2-5-turbo \ -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"std\", \"prompt\": \"A red fox trotting through falling snow, cinematic lighting.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/kling/kling-v2-5-turbo/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( + "kling/kling-v2-5-turbo", + { + "aspect_ratio": "16:9", + "duration": "5", + "mode": "std", + "prompt": "A red fox trotting through falling snow, cinematic lighting.", + }, + ) + 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("kling/kling-v2-5-turbo", { + aspect_ratio: "16:9", + duration: "5", + mode: "std", + prompt: "A red fox trotting through falling snow, cinematic lighting.", +}); +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/kling/kling-v2-5-turbo/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"std\", \"prompt\": \"A red fox trotting through falling snow, cinematic lighting.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/kling/kling-v2-5-turbo/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/kling/kling-v2-5-turbo/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/kling/kling-v2-6/code.mdx b/development/comfy-router/models/kling/kling-v2-6/code.mdx index 9d899b603..d64ce2e72 100644 --- a/development/comfy-router/models/kling/kling-v2-6/code.mdx +++ b/development/comfy-router/models/kling/kling-v2-6/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Kling V2.6" {/* GENERATED FILE. Generated from router-schemas/kling/kling-v2-6.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `kling/kling-v2-6`, served by Comfy Router from Kling. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/kling/kling-v2-6` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/kling/kling-v2-6 \ -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"std\", \"prompt\": \"A red fox trotting through falling snow, cinematic lighting.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/kling/kling-v2-6/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( + "kling/kling-v2-6", + { + "aspect_ratio": "16:9", + "duration": "5", + "mode": "std", + "prompt": "A red fox trotting through falling snow, cinematic lighting.", + }, + ) + 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("kling/kling-v2-6", { + aspect_ratio: "16:9", + duration: "5", + mode: "std", + prompt: "A red fox trotting through falling snow, cinematic lighting.", +}); +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/kling/kling-v2-6/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"std\", \"prompt\": \"A red fox trotting through falling snow, cinematic lighting.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/kling/kling-v2-6/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/kling/kling-v2-6/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/kling/kling-v2-master/code.mdx b/development/comfy-router/models/kling/kling-v2-master/code.mdx index 921d4262c..ce9ddd5ba 100644 --- a/development/comfy-router/models/kling/kling-v2-master/code.mdx +++ b/development/comfy-router/models/kling/kling-v2-master/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Kling V2 Master" {/* GENERATED FILE. Generated from router-schemas/kling/kling-v2-master.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `kling/kling-v2-master`, served by Comfy Router from Kling. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/kling/kling-v2-master` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/kling/kling-v2-master \ -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"std\", \"prompt\": \"A red fox trotting through falling snow, cinematic lighting.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/kling/kling-v2-master/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( + "kling/kling-v2-master", + { + "aspect_ratio": "16:9", + "duration": "5", + "mode": "std", + "prompt": "A red fox trotting through falling snow, cinematic lighting.", + }, + ) + 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("kling/kling-v2-master", { + aspect_ratio: "16:9", + duration: "5", + mode: "std", + prompt: "A red fox trotting through falling snow, cinematic lighting.", +}); +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/kling/kling-v2-master/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"std\", \"prompt\": \"A red fox trotting through falling snow, cinematic lighting.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/kling/kling-v2-master/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/kling/kling-v2-master/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/kling/kling-v3-omni/code.mdx b/development/comfy-router/models/kling/kling-v3-omni/code.mdx index f696ce24c..d821dd2db 100644 --- a/development/comfy-router/models/kling/kling-v3-omni/code.mdx +++ b/development/comfy-router/models/kling/kling-v3-omni/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Kling V3 Omni" {/* GENERATED FILE. Generated from router-schemas/kling/kling-v3-omni.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `kling/kling-v3-omni`, served by Comfy Router from Kling. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/kling/kling-v3-omni` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/kling/kling-v3-omni \ -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"pro\", \"prompt\": \"A paper boat drifting down a rain-soaked street at dusk.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/kling/kling-v3-omni/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( + "kling/kling-v3-omni", + { + "aspect_ratio": "16:9", + "duration": "5", + "mode": "pro", + "prompt": "A paper boat drifting down a rain-soaked street at dusk.", + }, + ) + 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("kling/kling-v3-omni", { + aspect_ratio: "16:9", + duration: "5", + mode: "pro", + prompt: "A paper boat drifting down a rain-soaked street at dusk.", +}); +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/kling/kling-v3-omni/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"pro\", \"prompt\": \"A paper boat drifting down a rain-soaked street at dusk.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/kling/kling-v3-omni/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/kling/kling-v3-omni/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/kling/kling-v3/code.mdx b/development/comfy-router/models/kling/kling-v3/code.mdx index 4b40699d6..da365d48d 100644 --- a/development/comfy-router/models/kling/kling-v3/code.mdx +++ b/development/comfy-router/models/kling/kling-v3/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Kling V3" {/* GENERATED FILE. Generated from router-schemas/kling/kling-v3.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `kling/kling-v3`, served by Comfy Router from Kling. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/kling/kling-v3` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/kling/kling-v3 \ -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"std\", \"prompt\": \"A red fox trotting through falling snow, cinematic lighting.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/kling/kling-v3/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( + "kling/kling-v3", + { + "aspect_ratio": "16:9", + "duration": "5", + "mode": "std", + "prompt": "A red fox trotting through falling snow, cinematic lighting.", + }, + ) + 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("kling/kling-v3", { + aspect_ratio: "16:9", + duration: "5", + mode: "std", + prompt: "A red fox trotting through falling snow, cinematic lighting.", +}); +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/kling/kling-v3/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"std\", \"prompt\": \"A red fox trotting through falling snow, cinematic lighting.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/kling/kling-v3/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/kling/kling-v3/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/kling/kling-video-o1/code.mdx b/development/comfy-router/models/kling/kling-video-o1/code.mdx index c2a69459b..7b5463de9 100644 --- a/development/comfy-router/models/kling/kling-video-o1/code.mdx +++ b/development/comfy-router/models/kling/kling-video-o1/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Kling Video O1" {/* GENERATED FILE. Generated from router-schemas/kling/kling-video-o1.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `kling/kling-video-o1`, served by Comfy Router from Kling. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/kling/kling-video-o1` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/kling/kling-video-o1 \ -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"pro\", \"prompt\": \"A paper boat drifting down a rain-soaked street at dusk.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/kling/kling-video-o1/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( + "kling/kling-video-o1", + { + "aspect_ratio": "16:9", + "duration": "5", + "mode": "pro", + "prompt": "A paper boat drifting down a rain-soaked street at dusk.", + }, + ) + 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("kling/kling-video-o1", { + aspect_ratio: "16:9", + duration: "5", + mode: "pro", + prompt: "A paper boat drifting down a rain-soaked street at dusk.", +}); +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/kling/kling-video-o1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5\", \"mode\": \"pro\", \"prompt\": \"A paper boat drifting down a rain-soaked street at dusk.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/kling/kling-video-o1/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/kling/kling-video-o1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/kling/videos-avatar-image2video/code.mdx b/development/comfy-router/models/kling/videos-avatar-image2video/code.mdx index 6c9a419f7..60956e635 100644 --- a/development/comfy-router/models/kling/videos-avatar-image2video/code.mdx +++ b/development/comfy-router/models/kling/videos-avatar-image2video/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Videos Avatar Image 2video" {/* GENERATED FILE. Generated from router-schemas/kling/videos-avatar-image2video.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `kling/videos-avatar-image2video`, served by Comfy Router from Kling. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/kling/videos-avatar-image2video` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/kling/videos-avatar-image2video \ -d "{\"image\": \"https://example.invalid/kling/avatar.png\", \"mode\": \"std\", \"prompt\": \"The presenter smiles and gestures towards the camera.\", \"sound_file\": \"https://example.invalid/kling/voice.mp3\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/kling/videos-avatar-image2video/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( + "kling/videos-avatar-image2video", + { + "image": "https://example.invalid/kling/avatar.png", + "mode": "std", + "prompt": "The presenter smiles and gestures towards the camera.", + "sound_file": "https://example.invalid/kling/voice.mp3", + }, + ) + 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("kling/videos-avatar-image2video", { + image: "https://example.invalid/kling/avatar.png", + mode: "std", + prompt: "The presenter smiles and gestures towards the camera.", + sound_file: "https://example.invalid/kling/voice.mp3", +}); +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/kling/videos-avatar-image2video/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"image\": \"https://example.invalid/kling/avatar.png\", \"mode\": \"std\", \"prompt\": \"The presenter smiles and gestures towards the camera.\", \"sound_file\": \"https://example.invalid/kling/voice.mp3\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/kling/videos-avatar-image2video/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/kling/videos-avatar-image2video/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/kling/videos-lip-sync/code.mdx b/development/comfy-router/models/kling/videos-lip-sync/code.mdx index 954b21a65..c1ccc2427 100644 --- a/development/comfy-router/models/kling/videos-lip-sync/code.mdx +++ b/development/comfy-router/models/kling/videos-lip-sync/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Videos Lip Sync" {/* GENERATED FILE. Generated from router-schemas/kling/videos-lip-sync.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `kling/videos-lip-sync`, served by Comfy Router from Kling. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/kling/videos-lip-sync` + + ```python Python from comfy_sdk import Comfy @@ -69,6 +72,93 @@ curl https://api.comfy.org/v2/models/kling/videos-lip-sync \ -d "{\"input\": {\"mode\":\"text2video\",\"text\":\"Welcome to Comfy Cloud.\",\"video_id\":\"kling-video-6f5e4d3c2b1a\",\"voice_id\":\"genshin_vindi2\",\"voice_language\":\"en\",\"voice_speed\":1}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/kling/videos-lip-sync/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( + "kling/videos-lip-sync", + { + "input": { + "mode": "text2video", + "text": "Welcome to Comfy Cloud.", + "video_id": "kling-video-6f5e4d3c2b1a", + "voice_id": "genshin_vindi2", + "voice_language": "en", + "voice_speed": 1, + }, + }, + ) + 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("kling/videos-lip-sync", { + input: { + mode: "text2video", + text: "Welcome to Comfy Cloud.", + video_id: "kling-video-6f5e4d3c2b1a", + voice_id: "genshin_vindi2", + voice_language: "en", + voice_speed: 1, + }, +}); +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/kling/videos-lip-sync/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"mode\":\"text2video\",\"text\":\"Welcome to Comfy Cloud.\",\"video_id\":\"kling-video-6f5e4d3c2b1a\",\"voice_id\":\"genshin_vindi2\",\"voice_language\":\"en\",\"voice_speed\":1}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/kling/videos-lip-sync/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/kling/videos-lip-sync/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/kling/videos-video-extend/code.mdx b/development/comfy-router/models/kling/videos-video-extend/code.mdx index caf321bf3..e3eae206c 100644 --- a/development/comfy-router/models/kling/videos-video-extend/code.mdx +++ b/development/comfy-router/models/kling/videos-video-extend/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Videos Video Extend" {/* GENERATED FILE. Generated from router-schemas/kling/videos-video-extend.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `kling/videos-video-extend`, served by Comfy Router from Kling. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/kling/videos-video-extend` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/kling/videos-video-extend \ -d "{\"cfg_scale\": 0.5, \"prompt\": \"The camera keeps drifting forward down the alley.\", \"video_id\": \"kling-video-6f5e4d3c2b1a\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/kling/videos-video-extend/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( + "kling/videos-video-extend", + { + "cfg_scale": 0.5, + "prompt": "The camera keeps drifting forward down the alley.", + "video_id": "kling-video-6f5e4d3c2b1a", + }, + ) + 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("kling/videos-video-extend", { + cfg_scale: 0.5, + prompt: "The camera keeps drifting forward down the alley.", + video_id: "kling-video-6f5e4d3c2b1a", +}); +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/kling/videos-video-extend/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"cfg_scale\": 0.5, \"prompt\": \"The camera keeps drifting forward down the alley.\", \"video_id\": \"kling-video-6f5e4d3c2b1a\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/kling/videos-video-extend/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/kling/videos-video-extend/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/krea/krea-2-large/code.mdx b/development/comfy-router/models/krea/krea-2-large/code.mdx index 5e194de8c..51271ed43 100644 --- a/development/comfy-router/models/krea/krea-2-large/code.mdx +++ b/development/comfy-router/models/krea/krea-2-large/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Krea 2 Large" {/* GENERATED FILE. Generated from router-schemas/krea/krea-2-large.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `krea/krea-2-large`, served by Comfy Router from Krea. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/krea/krea-2-large` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/krea/krea-2-large \ -d "{\"aspect_ratio\": \"1:1\", \"prompt\": \"a red circle\", \"resolution\": \"1K\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/krea/krea-2-large/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( + "krea/krea-2-large", + { + "aspect_ratio": "1:1", + "prompt": "a red circle", + "resolution": "1K", + }, + ) + 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("krea/krea-2-large", { + aspect_ratio: "1:1", + prompt: "a red circle", + resolution: "1K", +}); +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/krea/krea-2-large/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"1:1\", \"prompt\": \"a red circle\", \"resolution\": \"1K\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/krea/krea-2-large/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/krea/krea-2-large/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/krea/krea-2-medium-turbo/code.mdx b/development/comfy-router/models/krea/krea-2-medium-turbo/code.mdx index 1899c1964..31b5ffc2a 100644 --- a/development/comfy-router/models/krea/krea-2-medium-turbo/code.mdx +++ b/development/comfy-router/models/krea/krea-2-medium-turbo/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Krea 2 Medium Turbo" {/* GENERATED FILE. Generated from router-schemas/krea/krea-2-medium-turbo.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `krea/krea-2-medium-turbo`, served by Comfy Router from Krea. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/krea/krea-2-medium-turbo` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/krea/krea-2-medium-turbo \ -d "{\"aspect_ratio\": \"1:1\", \"prompt\": \"a red circle\", \"resolution\": \"1K\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/krea/krea-2-medium-turbo/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( + "krea/krea-2-medium-turbo", + { + "aspect_ratio": "1:1", + "prompt": "a red circle", + "resolution": "1K", + }, + ) + 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("krea/krea-2-medium-turbo", { + aspect_ratio: "1:1", + prompt: "a red circle", + resolution: "1K", +}); +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/krea/krea-2-medium-turbo/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"1:1\", \"prompt\": \"a red circle\", \"resolution\": \"1K\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/krea/krea-2-medium-turbo/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/krea/krea-2-medium-turbo/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/krea/krea-2-medium/code.mdx b/development/comfy-router/models/krea/krea-2-medium/code.mdx index a771f1d22..ebc011158 100644 --- a/development/comfy-router/models/krea/krea-2-medium/code.mdx +++ b/development/comfy-router/models/krea/krea-2-medium/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Krea 2 Medium" {/* GENERATED FILE. Generated from router-schemas/krea/krea-2-medium.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `krea/krea-2-medium`, served by Comfy Router from Krea. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/krea/krea-2-medium` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/krea/krea-2-medium \ -d "{\"aspect_ratio\": \"1:1\", \"prompt\": \"a red circle\", \"resolution\": \"1K\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/krea/krea-2-medium/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( + "krea/krea-2-medium", + { + "aspect_ratio": "1:1", + "prompt": "a red circle", + "resolution": "1K", + }, + ) + 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("krea/krea-2-medium", { + aspect_ratio: "1:1", + prompt: "a red circle", + resolution: "1K", +}); +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/krea/krea-2-medium/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"1:1\", \"prompt\": \"a red circle\", \"resolution\": \"1K\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/krea/krea-2-medium/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/krea/krea-2-medium/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/krea/krea-2/code.mdx b/development/comfy-router/models/krea/krea-2/code.mdx index 61951680e..89c8cbaec 100644 --- a/development/comfy-router/models/krea/krea-2/code.mdx +++ b/development/comfy-router/models/krea/krea-2/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Krea 2" {/* GENERATED FILE. Generated from router-schemas/krea/krea-2.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `krea/krea-2`, served by Comfy Router from Krea. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/krea/krea-2` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/krea/krea-2 \ -d "{\"aspect_ratio\": \"1:1\", \"prompt\": \"a red circle\", \"resolution\": \"1K\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/krea/krea-2/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( + "krea/krea-2", + { + "aspect_ratio": "1:1", + "prompt": "a red circle", + "resolution": "1K", + }, + ) + 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("krea/krea-2", { + aspect_ratio: "1:1", + prompt: "a red circle", + resolution: "1K", +}); +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/krea/krea-2/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"1:1\", \"prompt\": \"a red circle\", \"resolution\": \"1K\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/krea/krea-2/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/krea/krea-2/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/ltx/ltx-2-5-fast/code.mdx b/development/comfy-router/models/ltx/ltx-2-5-fast/code.mdx index df0d34f2a..aff2d4263 100644 --- a/development/comfy-router/models/ltx/ltx-2-5-fast/code.mdx +++ b/development/comfy-router/models/ltx/ltx-2-5-fast/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "LTX 2.5 Fast" {/* GENERATED FILE. Generated from router-schemas/ltx/ltx-2-5-fast.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `ltx/ltx-2-5-fast`, served by Comfy Router from LTX. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/ltx/ltx-2-5-fast` + + ```python Python from comfy_sdk import Comfy @@ -63,6 +66,87 @@ curl https://api.comfy.org/v2/models/ltx/ltx-2-5-fast \ -d "{\"duration\": 2, \"fps\": 24, \"generate_audio\": false, \"prompt\": \"A single red maple leaf resting on a plain white background.\", \"resolution\": \"1280x720\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/ltx/ltx-2-5-fast/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( + "ltx/ltx-2-5-fast", + { + "duration": 2, + "fps": 24, + "generate_audio": False, + "prompt": "A single red maple leaf resting on a plain white background.", + "resolution": "1280x720", + }, + ) + 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("ltx/ltx-2-5-fast", { + duration: 2, + fps: 24, + generate_audio: false, + prompt: "A single red maple leaf resting on a plain white background.", + resolution: "1280x720", +}); +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/ltx/ltx-2-5-fast/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"duration\": 2, \"fps\": 24, \"generate_audio\": false, \"prompt\": \"A single red maple leaf resting on a plain white background.\", \"resolution\": \"1280x720\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/ltx/ltx-2-5-fast/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/ltx/ltx-2-5-fast/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/ltx/ltx-2-5-pro/code.mdx b/development/comfy-router/models/ltx/ltx-2-5-pro/code.mdx index 0e66fbbed..0a2adf0a3 100644 --- a/development/comfy-router/models/ltx/ltx-2-5-pro/code.mdx +++ b/development/comfy-router/models/ltx/ltx-2-5-pro/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "LTX 2.5 Pro" {/* GENERATED FILE. Generated from router-schemas/ltx/ltx-2-5-pro.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `ltx/ltx-2-5-pro`, served by Comfy Router from LTX. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/ltx/ltx-2-5-pro` + + ```python Python from comfy_sdk import Comfy @@ -63,6 +66,87 @@ curl https://api.comfy.org/v2/models/ltx/ltx-2-5-pro \ -d "{\"duration\": 2, \"fps\": 24, \"generate_audio\": false, \"prompt\": \"A single red maple leaf resting on a plain white background.\", \"resolution\": \"1280x720\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/ltx/ltx-2-5-pro/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( + "ltx/ltx-2-5-pro", + { + "duration": 2, + "fps": 24, + "generate_audio": False, + "prompt": "A single red maple leaf resting on a plain white background.", + "resolution": "1280x720", + }, + ) + 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("ltx/ltx-2-5-pro", { + duration: 2, + fps: 24, + generate_audio: false, + prompt: "A single red maple leaf resting on a plain white background.", + resolution: "1280x720", +}); +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/ltx/ltx-2-5-pro/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"duration\": 2, \"fps\": 24, \"generate_audio\": false, \"prompt\": \"A single red maple leaf resting on a plain white background.\", \"resolution\": \"1280x720\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/ltx/ltx-2-5-pro/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/ltx/ltx-2-5-pro/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/luma/photon-1/code.mdx b/development/comfy-router/models/luma/photon-1/code.mdx index b39c3c1b7..a0d55a971 100644 --- a/development/comfy-router/models/luma/photon-1/code.mdx +++ b/development/comfy-router/models/luma/photon-1/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Photon 1" {/* GENERATED FILE. Generated from router-schemas/luma/photon-1.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `luma/photon-1`, served by Comfy Router from Luma. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/luma/photon-1` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/luma/photon-1 \ -d "{\"aspect_ratio\": \"1:1\", \"prompt\": \"a red circle on a plain white background\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/luma/photon-1/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( + "luma/photon-1", + { + "aspect_ratio": "1:1", + "prompt": "a red circle on a plain white background", + }, + ) + 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("luma/photon-1", { + aspect_ratio: "1:1", + prompt: "a red circle on a plain white background", +}); +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/luma/photon-1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"1:1\", \"prompt\": \"a red circle on a plain white background\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/luma/photon-1/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/luma/photon-1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/luma/photon-flash-1/code.mdx b/development/comfy-router/models/luma/photon-flash-1/code.mdx index df4868ba5..d5d176eac 100644 --- a/development/comfy-router/models/luma/photon-flash-1/code.mdx +++ b/development/comfy-router/models/luma/photon-flash-1/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Photon Flash 1" {/* GENERATED FILE. Generated from router-schemas/luma/photon-flash-1.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `luma/photon-flash-1`, served by Comfy Router from Luma. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/luma/photon-flash-1` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/luma/photon-flash-1 \ -d "{\"aspect_ratio\": \"1:1\", \"prompt\": \"a red circle on a plain white background\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/luma/photon-flash-1/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( + "luma/photon-flash-1", + { + "aspect_ratio": "1:1", + "prompt": "a red circle on a plain white background", + }, + ) + 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("luma/photon-flash-1", { + aspect_ratio: "1:1", + prompt: "a red circle on a plain white background", +}); +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/luma/photon-flash-1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"1:1\", \"prompt\": \"a red circle on a plain white background\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/luma/photon-flash-1/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/luma/photon-flash-1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/luma/ray-2/code.mdx b/development/comfy-router/models/luma/ray-2/code.mdx index 47c2f63b7..8635b470c 100644 --- a/development/comfy-router/models/luma/ray-2/code.mdx +++ b/development/comfy-router/models/luma/ray-2/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Ray 2" {/* GENERATED FILE. Generated from router-schemas/luma/ray-2.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `luma/ray-2`, served by Comfy Router from Luma. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/luma/ray-2` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/luma/ray-2 \ -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5s\", \"prompt\": \"a single red maple leaf resting on a plain white background\", \"resolution\": \"540p\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/luma/ray-2/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( + "luma/ray-2", + { + "aspect_ratio": "16:9", + "duration": "5s", + "prompt": "a single red maple leaf resting on a plain white background", + "resolution": "540p", + }, + ) + 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("luma/ray-2", { + aspect_ratio: "16:9", + duration: "5s", + prompt: "a single red maple leaf resting on a plain white background", + resolution: "540p", +}); +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/luma/ray-2/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5s\", \"prompt\": \"a single red maple leaf resting on a plain white background\", \"resolution\": \"540p\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/luma/ray-2/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/luma/ray-2/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/luma/ray-flash-2/code.mdx b/development/comfy-router/models/luma/ray-flash-2/code.mdx index cf86c6966..1a2739dea 100644 --- a/development/comfy-router/models/luma/ray-flash-2/code.mdx +++ b/development/comfy-router/models/luma/ray-flash-2/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Ray Flash 2" {/* GENERATED FILE. Generated from router-schemas/luma/ray-flash-2.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `luma/ray-flash-2`, served by Comfy Router from Luma. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/luma/ray-flash-2` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/luma/ray-flash-2 \ -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5s\", \"prompt\": \"a single red maple leaf resting on a plain white background\", \"resolution\": \"540p\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/luma/ray-flash-2/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( + "luma/ray-flash-2", + { + "aspect_ratio": "16:9", + "duration": "5s", + "prompt": "a single red maple leaf resting on a plain white background", + "resolution": "540p", + }, + ) + 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("luma/ray-flash-2", { + aspect_ratio: "16:9", + duration: "5s", + prompt: "a single red maple leaf resting on a plain white background", + resolution: "540p", +}); +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/luma/ray-flash-2/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"aspect_ratio\": \"16:9\", \"duration\": \"5s\", \"prompt\": \"a single red maple leaf resting on a plain white background\", \"resolution\": \"540p\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/luma/ray-flash-2/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/luma/ray-flash-2/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/luma_2/uni-1-max/code.mdx b/development/comfy-router/models/luma_2/uni-1-max/code.mdx index 17ba6f3b4..2dbadfbc6 100644 --- a/development/comfy-router/models/luma_2/uni-1-max/code.mdx +++ b/development/comfy-router/models/luma_2/uni-1-max/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Uni 1 Max" {/* GENERATED FILE. Generated from router-schemas/luma_2/uni-1-max.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `luma_2/uni-1-max`, served by Comfy Router from Luma 2. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/luma_2/uni-1-max` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/luma_2/uni-1-max \ -d "{\"prompt\": \"a red circle on a plain white background\", \"type\": \"image\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/luma_2/uni-1-max/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( + "luma_2/uni-1-max", + { + "prompt": "a red circle on a plain white background", + "type": "image", + }, + ) + 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("luma_2/uni-1-max", { + prompt: "a red circle on a plain white background", + type: "image", +}); +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/luma_2/uni-1-max/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"prompt\": \"a red circle on a plain white background\", \"type\": \"image\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/luma_2/uni-1-max/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/luma_2/uni-1-max/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/luma_2/uni-1/code.mdx b/development/comfy-router/models/luma_2/uni-1/code.mdx index b29550cbd..dec21bd50 100644 --- a/development/comfy-router/models/luma_2/uni-1/code.mdx +++ b/development/comfy-router/models/luma_2/uni-1/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Uni 1" {/* GENERATED FILE. Generated from router-schemas/luma_2/uni-1.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `luma_2/uni-1`, served by Comfy Router from Luma 2. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/luma_2/uni-1` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/luma_2/uni-1 \ -d "{\"prompt\": \"a red circle on a plain white background\", \"type\": \"image\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/luma_2/uni-1/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( + "luma_2/uni-1", + { + "prompt": "a red circle on a plain white background", + "type": "image", + }, + ) + 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("luma_2/uni-1", { + prompt: "a red circle on a plain white background", + type: "image", +}); +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/luma_2/uni-1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"prompt\": \"a red circle on a plain white background\", \"type\": \"image\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/luma_2/uni-1/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/luma_2/uni-1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/meshy/animations/code.mdx b/development/comfy-router/models/meshy/animations/code.mdx index b09bc4496..f1295dcc1 100644 --- a/development/comfy-router/models/meshy/animations/code.mdx +++ b/development/comfy-router/models/meshy/animations/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Animations" {/* GENERATED FILE. Generated from router-schemas/meshy/animations.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `meshy/animations`, served by Comfy Router from Meshy. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/meshy/animations` + + ```python Python from comfy_sdk import Comfy @@ -65,6 +68,89 @@ curl https://api.comfy.org/v2/models/meshy/animations \ -d "{\"action_id\": 92, \"post_process\": {\"fps\":60,\"operation_type\":\"change_fps\"}, \"rig_task_id\": \"0193abcd-0000-0000-0000-000000000000\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/meshy/animations/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( + "meshy/animations", + { + "action_id": 92, + "post_process": { + "fps": 60, + "operation_type": "change_fps", + }, + "rig_task_id": "0193abcd-0000-0000-0000-000000000000", + }, + ) + 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("meshy/animations", { + action_id: 92, + post_process: { + fps: 60, + operation_type: "change_fps", + }, + rig_task_id: "0193abcd-0000-0000-0000-000000000000", +}); +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/meshy/animations/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"action_id\": 92, \"post_process\": {\"fps\":60,\"operation_type\":\"change_fps\"}, \"rig_task_id\": \"0193abcd-0000-0000-0000-000000000000\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/meshy/animations/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/meshy/animations/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/meshy/meshy-5/code.mdx b/development/comfy-router/models/meshy/meshy-5/code.mdx index 8b214eae3..db63f113e 100644 --- a/development/comfy-router/models/meshy/meshy-5/code.mdx +++ b/development/comfy-router/models/meshy/meshy-5/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Meshy 5" {/* GENERATED FILE. Generated from router-schemas/meshy/meshy-5.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `meshy/meshy-5`, served by Comfy Router from Meshy. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/meshy/meshy-5` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/meshy/meshy-5 \ -d "{\"art_style\": \"realistic\", \"mode\": \"preview\", \"prompt\": \"a red cube\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/meshy/meshy-5/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( + "meshy/meshy-5", + { + "art_style": "realistic", + "mode": "preview", + "prompt": "a red cube", + }, + ) + 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("meshy/meshy-5", { + art_style: "realistic", + mode: "preview", + prompt: "a red cube", +}); +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/meshy/meshy-5/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"art_style\": \"realistic\", \"mode\": \"preview\", \"prompt\": \"a red cube\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/meshy/meshy-5/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/meshy/meshy-5/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/meshy/meshy-6/code.mdx b/development/comfy-router/models/meshy/meshy-6/code.mdx index 5330d2760..46aedff71 100644 --- a/development/comfy-router/models/meshy/meshy-6/code.mdx +++ b/development/comfy-router/models/meshy/meshy-6/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Meshy 6" {/* GENERATED FILE. Generated from router-schemas/meshy/meshy-6.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `meshy/meshy-6`, served by Comfy Router from Meshy. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/meshy/meshy-6` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/meshy/meshy-6 \ -d "{\"art_style\": \"realistic\", \"mode\": \"preview\", \"prompt\": \"a red cube\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/meshy/meshy-6/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( + "meshy/meshy-6", + { + "art_style": "realistic", + "mode": "preview", + "prompt": "a red cube", + }, + ) + 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("meshy/meshy-6", { + art_style: "realistic", + mode: "preview", + prompt: "a red cube", +}); +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/meshy/meshy-6/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"art_style\": \"realistic\", \"mode\": \"preview\", \"prompt\": \"a red cube\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/meshy/meshy-6/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/meshy/meshy-6/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/meshy/meshy-7/code.mdx b/development/comfy-router/models/meshy/meshy-7/code.mdx index 296aa4ab2..81ec586bb 100644 --- a/development/comfy-router/models/meshy/meshy-7/code.mdx +++ b/development/comfy-router/models/meshy/meshy-7/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Meshy 7" {/* GENERATED FILE. Generated from router-schemas/meshy/meshy-7.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `meshy/meshy-7`, served by Comfy Router from Meshy. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/meshy/meshy-7` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/meshy/meshy-7 \ -d "{\"art_style\": \"realistic\", \"mode\": \"preview\", \"prompt\": \"a red cube\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/meshy/meshy-7/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( + "meshy/meshy-7", + { + "art_style": "realistic", + "mode": "preview", + "prompt": "a red cube", + }, + ) + 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("meshy/meshy-7", { + art_style: "realistic", + mode: "preview", + prompt: "a red cube", +}); +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/meshy/meshy-7/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"art_style\": \"realistic\", \"mode\": \"preview\", \"prompt\": \"a red cube\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/meshy/meshy-7/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/meshy/meshy-7/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/meshy/remesh/code.mdx b/development/comfy-router/models/meshy/remesh/code.mdx index 40e24b9ca..3f2b05329 100644 --- a/development/comfy-router/models/meshy/remesh/code.mdx +++ b/development/comfy-router/models/meshy/remesh/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Remesh" {/* GENERATED FILE. Generated from router-schemas/meshy/remesh.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `meshy/remesh`, served by Comfy Router from Meshy. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/meshy/remesh` + + ```python Python from comfy_sdk import Comfy @@ -65,6 +68,89 @@ curl https://api.comfy.org/v2/models/meshy/remesh \ -d "{\"input_task_id\": \"0193abcd-0000-0000-0000-000000000000\", \"origin_at\": \"bottom\", \"resize_height\": 1, \"target_formats\": [\"glb\",\"fbx\"], \"target_polycount\": 50000, \"topology\": \"quad\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/meshy/remesh/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( + "meshy/remesh", + { + "input_task_id": "0193abcd-0000-0000-0000-000000000000", + "origin_at": "bottom", + "resize_height": 1, + "target_formats": ["glb", "fbx"], + "target_polycount": 50000, + "topology": "quad", + }, + ) + 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("meshy/remesh", { + input_task_id: "0193abcd-0000-0000-0000-000000000000", + origin_at: "bottom", + resize_height: 1, + target_formats: ["glb", "fbx"], + target_polycount: 50000, + topology: "quad", +}); +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/meshy/remesh/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input_task_id\": \"0193abcd-0000-0000-0000-000000000000\", \"origin_at\": \"bottom\", \"resize_height\": 1, \"target_formats\": [\"glb\",\"fbx\"], \"target_polycount\": 50000, \"topology\": \"quad\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/meshy/remesh/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/meshy/remesh/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/meshy/rigging/code.mdx b/development/comfy-router/models/meshy/rigging/code.mdx index c03365eda..14278f9f6 100644 --- a/development/comfy-router/models/meshy/rigging/code.mdx +++ b/development/comfy-router/models/meshy/rigging/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Rigging" {/* GENERATED FILE. Generated from router-schemas/meshy/rigging.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `meshy/rigging`, served by Comfy Router from Meshy. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/meshy/rigging` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/meshy/rigging \ -d "{\"height_meters\": 1.8, \"input_task_id\": \"0193abcd-0000-0000-0000-000000000000\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/meshy/rigging/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( + "meshy/rigging", + { + "height_meters": 1.8, + "input_task_id": "0193abcd-0000-0000-0000-000000000000", + }, + ) + 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("meshy/rigging", { + height_meters: 1.8, + input_task_id: "0193abcd-0000-0000-0000-000000000000", +}); +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/meshy/rigging/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"height_meters\": 1.8, \"input_task_id\": \"0193abcd-0000-0000-0000-000000000000\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/meshy/rigging/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/meshy/rigging/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/minimax/minimax-h3/code.mdx b/development/comfy-router/models/minimax/minimax-h3/code.mdx index 228213ec1..c2f503ceb 100644 --- a/development/comfy-router/models/minimax/minimax-h3/code.mdx +++ b/development/comfy-router/models/minimax/minimax-h3/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "MiniMax H3" {/* GENERATED FILE. Generated from router-schemas/minimax/minimax-h3.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `minimax/minimax-h3`, served by Comfy Router from MiniMax. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/minimax/minimax-h3` + + ```python Python from comfy_sdk import Comfy @@ -71,6 +74,95 @@ curl https://api.comfy.org/v2/models/minimax/minimax-h3 \ -d "{\"content\": [{\"text\":\"A single red maple leaf resting on a plain white background.\",\"type\":\"text\"}], \"duration\": 5, \"ratio\": \"16:9\", \"resolution\": \"768P\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/minimax/minimax-h3/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( + "minimax/minimax-h3", + { + "content": [ + { + "text": "A single red maple leaf resting on a plain white background.", + "type": "text", + }, + ], + "duration": 5, + "ratio": "16:9", + "resolution": "768P", + }, + ) + 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("minimax/minimax-h3", { + content: [ + { + text: "A single red maple leaf resting on a plain white background.", + type: "text", + }, + ], + duration: 5, + ratio: "16:9", + resolution: "768P", +}); +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/minimax/minimax-h3/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"content\": [{\"text\":\"A single red maple leaf resting on a plain white background.\",\"type\":\"text\"}], \"duration\": 5, \"ratio\": \"16:9\", \"resolution\": \"768P\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/minimax/minimax-h3/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/minimax/minimax-h3/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/moonvalley/image-to-video/code.mdx b/development/comfy-router/models/moonvalley/image-to-video/code.mdx index 6ce25c61b..555182a12 100644 --- a/development/comfy-router/models/moonvalley/image-to-video/code.mdx +++ b/development/comfy-router/models/moonvalley/image-to-video/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Image To Video" {/* GENERATED FILE. Generated from router-schemas/moonvalley/image-to-video.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `moonvalley/image-to-video`, served by Comfy Router from Moonvalley. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/moonvalley/image-to-video` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/moonvalley/image-to-video \ -d "{\"image_url\": \"https://yavuzceliker.github.io/sample-images/image-1021.jpg\", \"prompt_text\": \"a single red maple leaf falling onto still water\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/moonvalley/image-to-video/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( + "moonvalley/image-to-video", + { + "image_url": "https://yavuzceliker.github.io/sample-images/image-1021.jpg", + "prompt_text": "a single red maple leaf falling onto still water", + }, + ) + 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("moonvalley/image-to-video", { + image_url: "https://yavuzceliker.github.io/sample-images/image-1021.jpg", + prompt_text: "a single red maple leaf falling onto still water", +}); +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/moonvalley/image-to-video/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"image_url\": \"https://yavuzceliker.github.io/sample-images/image-1021.jpg\", \"prompt_text\": \"a single red maple leaf falling onto still water\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/moonvalley/image-to-video/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/moonvalley/image-to-video/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/moonvalley/text-to-image/code.mdx b/development/comfy-router/models/moonvalley/text-to-image/code.mdx index 0faf63175..7629da710 100644 --- a/development/comfy-router/models/moonvalley/text-to-image/code.mdx +++ b/development/comfy-router/models/moonvalley/text-to-image/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Text To Image" {/* GENERATED FILE. Generated from router-schemas/moonvalley/text-to-image.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `moonvalley/text-to-image`, served by Comfy Router from Moonvalley. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/moonvalley/text-to-image` + + ```python Python from comfy_sdk import Comfy @@ -55,6 +58,79 @@ curl https://api.comfy.org/v2/models/moonvalley/text-to-image \ -d "{\"prompt_text\": \"a single red maple leaf resting on still water\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/moonvalley/text-to-image/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( + "moonvalley/text-to-image", + { + "prompt_text": "a single red maple leaf resting on still water", + }, + ) + 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("moonvalley/text-to-image", { + prompt_text: "a single red maple leaf resting on still water", +}); +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/moonvalley/text-to-image/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"prompt_text\": \"a single red maple leaf resting on still water\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/moonvalley/text-to-image/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/moonvalley/text-to-image/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/moonvalley/text-to-video/code.mdx b/development/comfy-router/models/moonvalley/text-to-video/code.mdx index 0e9ef9e34..d6962efd5 100644 --- a/development/comfy-router/models/moonvalley/text-to-video/code.mdx +++ b/development/comfy-router/models/moonvalley/text-to-video/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Text To Video" {/* GENERATED FILE. Generated from router-schemas/moonvalley/text-to-video.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `moonvalley/text-to-video`, served by Comfy Router from Moonvalley. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/moonvalley/text-to-video` + + ```python Python from comfy_sdk import Comfy @@ -55,6 +58,79 @@ curl https://api.comfy.org/v2/models/moonvalley/text-to-video \ -d "{\"prompt_text\": \"a single red maple leaf\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/moonvalley/text-to-video/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( + "moonvalley/text-to-video", + { + "prompt_text": "a single red maple leaf", + }, + ) + 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("moonvalley/text-to-video", { + prompt_text: "a single red maple leaf", +}); +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/moonvalley/text-to-video/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"prompt_text\": \"a single red maple leaf\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/moonvalley/text-to-video/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/moonvalley/text-to-video/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/moonvalley/video-to-video-resize/code.mdx b/development/comfy-router/models/moonvalley/video-to-video-resize/code.mdx index 5527471b2..9e7e48496 100644 --- a/development/comfy-router/models/moonvalley/video-to-video-resize/code.mdx +++ b/development/comfy-router/models/moonvalley/video-to-video-resize/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Video To Video Resize" {/* GENERATED FILE. Generated from router-schemas/moonvalley/video-to-video-resize.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `moonvalley/video-to-video-resize`, served by Comfy Router from Moonvalley. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/moonvalley/video-to-video-resize` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/moonvalley/video-to-video-resize \ -d "{\"control_type\": \"motion_control\", \"prompt_text\": \"Apply motion control to enhance this video\", \"video_url\": \"https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/360/Big_Buck_Bunny_360_10s_1MB.mp4\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/moonvalley/video-to-video-resize/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( + "moonvalley/video-to-video-resize", + { + "control_type": "motion_control", + "prompt_text": "Apply motion control to enhance this video", + "video_url": "https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/360/Big_Buck_Bunny_360_10s_1MB.mp4", + }, + ) + 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("moonvalley/video-to-video-resize", { + control_type: "motion_control", + prompt_text: "Apply motion control to enhance this video", + video_url: "https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/360/Big_Buck_Bunny_360_10s_1MB.mp4", +}); +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/moonvalley/video-to-video-resize/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"control_type\": \"motion_control\", \"prompt_text\": \"Apply motion control to enhance this video\", \"video_url\": \"https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/360/Big_Buck_Bunny_360_10s_1MB.mp4\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/moonvalley/video-to-video-resize/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/moonvalley/video-to-video-resize/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/moonvalley/video-to-video/code.mdx b/development/comfy-router/models/moonvalley/video-to-video/code.mdx index 1941735e8..dd1579531 100644 --- a/development/comfy-router/models/moonvalley/video-to-video/code.mdx +++ b/development/comfy-router/models/moonvalley/video-to-video/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Video To Video" {/* GENERATED FILE. Generated from router-schemas/moonvalley/video-to-video.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `moonvalley/video-to-video`, served by Comfy Router from Moonvalley. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/moonvalley/video-to-video` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/moonvalley/video-to-video \ -d "{\"control_type\": \"motion_control\", \"prompt_text\": \"Apply motion control to enhance this video\", \"video_url\": \"https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/360/Big_Buck_Bunny_360_10s_1MB.mp4\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/moonvalley/video-to-video/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( + "moonvalley/video-to-video", + { + "control_type": "motion_control", + "prompt_text": "Apply motion control to enhance this video", + "video_url": "https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/360/Big_Buck_Bunny_360_10s_1MB.mp4", + }, + ) + 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("moonvalley/video-to-video", { + control_type: "motion_control", + prompt_text: "Apply motion control to enhance this video", + video_url: "https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/360/Big_Buck_Bunny_360_10s_1MB.mp4", +}); +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/moonvalley/video-to-video/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"control_type\": \"motion_control\", \"prompt_text\": \"Apply motion control to enhance this video\", \"video_url\": \"https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/360/Big_Buck_Bunny_360_10s_1MB.mp4\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/moonvalley/video-to-video/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/moonvalley/video-to-video/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-4-1-mini/code.mdx b/development/comfy-router/models/openai/gpt-4-1-mini/code.mdx index e04366b8d..5eaaa2e44 100644 --- a/development/comfy-router/models/openai/gpt-4-1-mini/code.mdx +++ b/development/comfy-router/models/openai/gpt-4-1-mini/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT 4.1 Mini" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-4.1-mini.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-4.1-mini`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-4.1-mini` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/gpt-4.1-mini \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-4.1-mini/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( + "openai/gpt-4.1-mini", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/gpt-4.1-mini", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/gpt-4.1-mini/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-4.1-mini/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/openai/gpt-4.1-mini/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-4-1-nano/code.mdx b/development/comfy-router/models/openai/gpt-4-1-nano/code.mdx index 486b58ee2..5222515b6 100644 --- a/development/comfy-router/models/openai/gpt-4-1-nano/code.mdx +++ b/development/comfy-router/models/openai/gpt-4-1-nano/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT 4.1 Nano" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-4.1-nano.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-4.1-nano`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-4.1-nano` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/gpt-4.1-nano \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-4.1-nano/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( + "openai/gpt-4.1-nano", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/gpt-4.1-nano", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/gpt-4.1-nano/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-4.1-nano/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/openai/gpt-4.1-nano/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-4-1/code.mdx b/development/comfy-router/models/openai/gpt-4-1/code.mdx index d9673f95f..dfca482da 100644 --- a/development/comfy-router/models/openai/gpt-4-1/code.mdx +++ b/development/comfy-router/models/openai/gpt-4-1/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT 4.1" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-4.1.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-4.1`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-4.1` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/gpt-4.1 \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-4.1/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( + "openai/gpt-4.1", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/gpt-4.1", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/gpt-4.1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-4.1/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/openai/gpt-4.1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-4o/code.mdx b/development/comfy-router/models/openai/gpt-4o/code.mdx index 2271740ff..065451df4 100644 --- a/development/comfy-router/models/openai/gpt-4o/code.mdx +++ b/development/comfy-router/models/openai/gpt-4o/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT 4o" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-4o.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-4o`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-4o` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/gpt-4o \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-4o/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( + "openai/gpt-4o", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/gpt-4o", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/gpt-4o/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-4o/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/openai/gpt-4o/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-5-5-pro/code.mdx b/development/comfy-router/models/openai/gpt-5-5-pro/code.mdx index 86b59cbbe..6dcae7084 100644 --- a/development/comfy-router/models/openai/gpt-5-5-pro/code.mdx +++ b/development/comfy-router/models/openai/gpt-5-5-pro/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT 5.5 Pro" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-5.5-pro.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-5.5-pro`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-5.5-pro` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/gpt-5.5-pro \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-5.5-pro/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( + "openai/gpt-5.5-pro", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/gpt-5.5-pro", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/gpt-5.5-pro/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-5.5-pro/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/openai/gpt-5.5-pro/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-5-5/code.mdx b/development/comfy-router/models/openai/gpt-5-5/code.mdx index 45356fb0e..890db017c 100644 --- a/development/comfy-router/models/openai/gpt-5-5/code.mdx +++ b/development/comfy-router/models/openai/gpt-5-5/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT 5.5" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-5.5.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-5.5`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-5.5` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/gpt-5.5 \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-5.5/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( + "openai/gpt-5.5", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/gpt-5.5", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/gpt-5.5/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-5.5/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/openai/gpt-5.5/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-5-6-luna/code.mdx b/development/comfy-router/models/openai/gpt-5-6-luna/code.mdx index 79422071c..16318853f 100644 --- a/development/comfy-router/models/openai/gpt-5-6-luna/code.mdx +++ b/development/comfy-router/models/openai/gpt-5-6-luna/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT 5.6 Luna" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-5.6-luna.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-5.6-luna`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-5.6-luna` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/gpt-5.6-luna \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-5.6-luna/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( + "openai/gpt-5.6-luna", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/gpt-5.6-luna", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/gpt-5.6-luna/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-5.6-luna/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/openai/gpt-5.6-luna/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-5-6-sol/code.mdx b/development/comfy-router/models/openai/gpt-5-6-sol/code.mdx index d34b24c17..fdd4df3de 100644 --- a/development/comfy-router/models/openai/gpt-5-6-sol/code.mdx +++ b/development/comfy-router/models/openai/gpt-5-6-sol/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT 5.6 Sol" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-5.6-sol.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-5.6-sol`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-5.6-sol` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/gpt-5.6-sol \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-5.6-sol/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( + "openai/gpt-5.6-sol", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/gpt-5.6-sol", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/gpt-5.6-sol/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-5.6-sol/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/openai/gpt-5.6-sol/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-5-6-terra/code.mdx b/development/comfy-router/models/openai/gpt-5-6-terra/code.mdx index cddec7bc0..949784c0d 100644 --- a/development/comfy-router/models/openai/gpt-5-6-terra/code.mdx +++ b/development/comfy-router/models/openai/gpt-5-6-terra/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT 5.6 Terra" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-5.6-terra.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-5.6-terra`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-5.6-terra` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/gpt-5.6-terra \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-5.6-terra/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( + "openai/gpt-5.6-terra", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/gpt-5.6-terra", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/gpt-5.6-terra/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-5.6-terra/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/openai/gpt-5.6-terra/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-5-mini/code.mdx b/development/comfy-router/models/openai/gpt-5-mini/code.mdx index 0dd290e64..cac6c42a9 100644 --- a/development/comfy-router/models/openai/gpt-5-mini/code.mdx +++ b/development/comfy-router/models/openai/gpt-5-mini/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT 5 Mini" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-5-mini.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-5-mini`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-5-mini` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/gpt-5-mini \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-5-mini/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( + "openai/gpt-5-mini", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/gpt-5-mini", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/gpt-5-mini/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-5-mini/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/openai/gpt-5-mini/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-5-nano/code.mdx b/development/comfy-router/models/openai/gpt-5-nano/code.mdx index 888d8dace..d5383a257 100644 --- a/development/comfy-router/models/openai/gpt-5-nano/code.mdx +++ b/development/comfy-router/models/openai/gpt-5-nano/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT 5 Nano" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-5-nano.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-5-nano`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-5-nano` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/gpt-5-nano \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-5-nano/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( + "openai/gpt-5-nano", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/gpt-5-nano", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/gpt-5-nano/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-5-nano/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/openai/gpt-5-nano/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-5/code.mdx b/development/comfy-router/models/openai/gpt-5/code.mdx index 0c60cdcd9..da2a08ad7 100644 --- a/development/comfy-router/models/openai/gpt-5/code.mdx +++ b/development/comfy-router/models/openai/gpt-5/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT 5" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-5.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-5`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-5` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/gpt-5 \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-5/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( + "openai/gpt-5", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/gpt-5", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/gpt-5/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-5/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/openai/gpt-5/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-6-astra/code.mdx b/development/comfy-router/models/openai/gpt-6-astra/code.mdx index 9cddb0446..1f13f8cec 100644 --- a/development/comfy-router/models/openai/gpt-6-astra/code.mdx +++ b/development/comfy-router/models/openai/gpt-6-astra/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT 6 Astra" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-6-astra.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-6-astra`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-6-astra` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/gpt-6-astra \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-6-astra/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( + "openai/gpt-6-astra", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/gpt-6-astra", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/gpt-6-astra/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-6-astra/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/openai/gpt-6-astra/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-image-1-5/code.mdx b/development/comfy-router/models/openai/gpt-image-1-5/code.mdx index ea1251680..ecf68f943 100644 --- a/development/comfy-router/models/openai/gpt-image-1-5/code.mdx +++ b/development/comfy-router/models/openai/gpt-image-1-5/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT Image 1.5" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-image-1.5.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-image-1.5`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-image-1.5` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/openai/gpt-image-1.5 \ -d "{\"n\": 1, \"prompt\": \"a red circle\", \"quality\": \"low\", \"size\": \"1024x1024\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-image-1.5/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( + "openai/gpt-image-1.5", + { + "n": 1, + "prompt": "a red circle", + "quality": "low", + "size": "1024x1024", + }, + ) + 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("openai/gpt-image-1.5", { + n: 1, + prompt: "a red circle", + quality: "low", + size: "1024x1024", +}); +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/openai/gpt-image-1.5/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"a red circle\", \"quality\": \"low\", \"size\": \"1024x1024\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-image-1.5/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/openai/gpt-image-1.5/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-image-1/code.mdx b/development/comfy-router/models/openai/gpt-image-1/code.mdx index fbd0133be..2f954c698 100644 --- a/development/comfy-router/models/openai/gpt-image-1/code.mdx +++ b/development/comfy-router/models/openai/gpt-image-1/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT Image 1" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-image-1.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-image-1`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-image-1` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/openai/gpt-image-1 \ -d "{\"n\": 1, \"prompt\": \"a red circle\", \"quality\": \"low\", \"size\": \"1024x1024\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-image-1/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( + "openai/gpt-image-1", + { + "n": 1, + "prompt": "a red circle", + "quality": "low", + "size": "1024x1024", + }, + ) + 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("openai/gpt-image-1", { + n: 1, + prompt: "a red circle", + quality: "low", + size: "1024x1024", +}); +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/openai/gpt-image-1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"a red circle\", \"quality\": \"low\", \"size\": \"1024x1024\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-image-1/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/openai/gpt-image-1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-image-2-5-flare/code.mdx b/development/comfy-router/models/openai/gpt-image-2-5-flare/code.mdx index 7300a32f9..0ef78dc76 100644 --- a/development/comfy-router/models/openai/gpt-image-2-5-flare/code.mdx +++ b/development/comfy-router/models/openai/gpt-image-2-5-flare/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT Image 2.5 Flare" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-image-2.5-flare.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-image-2.5-flare`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-image-2.5-flare` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/openai/gpt-image-2.5-flare \ -d "{\"n\": 1, \"prompt\": \"a red circle\", \"quality\": \"low\", \"size\": \"1024x1024\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-image-2.5-flare/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( + "openai/gpt-image-2.5-flare", + { + "n": 1, + "prompt": "a red circle", + "quality": "low", + "size": "1024x1024", + }, + ) + 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("openai/gpt-image-2.5-flare", { + n: 1, + prompt: "a red circle", + quality: "low", + size: "1024x1024", +}); +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/openai/gpt-image-2.5-flare/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"a red circle\", \"quality\": \"low\", \"size\": \"1024x1024\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-image-2.5-flare/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/openai/gpt-image-2.5-flare/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-image-2-5-sunburst/code.mdx b/development/comfy-router/models/openai/gpt-image-2-5-sunburst/code.mdx index e93f2804b..d2d6b3ee7 100644 --- a/development/comfy-router/models/openai/gpt-image-2-5-sunburst/code.mdx +++ b/development/comfy-router/models/openai/gpt-image-2-5-sunburst/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT Image 2.5 Sunburst" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-image-2.5-sunburst.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-image-2.5-sunburst`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-image-2.5-sunburst` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/openai/gpt-image-2.5-sunburst \ -d "{\"n\": 1, \"prompt\": \"a red circle\", \"quality\": \"low\", \"size\": \"1024x1024\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-image-2.5-sunburst/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( + "openai/gpt-image-2.5-sunburst", + { + "n": 1, + "prompt": "a red circle", + "quality": "low", + "size": "1024x1024", + }, + ) + 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("openai/gpt-image-2.5-sunburst", { + n: 1, + prompt: "a red circle", + quality: "low", + size: "1024x1024", +}); +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/openai/gpt-image-2.5-sunburst/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"a red circle\", \"quality\": \"low\", \"size\": \"1024x1024\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-image-2.5-sunburst/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/openai/gpt-image-2.5-sunburst/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/gpt-image-2/code.mdx b/development/comfy-router/models/openai/gpt-image-2/code.mdx index 06e283713..48f499208 100644 --- a/development/comfy-router/models/openai/gpt-image-2/code.mdx +++ b/development/comfy-router/models/openai/gpt-image-2/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "GPT Image 2" {/* GENERATED FILE. Generated from router-schemas/openai/gpt-image-2.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/gpt-image-2`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/gpt-image-2` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/openai/gpt-image-2 \ -d "{\"n\": 1, \"prompt\": \"a red circle\", \"quality\": \"low\", \"size\": \"1024x1024\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/gpt-image-2/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( + "openai/gpt-image-2", + { + "n": 1, + "prompt": "a red circle", + "quality": "low", + "size": "1024x1024", + }, + ) + 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("openai/gpt-image-2", { + n: 1, + prompt: "a red circle", + quality: "low", + size: "1024x1024", +}); +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/openai/gpt-image-2/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"a red circle\", \"quality\": \"low\", \"size\": \"1024x1024\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/gpt-image-2/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/openai/gpt-image-2/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/o1-pro/code.mdx b/development/comfy-router/models/openai/o1-pro/code.mdx index 3813dd34f..2a1d20a79 100644 --- a/development/comfy-router/models/openai/o1-pro/code.mdx +++ b/development/comfy-router/models/openai/o1-pro/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "o1-pro" {/* GENERATED FILE. Generated from router-schemas/openai/o1-pro.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/o1-pro`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/o1-pro` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/o1-pro \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/o1-pro/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( + "openai/o1-pro", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/o1-pro", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/o1-pro/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/o1-pro/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/openai/o1-pro/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/o1/code.mdx b/development/comfy-router/models/openai/o1/code.mdx index 80b050581..2dc787155 100644 --- a/development/comfy-router/models/openai/o1/code.mdx +++ b/development/comfy-router/models/openai/o1/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "o1" {/* GENERATED FILE. Generated from router-schemas/openai/o1.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/o1`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/o1` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/o1 \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/o1/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( + "openai/o1", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/o1", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/o1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/o1/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/openai/o1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/o3/code.mdx b/development/comfy-router/models/openai/o3/code.mdx index da6d6dc1b..2bb3f80e6 100644 --- a/development/comfy-router/models/openai/o3/code.mdx +++ b/development/comfy-router/models/openai/o3/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "o3" {/* GENERATED FILE. Generated from router-schemas/openai/o3.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/o3`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/o3` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/o3 \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/o3/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( + "openai/o3", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/o3", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/o3/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/o3/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/openai/o3/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/openai/o4-mini/code.mdx b/development/comfy-router/models/openai/o4-mini/code.mdx index 6f5967775..117241776 100644 --- a/development/comfy-router/models/openai/o4-mini/code.mdx +++ b/development/comfy-router/models/openai/o4-mini/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "o4-mini" {/* GENERATED FILE. Generated from router-schemas/openai/o4-mini.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `openai/o4-mini`, served by Comfy Router from OpenAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/openai/o4-mini` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/openai/o4-mini \ -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/openai/o4-mini/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( + "openai/o4-mini", + { + "input": "Reply with the single word: ok", + "max_output_tokens": 1024, + }, + ) + 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("openai/o4-mini", { + input: "Reply with the single word: ok", + max_output_tokens: 1024, +}); +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/openai/o4-mini/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": \"Reply with the single word: ok\", \"max_output_tokens\": 1024}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/openai/o4-mini/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/openai/o4-mini/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/pruna/p-video-2/code.mdx b/development/comfy-router/models/pruna/p-video-2/code.mdx index 2b19a5a36..e4e887b37 100644 --- a/development/comfy-router/models/pruna/p-video-2/code.mdx +++ b/development/comfy-router/models/pruna/p-video-2/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "P Video 2" {/* GENERATED FILE. Generated from router-schemas/pruna/p-video-2.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `pruna/p-video-2`, served by Comfy Router from Pruna. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/pruna/p-video-2` + + ```python Python from comfy_sdk import Comfy @@ -69,6 +72,93 @@ curl https://api.comfy.org/v2/models/pruna/p-video-2 \ -d "{\"input\": {\"aspect_ratio\":\"16:9\",\"draft\":false,\"duration\":2,\"fps\":24,\"prompt\":\"A single red maple leaf resting on a plain white background.\",\"resolution\":\"720p\"}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/pruna/p-video-2/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( + "pruna/p-video-2", + { + "input": { + "aspect_ratio": "16:9", + "draft": False, + "duration": 2, + "fps": 24, + "prompt": "A single red maple leaf resting on a plain white background.", + "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("pruna/p-video-2", { + input: { + aspect_ratio: "16:9", + draft: false, + duration: 2, + fps: 24, + prompt: "A single red maple leaf resting on a plain white background.", + 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/pruna/p-video-2/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"aspect_ratio\":\"16:9\",\"draft\":false,\"duration\":2,\"fps\":24,\"prompt\":\"A single red maple leaf resting on a plain white background.\",\"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/pruna/p-video-2/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/pruna/p-video-2/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/qwen/qwen-image-3-0-pro/code.mdx b/development/comfy-router/models/qwen/qwen-image-3-0-pro/code.mdx index 0d07b556a..21a9e48c4 100644 --- a/development/comfy-router/models/qwen/qwen-image-3-0-pro/code.mdx +++ b/development/comfy-router/models/qwen/qwen-image-3-0-pro/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Qwen Image 3.0 Pro" {/* GENERATED FILE. Generated from router-schemas/qwen/qwen-image-3.0-pro.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `qwen/qwen-image-3.0-pro`, served by Comfy Router from Qwen. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/qwen/qwen-image-3.0-pro` + + ```python Python from comfy_sdk import Comfy @@ -77,6 +80,101 @@ curl https://api.comfy.org/v2/models/qwen/qwen-image-3.0-pro \ -d "{\"input\": {\"messages\":[{\"content\":[{\"text\":\"A single red maple leaf on a plain white background.\"}],\"role\":\"user\"}]}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/qwen/qwen-image-3.0-pro/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( + "qwen/qwen-image-3.0-pro", + { + "input": { + "messages": [ + { + "content": [ + { + "text": "A single red maple leaf on a plain white background.", + }, + ], + "role": "user", + }, + ], + }, + }, + ) + 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("qwen/qwen-image-3.0-pro", { + input: { + messages: [ + { + content: [ + { + text: "A single red maple leaf on a plain white background.", + }, + ], + role: "user", + }, + ], + }, +}); +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/qwen/qwen-image-3.0-pro/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"messages\":[{\"content\":[{\"text\":\"A single red maple leaf on a plain white background.\"}],\"role\":\"user\"}]}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/qwen/qwen-image-3.0-pro/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/qwen/qwen-image-3.0-pro/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/qwen/qwen-image-3-0/code.mdx b/development/comfy-router/models/qwen/qwen-image-3-0/code.mdx index 33a747509..d8593bd1a 100644 --- a/development/comfy-router/models/qwen/qwen-image-3-0/code.mdx +++ b/development/comfy-router/models/qwen/qwen-image-3-0/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Qwen Image 3.0" {/* GENERATED FILE. Generated from router-schemas/qwen/qwen-image-3.0.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `qwen/qwen-image-3.0`, served by Comfy Router from Qwen. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/qwen/qwen-image-3.0` + + ```python Python from comfy_sdk import Comfy @@ -77,6 +80,101 @@ curl https://api.comfy.org/v2/models/qwen/qwen-image-3.0 \ -d "{\"input\": {\"messages\":[{\"content\":[{\"text\":\"A single red maple leaf on a plain white background.\"}],\"role\":\"user\"}]}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/qwen/qwen-image-3.0/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( + "qwen/qwen-image-3.0", + { + "input": { + "messages": [ + { + "content": [ + { + "text": "A single red maple leaf on a plain white background.", + }, + ], + "role": "user", + }, + ], + }, + }, + ) + 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("qwen/qwen-image-3.0", { + input: { + messages: [ + { + content: [ + { + text: "A single red maple leaf on a plain white background.", + }, + ], + role: "user", + }, + ], + }, +}); +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/qwen/qwen-image-3.0/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"messages\":[{\"content\":[{\"text\":\"A single red maple leaf on a plain white background.\"}],\"role\":\"user\"}]}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/qwen/qwen-image-3.0/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/qwen/qwen-image-3.0/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/recraft/recraftv2/code.mdx b/development/comfy-router/models/recraft/recraftv2/code.mdx index 4f19bbcbf..872bc7c64 100644 --- a/development/comfy-router/models/recraft/recraftv2/code.mdx +++ b/development/comfy-router/models/recraft/recraftv2/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Recraft V2" {/* GENERATED FILE. Generated from router-schemas/recraft/recraftv2.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `recraft/recraftv2`, served by Comfy Router from Recraft. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/recraft/recraftv2` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/recraft/recraftv2 \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/recraft/recraftv2/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( + "recraft/recraftv2", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("recraft/recraftv2", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/recraft/recraftv2/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/recraft/recraftv2/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/recraft/recraftv2/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/recraft/recraftv3/code.mdx b/development/comfy-router/models/recraft/recraftv3/code.mdx index f1579507f..482a46b01 100644 --- a/development/comfy-router/models/recraft/recraftv3/code.mdx +++ b/development/comfy-router/models/recraft/recraftv3/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Recraft V3" {/* GENERATED FILE. Generated from router-schemas/recraft/recraftv3.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `recraft/recraftv3`, served by Comfy Router from Recraft. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/recraft/recraftv3` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/recraft/recraftv3 \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/recraft/recraftv3/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( + "recraft/recraftv3", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("recraft/recraftv3", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/recraft/recraftv3/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/recraft/recraftv3/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/recraft/recraftv3/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 093115ee0..7f7711698 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 @@ -6,6 +6,7 @@ sidebarTitle: "Recraft V4.1 Pro Vector" {/* GENERATED FILE. Generated from router-schemas/recraft/recraftv4_1_pro_vector.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `recraft/recraftv4_1_pro_vector`, served by Comfy Router from Recraft. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/recraft/recraftv4_1_pro_vector` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_pro_vector \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/recraft/recraftv4_1_pro_vector/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( + "recraft/recraftv4_1_pro_vector", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("recraft/recraftv4_1_pro_vector", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/recraft/recraftv4_1_pro_vector/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/recraft/recraftv4_1_pro_vector/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/recraft/recraftv4_1_pro_vector/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 c152f98f4..bbdd8e5df 100644 --- a/development/comfy-router/models/recraft/recraftv4-1-pro/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-1-pro/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Recraft V4.1 Pro" {/* GENERATED FILE. Generated from router-schemas/recraft/recraftv4_1_pro.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `recraft/recraftv4_1_pro`, served by Comfy Router from Recraft. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/recraft/recraftv4_1_pro` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_pro \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/recraft/recraftv4_1_pro/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( + "recraft/recraftv4_1_pro", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("recraft/recraftv4_1_pro", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/recraft/recraftv4_1_pro/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/recraft/recraftv4_1_pro/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/recraft/recraftv4_1_pro/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 ac08bd615..ff977eb42 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 @@ -6,6 +6,7 @@ sidebarTitle: "Recraft V4.1 Utility Pro Vector" {/* GENERATED FILE. Generated from router-schemas/recraft/recraftv4_1_utility_pro_vector.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `recraft/recraftv4_1_utility_pro_vector`, served by Comfy Router from Recraft. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_pro_vector` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_pro_vector \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_pro_vector/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( + "recraft/recraftv4_1_utility_pro_vector", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("recraft/recraftv4_1_utility_pro_vector", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/recraft/recraftv4_1_utility_pro_vector/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_pro_vector/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/recraft/recraftv4_1_utility_pro_vector/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 c93b6d497..eb25d592f 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 @@ -6,6 +6,7 @@ sidebarTitle: "Recraft V4.1 Utility Pro" {/* GENERATED FILE. Generated from router-schemas/recraft/recraftv4_1_utility_pro.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `recraft/recraftv4_1_utility_pro`, served by Comfy Router from Recraft. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_pro` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_pro \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_pro/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( + "recraft/recraftv4_1_utility_pro", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("recraft/recraftv4_1_utility_pro", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/recraft/recraftv4_1_utility_pro/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_pro/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/recraft/recraftv4_1_utility_pro/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 82dc34280..a4c30566d 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 @@ -6,6 +6,7 @@ sidebarTitle: "Recraft V4.1 Utility Vector" {/* GENERATED FILE. Generated from router-schemas/recraft/recraftv4_1_utility_vector.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `recraft/recraftv4_1_utility_vector`, served by Comfy Router from Recraft. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_vector` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_vector \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_vector/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( + "recraft/recraftv4_1_utility_vector", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("recraft/recraftv4_1_utility_vector", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/recraft/recraftv4_1_utility_vector/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/recraft/recraftv4_1_utility_vector/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/recraft/recraftv4_1_utility_vector/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 173f5bca2..4ba992c02 100644 --- a/development/comfy-router/models/recraft/recraftv4-1-utility/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-1-utility/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Recraft V4.1 Utility" {/* GENERATED FILE. Generated from router-schemas/recraft/recraftv4_1_utility.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `recraft/recraftv4_1_utility`, served by Comfy Router from Recraft. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/recraft/recraftv4_1_utility` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_utility \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/recraft/recraftv4_1_utility/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( + "recraft/recraftv4_1_utility", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("recraft/recraftv4_1_utility", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/recraft/recraftv4_1_utility/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/recraft/recraftv4_1_utility/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/recraft/recraftv4_1_utility/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 e39ba4fad..b7c72f993 100644 --- a/development/comfy-router/models/recraft/recraftv4-1-vector/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-1-vector/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Recraft V4.1 Vector" {/* GENERATED FILE. Generated from router-schemas/recraft/recraftv4_1_vector.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `recraft/recraftv4_1_vector`, served by Comfy Router from Recraft. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/recraft/recraftv4_1_vector` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1_vector \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/recraft/recraftv4_1_vector/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( + "recraft/recraftv4_1_vector", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("recraft/recraftv4_1_vector", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/recraft/recraftv4_1_vector/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/recraft/recraftv4_1_vector/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/recraft/recraftv4_1_vector/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/recraft/recraftv4-1/code.mdx b/development/comfy-router/models/recraft/recraftv4-1/code.mdx index 6162f60d8..ac522fdf2 100644 --- a/development/comfy-router/models/recraft/recraftv4-1/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-1/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Recraft V4.1" {/* GENERATED FILE. Generated from router-schemas/recraft/recraftv4_1.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `recraft/recraftv4_1`, served by Comfy Router from Recraft. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/recraft/recraftv4_1` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_1 \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/recraft/recraftv4_1/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( + "recraft/recraftv4_1", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("recraft/recraftv4_1", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/recraft/recraftv4_1/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/recraft/recraftv4_1/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/recraft/recraftv4_1/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/recraft/recraftv4-pro/code.mdx b/development/comfy-router/models/recraft/recraftv4-pro/code.mdx index 38d57fa3c..962e53533 100644 --- a/development/comfy-router/models/recraft/recraftv4-pro/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-pro/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Recraft V4 Pro" {/* GENERATED FILE. Generated from router-schemas/recraft/recraftv4_pro.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `recraft/recraftv4_pro`, served by Comfy Router from Recraft. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/recraft/recraftv4_pro` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_pro \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/recraft/recraftv4_pro/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( + "recraft/recraftv4_pro", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("recraft/recraftv4_pro", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/recraft/recraftv4_pro/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/recraft/recraftv4_pro/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/recraft/recraftv4_pro/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 122aa2b3c..a3ba3a51f 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 @@ -6,6 +6,7 @@ sidebarTitle: "Recraft V4 Styles Pro Vector" {/* GENERATED FILE. Generated from router-schemas/recraft/recraftv4_styles_pro_vector.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `recraft/recraftv4_styles_pro_vector`, served by Comfy Router from Recraft. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/recraft/recraftv4_styles_pro_vector` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_styles_pro_vector \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/recraft/recraftv4_styles_pro_vector/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( + "recraft/recraftv4_styles_pro_vector", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("recraft/recraftv4_styles_pro_vector", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/recraft/recraftv4_styles_pro_vector/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/recraft/recraftv4_styles_pro_vector/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/recraft/recraftv4_styles_pro_vector/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 3613ad9c7..dc2b36a1c 100644 --- a/development/comfy-router/models/recraft/recraftv4-styles-pro/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-styles-pro/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Recraft V4 Styles Pro" {/* GENERATED FILE. Generated from router-schemas/recraft/recraftv4_styles_pro.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `recraft/recraftv4_styles_pro`, served by Comfy Router from Recraft. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/recraft/recraftv4_styles_pro` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_styles_pro \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/recraft/recraftv4_styles_pro/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( + "recraft/recraftv4_styles_pro", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("recraft/recraftv4_styles_pro", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/recraft/recraftv4_styles_pro/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/recraft/recraftv4_styles_pro/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/recraft/recraftv4_styles_pro/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 fded2984a..6817b5058 100644 --- a/development/comfy-router/models/recraft/recraftv4-styles-vector/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-styles-vector/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Recraft V4 Styles Vector" {/* GENERATED FILE. Generated from router-schemas/recraft/recraftv4_styles_vector.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `recraft/recraftv4_styles_vector`, served by Comfy Router from Recraft. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/recraft/recraftv4_styles_vector` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_styles_vector \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/recraft/recraftv4_styles_vector/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( + "recraft/recraftv4_styles_vector", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("recraft/recraftv4_styles_vector", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/recraft/recraftv4_styles_vector/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/recraft/recraftv4_styles_vector/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/recraft/recraftv4_styles_vector/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/recraft/recraftv4-styles/code.mdx b/development/comfy-router/models/recraft/recraftv4-styles/code.mdx index 5c7e96f41..6c6241aa5 100644 --- a/development/comfy-router/models/recraft/recraftv4-styles/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4-styles/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Recraft V4 Styles" {/* GENERATED FILE. Generated from router-schemas/recraft/recraftv4_styles.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `recraft/recraftv4_styles`, served by Comfy Router from Recraft. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/recraft/recraftv4_styles` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4_styles \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/recraft/recraftv4_styles/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( + "recraft/recraftv4_styles", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("recraft/recraftv4_styles", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/recraft/recraftv4_styles/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/recraft/recraftv4_styles/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/recraft/recraftv4_styles/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/recraft/recraftv4/code.mdx b/development/comfy-router/models/recraft/recraftv4/code.mdx index 7e746f4d1..cadc803d3 100644 --- a/development/comfy-router/models/recraft/recraftv4/code.mdx +++ b/development/comfy-router/models/recraft/recraftv4/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Recraft V4" {/* GENERATED FILE. Generated from router-schemas/recraft/recraftv4.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `recraft/recraftv4`, served by Comfy Router from Recraft. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/recraft/recraftv4` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/recraft/recraftv4 \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/recraft/recraftv4/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( + "recraft/recraftv4", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("recraft/recraftv4", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/recraft/recraftv4/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/recraft/recraftv4/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/recraft/recraftv4/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/runway/aleph2/code.mdx b/development/comfy-router/models/runway/aleph2/code.mdx index 8d8b4b968..bafa508fe 100644 --- a/development/comfy-router/models/runway/aleph2/code.mdx +++ b/development/comfy-router/models/runway/aleph2/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Aleph 2" {/* GENERATED FILE. Generated from router-schemas/runway/aleph2.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `runway/aleph2`, served by Comfy Router from Runway. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/runway/aleph2` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/runway/aleph2 \ -d "{\"promptText\": \"recolor the scene in cool blue tones\", \"videoUri\": \"https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/360/Big_Buck_Bunny_360_10s_1MB.mp4\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/runway/aleph2/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( + "runway/aleph2", + { + "promptText": "recolor the scene in cool blue tones", + "videoUri": "https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/360/Big_Buck_Bunny_360_10s_1MB.mp4", + }, + ) + 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("runway/aleph2", { + promptText: "recolor the scene in cool blue tones", + videoUri: "https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/360/Big_Buck_Bunny_360_10s_1MB.mp4", +}); +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/runway/aleph2/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"promptText\": \"recolor the scene in cool blue tones\", \"videoUri\": \"https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/360/Big_Buck_Bunny_360_10s_1MB.mp4\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/runway/aleph2/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/runway/aleph2/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/runway/gen4-image/code.mdx b/development/comfy-router/models/runway/gen4-image/code.mdx index 89b456483..b1e43e009 100644 --- a/development/comfy-router/models/runway/gen4-image/code.mdx +++ b/development/comfy-router/models/runway/gen4-image/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Gen 4 Image" {/* GENERATED FILE. Generated from router-schemas/runway/gen4_image.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `runway/gen4_image`, served by Comfy Router from Runway. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/runway/gen4_image` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/runway/gen4_image \ -d "{\"promptText\": \"a red circle\", \"ratio\": \"1024:1024\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/runway/gen4_image/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( + "runway/gen4_image", + { + "promptText": "a red circle", + "ratio": "1024:1024", + }, + ) + 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("runway/gen4_image", { + promptText: "a red circle", + ratio: "1024:1024", +}); +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/runway/gen4_image/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"promptText\": \"a red circle\", \"ratio\": \"1024:1024\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/runway/gen4_image/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/runway/gen4_image/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/runway/gen4-turbo/code.mdx b/development/comfy-router/models/runway/gen4-turbo/code.mdx index 853c480f0..11db8931e 100644 --- a/development/comfy-router/models/runway/gen4-turbo/code.mdx +++ b/development/comfy-router/models/runway/gen4-turbo/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Gen 4 Turbo" {/* GENERATED FILE. Generated from router-schemas/runway/gen4_turbo.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `runway/gen4_turbo`, served by Comfy Router from Runway. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/runway/gen4_turbo` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/runway/gen4_turbo \ -d "{\"duration\": 5, \"promptImage\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\", \"ratio\": \"1280:720\", \"seed\": 42}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/runway/gen4_turbo/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( + "runway/gen4_turbo", + { + "duration": 5, + "promptImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + "ratio": "1280:720", + "seed": 42, + }, + ) + 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("runway/gen4_turbo", { + duration: 5, + promptImage: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==", + ratio: "1280:720", + seed: 42, +}); +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/runway/gen4_turbo/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"duration\": 5, \"promptImage\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAC2klEQVR42u3TQQ0AQAgEMeTgX8W5gi8OjoROVgGhUdLhwgkEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAAkACQAJAAkACQAJAAkACQAJAAkACQAFjSy7SPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IIAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASABIAEgASABIAEgASABIAEgASABIAEgASABIAAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAadSRm+WukYdfewAAAABJRU5ErkJggg==\", \"ratio\": \"1280:720\", \"seed\": 42}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/runway/gen4_turbo/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/runway/gen4_turbo/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/tencent/hunyuan-3d-part/code.mdx b/development/comfy-router/models/tencent/hunyuan-3d-part/code.mdx index 93ed63f50..1358f2112 100644 --- a/development/comfy-router/models/tencent/hunyuan-3d-part/code.mdx +++ b/development/comfy-router/models/tencent/hunyuan-3d-part/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Hunyuan 3D Part" {/* GENERATED FILE. Generated from router-schemas/tencent/hunyuan-3d-part.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `tencent/hunyuan-3d-part`, served by Comfy Router from Tencent. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/tencent/hunyuan-3d-part` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/tencent/hunyuan-3d-part \ -d "{\"File\": {\"Type\":\"FBX\",\"Url\":\"https://vcg-test-1258344699.cos.ap-guangzhou.myqcloud.com/test/3d/test.fbx\"}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/tencent/hunyuan-3d-part/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( + "tencent/hunyuan-3d-part", + { + "File": { + "Type": "FBX", + "Url": "https://vcg-test-1258344699.cos.ap-guangzhou.myqcloud.com/test/3d/test.fbx", + }, + }, + ) + 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("tencent/hunyuan-3d-part", { + File: { + Type: "FBX", + Url: "https://vcg-test-1258344699.cos.ap-guangzhou.myqcloud.com/test/3d/test.fbx", + }, +}); +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/tencent/hunyuan-3d-part/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"File\": {\"Type\":\"FBX\",\"Url\":\"https://vcg-test-1258344699.cos.ap-guangzhou.myqcloud.com/test/3d/test.fbx\"}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/tencent/hunyuan-3d-part/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/tencent/hunyuan-3d-part/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/tencent/hunyuan-3d-smart-topology/code.mdx b/development/comfy-router/models/tencent/hunyuan-3d-smart-topology/code.mdx index e6acd45a2..771ed3184 100644 --- a/development/comfy-router/models/tencent/hunyuan-3d-smart-topology/code.mdx +++ b/development/comfy-router/models/tencent/hunyuan-3d-smart-topology/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Hunyuan 3D Smart Topology" {/* GENERATED FILE. Generated from router-schemas/tencent/hunyuan-3d-smart-topology.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `tencent/hunyuan-3d-smart-topology`, served by Comfy Router from Tencent. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/tencent/hunyuan-3d-smart-topology` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/tencent/hunyuan-3d-smart-topology \ -d "{\"File3D\": {\"Type\":\"GLB\",\"Url\":\"https://vcg-test-1258344699.cos.ap-guangzhou.myqcloud.com/test/3d/test.glb\"}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/tencent/hunyuan-3d-smart-topology/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( + "tencent/hunyuan-3d-smart-topology", + { + "File3D": { + "Type": "GLB", + "Url": "https://vcg-test-1258344699.cos.ap-guangzhou.myqcloud.com/test/3d/test.glb", + }, + }, + ) + 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("tencent/hunyuan-3d-smart-topology", { + File3D: { + Type: "GLB", + Url: "https://vcg-test-1258344699.cos.ap-guangzhou.myqcloud.com/test/3d/test.glb", + }, +}); +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/tencent/hunyuan-3d-smart-topology/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"File3D\": {\"Type\":\"GLB\",\"Url\":\"https://vcg-test-1258344699.cos.ap-guangzhou.myqcloud.com/test/3d/test.glb\"}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/tencent/hunyuan-3d-smart-topology/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/tencent/hunyuan-3d-smart-topology/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/tencent/hunyuan-3d-texture-edit/code.mdx b/development/comfy-router/models/tencent/hunyuan-3d-texture-edit/code.mdx index 4bcdfb4f3..f04cd26cb 100644 --- a/development/comfy-router/models/tencent/hunyuan-3d-texture-edit/code.mdx +++ b/development/comfy-router/models/tencent/hunyuan-3d-texture-edit/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Hunyuan 3D Texture Edit" {/* GENERATED FILE. Generated from router-schemas/tencent/hunyuan-3d-texture-edit.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `tencent/hunyuan-3d-texture-edit`, served by Comfy Router from Tencent. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/tencent/hunyuan-3d-texture-edit` + + ```python Python from comfy_sdk import Comfy @@ -63,6 +66,87 @@ curl https://api.comfy.org/v2/models/tencent/hunyuan-3d-texture-edit \ -d "{\"File3D\": {\"Type\":\"FBX\",\"Url\":\"https://vcg-test-1258344699.cos.ap-guangzhou.myqcloud.com/test/3d/test.fbx\"}, \"Prompt\": \"a kitten\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/tencent/hunyuan-3d-texture-edit/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( + "tencent/hunyuan-3d-texture-edit", + { + "File3D": { + "Type": "FBX", + "Url": "https://vcg-test-1258344699.cos.ap-guangzhou.myqcloud.com/test/3d/test.fbx", + }, + "Prompt": "a kitten", + }, + ) + 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("tencent/hunyuan-3d-texture-edit", { + File3D: { + Type: "FBX", + Url: "https://vcg-test-1258344699.cos.ap-guangzhou.myqcloud.com/test/3d/test.fbx", + }, + Prompt: "a kitten", +}); +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/tencent/hunyuan-3d-texture-edit/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"File3D\": {\"Type\":\"FBX\",\"Url\":\"https://vcg-test-1258344699.cos.ap-guangzhou.myqcloud.com/test/3d/test.fbx\"}, \"Prompt\": \"a kitten\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/tencent/hunyuan-3d-texture-edit/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/tencent/hunyuan-3d-texture-edit/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/tencent/hunyuan-3d-uv/code.mdx b/development/comfy-router/models/tencent/hunyuan-3d-uv/code.mdx index abc95aab5..e301171df 100644 --- a/development/comfy-router/models/tencent/hunyuan-3d-uv/code.mdx +++ b/development/comfy-router/models/tencent/hunyuan-3d-uv/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Hunyuan 3D Uv" {/* GENERATED FILE. Generated from router-schemas/tencent/hunyuan-3d-uv.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `tencent/hunyuan-3d-uv`, served by Comfy Router from Tencent. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/tencent/hunyuan-3d-uv` + + ```python Python from comfy_sdk import Comfy @@ -61,6 +64,85 @@ curl https://api.comfy.org/v2/models/tencent/hunyuan-3d-uv \ -d "{\"File\": {\"Type\":\"GLB\",\"Url\":\"https://vcg-test-1258344699.cos.ap-guangzhou.myqcloud.com/test/3d/test.glb\"}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/tencent/hunyuan-3d-uv/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( + "tencent/hunyuan-3d-uv", + { + "File": { + "Type": "GLB", + "Url": "https://vcg-test-1258344699.cos.ap-guangzhou.myqcloud.com/test/3d/test.glb", + }, + }, + ) + 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("tencent/hunyuan-3d-uv", { + File: { + Type: "GLB", + Url: "https://vcg-test-1258344699.cos.ap-guangzhou.myqcloud.com/test/3d/test.glb", + }, +}); +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/tencent/hunyuan-3d-uv/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"File\": {\"Type\":\"GLB\",\"Url\":\"https://vcg-test-1258344699.cos.ap-guangzhou.myqcloud.com/test/3d/test.glb\"}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/tencent/hunyuan-3d-uv/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/tencent/hunyuan-3d-uv/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/veo/veo-2-0-generate-001/code.mdx b/development/comfy-router/models/veo/veo-2-0-generate-001/code.mdx index 5044cd90d..85e7fb905 100644 --- a/development/comfy-router/models/veo/veo-2-0-generate-001/code.mdx +++ b/development/comfy-router/models/veo/veo-2-0-generate-001/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Veo 2.0 Generate 001" {/* GENERATED FILE. Generated from router-schemas/veo/veo-2.0-generate-001.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `veo/veo-2.0-generate-001`, served by Comfy Router from Veo. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/veo/veo-2.0-generate-001` + + ```python Python from comfy_sdk import Comfy @@ -71,6 +74,95 @@ curl https://api.comfy.org/v2/models/veo/veo-2.0-generate-001 \ -d "{\"instances\": [{\"prompt\":\"a single red maple leaf falling onto still water, slow motion\"}], \"parameters\": {\"durationSeconds\":6,\"sampleCount\":1}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/veo/veo-2.0-generate-001/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( + "veo/veo-2.0-generate-001", + { + "instances": [ + { + "prompt": "a single red maple leaf falling onto still water, slow motion", + }, + ], + "parameters": { + "durationSeconds": 6, + "sampleCount": 1, + }, + }, + ) + 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("veo/veo-2.0-generate-001", { + instances: [ + { + prompt: "a single red maple leaf falling onto still water, slow motion", + }, + ], + parameters: { + durationSeconds: 6, + sampleCount: 1, + }, +}); +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/veo/veo-2.0-generate-001/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"instances\": [{\"prompt\":\"a single red maple leaf falling onto still water, slow motion\"}], \"parameters\": {\"durationSeconds\":6,\"sampleCount\":1}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/veo/veo-2.0-generate-001/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/veo/veo-2.0-generate-001/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/veo/veo-3-0-fast-generate-001/code.mdx b/development/comfy-router/models/veo/veo-3-0-fast-generate-001/code.mdx index 47f11a03c..ce7a8151a 100644 --- a/development/comfy-router/models/veo/veo-3-0-fast-generate-001/code.mdx +++ b/development/comfy-router/models/veo/veo-3-0-fast-generate-001/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Veo 3.0 Fast Generate 001" {/* GENERATED FILE. Generated from router-schemas/veo/veo-3.0-fast-generate-001.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `veo/veo-3.0-fast-generate-001`, served by Comfy Router from Veo. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/veo/veo-3.0-fast-generate-001` + + ```python Python from comfy_sdk import Comfy @@ -73,6 +76,97 @@ curl https://api.comfy.org/v2/models/veo/veo-3.0-fast-generate-001 \ -d "{\"instances\": [{\"prompt\":\"a single red maple leaf falling onto still water, slow motion\"}], \"parameters\": {\"durationSeconds\":4,\"generateAudio\":false,\"sampleCount\":1}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/veo/veo-3.0-fast-generate-001/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( + "veo/veo-3.0-fast-generate-001", + { + "instances": [ + { + "prompt": "a single red maple leaf falling onto still water, slow motion", + }, + ], + "parameters": { + "durationSeconds": 4, + "generateAudio": False, + "sampleCount": 1, + }, + }, + ) + 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("veo/veo-3.0-fast-generate-001", { + instances: [ + { + prompt: "a single red maple leaf falling onto still water, slow motion", + }, + ], + parameters: { + durationSeconds: 4, + generateAudio: false, + sampleCount: 1, + }, +}); +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/veo/veo-3.0-fast-generate-001/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"instances\": [{\"prompt\":\"a single red maple leaf falling onto still water, slow motion\"}], \"parameters\": {\"durationSeconds\":4,\"generateAudio\":false,\"sampleCount\":1}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/veo/veo-3.0-fast-generate-001/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/veo/veo-3.0-fast-generate-001/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/veo/veo-3-0-generate-001/code.mdx b/development/comfy-router/models/veo/veo-3-0-generate-001/code.mdx index 36a99270d..b398f1c43 100644 --- a/development/comfy-router/models/veo/veo-3-0-generate-001/code.mdx +++ b/development/comfy-router/models/veo/veo-3-0-generate-001/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Veo 3.0 Generate 001" {/* GENERATED FILE. Generated from router-schemas/veo/veo-3.0-generate-001.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `veo/veo-3.0-generate-001`, served by Comfy Router from Veo. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/veo/veo-3.0-generate-001` + + ```python Python from comfy_sdk import Comfy @@ -73,6 +76,97 @@ curl https://api.comfy.org/v2/models/veo/veo-3.0-generate-001 \ -d "{\"instances\": [{\"prompt\":\"a single red maple leaf falling onto still water, slow motion\"}], \"parameters\": {\"durationSeconds\":4,\"generateAudio\":false,\"sampleCount\":1}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/veo/veo-3.0-generate-001/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( + "veo/veo-3.0-generate-001", + { + "instances": [ + { + "prompt": "a single red maple leaf falling onto still water, slow motion", + }, + ], + "parameters": { + "durationSeconds": 4, + "generateAudio": False, + "sampleCount": 1, + }, + }, + ) + 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("veo/veo-3.0-generate-001", { + instances: [ + { + prompt: "a single red maple leaf falling onto still water, slow motion", + }, + ], + parameters: { + durationSeconds: 4, + generateAudio: false, + sampleCount: 1, + }, +}); +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/veo/veo-3.0-generate-001/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"instances\": [{\"prompt\":\"a single red maple leaf falling onto still water, slow motion\"}], \"parameters\": {\"durationSeconds\":4,\"generateAudio\":false,\"sampleCount\":1}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/veo/veo-3.0-generate-001/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/veo/veo-3.0-generate-001/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/veo/veo-3-1-fast-generate-001/code.mdx b/development/comfy-router/models/veo/veo-3-1-fast-generate-001/code.mdx index 880d42c48..93d8e8d88 100644 --- a/development/comfy-router/models/veo/veo-3-1-fast-generate-001/code.mdx +++ b/development/comfy-router/models/veo/veo-3-1-fast-generate-001/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Veo 3.1 Fast Generate 001" {/* GENERATED FILE. Generated from router-schemas/veo/veo-3.1-fast-generate-001.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `veo/veo-3.1-fast-generate-001`, served by Comfy Router from Veo. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/veo/veo-3.1-fast-generate-001` + + ```python Python from comfy_sdk import Comfy @@ -73,6 +76,97 @@ curl https://api.comfy.org/v2/models/veo/veo-3.1-fast-generate-001 \ -d "{\"instances\": [{\"prompt\":\"a single red maple leaf falling onto still water, slow motion\"}], \"parameters\": {\"durationSeconds\":4,\"generateAudio\":false,\"sampleCount\":1}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/veo/veo-3.1-fast-generate-001/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( + "veo/veo-3.1-fast-generate-001", + { + "instances": [ + { + "prompt": "a single red maple leaf falling onto still water, slow motion", + }, + ], + "parameters": { + "durationSeconds": 4, + "generateAudio": False, + "sampleCount": 1, + }, + }, + ) + 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("veo/veo-3.1-fast-generate-001", { + instances: [ + { + prompt: "a single red maple leaf falling onto still water, slow motion", + }, + ], + parameters: { + durationSeconds: 4, + generateAudio: false, + sampleCount: 1, + }, +}); +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/veo/veo-3.1-fast-generate-001/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"instances\": [{\"prompt\":\"a single red maple leaf falling onto still water, slow motion\"}], \"parameters\": {\"durationSeconds\":4,\"generateAudio\":false,\"sampleCount\":1}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/veo/veo-3.1-fast-generate-001/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/veo/veo-3.1-fast-generate-001/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/veo/veo-3-1-generate-001/code.mdx b/development/comfy-router/models/veo/veo-3-1-generate-001/code.mdx index 82a5e7a11..c8c7c3afd 100644 --- a/development/comfy-router/models/veo/veo-3-1-generate-001/code.mdx +++ b/development/comfy-router/models/veo/veo-3-1-generate-001/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Veo 3.1 Generate 001" {/* GENERATED FILE. Generated from router-schemas/veo/veo-3.1-generate-001.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `veo/veo-3.1-generate-001`, served by Comfy Router from Veo. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/veo/veo-3.1-generate-001` + + ```python Python from comfy_sdk import Comfy @@ -73,6 +76,97 @@ curl https://api.comfy.org/v2/models/veo/veo-3.1-generate-001 \ -d "{\"instances\": [{\"prompt\":\"a single red maple leaf falling onto still water, slow motion\"}], \"parameters\": {\"durationSeconds\":4,\"generateAudio\":false,\"sampleCount\":1}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/veo/veo-3.1-generate-001/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( + "veo/veo-3.1-generate-001", + { + "instances": [ + { + "prompt": "a single red maple leaf falling onto still water, slow motion", + }, + ], + "parameters": { + "durationSeconds": 4, + "generateAudio": False, + "sampleCount": 1, + }, + }, + ) + 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("veo/veo-3.1-generate-001", { + instances: [ + { + prompt: "a single red maple leaf falling onto still water, slow motion", + }, + ], + parameters: { + durationSeconds: 4, + generateAudio: false, + sampleCount: 1, + }, +}); +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/veo/veo-3.1-generate-001/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"instances\": [{\"prompt\":\"a single red maple leaf falling onto still water, slow motion\"}], \"parameters\": {\"durationSeconds\":4,\"generateAudio\":false,\"sampleCount\":1}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/veo/veo-3.1-generate-001/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/veo/veo-3.1-generate-001/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/veo/veo-3-1-lite-generate-001/code.mdx b/development/comfy-router/models/veo/veo-3-1-lite-generate-001/code.mdx index ad30c081c..8cf57a7e1 100644 --- a/development/comfy-router/models/veo/veo-3-1-lite-generate-001/code.mdx +++ b/development/comfy-router/models/veo/veo-3-1-lite-generate-001/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Veo 3.1 Lite Generate 001" {/* GENERATED FILE. Generated from router-schemas/veo/veo-3.1-lite-generate-001.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `veo/veo-3.1-lite-generate-001`, served by Comfy Router from Veo. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/veo/veo-3.1-lite-generate-001` + + ```python Python from comfy_sdk import Comfy @@ -73,6 +76,97 @@ curl https://api.comfy.org/v2/models/veo/veo-3.1-lite-generate-001 \ -d "{\"instances\": [{\"prompt\":\"a single red maple leaf falling onto still water, slow motion\"}], \"parameters\": {\"durationSeconds\":4,\"generateAudio\":false,\"sampleCount\":1}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/veo/veo-3.1-lite-generate-001/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( + "veo/veo-3.1-lite-generate-001", + { + "instances": [ + { + "prompt": "a single red maple leaf falling onto still water, slow motion", + }, + ], + "parameters": { + "durationSeconds": 4, + "generateAudio": False, + "sampleCount": 1, + }, + }, + ) + 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("veo/veo-3.1-lite-generate-001", { + instances: [ + { + prompt: "a single red maple leaf falling onto still water, slow motion", + }, + ], + parameters: { + durationSeconds: 4, + generateAudio: false, + sampleCount: 1, + }, +}); +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/veo/veo-3.1-lite-generate-001/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"instances\": [{\"prompt\":\"a single red maple leaf falling onto still water, slow motion\"}], \"parameters\": {\"durationSeconds\":4,\"generateAudio\":false,\"sampleCount\":1}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/veo/veo-3.1-lite-generate-001/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/veo/veo-3.1-lite-generate-001/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/happyhorse-1-0-i2v/code.mdx b/development/comfy-router/models/wan/happyhorse-1-0-i2v/code.mdx index 51209d114..b1592e983 100644 --- a/development/comfy-router/models/wan/happyhorse-1-0-i2v/code.mdx +++ b/development/comfy-router/models/wan/happyhorse-1-0-i2v/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "HappyHorse 1.0 I2V" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for HappyHorse 1.0 I2V. HappyHorse 1.0 image-to-video animates a still first frame and renders synchronized audio in the same pass. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/happyhorse-1.0-i2v` + + ```python Python from comfy_sdk import Comfy @@ -70,6 +73,95 @@ curl https://api.comfy.org/v2/models/wan/happyhorse-1.0-i2v \ -d "{\"input\": {\"prompt\":\"the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady\",\"img_url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/happyhorse-1.0-i2v/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( + "wan/happyhorse-1.0-i2v", + { + "input": { + "prompt": "the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady", + "img_url": "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + "parameters": { + "resolution": "720P", + "duration": 5, + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/happyhorse-1.0-i2v", { + input: { + prompt: "the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady", + img_url: "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + parameters: { + resolution: "720P", + duration: 5, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/happyhorse-1.0-i2v/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady\",\"img_url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/happyhorse-1.0-i2v/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/wan/happyhorse-1.0-i2v/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/happyhorse-1-0-r2v/code.mdx b/development/comfy-router/models/wan/happyhorse-1-0-r2v/code.mdx index d007b6ad7..50d891bbf 100644 --- a/development/comfy-router/models/wan/happyhorse-1-0-r2v/code.mdx +++ b/development/comfy-router/models/wan/happyhorse-1-0-r2v/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "HappyHorse 1.0 R2V" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for HappyHorse 1.0 R2V. HappyHorse 1.0 reference-to-video keeps the subjects of one or more reference images consistent across a new scene, addressed in the prompt as character1, character2 and so on. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/happyhorse-1.0-r2v` + + ```python Python from comfy_sdk import Comfy @@ -80,6 +83,105 @@ curl https://api.comfy.org/v2/models/wan/happyhorse-1.0-r2v \ -d "{\"input\": {\"prompt\":\"character1 walks in from the left, turns to the camera and waves, plain orange backdrop\",\"media\":[{\"type\":\"reference_image\",\"url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}]}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/happyhorse-1.0-r2v/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( + "wan/happyhorse-1.0-r2v", + { + "input": { + "prompt": "character1 walks in from the left, turns to the camera and waves, plain orange backdrop", + "media": [ + { + "type": "reference_image", + "url": "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + ], + }, + "parameters": { + "resolution": "720P", + "duration": 5, + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/happyhorse-1.0-r2v", { + input: { + prompt: "character1 walks in from the left, turns to the camera and waves, plain orange backdrop", + media: [ + { + type: "reference_image", + url: "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + ], + }, + parameters: { + resolution: "720P", + duration: 5, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/happyhorse-1.0-r2v/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"character1 walks in from the left, turns to the camera and waves, plain orange backdrop\",\"media\":[{\"type\":\"reference_image\",\"url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}]}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/happyhorse-1.0-r2v/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/wan/happyhorse-1.0-r2v/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/happyhorse-1-0-t2v/code.mdx b/development/comfy-router/models/wan/happyhorse-1-0-t2v/code.mdx index 2693fd44c..8f8bf3ea9 100644 --- a/development/comfy-router/models/wan/happyhorse-1-0-t2v/code.mdx +++ b/development/comfy-router/models/wan/happyhorse-1-0-t2v/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "HappyHorse 1.0 T2V" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for HappyHorse 1.0 T2V. HappyHorse 1.0 text-to-video builds a short video with synchronized audio from a prompt alone. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/happyhorse-1.0-t2v` + + ```python Python from comfy_sdk import Comfy @@ -68,6 +71,93 @@ curl https://api.comfy.org/v2/models/wan/happyhorse-1.0-t2v \ -d "{\"input\": {\"prompt\":\"a single red maple leaf falling onto still water, slow motion, shallow depth of field\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/happyhorse-1.0-t2v/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( + "wan/happyhorse-1.0-t2v", + { + "input": { + "prompt": "a single red maple leaf falling onto still water, slow motion, shallow depth of field", + }, + "parameters": { + "resolution": "720P", + "duration": 5, + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/happyhorse-1.0-t2v", { + input: { + prompt: "a single red maple leaf falling onto still water, slow motion, shallow depth of field", + }, + parameters: { + resolution: "720P", + duration: 5, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/happyhorse-1.0-t2v/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"a single red maple leaf falling onto still water, slow motion, shallow depth of field\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/happyhorse-1.0-t2v/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/wan/happyhorse-1.0-t2v/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/happyhorse-1-0-video-edit/code.mdx b/development/comfy-router/models/wan/happyhorse-1-0-video-edit/code.mdx index 2868ef7f4..c45a51b6e 100644 --- a/development/comfy-router/models/wan/happyhorse-1-0-video-edit/code.mdx +++ b/development/comfy-router/models/wan/happyhorse-1-0-video-edit/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "HappyHorse 1.0 Video Edit" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for HappyHorse 1.0 Video Edit. HappyHorse 1.0 video edit rewrites an existing clip from a text instruction, optionally guided by reference images. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/happyhorse-1.0-video-edit` + + ```python Python from comfy_sdk import Comfy @@ -78,6 +81,103 @@ curl https://api.comfy.org/v2/models/wan/happyhorse-1.0-video-edit \ -d "{\"input\": {\"prompt\":\"restyle the clip as a hand-drawn ink sketch, keep the dancer's movement unchanged\",\"media\":[{\"type\":\"video\",\"url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/street_dancer.mp4\"}]}, \"parameters\": {\"resolution\":\"720P\"}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/happyhorse-1.0-video-edit/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( + "wan/happyhorse-1.0-video-edit", + { + "input": { + "prompt": "restyle the clip as a hand-drawn ink sketch, keep the dancer's movement unchanged", + "media": [ + { + "type": "video", + "url": "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/street_dancer.mp4", + }, + ], + }, + "parameters": { + "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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/happyhorse-1.0-video-edit", { + input: { + prompt: "restyle the clip as a hand-drawn ink sketch, keep the dancer's movement unchanged", + media: [ + { + type: "video", + url: "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/street_dancer.mp4", + }, + ], + }, + parameters: { + 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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/happyhorse-1.0-video-edit/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"restyle the clip as a hand-drawn ink sketch, keep the dancer's movement unchanged\",\"media\":[{\"type\":\"video\",\"url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/street_dancer.mp4\"}]}, \"parameters\": {\"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/wan/happyhorse-1.0-video-edit/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/wan/happyhorse-1.0-video-edit/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/happyhorse-1-1-i2v/code.mdx b/development/comfy-router/models/wan/happyhorse-1-1-i2v/code.mdx index 9d3fce0bd..b661a912a 100644 --- a/development/comfy-router/models/wan/happyhorse-1-1-i2v/code.mdx +++ b/development/comfy-router/models/wan/happyhorse-1-1-i2v/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "HappyHorse 1.1 I2V" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for HappyHorse 1.1 I2V. HappyHorse 1.1 image-to-video animates a still first frame and renders synchronized dialogue, effects and music in the same pass. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/happyhorse-1.1-i2v` + + ```python Python from comfy_sdk import Comfy @@ -70,6 +73,95 @@ curl https://api.comfy.org/v2/models/wan/happyhorse-1.1-i2v \ -d "{\"input\": {\"prompt\":\"the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady\",\"img_url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/happyhorse-1.1-i2v/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( + "wan/happyhorse-1.1-i2v", + { + "input": { + "prompt": "the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady", + "img_url": "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + "parameters": { + "resolution": "720P", + "duration": 5, + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/happyhorse-1.1-i2v", { + input: { + prompt: "the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady", + img_url: "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + parameters: { + resolution: "720P", + duration: 5, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/happyhorse-1.1-i2v/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady\",\"img_url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/happyhorse-1.1-i2v/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/wan/happyhorse-1.1-i2v/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/happyhorse-1-1-r2v/code.mdx b/development/comfy-router/models/wan/happyhorse-1-1-r2v/code.mdx index 37765d89c..8c31592f4 100644 --- a/development/comfy-router/models/wan/happyhorse-1-1-r2v/code.mdx +++ b/development/comfy-router/models/wan/happyhorse-1-1-r2v/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "HappyHorse 1.1 R2V" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for HappyHorse 1.1 R2V. HappyHorse 1.1 reference-to-video keeps the subjects of up to nine reference images consistent across a new scene, addressed in the prompt as character1, character2 and so on. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/happyhorse-1.1-r2v` + + ```python Python from comfy_sdk import Comfy @@ -80,6 +83,105 @@ curl https://api.comfy.org/v2/models/wan/happyhorse-1.1-r2v \ -d "{\"input\": {\"prompt\":\"character1 walks in from the left, turns to the camera and waves, plain orange backdrop\",\"media\":[{\"type\":\"reference_image\",\"url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}]}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/happyhorse-1.1-r2v/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( + "wan/happyhorse-1.1-r2v", + { + "input": { + "prompt": "character1 walks in from the left, turns to the camera and waves, plain orange backdrop", + "media": [ + { + "type": "reference_image", + "url": "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + ], + }, + "parameters": { + "resolution": "720P", + "duration": 5, + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/happyhorse-1.1-r2v", { + input: { + prompt: "character1 walks in from the left, turns to the camera and waves, plain orange backdrop", + media: [ + { + type: "reference_image", + url: "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + ], + }, + parameters: { + resolution: "720P", + duration: 5, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/happyhorse-1.1-r2v/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"character1 walks in from the left, turns to the camera and waves, plain orange backdrop\",\"media\":[{\"type\":\"reference_image\",\"url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}]}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/happyhorse-1.1-r2v/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/wan/happyhorse-1.1-r2v/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/happyhorse-1-1-t2v/code.mdx b/development/comfy-router/models/wan/happyhorse-1-1-t2v/code.mdx index 4b8d24b73..4bcc37983 100644 --- a/development/comfy-router/models/wan/happyhorse-1-1-t2v/code.mdx +++ b/development/comfy-router/models/wan/happyhorse-1-1-t2v/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "HappyHorse 1.1 T2V" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for HappyHorse 1.1 T2V. HappyHorse 1.1 text-to-video builds a short video with synchronized dialogue, effects and music from a prompt alone. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/happyhorse-1.1-t2v` + + ```python Python from comfy_sdk import Comfy @@ -68,6 +71,93 @@ curl https://api.comfy.org/v2/models/wan/happyhorse-1.1-t2v \ -d "{\"input\": {\"prompt\":\"a single red maple leaf falling onto still water, slow motion, shallow depth of field\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/happyhorse-1.1-t2v/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( + "wan/happyhorse-1.1-t2v", + { + "input": { + "prompt": "a single red maple leaf falling onto still water, slow motion, shallow depth of field", + }, + "parameters": { + "resolution": "720P", + "duration": 5, + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/happyhorse-1.1-t2v", { + input: { + prompt: "a single red maple leaf falling onto still water, slow motion, shallow depth of field", + }, + parameters: { + resolution: "720P", + duration: 5, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/happyhorse-1.1-t2v/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"a single red maple leaf falling onto still water, slow motion, shallow depth of field\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/happyhorse-1.1-t2v/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/wan/happyhorse-1.1-t2v/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/wan2-5-i2i-preview/code.mdx b/development/comfy-router/models/wan/wan2-5-i2i-preview/code.mdx index 079b81ab4..e54eb735e 100644 --- a/development/comfy-router/models/wan/wan2-5-i2i-preview/code.mdx +++ b/development/comfy-router/models/wan/wan2-5-i2i-preview/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Wan 2.5 I2I Preview" {/* GENERATED FILE. Generated from router-schemas/wan/wan2.5-i2i-preview.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `wan/wan2.5-i2i-preview`, served by Comfy Router from Wan. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/wan2.5-i2i-preview` + + ```python Python from comfy_sdk import Comfy @@ -69,6 +72,93 @@ curl https://api.comfy.org/v2/models/wan/wan2.5-i2i-preview \ -d "{\"input\": {\"images\":[\"https://example.invalid/red-maple-leaf.png\"],\"prompt\":\"Make the leaf golden.\"}, \"parameters\": {\"n\":1,\"size\":\"768*768\"}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/wan2.5-i2i-preview/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( + "wan/wan2.5-i2i-preview", + { + "input": { + "images": ["https://example.invalid/red-maple-leaf.png"], + "prompt": "Make the leaf golden.", + }, + "parameters": { + "n": 1, + "size": "768*768", + }, + }, + ) + 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("wan/wan2.5-i2i-preview", { + input: { + images: ["https://example.invalid/red-maple-leaf.png"], + prompt: "Make the leaf golden.", + }, + parameters: { + n: 1, + size: "768*768", + }, +}); +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/wan/wan2.5-i2i-preview/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"images\":[\"https://example.invalid/red-maple-leaf.png\"],\"prompt\":\"Make the leaf golden.\"}, \"parameters\": {\"n\":1,\"size\":\"768*768\"}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/wan2.5-i2i-preview/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/wan/wan2.5-i2i-preview/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/wan2-5-i2v-preview/code.mdx b/development/comfy-router/models/wan/wan2-5-i2v-preview/code.mdx index 98887e134..3c0e2dd04 100644 --- a/development/comfy-router/models/wan/wan2-5-i2v-preview/code.mdx +++ b/development/comfy-router/models/wan/wan2-5-i2v-preview/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Wan 2.5 I2V Preview" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Wan 2.5 I2V Preview. Wan 2.5 image-to-video turns a still first frame into a short video, with the motion and the camera move described by the prompt. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/wan2.5-i2v-preview` + + ```python Python from comfy_sdk import Comfy @@ -70,6 +73,95 @@ curl https://api.comfy.org/v2/models/wan/wan2.5-i2v-preview \ -d "{\"input\": {\"prompt\":\"the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady\",\"img_url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/wan2.5-i2v-preview/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( + "wan/wan2.5-i2v-preview", + { + "input": { + "prompt": "the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady", + "img_url": "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + "parameters": { + "resolution": "720P", + "duration": 5, + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/wan2.5-i2v-preview", { + input: { + prompt: "the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady", + img_url: "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + parameters: { + resolution: "720P", + duration: 5, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/wan2.5-i2v-preview/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady\",\"img_url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/wan2.5-i2v-preview/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/wan/wan2.5-i2v-preview/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/wan2-5-t2i-preview/code.mdx b/development/comfy-router/models/wan/wan2-5-t2i-preview/code.mdx index 9aff42d19..df4447e2d 100644 --- a/development/comfy-router/models/wan/wan2-5-t2i-preview/code.mdx +++ b/development/comfy-router/models/wan/wan2-5-t2i-preview/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Wan 2.5 T2I Preview" {/* GENERATED FILE. Generated from router-schemas/wan/wan2.5-t2i-preview.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `wan/wan2.5-t2i-preview`, served by Comfy Router from Wan. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/wan2.5-t2i-preview` + + ```python Python from comfy_sdk import Comfy @@ -67,6 +70,91 @@ curl https://api.comfy.org/v2/models/wan/wan2.5-t2i-preview \ -d "{\"input\": {\"prompt\":\"A single red maple leaf on a plain white background.\"}, \"parameters\": {\"n\":1,\"size\":\"1280*1280\"}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/wan2.5-t2i-preview/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( + "wan/wan2.5-t2i-preview", + { + "input": { + "prompt": "A single red maple leaf on a plain white background.", + }, + "parameters": { + "n": 1, + "size": "1280*1280", + }, + }, + ) + 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("wan/wan2.5-t2i-preview", { + input: { + prompt: "A single red maple leaf on a plain white background.", + }, + parameters: { + n: 1, + size: "1280*1280", + }, +}); +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/wan/wan2.5-t2i-preview/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"A single red maple leaf on a plain white background.\"}, \"parameters\": {\"n\":1,\"size\":\"1280*1280\"}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/wan2.5-t2i-preview/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/wan/wan2.5-t2i-preview/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/wan2-5-t2v-preview/code.mdx b/development/comfy-router/models/wan/wan2-5-t2v-preview/code.mdx index 75eb883e9..125cff394 100644 --- a/development/comfy-router/models/wan/wan2-5-t2v-preview/code.mdx +++ b/development/comfy-router/models/wan/wan2-5-t2v-preview/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Wan 2.5 T2V Preview" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Wan 2.5 T2V Preview. Wan 2.5 text-to-video builds a short video from a prompt alone, with no reference image or video. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/wan2.5-t2v-preview` + + ```python Python from comfy_sdk import Comfy @@ -68,6 +71,93 @@ curl https://api.comfy.org/v2/models/wan/wan2.5-t2v-preview \ -d "{\"input\": {\"prompt\":\"a single red maple leaf falling onto still water, slow motion, shallow depth of field\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/wan2.5-t2v-preview/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( + "wan/wan2.5-t2v-preview", + { + "input": { + "prompt": "a single red maple leaf falling onto still water, slow motion, shallow depth of field", + }, + "parameters": { + "resolution": "720P", + "duration": 5, + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/wan2.5-t2v-preview", { + input: { + prompt: "a single red maple leaf falling onto still water, slow motion, shallow depth of field", + }, + parameters: { + resolution: "720P", + duration: 5, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/wan2.5-t2v-preview/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"a single red maple leaf falling onto still water, slow motion, shallow depth of field\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/wan2.5-t2v-preview/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/wan/wan2.5-t2v-preview/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/wan2-6-i2v/code.mdx b/development/comfy-router/models/wan/wan2-6-i2v/code.mdx index bdfa27f15..e424df241 100644 --- a/development/comfy-router/models/wan/wan2-6-i2v/code.mdx +++ b/development/comfy-router/models/wan/wan2-6-i2v/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Wan 2.6 I2V" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Wan 2.6 I2V. Wan 2.6 image-to-video animates a still first frame, at 720P or 1080P and up to 15 seconds. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/wan2.6-i2v` + + ```python Python from comfy_sdk import Comfy @@ -70,6 +73,95 @@ curl https://api.comfy.org/v2/models/wan/wan2.6-i2v \ -d "{\"input\": {\"prompt\":\"the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady\",\"img_url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/wan2.6-i2v/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( + "wan/wan2.6-i2v", + { + "input": { + "prompt": "the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady", + "img_url": "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + "parameters": { + "resolution": "720P", + "duration": 5, + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/wan2.6-i2v", { + input: { + prompt: "the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady", + img_url: "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + parameters: { + resolution: "720P", + duration: 5, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/wan2.6-i2v/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady\",\"img_url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/wan2.6-i2v/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/wan/wan2.6-i2v/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/wan2-6-r2v/code.mdx b/development/comfy-router/models/wan/wan2-6-r2v/code.mdx index a6b29779f..55a681769 100644 --- a/development/comfy-router/models/wan/wan2-6-r2v/code.mdx +++ b/development/comfy-router/models/wan/wan2-6-r2v/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Wan 2.6 R2V" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Wan 2.6 R2V. Wan 2.6 reference-to-video carries the subjects of one to three reference videos into a new scene, addressed in the prompt as character1, character2 and so on. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/wan2.6-r2v` + + ```python Python from comfy_sdk import Comfy @@ -70,6 +73,95 @@ curl https://api.comfy.org/v2/models/wan/wan2.6-r2v \ -d "{\"input\": {\"prompt\":\"character1 walks in from the left, turns to the camera and waves, plain orange backdrop\",\"reference_video_urls\":[\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/street_dancer.mp4\"]}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/wan2.6-r2v/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( + "wan/wan2.6-r2v", + { + "input": { + "prompt": "character1 walks in from the left, turns to the camera and waves, plain orange backdrop", + "reference_video_urls": ["https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/street_dancer.mp4"], + }, + "parameters": { + "resolution": "720P", + "duration": 5, + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/wan2.6-r2v", { + input: { + prompt: "character1 walks in from the left, turns to the camera and waves, plain orange backdrop", + reference_video_urls: ["https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/street_dancer.mp4"], + }, + parameters: { + resolution: "720P", + duration: 5, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/wan2.6-r2v/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"character1 walks in from the left, turns to the camera and waves, plain orange backdrop\",\"reference_video_urls\":[\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/street_dancer.mp4\"]}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/wan2.6-r2v/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/wan/wan2.6-r2v/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/wan2-6-t2v/code.mdx b/development/comfy-router/models/wan/wan2-6-t2v/code.mdx index 80bd93dd1..793267f49 100644 --- a/development/comfy-router/models/wan/wan2-6-t2v/code.mdx +++ b/development/comfy-router/models/wan/wan2-6-t2v/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Wan 2.6 T2V" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Wan 2.6 T2V. Wan 2.6 text-to-video builds a short video from a prompt alone, at 720P or 1080P and up to 15 seconds. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/wan2.6-t2v` + + ```python Python from comfy_sdk import Comfy @@ -68,6 +71,93 @@ curl https://api.comfy.org/v2/models/wan/wan2.6-t2v \ -d "{\"input\": {\"prompt\":\"a single red maple leaf falling onto still water, slow motion, shallow depth of field\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/wan2.6-t2v/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( + "wan/wan2.6-t2v", + { + "input": { + "prompt": "a single red maple leaf falling onto still water, slow motion, shallow depth of field", + }, + "parameters": { + "resolution": "720P", + "duration": 5, + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/wan2.6-t2v", { + input: { + prompt: "a single red maple leaf falling onto still water, slow motion, shallow depth of field", + }, + parameters: { + resolution: "720P", + duration: 5, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/wan2.6-t2v/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"a single red maple leaf falling onto still water, slow motion, shallow depth of field\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/wan2.6-t2v/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/wan/wan2.6-t2v/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/wan2-7-i2v/code.mdx b/development/comfy-router/models/wan/wan2-7-i2v/code.mdx index e38a8bd1d..b2a575a0f 100644 --- a/development/comfy-router/models/wan/wan2-7-i2v/code.mdx +++ b/development/comfy-router/models/wan/wan2-7-i2v/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Wan 2.7 I2V" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Wan 2.7 I2V. Wan 2.7 image-to-video animates a first frame supplied through the media list, which also accepts a last frame, a driving audio track and an opening clip. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/wan2.7-i2v` + + ```python Python from comfy_sdk import Comfy @@ -80,6 +83,105 @@ curl https://api.comfy.org/v2/models/wan/wan2.7-i2v \ -d "{\"input\": {\"prompt\":\"the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady\",\"media\":[{\"type\":\"first_frame\",\"url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}]}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/wan2.7-i2v/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( + "wan/wan2.7-i2v", + { + "input": { + "prompt": "the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady", + "media": [ + { + "type": "first_frame", + "url": "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + ], + }, + "parameters": { + "resolution": "720P", + "duration": 5, + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/wan2.7-i2v", { + input: { + prompt: "the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady", + media: [ + { + type: "first_frame", + url: "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + ], + }, + parameters: { + resolution: "720P", + duration: 5, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/wan2.7-i2v/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady\",\"media\":[{\"type\":\"first_frame\",\"url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}]}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/wan2.7-i2v/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/wan/wan2.7-i2v/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/wan2-7-r2v/code.mdx b/development/comfy-router/models/wan/wan2-7-r2v/code.mdx index bfdffcab4..4ca00f256 100644 --- a/development/comfy-router/models/wan/wan2-7-r2v/code.mdx +++ b/development/comfy-router/models/wan/wan2-7-r2v/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Wan 2.7 R2V" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Wan 2.7 R2V. Wan 2.7 reference-to-video carries subjects from reference images and reference videos into a new scene, addressed in the prompt as character1, character2 and so on. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/wan2.7-r2v` + + ```python Python from comfy_sdk import Comfy @@ -80,6 +83,105 @@ curl https://api.comfy.org/v2/models/wan/wan2.7-r2v \ -d "{\"input\": {\"prompt\":\"character1 walks in from the left, turns to the camera and waves, plain orange backdrop\",\"media\":[{\"type\":\"reference_image\",\"url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}]}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/wan2.7-r2v/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( + "wan/wan2.7-r2v", + { + "input": { + "prompt": "character1 walks in from the left, turns to the camera and waves, plain orange backdrop", + "media": [ + { + "type": "reference_image", + "url": "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + ], + }, + "parameters": { + "resolution": "720P", + "duration": 5, + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/wan2.7-r2v", { + input: { + prompt: "character1 walks in from the left, turns to the camera and waves, plain orange backdrop", + media: [ + { + type: "reference_image", + url: "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + ], + }, + parameters: { + resolution: "720P", + duration: 5, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/wan2.7-r2v/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"character1 walks in from the left, turns to the camera and waves, plain orange backdrop\",\"media\":[{\"type\":\"reference_image\",\"url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}]}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/wan2.7-r2v/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/wan/wan2.7-r2v/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/wan2-7-t2v/code.mdx b/development/comfy-router/models/wan/wan2-7-t2v/code.mdx index e16b0c3b0..53d4a0f10 100644 --- a/development/comfy-router/models/wan/wan2-7-t2v/code.mdx +++ b/development/comfy-router/models/wan/wan2-7-t2v/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Wan 2.7 T2V" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Wan 2.7 T2V. Wan 2.7 text-to-video builds a short video from a prompt alone, at 720P or 1080P and 2 to 15 seconds. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/wan2.7-t2v` + + ```python Python from comfy_sdk import Comfy @@ -68,6 +71,93 @@ curl https://api.comfy.org/v2/models/wan/wan2.7-t2v \ -d "{\"input\": {\"prompt\":\"a single red maple leaf falling onto still water, slow motion, shallow depth of field\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/wan2.7-t2v/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( + "wan/wan2.7-t2v", + { + "input": { + "prompt": "a single red maple leaf falling onto still water, slow motion, shallow depth of field", + }, + "parameters": { + "resolution": "720P", + "duration": 5, + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/wan2.7-t2v", { + input: { + prompt: "a single red maple leaf falling onto still water, slow motion, shallow depth of field", + }, + parameters: { + resolution: "720P", + duration: 5, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/wan2.7-t2v/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"a single red maple leaf falling onto still water, slow motion, shallow depth of field\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/wan2.7-t2v/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/wan/wan2.7-t2v/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/wan2-7-videoedit/code.mdx b/development/comfy-router/models/wan/wan2-7-videoedit/code.mdx index 7ed0970f2..57efd9344 100644 --- a/development/comfy-router/models/wan/wan2-7-videoedit/code.mdx +++ b/development/comfy-router/models/wan/wan2-7-videoedit/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Wan 2.7 Video Edit" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Wan 2.7 Video Edit. Wan 2.7 video edit rewrites an existing clip from a text instruction, optionally guided by reference images. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/wan2.7-videoedit` + + ```python Python from comfy_sdk import Comfy @@ -80,6 +83,105 @@ curl https://api.comfy.org/v2/models/wan/wan2.7-videoedit \ -d "{\"input\": {\"prompt\":\"restyle the clip as a hand-drawn ink sketch, keep the dancer's movement unchanged\",\"media\":[{\"type\":\"video\",\"url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/street_dancer.mp4\"}]}, \"parameters\": {\"resolution\":\"720P\",\"audio_setting\":\"origin\"}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/wan2.7-videoedit/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( + "wan/wan2.7-videoedit", + { + "input": { + "prompt": "restyle the clip as a hand-drawn ink sketch, keep the dancer's movement unchanged", + "media": [ + { + "type": "video", + "url": "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/street_dancer.mp4", + }, + ], + }, + "parameters": { + "resolution": "720P", + "audio_setting": "origin", + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/wan2.7-videoedit", { + input: { + prompt: "restyle the clip as a hand-drawn ink sketch, keep the dancer's movement unchanged", + media: [ + { + type: "video", + url: "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/street_dancer.mp4", + }, + ], + }, + parameters: { + resolution: "720P", + audio_setting: "origin", + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/wan2.7-videoedit/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"restyle the clip as a hand-drawn ink sketch, keep the dancer's movement unchanged\",\"media\":[{\"type\":\"video\",\"url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/street_dancer.mp4\"}]}, \"parameters\": {\"resolution\":\"720P\",\"audio_setting\":\"origin\"}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/wan2.7-videoedit/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/wan/wan2.7-videoedit/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/wan3-0-video-prime/code.mdx b/development/comfy-router/models/wan/wan3-0-video-prime/code.mdx index ecdd1bbbe..801127cba 100644 --- a/development/comfy-router/models/wan/wan3-0-video-prime/code.mdx +++ b/development/comfy-router/models/wan/wan3-0-video-prime/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Wan 3.0 Video Prime" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Wan 3.0 Video Prime. Wan 3.0 Video Prime is the higher-quality tier of Wan 3.0 Video, validated against the same Router prompt and media schema. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/wan3.0-video-prime` + + ```python Python from comfy_sdk import Comfy @@ -68,6 +71,93 @@ curl https://api.comfy.org/v2/models/wan/wan3.0-video-prime \ -d "{\"input\": {\"prompt\":\"a single red maple leaf falling onto still water, slow motion, shallow depth of field\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/wan3.0-video-prime/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( + "wan/wan3.0-video-prime", + { + "input": { + "prompt": "a single red maple leaf falling onto still water, slow motion, shallow depth of field", + }, + "parameters": { + "resolution": "720P", + "duration": 5, + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/wan3.0-video-prime", { + input: { + prompt: "a single red maple leaf falling onto still water, slow motion, shallow depth of field", + }, + parameters: { + resolution: "720P", + duration: 5, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/wan3.0-video-prime/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"a single red maple leaf falling onto still water, slow motion, shallow depth of field\"}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/wan3.0-video-prime/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/wan/wan3.0-video-prime/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wan/wan3-0-video/code.mdx b/development/comfy-router/models/wan/wan3-0-video/code.mdx index f9be9ce0a..d76a2103d 100644 --- a/development/comfy-router/models/wan/wan3-0-video/code.mdx +++ b/development/comfy-router/models/wan/wan3-0-video/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Wan 3.0 Video" {/* GENERATED FILE. Edit code.yaml in this directory and run `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for Wan 3.0 Video. Wan 3.0 Video generates from a prompt alone or from a media list of first and last frames, reference images, videos and audio, addressed in the prompt as Image 1, Video 1 and Audio 1. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wan/wan3.0-video` + + ```python Python from comfy_sdk import Comfy @@ -80,6 +83,105 @@ curl https://api.comfy.org/v2/models/wan/wan3.0-video \ -d "{\"input\": {\"prompt\":\"the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady\",\"media\":[{\"type\":\"first_frame\",\"url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}]}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wan/wan3.0-video/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( + "wan/wan3.0-video", + { + "input": { + "prompt": "the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady", + "media": [ + { + "type": "first_frame", + "url": "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + ], + }, + "parameters": { + "resolution": "720P", + "duration": 5, + }, + }, + ) + 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("video:", result["output"]["video_url"]) +``` + +```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. +type Result = { output: { video_url: string } }; +const handle = await comfy.models.submit("wan/wan3.0-video", { + input: { + prompt: "the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady", + media: [ + { + type: "first_frame", + url: "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png", + }, + ], + }, + parameters: { + resolution: "720P", + duration: 5, + }, +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("video:", result.data.output.video_url); +``` + +```bash cURL +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl https://api.comfy.org/v2/models/wan/wan3.0-video/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"input\": {\"prompt\":\"the robot lowers its raised arm and steps toward the camera, the flat orange backdrop holds steady\",\"media\":[{\"type\":\"first_frame\",\"url\":\"https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/pink_robot_front.png\"}]}, \"parameters\": {\"resolution\":\"720P\",\"duration\":5}}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wan/wan3.0-video/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/wan/wan3.0-video/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wavespeed/flashvsr/code.mdx b/development/comfy-router/models/wavespeed/flashvsr/code.mdx index d92640b3d..51aa03116 100644 --- a/development/comfy-router/models/wavespeed/flashvsr/code.mdx +++ b/development/comfy-router/models/wavespeed/flashvsr/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Flashvsr" {/* GENERATED FILE. Generated from router-schemas/wavespeed/flashvsr.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `wavespeed/flashvsr`, served by Comfy Router from WaveSpeed. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wavespeed/flashvsr` + + ```python Python from comfy_sdk import Comfy @@ -59,6 +62,83 @@ curl https://api.comfy.org/v2/models/wavespeed/flashvsr \ -d "{\"duration\": 4, \"target_resolution\": \"1080p\", \"video\": \"https://samplelib.com/mp4/sample-30s.mp4\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wavespeed/flashvsr/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( + "wavespeed/flashvsr", + { + "duration": 4, + "target_resolution": "1080p", + "video": "https://samplelib.com/mp4/sample-30s.mp4", + }, + ) + 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("wavespeed/flashvsr", { + duration: 4, + target_resolution: "1080p", + video: "https://samplelib.com/mp4/sample-30s.mp4", +}); +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/wavespeed/flashvsr/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"duration\": 4, \"target_resolution\": \"1080p\", \"video\": \"https://samplelib.com/mp4/sample-30s.mp4\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wavespeed/flashvsr/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/wavespeed/flashvsr/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wavespeed/seedvr2/code.mdx b/development/comfy-router/models/wavespeed/seedvr2/code.mdx index 3741c9990..af6cb7bbf 100644 --- a/development/comfy-router/models/wavespeed/seedvr2/code.mdx +++ b/development/comfy-router/models/wavespeed/seedvr2/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Seedvr 2" {/* GENERATED FILE. Generated from router-schemas/wavespeed/seedvr2.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `wavespeed/seedvr2`, served by Comfy Router from WaveSpeed. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wavespeed/seedvr2` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/wavespeed/seedvr2 \ -d "{\"image\": \"https://images.pexels.com/photos/346529/pexels-photo-346529.jpeg\", \"target_resolution\": \"4k\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wavespeed/seedvr2/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( + "wavespeed/seedvr2", + { + "image": "https://images.pexels.com/photos/346529/pexels-photo-346529.jpeg", + "target_resolution": "4k", + }, + ) + 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("wavespeed/seedvr2", { + image: "https://images.pexels.com/photos/346529/pexels-photo-346529.jpeg", + target_resolution: "4k", +}); +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/wavespeed/seedvr2/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"image\": \"https://images.pexels.com/photos/346529/pexels-photo-346529.jpeg\", \"target_resolution\": \"4k\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wavespeed/seedvr2/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/wavespeed/seedvr2/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/wavespeed/ultimate-image-upscaler/code.mdx b/development/comfy-router/models/wavespeed/ultimate-image-upscaler/code.mdx index 8bb01aef5..a1823cb81 100644 --- a/development/comfy-router/models/wavespeed/ultimate-image-upscaler/code.mdx +++ b/development/comfy-router/models/wavespeed/ultimate-image-upscaler/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Ultimate Image Upscaler" {/* GENERATED FILE. Generated from router-schemas/wavespeed/ultimate-image-upscaler.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `wavespeed/ultimate-image-upscaler`, served by Comfy Router from WaveSpeed. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/wavespeed/ultimate-image-upscaler` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/wavespeed/ultimate-image-upscaler \ -d "{\"image\": \"https://images.pexels.com/photos/346529/pexels-photo-346529.jpeg\", \"target_resolution\": \"4k\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/wavespeed/ultimate-image-upscaler/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( + "wavespeed/ultimate-image-upscaler", + { + "image": "https://images.pexels.com/photos/346529/pexels-photo-346529.jpeg", + "target_resolution": "4k", + }, + ) + 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("wavespeed/ultimate-image-upscaler", { + image: "https://images.pexels.com/photos/346529/pexels-photo-346529.jpeg", + target_resolution: "4k", +}); +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/wavespeed/ultimate-image-upscaler/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"image\": \"https://images.pexels.com/photos/346529/pexels-photo-346529.jpeg\", \"target_resolution\": \"4k\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/wavespeed/ultimate-image-upscaler/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/wavespeed/ultimate-image-upscaler/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 48c5fddc9..7f0961b88 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 @@ -6,6 +6,7 @@ sidebarTitle: "Grok Imagine Image 2.0" {/* GENERATED FILE. Generated from router-schemas/xai/grok-imagine-image-2.0.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `xai/grok-imagine-image-2.0`, served by Comfy Router from xAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/xai/grok-imagine-image-2.0` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/xai/grok-imagine-image-2.0 \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/xai/grok-imagine-image-2.0/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( + "xai/grok-imagine-image-2.0", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("xai/grok-imagine-image-2.0", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/xai/grok-imagine-image-2.0/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/xai/grok-imagine-image-2.0/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/xai/grok-imagine-image-2.0/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 786f0a39d..09a286cde 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 @@ -6,6 +6,7 @@ sidebarTitle: "Grok Imagine Image Pro" {/* GENERATED FILE. Generated from router-schemas/xai/grok-imagine-image-pro.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `xai/grok-imagine-image-pro`, served by Comfy Router from xAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/xai/grok-imagine-image-pro` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/xai/grok-imagine-image-pro \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/xai/grok-imagine-image-pro/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( + "xai/grok-imagine-image-pro", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("xai/grok-imagine-image-pro", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/xai/grok-imagine-image-pro/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/xai/grok-imagine-image-pro/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/xai/grok-imagine-image-pro/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 4be26d43b..3838e150e 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 @@ -6,6 +6,7 @@ sidebarTitle: "Grok Imagine Image Quality" {/* GENERATED FILE. Generated from router-schemas/xai/grok-imagine-image-quality.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `xai/grok-imagine-image-quality`, served by Comfy Router from xAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/xai/grok-imagine-image-quality` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/xai/grok-imagine-image-quality \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/xai/grok-imagine-image-quality/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( + "xai/grok-imagine-image-quality", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("xai/grok-imagine-image-quality", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/xai/grok-imagine-image-quality/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/xai/grok-imagine-image-quality/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/xai/grok-imagine-image-quality/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema 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 4278f475a..7304cf367 100644 --- a/development/comfy-router/models/xai/grok-imagine-image/code.mdx +++ b/development/comfy-router/models/xai/grok-imagine-image/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Grok Imagine Image" {/* GENERATED FILE. Generated from router-schemas/xai/grok-imagine-image.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `xai/grok-imagine-image`, served by Comfy Router from xAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/xai/grok-imagine-image` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/xai/grok-imagine-image \ -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/xai/grok-imagine-image/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( + "xai/grok-imagine-image", + { + "n": 1, + "prompt": "A single red maple leaf on a plain white background.", + }, + ) + 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("xai/grok-imagine-image", { + n: 1, + prompt: "A single red maple leaf on a plain white background.", +}); +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/xai/grok-imagine-image/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"n\": 1, \"prompt\": \"A single red maple leaf on a plain white background.\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/xai/grok-imagine-image/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/xai/grok-imagine-image/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/xai/grok-imagine-video-1-5-preview/code.mdx b/development/comfy-router/models/xai/grok-imagine-video-1-5-preview/code.mdx index 0e68d2aae..959a8b7d9 100644 --- a/development/comfy-router/models/xai/grok-imagine-video-1-5-preview/code.mdx +++ b/development/comfy-router/models/xai/grok-imagine-video-1-5-preview/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Grok Imagine Video 1.5 Preview" {/* GENERATED FILE. Generated from router-schemas/xai/grok-imagine-video-1.5-preview.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `xai/grok-imagine-video-1.5-preview`, served by Comfy Router from xAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/xai/grok-imagine-video-1.5-preview` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/xai/grok-imagine-video-1.5-preview \ -d "{\"duration\": 4, \"prompt\": \"a single red maple leaf falling onto still water, slow motion\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/xai/grok-imagine-video-1.5-preview/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( + "xai/grok-imagine-video-1.5-preview", + { + "duration": 4, + "prompt": "a single red maple leaf falling onto still water, slow motion", + }, + ) + 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("xai/grok-imagine-video-1.5-preview", { + duration: 4, + prompt: "a single red maple leaf falling onto still water, slow motion", +}); +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/xai/grok-imagine-video-1.5-preview/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"duration\": 4, \"prompt\": \"a single red maple leaf falling onto still water, slow motion\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/xai/grok-imagine-video-1.5-preview/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/xai/grok-imagine-video-1.5-preview/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/xai/grok-imagine-video-1-5/code.mdx b/development/comfy-router/models/xai/grok-imagine-video-1-5/code.mdx index 8bc96b542..634ca29da 100644 --- a/development/comfy-router/models/xai/grok-imagine-video-1-5/code.mdx +++ b/development/comfy-router/models/xai/grok-imagine-video-1-5/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Grok Imagine Video 1.5" {/* GENERATED FILE. Generated from router-schemas/xai/grok-imagine-video-1.5.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `xai/grok-imagine-video-1.5`, served by Comfy Router from xAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/xai/grok-imagine-video-1.5` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/xai/grok-imagine-video-1.5 \ -d "{\"duration\": 4, \"prompt\": \"a single red maple leaf falling onto still water, slow motion\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/xai/grok-imagine-video-1.5/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( + "xai/grok-imagine-video-1.5", + { + "duration": 4, + "prompt": "a single red maple leaf falling onto still water, slow motion", + }, + ) + 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("xai/grok-imagine-video-1.5", { + duration: 4, + prompt: "a single red maple leaf falling onto still water, slow motion", +}); +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/xai/grok-imagine-video-1.5/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"duration\": 4, \"prompt\": \"a single red maple leaf falling onto still water, slow motion\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/xai/grok-imagine-video-1.5/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/xai/grok-imagine-video-1.5/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/models/xai/grok-imagine-video/code.mdx b/development/comfy-router/models/xai/grok-imagine-video/code.mdx index a0a3404f1..56637d847 100644 --- a/development/comfy-router/models/xai/grok-imagine-video/code.mdx +++ b/development/comfy-router/models/xai/grok-imagine-video/code.mdx @@ -6,6 +6,7 @@ sidebarTitle: "Grok Imagine Video" {/* GENERATED FILE. Generated from router-schemas/xai/grok-imagine-video.json by `pnpm code-pages:gen`. */} +import QueuedDeliveryNotice from "/snippets/comfy-router/queue-preview-notice.mdx"; import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx"; API Reference for `xai/grok-imagine-video`, served by Comfy Router from xAI. @@ -18,6 +19,8 @@ Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-ke **Endpoint:** `POST https://api.comfy.org/v2/models/xai/grok-imagine-video` + + ```python Python from comfy_sdk import Comfy @@ -57,6 +60,81 @@ curl https://api.comfy.org/v2/models/xai/grok-imagine-video \ -d "{\"duration\": 4, \"prompt\": \"a single red maple leaf falling onto still water, slow motion\"}" ``` + + + + +The same body, sent to `POST https://api.comfy.org/v2/models/xai/grok-imagine-video/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( + "xai/grok-imagine-video", + { + "duration": 4, + "prompt": "a single red maple leaf falling onto still water, slow motion", + }, + ) + 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("xai/grok-imagine-video", { + duration: 4, + prompt: "a single red maple leaf falling onto still water, slow motion", +}); +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/xai/grok-imagine-video/requests \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d "{\"duration\": 4, \"prompt\": \"a single red maple leaf falling onto still water, slow motion\"}" + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i https://api.comfy.org/v2/models/xai/grok-imagine-video/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/xai/grok-imagine-video/requests/$REQUEST_ID \ + -H "X-API-Key: $COMFY_API_KEY" +``` + + + ## Schema diff --git a/development/comfy-router/queue.mdx b/development/comfy-router/queue.mdx new file mode 100644 index 000000000..a42143370 --- /dev/null +++ b/development/comfy-router/queue.mdx @@ -0,0 +1,296 @@ +--- +title: "Queued delivery" +sidebarTitle: "Queued delivery (preview)" +description: "Submit a Comfy Router request, get a request ID back at once, then follow its status, collect the result or cancel it. Python, TypeScript and cURL, using the SDKs' submit, subscribe and handle." +--- + + +**Gated preview.** Queued delivery is switched on per workspace. A workspace that is not enabled receives `403` with `X-Comfy-Error-Type: not_enabled` on the submit route. Nothing about the request is wrong and retrying will not change the answer. The same body works through the synchronous route in the meantime. + + +`POST /v2/models/{provider}/{model}` holds the connection until the model finishes. Queued delivery takes the same model ID and the same native request body, but returns as soon as Router has admitted the run. You get a `request_id` back at once and collect the result when it is ready, from the same process or another one. + +Use the queue when a generation can outlast the connection you can hold, when a web request has to return now, when you submit in one process and collect in another, or when you want many generations in flight at once. Ordering, admission, retries, timeouts, billing and expiry are all decided on the server. The SDKs add polling and ergonomics on top, nothing else. + +## Two delivery modes, one request + +| | Synchronous | Queued | +| --- | --- | --- | +| Route | `POST /v2/models/{provider}/{model}` | `POST /v2/models/{provider}/{model}/requests` | +| Answer | `200` with the model's native output | `201` with a `request_id` and three URLs | +| Result | In the response | Collected later, byte for byte the same output | + +The SDKs (`comfy-sdk` and `@comfyorg/sdk`, 0.3.0 or later) expose the queue as three methods next to `run`: + +- **`submit(model, body)`** sends the request and returns a handle at once. The handle carries `status()`, `get()`, `cancel()` and an event iterator (`iter_events()` in Python, `events()` in TypeScript). +- **`subscribe(model, body, ...)`** is submit, poll and collect in one call, with a progress callback. +- **`handle(model, request_id)`** rebuilds a handle in another process from the two IDs, with no call made. + +Both ids are needed everywhere because both address the request: the route is `/v2/models/{provider}/{model}/requests/{request_id}`. + +## The four routes + +| Route | Answer | +| --- | --- | +| `POST /v2/models/{provider}/{model}/requests` | `201` with `request_id`, `status`, `queue_position`, `status_url`, `response_url`, `cancel_url` | +| `GET /v2/models/{provider}/{model}/requests/{request_id}/status` | `200` with the current `status` and `queue_position`, plus a `Retry-After` hint | +| `GET /v2/models/{provider}/{model}/requests/{request_id}` | `200` with the model's native output once finished, `202` with the status body while it is not | +| `PUT /v2/models/{provider}/{model}/requests/{request_id}/cancel` | `202` `CANCELLATION_REQUESTED`, or `409` `ALREADY_COMPLETED` | + +`status` is one of `IN_QUEUE`, `IN_PROGRESS` or `COMPLETED`. There is no separate failed or cancelled status: a request that did not succeed is `COMPLETED` carrying an `error_type`, so branch on the presence of that field, not on a fourth status value. The SDKs do this for you: `get()` raises or rejects with the typed Router error instead of handing the failure back as a result. + +The [API reference](/development/comfy-router/reference#endpoints) carries the full contract for each route. + +## Queue a request + +This queues the same request the [quickstart](/development/comfy-router/quickstart) sends and collects the image. Export your key as `COMFY_API_KEY` first. + + +```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( + "bfl/flux-2-pro", + {"prompt": "a red teapot on a windowsill, morning light"}, + ) + 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("image:", result["result"]["sample"]) +``` + +```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. +type FluxResult = { result: { sample: string } }; +const handle = await comfy.models.submit("bfl/flux-2-pro", { + prompt: "a red teapot on a windowsill, morning light", +}); +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(); +if (result.kind !== "json") throw new Error("expected a JSON result"); + +console.log("image:", result.data.result.sample); +``` + +```bash cURL +BASE="https://api.comfy.org/v2/models/bfl/flux-2-pro" + +# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url. +curl "$BASE/requests" \ + -H "X-API-Key: $COMFY_API_KEY" \ + -H "Idempotency-Key: $(uuidgen)" \ + -H "Content-Type: application/json" \ + -d '{"prompt": "a red teapot on a windowsill, morning light"}' + +# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names. +REQUEST_ID="" +curl -i "$BASE/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 "$BASE/requests/$REQUEST_ID" -H "X-API-Key: $COMFY_API_KEY" + +# 4. Cancel a request that has not finished. A request, not a guarantee. +curl -X PUT "$BASE/requests/$REQUEST_ID/cancel" -H "X-API-Key: $COMFY_API_KEY" +``` + + +Every [model page](/development/comfy-router/models) carries this shape for its own model under **Queue and collect later**, beside the synchronous snippet. + +### Follow progress and collect in one call + +When you do want to wait but also want to show progress, `subscribe` folds submit, poll and collect into one call: + + +```python Python +def on_update(update): + print(update.status, update.queue_position) + +result = client.models.subscribe( + "bfl/flux-2-pro", + {"prompt": "a red teapot on a windowsill, morning light"}, + on_queue_update=on_update, + timeout=300, +) +``` + +```typescript TypeScript +const result = await comfy.models.subscribe( + "bfl/flux-2-pro", + { prompt: "a red teapot on a windowsill, morning light" }, + { + onQueueUpdate: (update) => console.log(update.status, update.queuePosition), + timeoutMs: 300_000, + }, +); +``` + + +The timeout is a client-side bound with no server-side meaning. When it runs out, `subscribe` makes one best-effort cancel before raising, so you are not paying for a generation nobody will collect. Use `submit` when the request should outlive the caller. + +### Collect from another process + +Store the `request_id` next to the model ID. Both are needed to rebuild a handle, and no call is made until you use it. + + +```python Python +handle = client.models.handle("bfl/flux-2-pro", request_id) +result = handle.get() +``` + +```typescript TypeScript +const handle = comfy.models.handle("bfl/flux-2-pro", requestId); +const result = await handle.get(); +``` + + +### Check status or cancel + +`status()` is one poll and returns the current state. `cancel()` asks the server to stop a request that has not finished. It is a request, not a guarantee: a run already on the wire at the partner may complete anyway, and the next `status()` is what is true. + + +```python Python +update = handle.status() +print(update.status, update.queue_position, update.error_type) + +handle.cancel() +``` + +```typescript TypeScript +const update = await handle.status(); +console.log(update.status, update.queuePosition, update.errorType); + +await handle.cancel(); +``` + + +### Async Python + +`AsyncComfy` mirrors every name, argument and argument order. There is no `submit_async`, for the same reason there is no `run_async`. + +```python +from comfy_sdk import AsyncComfy + +async with AsyncComfy() as client: + handle = await client.models.submit( + "bfl/flux-2-pro", + {"prompt": "a red teapot on a windowsill, morning light"}, + ) + async for update in handle.iter_events(): + print(update.status, update.queue_position) + result = await handle.get() +``` + +### Errors the SDKs raise + +A request that finished without succeeding is reported as `COMPLETED` with an `error_type`. `get()` and `subscribe()` turn that into the typed Router error for the bucket: the classes in `comfy_sdk.router_exceptions` in Python, and `routerErrors.*` in TypeScript. The event iterator does not raise for that case, because it is a view of the queue's progress: a completion carrying an `error_type` is yielded as the last observation, and `get()` is what collects. A `403` `not_enabled` on submit arrives as `NotEnabled` and is terminal, so the SDKs do not retry it. + +## What the responses look like + +**Submit, `201`.** `status` is always `IN_QUEUE` at this point. The three URLs are absolute and are authenticated with the same key as the submit. + +```json +{ + "request_id": "6f1a1a6e-6a53-4a5f-9d3a-2b3b0a1f9c21", + "status": "IN_QUEUE", + "queue_position": 3, + "status_url": "https://api.comfy.org/v2/models/bfl/flux-2-pro/requests/6f1a1a6e-6a53-4a5f-9d3a-2b3b0a1f9c21/status", + "response_url": "https://api.comfy.org/v2/models/bfl/flux-2-pro/requests/6f1a1a6e-6a53-4a5f-9d3a-2b3b0a1f9c21", + "cancel_url": "https://api.comfy.org/v2/models/bfl/flux-2-pro/requests/6f1a1a6e-6a53-4a5f-9d3a-2b3b0a1f9c21/cancel" +} +``` + +`request_id` is also the value of the submit's `X-Comfy-Request-Id` header. Keep the model ID next to it: the request is addressed by both. + +**Status, `200`.** The same shape, with the current state. `queue_position` counts the requests ahead of yours and reaches `0` when the run is at the front. `Retry-After` on this response is Router's estimate of when polling again is worth the round trip. It is a hint, not a bound, and a request at the back of the queue is told to wait longer than one already running. Polling faster learns nothing earlier and spends your own rate-limit allowance. + +```json +{ + "request_id": "6f1a1a6e-6a53-4a5f-9d3a-2b3b0a1f9c21", + "status": "IN_PROGRESS", + "queue_position": 0, + "status_url": "...", + "response_url": "...", + "cancel_url": "..." +} +``` + +A request that finished without succeeding is `COMPLETED` with an `error_type`, carrying the same coarse bucket the result read puts on `X-Comfy-Error-Type`. The field is absent on success rather than `null`. + +```json +{ + "request_id": "6f1a1a6e-6a53-4a5f-9d3a-2b3b0a1f9c21", + "status": "COMPLETED", + "error_type": "content_policy_violation", + "status_url": "...", + "response_url": "...", + "cancel_url": "..." +} +``` + +**Result.** `200` carries the model's own native output, byte for byte what the synchronous route returns for the same model and input, under the provider's own `Content-Type`. While the request is not finished the read answers `202` with the status body above, so a client that only polls the result URL parses one type. A request that failed comes back as an error response with `X-Comfy-Error-Type` set, the same buckets as the synchronous route. + +**Cancel.** `202` with `CANCELLATION_REQUESTED` means the ask was accepted, not that the run has stopped. A run already on the wire at the partner may complete anyway, and a partner generation that completes is charged whether or not anyone collects it. Read the status afterwards: a cancellation that took effect shows as `COMPLETED` with `error_type: cancelled`. A request that aged out before it could run shows `queue_timeout` the same way. A request that had already finished answers `409` with `ALREADY_COMPLETED`. + +## Idempotency and billing + +- **Same charge as the synchronous route.** You are billed when the provider bills Comfy. Time spent waiting in the queue is not charged. +- **One `Idempotency-Key` per submit.** The SDK mints a fresh key per `submit` call, so two deliberate submits of the same input are two requests. A retry of the same call under the same key does not queue a second run: it returns the original handle with `Idempotent-Replayed: true`. Pass your own key when a lost response could have cost you the `request_id`. See [Headers](/development/comfy-router/headers). +- **Results expire.** A finished request is kept for 24 hours after it completes. After that, the status and result reads answer `410` and the result is gone. Collect promptly and download any asset URLs the output carries. +- **Polls are requests too.** Status and result reads count towards the [per-caller request rate](/development/comfy-router/limitations#requests-are-rate-limited-per-caller). Honour `Retry-After` rather than polling on a fixed short interval. + +## Errors + +| Status | `X-Comfy-Error-Type` | Meaning | +| --- | --- | --- | +| `402` | `insufficient_credits` | The workspace cannot fund the run. Nothing is queued or charged, and the same `Idempotency-Key` can be re-sent once it is funded. | +| `403` | `not_enabled` | Queued delivery is not switched on for this workspace. Terminal, do not retry. | +| `404` | `model_not_found` | The `{provider}/{model}` ID resolves to no Router model. | +| `404` | `request_not_found` | No request with that ID exists for this caller and model. | +| `409` | `concurrency_limit_exceeded` | The same `Idempotency-Key` is still being admitted. Wait the `Retry-After` and re-send the same key to get the original handle. | +| `409` | `invalid_input` | The `Idempotency-Key` is held for a different request. Send this one under a new key. | +| `409` | `ALREADY_COMPLETED` in the body | On the cancel route only: the request had already finished, so there was nothing to cancel. | +| `410` | | The request existed and is past its retention window, 24 hours after it completed. Permanent for that ID. | +| `422` | `invalid_input` | The model rejected the input. The body carries the per-field detail, exactly as on the synchronous route. | + +Every error response carries `X-Comfy-Request-Id`. Quote it when you contact support. + +## Preview notes + +The routes, fields and SDK methods on this page are the contract the preview runs against. Progress events, webhooks and priority are not part of it. + +## Next + + + + The synchronous call for the same model, from nothing to an image. + + + Every model page has the queued snippet for its own model and body. + + + Authentication, idempotency, request IDs, error buckets, retry pacing. + + + The four queue routes, field by field. + + diff --git a/development/comfy-router/quickstart.mdx b/development/comfy-router/quickstart.mdx index d08972624..6e6b812d9 100644 --- a/development/comfy-router/quickstart.mdx +++ b/development/comfy-router/quickstart.mdx @@ -110,6 +110,10 @@ 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. + ## Choose a model [Browse the models available through Comfy Router](/development/comfy-router/models), inspect their inputs, then replace the model ID in this example. diff --git a/docs.json b/docs.json index 9d94c4a95..856d618c6 100644 --- a/docs.json +++ b/docs.json @@ -3084,6 +3084,7 @@ "pages": [ "development/comfy-router/quickstart", "development/comfy-router/api", + "development/comfy-router/queue", "development/comfy-router/headers", "development/comfy-router/reference", "development/comfy-router/limitations", diff --git a/snippets/comfy-router/queue-preview-notice.mdx b/snippets/comfy-router/queue-preview-notice.mdx new file mode 100644 index 000000000..d442f59cf --- /dev/null +++ b/snippets/comfy-router/queue-preview-notice.mdx @@ -0,0 +1,3 @@ + +Queued delivery is rolling out per workspace. Until yours is enabled, the submit route answers `403` with `X-Comfy-Error-Type: not_enabled`. Nothing about the request is wrong, and the same body works through the synchronous route in the meantime. +