"""Base class for web classes.""" from abc import ABC, abstractmethod from modules.interfaces.interfaceChatModel import ActionDocument, ActionResult from pydantic import BaseModel, Field from typing import List # --- Web search --- # query -> list of URLs class WebSearchRequest(BaseModel): query: str max_results: int class WebSearchDocumentData(BaseModel): title: str url: str class WebSearchActionDocument(ActionDocument): documentData: WebSearchDocumentData class WebSearchActionResult(ActionResult): documents: List[WebSearchActionDocument] = Field(default_factory=list) class WebSearchBase(ABC): @abstractmethod async def search_urls(self, request: WebSearchRequest) -> WebSearchActionResult: ... # --- Web crawl --- # list of URLs -> list of extracted HTML content class WebCrawlRequest(BaseModel): urls: List[str] class WebCrawlDocumentData(BaseModel): url: str content: str class WebCrawlActionDocument(ActionDocument): documentData: WebCrawlDocumentData = Field( description="The data extracted from a single crawled URL" ) class WebCrawlActionResult(ActionResult): documents: List[WebCrawlActionDocument] = Field(default_factory=list) class WebCrawlBase(ABC): @abstractmethod async def crawl_urls(self, request: WebCrawlRequest) -> WebCrawlActionResult: ... # --- Web scrape --- # scrape -> list of extracted text; combines web search and crawl in one step class WebScrapeRequest(BaseModel): query: str max_results: int class WebScrapeDocumentData(BaseModel): url: str content: str class WebScrapeActionDocument(ActionDocument): documentData: WebScrapeDocumentData = Field( description="The data extracted from a single scraped URL" ) class WebScrapeActionResult(ActionResult): documents: List[WebScrapeActionDocument] = Field(default_factory=list) class WebScrapeBase(ABC): @abstractmethod async def scrape(self, request: WebScrapeRequest) -> WebScrapeActionResult: ...