[project] name = "pinrag" version = "0.10.0" description = "A powerful RAG (Retrieval-Augmented Generation) system built with LangChain, designed as an MCP server for Cursor, VS Code, and other AI assistants" readme = "README.md" requires-python = ">=3.12" dependencies = [ "chromadb>=1.5.7", "langchain-chroma>=1.1.0", "langchain>=1.2.15", "langchain-classic>=1.0.3", "langchain-anthropic>=1.4.0", "langchain-community>=0.4.1", "langchain-core>=1.2.28", "langchain-nomic>=1.0.1", "nomic[local]>=3.9.0", "langchain-openai>=1.1.12", "langchain-text-splitters>=1.1.1", "mcp>=1.27.0", "pypdf>=6.9.2", "typer>=0.12.0", "uvicorn>=0.34.0", "requests>=2.33.1", "yt-dlp>=2026.3.17", "youtube-transcript-api>=1.2.4", "langchain-openrouter>=0.2.1", "httpx>=0.28.0", "beautifulsoup4>=4.13.0", "lxml>=5.3.0", "trafilatura>=2.0.0", "markdownify>=1.0.0", ] [project.urls] Homepage = "https://github.com/ndjordjevic/pinrag" Repository = "https://github.com/ndjordjevic/pinrag" [project.optional-dependencies] # OpenRouter chat models (also listed in core deps; default LLM provider is openrouter). openrouter = ["langchain-openrouter>=0.2.1"] # YouTube on-screen enrichment: scene detection (host also needs ffmpeg on PATH). vision = ["scenedetect[opencv]>=0.6.7.1"] rerank = ["flashrank>=0.2.10"] eval = ["langsmith>=0.7.29"] dev = [ "pytest>=9.0.3", "ruff>=0.15.9", "mypy>=1.20.0", # Same as optional `rerank` extra — keeps rerank tests runnable with `uv sync --extra dev`. "flashrank>=0.2.10", # Same as core dep — explicit for `uv sync --extra dev` toolchains that omit main deps. "langchain-openrouter>=0.2.1", ] [project.scripts] pinrag = "pinrag.cli:main" [tool.pytest.ini_options] testpaths = ["tests"] markers = [ "integration: needs network, API keys, or optional assets (e.g. sample PDF)", "pypi_mcp: stdio MCP against published PyPI pinrag package (network, uv tool run pinrag)", ] filterwarnings = [ "ignore::pydantic.warnings.PydanticDeprecatedSince20", ] [tool.ruff] lint.select = [ "E", # pycodestyle "F", # pyflakes "I", # isort "D", # pydocstyle "UP", # pyupgrade ] lint.ignore = [ "T201", # allow print() "E501", # ignore line length "D101", # ignore docstring for private modules "D103", # ignore docstring for private modules # pydocstyle pairs that conflict when "D" is selected; Ruff otherwise warns each run "D203", # use D211 (no blank line before class) "D213", # use D212 (summary on first line) ] [build-system] requires = ["setuptools>=82.0.1"] build-backend = "setuptools.build_meta" [tool.setuptools] package-dir = {"" = "src"} [tool.setuptools.packages.find] where = ["src"]