3-ai-native-e2e-sample/backend/clients.py (61 lines of code) (raw):
# This module initializes and validates the Azure AI clients.
# These clients are critical for communication with the AI agents used in the trial event analysis flow.
import os
import logging
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
logger = logging.getLogger(__name__)
trace.set_tracer_provider(TracerProvider())
tracer = trace.get_tracer(__name__)
project_client = None
chat_client = None
def validate_project_client(client) -> bool:
"""Validate project client is properly initialized."""
if not client:
logger.error("Project client is None")
return False
if not hasattr(client, 'agents'):
logger.error("Project client missing 'agents' attribute")
logger.error("Client type: %s", type(client))
logger.error("Available attributes: %s", dir(client))
return False
return True
def ensure_clients():
"""Ensure clients are initialized for multi-agent communication."""
global project_client, chat_client
logger.info("🔌 Initializing Azure AI clients")
try:
conn_str = os.getenv("PROJECT_CONNECTION_STRING")
if not conn_str:
raise ValueError("PROJECT_CONNECTION_STRING environment variable not set")
logger.debug("Connection string: %s", conn_str)
if not project_client or not validate_project_client(project_client):
logger.info("Creating new project client")
try:
project_client = AIProjectClient.from_connection_string(
credential=DefaultAzureCredential(),
conn_str=conn_str
)
logger.debug("Project client created: %s", project_client)
logger.debug("Project client type: %s", type(project_client))
logger.debug("Project client attributes: %s", dir(project_client))
if not validate_project_client(project_client):
raise ValueError("Project client validation failed after creation")
logger.info("✅ AIProjectClient initialized successfully")
logger.debug("Getting chat client from project client")
chat_client = project_client.inference.get_chat_completions_client()
logger.info("✅ Chat client initialized successfully")
except Exception as e:
logger.error("Failed to create project client: %s", str(e), exc_info=True)
project_client = None
chat_client = None
raise
else:
logger.debug("Using existing project client: %s", project_client)
if not validate_project_client(project_client):
raise ValueError("Project client validation failed in final check")
return project_client, chat_client
except Exception as e:
logger.error("❌ Failed to initialize clients: %s", str(e), exc_info=True)
logger.error("Project client state: %s", project_client)
logger.error("Connection string used: %s", os.getenv("PROJECT_CONNECTION_STRING", "Not set"))
raise
__all__ = ['project_client', 'chat_client', 'tracer', 'ensure_clients']