File size: 1,516 Bytes
c7256ee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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")