Files
2025-09-05 15:54:53 +00:00

77 lines
2.5 KiB
Python

# 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