[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", # Phase 49: FastAPI's multipart parser for the archive upload form # (POST /api/git-sources/upload) — an A2 FastAPI implementation detail, # not a new architectural anchor (phase 49 locked decisions). "python-multipart>=0.0.9,<0.1", # Phase 126: PDF support (locked A1) — PyMuPDF (import name `fitz`) is the # PDF parser: page-by-page text extraction AND embedded image extraction # in a single API. Chosen over pdfplumber (text-only) per phase 126 design. "pymupdf>=1.24,<2.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"] # The phase-159 task-01 test embeds the FULL byte-pin of app.js's # ``runTurn`` (32KB, 584 lines — the house byte-pin convention for the # phase's "NOT touched" contract). The pin must stay byte-identical to # the JS source, so its long JS comment lines cannot be wrapped — E501 # is ignored for that file only (the test code itself is wrapped). [tool.ruff.lint.per-file-ignores] "tests/unit/test_frontend_edit_message.py" = ["E501"] [tool.pyright] pythonVersion = "3.12" typeCheckingMode = "standard" include = ["app", "scripts", "alembic", "tests"] [tool.pytest.ini_options] testpaths = ["tests/unit", "tests/integration"] pythonpath = ["."] addopts = "-q"