Kazeia-central/kazeia_central/api/app.py

86 lines
2.9 KiB
Python

"""API FastAPI de Kazeia-central (étapes 0-1 : lecture de flotte).
Sert l'UI web locale et expose la lecture des endpoints provider existants par
tablette. Les écritures (config/presets/profils/RAG) et l'export conversations
seront ajoutés quand les méthodes call() base64-JSON seront livrées côté app
patiente (docs/PROVIDER_RPC_SPEC.md).
Lancer : `uvicorn kazeia_central.api.app:app --reload`
"""
from __future__ import annotations
from fastapi import FastAPI, HTTPException
from ..adb import Adb, AdbError
from ..provider import ProviderClient
def create_app(adb: Adb | None = None) -> FastAPI:
adb = adb or Adb()
app = FastAPI(title="Kazeia-central", version="0.0.1")
def client(serial: str) -> ProviderClient:
return ProviderClient(adb, serial)
def _guard(fn):
try:
return fn()
except AdbError as e:
raise HTTPException(status_code=502, detail=str(e)) from e
except IndexError as e: # endpoint a renvoyé 0 ligne
raise HTTPException(status_code=404, detail="aucune donnée") from e
@app.get("/api/health")
def health():
return {"ok": True, "version": app.version}
@app.get("/api/devices")
def devices():
return [d.__dict__ for d in _guard(adb.devices)]
@app.get("/api/devices/{serial}/state")
def state(serial: str):
return _guard(lambda: client(serial).state()).model_dump()
@app.get("/api/devices/{serial}/turns")
def turns(serial: str):
return [t.model_dump() for t in _guard(lambda: client(serial).turns())]
@app.get("/api/devices/{serial}/crashes")
def crashes(serial: str):
return [c.model_dump() for c in _guard(lambda: client(serial).crashes())]
@app.get("/api/devices/{serial}/models")
def models(serial: str):
return [x.model_dump() for x in _guard(lambda: client(serial).models())]
@app.get("/api/devices/{serial}/voices")
def voices(serial: str):
return [v.model_dump() for v in _guard(lambda: client(serial).voices())]
@app.get("/api/devices/{serial}/rag/status")
def rag_status(serial: str):
return _guard(lambda: client(serial).rag_status()).model_dump()
@app.get("/api/devices/{serial}/rag/index")
def rag_index(serial: str):
return [d.model_dump() for d in _guard(lambda: client(serial).rag_index())]
@app.get("/api/devices/{serial}/updates")
def updates(serial: str):
return _guard(lambda: client(serial).updates()).model_dump()
@app.get("/api/devices/{serial}/profiles")
def profiles(serial: str):
return [p.model_dump() for p in _guard(lambda: client(serial).profiles())]
@app.get("/api/devices/{serial}/conversations")
def sessions(serial: str, profile_id: str | None = None):
return [s.model_dump() for s in _guard(lambda: client(serial).sessions(profile_id))]
return app
app = create_app()