|
from fastapi import FastAPI |
|
from fastapi.middleware.cors import CORSMiddleware |
|
from fastapi.staticfiles import StaticFiles |
|
from fastapi.responses import FileResponse |
|
import os |
|
from dotenv import load_dotenv |
|
|
|
|
|
from core.story_generator import StoryGenerator |
|
from core.setup import setup_game, get_universe_generator |
|
from core.session_manager import SessionManager |
|
from services.flux_client import FluxClient |
|
from api.routes.chat import get_chat_router |
|
from api.routes.image import get_image_router |
|
from api.routes.speech import get_speech_router |
|
from api.routes.universe import get_universe_router |
|
|
|
|
|
load_dotenv() |
|
|
|
|
|
API_HOST = os.getenv("API_HOST", "0.0.0.0") |
|
API_PORT = int(os.getenv("API_PORT", "8000")) |
|
STATIC_FILES_DIR = os.getenv("STATIC_FILES_DIR", "../client/dist") |
|
HF_API_KEY = os.getenv("HF_API_KEY") |
|
ELEVEN_LABS_API_KEY = os.getenv("ELEVEN_LABS_API_KEY") |
|
IS_DOCKER = os.getenv("IS_DOCKER", "false").lower() == "true" |
|
|
|
app = FastAPI(title="Echoes of Influence") |
|
|
|
|
|
app.add_middleware( |
|
CORSMiddleware, |
|
allow_origins=[ |
|
"http://localhost:5173", |
|
f"http://localhost:{API_PORT}", |
|
"https://huggingface.co.", |
|
"https://*.hf.space", |
|
"https://mistral-ai-game-jam-dont-lookup.hf.space" |
|
], |
|
allow_credentials=True, |
|
allow_methods=["*"], |
|
allow_headers=["*"], |
|
) |
|
|
|
|
|
mistral_api_key = os.getenv("MISTRAL_API_KEY") |
|
if not mistral_api_key: |
|
raise ValueError("MISTRAL_API_KEY environment variable is not set") |
|
|
|
print("Creating global SessionManager") |
|
session_manager = SessionManager() |
|
story_generator = StoryGenerator(api_key=mistral_api_key) |
|
flux_client = FluxClient(api_key=HF_API_KEY) |
|
|
|
|
|
@app.get("/api/health") |
|
async def health_check(): |
|
"""Health check endpoint""" |
|
return {"status": "healthy"} |
|
|
|
|
|
print("Registering route handlers with SessionManager", id(session_manager)) |
|
app.include_router(get_chat_router(session_manager, story_generator), prefix="/api") |
|
app.include_router(get_image_router(flux_client), prefix="/api") |
|
app.include_router(get_speech_router(), prefix="/api") |
|
app.include_router(get_universe_router(session_manager, story_generator), prefix="/api") |
|
|
|
@app.on_event("startup") |
|
async def startup_event(): |
|
"""Initialize components on startup""" |
|
pass |
|
|
|
@app.on_event("shutdown") |
|
async def shutdown_event(): |
|
"""Clean up on shutdown""" |
|
|
|
session_manager.cleanup_expired_sessions() |
|
|
|
|
|
await flux_client.close() |
|
|
|
|
|
if IS_DOCKER: |
|
|
|
app.mount("/", StaticFiles(directory="static", html=True), name="static") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
import uvicorn |
|
uvicorn.run("server:app", host=API_HOST, port=API_PORT, reload=True) |