77 lines
2.5 KiB
Python
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
|
|
|
|
|