test/moxie/main.py
Z User 18301108b3 Add OpenWebUI features and integrate admin settings into profile
- Enhanced chat UI with visible action buttons (TTS, delete, regenerate, thumbs up/down)
- Added admin settings section to profile page for admin users
- Added admin API endpoints for user management, config, and RAG documents
- Removed need for separate admin endpoint - admins access settings via profile
2026-03-24 15:02:47 +00:00

131 lines
3.5 KiB
Python
Executable File

"""
MOXIE - Fake Local LLM Orchestrator
Main FastAPI Application Entry Point
"""
import sys
from pathlib import Path
# Add project root to path
sys.path.insert(0, str(Path(__file__).parent))
from contextlib import asynccontextmanager
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse, FileResponse
from fastapi.staticfiles import StaticFiles
from fastapi.middleware.cors import CORSMiddleware
from loguru import logger
from config import settings, get_data_dir, get_workflows_dir
from api.routes import router as api_router
from api.admin import router as admin_router
from web.routes import router as web_router
from core.orchestrator import Orchestrator
from rag.store import RAGStore
from auth.models import get_auth_manager
# Configure logging
logger.remove()
logger.add(
sys.stderr,
format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
level="DEBUG" if settings.debug else "INFO"
)
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Application lifespan manager."""
logger.info("Starting MOXIE Orchestrator...")
# Initialize data directories
get_data_dir()
get_workflows_dir()
# Initialize auth manager
auth_manager = get_auth_manager()
logger.info("Auth Manager initialized")
# Initialize RAG store
app.state.rag_store = RAGStore()
logger.info("RAG Store initialized")
# Initialize orchestrator
app.state.orchestrator = Orchestrator(app.state.rag_store)
logger.info("Orchestrator initialized")
logger.success(f"MOXIE ready on http://{settings.host}:{settings.port}")
logger.info(f"Web UI: http://{settings.host}:{settings.port}/")
logger.info(f"Admin features available in Profile page for admin users")
yield
# Cleanup
logger.info("Shutting down MOXIE...")
# Create FastAPI app
app = FastAPI(
title="MOXIE",
description="AI Assistant with multiple backend support",
version="1.0.0",
lifespan=lifespan,
docs_url=None, # Hide docs
redoc_url=None, # Hide redoc
)
# CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Static files for admin UI
admin_static_path = Path(__file__).parent / "admin" / "static"
if admin_static_path.exists():
app.mount(
f"/{settings.admin_path}/static",
StaticFiles(directory=str(admin_static_path)),
name="admin-static"
)
# Static files for web UI
web_static_path = Path(__file__).parent / "web" / "static"
if web_static_path.exists():
app.mount(
"/static",
StaticFiles(directory=str(web_static_path)),
name="web-static"
)
# Include routers
app.include_router(web_router, tags=["web"]) # Web UI routes at root
app.include_router(api_router, prefix="/v1", tags=["api"]) # OpenAI-compatible API
app.include_router(admin_router, prefix=f"/{settings.admin_path}", tags=["admin"]) # Admin panel
@app.get("/health")
async def health_check():
"""Health check endpoint."""
return {"status": "healthy", "service": "moxie"}
# Serve favicon
@app.get("/favicon.ico")
async def favicon():
return {"status": "not found"}
if __name__ == "__main__":
import uvicorn
uvicorn.run(
"main:app",
host=settings.host,
port=settings.port,
reload=settings.debug,
)