[build-system] requires = ["setuptools>=84.1.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "chimeraforge" version = "0.86.0" description = "LLM deployment optimizer (performance, cost, and safety) — backed by ~204,000 real measurements on consumer GPUs" readme = "README.md" requires-python = ">=3.11" license = "MIT" authors = [{ name = "ChimeraForge Team" }] keywords = [ "llm", "inference", "benchmark", "deployment", "gpu", "optimization", "vram", "gpu-sizing", "quantization", "ollama", "vllm", "llama-cpp", "gguf", "capacity-planning", "mcp", ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Topic :: Scientific/Engineering :: Artificial Intelligence", ] dependencies = [ "typer>=0.9,<1.0", "rich>=13.0,<16.0", "httpx>=0.25", "certifi>=2026.10.19", ] [project.scripts] chimeraforge = "chimeraforge.cli:app" [project.urls] # Homepage is the site, not the repo: PyPI renders it as the primary link, and the site # is where a reader who arrived from `pip install` can be sent somewhere built for them. # Nothing linked the package to chimeraforge.vercel.app before, in either direction. Homepage = "https://chimeraforge.vercel.app" Repository = "https://github.com/Sahil170595/Chimeraforge" Documentation = "https://github.com/Sahil170595/Chimeraforge#readme" Changelog = "https://github.com/Sahil170595/Chimeraforge/blob/main/CHANGELOG.md" Issues = "https://github.com/Sahil170595/Chimeraforge/issues" [project.optional-dependencies] bench = ["platformdirs>=4.0,<5.0", "pynvml>=11.0"] # The patched file-lock release requires Python 3.11 or later. eval = ["evaluate>=0.4", "filelock>=4.2.1,<5"] refit = ["numpy>=1.24,<3.0", "scipy>=1.11,<2.0", "platformdirs>=4.0,<5.0"] sign = ["cryptography>=50.0.2,<51"] # httpx is a core dependency now, so these are kept only for back-compat # (existing `pip install "chimeraforge[resolve|safety]"` stays a valid no-op). safety = [] resolve = [] # Pinned to mcp 1.x: the server targets `mcp.server.fastmcp.FastMCP`, which mcp 2.0 # restructured/moved. Bump deliberately after porting to the 2.0 API, not implicitly. mcp = ["mcp>=1.30,<2.0"] dev = ["pytest>=7.4,<10.0", "pytest-cov>=4.1,<8.0", "pytest-asyncio>=0.21,<2.0", "ruff>=0.3,<1.0", "psutil>=5.9", "structlog>=23.0", "mcp>=1.30,<2.0", "pyyaml>=6.0", "setuptools>=84.1.0", "wheel>=0.45,<1", "hypothesis>=6.140,<7", "build>=1.3,<2", "twine>=6.2,<8", "mypy>=1.18,<3", "pip-audit>=2.9,<3", "types-PyYAML>=6.0", "filelock>=4.2.1,<5"] all = ["chimeraforge[bench,eval,refit,safety,resolve,mcp,sign]"] [dependency-groups] # Hosted Ubuntu rendering controller only; never selected by --all-extras. browser-ci = ["playwright==1.64.1"] [tool.setuptools.packages.find] where = ["src"] include = ["chimeraforge*"] [tool.setuptools.package-data] "chimeraforge.planner" = ["data/*.json"] [tool.pytest.ini_options] testpaths = ["tests"] asyncio_mode = "strict" # So `pytest tests/` -- the verify gate the README and CLAUDE.md both document -- # works from a clean checkout without an editable install. An editable install # pointing at a stale path made the documented command fail with # ModuleNotFoundError while PYTHONPATH=src kept working, which hides the breakage # from whoever set their shell up once and never looked again. pythonpath = ["src"] addopts = "--strict-markers --strict-config" [tool.coverage.run] branch = true source = ["chimeraforge"] [tool.coverage.report] show_missing = true [tool.mypy] python_version = "3.11" files = ["src/chimeraforge/bench/metrics.py", "src/chimeraforge/planner/constants.py"] check_untyped_defs = true disallow_untyped_defs = true warn_return_any = true warn_unused_ignores = true [tool.ruff] target-version = "py311" line-length = 100 [tool.ruff.lint] # Pin the enforced ruleset (pyflakes + pycodestyle) so a ruff upgrade that expands # the default set can't silently break CI on pre-existing, intentionally-kept code. select = ["E", "F", "W"]