Spaces:
Paused
Paused
| """FastAPI application factory with security middleware.""" | |
| from __future__ import annotations | |
| import logging | |
| from contextlib import asynccontextmanager | |
| from typing import TYPE_CHECKING | |
| from fastapi import FastAPI | |
| from fastapi.middleware.cors import CORSMiddleware | |
| from hermes.api.middleware import RateLimitMiddleware, SecurityHeadersMiddleware | |
| from hermes.config.settings import get_settings | |
| from hermes.mcp.server import mcp_server | |
| from hermes.tools.register import register_default_tools | |
| if TYPE_CHECKING: | |
| from collections.abc import AsyncGenerator | |
| logger = logging.getLogger(__name__) | |
| async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]: | |
| """Application lifespan handler.""" | |
| logger.info("Starting Hermes Platform...") | |
| register_default_tools() | |
| await mcp_server.initialize() | |
| # Initialize database | |
| from hermes.database.connection import DatabaseManager | |
| db = DatabaseManager() | |
| await db.initialize() | |
| await db.create_tables() | |
| app.state.db = db | |
| # Initialize observability | |
| from hermes.observability.tracer import tracer | |
| await tracer.initialize() | |
| logger.info("Hermes Platform started") | |
| yield | |
| logger.info("Shutting down Hermes Platform...") | |
| await db.close() | |
| def create_app() -> FastAPI: | |
| """Create FastAPI application.""" | |
| settings = get_settings() | |
| app = FastAPI( | |
| title=settings.app_name, | |
| description="VGTC — AI-powered Global Trade Compliance", | |
| version="2.0.0", | |
| lifespan=lifespan, | |
| ) | |
| allowed = settings.security.allowed_origins | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=allowed, | |
| allow_credentials=True, | |
| allow_methods=["GET", "POST"], | |
| allow_headers=["Authorization", "Content-Type"], | |
| ) | |
| app.add_middleware(SecurityHeadersMiddleware) | |
| app.add_middleware( | |
| RateLimitMiddleware, | |
| max_requests=settings.security.rate_limit_per_minute, | |
| window_seconds=60, | |
| ) | |
| from hermes.api.routers import agent, analysis, classify, health, mcp, research, security | |
| app.include_router(health.router, tags=["health"]) | |
| app.include_router(research.router, prefix="/api/v1", tags=["research"]) | |
| app.include_router(analysis.router, prefix="/api/v1", tags=["analysis"]) | |
| app.include_router(security.router, prefix="/api/v1", tags=["security"]) | |
| app.include_router(agent.router, prefix="/api/v1", tags=["agent"]) | |
| app.include_router(classify.router, prefix="/api/v1", tags=["classify"]) | |
| app.include_router(mcp.router, prefix="/api/v1/mcp", tags=["mcp"]) | |
| return app | |