[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "report-genius-ai" version = "0.1.0" description = "RICS-style Retrieval-Augmented Generation system for property survey reports" readme = "README.md" license = { text = "MIT" } requires-python = ">=3.11" dependencies = [ # Web framework "fastapi>=0.111.0", "uvicorn[standard]>=0.29.0", "python-multipart>=0.0.9", # ── LangChain framework & integrations ─────────────────────────────────── "langchain>=0.3.0", "langchain-core>=0.3.0", "langchain-openai>=0.2.0", # ChatOpenAI + OpenAIEmbeddings via LCEL "langchain-community>=0.3.0", # Document loaders, FAISS vectorstore "langchain-huggingface>=0.1.0", # HuggingFaceEmbeddings (local, free) "langchain-text-splitters>=0.3.0", # RecursiveCharacterTextSplitter # Document loading back-ends used by LangChain community loaders "python-docx>=1.1.0", # provides `docx` module used by docx_builder + export API "docx2txt>=0.8", # required by Docx2txtLoader "pymupdf>=1.24.0", # required by PyMuPDFLoader "pypdf>=4.0.0", # used directly in /extract-notes for PDF text extraction "faiss-cpu>=1.8.0", # OpenAI SDK — used directly by inspector_loop.py (tool-calling loop) # langchain-openai depends on it but listing explicitly pins the runtime dep. "openai>=1.30.0", # Kept for tiktoken-based token counting in prompt builder "tiktoken>=0.7.0", # ── LLM throttling / logging helpers ───────────────────────────────────── "tenacity>=8.5.0", "structlog>=24.1.0", # Local embedding model weights (used via langchain-huggingface) "sentence-transformers>=3.0.0", # Data & persistence "pydantic>=2.7.0", "pydantic-settings>=2.3.0", "sqlalchemy>=2.0.30", "aiosqlite>=0.20.0", # Utilities "numpy>=1.26.0", "python-dateutil>=2.9.0", # Phase-1 retrieval (optional Qdrant + hybrid BM25) "qdrant-client>=1.9.0", "rank-bm25>=0.2.2", # Phase 3 — Redis rate limits + job queue (optional at runtime if redis_url unset) "redis>=5.0.0", ] [project.optional-dependencies] temporal = [ "temporalio>=1.7.0", ] dev = [ "pytest>=8.2.0", "pytest-asyncio>=0.23.0", "httpx>=0.27.0", "pytest-cov>=5.0.0", "black>=24.4.0", "ruff>=0.4.0", "mypy>=1.10.0", ] [tool.black] line-length = 88 target-version = ["py311"] [tool.ruff] line-length = 88 target-version = "py311" [tool.ruff.lint] select = ["E", "F", "I", "N", "W", "UP", "B"] ignore = ["E501", "B008"] [tool.mypy] python_version = "3.11" strict = true ignore_missing_imports = true plugins = ["pydantic.mypy"] # Tests use pytest fixtures and mocks; strict typing them adds little value. exclude = ["^app/tests/"] [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["app/tests"] addopts = "--cov=app --cov-report=term-missing -q" [tool.hatch.build.targets.wheel] packages = ["app"]