[project] name = "eco-guard" version = "0.3.0" description = "Production-grade LLM inference gateway and MLOps platform" requires-python = ">=3.11" dependencies = [ "fastapi>=0.104", "uvicorn[standard]>=0.23", "pydantic>=2.4", "pydantic-settings>=2.0", "sqlalchemy[asyncio]>=2.0", "asyncpg>=0.28", "llama-cpp-python>=0.2.11", "numpy>=1.26", "orjson>=3.9", "httpx>=0.25", "prometheus-client>=0.19", "slowapi>=0.1.9", "python-multipart>=0.0.6", "opentelemetry-api>=1.21", "opentelemetry-sdk>=1.21", "opentelemetry-exporter-otlp-proto-http>=1.21", "opentelemetry-instrumentation-fastapi>=0.42b0", "opentelemetry-instrumentation-sqlalchemy>=0.42b0", "jinja2>=3.1", "aiosqlite>=0.22.1", "pyjwt>=2.12.1", "redis>=5.0", "pyyaml>=6.0", "huggingface-hub>=1.14.0", ] [dependency-groups] dev = [ "pytest>=7.4", "pytest-asyncio>=0.21", "pytest-cov>=4.1", "ruff>=0.0.292", "mypy>=1.5", "pre-commit>=3.4", "alembic>=1.12", "httpx>=0.25", ] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src"] [tool.ruff] line-length = 88 target-version = "py311" [tool.ruff.lint] select = ["E", "F", "I", "W"] ignore = ["E501", "N818"] [tool.ruff.lint.per-file-ignores] "__init__.py" = ["F401"] "tests/*.py" = ["F401"] [tool.ruff.format] quote-style = "double" [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] addopts = "-v --cov=src --cov-report=term-missing" markers = [ "integration: integration tests that require the full app context", ] [tool.mypy] python_version = "3.11" strict = false ignore_missing_imports = true [[tool.mypy.overrides]] module = [ "src.mlops.models", "src.mlops.training", "src.mlops.experiments", "src.mlops.pipeline", "src.mlops.registry", "src.mlops.prompts", "src.mlops.quantization", "src.mlops.scheduler", "src.mlops.ab_testing", "src.mlops.backup", "src.mlops.dataset", "src.mlops.evaluation", "src.mlops.usage", "src.core.audit", "src.services.drift_detector", "src.services.background", "src.core.retry", "src.api.dashboard_routes", "src.core.router", ] disable_error_code = ["assignment", "arg-type", "attr-defined", "operator", "annotation-unchecked", "var-annotated", "misc", "return-value"] [[tool.mypy.overrides]] module = "src.main" disable_error_code = ["arg-type"]