[build-system]
requires = ["setuptools>=64", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "lightrag-hku"
dynamic = ["version"]
authors = [
    {name = "Zirui Guo"}
]
description = "LightRAG: Simple and Fast Retrieval-Augmented Generation"
readme = "README.md"
license = {text = "MIT"}
requires-python = ">=3.10"
classifiers = [
    "Development Status :: 4 - Beta",
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
    "Intended Audience :: Developers",
    "Topic :: Software Development :: Libraries :: Python Modules",
]
dependencies = [
    "aiohttp",
    "configparser",
    "google-api-core>=2.0.0,<3.0.0",
    "google-genai>=1.0.0,<3.0.0",
    "json_repair",
    "nano-vectordb",
    "networkx",
    "numpy>=1.24.0,<3.0.0",
    "packaging",
    "pandas>=2.0.0,<2.4.0",
    "pipmaster",
    "pydantic",
    "pypinyin",
    "PyYAML>=6.0,<7.0",
    "python-dotenv",
    "setuptools",
    "tenacity",
    "tiktoken",
    "xlsxwriter>=3.1.0",
]

[project.optional-dependencies]
# Test framework dependencies (for CI/CD and testing)
pytest = [
    "pytest>=8.4.2",
    "pytest-asyncio>=1.2.0",
    "pre-commit",
    "ruff",
]

api = [
    # Core dependencies
    "aiohttp",
    "configparser",
    "json_repair",
    "nano-vectordb",
    "networkx",
    "numpy>=1.24.0,<3.0.0",
    "openai>=2.0.0,<3.0.0",
    "pandas>=2.0.0,<2.4.0",
    "pipmaster",
    "pydantic",
    "pypinyin",
    "PyYAML>=6.0,<7.0",
    "python-dotenv",
    "setuptools",
    "tenacity",
    "tiktoken",
    "xlsxwriter>=3.1.0",
    "google-api-core>=2.0.0,<3.0.0",
    "google-genai>=1.0.0,<3.0.0",
    # API-specific dependencies
    "aiofiles",
    "ascii_colors",
    "distro",
    "fastapi>=0.108",  # 0.108 adds FastAPI.__call__ scope["root_path"] override; api_prefix relies on it
    "httpcore",
    "httpx>=0.28.1",
    "jiter",
    "bcrypt>=4.0.0",
    "psutil",
    "PyJWT>=2.8.0,<3.0.0",
    "python-jose[cryptography]",
    "python-multipart",
    "pytz",
    "uvicorn",
    "gunicorn",
    # Document processing dependencies (required for API document upload functionality)
    "openpyxl>=3.0.0,<4.0.0",      # XLSX processing
    "pycryptodome>=3.0.0,<4.0.0",  # PDF encryption support
    "pypdf>=6.1.0",                 # PDF processing
    "python-docx>=0.8.11,<2.0.0",  # DOCX processing
    "python-pptx>=0.6.21,<2.0.0",  # PPTX processing
    "defusedxml>=0.7.0,<1.0.0",    # Safer XML parser used by parser/docx
    # Chunking strategies (process_options=R / V); lazy-imported by lightrag.chunker
    "langchain-text-splitters>=0.3,<2",
    "langchain-experimental>=0.3,<1",
]

# Offline deployment dependencies (layered design for flexibility)
offline-storage = [
    # Storage backend dependencies
    "redis>=5.0.0,<8.0.0",
    "neo4j>=5.0.0,<7.0.0",
    "pymilvus>=2.6.2,<4.0.0",
    "pymongo>=4.0.0,<5.0.0",
    "asyncpg>=0.31.0,<1.0.0",
    "pgvector>=0.4.2,<1.0.0",
    "qdrant-client>=1.11.0,<2.0.0",
    "opensearch-py>=3.0.0,<4.0.0",
]

offline-llm = [
    # LLM provider dependencies
    "openai>=2.0.0,<3.0.0",
    "anthropic>=0.18.0,<1.0.0",
    "ollama>=0.1.0,<1.0.0",
    "zhipuai>=2.0.0,<3.0.0",
    "aioboto3>=12.0.0,<16.0.0",
    "voyageai>=0.2.0,<1.0.0",
    "llama-index>=0.14.0,<1.0.0",  # Updated to ensure compatibility with openai 2.x
    "llama-index-llms-openai>=0.6.12",  # Explicitly require version that supports openai 2.x
    "google-api-core>=2.0.0,<3.0.0",
    "google-genai>=1.0.0,<3.0.0",
]

offline = [
    # Complete offline package (includes api for document processing, plus storage and LLM)
    "lightrag-hku[api,offline-storage,offline-llm]",
]

test = [
    "lightrag-hku[api]",
    "pytest>=8.4.2",
    "pytest-asyncio>=1.2.0",
    "pre-commit",
    "ruff",
]

evaluation = [
    "lightrag-hku[api]",
    "ragas>=0.3.7",
    "datasets>=4.3.0",
]

observability = [
    # LLM observability and tracing dependencies
    "langfuse>=3.8.1",
]

[project.scripts]
lightrag-server = "lightrag.api.lightrag_server:main"
lightrag-gunicorn = "lightrag.api.run_with_gunicorn:main"
lightrag-hash-password = "lightrag.tools.hash_password:main"
lightrag-download-cache = "lightrag.tools.download_cache:main"
lightrag-clean-llmqc = "lightrag.tools.clean_llm_query_cache:main"

[project.urls]
Homepage = "https://github.com/HKUDS/LightRAG"
Documentation = "https://github.com/HKUDS/LightRAG"
Repository = "https://github.com/HKUDS/LightRAG"
"Bug Tracker" = "https://github.com/HKUDS/LightRAG/issues"

[tool.setuptools.packages.find]
include = ["lightrag*"]
exclude = ["data*", "tests*", "scripts*", "examples*", "dickens*", "reproduce*", "output_complete*", "rag_storage*", "inputs*"]

[tool.setuptools]
include-package-data = true

[tool.setuptools.dynamic]
version = {attr = "lightrag._version.__version__"}

[tool.setuptools.package-data]
lightrag = ["api/webui/**/*", "api/static/**/*"]

[tool.pytest.ini_options]
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "function"
testpaths = ["tests"]
python_files = ["test_*.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]

[tool.ruff]
target-version = "py310"
