3-ai-native-e2e-sample/backend/main.py (77 lines of code) (raw):
"""
Main FastAPI Application Entry Point
This application ties together:
- Simulation of trial events (via the /simulate endpoint)
- Multi-agent trial event analysis (using the coordinator and specialized agents)
- Telemetry integration for monitoring the full end-to-end pipeline.
"""
import os
import logging
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import RedirectResponse
from utils.telemetry import configure_telemetry
from clients import ensure_clients
from routers import medication, literature, trials # Add medication import
# -------------------------------
# Environment Configuration
# -------------------------------
# Configure logging with proper level handling
def get_log_level():
"""Get log level from environment with fallback to INFO"""
level = os.getenv("LOG_LEVEL", "INFO").upper()
return getattr(logging, level, logging.INFO)
logging.basicConfig(
level=get_log_level(),
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
# Configure OpenTelemetry
configure_telemetry()
logger.info("🎯 Starting Clinical Trials Monitor")
# -------------------------------
# Router Imports
# -------------------------------
from routers.trials import router as trials_router
from routers.literature import router as literature_router
from routers.medication import router as medication_router
# -------------------------------
# FastAPI App Configuration
# -------------------------------
logger.info("⚙️ Configuring FastAPI application")
app = FastAPI(
title="Clinical Trials Monitor",
description="""
Real-time clinical trial event monitoring and analysis system using Azure AI Agents Service.
This system integrates:
• Trial event simulation via Azure Event Hubs.
• Multi-agent processing to analyze trial events.
• Telemetry for tracing and performance insights.
""",
version="1.0.0"
)
# -------------------------------
# Middleware Setup
# -------------------------------
logger.info("🔒 Configuring CORS middleware")
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"], # Frontend application URL
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# -------------------------------
# Router Registration
# -------------------------------
logger.info("📝 Registering API routes")
app.include_router(
trials_router,
prefix="/api/trials",
tags=["trials"]
)
app.include_router(
literature_router,
prefix="/api/agents",
tags=["literature"]
)
app.include_router(
medication_router,
prefix="/api/medication",
tags=["medication"]
)
app.include_router(medication.router) # Add this line
# -------------------------------
# Application Events
# -------------------------------
@app.on_event("startup")
async def startup_event():
"""
Initialize required services and verify dependencies on application startup.
This includes:
• Validating that the Azure AI clients are set up to enable multi-agent communication.
• Ensuring all telemetry configurations are in place.
"""
logger.info("📦 Imported dependencies successfully")
logger.info("✅ Backend services initialized successfully")
# -------------------------------
# Core Endpoints
# -------------------------------
@app.get("/", include_in_schema=False)
async def root():
"""Redirect root endpoint to ReDoc API documentation."""
return RedirectResponse(url="/redoc", status_code=302)
@app.get("/health")
async def health_check():
"""Health check endpoint to verify service status."""
return {"status": "ok"}
# -------------------------------
# Development Configuration
# -------------------------------
# Print all registered routes for debugging purposes
if os.getenv("DEBUG", "false").lower() == "true":
logger.info("📋 Registered Routes:")
for route in app.routes:
logger.info(f"{route.path} - {route.name}")
logger.info("✅ Application configuration complete")
# -------------------------------
# Development Server
# -------------------------------
if __name__ == "__main__":
import uvicorn
uvicorn.run(
"main:app",
host="0.0.0.0",
port=8003,
reload=True,
log_level=os.getenv("LOG_LEVEL", "info").lower()
)