Skip to content

Python 3.14.6 and related version updates - #9225

Draft
dunkeroni wants to merge 63 commits into
invoke-ai:mainfrom
dunkeroni:dependency_cascade
Draft

dunkeroni wants to merge 63 commits into
invoke-ai:mainfrom
dunkeroni:dependency_cascade

Conversation

@dunkeroni

@dunkeroni dunkeroni commented May 22, 2026

Copy link
Copy Markdown
Collaborator

Summary

Changes to the pyptoject.toml to bring up installation to python 3.14.6 with CUDA 13.0 and Torch 2.12

Mediapipe had a breaking change that removed their Solutions API, so support for a face controlnet had to be rewritten.

Related Issues / Discussions

Known difference: Generation results are not the same as they were before. Torch.randn() is generating different noise when using dtype=torch.float16 than it was in previous versions. This might technically improve the quality of some more sensitive models, but will probably not be noticeable aside from the seeds being completely different.

Potential Issue: #8494 locked sentencepiece (used by Transformers) to 2.0.0 to avoid a crash on Windows. For python compatibility, it had to be updated to 2.1.0 again (the version causing crashes). Will need to test if this is still a problem once Compel is updated to allow the newer Transformers.

QA Instructions

  1. Install Python 3.14.6 on your system. Make sure there are no errors or missing modules declared, and if there are then install them and then install python 3.14.6 again. Using pyenv on Ubuntu threw missing errors for curses, sqlite3, readline ,etc.
  2. Delete your existing developer .venv, create a new one using Python 3.14.6, and activate.
  3. Install using UV_HTTP_TIMEOUT=600 uv pip install -e ".[dev,test,docs]" --python 3.14.6 --python-preference only-managed --index=https://download.pytorch.org/whl/cu130 , optionally add xformers.

(UV timeout is to avoid an error while waiting for cudnn files to download. Nvidia servers are slow lately. We might want to add that to the launcher as well...)

Merge Plan

DRAFT: wait until all models and workflows have been tested.

Checklist

  • 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)

@github-actions github-actions Bot added python PRs that change python files Root invocations PRs that change invocations backend PRs that change backend files python-deps PRs that change python dependencies labels May 22, 2026
@dunkeroni

Copy link
Copy Markdown
Collaborator Author

Related things:
#8991 - python 3.14 support
#9130 - ROCm 7.2
#8655 - ROCm support for gfx1151 hardware

@keturn

keturn commented May 23, 2026

Copy link
Copy Markdown
Contributor

Updating the project.optional-dependencies so the extras will resolve and uv sync --extra cuda works:

pyproject-extras.patch

Edit: Oops, I guess those need to be cu130 instead of cu132 for bitsandbytes to work.

Includes some ROCm help from #8867.

Do add --upgrade when rebuilding the lockfile with uv lock or uv sync. Without it, it'll try to install old versions of dependencies (from the current uv.lock), and those versions don't have wheels for Python 3.14 pre-built, which doesn't make for a good time.

@lstein lstein added the 6.13.5 Library Updates label May 25, 2026
@lstein lstein moved this to 6.13.5 LIBRARY UPDATES in Invoke - Community Roadmap May 25, 2026
@lstein

lstein commented May 25, 2026

Copy link
Copy Markdown
Collaborator

Reminder to update the docs.

@lstein lstein self-assigned this May 25, 2026
@github-actions github-actions Bot added the CI-CD Continuous integration / Continuous delivery label May 27, 2026
@github-actions github-actions Bot added the frontend PRs that change frontend files label May 28, 2026
fishd72 and others added 16 commits June 29, 2026 10:58
* docs: Updated uvicorn URL

In the current documentation links for info on SSL configuration point
to 'uvicorn.org', however this URL does not resolve for me.

Checking 'uvicorn.dev' shows what appears to be the correct information
so I've updated the links accordingly.

* fix(config): update uvicorn.org URL to uvicorn.dev in ssl field descriptions

The docstring and generated files were updated to uvicorn.dev, but the
actual ssl_certfile/ssl_keyfile Field descriptions (the source for the
generated schemas) still pointed to uvicorn.org.

---------

Co-authored-by: Alexander Eichhorn <alex@eichhorn.dev>
Co-authored-by: Lincoln Stein <lincoln.stein@gmail.com>
* docs: add graph execution example to API guide

* Move workflow execution docs into a dedicated guide
* feat: ⬆️ upgrade deps

* chore: ⬆️ upgrade `react` to `19.2`

* perf: ⚡ enable react compiler

don't think it's working rn but here it is

* feat: upgrade deps, configure compiler linting errors

* chore: upgrade vite to v8

required also upgrading storybook and vitest

* fix: react 19 upgrade migrations

mostly updates refobject types to have null possibilities, and in some places made updates to mitigate some
immediate react 19 rendering errors

* fix: dragHandleRef can be null

* perf: avoid cascading renders on `InvokeAIUI`

* perf(canvas): run workflows hook improvements

- no hooks get called in loops anymore
- effect starts async filter after render
- updates state only after awaiting fetches
- tracks cancellation
- use sets for workflow ids

* perf: refactors to avoid synchronous state setting in effects

this can cause cascading re-renders, and is counted as an error to the react 19 recommended linting.

* fix(api): run typegen

* fix: text tool effects usage

* fix: linting

* fix(compiler): properly wire up the react compiler

* fix: refactor compiler-incompatible component tests

The React Compiler emits `useMemoCache` calls into every component,
which crashed two tests that invoked components as plain functions (via
direct call or `.type`) outside React's render path.

Rather than disable the compiler for tests, extract the testable surface
so the tests no longer need to render:

  - ImageMetadataActions: hoist the handler list to an exported
    `IMAGE_METADATA_ACTION_HANDLERS` array and render via map +
    type-guarded dispatch. Test asserts against the array.
  - AddBoardButton: extract the async create-and-dispatch flow into
    `createBoardAndDispatchActions`. Test exercises that function
    directly with vi.fn() doubles.
  - parsing.tsx: export `isCollectionMetadataHandler` and add
    `isUnrecallableMetadataHandler` to support the map-based render.

* fix: linting

* chore: run typegen

* fix(canvas): wrap text line-height combobox tooltip child

* fix(app): keep rehydration bootstrap outside strict mode

* fix(canvas): clear workflow filtering state for empty lists

* fix(workflows): gate library render until view sync

* fix(canvas): keep model loading indicator across transitions

* fix(canvas): seed text overlay size from content metrics

* test(ui): restore null active tab navigation coverage

* fix(nodes): guard optional scheduler field

* fix(ui): handle optional metadata parser failures

* fix color picker hex value entry field

---------

Co-authored-by: joshistoast <me@joshcorbett.com>
Co-authored-by: Alexander Eichhorn <alex@eichhorn.dev>
Co-authored-by: dunkeroni <dunkeroni@gmail.com>
…r non-admins (invoke-ai#9262)

* fix(multiuser): restore global queue counts + redacted entries for non-admins

PR invoke-ai#9018 changed the queue status/list endpoints from "global counts +
per-user counts" to "user-scoped only" for non-admins. This silently broke
two multiuser behaviors:

1. The hamburger-menu badge lost its "X/Y" form. invoke-ai#9018 dropped the
   user_pending/user_in_progress fields, made pending/in_progress/total
   user-scoped (so a non-admin had no global total), and reduced the badge
   to a single number.

2. The virtualized queue list stopped showing other users' redacted
   entries. invoke-ai#9018 added `AND user_id = ?` to get_queue_item_ids, so a
   non-admin only ever received their own item ids — the (intact)
   sanitize_queue_item_for_user redaction never ran for other users' items.

Restore the original design (PR invoke-ai#8822) while keeping the invoke-ai#9087 current-item
identifier redaction:

- SessionQueueStatus regains optional user_pending/user_in_progress.
- get_queue_status always computes GLOBAL aggregate counts and, when
  user_id is provided, additionally returns that user's own counts. The
  current item's identifiers are still gated to the owner/admin via a
  single get_current() snapshot (race-free, invoke-ai#9087 preserved).
- get_queue_item_ids no longer filters by user; ids carry no sensitive
  data and items are redacted at hydration by sanitize_queue_item_for_user,
  so non-admins again see partially-redacted entries for other users' jobs.
- QueueCountBadge renders "<own>/<global total>" in multiuser mode and the
  plain total for admins / single-user mode.
- Regenerate the frontend OpenAPI schema.

Aggregate counts are global but non-identifying (no session_id/batch_id/
params/graph), consistent with invoke-ai#9087's "counts remain global" decision.

Tests:
- Update the model-shape test to assert user_pending/user_in_progress exist.
- Add session-queue integration tests: global counts + per-user subcounts,
  admin/global omission of subcounts, current-item redaction with global
  counts intact, and get_queue_item_ids returning every user's ids.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore(frontend): typegen + openapi

* chore(backend): ruff

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Alexander Eichhorn <alex@eichhorn.dev>
Co-authored-by: wunianze666-netizen <wunianze666@gmail.com>
* Upgrade ROCm support from 6.3 to 7.1

- Update PyTorch to 2.10.0+rocm7.1 (from 2.7.1+rocm6.3)
- Update TorchVision to 0.25.0+rocm7.1 (from 0.22.1+rocm6.3)
- Update PyTorch ROCm index URL to rocm7.1
- Update Docker ROCm runtime to 7.1.1 (from 6.3.4)

ROCm 7.1 adds support for 3 new GPU architectures:
- gfx950: CDNA3+ (Instinct MI350, MI325X)
- gfx1150: RDNA 3.5 (Strix Point APU)
- gfx1151: RDNA 3.5 (Strix Halo APU)

All 11 previously supported architectures remain compatible.
Total supported architectures: 14 (11 existing + 3 new)

Relates to invoke-ai#8655

* Fix uv sync for ROCm 7.1 by explicitly declaring triton-rocm

The uv package manager couldn't resolve triton-rocm as a transitive
dependency of torch from the PyTorch custom index. This commit adds
triton-rocm==3.6.0 explicitly to the rocm extras with a Linux-only
platform marker.

Changes:
- Added triton-rocm==3.6.0; sys_platform == 'linux' to rocm extras
- Added triton-rocm source configuration pointing to torch-rocm index
- Already committed: torch version constraint relaxation (>=2.7.0,<3.0)
- Already committed: platform environment restrictions for ROCm

Verified with uv sync --extra rocm:
- torch==2.10.0+rocm7.1 installed correctly
- torchvision==0.25.0+rocm7.1 installed correctly
- triton-rocm==3.6.0 resolved successfully
- ROCm 7.1.25424 detected on AMD Radeon PRO V620
- All 8 model architectures accessible
- GPU compute operations verified

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* Update uv lock and remove old dockerfile

* docs: update ROCm torch backend from 6.3 to 7.1

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

* fix: regenerate uv.lock with ROCm 7.1 dependencies

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

* remove redundant inclusion of torch-triton wheel && confirm no aarch64-linux support

* chore(frontend): openapi and typegen

* chore: drop spurious typegen changes from ROCm PR

The ROCm 7.1 update is dependency-only and does not alter any backend
route or model, so schema.ts/openapi.json should match main. The earlier
regeneration introduced spurious diffs (removed @example blocks,
reformatted JSDoc) from a local tooling/backend mismatch, failing the
typegen-checks "compare files" step. Restore both files to main.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(deps): keep macOS on torch 2.7.x; gate rocm extra to linux

Loosening the base torch pin to <3.0 (so the rocm extra could use
2.10.0+rocm7.1) let macOS resolve torch 2.12.0, whose MPS backend fails
with OOM on GitHub's hosted macOS runners (no usable Metal GPU),
breaking the py3.x macos-default pytest jobs.

Split the base pin by platform so macOS stays on 2.7.x (matching main)
while linux/win still allow >=2.10, and gate the rocm extra's
torch/torchvision to sys_platform == 'linux' (ROCm is x86_64-linux-only)
so non-linux resolution is unaffected.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore(frontend): regenerate schema for pydantic 2.13 docstring descriptions

The dependency update bumps pydantic 2.11.7 -> 2.13.4, which now emits a
plain class docstring as the JSON-schema description. CacheStats gains
"Collect statistics on cache performance." in both openapi.json and
schema.ts. This is the sole schema delta from the bump and is what the
openapi-checks/typegen-checks jobs regenerate.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Heathen711 <Heathen711@me.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: heathen711 <heathen711@example.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
…22 (invoke-ai#9272)

* fix(db): repair model_relationships foreign keys broken by migration 22

Migration 22 rebuilds the `models` table by renaming it to `models_old`,
creating a fresh `models` table, and dropping `models_old`. Modern SQLite
(legacy_alter_table off) rewrites foreign-key references in other tables on
rename, so the FKs in `model_relationships` were repointed at `models_old`,
which was then dropped. This broke ON DELETE CASCADE and integrity for
related models.

Add migration 32 to rebuild `model_relationships` with its foreign keys
referencing `models(id)` again, preserving existing links and dropping any
orphaned rows. Idempotent and a no-op when the FKs are already correct.

* Chore Ruff Format

---------

Co-authored-by: Lincoln Stein <lincoln.stein@gmail.com>
* Fix python tests on CUDA

* Updated more CUDA tests

* Address CUDA test review feedback
…rt (invoke-ai#9253)

* feat(model-manager): add Qwen Image single-file checkpoint loader with fp8 support

Adds Main_Checkpoint_QwenImage_Config and QwenImageCheckpointModel so that
single-file safetensors checkpoints (e.g. Qwen-Image-Edit 2511 fp8_scaled
from Civitai) can be imported. ComfyUI-style fp8 weights are dequantized to
bf16 at load time; the existing default_settings.fp8_storage toggle then
optionally re-casts to fp8 for VRAM savings.

Also wires _apply_fp8_layerwise_casting into the Qwen Image diffusers loader
so the fp8 storage option works across all three formats (diffusers, single-
file checkpoint, GGUF stays untouched as it carries its own quantization).

Shared variant inference (marker tensor → filename heuristic) and transformer
architecture auto-detection are extracted into module-level helpers so the
GGUF and checkpoint loaders stay in sync.

* chore(frontend): openapi & typegen

* fix(qwen-image): align ComfyUI-prefix detection with loader, tighten edit heuristic, dedupe fp8 helpers

- strip ComfyUI key prefixes in _has_qwen_image_keys so prefixed checkpoints
  are identified and reach the loader
- match "edit" as a filename token instead of any substring (no credited/edited/unedited false positives)
- reuse _dequantize_comfyui_fp8 / _strip_quantization_metadata in the QwenVL encoder loader
- size make_room reservation after the bf16 cast to avoid fp32 undercount
- add Path type hint on _infer_qwen_image_variant

* fix(qwen-image): reduce dequant RAM, fix VL encoder classification, silence int8 warning

- qwen_image: dequantize ComfyUI fp8_scaled weights directly to compute_dtype
  instead of a full-precision float32 intermediate. The previous path materialised
  a 4-byte/param copy of the whole model before downcasting, spiking peak RAM to
  ~2x the final bf16 size (~80GB for the 20B transformer). bf16 shares float32's
  exponent range and fp8 has only 3 mantissa bits, so no meaningful precision loss.

- qwen3_encoder: reject checkpoints that bundle a Qwen-VL visual tower
  (visual.blocks.* / visual.patch_embed.*). A Qwen2.5-VL file satisfies the Qwen3
  key heuristic too, so it matched both configs and the tiebreak misrouted it to
  Qwen3Encoder, hiding it from the Qwen Image loader's encoder field. Qwen3 (text)
  and QwenVLEncoder (vision+language) are now mutually exclusive.

- bnb_llm_int8: silence the per-matmul "inputs will be cast from bfloat16 to
  float16" UserWarning. LLM.int8 only supports fp16 activations; the bf16->fp16
  cast is correct and intended, so the warning is pure log spam on every layer.

* Chore Ruff

---------

Co-authored-by: Lincoln Stein <lincoln.stein@gmail.com>
…nvoke-ai#9274)

The Heun (2nd order) branch of the FLUX.2 Klein denoise loop passed the
full preview latent to step_callback without removing the concatenated
reference-image tokens. With ref images the sequence length is doubled,
so unpack_flux2 failed with "Shape mismatch, 8192 != 4096".

Slice the preview to original_seq_len before the callback, matching the
behavior already present in the Euler branch.

Co-authored-by: Lincoln Stein <lincoln.stein@gmail.com>
The left and right side-panel splitters could be dragged inward until
the middle viewer panel was crowded down to ~0px, leaving no surface
to grab the splitters and pull the panels back. On a tablet this was
easy to fall into and hard to recover from.

Add a MAIN_PANEL_MIN_SIZE_PX = 128 minimum to the main panel in the
canvas, generate, workflows, and upscaling layouts -- wide enough to
fit both floating toggle button groups (~48px each + breathing room).

Apply it both at fresh-init time and after registerContainer restores
from persisted JSON via enforceMainPanelMinWidth, so existing users
with saved layouts that pre-date the constraint also get it (and the
panel grows up to the minimum if its restored size violates it).

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Alexander Eichhorn <alex@eichhorn.dev>
Co-authored-by: dunkeroni <dunkeroni@gmail.com>
…ation (invoke-ai#9275)

* fix(ui): add missing canvas-workflow-integration log namespace translation

The 'canvas-workflow-integration' namespace was added to the logger enum
but had no translation key, so all languages fell back to showing the raw
key. Add the English source string translation.

* fix(ui): correct orphaned-models plural keys in en.json

The singular forms were placed in suffix-less bare keys while the `_one`
keys were left empty. With i18next v4 plurals, count=1 resolved to the
empty `_one` key and rendered nothing. Move the singular text into `_one`
and drop the redundant bare keys, matching the rest of the file.

---------

Co-authored-by: dunkeroni <dunkeroni@gmail.com>
Co-authored-by: Lincoln Stein <lincoln.stein@gmail.com>
…ies (invoke-ai#9291)

When invokeai.yaml sets an image_subfolder_strategy, new images are written
into subfolders of outputs/images (by date, type, or hash). The orphaned-db-
entry cleanup only checked the top-level outputs/images directory, so every
image stored in a subfolder looked missing and its (valid) database row was
deleted.

Add PhysicalFileMapper.get_all_image_filenames_recursive(), which globs the
entire outputs/images tree, and use it for the orphan check. Image names are
globally unique UUIDs, so a basename set is collision-free; thumbnails (.webp)
and the sibling images-archive directory are naturally excluded.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: dunkeroni <dunkeroni@gmail.com>
…cket double-emit) (invoke-ai#9288)

* feat(api): add append mode to recall reference images

POST /api/v1/recall/{queue_id}?append=true now asks the frontend to add
the recalled reference images (ip_adapters and model-free
reference_images) to its existing list instead of replacing it. The flag
rides inside the event's parameters dict so the generated client schema
needs no regeneration, and is injected after the persistence loop so it
is never stored as a recall parameter. Mutually exclusive with strict.

The frontend dispatches refImagesRecalled with replace:false in append
mode, and skips the dispatch entirely when nothing resolved so a failed
append can never clear the user's current reference images.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(sockets): emit recall event once to owner+admin room union

RecallParametersUpdatedEvent was emitted in two separate socket.io
calls — one to the owner's user room, one to the admin room. A socket
that belongs to both (the "system" user in single-user mode is also an
admin, so it joins user:system AND admin) received the event twice.

That double delivery was invisible for the scalar/replace recall fields,
which are idempotent, but the append-mode reference-image recall pushes
rather than replaces — so each append showed up as two copies of the
same reference image in the InvokeAI canvas.

Emit once to the room union [user_room, "admin"] instead. python-socketio
deduplicates recipients across a room list, so a socket in both rooms is
delivered to exactly once, while genuinely distinct owner/admin sockets
still each receive it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore(api): regenerate openapi.json + schema.ts for recall append param

Rebuilds the committed OpenAPI schema and generated TypeScript types so the
update_recall_parameters operation advertises the new append query
parameter. Generated via 'make frontend-openapi' / 'frontend-typegen'
equivalent; the only change is the added append param + its docstring.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs: document append query parameter for recall API

Documents the new append=true query parameter on POST /api/v1/recall/{queue_id}:
- new Query parameters subsection covering strict and append
- mutual exclusivity (strict+append -> 400) with error body
- append-mode cURL example
- updated WebSocket Events + frontend log sample for the merged reference-image list

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Jonathan <34005131+JPPhoto@users.noreply.github.com>
…ai#9309)

* fix metadata overrides with empty string values

* chore(backend): ruff

---------

Co-authored-by: wunianze666-netizen <wunianze666@gmail.com>
Co-authored-by: Alexander Eichhorn <alex@eichhorn.dev>
Co-authored-by: Jonathan <34005131+JPPhoto@users.noreply.github.com>
* fix(z-image): repair regional guidance forward after diffusers refactor

Z-Image Regional Guidance crashed with "split_with_sizes expects
split_sizes to sum exactly to 162 ... but got split_sizes=[160]". The
regional-prompting patch was a hand-copied snapshot of an outdated
ZImageTransformer2DModel.forward. The installed diffusers version
changed _pad_with_ids so caption pos_ids are now longer than the
caption feature tensor, while the stale patch split RoPE embeddings by
feature lengths instead of pos_ids lengths.

Rewrite create_regional_forward to delegate to the model's own helpers
(patchify_and_embed, _prepare_sequence, _build_unified_sequence) and
only override the main-layer attention mask to inject the regional
mask. This keeps the patch in sync with upstream diffusers and stops
re-implementing the drift-prone patchify/RoPE/padding logic.

* fix(z-image): repair & realign regional guidance after diffusers refactor

Z-Image Regional Guidance crashed with "split_with_sizes expects
split_sizes to sum exactly to 162 ... but got split_sizes=[160]". The
regional-prompting patch was a hand-copied snapshot of an outdated
ZImageTransformer2DModel.forward; the installed diffusers version
changed _pad_with_ids so caption pos_ids are longer than the caption
feature tensor, while the stale patch split RoPE embeddings by feature
lengths instead of pos_ids lengths.

Rewrite create_regional_forward to delegate to the model's own helpers
(patchify_and_embed, _prepare_sequence, _build_unified_sequence) so it
stays in sync with upstream diffusers, and only override the main-layer
attention mask.

Also fix two reasons regional guidance had no visible effect:
- Mask alignment: the unified sequence pads the image and caption
  blocks individually to a multiple of 32, so the real layout is
  [img_real | img_pad | txt_real | txt_pad]. Scatter the four regional
  sub-blocks into their padding-aware positions instead of assuming a
  contiguous top-left block (which only matched square 1024x1024).
- CFG pass: the patched forward also runs for the negative prompt; only
  apply the regional mask to passes whose caption length matches the
  positive prompt, otherwise fall back to the plain padding mask.

* Chore Ruff + Typegen

* fix(z-image): use identity to gate regional mask onto the positive pass

The regional attention patch ran for both the conditioned and negative/CFG
forward passes and distinguished them by comparing the padded caption length
against the positive prompt's expected length. Two short prompts that round up
to the same multiple of 32 collided, so the positive regional mask could be
injected into the unconditional prediction and silently corrupt CFG.

Discriminate the conditioned pass by tensor identity (cap_feats is the exact
positive_cap_feats the mask was built for) instead of a length heuristic, so
the positive and negative passes can never be confused. The context manager now
requires positive_cap_feats whenever a regional mask is provided, turning the
previously inferred invariant into an enforced one rather than a silent no-op.

Also build the (bsz, 1, S, S) float mask lazily: compute applied_regional from
cheap scalar checks first and skip materializing/cloning the full mask on passes
that never match (every negative pass), avoiding a ~33 MB bf16 clone per call.

---------

Co-authored-by: Lincoln Stein <lincoln.stein@gmail.com>
@github-actions github-actions Bot added docker api services PRs that change app services python-tests PRs that change python tests docs PRs that change docs labels Jun 29, 2026
lstein and others added 2 commits July 17, 2026 15:23
Resolve conflicts from PR invoke-ai#9225 (Python 3.14.5 / dependency cascade) against
current main. Most conflicts came from stale duplicates of features main has
since released, carried in by earlier main merges; those were resolved to
main's authoritative version. Key decisions:

- Duplicate-lineage files (schema.ts, openapi.json, en.json, session_queue*,
  workflowExecution*, setEventListeners, ParamAnimaModelSelect, qwen_image,
  starter_models, migration_32, config_default, and related tests): took
  main's version — the PR does not intend to change these.
- transformers/compel: kept main's transformers>=5.5 + compel>=2.4 (do not
  regress main's upgrade); dropped the PR's older 4.56/2.1.1 pins.
- aarch64: kept main's ARM-Linux support and platform-gated torch structure,
  grafting the PR's torch 2.12 / cu130 / rocm7.2 bumps into it. The aarch64
  PyPI fallback moves to torch 2.12.0 / torchvision 0.27.0 (2.7.x has no
  cp314 wheels under Python 3.14).
- macOS base torch cap (<2.8) removed: no torch 2.7.x cp314 wheels exist, so
  macOS moves to 2.12 as well (matching the PR's original intent).
- deploy-docs.yml: kept the PR's uv 0.11.16.
- uv.lock: regenerated from scratch against the merged pyproject (275 pkgs).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Python 3.14 deprecates torch.jit.load / torch.jit.script(_method). Two
preprocessors trip this on every run:

- LaMa infill (lama.py) loads a TorchScript archive via torch.jit.load.
- Normal Map / normal_bae (encoder.py) loads a vendored EfficientNet whose
  geffnet code is decorated with @torch.jit.script / @torch.jit.script_method
  (~26 warnings per model load).

Both are compiled/vendored TorchScript with no drop-in torch.compile/export
migration for us as consumers. Suppress just the per-call DeprecationWarning
noise (scoped filterwarnings), but log a single breadcrumb once per process so
the deprecation stays visible for planning. When torch eventually removes these
APIs the calls will raise, not warn, so both paths fail loudly at that point
regardless of the suppression.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@lstein

lstein commented Jul 17, 2026

Copy link
Copy Markdown
Collaborator

@dunkeroni I took the liberty of fixing the merge conflicts. I then tested the following under Linux on a ROCm AMD GPU.

  • SDXL, FLUX.2 and Anima models across: t2i, i2i, t2i+refImage, canvas inpaint and outpaint, node editor execution, LoRA load
  • Model manager
  • Authentication
  • Upscale

I got a bunch of Py3.14 TorchScript deprecation warnings for the torch.jit.load() function and the @torch.jit.script decorator. The warnings are coming from third-party dependencies, so I quieted them down so that they only print out the deprecation warning once per session.

This needs to be tested on MacOS and Windows.

@lstein lstein changed the title Python 3.14.5 and related version updates Python 3.14.6 and related version updates Jul 19, 2026
@lstein

lstein commented Jul 19, 2026

Copy link
Copy Markdown
Collaborator

I updated to use python latest stable release 3.14.6. Use of .5 was causing the MacOS pytest runner to error out because it is not supported by the Mac runner.

I also updated the openapi-checks.yml workflow to use an up to date version of uv, and tightened up output path resolution in the openapi generation script.

Two bugs made the openapi-checks job fail:

1. openapi-checks.yml was the only workflow left on the old toolchain
   (setup-uv@v5 / uv 0.6.10, checkout@v4, setup-python@v5) while every other
   workflow moved to setup-uv@v8.1.0 / uv 0.11.16 / @v6. uv 0.6.10 predates
   Python 3.14 and the current uv.lock format, so it re-resolved from scratch
   and installed an ABI-mismatched environment; the schema script then died
   with SIGSEGV (exit 139). Bring it in line with typegen-checks.yml, and pin
   changed-files to the same hash the other workflows use.

2. generate_openapi_schema.py resolved its output argument *after* chdir'ing to
   the repo root, so the CI step `cd invokeai/frontend/web && ... openapi.json`
   wrote to <repo_root>/openapi.json instead. The real schema was never
   regenerated, so the diff compared an untouched file against its own copy —
   the check would have passed vacuously once the segfault was fixed. Resolve
   the path against the caller's CWD before chdir.

Verified locally: generated schema + prettier matches the checked-in
invokeai/frontend/web/openapi.json exactly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@lstein lstein added 6.14.1 and removed 6.14.0 labels Jul 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

6.14.1 api backend PRs that change backend files CI-CD Continuous integration / Continuous delivery DO NOT MERGE docker docs PRs that change docs frontend PRs that change frontend files frontend-deps PRs that change frontend dependencies invocations PRs that change invocations python PRs that change python files python-deps PRs that change python dependencies python-tests PRs that change python tests Root services PRs that change app services

Projects

Status: 6.14.x Theme: USER EXPERIENCE

Development

Successfully merging this pull request may close these issues.