[project] name = "ai-service" version = "0.0.0" description = "RAG orchestration for the Duoc Thu medical chatbot" requires-python = ">=3.11" 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"] observability = [ "opentelemetry-api>=1.27,<2", "opentelemetry-sdk>=1.27,<2", "opentelemetry-exporter-otlp-proto-http>=1.27,<2", ] [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"]