diff --git a/3-LAYER-FLATTENING.md b/3-LAYER-FLATTENING.md new file mode 100644 index 00000000000..552156130db --- /dev/null +++ b/3-LAYER-FLATTENING.md @@ -0,0 +1,199 @@ +# 3-Layer Flattening System — Design Document + +## Problem + +Each canvas entity (raster layer, control layer, inpaint mask, regional guidance) creates its own `Konva.Layer`, which in turn creates a separate HTML `` element in the DOM. With many layers, the browser must composite all of these canvas elements on every frame, leading to significant GPU/CPU overhead and sluggish interactions. + +## Goal + +Reduce the number of active `` elements from **N** (one per entity) to **3** (constant), regardless of how many entities exist. This provides a dramatic performance improvement especially on lower-end devices. + +## Architecture + +### The 3-Layer System + +``` +┌─────────────────────────────────────┐ +│ Konva.Layer: "behind" │ ← All entities below the active one, +│ (flattened composite of layers │ flattened into a single canvas +│ behind the active entity) │ +├─────────────────────────────────────┤ +│ Konva.Layer: "active" │ ← The currently selected entity, +│ (the entity being edited) │ fully interactive with all +│ │ sub-modules (transformer, etc.) +├─────────────────────────────────────┤ +│ Konva.Layer: "ahead" │ ← All entities above the active one, +│ (flattened composite of layers │ flattened into a single canvas +│ above the active entity) │ +└─────────────────────────────────────┘ +``` + +Plus the existing **background layer** and **preview layer** (bbox, staging area, tool) which are unchanged. + +### Key Concepts + +**Flattening**: Render multiple entity layers into a single off-screen canvas, then display that canvas as a single `Konva.Image` node on the composite `Konva.Layer`. This is similar to what `CanvasCompositorModule.getCompositeCanvas()` already does for generation. + +**Active Entity**: The entity currently selected by the user. This entity keeps its own dedicated `Konva.Layer` so it can be interactively edited (brush strokes, transforms, filters, SAM segmentation, etc.). + +**Re-flattening**: When the user switches the active entity, the "behind" and "ahead" composites must be regenerated. This can be done incrementally (add/remove one entity from composite) or fully (re-render all). + +## Implementation Plan + +### Phase 1: New Module — `CanvasLayerFlatteningModule` + +Create a new module at `konva/CanvasLayerFlatteningModule.ts`: + +```typescript +class CanvasLayerFlatteningModule extends CanvasModuleBase { + // The two composite Konva.Layers + behindLayer: Konva.Layer; + aheadLayer: Konva.Layer; + + // Cached composite canvases + behindCanvas: HTMLCanvasElement | null; + aheadCanvas: HTMLCanvasElement | null; + + // Konva.Image nodes to display the composites + behindImage: Konva.Image; + aheadImage: Konva.Image; + + // Track which entity is active + activeEntityId: string | null; +} +``` + +**Responsibilities:** + +1. Subscribe to `selectedEntityIdentifier` changes +2. On entity selection change, re-flatten the "behind" and "ahead" composites +3. Manage the two composite `Konva.Layer` nodes on the stage +4. Ensure individual entity adapters DON'T add their own `Konva.Layer` to the stage (except the active one) + +### Phase 2: Modify Entity Adapter Lifecycle + +**Current flow** (in `CanvasEntityAdapterBase` constructor): + +```typescript +this.konva = { + layer: new Konva.Layer({ ... }), +}; +this.manager.stage.addLayer(this.konva.layer); +``` + +**New flow:** + +- Entity adapters still create a `Konva.Layer` (needed for rendering to off-screen canvas via `getCanvas()`) +- But they do NOT add it to the stage by default +- Only the **active entity** has its layer added to the stage +- The flattening module manages which entity is "live" on stage + +### Phase 3: Composite Rendering + +Reuse the existing compositing logic from `CanvasCompositorModule.getCompositeCanvas()`: + +```typescript +flattenBehind(activeIndex: number): HTMLCanvasElement { + const behindAdapters = this.getOrderedAdapters().slice(0, activeIndex); + // Filter to only enabled/visible adapters + const canvas = document.createElement('canvas'); + // ... render each adapter's getCanvas() onto the composite + return canvas; +} +``` + +**Blend modes**: Each raster layer can have a `globalCompositeOperation`. When flattening, these must be applied in order during compositing (same as `getCompositeCanvas` already does). + +**Opacity**: Each layer's opacity must be respected during compositing. + +**Adjustments**: Per-layer adjustments (brightness, contrast, curves) must be baked into the flattened result. + +### Phase 4: Incremental Updates + +When only the active entity changes content (brush strokes, image generation), the "behind" and "ahead" composites don't need to change. This is the common case and should be fast. + +When a non-active entity changes (rare during editing), the affected composite must be regenerated. This can be detected via entity state subscriptions. + +**Cache invalidation strategy:** + +- Hash the state of all entities in each composite (similar to `getCompositeHash()` in compositor) +- Only re-flatten when the hash changes +- Cache the flattened canvas in the `CanvasCacheModule` + +### Phase 5: Entity Selection Switch + +When the user selects a different entity: + +1. Remove the previously active entity's `Konva.Layer` from the stage +2. Render the previously active entity into the appropriate composite (behind or ahead) +3. Extract the newly active entity from its composite +4. Add the newly active entity's `Konva.Layer` to the stage +5. Re-render both composites without the newly active entity +6. Restore z-order: behind → active → ahead + +**Optimization**: If the new selection is adjacent to the old one, only one composite needs to change by adding/removing one entity. + +### Phase 6: Handle Edge Cases + +**Entity types across composites:** +The draw order is: raster layers → control layers → regions → inpaint masks. All entity types participate in flattening. The "behind" composite includes all entities below the active one regardless of type, and "ahead" includes all above. + +**Isolated preview modes:** +When filtering/transforming/segmenting, only the active entity should be visible. The composites should be hidden (same as current behavior). + +**Staging preview:** +During generation staging with `isolatedStagingPreview`, only raster layers should be visible. The composites need to only include raster layer content. + +**Disabled entities:** +Disabled entities are skipped during flattening (not rendered into composites). + +**Entity type visibility:** +If a type is globally hidden (e.g., all control layers hidden), those entities are excluded from composites. + +## Files to Modify + +| File | Change | +| ----------------------------------------------- | ------------------------------------------------------- | +| `konva/CanvasLayerFlatteningModule.ts` | **NEW** — Core flattening logic | +| `konva/CanvasManager.ts` | Register new module, integrate into lifecycle | +| `konva/CanvasEntity/CanvasEntityAdapterBase.ts` | Don't auto-add layer to stage; expose attach/detach API | +| `konva/CanvasEntityRendererModule.ts` | Delegate layer arrangement to flattening module | +| `konva/CanvasCompositorModule.ts` | Reuse/share compositing utilities | +| `konva/CanvasStageModule.ts` | No change needed (addLayer/stage management stays) | + +## Performance Expectations + +| Metric | Before | After | +| ---------------------- | ---------------------------- | -------------------------------------------------- | +| Canvas elements in DOM | N + 2 (background + preview) | 5 (background + behind + active + ahead + preview) | +| Browser composite cost | O(N) per frame | O(1) per frame | +| Layer switch cost | O(1) | O(N) one-time re-flatten | +| Active layer edit cost | O(1) | O(1) unchanged | + +The trade-off is that switching the selected entity requires a one-time re-flatten, but this can be made fast with caching and incremental updates. The per-frame rendering cost drops from O(N) to O(1), which is the dominant performance factor. + +## Risks and Mitigations + +1. **Visual fidelity**: Flattened composites must exactly match the per-layer rendering. Use the same compositing pipeline (`getCompositeCanvas`) to ensure consistency. + +2. **Blend mode accuracy**: CSS `mix-blend-mode` on individual canvas elements may differ slightly from `globalCompositeOperation` during canvas compositing. Test thoroughly with all blend modes. + +3. **Re-flatten latency**: For 50+ layers with complex content, flattening may take 50-100ms. Mitigate with: + - Async flattening in a Web Worker (see README: "Perf: Konva in a web worker") + - Show a brief transition indicator during re-flatten + - Incremental flattening (only re-render changed entities) + +4. **Memory**: Two extra composite canvases at full resolution. For a 4K canvas, this is ~32MB per composite. Acceptable for modern systems. + +## Dependencies + +- Konva's `layer.toCanvas()` or manual canvas rendering via `getCanvas()` on each adapter +- `CanvasCompositorModule` compositing utilities (hash computation, canvas compositing) +- `CanvasCacheModule` for caching flattened results + +## References + +- Current compositing: `konva/CanvasCompositorModule.ts` lines 204-247 +- README future enhancement: `controlLayers/README.md` lines 196-206 +- Entity adapter rendering: `konva/CanvasEntity/CanvasEntityAdapterBase.ts` +- Entity z-order management: `konva/CanvasEntityRendererModule.ts` lines 105-146 diff --git a/FP8_IMPLEMENTATION_PLAN.md b/FP8_IMPLEMENTATION_PLAN.md new file mode 100644 index 00000000000..d3e73cbcaf4 --- /dev/null +++ b/FP8_IMPLEMENTATION_PLAN.md @@ -0,0 +1,293 @@ +# FP8 Layerwise Casting - Implementation + +## Summary + +Add per-model `fp8_storage` option to model default settings that enables diffusers' `enable_layerwise_casting()` to store weights in FP8 (`float8_e4m3fn`) while casting to fp16/bf16 during inference. This reduces VRAM usage by ~50% per model with minimal quality loss. + +Supported: SD1/SD2/SDXL/SD3, Flux, Flux2, CogView4, Z-Image, VAE (diffusers-based), ControlNet, T2IAdapter. +Not applicable: Text Encoders, LoRA, GGUF, BnB, custom classes. + +## Related Issues / Discussions + +- https://github.com/invoke-ai/InvokeAI/issues/7148 +- Based on approach from https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14031 +- Uses diffusers' native `enable_layerwise_casting()` (available in diffusers 0.36.0) + +## QA Instructions + +1. Set `fp8_storage: true` in a model's `default_settings` (via API or Model Manager UI) +2. Load the model and generate an image +3. Verify VRAM usage is reduced compared to normal loading +4. Verify image quality is acceptable (minimal degradation expected) +5. Verify Text Encoders are NOT affected (excluded by submodel type filter) +6. Verify non-CUDA devices gracefully ignore the setting + +### Test Matrix + +- [ ] SD1.5 Diffusers with `fp8_storage=true` - load and generate +- [ ] SDXL Diffusers with `fp8_storage=true` - load and generate +- [ ] Flux Diffusers with `fp8_storage=true` - load and generate +- [ ] Flux2 Diffusers with `fp8_storage=true` - load and generate +- [ ] CogView4 with `fp8_storage=true` - load and generate +- [ ] Z-Image Diffusers with `fp8_storage=true` - load and generate +- [ ] VAE with `fp8_storage=true` - check quality +- [ ] ControlNet with `fp8_storage=true` - load and generate +- [ ] VRAM comparison: with vs. without `fp8_storage` +- [ ] Image quality comparison: FP8 vs fp16/bf16 +- [ ] MPS/CPU: verify `fp8_storage` is silently ignored +- [ ] Flux Checkpoint (custom class): verify FP8 is gracefully skipped (not a ModelMixin) +- [ ] Text Encoder submodels: verify FP8 is NOT applied +- [ ] GGUF/BnB models: verify FP8 is gracefully skipped + +## Checklist + +- [x] _The PR has a short but descriptive title, suitable for a changelog_ +- [ ] _Tests added / updated (if applicable)_ +- [ ] _Changes to a redux slice have a corresponding migration_ +- [ ] _Documentation added / updated (if applicable)_ +- [ ] _Updated `What's New` copy (if doing a release after this PR)_ + +--- + +## All Changed Files + +### Backend - Model Configs + +#### `invokeai/backend/model_manager/configs/main.py` (Modified) + +Added `fp8_storage` field to `MainModelDefaultSettings`: + +```diff + cpu_only: bool | None = Field(default=None, description="Whether this model should run on CPU only") ++ fp8_storage: bool | None = Field( ++ default=None, ++ description="Store weights in FP8 to reduce VRAM usage (~50% savings). Weights are cast to compute dtype during inference.", ++ ) +``` + +#### `invokeai/backend/model_manager/configs/controlnet.py` (Modified) + +Added `fp8_storage` field to `ControlAdapterDefaultSettings`: + +```diff + class ControlAdapterDefaultSettings(BaseModel): + preprocessor: str | None ++ fp8_storage: bool | None = Field( ++ default=None, ++ description="Store weights in FP8 to reduce VRAM usage (~50% savings). Weights are cast to compute dtype during inference.", ++ ) + model_config = ConfigDict(extra="forbid") +``` + +### Backend - Model Loading + +#### `invokeai/backend/model_manager/load/load_default.py` (Modified) + +Added two helper methods to `ModelLoader` base class: + +- `_should_use_fp8(config, submodel_type)` - Checks if FP8 should be applied: + - Returns `False` if not CUDA + - Returns `False` for excluded submodel types (TextEncoder, TextEncoder2, TextEncoder3, Tokenizer, Tokenizer2, Tokenizer3, Scheduler, SafetyChecker) + - Returns `True` if `config.default_settings.fp8_storage is True` + +- `_apply_fp8_layerwise_casting(model, config, submodel_type)` - Applies FP8 if conditions met: + - Checks `_should_use_fp8()` first + - Only applies to `diffusers.ModelMixin` instances (gracefully skips custom classes) + - Calls `model.enable_layerwise_casting(storage_dtype=torch.float8_e4m3fn, compute_dtype=self._torch_dtype)` + - Logs info message on success + +#### `invokeai/backend/model_manager/load/model_loaders/generic_diffusers.py` (Modified) + +Added `_apply_fp8_layerwise_casting` call after `from_pretrained()`. This covers T2IAdapter and other generic diffusers models. + +```diff ++ result = self._apply_fp8_layerwise_casting(result, config, submodel_type) + return result +``` + +#### `invokeai/backend/model_manager/load/model_loaders/stable_diffusion.py` (Modified) + +Added FP8 call in `_load_model()` after `from_pretrained()`: + +```diff ++ result = self._apply_fp8_layerwise_casting(result, config, submodel_type) + return result +``` + +Added FP8 calls in `_load_from_singlefile()` for both the requested submodel and cached submodels: + +```diff + if submodel := getattr(pipeline, subtype.value, None): ++ self._apply_fp8_layerwise_casting(submodel, config, subtype) + self._ram_cache.put(get_model_cache_key(config.key, subtype), model=submodel) +- return getattr(pipeline, submodel_type.value) ++ result = getattr(pipeline, submodel_type.value) ++ result = self._apply_fp8_layerwise_casting(result, config, submodel_type) ++ return result +``` + +#### `invokeai/backend/model_manager/load/model_loaders/flux.py` (Modified) + +Added FP8 calls to: +- `FluxDiffusersModel._load_model()` - after `from_pretrained()` +- `Flux2DiffusersModel._load_model()` - after `from_pretrained()` +- `Flux2VAEDiffusersLoader._load_model()` - after `from_pretrained()` +- `Flux2VAELoader._load_model()` - after VAE loading + +NOT applied to (gracefully skipped via `isinstance(model, ModelMixin)` check): +- `FluxCheckpointModel` - custom Flux class +- `FluxGGUFCheckpointModel` - GGUF format +- `FluxBnbQuantizednf4bCheckpointModel` - BnB quantized +- `FluxVAELoader` - custom AutoEncoder class + +#### `invokeai/backend/model_manager/load/model_loaders/cogview4.py` (Modified) + +Added FP8 call after `from_pretrained()`: + +```diff ++ result = self._apply_fp8_layerwise_casting(result, config, submodel_type) + return result +``` + +#### `invokeai/backend/model_manager/load/model_loaders/controlnet.py` (Modified) + +Added FP8 call after `from_single_file()` for checkpoint ControlNets: + +```diff +- return ControlNetModel.from_single_file( ++ result = ControlNetModel.from_single_file( + config.path, + torch_dtype=self._torch_dtype, + ) ++ result = self._apply_fp8_layerwise_casting(result, config, submodel_type) ++ return result +``` + +#### `invokeai/backend/model_manager/load/model_loaders/vae.py` (Modified) + +Added FP8 call after `from_single_file()` for checkpoint VAEs: + +```diff +- return AutoencoderKL.from_single_file( ++ result = AutoencoderKL.from_single_file( + config.path, + torch_dtype=self._torch_dtype, + ) ++ result = self._apply_fp8_layerwise_casting(result, config, submodel_type) ++ return result +``` + +#### `invokeai/backend/model_manager/load/model_loaders/z_image.py` (Modified) + +Added FP8 call after `from_pretrained()` in `ZImageDiffusersModel`: + +```diff ++ result = self._apply_fp8_layerwise_casting(result, config, submodel_type) + return result +``` + +### Frontend - API Schema + +#### `invokeai/frontend/web/src/services/api/schema.ts` (Modified) + +Added `fp8_storage` field to both TypeScript type definitions: + +- `ControlAdapterDefaultSettings.fp8_storage?: boolean | null` +- `MainModelDefaultSettings.fp8_storage?: boolean | null` + +### Frontend - Hooks + +#### `invokeai/frontend/web/src/features/modelManagerV2/hooks/useMainModelDefaultSettings.ts` (Modified) + +Added `fp8Storage` to form defaults: + +```typescript +fp8Storage: { + isEnabled: !isNil(modelConfig?.default_settings?.fp8_storage), + value: modelConfig?.default_settings?.fp8_storage ?? false, +}, +``` + +#### `invokeai/frontend/web/src/features/modelManagerV2/hooks/useControlAdapterModelDefaultSettings.ts` (Modified) + +Added same `fp8Storage` defaults pattern. + +### Frontend - Components + +#### `invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/DefaultFp8Storage.tsx` (New) + +New component with `SettingToggle` + `Switch`, following `DefaultVaePrecision` pattern. Renders an FP8 Storage toggle with `InformationalPopover`. + +#### `invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/DefaultFp8StorageControlAdapter.tsx` (New) + +Same pattern as `DefaultFp8Storage` but typed for `ControlAdapterModelDefaultSettingsFormData`. + +#### `invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/MainModelDefaultSettings/MainModelDefaultSettings.tsx` (Modified) + +- Added `DefaultFp8Storage` import +- Added `fp8Storage: FormField` to `MainModelDefaultSettingsFormData` +- Added `fp8_storage: data.fp8Storage.isEnabled ? data.fp8Storage.value : null` to `onSubmit` body +- Added `` to render + +#### `invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ControlAdapterModelDefaultSettings/ControlAdapterModelDefaultSettings.tsx` (Modified) + +- Added `DefaultFp8StorageControlAdapter` import +- Added `fp8Storage: FormField` to form data type +- Added `fp8_storage` to `onSubmit` body +- Added component to render grid + +### Frontend - Translations & Popover + +#### `invokeai/frontend/web/public/locales/en.json` (Modified) + +Added translation key: +```json +"fp8Storage": "FP8 Storage (Save VRAM)" +``` + +Added InformationalPopover content: +```json +"fp8Storage": { + "heading": "FP8 Storage", + "paragraphs": [ + "Stores model weights in FP8 format in VRAM, reducing memory usage by approximately 50% compared to FP16.", + "During inference, weights are cast layer-by-layer to the compute precision (FP16/BF16), so image quality is preserved. Works on all CUDA GPUs." + ] +} +``` + +#### `invokeai/frontend/web/src/common/components/InformationalPopover/constants.ts` (Modified) + +Added `'fp8Storage'` to `Feature` union type. + +--- + +## How It Works + +1. User sets `fp8_storage: true` in a model's default settings (via Model Manager UI) +2. On load, `_should_use_fp8()` checks: CUDA device? Not a text encoder? `fp8_storage` enabled? +3. `_apply_fp8_layerwise_casting()` calls `model.enable_layerwise_casting(storage_dtype=float8_e4m3fn)` +4. Weights are stored in FP8 in VRAM (~50% of fp16), cast layer-by-layer to fp16/bf16 during forward pass +5. Only one layer is in full precision at a time, so overhead is minimal (~1-3% VRAM) + +## Not Modified (by design) + +These model types cannot use `enable_layerwise_casting()`: + +| Model Type | Reason | +|-----------|--------| +| Text Encoders (CLIP, T5, Qwen3) | `transformers` library, not diffusers `ModelMixin` | +| LoRA | State-dict patches, not a standalone model | +| IP-Adapter | Custom `RawModel` wrapper | +| Textual Inversion | Custom wrapper | +| Spandrel (Upscaler) | Not diffusers-based | +| ONNX | ONNX runtime, not torch | +| Flux Checkpoint (custom Flux class) | Not diffusers `ModelMixin` | +| GGUF models | Already quantized | +| BnB models | Already quantized | + +## Follow-up Work + +- Standalone VAE: Add `fp8_storage` field directly to VAE config classes +- Manual FP8 for custom classes: Implement FP8 storage for Flux Checkpoint (`Flux` class) without `enable_layerwise_casting()` +- Native FP8 compute: For RTX 40xx+ GPUs, use actual FP8 tensor cores via TorchAO diff --git a/docs/features/external-models/seedream.md b/docs/features/external-models/seedream.md new file mode 100644 index 00000000000..ff68291c019 --- /dev/null +++ b/docs/features/external-models/seedream.md @@ -0,0 +1,60 @@ +--- +title: BytePlus Seedream +--- + +# :material-image-sync-outline: BytePlus Seedream + +Invoke supports BytePlus's **Seedream** image generation family through the BytePlus Ark API. Seedream is a strong fit for 2K/4K generations and multi-reference image composition. + +## Getting an API Key + +1. Open the [BytePlus Console](https://console.byteplus.com/) and sign in. +2. Enable the **Ark** (model serving) product. +3. Create an API key with access to the Seedream models you plan to use. + +## Configuration + +Add your key to `api_keys.yaml` in your Invoke root directory: + +```yaml +external_seedream_api_key: "your-seedream-api-key" + +# Optional — change only if you need a different regional endpoint +external_seedream_base_url: "https://ark.ap-southeast.bytepluses.com" +``` + +Restart Invoke for the change to take effect. + +## Available Models + +| Model | Modes | Reference Images | Batch | Native Size | +| --- | --- | --- | --- | --- | +| **Seedream 5.0 Lite** | txt2img, img2img | up to 14 | up to 15 | 2K | +| **Seedream 4.5** | txt2img, img2img | up to 14 | up to 15 | 2K | +| **Seedream 4.0** | txt2img, img2img | up to 14 | up to 15 | 2K | +| **Seedream 3.0 T2I** | txt2img only | — | 1 | 1K | + +The 4.x / 5.x models are batch-capable and accept up to 14 reference images per request. Seedream 3.0 T2I is single-image only but exposes a **seed** for reproducible generations. + +### Supported Aspect Ratios + +All Seedream models share the same aspect ratio set: `1:1`, `2:3`, `3:2`, `3:4`, `4:3`, `9:16`, `16:9`, `21:9`. The 4.x / 5.x models render at 2K; 3.0 T2I renders at 1K. + +## Provider-Specific Options + +Seedream exposes two provider-specific toggles in the parameters panel: + +- **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. + +**Seed** and **guidance scale** are only sent for Seedream 3.0 models — the 4.x / 5.x family does not accept them. + +## Reference Images + +4.x and 5.x Seedream models accept up to 14 reference images alongside the prompt. Invoke's standard reference-image panel is used — drag images in, and they are forwarded as base64 PNGs to the API. + +## Tips + +- For multi-image composition (e.g. character + product), Seedream 4.5 is a good default. +- When running large batches (`num_images > 1` on 4.x / 5.x), Invoke uses the `sequential_image_generation` API flag — each image is returned as it completes. +- Set `external_seedream_base_url` if you need to route through a region-specific Ark endpoint. diff --git a/docs/src/generated/settings.json b/docs/src/generated/settings.json index 32140da667a..e68dfc59c01 100644 --- a/docs/src/generated/settings.json +++ b/docs/src/generated/settings.json @@ -767,6 +767,28 @@ "required": false, "type": "typing.Optional[str]", "validation": {} + }, + { + "category": "EXTERNAL PROVIDERS", + "default": null, + "description": "API key for Seedream image generation.", + "env_var": "INVOKEAI_EXTERNAL_SEEDREAM_API_KEY", + "literal_values": [], + "name": "external_seedream_api_key", + "required": false, + "type": "typing.Optional[str]", + "validation": {} + }, + { + "category": "EXTERNAL PROVIDERS", + "default": null, + "description": "Base URL override for Seedream image generation.", + "env_var": "INVOKEAI_EXTERNAL_SEEDREAM_BASE_URL", + "literal_values": [], + "name": "external_seedream_base_url", + "required": false, + "type": "typing.Optional[str]", + "validation": {} } ] } diff --git a/invokeai/app/api/dependencies.py b/invokeai/app/api/dependencies.py index ff55749f6b1..48789ee5038 100644 --- a/invokeai/app/api/dependencies.py +++ b/invokeai/app/api/dependencies.py @@ -17,7 +17,7 @@ from invokeai.app.services.download.download_default import DownloadQueueService from invokeai.app.services.events.events_fastapievents import FastAPIEventService from invokeai.app.services.external_generation.external_generation_default import ExternalGenerationService -from invokeai.app.services.external_generation.providers import GeminiProvider, OpenAIProvider +from invokeai.app.services.external_generation.providers import GeminiProvider, OpenAIProvider, SeedreamProvider from invokeai.app.services.external_generation.startup import sync_configured_external_starter_models from invokeai.app.services.image_files.image_files_disk import DiskImageFileStorage from invokeai.app.services.image_records.image_records_sqlite import SqliteImageRecordStorage @@ -163,6 +163,7 @@ def initialize( providers={ GeminiProvider.provider_id: GeminiProvider(app_config=configuration, logger=logger), OpenAIProvider.provider_id: OpenAIProvider(app_config=configuration, logger=logger), + SeedreamProvider.provider_id: SeedreamProvider(app_config=configuration, logger=logger), }, logger=logger, record_store=model_record_service, diff --git a/invokeai/app/api/routers/app_info.py b/invokeai/app/api/routers/app_info.py index ca134cc52ac..194bc37cfab 100644 --- a/invokeai/app/api/routers/app_info.py +++ b/invokeai/app/api/routers/app_info.py @@ -99,6 +99,7 @@ class ExternalProviderConfigModel(BaseModel): EXTERNAL_PROVIDER_FIELDS: dict[str, tuple[str, str]] = { "gemini": ("external_gemini_api_key", "external_gemini_base_url"), "openai": ("external_openai_api_key", "external_openai_base_url"), + "seedream": ("external_seedream_api_key", "external_seedream_base_url"), } _EXTERNAL_PROVIDER_CONFIG_LOCK = Lock() diff --git a/invokeai/app/invocations/external_image_generation.py b/invokeai/app/invocations/external_image_generation.py index 2082fc54c27..a226bcfcdd4 100644 --- a/invokeai/app/invocations/external_image_generation.py +++ b/invokeai/app/invocations/external_image_generation.py @@ -267,15 +267,58 @@ class GeminiImageGenerationInvocation(BaseExternalImageGenerationInvocation): mask_image: ImageField | None = InputField(default=None, description="Mask image for inpaint", ui_hidden=True) temperature: float | None = InputField(default=None, ge=0.0, le=2.0, description="Sampling temperature") + thinking_level: Literal["minimal", "high"] | None = InputField( + default=None, description="Thinking level for image generation" + ) def _build_provider_options(self) -> dict[str, Any] | None: options: dict[str, Any] = {} if self.temperature is not None: options["temperature"] = self.temperature + if self.thinking_level is not None: + options["thinking_level"] = self.thinking_level return options or None def _build_output_provider_metadata(self) -> dict[str, Any]: metadata: dict[str, Any] = {} if self.temperature is not None: metadata["gemini_temperature"] = self.temperature + if self.thinking_level is not None: + metadata["gemini_thinking_level"] = self.thinking_level return metadata + + +@invocation( + "seedream_image_generation", + title="Seedream Image Generation", + tags=["external", "generation", "seedream"], + category="image", + version="1.0.0", +) +class SeedreamImageGenerationInvocation(BaseExternalImageGenerationInvocation): + """Generate images using a BytePlus Seedream model.""" + + provider_id = "seedream" + + model: ModelIdentifierField = InputField( + description=FieldDescriptions.main_model, + ui_model_base=[BaseModelType.External], + ui_model_type=[ModelType.ExternalImageGenerator], + ui_model_format=[ModelFormat.ExternalApi], + ui_model_provider_id=["seedream"], + ) + + watermark: bool = InputField(default=False, description="Add watermark to generated images") + optimize_prompt: bool = InputField(default=False, description="Let the model optimize the prompt before generation") + + def _build_provider_options(self) -> dict[str, Any]: + return { + "watermark": self.watermark, + "optimize_prompt": self.optimize_prompt, + } + + def _build_output_provider_metadata(self) -> dict[str, Any]: + return { + "seedream_watermark": self.watermark, + "seedream_optimize_prompt": self.optimize_prompt, + } diff --git a/invokeai/app/services/config/config_default.py b/invokeai/app/services/config/config_default.py index 729eb1332c0..196ca2c7cd2 100644 --- a/invokeai/app/services/config/config_default.py +++ b/invokeai/app/services/config/config_default.py @@ -124,6 +124,8 @@ class InvokeAIAppConfig(BaseSettings): external_openai_api_key: API key for OpenAI image generation. external_gemini_base_url: Base URL override for Gemini image generation. external_openai_base_url: Base URL override for OpenAI image generation. + external_seedream_api_key: API key for Seedream image generation. + external_seedream_base_url: Base URL override for Seedream image generation. """ _root: Optional[Path] = PrivateAttr(default=None) @@ -231,6 +233,12 @@ class InvokeAIAppConfig(BaseSettings): external_openai_base_url: Optional[str] = Field( default=None, description="Base URL override for OpenAI image generation." ) + external_seedream_api_key: Optional[str] = Field( + default=None, description="API key for Seedream image generation." + ) + external_seedream_base_url: Optional[str] = Field( + default=None, description="Base URL override for Seedream image generation." + ) # fmt: on diff --git a/invokeai/app/services/external_generation/providers/__init__.py b/invokeai/app/services/external_generation/providers/__init__.py index 9e380fca1e1..ea901d7e123 100644 --- a/invokeai/app/services/external_generation/providers/__init__.py +++ b/invokeai/app/services/external_generation/providers/__init__.py @@ -1,4 +1,5 @@ from invokeai.app.services.external_generation.providers.gemini import GeminiProvider from invokeai.app.services.external_generation.providers.openai import OpenAIProvider +from invokeai.app.services.external_generation.providers.seedream import SeedreamProvider -__all__ = ["GeminiProvider", "OpenAIProvider"] +__all__ = ["GeminiProvider", "OpenAIProvider", "SeedreamProvider"] diff --git a/invokeai/app/services/external_generation/providers/gemini.py b/invokeai/app/services/external_generation/providers/gemini.py index a642160edaf..de2cf0e85a7 100644 --- a/invokeai/app/services/external_generation/providers/gemini.py +++ b/invokeai/app/services/external_generation/providers/gemini.py @@ -100,6 +100,8 @@ def generate(self, request: ExternalGenerationRequest) -> ExternalGenerationResu "contents": [{"role": "user", "parts": request_parts}], "generationConfig": generation_config, } + if "thinking_level" in opts: + payload["thinkingConfig"] = {"thinkingLevel": opts["thinking_level"].upper()} response = requests.post( endpoint, diff --git a/invokeai/app/services/external_generation/providers/seedream.py b/invokeai/app/services/external_generation/providers/seedream.py new file mode 100644 index 00000000000..3ad445b9490 --- /dev/null +++ b/invokeai/app/services/external_generation/providers/seedream.py @@ -0,0 +1,134 @@ +from __future__ import annotations + +import requests + +from invokeai.app.services.external_generation.errors import ( + ExternalProviderRateLimitError, + ExternalProviderRequestError, +) +from invokeai.app.services.external_generation.external_generation_base import ExternalProvider +from invokeai.app.services.external_generation.external_generation_common import ( + ExternalGeneratedImage, + ExternalGenerationRequest, + ExternalGenerationResult, +) +from invokeai.app.services.external_generation.image_utils import decode_image_base64, encode_image_base64 + +_SEEDREAM_BATCH_PREFIXES = ( + "seedream-5", + "seedream-4.5", + "seedream-4.0", + "seedream-4-5", + "seedream-4-0", + "seedream-5-0", +) + + +class SeedreamProvider(ExternalProvider): + provider_id = "seedream" + + def is_configured(self) -> bool: + return bool(self._app_config.external_seedream_api_key) + + def generate(self, request: ExternalGenerationRequest) -> ExternalGenerationResult: + api_key = self._app_config.external_seedream_api_key + if not api_key: + raise ExternalProviderRequestError("Seedream API key is not configured") + + base_url = (self._app_config.external_seedream_base_url or "https://ark.ap-southeast.bytepluses.com").rstrip( + "/" + ) + endpoint = f"{base_url}/api/v3/images/generations" + headers = {"Authorization": f"Bearer {api_key}"} + + model_id = request.model.provider_model_id + is_batch_model = any(model_id.startswith(prefix) for prefix in _SEEDREAM_BATCH_PREFIXES) + + opts = request.provider_options or {} + + payload: dict[str, object] = { + "model": model_id, + "prompt": request.prompt, + "size": f"{request.width}x{request.height}", + "response_format": "b64_json", + "watermark": opts.get("watermark", False), + } + + if opts.get("optimize_prompt"): + payload["optimize_prompt_options"] = {"optimize_prompt": True} + + # Seed and guidance_scale are only supported on 3.0 models + if not is_batch_model and request.seed is not None and request.seed >= 0: + payload["seed"] = request.seed + if not is_batch_model and opts.get("guidance_scale") is not None: + payload["guidance_scale"] = opts["guidance_scale"] + + # Batch generation for 4.x/5.x models + if is_batch_model: + if request.num_images > 1: + payload["sequential_image_generation"] = "auto" + payload["sequential_image_generation_options"] = {"max_images": request.num_images} + else: + payload["sequential_image_generation"] = "disabled" + + # Image input: init_image for img2img, reference images for 4.x + images_b64: list[str] = [] + if request.init_image is not None: + images_b64.append(f"data:image/png;base64,{encode_image_base64(request.init_image)}") + for reference in request.reference_images: + images_b64.append(f"data:image/png;base64,{encode_image_base64(reference.image)}") + + if images_b64: + payload["image"] = images_b64 if len(images_b64) > 1 else images_b64[0] + + response = requests.post(endpoint, headers=headers, json=payload, timeout=120) + + if not response.ok: + if response.status_code == 429: + retry_after = _parse_retry_after(response.headers.get("retry-after")) + raise ExternalProviderRateLimitError( + f"Seedream rate limit exceeded. {f'Retry after {retry_after:.0f}s.' if retry_after else 'Please try again later.'}", + retry_after=retry_after, + ) + raise ExternalProviderRequestError( + f"Seedream request failed with status {response.status_code}: {response.text}" + ) + + body = response.json() + if not isinstance(body, dict): + raise ExternalProviderRequestError("Seedream response payload was not a JSON object") + + generated_images: list[ExternalGeneratedImage] = [] + data_items = body.get("data") + if not isinstance(data_items, list): + raise ExternalProviderRequestError("Seedream response payload missing image data") + + for item in data_items: + if not isinstance(item, dict): + continue + # Items may be error objects for failed images in batch + if "error" in item: + continue + encoded = item.get("b64_json") + if not encoded: + continue + image = decode_image_base64(encoded) + generated_images.append(ExternalGeneratedImage(image=image, seed=request.seed)) + + if not generated_images: + raise ExternalProviderRequestError("Seedream response contained no images") + + return ExternalGenerationResult( + images=generated_images, + seed_used=request.seed, + provider_metadata={"model": model_id}, + ) + + +def _parse_retry_after(value: str | None) -> float | None: + if not value: + return None + try: + return float(value) + except ValueError: + return None diff --git a/invokeai/backend/model_manager/starter_models.py b/invokeai/backend/model_manager/starter_models.py index be8b9f73996..fb275d99066 100644 --- a/invokeai/backend/model_manager/starter_models.py +++ b/invokeai/backend/model_manager/starter_models.py @@ -1230,6 +1230,100 @@ def _gemini_3_resolution_presets( default_settings=ExternalApiModelDefaultSettings(width=1024, height=1024, num_images=1), panel_schema=ExternalModelPanelSchema(image=[{"name": "dimensions"}]), ) +SEEDREAM_ASPECT_RATIOS = ["1:1", "2:3", "3:2", "3:4", "4:3", "9:16", "16:9", "21:9"] +SEEDREAM_2K_SIZES = { + "1:1": ExternalImageSize(width=2048, height=2048), + "3:4": ExternalImageSize(width=1728, height=2304), + "4:3": ExternalImageSize(width=2304, height=1728), + "16:9": ExternalImageSize(width=2848, height=1600), + "9:16": ExternalImageSize(width=1600, height=2848), + "3:2": ExternalImageSize(width=2496, height=1664), + "2:3": ExternalImageSize(width=1664, height=2496), + "21:9": ExternalImageSize(width=3136, height=1344), +} +SEEDREAM_1K_SIZES = { + "1:1": ExternalImageSize(width=1024, height=1024), + "3:4": ExternalImageSize(width=864, height=1152), + "4:3": ExternalImageSize(width=1152, height=864), + "16:9": ExternalImageSize(width=1312, height=736), + "9:16": ExternalImageSize(width=736, height=1312), + "2:3": ExternalImageSize(width=832, height=1248), + "3:2": ExternalImageSize(width=1248, height=832), + "21:9": ExternalImageSize(width=1568, height=672), +} +SEEDREAM_PANEL_SCHEMA = ExternalModelPanelSchema(prompts=[{"name": "reference_images"}], image=[{"name": "dimensions"}]) +seedream_5_0_lite = StarterModel( + name="Seedream 5.0 Lite", + base=BaseModelType.External, + source="external://seedream/seedream-5-0-lite", + description="BytePlus Seedream 5.0 Lite image generation model (external API). Supports 2K and 3K resolutions, txt2img and img2img with multi-image reference input.", + type=ModelType.ExternalImageGenerator, + format=ModelFormat.ExternalApi, + capabilities=ExternalModelCapabilities( + modes=["txt2img", "img2img"], + supports_reference_images=True, + max_reference_images=14, + max_images_per_request=15, + allowed_aspect_ratios=SEEDREAM_ASPECT_RATIOS, + aspect_ratio_sizes=SEEDREAM_2K_SIZES, + ), + default_settings=ExternalApiModelDefaultSettings(width=2048, height=2048, num_images=1), + panel_schema=SEEDREAM_PANEL_SCHEMA, +) +seedream_4_5 = StarterModel( + name="Seedream 4.5", + base=BaseModelType.External, + source="external://seedream/seedream-4-5-251128", + description="BytePlus Seedream 4.5 image generation model (external API). Supports 2K and 4K resolutions, txt2img, img2img, batch generation, and multi-image reference input.", + type=ModelType.ExternalImageGenerator, + format=ModelFormat.ExternalApi, + capabilities=ExternalModelCapabilities( + modes=["txt2img", "img2img"], + supports_reference_images=True, + max_reference_images=14, + max_images_per_request=15, + allowed_aspect_ratios=SEEDREAM_ASPECT_RATIOS, + aspect_ratio_sizes=SEEDREAM_2K_SIZES, + ), + default_settings=ExternalApiModelDefaultSettings(width=2048, height=2048, num_images=1), + panel_schema=SEEDREAM_PANEL_SCHEMA, +) +seedream_4_0 = StarterModel( + name="Seedream 4.0", + base=BaseModelType.External, + source="external://seedream/seedream-4-0-250828", + description="BytePlus Seedream 4.0 image generation model (external API). Supports 1K, 2K, and 4K resolutions, txt2img, img2img, batch generation, and multi-image reference input.", + type=ModelType.ExternalImageGenerator, + format=ModelFormat.ExternalApi, + capabilities=ExternalModelCapabilities( + modes=["txt2img", "img2img"], + supports_reference_images=True, + max_reference_images=14, + max_images_per_request=15, + allowed_aspect_ratios=SEEDREAM_ASPECT_RATIOS, + aspect_ratio_sizes=SEEDREAM_2K_SIZES, + ), + default_settings=ExternalApiModelDefaultSettings(width=2048, height=2048, num_images=1), + panel_schema=SEEDREAM_PANEL_SCHEMA, +) +seedream_3_0_t2i = StarterModel( + name="Seedream 3.0 T2I", + base=BaseModelType.External, + source="external://seedream/seedream-3-0-t2i-250415", + description="BytePlus Seedream 3.0 text-to-image model (external API). Supports seed and guidance scale.", + type=ModelType.ExternalImageGenerator, + format=ModelFormat.ExternalApi, + capabilities=ExternalModelCapabilities( + modes=["txt2img"], + supports_seed=True, + max_images_per_request=1, + allowed_aspect_ratios=SEEDREAM_ASPECT_RATIOS, + aspect_ratio_sizes=SEEDREAM_1K_SIZES, + ), + default_settings=ExternalApiModelDefaultSettings(width=1024, height=1024, num_images=1), + panel_schema=ExternalModelPanelSchema(image=[{"name": "dimensions"}, {"name": "seed"}]), +) + # DALL-E 2 removed — deprecated by OpenAI, shutdown May 12, 2026. # region Anima anima_qwen3_encoder = StarterModel( @@ -1377,6 +1471,10 @@ def _gemini_3_resolution_presets( openai_gpt_image_1, openai_gpt_image_1_mini, openai_dall_e_3, + seedream_5_0_lite, + seedream_4_5, + seedream_4_0, + seedream_3_0_t2i, anima_preview3, anima_qwen3_encoder, anima_vae, diff --git a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts index 25670b28df0..f235d4b9010 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts @@ -500,6 +500,15 @@ const slice = createSlice({ geminiTemperatureChanged: (state, action: PayloadAction) => { state.geminiTemperature = action.payload; }, + geminiThinkingLevelChanged: (state, action: PayloadAction<'minimal' | 'high' | null>) => { + state.geminiThinkingLevel = action.payload; + }, + seedreamWatermarkChanged: (state, action: PayloadAction) => { + state.seedreamWatermark = action.payload; + }, + seedreamOptimizePromptChanged: (state, action: PayloadAction) => { + state.seedreamOptimizePrompt = action.payload; + }, resolutionPresetSelected: ( state, action: PayloadAction<{ imageSize: string; aspectRatio: string; width: number; height: number }> @@ -663,6 +672,9 @@ export const { openaiBackgroundChanged, openaiInputFidelityChanged, geminiTemperatureChanged, + geminiThinkingLevelChanged, + seedreamWatermarkChanged, + seedreamOptimizePromptChanged, paramsRecalled, animaVaeModelSelected, animaQwen3EncoderModelSelected, @@ -917,6 +929,9 @@ export const selectOpenaiQuality = createParamsSelector((params) => params.opena export const selectOpenaiBackground = createParamsSelector((params) => params.openaiBackground); export const selectOpenaiInputFidelity = createParamsSelector((params) => params.openaiInputFidelity); export const selectGeminiTemperature = createParamsSelector((params) => params.geminiTemperature); +export const selectGeminiThinkingLevel = createParamsSelector((params) => params.geminiThinkingLevel); +export const selectSeedreamWatermark = createParamsSelector((params) => params.seedreamWatermark); +export const selectSeedreamOptimizePrompt = createParamsSelector((params) => params.seedreamOptimizePrompt); export const selectExternalProviderId = createSelector(selectModelConfig, (modelConfig) => { if (modelConfig && isExternalApiModelConfig(modelConfig)) { return modelConfig.provider_id; diff --git a/invokeai/frontend/web/src/features/controlLayers/store/types.ts b/invokeai/frontend/web/src/features/controlLayers/store/types.ts index dff1981b44d..d90b3ac1331 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/types.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/types.ts @@ -828,6 +828,10 @@ export const zParamsState = z.object({ openaiInputFidelity: z.enum(['low', 'high']).nullable().default(null), // Gemini-specific external options geminiTemperature: z.number().min(0).max(2).nullable().default(null), + geminiThinkingLevel: z.enum(['minimal', 'high']).nullable().default(null), + // Seedream-specific external options + seedreamWatermark: z.boolean().default(false), + seedreamOptimizePrompt: z.boolean().default(false), dimensions: zDimensionsState, }); export type ParamsState = z.infer; @@ -904,6 +908,9 @@ export const getInitialParamsState = (): ParamsState => ({ openaiBackground: 'auto', openaiInputFidelity: null, geminiTemperature: null, + geminiThinkingLevel: null, + seedreamWatermark: false, + seedreamOptimizePrompt: false, dimensions: { width: 512, height: 512, diff --git a/invokeai/frontend/web/src/features/metadata/parsing.tsx b/invokeai/frontend/web/src/features/metadata/parsing.tsx index 24b643da319..4e32ac6f1bb 100644 --- a/invokeai/frontend/web/src/features/metadata/parsing.tsx +++ b/invokeai/frontend/web/src/features/metadata/parsing.tsx @@ -12,6 +12,7 @@ import { animaT5EncoderModelSelected, animaVaeModelSelected, geminiTemperatureChanged, + geminiThinkingLevelChanged, heightChanged, imageSizeChanged, kleinQwen3EncoderModelSelected, @@ -1414,6 +1415,25 @@ const GeminiTemperature: SingleMetadataHandler = { }; //#endregion Gemini Temperature +//#region Gemini Thinking Level +const zGeminiThinkingLevel = z.enum(['minimal', 'high']); +const GeminiThinkingLevel: SingleMetadataHandler<'minimal' | 'high'> = { + [SingleMetadataKey]: true, + type: 'GeminiThinkingLevel', + parse: (metadata, _store) => { + const raw = getProperty(metadata, 'gemini_thinking_level'); + const parsed = zGeminiThinkingLevel.parse(raw); + return Promise.resolve(parsed); + }, + recall: (value, store) => { + store.dispatch(geminiThinkingLevelChanged(value)); + }, + i18nKey: 'metadata.geminiThinkingLevel', + LabelComponent: MetadataLabel, + ValueComponent: ({ value }: SingleMetadataValueProps<'minimal' | 'high'>) => , +}; +//#endregion Gemini Thinking Level + //#region OpenAI Quality const OpenaiQuality: SingleMetadataHandler<'auto' | 'high' | 'medium' | 'low'> = { [SingleMetadataKey]: true, @@ -1522,6 +1542,7 @@ export const ImageMetadataHandlers = { RefImages, ImageSize, GeminiTemperature, + GeminiThinkingLevel, OpenaiQuality, OpenaiBackground, OpenaiInputFidelity, diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ExternalProviders/ExternalProvidersForm.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ExternalProviders/ExternalProvidersForm.tsx index aa540718686..a5d4993fbf9 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ExternalProviders/ExternalProvidersForm.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ExternalProviders/ExternalProvidersForm.tsx @@ -28,7 +28,7 @@ import { import { useGetStarterModelsQuery } from 'services/api/endpoints/models'; import type { ExternalProviderConfig, StarterModel } from 'services/api/types'; -const PROVIDER_SORT_ORDER = ['gemini', 'openai']; +const PROVIDER_SORT_ORDER = ['gemini', 'openai', 'seedream']; type ProviderCardProps = { provider: ExternalProviderConfig; diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildExternalGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildExternalGraph.ts index 7397e650a3d..d12842cb4f1 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildExternalGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildExternalGraph.ts @@ -25,6 +25,7 @@ import { assert } from 'tsafe'; const EXTERNAL_PROVIDER_NODE_TYPES = { gemini: 'gemini_image_generation', openai: 'openai_image_generation', + seedream: 'seedream_image_generation', } as const; export const buildExternalGraph = async (arg: GraphBuilderArg): Promise => { @@ -84,6 +85,12 @@ export const buildExternalGraph = async (arg: GraphBuilderArg): Promise { const { t } = useTranslation(); const dispatch = useAppDispatch(); const temperature = useAppSelector(selectGeminiTemperature); + const thinkingLevel = useAppSelector(selectGeminiThinkingLevel); const onTemperatureChange = useCallback((v: number) => dispatch(geminiTemperatureChanged(v)), [dispatch]); + const onThinkingLevelChange = useCallback>( + (e) => { + const value = e.target.value; + dispatch(geminiThinkingLevelChanged(value === '' ? null : (value as 'minimal' | 'high'))); + }, + [dispatch] + ); + return ( - - {t('parameters.temperature', 'Temperature')} - - - + <> + + {t('parameters.temperature', 'Temperature')} + + + + + {t('parameters.thinkingLevel', 'Thinking Level')} + + + ); }); diff --git a/invokeai/frontend/web/src/features/parameters/components/External/SeedreamProviderOptions.tsx b/invokeai/frontend/web/src/features/parameters/components/External/SeedreamProviderOptions.tsx new file mode 100644 index 00000000000..6c7bd90f46f --- /dev/null +++ b/invokeai/frontend/web/src/features/parameters/components/External/SeedreamProviderOptions.tsx @@ -0,0 +1,43 @@ +import { Checkbox, FormControl, FormLabel } from '@invoke-ai/ui-library'; +import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import { + seedreamOptimizePromptChanged, + seedreamWatermarkChanged, + selectSeedreamOptimizePrompt, + selectSeedreamWatermark, +} from 'features/controlLayers/store/paramsSlice'; +import type { ChangeEvent } from 'react'; +import { memo, useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; + +export const SeedreamProviderOptions = memo(() => { + const { t } = useTranslation(); + const dispatch = useAppDispatch(); + const watermark = useAppSelector(selectSeedreamWatermark); + const optimizePrompt = useAppSelector(selectSeedreamOptimizePrompt); + + const onWatermarkChange = useCallback( + (e: ChangeEvent) => dispatch(seedreamWatermarkChanged(e.target.checked)), + [dispatch] + ); + + const onOptimizePromptChange = useCallback( + (e: ChangeEvent) => dispatch(seedreamOptimizePromptChanged(e.target.checked)), + [dispatch] + ); + + return ( + <> + + {t('parameters.watermark', 'Watermark')} + + + + {t('parameters.optimizePrompt', 'Optimize Prompt')} + + + + ); +}); + +SeedreamProviderOptions.displayName = 'SeedreamProviderOptions'; diff --git a/invokeai/frontend/web/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx b/invokeai/frontend/web/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx index 2988acbd198..9b14da5f2d2 100644 --- a/invokeai/frontend/web/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx +++ b/invokeai/frontend/web/src/features/settingsAccordions/components/ExternalSettingsAccordion/ExternalSettingsAccordion.tsx @@ -6,6 +6,7 @@ import { ExternalModelImageSizeSelect } from 'features/parameters/components/Dim import { ExternalModelResolutionSelect } from 'features/parameters/components/Dimensions/ExternalModelResolutionSelect'; import { GeminiProviderOptions } from 'features/parameters/components/External/GeminiProviderOptions'; import { OpenAIProviderOptions } from 'features/parameters/components/External/OpenAIProviderOptions'; +import { SeedreamProviderOptions } from 'features/parameters/components/External/SeedreamProviderOptions'; import { useStandaloneAccordionToggle } from 'features/settingsAccordions/hooks/useStandaloneAccordionToggle'; import { memo } from 'react'; import { useTranslation } from 'react-i18next'; @@ -40,6 +41,7 @@ export const ExternalSettingsAccordion = memo(() => { {providerId === 'openai' && } {providerId === 'gemini' && } + {providerId === 'seedream' && } diff --git a/invokeai/frontend/web/src/services/api/schema.ts b/invokeai/frontend/web/src/services/api/schema.ts index e1dd2ad361c..69eb07f8a36 100644 --- a/invokeai/frontend/web/src/services/api/schema.ts +++ b/invokeai/frontend/web/src/services/api/schema.ts @@ -11720,6 +11720,12 @@ export type components = { * @default null */ temperature?: number | null; + /** + * Thinking Level + * @description Thinking level for image generation + * @default null + */ + thinking_level?: ("minimal" | "high") | null; /** * type * @default gemini_image_generation @@ -11826,7 +11832,7 @@ export type components = { * @description The nodes in this graph */ nodes?: { - [key: string]: components["schemas"]["AddInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + [key: string]: components["schemas"]["AddInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; }; /** * Edges @@ -15115,7 +15121,7 @@ export type components = { * Invocation * @description The ID of the invocation */ - invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -15179,7 +15185,7 @@ export type components = { * Invocation * @description The ID of the invocation */ - invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -15420,6 +15426,7 @@ export type components = { sdxl_refiner_compel_prompt: components["schemas"]["ConditioningOutput"]; sdxl_refiner_model_loader: components["schemas"]["SDXLRefinerModelLoaderOutput"]; seamless: components["schemas"]["SeamlessModeOutput"]; + seedream_image_generation: components["schemas"]["ImageCollectionOutput"]; segment_anything: components["schemas"]["MaskOutput"]; show_image: components["schemas"]["ImageOutput"]; spandrel_image_to_image: components["schemas"]["ImageOutput"]; @@ -15504,7 +15511,7 @@ export type components = { * Invocation * @description The ID of the invocation */ - invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -15579,7 +15586,7 @@ export type components = { * Invocation * @description The ID of the invocation */ - invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -15657,6 +15664,8 @@ export type components = { * external_openai_api_key: API key for OpenAI image generation. * external_gemini_base_url: Base URL override for Gemini image generation. * external_openai_base_url: Base URL override for OpenAI image generation. + * external_seedream_api_key: API key for Seedream image generation. + * external_seedream_base_url: Base URL override for Seedream image generation. */ InvokeAIAppConfig: { /** @@ -16061,6 +16070,16 @@ export type components = { * @description Base URL override for OpenAI image generation. */ external_openai_base_url?: string | null; + /** + * External Seedream Api Key + * @description API key for Seedream image generation. + */ + external_seedream_api_key?: string | null; + /** + * External Seedream Base Url + * @description Base URL override for Seedream image generation. + */ + external_seedream_base_url?: string | null; }; /** * InvokeAIAppConfigWithSetFields @@ -26501,6 +26520,121 @@ export type components = { */ type: "seamless_output"; }; + /** + * Seedream Image Generation + * @description Generate images using a BytePlus Seedream model. + */ + SeedreamImageGenerationInvocation: { + /** + * @description The board to save the image to + * @default null + */ + board?: components["schemas"]["BoardField"] | null; + /** + * @description Optional metadata to be saved with the image + * @default null + */ + metadata?: components["schemas"]["MetadataField"] | null; + /** + * Id + * @description The id of this instance of an invocation. Must be unique among all instances of invocations. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this is an intermediate invocation. + * @default false + */ + is_intermediate?: boolean; + /** + * Use Cache + * @description Whether or not to use the cache + * @default true + */ + use_cache?: boolean; + /** + * @description Main model (UNet, VAE, CLIP) to load + * @default null + */ + model?: components["schemas"]["ModelIdentifierField"] | null; + /** + * Mode + * @description Generation mode. Not all modes are supported by every model; unsupported modes raise at runtime. + * @default txt2img + * @enum {string} + */ + mode?: "txt2img" | "img2img" | "inpaint"; + /** + * Prompt + * @description Prompt + * @default null + */ + prompt?: string | null; + /** + * Seed + * @description Seed for random number generation + * @default null + */ + seed?: number | null; + /** + * Num Images + * @description Number of images to generate + * @default 1 + */ + num_images?: number; + /** + * Width + * @description Width of output (px) + * @default 1024 + */ + width?: number; + /** + * Height + * @description Height of output (px) + * @default 1024 + */ + height?: number; + /** + * Image Size + * @description Image size preset (e.g. 1K, 2K, 4K) + * @default null + */ + image_size?: string | null; + /** + * @description Init image for img2img/inpaint + * @default null + */ + init_image?: components["schemas"]["ImageField"] | null; + /** + * @description Mask image for inpaint + * @default null + */ + mask_image?: components["schemas"]["ImageField"] | null; + /** + * Reference Images + * @description Reference images + * @default [] + */ + reference_images?: components["schemas"]["ImageField"][]; + /** + * Watermark + * @description Add watermark to generated images + * @default false + */ + watermark?: boolean; + /** + * Optimize Prompt + * @description Let the model optimize the prompt before generation + * @default false + */ + optimize_prompt?: boolean; + /** + * type + * @default seedream_image_generation + * @constant + */ + type: "seedream_image_generation"; + }; /** * Segment Anything * @description Runs a Segment Anything Model (SAM or SAM2). diff --git a/mkdocs.yml b/mkdocs.yml index 0fdd9659739..4c025413aac 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -145,6 +145,7 @@ nav: - Overview: 'features/external-models/index.md' - Google Gemini: 'features/external-models/gemini.md' - OpenAI: 'features/external-models/openai.md' + - BytePlus Seedream: 'features/external-models/seedream.md' - Multi-User Mode: - User Guide: 'multiuser/user_guide.md' - Administrator Guide: 'multiuser/admin_guide.md' diff --git a/pr-8822-review.md b/pr-8822-review.md new file mode 100644 index 00000000000..7ea8f022d10 --- /dev/null +++ b/pr-8822-review.md @@ -0,0 +1,108 @@ +# Code Review: PR #8822 - Multi-User Mode + +**PR:** https://github.com/invoke-ai/InvokeAI/pull/8822 +**Author:** lstein +**Head SHA:** `b4ab173b3c7a1d4551b6be0fe45af9af9aeb8bd3` +**Scope:** 118 files changed, +12,200 / -380 lines + +--- + +## Summary + +This PR adds multiuser support to InvokeAI, allowing multiple users to share a single backend with isolated boards, images, assets, and queue items. Includes user authentication (JWT), role-based access control (admin vs regular user), WebSocket event filtering, database migrations, and a full frontend auth flow (login, admin setup, user menu). + +--- + +## Issues Found + +### High Confidence (score >= 80) + +**1. `boards.get_all()` missing required `is_admin` argument -- will crash at runtime** (score: 100) + +In `invokeai/app/services/shared/invocation_context.py`, the call to `boards.get_all()` is missing the required `is_admin` positional argument. The method signature was changed to `get_all(self, user_id, is_admin, order_by, direction, include_archived)` but this call site only passes `user_id`, `order_by`, and `direction`. This will cause a `TypeError` whenever any invocation node calls `context.boards.get_all()`. + +https://github.com/invoke-ai/InvokeAI/blob/b4ab173b3c7a1d4551b6be0fe45af9af9aeb8bd3/invokeai/app/services/shared/invocation_context.py#L103-L106 + +--- + +**2. Token verification accepts tokens without `exp` field indefinitely** (score: 100) + +In `invokeai/app/services/auth/token_service.py`, the expiry check is `if "exp" in payload:` -- if `exp` is absent, the token is accepted with no expiration. While server-generated tokens always include `exp`, a crafted token (by anyone with knowledge of the JWT secret) would never expire. The check should require `exp` to be present and reject tokens without it. + +https://github.com/invoke-ai/InvokeAI/blob/b4ab173b3c7a1d4551b6be0fe45af9af9aeb8bd3/invokeai/app/services/auth/token_service.py#L91-L99 + +--- + +**3. `clear` endpoint wipes ALL users' queue items, not just the caller's** (score: 100) + +The `clear` endpoint in `session_queue.py` calls `session_queue.clear(queue_id)` which deletes ALL queue items for ALL users. The endpoint only checks ownership of the currently-executing item, but then unconditionally wipes the entire queue. A non-admin user can clear every other user's pending jobs. The underlying `SqliteSessionQueue.clear()` method has no `user_id` parameter, unlike `prune` and other similar methods that were updated for multi-tenancy. + +https://github.com/invoke-ai/InvokeAI/blob/b4ab173b3c7a1d4551b6be0fe45af9af9aeb8bd3/invokeai/app/api/routers/session_queue.py#L327-L346 + +--- + +### Moderate Confidence (score 50-79) + +**4. `resume`/`pause` endpoints use `AdminUser` instead of `AdminUserOrDefault` -- broken in single-user mode** (score: 75) + +The `resume` and `pause` endpoints use `AdminUser` which requires an authenticated token. In single-user mode (default deployment), no tokens exist, so these endpoints return 401. Other admin-only endpoints correctly use `AdminUserOrDefault` which falls back to a system admin in single-user mode. + +https://github.com/invoke-ai/InvokeAI/blob/b4ab173b3c7a1d4551b6be0fe45af9af9aeb8bd3/invokeai/app/api/routers/session_queue.py + +--- + +**5. Board `update_board`/`delete_board` have no ownership check** (score: 75) + +Both endpoints inject `current_user` but never verify the board belongs to that user. The docstrings say "user must have access to it" but no validation occurs. Any authenticated user can modify or delete any other user's boards by board ID. + +https://github.com/invoke-ai/InvokeAI/blob/b4ab173b3c7a1d4551b6be0fe45af9af9aeb8bd3/invokeai/app/api/routers/boards.py + +--- + +**7. `_handle_unsub_queue` doesn't leave user/admin rooms** (score: 75) + +`_handle_sub_queue` joins three rooms (queue, `user:{user_id}`, and `admin`), but `_handle_unsub_queue` only leaves the queue room. Unsubscribed sockets remain in user/admin rooms and continue receiving private events. + +https://github.com/invoke-ai/InvokeAI/blob/b4ab173b3c7a1d4551b6be0fe45af9af9aeb8bd3/invokeai/app/api/sockets.py + +--- + +**8. Direct image fetch endpoints have no authentication** (score: 75) + +`get_image_full`, `get_image_dto`, `get_image_thumbnail`, and `get_image_metadata` have no `current_user` dependency. Any user who knows an `image_name` can fetch any other user's images directly, bypassing the user isolation that was added to list endpoints. + +https://github.com/invoke-ai/InvokeAI/blob/b4ab173b3c7a1d4551b6be0fe45af9af9aeb8bd3/invokeai/app/api/routers/images.py + +--- + +**9. SocketIO `cors_allowed_origins="*"` while HTTP CORS is configurable** (score: 75) + +The Socket.IO server hardcodes `cors_allowed_origins="*"` while the HTTP layer uses configurable `allow_origins` from `app_config`. Any webpage can connect to the WebSocket even if HTTP CORS is restricted, which is a security regression now that token-based socket auth exists. + +https://github.com/invoke-ai/InvokeAI/blob/b4ab173b3c7a1d4551b6be0fe45af9af9aeb8bd3/invokeai/app/api/sockets.py + +--- + +### Lower Confidence (score < 50) + +**11. `authenticate()` updates `last_login_at` for disabled users** (score: 25) + +The `is_active` check happens in the router after `authenticate()` returns, so `last_login_at` is updated even for deactivated accounts. + +**12. `get_queue_item_ids` endpoint has no authentication** (score: 50) + +Returns item IDs without requiring auth, though the exposure is limited since it only returns IDs, not full items. + +**13-14. Missing colocated tests for `validatePasswordStrength` and `getBadgeText`** (score: 50) + +Pure functions with non-trivial branching logic added without `.test.ts` files. CLAUDE.md requires colocated tests for non-trivial logic, but these are borderline given "We currently do not do UI tests." + +--- + +### False Positives Identified + +- **`sanitize_queue_item_for_user` shallow copy**: The shallow copy is safe here because all fields are either set to `None` or replaced with new objects, never mutated in place. +- **Migration ordering conflict**: Already acknowledged by lstein in PR comments and consolidated into a single migration file. +- **Redundant `hasattr` guards in `_handle_queue_event`**: While technically always true (since `user_id` has a default), this is defensive coding and doesn't cause bugs. +- **`list_image_dtos` missing `is_admin` parameter**: Verified manually -- admin can see all users' images in practice, so the filtering works correctly despite the parameter not being explicitly passed. +- **`list_queue_items` missing user JOIN**: `list_queue_items` is never called by any router or service -- only `list_all_queue_items` (which has the correct JOIN) is actually used. diff --git a/pr-8884-review.md b/pr-8884-review.md new file mode 100644 index 00000000000..3b9ac5efebd --- /dev/null +++ b/pr-8884-review.md @@ -0,0 +1,113 @@ +# Code Review: PR #8884 - External Models (Gemini & OpenAI GPT Image) + +**PR:** https://github.com/invoke-ai/InvokeAI/pull/8884 +**Author:** CypherNaught-0x +**Head SHA:** `7671304195518fe010b6e9b080f7a30b752015ca` +**Scope:** 79 files changed, +4619 / -143 lines + +--- + +## Summary + +This PR adds support for external image generation provider APIs (Google Gemini and OpenAI GPT Image). It includes: +- A new `ExternalGenerationService` with provider adapters for Gemini and OpenAI +- New `ExternalApiModelConfig` model type and install flow via `external://` source URIs +- API key management endpoints and config persistence +- Frontend graph builder, model selection UI, and provider badge display +- Tests and documentation + +--- + +## Issues Found + +### High Confidence (score >= 80) + +**1. Debug file dump writes request payloads and images to disk unconditionally** (score: 85) + +In `invokeai/app/services/external_generation/providers/gemini.py`, the methods `_dump_debug_payload` and `_dump_debug_image` are called on **every single Gemini API request** with no flag or config option to disable them. Both methods are annotated with `TODO: remove debug payload dump once Gemini is stable` / `TODO: remove debug image dump once Gemini is stable`. + +They write: +- Full JSON request/response payloads (including base64-encoded image data) to `outputs/external_debug/gemini/{label}_{uuid}.json` +- Decoded PNG images to `outputs/external_debug/gemini/decoded_{uuid}.png` + +This causes **unbounded disk growth** and silently persists all user generation data (prompts, images, API responses) to disk with no user knowledge or consent. There is no way to disable this behavior -- it runs whenever `outputs_path` is set, which is always the case in normal operation. + +https://github.com/invoke-ai/InvokeAI/blob/7671304195518fe010b6e9b080f7a30b752015ca/invokeai/app/services/external_generation/providers/gemini.py (methods `_dump_debug_payload` and `_dump_debug_image`) + +--- + +### Moderate Confidence (score 50-79) + +**2. Service layer imports from API layer -- inverted dependency** (score: 70) + +In `invokeai/app/services/external_generation/external_generation_default.py`, the method `_refresh_model_capabilities` does: + +```python +from invokeai.app.api.dependencies import ApiDependencies +record = ApiDependencies.invoker.services.model_manager.store.get_model(request.model.key) +``` + +No other service in the codebase imports from `invokeai.app.api.dependencies`. All other services receive their dependencies via constructor injection through `InvocationServices`. This is an architectural violation that makes the service harder to test in isolation and creates a hidden coupling between the service and API layers. + +**3. `ExternalModelSource` incorrectly mapped to `ModelSourceType.Url`** (score: 50) + +In `invokeai/app/services/model_install/model_install_common.py`: + +```python +MODEL_SOURCE_TO_TYPE_MAP = { + ... + ExternalModelSource: ModelSourceType.Url, +} +``` + +`ExternalModelSource` is not a URL source. There is no `ModelSourceType.External` enum value in `taxonomy.py`. This means external models get recorded as `Url`-type sources in the database, which is semantically incorrect and could cause issues in any code that branches on `source_type`. + +**4. `_apply_external_provider_update` directly mutates `model_fields_set`** (score: 50) + +In `invokeai/app/api/routers/app_info.py`: + +```python +for config in (runtime_config, file_config): + config.update_config(updates) + for field_name, value in updates.items(): + if value is None: + config.model_fields_set.discard(field_name) +``` + +This directly mutates the `model_fields_set` of the global singleton `InvokeAIAppConfig`, bypassing Pydantic's field-tracking internals. Concurrent requests to `set_external_provider_config` or `reset_external_provider_config` could race on this shared mutable set. + +**5. Duplicate key conflict on reinstall of external model** (score: 50) + +In `invokeai/app/services/model_install/model_install_default.py`, `_register_external_model` generates a deterministic key via `slugify(f"{provider_id}-{provider_model_id}")`. Installing the same external model twice produces the same key. While the DB layer catches this with `DuplicateModelException`, there is no proactive check or update-if-exists logic, resulting in an unhelpful error for the user. + +**6. `setattr` used on Pydantic models instead of `model_copy`** (score: 50) + +In `invokeai/app/api/routers/model_manager.py`, `list_model_records` uses `setattr(model, "capabilities", ...)` and `setattr(model, "default_settings", ...)` on Pydantic model instances. Pydantic v2 models may not support direct attribute mutation without `validate_assignment = True`. The PR itself uses `model_copy(update=...)` correctly in other places (e.g., `_apply_starter_overrides` in `external_generation_default.py`), so this is inconsistent. + +--- + +### Low Confidence / Nitpicks (score < 50) + +**7. API key potentially leaked in error messages** (score: 40) + +In `gemini.py`, the Gemini API key is passed as a URL query parameter (`params={"key": api_key}`), and error handling includes raw `response.text` in exception messages. If the API echoes back the request URL in error responses, the key could be exposed in logs or UI. + +**8. Duplicate ratio utility functions** (score: 40) + +Functions `_parse_ratio`, `_gcd`, `_format_aspect_ratio`, `_select_closest_ratio` are duplicated between `external_generation_default.py` and `providers/gemini.py`. + +**9. `InvokeAIAppConfig` docstring not updated** (score: 25) + +The class has an exhaustive `Attributes:` docstring listing all 40+ config fields. The 4 new fields (`external_gemini_api_key`, `external_openai_api_key`, `external_gemini_base_url`, `external_openai_base_url`) are not added to it. + +**10. Missing section comment in `factory.py` `AnyModelConfig` union** (score: 25) + +Every group of model configs in the union has a section comment (e.g., `# Main (Pipeline) - diffusers format`). `ExternalApiModelConfig` is added without one. + +--- + +### False Positives Identified + +- **`positivePrompt` node value never set in `buildExternalGraph`**: FALSE POSITIVE. The prompt value is injected via `prepareLinearUIBatch` batch data mechanism, same as all other graph builders (SD1, FLUX, Z-Image, etc.). The `string` node intentionally starts empty and gets its value from batch processing. + +- **`reidentify_model` `hasattr`/`setattr` dead code for external models**: Low concern. While `from_model_on_disk` raises for external models before reaching this code, the defensive guard doesn't cause harm and protects against future changes. diff --git a/tests/app/services/external_generation/test_seedream_provider.py b/tests/app/services/external_generation/test_seedream_provider.py new file mode 100644 index 00000000000..1981ee0d0b9 --- /dev/null +++ b/tests/app/services/external_generation/test_seedream_provider.py @@ -0,0 +1,302 @@ +import logging + +import pytest +from PIL import Image + +from invokeai.app.services.config.config_default import InvokeAIAppConfig +from invokeai.app.services.external_generation.errors import ExternalProviderRequestError +from invokeai.app.services.external_generation.external_generation_common import ( + ExternalGenerationRequest, + ExternalReferenceImage, +) +from invokeai.app.services.external_generation.image_utils import encode_image_base64 +from invokeai.app.services.external_generation.providers.seedream import SeedreamProvider +from invokeai.backend.model_manager.configs.external_api import ExternalApiModelConfig, ExternalModelCapabilities + + +class DummyResponse: + def __init__(self, ok: bool, status_code: int = 200, json_data: dict | None = None, text: str = "") -> None: + self.ok = ok + self.status_code = status_code + self._json_data = json_data or {} + self.text = text + self.headers: dict[str, str] = {} + + def json(self) -> dict: + return self._json_data + + +def _make_image(color: str = "black") -> Image.Image: + return Image.new("RGB", (32, 32), color=color) + + +def _build_model(provider_model_id: str, modes: list[str] | None = None) -> ExternalApiModelConfig: + return ExternalApiModelConfig( + key="seedream_test", + name="Seedream Test", + provider_id="seedream", + provider_model_id=provider_model_id, + capabilities=ExternalModelCapabilities( + modes=modes or ["txt2img", "img2img"], + supports_reference_images=True, + supports_seed=True, + ), + ) + + +def _build_request( + model: ExternalApiModelConfig, + mode: str = "txt2img", + init_image: Image.Image | None = None, + reference_images: list[ExternalReferenceImage] | None = None, + num_images: int = 1, + seed: int | None = 123, + provider_options: dict | None = None, +) -> ExternalGenerationRequest: + return ExternalGenerationRequest( + model=model, + mode=mode, # type: ignore[arg-type] + prompt="A test prompt", + seed=seed, + num_images=num_images, + width=2048, + height=2048, + image_size=None, + init_image=init_image, + mask_image=None, + reference_images=reference_images or [], + metadata=None, + provider_options=provider_options, + ) + + +def test_seedream_is_configured() -> None: + config = InvokeAIAppConfig(external_seedream_api_key="test-key") + provider = SeedreamProvider(config, logging.getLogger("test")) + assert provider.is_configured() is True + + +def test_seedream_not_configured() -> None: + config = InvokeAIAppConfig() + provider = SeedreamProvider(config, logging.getLogger("test")) + assert provider.is_configured() is False + + +def test_seedream_txt2img_success(monkeypatch: pytest.MonkeyPatch) -> None: + api_key = "seedream-key" + config = InvokeAIAppConfig(external_seedream_api_key=api_key) + provider = SeedreamProvider(config, logging.getLogger("test")) + model = _build_model("seedream-4-5-251128") + request = _build_request(model) + encoded = encode_image_base64(_make_image("green")) + captured: dict[str, object] = {} + + def fake_post(url: str, headers: dict, json: dict, timeout: int) -> DummyResponse: + captured["url"] = url + captured["headers"] = headers + captured["json"] = json + return DummyResponse(ok=True, json_data={"data": [{"b64_json": encoded}]}) + + monkeypatch.setattr("requests.post", fake_post) + + result = provider.generate(request) + + assert captured["url"] == "https://ark.ap-southeast.bytepluses.com/api/v3/images/generations" + headers = captured["headers"] + assert isinstance(headers, dict) + assert headers["Authorization"] == f"Bearer {api_key}" + json_payload = captured["json"] + assert isinstance(json_payload, dict) + assert json_payload["model"] == "seedream-4-5-251128" + assert json_payload["prompt"] == "A test prompt" + assert json_payload["size"] == "2048x2048" + assert json_payload["response_format"] == "b64_json" + assert json_payload["watermark"] is False + assert json_payload["sequential_image_generation"] == "disabled" + # Seed should not be sent for 4.x models + assert "seed" not in json_payload + # Guidance should not be sent for 4.x models + assert "guidance_scale" not in json_payload + assert len(result.images) == 1 + assert result.images[0].seed == 123 + + +def test_seedream_3_0_t2i_sends_seed_and_guidance(monkeypatch: pytest.MonkeyPatch) -> None: + config = InvokeAIAppConfig(external_seedream_api_key="seedream-key") + provider = SeedreamProvider(config, logging.getLogger("test")) + model = _build_model("seedream-3-0-t2i-250415", modes=["txt2img"]) + request = _build_request(model, seed=42, provider_options={"guidance_scale": 2.5}) + encoded = encode_image_base64(_make_image("green")) + captured: dict[str, object] = {} + + def fake_post(url: str, headers: dict, json: dict, timeout: int) -> DummyResponse: + captured["json"] = json + return DummyResponse(ok=True, json_data={"data": [{"b64_json": encoded}]}) + + monkeypatch.setattr("requests.post", fake_post) + + provider.generate(request) + + json_payload = captured["json"] + assert isinstance(json_payload, dict) + assert json_payload["seed"] == 42 + assert json_payload["guidance_scale"] == 2.5 + # 3.0 models should not have sequential_image_generation + assert "sequential_image_generation" not in json_payload + + +def test_seedream_batch_generation(monkeypatch: pytest.MonkeyPatch) -> None: + config = InvokeAIAppConfig(external_seedream_api_key="seedream-key") + provider = SeedreamProvider(config, logging.getLogger("test")) + model = _build_model("seedream-4-5-251128") + request = _build_request(model, num_images=3) + encoded = encode_image_base64(_make_image("green")) + captured: dict[str, object] = {} + + def fake_post(url: str, headers: dict, json: dict, timeout: int) -> DummyResponse: + captured["json"] = json + return DummyResponse( + ok=True, + json_data={"data": [{"b64_json": encoded}, {"b64_json": encoded}, {"b64_json": encoded}]}, + ) + + monkeypatch.setattr("requests.post", fake_post) + + result = provider.generate(request) + + json_payload = captured["json"] + assert isinstance(json_payload, dict) + assert json_payload["sequential_image_generation"] == "auto" + assert json_payload["sequential_image_generation_options"] == {"max_images": 3} + assert len(result.images) == 3 + + +def test_seedream_img2img_with_reference_images(monkeypatch: pytest.MonkeyPatch) -> None: + config = InvokeAIAppConfig(external_seedream_api_key="seedream-key") + provider = SeedreamProvider(config, logging.getLogger("test")) + model = _build_model("seedream-4-5-251128") + init_image = _make_image("blue") + ref_image = _make_image("red") + request = _build_request( + model, + mode="img2img", + init_image=init_image, + reference_images=[ExternalReferenceImage(image=ref_image)], + ) + encoded = encode_image_base64(_make_image("green")) + captured: dict[str, object] = {} + + def fake_post(url: str, headers: dict, json: dict, timeout: int) -> DummyResponse: + captured["json"] = json + return DummyResponse(ok=True, json_data={"data": [{"b64_json": encoded}]}) + + monkeypatch.setattr("requests.post", fake_post) + + result = provider.generate(request) + + json_payload = captured["json"] + assert isinstance(json_payload, dict) + images = json_payload["image"] + assert isinstance(images, list) + assert len(images) == 2 # init_image + reference + assert images[0].startswith("data:image/png;base64,") + assert images[1].startswith("data:image/png;base64,") + assert len(result.images) == 1 + + +def test_seedream_single_image_not_array(monkeypatch: pytest.MonkeyPatch) -> None: + config = InvokeAIAppConfig(external_seedream_api_key="seedream-key") + provider = SeedreamProvider(config, logging.getLogger("test")) + model = _build_model("seedream-3-0-t2i-250415", modes=["txt2img"]) + init_image = _make_image("blue") + request = _build_request(model, mode="txt2img", init_image=init_image, provider_options={"guidance_scale": 5.5}) + encoded = encode_image_base64(_make_image("green")) + captured: dict[str, object] = {} + + def fake_post(url: str, headers: dict, json: dict, timeout: int) -> DummyResponse: + captured["json"] = json + return DummyResponse(ok=True, json_data={"data": [{"b64_json": encoded}]}) + + monkeypatch.setattr("requests.post", fake_post) + + provider.generate(request) + + json_payload = captured["json"] + assert isinstance(json_payload, dict) + # Single image should be a string, not an array + image = json_payload["image"] + assert isinstance(image, str) + assert image.startswith("data:image/png;base64,") + + +def test_seedream_error_response(monkeypatch: pytest.MonkeyPatch) -> None: + config = InvokeAIAppConfig(external_seedream_api_key="seedream-key") + provider = SeedreamProvider(config, logging.getLogger("test")) + model = _build_model("seedream-4-5-251128") + request = _build_request(model) + + def fake_post(url: str, headers: dict, json: dict, timeout: int) -> DummyResponse: + return DummyResponse(ok=False, status_code=400, text="bad request") + + monkeypatch.setattr("requests.post", fake_post) + + with pytest.raises(ExternalProviderRequestError, match="Seedream request failed"): + provider.generate(request) + + +def test_seedream_no_api_key_raises(monkeypatch: pytest.MonkeyPatch) -> None: + config = InvokeAIAppConfig() + provider = SeedreamProvider(config, logging.getLogger("test")) + model = _build_model("seedream-4-5-251128") + request = _build_request(model) + + with pytest.raises(ExternalProviderRequestError, match="API key is not configured"): + provider.generate(request) + + +def test_seedream_uses_base_url(monkeypatch: pytest.MonkeyPatch) -> None: + config = InvokeAIAppConfig( + external_seedream_api_key="seedream-key", + external_seedream_base_url="https://proxy.seedream/", + ) + provider = SeedreamProvider(config, logging.getLogger("test")) + model = _build_model("seedream-4-5-251128") + request = _build_request(model) + encoded = encode_image_base64(_make_image("green")) + captured: dict[str, object] = {} + + def fake_post(url: str, headers: dict, json: dict, timeout: int) -> DummyResponse: + captured["url"] = url + return DummyResponse(ok=True, json_data={"data": [{"b64_json": encoded}]}) + + monkeypatch.setattr("requests.post", fake_post) + + provider.generate(request) + + assert captured["url"] == "https://proxy.seedream/api/v3/images/generations" + + +def test_seedream_batch_skips_error_items(monkeypatch: pytest.MonkeyPatch) -> None: + config = InvokeAIAppConfig(external_seedream_api_key="seedream-key") + provider = SeedreamProvider(config, logging.getLogger("test")) + model = _build_model("seedream-4-5-251128") + request = _build_request(model, num_images=3) + encoded = encode_image_base64(_make_image("green")) + + def fake_post(url: str, headers: dict, json: dict, timeout: int) -> DummyResponse: + return DummyResponse( + ok=True, + json_data={ + "data": [ + {"b64_json": encoded}, + {"error": {"code": "content_filter", "message": "filtered"}}, + {"b64_json": encoded}, + ] + }, + ) + + monkeypatch.setattr("requests.post", fake_post) + + result = provider.generate(request) + + assert len(result.images) == 2