[project] name = "ragcore" version = "1.2.1" description = "Central, secure, local-first RAG platform" readme = "README.md" requires-python = ">=3.13,<3.14" license = { text = "Proprietary" } authors = [{ name = "ITWorx" }] dependencies = [ "fastapi>=0.116,<1", "pydantic-settings>=2.10,<3", "uvicorn[standard]>=0.35,<1", ] [project.optional-dependencies] control = [ "alembic>=1.16,<2", "psycopg[binary,pool]>=3.2,<4", "sqlalchemy[asyncio]>=2.0.41,<3", ] retrieval = [ "httpx>=0.28,<1", "qdrant-client>=1.15,<2", ] ingestion = [ "docling>=2.117,<2.118", "python-multipart>=0.0.20,<1", ] auth = [ "httpx>=0.28,<1", "pyjwt[crypto]>=2.10,<3", ] telemetry = [ "opentelemetry-api>=1.27,<2", "opentelemetry-sdk>=1.27,<2", "opentelemetry-exporter-otlp-proto-http>=1.27,<2", ] web = [ "jinja2>=3.1.6,<4", "python-multipart>=0.0.20,<1", ] mcp = [ "mcp>=1.12,<3", ] [dependency-groups] dev = [ "mypy>=1.17,<2", "pytest>=8.4,<9", "pytest-asyncio>=1.1,<2", "pytest-cov>=6.2,<7", "pyyaml>=6.0.2,<7", "ruff>=0.12,<1", "types-pyyaml>=6.0.12,<7", "httpx>=0.28,<1", "playwright>=1.62.0", "ragcore-sdk", ] [project.scripts] ragcore = "ragcore.main:run" ragcore-worker = "ragcore.worker:run" ragcore-mcp = "ragcore.mcp.main:run" ragcore-modelforge-shadow = "ragcore.ops.modelforge_shadow:run" ragcore-modelforge-evaluate = "ragcore.ops.modelforge_evaluate:run" ragcore-modelforge-rerank-evaluate = "ragcore.ops.modelforge_rerank_evaluate:run" ragcore-modelforge-selected-comparison = "ragcore.ops.modelforge_selected_comparison:run" ragcore-modelforge-embedding-cutover = "ragcore.ops.modelforge_embedding_cutover:run" ragcore-modelforge-embedding-bootstrap = "ragcore.ops.modelforge_embedding_bootstrap:run" [build-system] requires = ["uv_build>=0.8,<1"] build-backend = "uv_build" [tool.uv.build-backend] module-name = "ragcore" module-root = "src" [tool.uv.workspace] members = ["sdk/python"] [tool.uv.sources] ragcore-sdk = { workspace = true } [tool.pytest.ini_options] testpaths = ["tests"] addopts = "-ra --strict-markers --strict-config" asyncio_mode = "auto" markers = [ "integration: requires disposable infrastructure", "security: authorization or adversarial security test", "evaluation: retrieval/generation quality gate", ] [tool.ruff] target-version = "py313" line-length = 100 src = ["src", "tests", "scripts"] [tool.ruff.lint] select = ["E", "F", "I", "UP", "B", "SIM", "ASYNC", "S", "RUF"] ignore = ["S101"] [tool.ruff.lint.per-file-ignores] "tests/**" = ["S105", "S106"] "scripts/**" = ["S603", "S607"] [tool.mypy] python_version = "3.13" strict = true mypy_path = "src" plugins = ["pydantic.mypy"] [tool.coverage.run] branch = true source = ["ragcore"] [tool.coverage.report] show_missing = true fail_under = 80