Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
41638bf
feat(generation): restore hosted-provider options, canvas modes, and …
joshistoast Oct 11, 2026
5a3ccc8
fix(generation): keep hosted-provider sizes, edits, and canvas inputs…
joshistoast Oct 11, 2026
fffc35b
fix(models): show starter-managed provider records read-only instead …
joshistoast Oct 11, 2026
57273a4
chore(perf): re-record route baselines for the hosted-provider modules
joshistoast Oct 11, 2026
172193b
Merge branch 'main' into feat/parity-external-providers
joshistoast Oct 12, 2026
4a94f0e
Merge remote-tracking branch 'origin/main' into feat/parity-external-…
joshistoast Oct 17, 2026
7e4ae9b
fix(canvas): restore hosted-provider output to the bounding box
joshistoast Oct 17, 2026
c54124d
fix(models): lock catalog-managed external records and restore timing…
joshistoast Oct 17, 2026
2493c04
fix(generation): resolve main merge conflicts
joshistoast Oct 19, 2026
165bb7f
Merge branch 'main' into feat/parity-external-providers
Pfannkuchensack Oct 19, 2026
b042b36
Merge branch 'main' into feat/parity-external-providers
Pfannkuchensack Oct 19, 2026
4f81501
fix(generation): keep hosted Canvas output undistorted and address re…
joshistoast Oct 19, 2026
99405a3
test(models): route the mock GPT Image fixture to a GPT Image model
joshistoast Oct 19, 2026
741cd92
Merge branch 'main' into feat/parity-external-providers
joshistoast Oct 19, 2026
cbcd5ee
fix(generation): judge hosted Canvas frames by visible content
joshistoast Oct 19, 2026
f9e239c
Merge branch 'main' into feat/parity-external-providers
joshistoast Oct 19, 2026
ac5f8d5
Merge branch 'main' into feat/parity-external-providers
joshistoast Oct 22, 2026
2f23e25
chore(perf): re-record route bytes after merging main
joshistoast Oct 22, 2026
822e01e
Merge branch 'main' into feat/parity-external-providers
joshistoast Oct 22, 2026
892adb9
Merge branch 'main' into feat/parity-external-providers
joshistoast Oct 23, 2026
a3623bc
Merge branch 'main' into feat/parity-external-providers
joshistoast Oct 23, 2026
a5b2903
Merge branch 'main' into feat/parity-external-providers
joshistoast Oct 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions docs/src/content/docs/Users Guide/03.Models/01.introduction.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,23 @@ information on how to generate these keys. Once a valid API key has
been provided, the list of models hosted by that service will appear
as selections in the Image Generation panel.

Opening an external model in the Model Manager shows an **External
Provider** section where you can change the provider (one of the
registered providers) and provider model ID it routes to, the modes
(text to image, image to image, inpaint) and
inputs (seed, reference images, negative prompt) it advertises, its
request limits, and the size and image count the provider is asked for
by default. The Generate panel and the Canvas only offer what the
record advertises, so keep it in step with the provider's documentation.
The Canvas compiles only text to image and image to image for external
models and refuses inpaint, because its keep-mask does not match any
provider's edit-mask contract; an advertised inpaint mode serves the
workflow editor. A model whose source matches a starter catalog entry is
shown read-only, including its provider and provider model ID, because
Invoke applies that catalog entry's capabilities to it on every load, so
a changed route would keep the original entry's capabilities. Models
added outside the starter catalog get the full editor.

:::note[Gated Downloads]
The API Keys section is also used to provide keys for services that
require authentication to download certain models, such as those
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,19 @@ Reference-image input is used to condition generation but counts as txt2img —
All Gemini models are single-image-per-request — batch size is fixed at 1. To generate multiple variations, queue multiple invocations.
## Provider-Specific Options
Selecting a Gemini model adds a **Provider options** section to the Generate panel:
- **Temperature** — Override the sampling temperature (0–2; the provider default is 1).
- **Thinking level** — `minimal` or `high`, or the provider default.

Gemini 3 models list their resolution presets under **Provider size** in the Size section. Picking one sets the width and height to the preset and sends its named size (`1K`, `2K`, `4K`) to the API. The named size and the sampling options are recorded in the image metadata and restored by **Recall All** and **Remix**.

## Canvas

Gemini models generate only from text, so on the Canvas the bounding box must be free of raster content: hide raster layers or move their content out of the box to generate. Invoke asks for the size whose aspect ratio is closest to the bounding box's; for Gemini 3 that is the smallest named size covering the box at that ratio, such as `2K` for a 2000×2000 box. The result is scaled to cover the bounding box and cropped to it from the center, so it is never stretched.

## Tips

<Steps>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,24 @@ Inpainting (mask-based editing) is not currently supported for any OpenAI model

## Provider-Specific Options

For **GPT Image** models, Invoke surfaces two provider-specific options in the parameters panel:
Selecting a GPT Image model adds a **Provider options** section to the Generate panel:

- **Quality** — `low`, `medium`, `high`, or `auto`. Higher quality costs more and takes longer.
- **Background** — `auto`, `transparent`, or `opaque`. Use `transparent` for PNG output with an alpha channel.
- **Input fidelity** — `low` or `high`, offered only for models that take image inputs (img2img or reference images). Leave it on the provider default to let OpenAI choose.

DALL·E 2 and DALL·E 3 do not expose these options.

These are recorded in the image metadata, so **Recall All** and **Remix** restore them when the image's model is selected.

The **Size** section lists the provider's fixed sizes per aspect ratio (**Provider size**). Any other size is mapped to the closest one the provider accepts.

## Canvas

GPT Image models that advertise `img2img` can generate from the Canvas: an empty bounding box runs text-to-image, and a filled one sends the composited bounding box as the init image. Invoke asks for the provider size whose aspect ratio is closest to the bounding box's, such as 1536×1024 for a 640×512 box. A text-to-image result is scaled to cover the bounding box and cropped to it from the center, so it is never stretched; when the shapes differ, a strip at two opposite edges is cut off. For image-to-image, the init image is resized to the provider size and the result is resized back to the exact bounding box. The render size, denoising strength, control layers and regional guidance do not apply and are not offered. Inpainting and outpainting are not available for OpenAI models.

DALL·E 3 generates only from text: on the Canvas, hide raster layers or move their content out of the bounding box to generate with it.

## How Requests Are Routed

- Pure text-to-image requests hit `/v1/images/generations`.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,17 @@ All Seedream models share the same aspect ratio set: `1:1`, `2:3`, `3:2`, `3:4`,

## Provider-Specific Options

Seedream exposes two provider-specific toggles in the parameters panel:
Selecting a Seedream model adds a **Provider options** section to the Generate panel with two toggles:

- **Watermark** — When enabled, BytePlus adds a small watermark to the output. Off by default.
- **Optimize Prompt** — When enabled, BytePlus rewrites your prompt server-side for better generation quality. Useful for short prompts; disable if you want the exact wording preserved.

Both are recorded in the image metadata and restored by **Recall All** and **Remix**. The Size section lists the provider's 2K sizes per aspect ratio under **Provider size**.

## Canvas

Seedream models advertise `img2img`, so they can generate from the Canvas: an empty bounding box runs text-to-image, and a filled one sends the composited bounding box as the init image. Invoke asks for the provider size whose aspect ratio is closest to the bounding box's. A text-to-image result is scaled to cover the bounding box and cropped to it from the center, so it is never stretched; when the shapes differ, a strip at two opposite edges is cut off. For image-to-image, the init image is resized to the provider size and the result is resized back to the exact bounding box. The render size, denoising strength, control layers and regional guidance do not apply and are not offered. Inpainting and outpainting are not available.

**Seed** and **guidance scale** are not accepted by the 4.x / 5.x family.

## Reference Images
Expand Down
2 changes: 2 additions & 0 deletions docs/src/content/docs/contributing/external-providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,14 @@ Starter overrides are matched by `source` (`external://provider/model-id`). Keep

- runtime capability/default overrides depend on it
- installation detection in starter-model APIs depends on it
- the model manager's External Provider section treats a record whose `source` matches a starter as catalog-managed and shows its routing, capabilities and defaults read-only, because a changed route would keep the matched entry's capabilities

`STARTER_MODELS` enforces unique `source` values with an assertion.

### Install behavior notes

- External starter models are managed in **External Providers** setup (not the regular Starter Models tab).
- Canvas compiles `txt2img` and `img2img` for external models; `inpaint` is refused on Canvas because its keep-mask does not match any provider's edit-mask contract (the workflow editor nodes still accept `mask_image`). For a model with `resolution_presets`, `aspect_ratio_sizes` or `allowed_aspect_ratios`, the Canvas requests one of the model's own sizes (the closest aspect ratio, then the smallest size covering the bounding box). `_bucket_request` passes a fixed size or an exact multiple of an allowed ratio through unchanged; a resolution preset whose rounded size is off its exact ratio may be nudged by a pixel, which is harmless because the provider sizes its output from the ratio and the preset's name. A `txt2img` result is scaled to cover the bounding box and center-cropped; an `img2img` init image is resized to the request size and the result resized back. Keep these capabilities accurate: the crop is planned from them.
- External starter models auto-install when a provider is configured.
- Removing a provider API key removes installed external models for that provider.

Expand Down
1 change: 1 addition & 0 deletions invokeai/frontend/webv2/.oxfmtrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"stats.html",
"src/features/generation/core/__snapshots__/generateGraphNodeTypes.json",
"src/features/generation/core/__snapshots__/animaLLLiteCanvasGraphs.json",
"src/features/generation/core/__snapshots__/externalCanvasGraphs.json",
"src/features/video/core/__snapshots__/videoGraphNodeTypes.json",
"src/features/upscale/core/__snapshots__/upscaleGraphNodeTypes.json",
"src/features/upscale/core/__snapshots__/upscaleIndexClippedStarts.json",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -554,7 +554,9 @@
"source:src/features/generation/core/catalogSearch.ts",
"source:src/features/generation/core/componentCompatibility.ts",
"source:src/features/generation/core/conditioningRebalance.ts",
"source:src/features/generation/core/dimensionLimits.ts",
"source:src/features/generation/core/dynamicPrompts.ts",
"source:src/features/generation/core/externalProvider.ts",
"source:src/features/generation/core/graph.ts",
"source:src/features/generation/core/graphBuilder.ts",
"source:src/features/generation/core/krea2Conditioning.ts",
Expand Down
92 changes: 52 additions & 40 deletions invokeai/frontend/webv2/performance/browser-baseline.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,12 @@
"cssRawBytes": 2159,
"fontRawBytes": 23664,
"imageRawBytes": 0,
"largestAssetRawBytes": 752413,
"otherRawBytes": 226185,
"largestAssetRawBytes": 752422,
"otherRawBytes": 231257,
"requestCount": 29,
"scriptRawBytes": 1868300,
"scriptRawBytes": 1882471,
"scriptRequestCount": 25,
"totalRawBytes": 2120308
"totalRawBytes": 2139551
},
"routeReadyMedianMs": 215.30000019073486,
"scriptSourceOwnerSet": "launchpad-static",
Expand Down Expand Up @@ -67,12 +67,12 @@
"cssRawBytes": 2159,
"fontRawBytes": 23664,
"imageRawBytes": 0,
"largestAssetRawBytes": 752413,
"otherRawBytes": 226185,
"largestAssetRawBytes": 752422,
"otherRawBytes": 231257,
"requestCount": 29,
"scriptRawBytes": 1868300,
"scriptRawBytes": 1882471,
"scriptRequestCount": 25,
"totalRawBytes": 2120308
"totalRawBytes": 2139551
},
"routeReadyMedianMs": 225.39999961853027,
"scriptSourceOwnerSet": "launchpad-static",
Expand Down Expand Up @@ -105,12 +105,12 @@
"cssRawBytes": 2159,
"fontRawBytes": 23664,
"imageRawBytes": 44398,
"largestAssetRawBytes": 752413,
"otherRawBytes": 226185,
"largestAssetRawBytes": 752422,
"otherRawBytes": 231257,
"requestCount": 87,
"scriptRawBytes": 4199867,
"scriptRawBytes": 4250746,
"scriptRequestCount": 82,
"totalRawBytes": 4496273
"totalRawBytes": 4552224
},
"routeReadyMedianMs": 360.90000009536743,
"scriptSourceOwnerSet": "editor-minimal-static",
Expand Down Expand Up @@ -143,12 +143,12 @@
"cssRawBytes": 2159,
"fontRawBytes": 23664,
"imageRawBytes": 44398,
"largestAssetRawBytes": 752413,
"otherRawBytes": 226185,
"largestAssetRawBytes": 752422,
"otherRawBytes": 231257,
"requestCount": 87,
"scriptRawBytes": 4199867,
"scriptRawBytes": 4250746,
"scriptRequestCount": 82,
"totalRawBytes": 4496273
"totalRawBytes": 4552224
},
"routeReadyMedianMs": 367.80000019073486,
"scriptSourceOwnerSet": "editor-minimal-static",
Expand Down Expand Up @@ -181,12 +181,12 @@
"cssRawBytes": 2159,
"fontRawBytes": 23664,
"imageRawBytes": 44398,
"largestAssetRawBytes": 752413,
"otherRawBytes": 226185,
"largestAssetRawBytes": 752422,
"otherRawBytes": 231257,
"requestCount": 96,
"scriptRawBytes": 4718489,
"scriptRawBytes": 4775202,
"scriptRequestCount": 91,
"totalRawBytes": 5014895
"totalRawBytes": 5076680
},
"routeReadyMedianMs": 1095.3000001907349,
"scriptSourceOwnerSet": "editor-canvas-static",
Expand Down Expand Up @@ -219,12 +219,12 @@
"cssRawBytes": 2159,
"fontRawBytes": 23664,
"imageRawBytes": 44398,
"largestAssetRawBytes": 752413,
"otherRawBytes": 226185,
"largestAssetRawBytes": 752422,
"otherRawBytes": 231257,
"requestCount": 96,
"scriptRawBytes": 4718489,
"scriptRawBytes": 4775202,
"scriptRequestCount": 91,
"totalRawBytes": 5014895
"totalRawBytes": 5076680
},
"routeReadyMedianMs": 1042.5,
"scriptSourceOwnerSet": "editor-canvas-static",
Expand Down Expand Up @@ -257,12 +257,12 @@
"cssRawBytes": 17572,
"fontRawBytes": 23664,
"imageRawBytes": 44398,
"largestAssetRawBytes": 752413,
"otherRawBytes": 226185,
"largestAssetRawBytes": 752422,
"otherRawBytes": 231257,
"requestCount": 94,
"scriptRawBytes": 4644510,
"scriptRawBytes": 4702888,
"scriptRequestCount": 88,
"totalRawBytes": 4956329
"totalRawBytes": 5019779
},
"routeReadyMedianMs": 1093.0999999046326,
"scriptSourceOwnerSet": "editor-workflow-static",
Expand Down Expand Up @@ -295,12 +295,12 @@
"cssRawBytes": 17572,
"fontRawBytes": 23664,
"imageRawBytes": 44398,
"largestAssetRawBytes": 752413,
"otherRawBytes": 226185,
"largestAssetRawBytes": 752422,
"otherRawBytes": 231257,
"requestCount": 94,
"scriptRawBytes": 4644510,
"scriptRawBytes": 4702888,
"scriptRequestCount": 88,
"totalRawBytes": 4956329
"totalRawBytes": 5019779
},
"routeReadyMedianMs": 1105.0999999046326,
"scriptSourceOwnerSet": "editor-workflow-static",
Expand Down Expand Up @@ -333,12 +333,12 @@
"cssRawBytes": 2159,
"fontRawBytes": 23664,
"imageRawBytes": 44398,
"largestAssetRawBytes": 752413,
"otherRawBytes": 226185,
"largestAssetRawBytes": 752422,
"otherRawBytes": 231257,
"requestCount": 87,
"scriptRawBytes": 4199867,
"scriptRawBytes": 4250746,
"scriptRequestCount": 82,
"totalRawBytes": 4496273
"totalRawBytes": 4552224
},
"routeReadyMedianMs": 1324.5,
"scriptSourceOwnerSet": "editor-minimal-static",
Expand Down Expand Up @@ -371,12 +371,12 @@
"cssRawBytes": 2159,
"fontRawBytes": 23664,
"imageRawBytes": 44398,
"largestAssetRawBytes": 752413,
"otherRawBytes": 226185,
"largestAssetRawBytes": 752422,
"otherRawBytes": 231257,
"requestCount": 87,
"scriptRawBytes": 4199867,
"scriptRawBytes": 4250746,
"scriptRequestCount": 82,
"totalRawBytes": 4496273
"totalRawBytes": 4552224
},
"routeReadyMedianMs": 1301.5,
"scriptSourceOwnerSet": "editor-minimal-static",
Expand Down Expand Up @@ -981,7 +981,9 @@
"source:src/features/generation/core/catalogSearch.ts",
"source:src/features/generation/core/componentCompatibility.ts",
"source:src/features/generation/core/conditioningRebalance.ts",
"source:src/features/generation/core/dimensionLimits.ts",
"source:src/features/generation/core/dynamicPrompts.ts",
"source:src/features/generation/core/externalProvider.ts",
"source:src/features/generation/core/graph.ts",
"source:src/features/generation/core/graphBuilder.ts",
"source:src/features/generation/core/krea2Conditioning.ts",
Expand Down Expand Up @@ -1028,6 +1030,7 @@
"source:src/features/generation/ui/GenerateHeaderActions.tsx",
"source:src/features/generation/ui/GenerateModelCard.tsx",
"source:src/features/generation/ui/GeneratePresetsPopover.tsx",
"source:src/features/generation/ui/GenerateProviderOptionsSection.tsx",
"source:src/features/generation/ui/GenerateRefinerSection.tsx",
"source:src/features/generation/ui/GenerateRenderSection.tsx",
"source:src/features/generation/ui/GenerateSettingsForm.tsx",
Expand Down Expand Up @@ -1078,6 +1081,7 @@
"source:src/features/generation/ui/shared/ConceptRow.tsx",
"source:src/features/generation/ui/shared/ConditioningRebalanceBars.tsx",
"source:src/features/generation/ui/shared/ConditioningRebalanceSparkline.tsx",
"source:src/features/generation/ui/shared/ExternalSizeSelect.tsx",
"source:src/features/generation/ui/shared/GenerateCollapsibleSection.tsx",
"source:src/features/generation/ui/shared/GenerateFieldContextMenu.tsx",
"source:src/features/generation/ui/shared/GenerateToggleSwitch.tsx",
Expand Down Expand Up @@ -2080,7 +2084,9 @@
"source:src/features/generation/core/catalogSearch.ts",
"source:src/features/generation/core/componentCompatibility.ts",
"source:src/features/generation/core/conditioningRebalance.ts",
"source:src/features/generation/core/dimensionLimits.ts",
"source:src/features/generation/core/dynamicPrompts.ts",
"source:src/features/generation/core/externalProvider.ts",
"source:src/features/generation/core/graph.ts",
"source:src/features/generation/core/graphBuilder.ts",
"source:src/features/generation/core/krea2Conditioning.ts",
Expand Down Expand Up @@ -2127,6 +2133,7 @@
"source:src/features/generation/ui/GenerateHeaderActions.tsx",
"source:src/features/generation/ui/GenerateModelCard.tsx",
"source:src/features/generation/ui/GeneratePresetsPopover.tsx",
"source:src/features/generation/ui/GenerateProviderOptionsSection.tsx",
"source:src/features/generation/ui/GenerateRefinerSection.tsx",
"source:src/features/generation/ui/GenerateRenderSection.tsx",
"source:src/features/generation/ui/GenerateSettingsForm.tsx",
Expand Down Expand Up @@ -2177,6 +2184,7 @@
"source:src/features/generation/ui/shared/ConceptRow.tsx",
"source:src/features/generation/ui/shared/ConditioningRebalanceBars.tsx",
"source:src/features/generation/ui/shared/ConditioningRebalanceSparkline.tsx",
"source:src/features/generation/ui/shared/ExternalSizeSelect.tsx",
"source:src/features/generation/ui/shared/GenerateCollapsibleSection.tsx",
"source:src/features/generation/ui/shared/GenerateFieldContextMenu.tsx",
"source:src/features/generation/ui/shared/GenerateToggleSwitch.tsx",
Expand Down Expand Up @@ -3339,7 +3347,9 @@
"source:src/features/generation/core/catalogSearch.ts",
"source:src/features/generation/core/componentCompatibility.ts",
"source:src/features/generation/core/conditioningRebalance.ts",
"source:src/features/generation/core/dimensionLimits.ts",
"source:src/features/generation/core/dynamicPrompts.ts",
"source:src/features/generation/core/externalProvider.ts",
"source:src/features/generation/core/graph.ts",
"source:src/features/generation/core/graphBuilder.ts",
"source:src/features/generation/core/krea2Conditioning.ts",
Expand Down Expand Up @@ -3386,6 +3396,7 @@
"source:src/features/generation/ui/GenerateHeaderActions.tsx",
"source:src/features/generation/ui/GenerateModelCard.tsx",
"source:src/features/generation/ui/GeneratePresetsPopover.tsx",
"source:src/features/generation/ui/GenerateProviderOptionsSection.tsx",
"source:src/features/generation/ui/GenerateRefinerSection.tsx",
"source:src/features/generation/ui/GenerateRenderSection.tsx",
"source:src/features/generation/ui/GenerateSettingsForm.tsx",
Expand Down Expand Up @@ -3436,6 +3447,7 @@
"source:src/features/generation/ui/shared/ConceptRow.tsx",
"source:src/features/generation/ui/shared/ConditioningRebalanceBars.tsx",
"source:src/features/generation/ui/shared/ConditioningRebalanceSparkline.tsx",
"source:src/features/generation/ui/shared/ExternalSizeSelect.tsx",
"source:src/features/generation/ui/shared/GenerateCollapsibleSection.tsx",
"source:src/features/generation/ui/shared/GenerateFieldContextMenu.tsx",
"source:src/features/generation/ui/shared/GenerateToggleSwitch.tsx",
Expand Down
Loading
Loading