[project] name = "brain-of-reese" version = "0.1.0" description = "Brain of Reese — a chippy RAG chatbot that answers questions about Reese's Homelab and Deployments, powered by self-hosted models." readme = "README.md" requires-python = ">=3.12" dependencies = [ # --- Web framework --- "fastapi>=0.115,<1.0", "uvicorn[standard]>=0.30,<1.0", "pydantic>=2.7,<3.0", "pydantic-settings>=2.3,<3.0", "python-dotenv>=1.0,<2.0", # --- Database (PostgreSQL 17 + pgvector) --- "sqlalchemy>=2.0,<2.1", "alembic>=1.13,<2.0", "psycopg[binary]>=3.1,<4.0", "pgvector>=0.3,<1.0", # --- LLM client (OpenAI-compatible, self-hosted "aipi") --- "httpx>=0.27,<1.0", "openai>=1.40,<3.0", # Phase 16: starlette's SessionMiddleware signs the session cookie with # itsdangerous — an OPTIONAL starlette extra ("full") since starlette 1.x, # so the app declares it directly (narrower than starlette[full]). "itsdangerous>=2.2,<3.0", ] [dependency-groups] dev = [ "debugpy>=1.8", "ruff>=0.5", "pyright>=1.1", "pytest>=8.2", "pytest-cov>=5.0", "playwright>=1.45", ] [tool.ruff] line-length = 100 target-version = "py312" [tool.ruff.lint] select = ["E", "F", "W", "I", "UP", "B", "SIM"] [tool.pyright] pythonVersion = "3.12" typeCheckingMode = "standard" include = ["app", "scripts", "alembic", "tests"] [tool.pytest.ini_options] testpaths = ["tests/unit", "tests/integration"] pythonpath = ["."] addopts = "-q"