[build-system] requires = ["uv_build>=0.7.19,<0.8.0"] build-backend = "uv_build" [tool.uv.build-backend] default-excludes = true module-name = "mflux" namespace = true source-exclude = [ "**/assets/**", "**/models/flux/variants/dreambooth/_example/images/**", "**/optimization/_loss_derivation/**", ] [project] name = "mflux" version = "0.13.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>=1.1.6,<2.0", "matplotlib>=3.9.2,<4.0", "mlx>=0.27.0,<0.31.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,<1.0; python_version>='3.13'", "tokenizers>=0.20.3; python_version>='3.13'", "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>=5.0.0rc0,<6.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", ] [project.urls] homepage = "https://github.com/filipstrand/mflux" [project.scripts] mflux-generate = "mflux.models.flux.cli.flux_generate:main" mflux-generate-controlnet = "mflux.models.flux.cli.flux_generate_controlnet:main" mflux-generate-in-context = "mflux.models.flux.cli.flux_generate_in_context_dev:main" mflux-generate-in-context-edit = "mflux.models.flux.cli.flux_generate_in_context_edit:main" mflux-generate-in-context-catvton = "mflux.models.flux.cli.flux_generate_in_context_catvton:main" mflux-generate-fill = "mflux.models.flux.cli.flux_generate_fill:main" mflux-generate-depth = "mflux.models.flux.cli.flux_generate_depth:main" mflux-generate-redux = "mflux.models.flux.cli.flux_generate_redux:main" mflux-generate-kontext = "mflux.models.flux.cli.flux_generate_kontext:main" mflux-generate-qwen = "mflux.models.qwen.cli.qwen_image_generate:main" mflux-generate-qwen-edit = "mflux.models.qwen.cli.qwen_image_edit_generate:main" mflux-generate-qwen-layered = "mflux.models.qwen_layered.cli.qwen_image_layered_generate:main" mflux-generate-fibo = "mflux.models.fibo.cli.fibo_generate:main" mflux-generate-z-image-turbo = "mflux.models.z_image.cli.z_image_turbo_generate:main" mflux-refine-fibo = "mflux.models.fibo_vlm.cli.fibo_refine:main" mflux-inspire-fibo = "mflux.models.fibo_vlm.cli.fibo_inspire:main" mflux-concept = "mflux.models.flux.cli.flux_concept:main" mflux-concept-from-image = "mflux.models.flux.cli.flux_concept_from_image:main" mflux-save = "mflux.models.common.cli.save:main" mflux-save-depth = "mflux.models.depth_pro.cli.save_depth:main" mflux-train = "mflux.models.common.cli.train:main" mflux-upscale = "mflux.models.flux.cli.flux_upscale:main" mflux-lora-library = "mflux.models.common.cli.lora_library:main" mflux-info = "mflux.models.common.cli.info:main" mflux-completions = "mflux.cli.completions.install:main" [tool.ruff] line-length = 120 indent-width = 4 target-version = "py310" respect-gitignore = true [tool.ruff.lint] select = ["BLE", "E4", "E7", "E9", "F", "I", "ICN", "LOG", "PERF", "W"] ignore = [] fixable = ["ALL"] unfixable = [] dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" [tool.ruff.format] quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false line-ending = "auto" docstring-code-format = false docstring-code-line-length = "dynamic" [tool.pytest.ini_options] testpaths = ["tests"] python_files = "test_*.py" addopts = '-v --failed-first --showlocals --tb=long --full-trace -m "not high_memory_requirement"' markers = [ "high_memory_requirement: marks tests that require high memory (deselect with '-m \"not high_memory_requirement\"')", ] [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 = [ "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 python_version = "3.12"