File size: 3,064 Bytes
09ed8ca
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2a83c3b
 
 
 
09ed8ca
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2a83c3b
09ed8ca
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2206073
 
 
 
09ed8ca
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
[project]
name = "secureagentrag"
version = "0.1.0"
description = "Privacy-First, Multi-Agent, Production-Grade RAG Platform"
readme = "README.md"
license = { text = "MIT" }
authors = [{ name = "Moaz Muhammad", email = "moazmo@users.noreply.github.com" }]
requires-python = ">=3.11,<3.14"
dependencies = [
    "langgraph>=0.2.0",
    "langgraph-checkpoint-sqlite>=2.0.0",
    "aiosqlite>=0.20.0",
    "langchain-core>=0.3.0",
    "qdrant-client>=1.12.0",
    "ollama>=0.4.0",
    "streamlit>=1.40.0",
    "pydantic>=2.0",
    "pydantic-settings>=2.6.0",
    "python-docx>=1.1.0",
    "pymupdf>=1.25.0",
    "Pillow>=11.0.0",
    "structlog>=24.4.0",
    "httpx>=0.28.0",
    "tenacity>=9.0.0",
    "uuid6>=2024.7.10",
    "nest-asyncio>=1.6.0",
]

[project.optional-dependencies]
ocr = [
    "paddleocr>=2.9.0",
    "paddlepaddle>=3.0.0",
]
embeddings-local = [
    "sentence-transformers>=3.3.0",
]
evaluation = [
    "ragas>=0.2.0",
    "pandas>=2.2.0",
]
observability = [
    "arize-phoenix>=8.0.0",
    "openinference-instrumentation-langchain>=0.1.0",
    "openinference-instrumentation-openai>=0.1.0",
    "opentelemetry-api>=1.28.0",
    "opentelemetry-sdk>=1.28.0",
]
metrics = [
    "prometheus-client>=0.21.0",
    "prometheus-fastapi-instrumentator>=7.0.0",
]
persistence = [
    "psycopg[binary,pool]>=3.2.0",
    "langgraph-checkpoint-postgres>=2.0.0",
]
cache = [
    "redis>=5.0.0",
]
api = [
    "fastapi>=0.115.0",
    "uvicorn[standard]>=0.32.0",
    "python-jose[cryptography]>=3.3.0",
    "python-multipart>=0.0.12",
]
mcp = [
    "mcp>=1.0.0",
]
pii = [
    "presidio-analyzer>=2.2.0",
    "presidio-anonymizer>=2.2.0",
]
all = [
    "secureagentrag[ocr,embeddings-local,evaluation,observability,metrics,persistence,cache,api,mcp,pii]",
]

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.hatch.build.targets.wheel]
packages = ["."]

[dependency-groups]
dev = [
    "pytest>=8.3.0",
    "pytest-asyncio>=0.24.0",
    "pytest-cov>=6.0.0",
    "ruff>=0.8.0",
]

[tool.ruff]
line-length = 100
target-version = "py311"

[tool.ruff.lint]
select = [
    "E",    # pycodestyle errors
    "W",    # pycodestyle warnings
    "F",    # pyflakes
    "I",    # isort
    "N",    # pep8-naming
    "UP",   # pyupgrade
    "B",    # flake8-bugbear
    "SIM",  # flake8-simplify
    "TCH",  # flake8-type-checking
    "RUF",  # ruff-specific rules
]
# RUF001/002/003 flag "ambiguous" Unicode (e.g. Arabic full stop ۔, question
# mark ؟). Arabic is a first-class supported language here, so these fire on
# every legitimate Arabic literal/comment — ignore them project-wide.
ignore = ["E501", "RUF001", "RUF002", "RUF003"]

[tool.ruff.lint.isort]
known-first-party = ["config", "core", "ingestion", "retrieval", "inference", "evaluation", "utils", "app"]

[tool.pytest.ini_options]
testpaths = ["tests"]
asyncio_mode = "auto"
addopts = "-v --tb=short --strict-markers"
markers = [
    "slow: marks tests as slow (deselect with '-m \"not slow\"')",
    "integration: marks integration tests requiring external services",
]