File size: 4,405 Bytes
55086fb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
from pydantic import BaseModel, Field, HttpUrl
from typing import Optional, List, Dict, Any, Literal


class AnalysisRequest(BaseModel):
    url: HttpUrl = Field(..., description="The URL of the webpage to analyze.")
    selection: Optional[str] = Field(
        None, 
        description="Optional specific text selection from the webpage."
        )
    force_refresh: bool = Field(
        False, 
        description="Whether to force refresh the cached analysis."
        )
    

class IdentityData(BaseModel):
    verified: bool = Field(..., description="Whether the source is verified.")
    score: float = Field(..., description="Credibility score of the source (0.0 to 1.0).")
    
class VerdictData(BaseModel):
    status: str = Field(..., description="Verdict status (e.g., true, false, mixed).")
    claims_counted: int = Field(0, description="Number of claims evaluated.")
    claims_verified: int = Field(0, description="Number of claims verified as true.")
    claims_sourced: int = Field(0, description="Number of claims with sources provided.")
    
class AnalysisResponse(BaseModel):
    status: str = Field(..., description="Status of the analysis request.")
    verdict: VerdictData = Field(..., description="Detailed verdict data.")
    identity: IdentityData = Field(..., description="Identity verification data of the source.")
    details: Dict[str, Any] = Field(..., description="Detailed agent reports and findings.")
    
    
class Provenance(BaseModel):
    source: Literal["selection", "extracted", "user_provided"] = Field(..., description="Source of the claim.")
    url: Optional[HttpUrl] = Field(None, description="URL from which the claim was extracted, if applicable.")
    context: Optional[str] = Field(None, description="Contextual information about the claim.")
    
class Claim(BaseModel):
    claim_id: str
    text: str = Field(..., description="The atomic factual claim statement")
    normalized_text: Optional[str] = Field(None, description="Normalized version of the claim text.")
    provenance: Provenance = Field(..., description="Provenance information of the claim.")
    confidence: Optional[float] = Field(None, description="Confidence score of claim extraction (0.0 to 1.0).")
    claim_type: Literal["factual", "opinion", "mixed", "ambiguous"] = Field(..., description="Type of the claim.")
    
class CredibilityVerdict(BaseModel):
    trust_level: str = Field(..., description="Overall trust level of the source (e.g., high, medium, low).")
    score: float = Field(..., description="Credibility score of the source (0-100).")
    red_flags: List[str] = Field(..., description="List of identified red flags affecting credibility.")
    summary: str = Field(..., description="Summary of the credibility assessment.")
    source_used: list[str] = Field(..., description="List of sources used in the credibility assessment.")
    

class FactCheckVerdict(BaseModel):
    """Result for a single claim verification"""
    claim: str = Field(..., description="The factual claim being verified")
    verdict: str = Field(..., description="verified | debunked | mixture | unverified")
    textual_rating: Optional[str] = Field(None, description="Textual rating from the fact-checker")
    corroboration_url: Optional[str] = Field(None, description="URL to the fact-check source")
    fact_checker: Optional[str] = Field(None, description="Name of the fact-checking organization")
    checked_date: Optional[str] = None


class VerifyResponse(BaseModel):
    """Response model for /verify endpoint"""

    status: str  # "success" or "error"
    mode: str  # "granular" or "full"
    data: dict
    
# === Final Output Schema ===
class FinalReport(BaseModel):
    url: str = Field(..., description="Original URL")
    credibility: Dict = Field(..., description="Source credibility assessment")
    claims: List[str] = Field(..., description="Extracted factual claims")
    fact_checks: List[Dict] = Field(..., description="Fact-check verdicts per claim")
    search_insights: List[Dict] = Field(default=[], description="Tavily search results with snippets for enrichment")
    overall_verdict: str = Field(..., description="Final truth rating: verified | debunked | mixture | unverified")
    summary: str = Field(..., description="One-paragraph overall summary")
    sources: List[str] = Field(default=[], description="Key corroborating URLs")