[project] name = "modpilot-engine" version = "0.0.1" description = "ModPilot Investigation Engine — Strategy Selector, Orchestrator, Tools, Reasoner, Calibrator" readme = "README.md" requires-python = ">=3.11" license = { text = "MIT" } dependencies = [ "fastapi>=0.115", "uvicorn[standard]>=0.32", "pydantic>=2.9", "pydantic-settings>=2.6", "google-genai>=0.3", "asyncpg>=0.30", "sqlalchemy[asyncio]>=2.0", "alembic>=1.13", "redis[hiredis]>=5.2", "httpx>=0.28", "structlog>=24.4", "python-dotenv>=1.0", "tenacity>=9.0", "psycopg[binary]>=3.3.4", ] [project.optional-dependencies] dev = [ "pytest>=8.3", "pytest-asyncio>=0.24", "pytest-cov>=6.0", "ruff>=0.8", "mypy>=1.13", "types-redis", "respx>=0.21", "httpx[cli]>=0.28", ] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["api", "orchestrator", "tools", "llm", "memory", "store", "observability"] [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["."] python_files = ["test_*.py"] addopts = "-ra --strict-markers --tb=short" [tool.coverage.run] branch = true source = ["api", "orchestrator", "tools", "llm", "memory", "store"] [tool.coverage.report] exclude_lines = ["pragma: no cover", "if TYPE_CHECKING:", "raise NotImplementedError"] [tool.mypy] python_version = "3.11" strict = true warn_return_any = true warn_unused_configs = true disallow_untyped_defs = true no_implicit_optional = true warn_redundant_casts = true warn_unused_ignores = true plugins = ["pydantic.mypy"] [[tool.mypy.overrides]] module = "google.genai.*" ignore_missing_imports = true