LXC-Frontend (FastAPI + HTML/JS): - Audio-Upload (MP3/WAV/M4A/MP4/OGG/FLAC, max. 500 MB) - SQLite Job-Store, BackgroundTask-Pipeline - Job-Liste mit Live-Status, Downloads (DOCX + JSON) - Mac-Health-Indicator im UI Mac-Worker (FastAPI): - /api/transcribe (lightning-whisper-mlx | faster-whisper | mock) - /api/summarize + /api/protocol via Ollama (llama3.1:8b) - /api/export/docx via python-docx Deploy: - systemd-Service, Nginx Reverse-Proxy - deploy/install.sh: idempotentes LXC-Setup Doku: README.md, lxc-frontend/README.md, mac-worker/README.md
52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
import logging
|
|
from contextlib import asynccontextmanager
|
|
from pathlib import Path
|
|
|
|
from fastapi import FastAPI
|
|
from fastapi.responses import FileResponse, JSONResponse
|
|
from fastapi.staticfiles import StaticFiles
|
|
|
|
from app.api.jobs import router as jobs_router
|
|
from app.core.config import settings
|
|
from app.core.db import init_db
|
|
from app.core.mac_client import MacClient
|
|
|
|
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s: %(message)s")
|
|
log = logging.getLogger("voice-agent")
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(app: FastAPI):
|
|
init_db()
|
|
log.info("DB initialized at %s", settings.db_url)
|
|
log.info("Upload dir: %s", settings.upload_dir)
|
|
log.info("Result dir: %s", settings.result_dir)
|
|
log.info("Mac API: %s", settings.mac_api_url)
|
|
yield
|
|
|
|
|
|
app = FastAPI(title=settings.app_name, lifespan=lifespan)
|
|
app.include_router(jobs_router)
|
|
|
|
STATIC_DIR = Path(__file__).resolve().parent / "static"
|
|
app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static")
|
|
|
|
|
|
@app.get("/")
|
|
def index():
|
|
return FileResponse(STATIC_DIR / "index.html")
|
|
|
|
|
|
@app.get("/health")
|
|
def health():
|
|
return {"status": "ok", "service": settings.app_name}
|
|
|
|
|
|
@app.get("/api/mac/health")
|
|
async def mac_health():
|
|
try:
|
|
data = await MacClient().health()
|
|
return {"reachable": True, "mac": data}
|
|
except Exception as e: # noqa: BLE001
|
|
return JSONResponse(status_code=502, content={"reachable": False, "error": str(e)})
|