import logging import os from fastapi import FastAPI, HTTPException, Request from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from fastapi.responses import JSONResponse, RedirectResponse from pathlib import Path from app.routers import rag # Setup logging logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s", handlers=[ logging.StreamHandler(), logging.FileHandler("logs/app.log"), ] ) logger = logging.getLogger(__name__) # Create the FastAPI app app = FastAPI( title="RAG Research Assistant API", description="API for a Retrieval Augmented Generation system for research papers", version="1.0.0", ) # Configure CORS settings app.add_middleware( CORSMiddleware, allow_origins=["*"], # In production, replace with specific origins allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Include routers app.include_router(rag.router) # Root path handler - add this for Hugging Face Spaces @app.get("/") async def root(): """Root endpoint that redirects to docs""" return { "message": "Welcome to the RAG Research Assistant API", "documentation": "/docs", "endpoints": { "rag": "/rag/query", "health": "/health" } } # Mount static files if frontend exists frontend_build_path = Path("../frontend/build") if frontend_build_path.exists(): app.mount("/static", StaticFiles(directory=str(frontend_build_path)), name="frontend") @app.get("/health") async def health_check(): """Simple health check endpoint""" return {"status": "healthy"} @app.on_event("startup") async def startup_event(): """Startup event handler""" # Ensure logs directory exists Path("logs").mkdir(exist_ok=True) logger.info("Application started") @app.on_event("shutdown") async def shutdown_event(): """Shutdown event handler""" logger.info("Application shut down") if __name__ == "__main__": import uvicorn # Determine port from environment or use default port = int(os.environ.get("PORT", 7860)) # Run the application using Uvicorn uvicorn.run("app.main:app", host="0.0.0.0", port=port, reload=True)