[project] name = "wardrobe-os-ml-service" version = "0.0.1" description = "ML inference service for Wardrobe OS" requires-python = ">=3.11" dependencies = [ "fastapi>=0.115.0", "uvicorn[standard]>=0.32.0", "pydantic>=2.10.0", "open-clip-torch>=2.29.0", "torch>=2.5.0", "torchvision>=0.20.0", "Pillow>=11.0.0", "python-multipart>=0.0.18", "psycopg[binary,pool]>=3.2.0", "replicate>=1.0.0", "transformers>=5.5.0", "xgboost>=2.0.0", "scikit-learn>=1.4.0", "joblib>=1.3.0", "chronos-forecasting>=2.0.0", "timesfm>=1.3.0", "pytrends>=4.9.0", "timm>=1.0.25", "einops>=0.8.2", "google-auth>=2.49.1", "google-api-python-client>=2.193.0", "cryptography>=46.0.5", "peft>=0.18.1", "trl>=0.19.1", "bitsandbytes>=0.49.2", "datasets>=4.8.4", "accelerate>=1.13.0", "pyyaml>=6.0.3", "gradio-client>=1.3.0", "lightgbm>=4.5.0", "sentry-sdk[fastapi]>=2.0.0", ] [tool.uv] # Gemma 4 需要 transformers>=5.5.0,但 chronos-forecasting 鎖定 <5。 # chronos 只用基礎 pipeline API,跨大版本相容,安全覆蓋。 override-dependencies = [ "transformers>=5.5.0", ] dev-dependencies = [ "pytest>=8.0.0", "ruff>=0.8.0", "httpx>=0.28.0", "pytest-asyncio>=1.3.0", ] [tool.ruff.lint.per-file-ignores] # main.py 故意在 `from PIL import Image` 之後、重模型 import 之前設定 # Image.MAX_IMAGE_PIXELS(PIL decompression-bomb cap,memory # feedback_pil_decompression_bomb_cap)→ 其後所有 import 必然不在檔案頂部, # E402 是這個安全模式的預期結果,非疏漏。 "src/main.py" = ["E402"] # newsletter_parser 延後 import email_parser._strip_code_fence(兩個 parser # 模組互引,late import 規避 circular import),E402 是刻意的。 "src/services/newsletter_parser.py" = ["E402"] [tool.pytest.ini_options] asyncio_mode = "auto"