[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "cxr_auditor" version = "0.1.0" description = "Research/educational chest X-ray draft auditor: image-grounded findings vs draft impression, with a deterministic comparator. NOT a medical device." readme = "README.md" requires-python = ">=3.12" license = { text = "Apache-2.0" } authors = [{ name = "CXR Draft Auditor contributors" }] keywords = ["chest-x-ray", "radiology", "vision-language-model", "medgemma", "audit", "hackathon"] classifiers = [ "Programming Language :: Python :: 3.12", "Intended Audience :: Science/Research", "Topic :: Scientific/Engineering :: Medical Science Apps.", "License :: OSI Approved :: Apache Software License", ] # Core dependencies are deliberately dependency-light so that the pure-logic # modules (findings, schema, prompts, and the downstream comparator/metrics) # import and unit-test without any GPU, torch, transformers, or gradio stack. dependencies = [ "numpy>=1.26", "pydantic>=2.9", "pillow>=10.3", ] [project.optional-dependencies] # Inference-time vision stack. Imported lazily inside functions so that # importing a pure-logic module never pulls torch onto the import path. vision = [ "torch>=2.4", "transformers>=4.50", "accelerate>=0.34", "qwen-vl-utils>=0.0.8", ] # Fine-tuning stack (Unsloth FastVisionModel QLoRA). train = [ "unsloth>=2025.1.1", "trl>=0.12", "peft>=0.13", "datasets>=3.0", ] # Gradio app for local runs. On a Hugging Face Space the platform manages # gradio/spaces/huggingface_hub; do not pin those in requirements.txt. app = [ "gradio>=5.0", ] dev = [ "pytest>=8.0", "pytest-cov>=5.0", "ruff>=0.8", ] [project.urls] Homepage = "https://huggingface.co/spaces" [tool.hatch.build.targets.wheel] packages = ["src/cxr_auditor"] [tool.pytest.ini_options] testpaths = ["tests"] addopts = "-v --cov=src/cxr_auditor --cov-report=term-missing --cov-fail-under=80" pythonpath = ["src"] [tool.coverage.run] source = ["src/cxr_auditor"] branch = true omit = ["*/tests/*", "*/__pycache__/*"] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "if TYPE_CHECKING:", "raise NotImplementedError", ] [tool.ruff] line-length = 127 target-version = "py312" src = ["src", "tests"] exclude = [".git", ".venv", "__pycache__", "build", "dist", "data"]