Spaces:
Paused
Paused
| from fastapi import FastAPI, HTTPException, Depends | |
| from fastapi.security import APIKeyHeader | |
| from pydantic import BaseModel | |
| from transformers import pipeline | |
| import os | |
| from typing import List, Optional | |
| app = FastAPI() | |
| # API Key security – read from environment secret | |
| API_KEY = os.getenv("INTERNAL_API_KEY") | |
| if not API_KEY: | |
| raise RuntimeError("INTERNAL_API_KEY environment variable not set") | |
| API_KEY_NAME = "X-Internal-API-Key" | |
| api_key_header = APIKeyHeader(name=API_KEY_NAME, auto_error=False) | |
| async def verify_api_key(api_key: str = Depends(api_key_header)): | |
| if not api_key or api_key != API_KEY: | |
| raise HTTPException(status_code=403, detail="Invalid API Key") | |
| return api_key | |
| model = pipeline("zero-shot-classification", model="vicgalle/xlm-roberta-large-xnli-anli") | |
| DEFAULT_TOPICS = [ | |
| "Health", "Education", "Water Supply", "Electricity", "Housing", "Transport", | |
| "Roads", "Bridges", "Railways", "Airports", "Digital Infrastructure", | |
| "Agriculture", "Irrigation", "Livestock", "Forestry", "Environment", "Climate Change", | |
| "Economy", "Employment", "Small Business", "Industry", "Trade", "Tourism", | |
| "Social Protection", "Pension", "Disability Support", "Food Security", "Poverty Reduction", | |
| "Governance", "Justice", "Police", "Defense", "Public Safety", | |
| "Urban Planning", "Rural Development", "Land Administration", "Migration", | |
| "Sports", "Culture", "Youth", "Women Affairs", "Diaspora" | |
| ] | |
| class TopicRequest(BaseModel): | |
| text: str | |
| candidate_topics: Optional[List[str]] = None | |
| class TopicResponse(BaseModel): | |
| topics: List[dict] | |
| async def suggest_topics(request: TopicRequest, _ = Depends(verify_api_key)): | |
| if not request.text.strip(): | |
| raise HTTPException(status_code=400, detail="Empty text") | |
| candidate = request.candidate_topics or DEFAULT_TOPICS | |
| result = model(request.text, candidate) | |
| top = [{"topic": result["labels"][i], "confidence": result["scores"][i]} for i in range(min(3, len(result["labels"])))] | |
| return {"topics": top} | |
| async def health(): | |
| return {"status": "ok"} |