109 lines
No EOL
3.3 KiB
Python
109 lines
No EOL
3.3 KiB
Python
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() |