"""Application.""" import sentry_sdk from ddtrace.llmobs import LLMObs from fastapi import FastAPI, HTTPException from fastapi.datastructures import Default from fastapi.middleware import Middleware from fastapi.responses import JSONResponse from audience_common.context.asgi.middleware import ( CorrelationIdMiddleware, RequestContextMiddleware, ) from audience_common.logger.asgi.middleware import RequestLoggerMiddleware from ai_eval_runner import config from ai_eval_runner.api import error_handlers from ai_eval_runner.api.routers import eval, infra if config.LLMOBS_ENABLED: LLMObs.enable(ml_app=config.LLMOBS_ML_APP) app = FastAPI( debug=config.APP_DEBUG, title=config.SERVICE_NAME, version=config.SERVICE_VERSION, default_response_class=Default(JSONResponse), description="Test service that runs ai eval tests and returns test results", middleware=[ Middleware(CorrelationIdMiddleware), Middleware(RequestContextMiddleware), Middleware( RequestLoggerMiddleware, exclude_paths=["/hello/", "/redoc", "/docs", "/openapi.json"], ), ], ) app.include_router(infra.router) app.include_router(eval.router) app.add_exception_handler(Exception, error_handlers.default_error_handler) app.add_exception_handler( HTTPException, error_handlers.http_error_handler, # type: ignore[arg-type] ) if config.ENVIRONMENT in [config.PROD_ENVIRONMENT, config.QA_ENVIRONMENT]: if not config.SENTRY_DSN: raise Exception(f"Sentry is not configured in {config.ENVIRONMENT}") sentry_sdk.init(dsn=config.SENTRY_DSN)