suna/backend/api.py

76 lines
2.1 KiB
Python
Raw Normal View History

2025-03-30 14:48:57 +08:00
from fastapi import FastAPI, Request, BackgroundTasks, HTTPException, Depends, Body
from fastapi.responses import StreamingResponse
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi.responses import FileResponse
from contextlib import asynccontextmanager
from agentpress.thread_manager import ThreadManager
from services.supabase import DBConnection
from datetime import datetime, timezone
from dotenv import load_dotenv
import asyncio
2025-04-01 10:36:26 +08:00
from backend.utils.logger import logger
2025-03-30 14:48:57 +08:00
# Import the agent API module
from agent import api as agent_api
# Load environment variables
load_dotenv()
# Initialize managers
db = DBConnection()
thread_manager = None
@asynccontextmanager
async def lifespan(app: FastAPI):
# Startup
global thread_manager
2025-04-01 10:36:26 +08:00
logger.info("Starting up FastAPI application")
2025-03-30 14:48:57 +08:00
await db.initialize()
thread_manager = ThreadManager()
# Initialize the agent API with shared resources
agent_api.initialize(
thread_manager,
db
)
# Initialize Redis before restoring agent runs
from services import redis
await redis.initialize_async()
asyncio.create_task(agent_api.restore_running_agent_runs())
yield
# Clean up agent resources (including Redis)
2025-04-01 10:36:26 +08:00
logger.info("Cleaning up agent resources")
2025-03-30 14:48:57 +08:00
await agent_api.cleanup()
# Clean up database connection
2025-04-01 10:36:26 +08:00
logger.info("Disconnecting from database")
2025-03-30 14:48:57 +08:00
await db.disconnect()
app = FastAPI(lifespan=lifespan)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Include the agent router with a prefix
app.include_router(agent_api.router, prefix="/api")
@app.get("/api/health-check")
async def health_check():
"""Health check endpoint to verify API is working."""
2025-04-01 10:36:26 +08:00
logger.info("Health check endpoint called")
2025-03-30 14:48:57 +08:00
return {"status": "ok", "timestamp": datetime.now(timezone.utc).isoformat()}
if __name__ == "__main__":
import uvicorn
2025-04-01 10:36:26 +08:00
logger.info("Starting server on 0.0.0.0:8000")
2025-03-30 14:48:57 +08:00
uvicorn.run(app, host="0.0.0.0", port=8000)