from pydantic import BaseModel, Field, HttpUrl, validator, ConfigDict from typing import Dict, List, Optional from enum import Enum from datetime import datetime class ErrorResponse(BaseModel): detail: str error_code: str = Field(..., description="Unique error code for this type of error") timestamp: str = Field(default_factory=lambda: datetime.now().isoformat()) path: Optional[str] = Field(None, description="The endpoint path where error occurred") model_config = ConfigDict(json_schema_extra={ "example": { "detail": "Error description", "error_code": "ERROR_CODE", "timestamp": "2024-12-09T16:49:30.905765", "path": "/check-facts" } }) class RequestValidationError(BaseModel): loc: List[str] msg: str type: str class Publisher(BaseModel): name: str site: Optional[str] = Field(None, description="Publisher's website") @validator('site') def validate_site(cls, v): if v and not (v.startswith('http://') or v.startswith('https://')): return f"https://{v}" return v class ClaimReview(BaseModel): publisher: Publisher url: Optional[HttpUrl] = None title: Optional[str] = None reviewDate: Optional[str] = None textualRating: Optional[str] = None languageCode: str = Field(default="en-US") class Claim(BaseModel): text: str claimant: Optional[str] = None claimDate: Optional[str] = None claimReview: List[ClaimReview] class FactCheckResponse(BaseModel): query: str = Field(..., description="Original query that was fact-checked") total_claims_found: int = Field(..., ge=0) results: List[Claim] = Field(default_factory=list) summary: Dict[str, int] = Field(...) model_config = ConfigDict(json_schema_extra={ "example": { "query": "Example claim", "total_claims_found": 1, "results": [{ "text": "Example claim text", "claimant": "Source name", "claimReview": [{ "publisher": { "name": "Fact Checker", "site": "factchecker.com" }, "textualRating": "True" }] }], "summary": { "total_sources": 1, "fact_checking_sites_queried": 10 } } }) class SourceType(str, Enum): FACT_CHECKER = "fact_checker" NEWS_SITE = "news_site" class FactCheckSource(BaseModel): domain: str type: SourceType priority: int = Field(default=1, ge=1, le=10) model_config = ConfigDict(json_schema_extra={ "example": { "domain": "factcheck.org", "type": "fact_checker", "priority": 1 } }) class FactCheckRequest(BaseModel): content: str = Field( ..., min_length=10, max_length=1000, description="The claim to be fact-checked" ) language: str = Field(default="en-US", pattern="^[a-z]{2}-[A-Z]{2}$") max_results_per_source: int = Field(default=10, ge=1, le=50) @validator('content') def validate_content(cls, v): if not v.strip(): raise ValueError("Content cannot be empty or just whitespace") return v.strip()