# api/v1/models.py import httpx import json from fastapi import APIRouter from config import settings from models.llm_model import LmModelMeta from services import redis_service from typing import List from utils.logging import logger from config import settings router = APIRouter() @router.get("/models", response_model=List[str]) async def list_models(): try: async with httpx.AsyncClient(timeout=settings.REQUEST_TIMEOUT) as client: resp = await client.get(settings.LM_STUDIO_MODELS) resp.raise_for_status() data = resp.json() return [m["id"] for m in data.get("data", [])] except Exception: logger.exception("Error fetching models") raise HTTPException(status_code=500, detail="Failed to fetch models") @router.get("/default-model", response_model=str) async def get_default_model(): return settings.MODEL_NAME @router.get("/models-info", response_model=List[LmModelMeta]) async def get_model_info(): raw = redis_service.r.get("modelInfoList") if not raw: # fallback: aggiorna subito return await update_model_info() try: data = json.loads(raw) return [LmModelMeta(**item) for item in data] except Exception: return [] @router.post("/models-info/update", response_model=List[LmModelMeta]) async def update_model_info(): import httpx # 🔹 Invalida la cache prima di ricostruire try: redis_service.r.delete("modelInfoList") except Exception: logger.exception("Errore durante la cancellazione della cache Redis") try: async with httpx.AsyncClient(timeout=settings.REQUEST_TIMEOUT) as client: resp = await client.get(settings.LM_STUDIO_MODELS) resp.raise_for_status() model_list = [m["id"] for m in resp.json().get("data", [])] except Exception: raise HTTPException(status_code=500, detail="Failed to fetch models") enriched = [] for name in model_list: enriched.append(LmModelMeta( name=name, description=f"Modello {name.split('/')[-1]}", year=2024, # puoi migliorare con heuristics features=[ "Quantizzazione INT4" if "int4" in name.lower() else "Precisione standard", f"{name.split('-')[0].upper()} origin", f"{name.split('-')[1]} variant" if "-" in name else "Generico" ] )) redis_service.r.set("modelInfoList", json.dumps([m.dict() for m in enriched]), ex=86400) return enriched