from pydantic import BaseModel, Field from typing import Optional class AnalyzeRequest(BaseModel): topic: str = Field(..., min_length=1, max_length=200) top_k: int = Field(default=10, ge=1, le=20) class ArticleResult(BaseModel): source: str source_bias: str source_bias_provenance: Optional[str] = None url: str title: Optional[str] = None description: Optional[str] = None publishedAt: Optional[str] = None text: str text_label: str confidence: float similarity_score: float probabilities: dict class SourceSummary(BaseModel): source_bias: str Biased: int Not_Biased: int = Field(alias="Not Biased") total: int class Config: populate_by_name = True class AnalyzeResponse(BaseModel): topic: str total_articles: int results: list[ArticleResult] summary: dict[str, SourceSummary] class IngestRequest(BaseModel): topic: str = Field(..., min_length=1, max_length=200) page_size: int = Field(default=10, ge=1, le=50) class IngestResponse(BaseModel): topic: str articles_fetched: int articles_stored: int status: str