Wire the guarded conversational RAG answer layer end-to-end

This commit is contained in:
2026-08-05 14:33:13 +07:00
parent 834d9e51b0
commit ef08b4929e
127 changed files with 37921 additions and 169 deletions
+28 -2
View File
@@ -1,10 +1,36 @@
[project]
name = "ai-service"
version = "0.0.0"
description = "RAG orchestration + OpenAI calls for the Duoc Thu medical chatbot"
description = "RAG orchestration for the Duoc Thu medical chatbot"
requires-python = ">=3.11"
dependencies = []
dependencies = [
"fastapi>=0.115,<1",
"httpx>=0.27,<1",
"psycopg[binary]>=3.2,<4",
"pydantic-settings>=2.6,<3",
"qdrant-client>=1.7,<2",
"uvicorn[standard]>=0.30,<1",
]
[project.optional-dependencies]
test = ["pytest>=7.4,<9"]
# Both optional on purpose: the service answers without a metrics stack, and
# without a cloud generator. Neither is a precondition for a grounded answer.
metrics = ["prometheus-client>=0.20,<1"]
generation = ["anthropic>=0.112,<1"]
[build-system]
requires = ["setuptools>=68"]
build-backend = "setuptools.build_meta"
[tool.ruff]
line-length = 100
[tool.ruff.lint]
select = ["F", "E9", "B", "ARG"]
[tool.ruff.lint.per-file-ignores]
# Test doubles implement the domain's Protocols. Conformance requires the full
# signature even where a double ignores an argument, so ARG here would push
# tests toward fakes that no longer match the interface they stand in for.
"tests/*" = ["ARG001", "ARG002"]