from fastapi import APIRouter, HTTPException from huggingface_hub import InferenceClient from backend.schemas import TitleRequest, TitleResponse from backend.services.title import parse_title_model_candidates, title_from_hf, title_from_query from backend.state import state router = APIRouter() @router.post("/predict/title", response_model=TitleResponse) def suggest_title(payload: TitleRequest) -> TitleResponse: query = payload.query.strip() if not query: raise HTTPException(status_code=400, detail="Query cannot be empty") fallback_title = title_from_query(query) title_client: InferenceClient | None = state.get("title_client") title_model_ids: list[str] = state.get("title_model_ids", parse_title_model_candidates()) if title_client is not None: for title_model_id in title_model_ids: try: hf_title = title_from_hf(query, title_client, title_model_id) if hf_title: return TitleResponse(title=hf_title, source=f"hf:{title_model_id}") except Exception as exc: err_text = str(exc) if "model_not_supported" in err_text or "not supported by any provider" in err_text: continue print(f"Title generation model failed ({title_model_id}): {exc}") continue print("Title generation fallback triggered: no title model available/successful") return TitleResponse(title=fallback_title, source="rule-based")