| 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") |
|
|