[build-system] requires = ["uv_build>=0.7.19,<0.8.0"] build-backend = "uv_build" [tool.uv.build-backend] default-excludes = true # __pycache__, *.pyc, and *.pyo source-exclude = [ # documentation assets were 27MB on 2025-07-05 "**/assets/**", # dreambooth examples ~=5MB on 2025-07-05 "**/dreambooth/_example/images/**", # loss pdf/tex does not need to be distributed "**/optimization/_loss_derivation/**", ] [project] name = "mflux" version = "0.9.3" description = "A MLX port of FLUX based on the Huggingface Diffusers implementation." readme = "README.md" keywords = ["diffusers", "flux", "mlx"] authors = [{ name = "Filip Strand", email = "strand.filip@gmail.com" }] maintainers = [{ name = "Filip Strand", email = "strand.filip@gmail.com" }] license = { file = "LICENSE" } requires-python = ">=3.10" dependencies = [ "huggingface-hub>=0.24.5,<1.0", "matplotlib>=3.9.2,<4.0", "mlx>=0.22.0,<=0.26.1", "numpy>=2.0.1,<3.0", "opencv-python>=4.10.0,<5.0", "piexif>=1.1.3,<2.0", "pillow>=10.4.0,<11.0; python_version<'3.13'", "pillow>=11.0,<12.0; python_version>='3.13'", "platformdirs>=4.0,<5.0", "safetensors>=0.4.4,<1.0", # python 3.13 workaround for now: # use temporary community build of py13 wheel, use until official project build # uv pip install https://github.com/anthonywu/sentencepiece/releases/download/0.2.1-py13dev/sentencepiece-0.2.1-cp313-cp313-macosx_11_0_arm64.whl "sentencepiece>=0.2.0,<1.0; python_version<'3.13'", "tokenizers>=0.20.3; python_version>='3.13'", # transformers -> tokenizers "toml>=0.10.2,<1.0", "torch>=2.3.1,<3.0; python_version<'3.13'", # torch dev builds: pip install --pre --index-url https://download.pytorch.org/whl/nightly "torch>=2.6.0.dev20241106; python_version>='3.13'", "tqdm>=4.66.5,<5.0", "transformers>=4.44.0,<5.0", ] classifiers = [ "Intended Audience :: Developers", "Operating System :: MacOS", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", ] [project.optional-dependencies] dev = [ "pytest>=8.3.0,<9.0", "pytest-timer>=1.0,<2.0", "mlx==0.26.1", # Used ONLY during test runs to ensure deterministic test results ] [project.urls] homepage = "https://github.com/filipstrand/mflux" [project.scripts] mflux-generate = "mflux.generate:main" mflux-generate-controlnet = "mflux.generate_controlnet:main" mflux-generate-in-context = "mflux.generate_in_context_dev:main" mflux-generate-in-context-edit = "mflux.generate_in_context_edit:main" mflux-generate-in-context-catvton = "mflux.generate_in_context_catvton:main" mflux-generate-fill = "mflux.generate_fill:main" mflux-generate-depth = "mflux.generate_depth:main" mflux-generate-redux = "mflux.generate_redux:main" mflux-generate-kontext = "mflux.generate_kontext:main" mflux-concept = "mflux.concept:main" mflux-concept-from-image = "mflux.concept_from_image:main" mflux-save = "mflux.save:main" mflux-save-depth = "mflux.save_depth:main" mflux-train = "mflux.train:main" mflux-upscale = "mflux.upscale:main" mflux-lora-library = "mflux.lora_library:main" mflux-completions = "mflux.completions.install:main" [tool.ruff] line-length = 120 indent-width = 4 target-version = "py310" respect-gitignore = true [tool.ruff.lint] # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or # McCabe complexity (`C901`) by default. select = ["BLE", "E4", "E7", "E9", "F", "I", "ICN", "LOG", "PERF", "W"] ignore = [] # Allow fix for all enabled rules (when `--fix`) is provided. fixable = ["ALL"] unfixable = [] # Allow unused variables when underscore-prefixed. dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" [tool.ruff.format] # Like Black, use double quotes for strings. quote-style = "double" # Like Black, indent with spaces, rather than tabs. indent-style = "space" # Like Black, respect magic trailing commas. skip-magic-trailing-comma = false # Like Black, automatically detect the appropriate line ending. line-ending = "auto" # Enable auto-formatting of code examples in docstrings. Markdown, # reStructuredText code/literal blocks and doctests are all supported. # # This is currently disabled by default, but it is planned for this # to be opt-out in the future. docstring-code-format = false # Set the line length limit used when formatting code snippets in # docstrings. # # This only has an effect when the `docstring-code-format` setting is # enabled. docstring-code-line-length = "dynamic" [tool.pytest.ini_options] testpaths = ["tests"] python_files = "test_*.py" addopts = "-v --exitfirst --failed-first --showlocals --tb=long --full-trace" # https://docs.astral.sh/ruff/settings/#lintisort [tool.ruff.lint.isort] case-sensitive = false combine-as-imports = true force-wrap-aliases = true from-first = false known-first-party = ["src"] relative-imports-order = "furthest-to-closest" section-order = [ "future", "standard-library", "third-party", "first-party", "local-folder", ] [tool.mypy] disable_error_code = [ # TODO: for each error code - clean them up in a single PR then remove entry "annotation-unchecked", "arg-type", "assignment", "attr-defined", "import-untyped", "index", "union-attr", "return", "return-value", "var-annotated" ] error_summary = true ignore_missing_imports = true implicit_optional = true # we should feel free to use new hinting features even if we back support to earlier versions python_version = 3.12