File size: 2,450 Bytes
69e310f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
[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\"')",
]