[project] name = "alphabrief-api" version = "1.0.0" description = "AlphaBrief — supervisor-pattern multi-agent research orchestration with MCP tooling and human-in-the-loop governance" readme = "README.md" requires-python = ">=3.12,<3.13" license = { text = "MIT" } dependencies = [ "fastapi>=0.115.0", "uvicorn[standard]>=0.32.0", "pydantic>=2.9.0", "pydantic-settings>=2.6.0", "langgraph>=0.2.50", "langgraph-checkpoint>=2.0.0", "langgraph-checkpoint-postgres>=2.0.0", # Durable checkpoints for the default SQLite database, so the human gate # survives a restart without anyone configuring Postgres. "langgraph-checkpoint-sqlite>=2.0.0", "anthropic>=0.40.0", "mcp>=1.1.0", "yfinance>=0.2.50", "feedparser>=6.0.11", "sqlalchemy>=2.0.36", "psycopg[binary]>=3.2.0", "langfuse>=2.53.0", "httpx>=0.27.0", "sse-starlette>=2.1.3", "python-dotenv>=1.0.1", "tenacity>=9.0.0", ] [project.optional-dependencies] dev = [ "pytest>=8.3.0", "pytest-asyncio>=0.24.0", "pytest-cov>=6.0.0", "ruff>=0.8.0", "mypy>=1.13.0", # Deploying the API to a Hugging Face Space (scripts/deploy_space.py). "huggingface-hub>=0.26.0", ] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["app"] # -------------------------------------------------------------- pytest ------ # Ruff + mypy configuration lives in the repo-root pyproject.toml so that one # quality gate covers apps/api and eval/ together. Pytest is rooted here. [tool.pytest.ini_options] minversion = "8.0" testpaths = ["tests"] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" addopts = "-q --strict-markers --strict-config" filterwarnings = [ "error", # Third-party internals we do not control. Scoped as tightly as possible so # a warning raised by OUR code still fails the suite. "ignore::DeprecationWarning:yfinance", "ignore::FutureWarning:yfinance", "ignore::DeprecationWarning:pkg_resources", "ignore::DeprecationWarning:peewee", "ignore::DeprecationWarning:websockets", "ignore:.*'crypt' is deprecated.*:DeprecationWarning", "ignore:.*datetime.datetime.utcnow.*:DeprecationWarning", "ignore:.*Support for class-based `config`.*:DeprecationWarning", ] markers = [ "network: performs a real outbound network call (deselect with '-m \"not network\"')", ]