fastapi>=0.115,<1
uvicorn[standard]>=0.34,<1
sqlalchemy[asyncio]>=2.0,<3
asyncpg>=0.30,<1
pgvector>=0.3,<1
alembic>=1.14,<2
pydantic>=2.0,<3
pydantic-settings>=2.0,<3
google-cloud-aiplatform>=1.80,<2
google-genai>=0.3
# Used directly by core_api.clients.identity_token (Cloud Run ID-token
# fetch) — explicit here instead of relying on google-cloud-aiplatform's
# transitive pull, so a future GCP-SDK cleanup can't silently break it.
requests>=2.31
openai
python-dateutil>=2.8,<3
httpx>=0.27,<1
mcp>=1.26,<2

# Optional: only needed if EMBEDDING_PROVIDER=openai
# openai>=1.0,<2

# Auth: password hashing, JWT, TOTP, encryption
argon2-cffi>=23.1
cryptography>=42.0
python-jose[cryptography]>=3.3
pyotp>=2.9
cachetools>=5.3

croniter>=2.0

# SQLite async driver (for OSS standalone storage backend)
aiosqlite>=0.19,<1

# Redis cache (optional — falls back to in-memory if not configured)
redis[hiredis]>=5.0,<6

# Rate limiting — backed by Redis when REDIS_URL is set, in-memory otherwise
slowapi>=0.1.9,<1.0

# Error tracking (optional — set SENTRY_DSN to enable)
sentry-sdk[fastapi]>=2.0,<3

# Structured logging with GCP Cloud Logging severity mapping (common/structlog_config.py)
structlog>=25.4,<26

# NOTE: google-cloud-pubsub is NOT listed here so OSS standalone deploys
# (EVENT_BUS_BACKEND=inprocess, default) stay lightweight. GCP/SaaS
# deployments that need the Pub/Sub backend install it via the [pubsub]
# extra on each service, e.g. `pip install 'core-api[pubsub]'`. The
# lazy import in common/events/pubsub.py keeps the rest of the code
# loadable without the SDK.
