-
Notifications
You must be signed in to change notification settings - Fork 3k
Expand file tree
/
Copy pathpyproject.toml
More file actions
531 lines (500 loc) · 25.2 KB
/
Copy pathpyproject.toml
File metadata and controls
531 lines (500 loc) · 25.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
[build-system]
requires = ["setuptools", "pip", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "InvokeAI"
description = "A full-featured AI-assisted image generation environment designed for creatives and enthusiasts."
requires-python = ">=3.12, <3.13"
readme = { content-type = "text/markdown", file = "README.md" }
keywords = ["stable-diffusion", "AI"]
dynamic = ["version"]
license = { file = "LICENSE" }
authors = [{ name = "Invoke", email = "support@invoke.ai" }]
classifiers = [
'Development Status :: 5 - Production/Stable',
'Environment :: GPU',
'Environment :: GPU :: NVIDIA CUDA',
'Environment :: MacOS X',
'Intended Audience :: End Users/Desktop',
'Intended Audience :: Developers',
'License :: OSI Approved :: Apache Software License',
'Operating System :: POSIX :: Linux',
'Operating System :: MacOS',
'Operating System :: Microsoft :: Windows',
'Programming Language :: Python :: 3 :: Only',
'Programming Language :: Python :: 3.12',
'Topic :: Artistic Software',
'Topic :: Internet :: WWW/HTTP :: WSGI :: Application',
'Topic :: Internet :: WWW/HTTP :: WSGI :: Server',
'Topic :: Multimedia :: Graphics',
'Topic :: Scientific/Engineering :: Artificial Intelligence',
'Topic :: Scientific/Engineering :: Image Processing',
]
dependencies = [
# Core generation dependencies, pinned for reproducible builds.
"accelerate",
"bitsandbytes; sys_platform!='darwin'",
"compel>=2.4.0,<3",
"diffusers[torch]==0.40.0",
"gguf",
"mediapipe==0.10.14", # needed for "mediapipeface" controlnet model
"mistral-common>=1.5.4,<2", # canonical Tekken tokenizer for FLUX.2 [dev] Mistral encoder; the
# loader depends on private surface (Tekkenizer internals) that
# moves across majors, so cap below 2.x (validated against 1.11.6)
"numpy<2.0.0",
"onnx==1.16.1",
"onnxruntime==1.19.2",
"opencv-contrib-python",
"imageio[ffmpeg]>=2.37", # video encode (for Wan 2.2 T2V/I2V output); encode behavior (macro_block_size) is version-sensitive
"psutil>=6", # video decode worker process-tree termination
"safetensors",
"sentencepiece==0.2.0", # 0.2.1 coredumps windows when loading t5 tokenizer
"spandrel",
# Loosely pinned, will respect requirement of `diffusers[torch]`. Split by platform: linux/win allow
# the 2.13 line every backend extra pins (the lock itself is held there by `constraint-dependencies` in
# [tool.uv]), while macOS stays on 2.7.x — newer macOS torch wheels exercise MPS on CI runners (no
# usable Metal GPU) and fail with MPS OOM.
# Deliberately NOT capped below 2.12 here. torch 2.12.x+rocm7.1 was reported to break generation (#9410),
# but this range is what every backend-agnostic install resolves against — manual installs use
# `--torch-backend=<x>` with no extra (see docs/start-here/manual), so a blanket cap would also
# reject torch>=2.12 on Windows/Linux CUDA, CPU and ARM64, where 2.12 has no known problem.
# The ROCm path is constrained where it can actually be targeted: the `rocm` extra below pins an
# exact version — 2.13.0+rocm7.2, validated end-to-end on gfx1100 (W7900), where its bundled
# AOTriton 0.12b also triples flash-attention throughput vs the 2.10.0+rocm7.1 pin.
"torch>=2.7.0,<3.0; sys_platform != 'darwin'",
"torch>=2.7.0,<2.8.0; sys_platform == 'darwin'",
"torchsde", # diffusers needs this for SDE solvers, but it is not an explicit dep of diffusers
"torchvision",
"transformers>=5.5,<5.6",
# Core application dependencies, pinned for reproducible builds.
"fastapi-events",
# The old pin sat at 0.118.3 because 0.119.0 crashed generating our OpenAPI schema. That was a FastAPI bug, not
# ours (`KeyError: '$ref'` in fastapi/_compat/v2.py, which assumed every field mapping carries a `$ref`), and it
# is fixed as of 0.124.0 — no change to AnyInvocation was needed.
#
# Two later changes did need adapting to, both handled: 0.130 emits `contentMediaType` instead of
# `format: binary` for file uploads (see the Blob mapping in frontend/api/scripts/typegen.js), and 0.141 keeps
# included routers as a single node in `app.routes` rather than copying their routes into it (see
# `_iter_route_contexts` in tests/app/routers/test_model_manager_authorization.py). Keep the minor-version bound:
# both of those were silent breakages that only surfaced because something happened to assert on them.
"fastapi>=0.141.1,<0.142",
"huggingface-hub",
"networkx",
"pydantic-settings",
"pydantic",
"python-socketio",
"uvicorn[standard]",
# Auxiliary dependencies, pinned only if necessary.
"blake3",
"bcrypt<4.0.0",
"Deprecated",
"dnspython",
"dynamicprompts",
"einops",
"email-validator>=2.0.0",
"fonttools[woff]",
"passlib[bcrypt]>=1.7.4",
"picklescan",
"pillow",
"prompt-toolkit",
"pypatchmatch",
"python-jose[cryptography]>=3.3.0",
"python-multipart",
"requests",
"semver~=3.0.1",
"PyWavelets",
# Semantic image index (image map / semantic search).
# numba is a umap-learn transitive, pinned to the range this stack has been
# exercised against rather than for numpy compatibility: every release from
# 0.59 to at least 0.63 accepts the numpy 1.26.x resolved under numpy<2.0
# above (0.62 widened its floor back to >=1.22). Raise the ceiling once a
# newer numba has been run against the image map, not just resolved.
"umap-learn~=0.5.7",
"scikit-learn~=1.5",
"numba>=0.59,<0.62",
]
[project.optional-dependencies]
"xformers" = [
# Core generation dependencies, pinned for reproducible builds.
"xformers>=0.0.28.post1; sys_platform!='darwin'",
# torch 2.4+cu carries its own triton dependency
]
# The +cpu/+cu130/+rocm7.2 pins live on PyTorch's WHL indexes and are gated to the
# platforms the project resolves and tests them on: Windows and Linux x86_64 (rocm: Linux
# only). macOS is capped below torch 2.8 (see the base requirement), and linux_aarch64 stays
# on the CPU-only PyPI 2.7.1 it was set up with (an aarch64 install requesting `cuda` gets
# CPU torch), so both fall back to the base `torch` / `torchvision` from PyPI. The index has
# carried aarch64 torchvision since 0.28, so moving aarch64 onto the pinned pairs -- and real
# CUDA-on-aarch64 (e.g. Grace/GH200) -- is open, just untested.
#
# cu130 builds cover compute capability 7.5 and newer (Turing through Blackwell) and need
# an NVIDIA driver from the R580 series or newer. CUDA 13 cannot build for Maxwell, Pascal
# or Volta; the cu126 builds that still can have no Blackwell kernels, and cu128 stops at
# torch 2.11.
"cpu" = [
"torch==2.13.0+cpu; (sys_platform == 'linux' and platform_machine == 'x86_64') or sys_platform == 'win32'",
"torchvision==0.28.0+cpu; (sys_platform == 'linux' and platform_machine == 'x86_64') or sys_platform == 'win32'",
# macOS / linux_aarch64 fallback, resolved from PyPI. Without these explicit entries
# the extra's conflict-universe would contain no torch at all there (uv partitions
# the base declarations into the no-extra universe).
"torch==2.7.1; sys_platform == 'darwin' or (sys_platform == 'linux' and platform_machine == 'aarch64')",
"torchvision==0.22.1; sys_platform == 'darwin' or (sys_platform == 'linux' and platform_machine == 'aarch64')",
]
"cuda" = [
"torch==2.13.0+cu130; (sys_platform == 'linux' and platform_machine == 'x86_64') or sys_platform == 'win32'",
"torchvision==0.28.0+cu130; (sys_platform == 'linux' and platform_machine == 'x86_64') or sys_platform == 'win32'",
# macOS / linux_aarch64 fallback, see note under "cpu"
"torch==2.7.1; sys_platform == 'darwin' or (sys_platform == 'linux' and platform_machine == 'aarch64')",
"torchvision==0.22.1; sys_platform == 'darwin' or (sys_platform == 'linux' and platform_machine == 'aarch64')",
]
"rocm" = [
# ROCm wheels are x86_64-linux-only; gate by platform so macOS/win/linux-aarch64 resolution is unaffected.
# 2.13.0+rocm7.2 bundles AOTriton 0.12b, whose regenerated gfx1100 tuning database triples
# flash-attention throughput on RDNA3 vs the previous 2.10.0+rocm7.1 pin (measured 17.9 ->
# 57.3 TFLOPS effective at the MiniMax H3 attention shape on a W7900).
"torch==2.13.0+rocm7.2; sys_platform == 'linux' and platform_machine != 'aarch64'",
"torchvision==0.28.0+rocm7.2; sys_platform == 'linux' and platform_machine != 'aarch64'",
"triton-rocm==3.7.1; sys_platform == 'linux' and platform_machine != 'aarch64'",
# linux_aarch64 fallback, see note under "cpu"
"torch==2.7.1; sys_platform == 'linux' and platform_machine == 'aarch64'",
"torchvision==0.22.1; sys_platform == 'linux' and platform_machine == 'aarch64'",
]
# Intel XPU (Arc / Battlemage) wheels are published only for linux-x86_64 and
# windows-amd64 on PyTorch's WHL index. Gate the +xpu pins to those platforms; the
# Intel oneAPI runtime libs (intel-sycl-rt, etc.) come in automatically as deps of
# torch+xpu.
# Intel's XPU backend matured considerably after 2.7.1: torch.xpu.mem_get_info() works on
# driver/kernel combinations where it previously raised, and the bundled oneAPI runtime ships
# with the wheel (intel-sycl-rt), so upgrading torch upgrades the user-space runtime too.
"xpu" = [
"torch==2.13.0+xpu; (sys_platform == 'linux' and platform_machine == 'x86_64') or sys_platform == 'win32'",
"torchvision==0.28.0+xpu; (sys_platform == 'linux' and platform_machine == 'x86_64') or sys_platform == 'win32'",
# XPU triton (for torch.compile); the WHL index ships linux-x86_64 and win_amd64 wheels.
# Renamed from pytorch-triton-xpu to triton-xpu upstream.
"triton-xpu==3.7.2; (sys_platform == 'linux' and platform_machine == 'x86_64') or sys_platform == 'win32'",
# macOS / linux_aarch64 have no +xpu wheels: fall back to base torch so the extra's
# conflict-universe always contains a torch. See note under "cpu".
"torch==2.7.1; sys_platform == 'darwin' or (sys_platform == 'linux' and platform_machine == 'aarch64')",
"torchvision==0.22.1; sys_platform == 'darwin' or (sys_platform == 'linux' and platform_machine == 'aarch64')",
]
"onnx" = ["onnxruntime"]
"onnx-cuda" = ["onnxruntime-gpu"]
"onnx-directml" = ["onnxruntime-directml"]
"dist" = ["pip-tools", "pipdeptree", "twine"]
"dev" = ["jurigged", "pudb", "snakeviz", "gprof2dot"]
"test" = [
"ruff~=0.11.2",
"ruff-lsp~=0.0.62",
"mypy",
"pre-commit",
"pytest>6.0.0",
"pytest-cov",
"pytest-timeout",
"pytest-xdist",
"pytest-datadir",
"requests_testadapter",
"httpx",
"polyfactory==2.19.0",
"humanize==4.12.1",
]
[tool.uv]
# Prevent opencv-python from ever being chosen during dependency resolution.
# This prevents conflicts with opencv-contrib-python, which Invoke requires.
override-dependencies = ["opencv-python; sys_platform=='never'"]
conflicts = [[{ extra = "cpu" }, { extra = "cuda" }, { extra = "rocm" }, { extra = "xpu" }]]
index-strategy = "unsafe-best-match"
# Restrict resolution to the platforms we support: x86_64/aarch64 Linux, Windows,
# and macOS. (ROCm and the PyTorch WHL-index pins are x86_64-only; on aarch64
# Linux torch/torchvision fall back to PyPI via the markers below.)
environments = ["sys_platform == 'win32' or sys_platform == 'darwin' or (sys_platform == 'linux' and (platform_machine == 'x86_64' or platform_machine == 'aarch64'))"]
# Hold every resolution on Windows and Linux x86_64 to the torch the backend extras pin -- including the
# no-extra one, which is what CI installs and tests. Without this the lock is free to keep an older torch
# there, or move it to the newest PyPI release, independently of the extras. `tool.uv` never reaches the
# published metadata, so installing the released package with `--torch-backend` keeps the open range of the base
# requirement; only `uv pip install` inside a checkout is held to it.
# `==2.13.0` also matches the local builds (+cpu, +cu130, +rocm7.2, +xpu).
constraint-dependencies = [
"torch==2.13.0; sys_platform == 'win32' or (sys_platform == 'linux' and platform_machine == 'x86_64')",
"torchvision==0.28.0; sys_platform == 'win32' or (sys_platform == 'linux' and platform_machine == 'x86_64')",
]
# compel, could you please not pull in all of Jupyter. (compel declares `notebook>=6.5.7` but does not
# reference IPython/Jupyter anywhere in its code.) Dropping it takes ~65 packages out of the environment.
#
# Deliberately the *global* form rather than `{ package = ..., dependencies = ... }`: the per-package form
# needs uv >= 0.11.25 and is a hard parse error on 0.10.0 - 0.11.24, while this form has been understood
# since uv 0.9.8 and resolves to exactly the same set. Older uv only warns and ignores it, so no install
# path breaks -- and the launcher syncs `--frozen` from the lockfile below, so users get the trimmed
# environment whichever uv they have. Keep it that way: a `required-version` here would hard-fail the uv
# 0.6.12 bundled in launcher <= 1.8.1 for no gain, since CI's `uv lock --locked` already catches a
# lockfile regenerated by a uv too old to honor this.
exclude-dependencies = ["notebook"]
[tool.uv.sources]
# Keep linux_aarch64 (and, for cpu/cuda, macOS) off the PyTorch WHL indexes so that uv
# resolves their 2.7.1 fallback pins from PyPI; see the note above the extras.
torch = [
{ index = "torch-cpu", extra = "cpu", marker = "(sys_platform == 'linux' and platform_machine == 'x86_64') or sys_platform == 'win32'" },
{ index = "torch-cuda", extra = "cuda", marker = "(sys_platform == 'linux' and platform_machine == 'x86_64') or sys_platform == 'win32'" },
{ index = "torch-rocm", extra = "rocm", marker = "sys_platform != 'linux' or platform_machine != 'aarch64'" },
{ index = "torch-xpu", extra = "xpu", marker = "(sys_platform == 'linux' and platform_machine == 'x86_64') or sys_platform == 'win32'" },
{ index = "pypi", marker = "sys_platform == 'linux' and platform_machine == 'aarch64'" },
]
torchvision = [
{ index = "torch-cpu", extra = "cpu", marker = "(sys_platform == 'linux' and platform_machine == 'x86_64') or sys_platform == 'win32'" },
{ index = "torch-cuda", extra = "cuda", marker = "(sys_platform == 'linux' and platform_machine == 'x86_64') or sys_platform == 'win32'" },
{ index = "torch-rocm", extra = "rocm", marker = "sys_platform != 'linux' or platform_machine != 'aarch64'" },
{ index = "torch-xpu", extra = "xpu", marker = "(sys_platform == 'linux' and platform_machine == 'x86_64') or sys_platform == 'win32'" },
{ index = "pypi", marker = "sys_platform == 'linux' and platform_machine == 'aarch64'" },
]
triton-rocm = [
{ index = "torch-rocm", marker = "sys_platform == 'linux' and platform_machine != 'aarch64'" },
]
# PyPI's xformers wheels are built against CUDA 12.8 and cannot load their extension next to a CUDA 13 torch (every
# memory-efficient attention call then fails); PyTorch's cu130 index carries the CUDA 13 build of the same release.
# Not scoped to the `cuda` extra: uv only allows that for packages the extra itself lists, and the CUDA 13 torch that
# PyPI serves on Linux needs the same build. The cpu/rocm/xpu builds cannot use xformers' CUDA kernels either way.
xformers = [
{ index = "torch-cuda", marker = "(sys_platform == 'linux' and platform_machine == 'x86_64') or sys_platform == 'win32'" },
]
triton-xpu = [
{ index = "torch-xpu", marker = "(sys_platform == 'linux' and platform_machine == 'x86_64') or sys_platform == 'win32'" },
]
[[tool.uv.index]]
name = "pypi"
url = "https://pypi.org/simple"
[[tool.uv.index]]
name = "torch-cpu"
url = "https://download.pytorch.org/whl/cpu"
explicit = true
[[tool.uv.index]]
name = "torch-cuda"
url = "https://download.pytorch.org/whl/cu130"
explicit = true
[[tool.uv.index]]
name = "torch-rocm"
url = "https://download.pytorch.org/whl/rocm7.2"
explicit = true
[[tool.uv.index]]
name = "torch-xpu"
url = "https://download.pytorch.org/whl/xpu"
explicit = true
[project.scripts]
"invokeai-web" = "invokeai.app.run_app:run_app"
"invoke-useradd" = "invokeai.app.util.user_management:useradd"
"invoke-userdel" = "invokeai.app.util.user_management:userdel"
"invoke-userlist" = "invokeai.app.util.user_management:userlist"
"invoke-usermod" = "invokeai.app.util.user_management:usermod"
[project.urls]
"Homepage" = "https://invoke.ai/"
"Documentation" = "https://invoke.ai/"
"Source" = "https://github.com/invoke-ai/InvokeAI/"
"Bug Reports" = "https://github.com/invoke-ai/InvokeAI/issues"
"Discord" = "https://discord.gg/ZmtBAhwWhy"
[tool.setuptools.dynamic]
version = { attr = "invokeai.version.__version__" }
[tool.setuptools.packages.find]
"where" = ["."]
"include" = [
"invokeai.assets.fonts*",
"invokeai.version*",
"invokeai.generator*",
"invokeai.backend*",
"invokeai.frontend*",
"invokeai.frontend.webv1.dist*",
"invokeai.frontend.webv1.static*",
"invokeai.configs*",
"invokeai.app*",
"invokeai.invocation_api*",
]
[tool.setuptools.package-data]
"invokeai.app.assets" = ["**/*.png"]
"invokeai.backend.qwen3" = ["tokenizer/*.json", "tokenizer/*.json.gz"]
"invokeai.backend.qwen3_vl" = ["tokenizer/*.json", "tokenizer/*.json.gz", "config/*.json"]
"invokeai.backend.qwen3_5" = ["*.json", "tokenizer/*.json", "tokenizer/*.json.gz"]
"invokeai.backend.qwen2_5_vl" = ["*.json", "tokenizer/*.json", "tokenizer/*.json.gz"]
# Read at load time by the MiniMax H3 single-file encoder loader. Without this the file is
# absent from a wheel install and that loader raises FileNotFoundError.
"invokeai.backend.minimax_h3" = ["*.json"]
"invokeai.backend.t5" = ["tokenizer/*.json"]
"invokeai.app.services.image_index" = ["*.txt"]
"invokeai.app.services.workflow_records.default_workflows" = ["*.json"]
"invokeai.backend.hidiffusion" = ["sd_module_key/*.txt"]
"invokeai.app.services.style_preset_records" = ["*.json"]
"invokeai.app.services.style_preset_images.default_style_preset_images" = [
"*.png",
]
"invokeai.assets.fonts" = ["**/*.ttf"]
"invokeai.backend" = ["**.png", "**/*.icc"]
"invokeai.configs" = ["*.example", "**/*.yaml", "*.txt"]
"invokeai.frontend.webv1.dist" = ["**"]
"invokeai.frontend.webv2.dist" = ["**"]
"invokeai.frontend.webv1.static" = ["**"]
"invokeai.app.invocations" = ["**"]
#=== Begin: PyTest and Coverage
[tool.pytest.ini_options]
# `--dist loadfile` keeps a file's tests together on one xdist worker, so module-scoped
# fixtures are set up once per file instead of in every worker that received part of it.
# It is not isolation: a worker process runs many files, in an order that depends on the
# worker count and on which file finished first, so a file must still set up its own
# process-global state. It costs nothing -- per-test distribution measured the same wall
# clock on the full suite -- and it lives here rather than in the CI command so that it
# also holds when `-n` is passed by hand. Coverage is opt-in via `--cov`.
addopts = "--strict-markers --dist loadfile -m \"not slow\""
markers = [
"slow: Marks tests as slow. Disabled by default. To run all tests, use -m \"\". To run only slow tests, use -m \"slow\".",
"timeout: Marks the timeout override.",
]
[tool.coverage.run]
branch = true
source = ["invokeai"]
omit = ["*tests*", "*migrations*", ".venv/*", "*.env"]
[tool.coverage.report]
show_missing = true
fail_under = 85 # let's set something sensible on Day 1 ...
[tool.coverage.json]
output = "coverage/coverage.json"
pretty_print = true
[tool.coverage.html]
directory = "coverage/html"
[tool.coverage.xml]
output = "coverage/index.xml"
#=== End: PyTest and Coverage
#=== Begin: Ruff
[tool.ruff]
line-length = 120
exclude = [
".git",
"__pycache__",
"build",
"dist",
"invokeai/frontend/api/node_modules/",
"invokeai/frontend/webv1/node_modules/",
"invokeai/frontend/webv2/node_modules/",
".venv*",
"*.ipynb",
"invokeai/backend/image_util/mediapipe_face/", # External code
"invokeai/backend/image_util/mlsd/", # External code
"invokeai/backend/image_util/normal_bae/", # External code
"invokeai/backend/image_util/pidi/", # External code
"invokeai/backend/image_util/imwatermark/", # External code
]
[tool.ruff.lint]
ignore = [
"E501", # https://docs.astral.sh/ruff/rules/line-too-long/
"C901", # https://docs.astral.sh/ruff/rules/complex-structure/
"B008", # https://docs.astral.sh/ruff/rules/function-call-in-default-argument/
"B904", # https://docs.astral.sh/ruff/rules/raise-without-from-inside-except/
]
select = ["B", "C", "E", "F", "W", "I", "TID"]
[tool.ruff.lint.per-file-ignores]
# Vendored from the diffusers MiniMax-H3 branch (see invokeai/backend/minimax_h3/__init__.py);
# kept as close to upstream as possible, so upstream's zip() style is tolerated.
"invokeai/backend/minimax_h3/transformer_minimax_h3.py" = ["B905"]
"invokeai/backend/minimax_h3/autoencoder_kl_minimax_h3.py" = ["B905"]
"invokeai/backend/minimax_h3/autoencoder_kl_minimax_h3_audio.py" = ["B905"]
"invokeai/backend/minimax_h3/scheduling_minimax_h3.py" = ["B905"]
[tool.ruff.format]
# The vendored MiniMax-H3 files are kept byte-identical to upstream diffusers (modulo the
# absolute-import rewrite) so that re-syncing when a tagged diffusers ships them is a clean copy
# rather than a manual re-application of formatting. Upstream wraps at a narrower line length, so
# `ruff format` would rewrap lines for no semantic gain. `ruff check` still runs on them, so the
# import sorting this project does enforce stays enforced.
#
# Listed file by file rather than as a directory glob: the package also holds first-party modules
# (presets.py, sampling.py, denoise.py, int8_convrot.py, ...) which must stay formatted.
exclude = [
"invokeai/backend/minimax_h3/packing.py",
"invokeai/backend/minimax_h3/transformer_minimax_h3.py",
"invokeai/backend/minimax_h3/autoencoder_kl_minimax_h3.py",
"invokeai/backend/minimax_h3/autoencoder_kl_minimax_h3_audio.py",
"invokeai/backend/minimax_h3/scheduling_minimax_h3.py",
]
[tool.ruff.lint.flake8-tidy-imports]
# Disallow all relative imports.
ban-relative-imports = "all"
#=== End: Ruff
#=== Begin: MyPy
# global mypy config
[tool.mypy]
ignore_missing_imports = true # ignores missing types in third-party libraries
strict = true
plugins = "pydantic.mypy"
exclude = ["tests/*"]
# overrides for specific modules
[[tool.mypy.overrides]]
follow_imports = "skip" # skips type checking of the modules listed below
module = [
"invokeai.app.api.routers.models",
"invokeai.app.invocations.text_encoder.compel",
"invokeai.app.invocations.sd.denoise_latents",
"invokeai.app.services.invocation_stats.invocation_stats_default",
"invokeai.app.services.model_manager.model_manager_base",
"invokeai.app.services.model_manager.model_manager_default",
"invokeai.app.services.model_manager.store.model_records_sql",
"invokeai.app.util.controlnet_utils",
"invokeai.backend.image_util.txt2mask",
"invokeai.backend.image_util.safety_checker",
"invokeai.backend.image_util.patchmatch",
"invokeai.backend.image_util.invisible_watermark",
"invokeai.backend.install.model_install_backend",
"invokeai.backend.ip_adapter.ip_adapter",
"invokeai.backend.ip_adapter.resampler",
"invokeai.backend.ip_adapter.unet_patcher",
"invokeai.backend.model_management.convert_ckpt_to_diffusers",
"invokeai.backend.model_management.lora",
"invokeai.backend.model_management.model_cache",
"invokeai.backend.model_management.model_manager",
"invokeai.backend.model_management.model_merge",
"invokeai.backend.model_management.model_probe",
"invokeai.backend.model_management.model_search",
"invokeai.backend.model_management.models.*", # this is needed to ignore the module's `__init__.py`
"invokeai.backend.model_management.models.base",
"invokeai.backend.model_management.models.controlnet",
"invokeai.backend.model_management.models.ip_adapter",
"invokeai.backend.model_management.models.lora",
"invokeai.backend.model_management.models.sdxl",
"invokeai.backend.model_management.models.stable_diffusion",
"invokeai.backend.model_management.models.vae",
"invokeai.backend.model_management.seamless",
"invokeai.backend.model_management.util",
"invokeai.backend.stable_diffusion.diffusers_pipeline",
"invokeai.backend.stable_diffusion.diffusion.shared_invokeai_diffusion",
"invokeai.backend.util.hotfixes",
"invokeai.backend.util.mps_fixes",
"invokeai.backend.util.util",
"invokeai.frontend.install.model_install",
]
#=== End: MyPy
[tool.pyright]
# Start from strict mode
typeCheckingMode = "strict"
# This errors whenever an import is missing a type stub file - way too noisy
reportMissingTypeStubs = "none"
# These are the rest of the rules enabled by strict mode - enable them @ warning
reportConstantRedefinition = "warning"
reportDeprecated = "warning"
reportDuplicateImport = "warning"
reportIncompleteStub = "warning"
reportInconsistentConstructor = "warning"
reportInvalidStubStatement = "warning"
reportMatchNotExhaustive = "warning"
reportMissingParameterType = "warning"
reportMissingTypeArgument = "warning"
reportPrivateUsage = "warning"
reportTypeCommentUsage = "warning"
reportUnknownArgumentType = "warning"
reportUnknownLambdaType = "warning"
reportUnknownMemberType = "warning"
reportUnknownParameterType = "warning"
reportUnknownVariableType = "warning"
reportUnnecessaryCast = "warning"
reportUnnecessaryComparison = "warning"
reportUnnecessaryContains = "warning"
reportUnnecessaryIsInstance = "warning"
reportUnusedClass = "warning"
reportUnusedImport = "warning"
reportUnusedFunction = "warning"
reportUnusedVariable = "warning"
reportUntypedBaseClass = "warning"
reportUntypedClassDecorator = "warning"
reportUntypedFunctionDecorator = "warning"
reportUntypedNamedTuple = "warning"