Files
ai-tax-agent/libs/config/factories.py
harkon fdba81809f
Some checks failed
CI/CD Pipeline / Generate SBOM (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / Code Quality & Linting (push) Has been cancelled
CI/CD Pipeline / Policy Validation (push) Has been cancelled
CI/CD Pipeline / Test Suite (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-coverage) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-extract) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-firm-connectors) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-forms) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-hmrc) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-ingestion) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-kg) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-normalize-map) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-ocr) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-rag-indexer) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-rag-retriever) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-reason) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-rpa) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (ui-review) (push) Has been cancelled
CI/CD Pipeline / Security Scanning (svc-coverage) (push) Has been cancelled
CI/CD Pipeline / Security Scanning (svc-extract) (push) Has been cancelled
CI/CD Pipeline / Security Scanning (svc-kg) (push) Has been cancelled
CI/CD Pipeline / Security Scanning (svc-rag-retriever) (push) Has been cancelled
CI/CD Pipeline / Security Scanning (ui-review) (push) Has been cancelled
CI/CD Pipeline / Notifications (push) Has been cancelled
completed local setup with compose
2025-11-26 13:17:17 +00:00

88 lines
2.8 KiB
Python

"""Client factories for various services."""
from typing import Any
import hvac
import redis.asyncio as redis
from minio import Minio
from neo4j import GraphDatabase
from qdrant_client import QdrantClient
from .settings import BaseAppSettings
class VaultClientFactory: # pylint: disable=too-few-public-methods
"""Factory for creating Vault clients"""
@staticmethod
def create_client(settings: BaseAppSettings) -> hvac.Client:
"""Create authenticated Vault client"""
client = hvac.Client(url=settings.vault_addr)
if settings.vault_token:
# Development mode with token
client.token = settings.vault_token
elif settings.vault_role_id and settings.vault_secret_id:
# Production mode with AppRole
try:
auth_response = client.auth.approle.login(
role_id=settings.vault_role_id, secret_id=settings.vault_secret_id
)
client.token = auth_response["auth"]["client_token"]
except Exception as e:
raise ValueError("Failed to authenticate with Vault") from e
else:
raise ValueError(
"Either vault_token or vault_role_id/vault_secret_id must be provided"
)
if not client.is_authenticated():
raise ValueError("Failed to authenticate with Vault")
return client
class MinIOClientFactory: # pylint: disable=too-few-public-methods
"""Factory for creating MinIO clients"""
@staticmethod
def create_client(settings: BaseAppSettings) -> Minio:
"""Create MinIO client"""
return Minio(
endpoint=settings.minio_endpoint,
access_key=settings.minio_access_key,
secret_key=settings.minio_secret_key,
secure=settings.minio_secure,
)
class QdrantClientFactory: # pylint: disable=too-few-public-methods
"""Factory for creating Qdrant clients"""
@staticmethod
def create_client(settings: BaseAppSettings) -> QdrantClient:
"""Create Qdrant client"""
return QdrantClient(url=settings.qdrant_url, api_key=settings.qdrant_api_key)
class Neo4jDriverFactory: # pylint: disable=too-few-public-methods
"""Factory for creating Neo4j drivers"""
@staticmethod
def create_driver(settings: BaseAppSettings) -> Any:
"""Create Neo4j driver"""
return GraphDatabase.driver(
settings.neo4j_uri, auth=(settings.neo4j_user, settings.neo4j_password)
)
class RedisClientFactory: # pylint: disable=too-few-public-methods
"""Factory for creating Redis clients"""
@staticmethod
async def create_client(settings: BaseAppSettings) -> "redis.Redis[str]":
"""Create Redis client"""
return redis.from_url(
settings.redis_url, encoding="utf-8", decode_responses=True
)