Spaces:
Runtime error
Runtime error
| from __future__ import annotations | |
| from fastapi import FastAPI, UploadFile, File, Form | |
| from fastapi.responses import StreamingResponse | |
| from fastapi import HTTPException | |
| from pydantic import BaseModel | |
| import asyncio | |
| import os | |
| import tempfile | |
| from pathlib import Path | |
| from src.chat import ChatSession | |
| from src.log import get_logger | |
| from src.db import list_sessions, list_sessions_info | |
| _LOG = get_logger(__name__) | |
| class ChatRequest(BaseModel): | |
| user: str = "default" | |
| session: str = "default" | |
| prompt: str | |
| def create_app() -> FastAPI: | |
| app = FastAPI(title="LLM Backend API") | |
| async def chat_stream(req: ChatRequest): | |
| async def stream() -> asyncio.AsyncIterator[str]: | |
| async with ChatSession(user=req.user, session=req.session) as chat: | |
| try: | |
| async for part in chat.chat_stream(req.prompt): | |
| yield part | |
| except Exception as exc: # pragma: no cover - runtime failures | |
| _LOG.error("Streaming chat failed: %s", exc) | |
| yield f"Error: {exc}" | |
| return StreamingResponse(stream(), media_type="text/plain") | |
| async def upload_document( | |
| user: str = Form(...), | |
| session: str = Form("default"), | |
| file: UploadFile = File(...), | |
| ): | |
| async with ChatSession(user=user, session=session) as chat: | |
| tmpdir = tempfile.mkdtemp(prefix="upload_") | |
| tmp_path = Path(tmpdir) / file.filename | |
| try: | |
| contents = await file.read() | |
| tmp_path.write_bytes(contents) | |
| vm_path = chat.upload_document(str(tmp_path)) | |
| finally: | |
| try: | |
| os.remove(tmp_path) | |
| os.rmdir(tmpdir) | |
| except OSError: | |
| pass | |
| return {"path": vm_path} | |
| async def list_user_sessions(user: str): | |
| return {"sessions": list_sessions(user)} | |
| async def list_user_sessions_info(user: str): | |
| data = list_sessions_info(user) | |
| if not data: | |
| raise HTTPException(status_code=404, detail="User not found") | |
| return {"sessions": data} | |
| async def health(): | |
| return {"status": "ok"} | |
| return app | |
| app = create_app() | |