from pydantic import BaseModel, Field from typing import Optional, List, Dict from enum import StrEnum class Status(StrEnum): RELEVANT = "RELEVANT" IRRELEVANT = "IRRELEVANT" FAILED = "FAILED" class LinkOverview(BaseModel): summary: str = Field(..., description="A brief summary of the link's content, maximum 1 paragraph.") SLA: Optional[str] = Field(None, description="Service Level Agreement in days of visa, if mentioned.") required_docs: Optional[str] = Field(None, description="List of required documents as text, if mentioned.") price: Optional[str] = Field(None, description="Price or fee information, if mentioned.") details: Optional[str] = Field(None, description="Additional details about the link's content. 3-5 paragraphs max.") status: Status = Field(Status.FAILED, description="Overall status of the analysis.") class LinkNode(BaseModel): href: str = Field(..., description="The URL of the link") overview: LinkOverview = Field(..., description="Summary and details about the link's content") parent: Optional[str] = Field(None, description="The parent link, where this link was found (source).") child: List[str] = Field(..., description="List of links found on this page") depth: int = Field(..., description="Depth level in the link hierarchy (0=root, 1=child of root, etc.)") raw_text: Optional[str] = None # Field to store scraped text before analysis