import logging from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from api.routes import generate, health, chat, auth, documents, tenant, leads from core.rate_limiter import RateLimitMiddleware import threading from fastapi.responses import FileResponse logger = logging.getLogger("axiom.main") app = FastAPI(title="Axiom RAG System", version="3.0.0") app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"], ) # Rate-limit auth endpoints: 20 req/min per IP app.add_middleware( RateLimitMiddleware, rate_limited_paths=["/auth/"], max_requests=20, window_seconds=60, ) # Rate-limit heavy API endpoints (Generation, Document Upload): 30 req/min per IP app.add_middleware( RateLimitMiddleware, rate_limited_paths=["/generate/", "/documents/upload", "/chat/sessions"], max_requests=30, window_seconds=60, ) app.include_router(health.router, tags=["Health"]) app.include_router(auth.router, tags=["Auth"]) #app.include_router(google_auth.router, tags=["Auth"]) app.include_router(generate.router, tags=["Generate"]) app.include_router(chat.router, prefix="/chat", tags=["Chat"]) app.include_router(documents.router, tags=["Documents"]) app.include_router(tenant.router, tags=["Tenant"]) app.include_router(leads.router, tags=["Leads"]) @app.on_event("startup") async def startup_event(): def load_pipeline(): try: from api.routes.generate import get_pipeline get_pipeline() except Exception as e: logger.error(f"Pipeline load error: {e}") threading.Thread(target=load_pipeline, daemon=True).start() logger.info("Pipeline loading in background...") # Add these explicit UI routes: @app.get("/login", tags=["UI"]) async def serve_login(): return FileResponse("frontend/login.html") @app.get("/app", tags=["UI"]) async def serve_app(): return FileResponse("frontend/app.html") @app.get("/reset", tags=["UI"]) async def serve_reset(): return FileResponse("frontend/reset.html") @app.get("/profile", tags=["UI"]) async def serve_profile(): return FileResponse("frontend/profile.html") @app.get("/admin", tags=["UI"]) async def serve_admin(): return FileResponse("frontend/admin.html") app.mount("/", StaticFiles(directory="frontend", html=True), name="frontend")