[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 module-name = "mflux" namespace = true source-exclude = [ # documentation assets were 27MB on 2025-07-05 "**/assets/**", # dreambooth examples ~=5MB on 2025-07-05 "**/models/flux/variants/dreambooth/_example/images/**", # loss pdf/tex does not need to be distributed "**/optimization/_loss_derivation/**", ] [project] name = "mflux" version = "0.11.0" 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 = [ "accelerate>=0.31.0", "filelock>=3.18.0", "huggingface-hub>=0.24.5,<1.0", "matplotlib>=3.9.2,<4.0", "mlx>=0.27.0,<0.30.0", "numpy>=2.0.1,<3.0", "opencv-python>=4.10.0,<5.0", "piexif>=1.1.3,<2.0", "pillow>=10.4.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", "regex>=2024.11.6", "requests>=2.32.4", "safetensors>=0.4.4,<1.0", "sentencepiece>=0.2.0,<1.0; python_version<'3.13'", # sentencepiece 0.2.1 is first release with 3.13 and 3.14 wheels: https://pypi.org/project/sentencepiece/0.2.1/ "sentencepiece>=0.2.1,<1.0; python_version>='3.13'", "tokenizers>=0.20.3; python_version>='3.13'", # transformers -> tokenizers "toml>=0.10.2,<1.0", "torch>=2.7.1", "torch>=2.3.1,<3.0; python_version<'3.13'", "torch>=2.8.0,<3.0; python_version>='3.13'", "tqdm>=4.66.5,<5.0", "transformers>=4.55.0,<5.0", "twine>=6.1.0,<7.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 = [ "matplotlib>3.10,<4.0", "pytest>=8.3.0,<9.0", "pytest-timer>=1.0,<2.0", "mlx==0.29.2", # 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-generate-qwen-edit-plus = "mflux.generate_qwen_edit_plus: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-info = "mflux.info:main" mflux-completions = "mflux.ui.cli.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 --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"