From 017b7f1ca04d5be5397a9479eebd266d0b151741 Mon Sep 17 00:00:00 2001 From: Christopher Gondek Date: Mon, 1 Sep 2025 16:06:29 +0200 Subject: [PATCH] chore: type checking; input validation for web interface --- modules/interfaces/interface_web_model.py | 24 ++++++++++----------- modules/interfaces/interface_web_objects.py | 12 +++++++++-- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/modules/interfaces/interface_web_model.py b/modules/interfaces/interface_web_model.py index 86f19e08..bb4a82e0 100644 --- a/modules/interfaces/interface_web_model.py +++ b/modules/interfaces/interface_web_model.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from modules.interfaces.interfaceChatModel import ActionDocument, ActionResult -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, HttpUrl from typing import List @@ -12,21 +12,21 @@ from typing import List class WebSearchRequest(BaseModel): - query: str - max_results: int + query: str = Field(min_length=1, max_length=400) + max_results: int = Field(ge=1, le=20) class WebSearchResultItem(BaseModel): """Individual search result""" title: str - url: str + url: HttpUrl class WebSearchDocumentData(BaseModel): """Complete search results document""" - query: str + query: str = Field(min_length=1, max_length=400) results: List[WebSearchResultItem] total_count: int @@ -50,20 +50,20 @@ class WebSearchBase(ABC): class WebCrawlRequest(BaseModel): - urls: List[str] + urls: List[HttpUrl] class WebCrawlResultItem(BaseModel): """Individual crawl result""" - url: str + url: HttpUrl content: str class WebCrawlDocumentData(BaseModel): """Complete crawl results document""" - urls: List[str] + urls: List[HttpUrl] results: List[WebCrawlResultItem] total_count: int @@ -89,21 +89,21 @@ class WebCrawlBase(ABC): class WebScrapeRequest(BaseModel): - query: str - max_results: int + query: str = Field(min_length=1, max_length=400) + max_results: int = Field(ge=1, le=20) class WebScrapeResultItem(BaseModel): """Individual scrape result""" - url: str + url: HttpUrl content: str class WebScrapeDocumentData(BaseModel): """Complete scrape results document""" - query: str + query: str = Field(min_length=1, max_length=400) results: List[WebScrapeResultItem] total_count: int diff --git a/modules/interfaces/interface_web_objects.py b/modules/interfaces/interface_web_objects.py index 0ea43bd7..f348f0bd 100644 --- a/modules/interfaces/interface_web_objects.py +++ b/modules/interfaces/interface_web_objects.py @@ -1,3 +1,4 @@ +from typing import Optional from modules.interfaces.interface_web_model import ( WebCrawlActionResult, WebSearchActionResult, @@ -11,9 +12,16 @@ from dataclasses import dataclass from modules.connectors.connector_tavily import ConnectorTavily -@dataclass +@dataclass(slots=True) class WebInterface: - connector_tavily: ConnectorTavily = None + connector_tavily: ConnectorTavily + + def __post_init__(self) -> None: + if self.connector_tavily is None: + raise TypeError( + "connector_tavily must be provided. " + "Use `await WebInterface.create()` or pass a ConnectorTavily." + ) @classmethod async def create(cls) -> "WebInterface":