"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations from .searchcontextsizeenum import SearchContextSizeEnum from .websearchdomainfilter import WebSearchDomainFilter, WebSearchDomainFilterTypedDict from .websearchengineenum import WebSearchEngineEnum from .websearchuserlocation import WebSearchUserLocation, WebSearchUserLocationTypedDict from openrouter.types import ( BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL, ) from openrouter.utils import validate_open_enum from pydantic import model_serializer from pydantic.functional_validators import PlainValidator from typing import Literal, Optional from typing_extensions import Annotated, NotRequired, TypedDict LegacyWebSearchServerToolType = Literal["web_search",] class LegacyWebSearchServerToolTypedDict(TypedDict): r"""Web search tool configuration""" type: LegacyWebSearchServerToolType engine: NotRequired[WebSearchEngineEnum] r"""Which search engine to use. \"auto\" (default) uses native if the provider supports it, otherwise Exa. \"native\" forces the provider's built-in search. \"exa\" forces the Exa search API. \"firecrawl\" uses Firecrawl (requires BYOK). \"parallel\" uses the Parallel search API. \"perplexity\" uses the Perplexity Search API (raw ranked results).""" filters: NotRequired[Nullable[WebSearchDomainFilterTypedDict]] max_results: NotRequired[int] r"""Maximum number of search results to return per search call. Defaults to 5. Applies to Exa, Firecrawl, Parallel, and Perplexity engines; ignored with native provider search. Perplexity supports a maximum of 20; values above 20 are clamped.""" search_context_size: NotRequired[SearchContextSizeEnum] r"""Size of the search context for web search tools""" user_location: NotRequired[Nullable[WebSearchUserLocationTypedDict]] r"""User location information for web search""" class LegacyWebSearchServerTool(BaseModel): r"""Web search tool configuration""" type: LegacyWebSearchServerToolType engine: Annotated[ Optional[WebSearchEngineEnum], PlainValidator(validate_open_enum(False)) ] = None r"""Which search engine to use. \"auto\" (default) uses native if the provider supports it, otherwise Exa. \"native\" forces the provider's built-in search. \"exa\" forces the Exa search API. \"firecrawl\" uses Firecrawl (requires BYOK). \"parallel\" uses the Parallel search API. \"perplexity\" uses the Perplexity Search API (raw ranked results).""" filters: OptionalNullable[WebSearchDomainFilter] = UNSET max_results: Optional[int] = None r"""Maximum number of search results to return per search call. Defaults to 5. Applies to Exa, Firecrawl, Parallel, and Perplexity engines; ignored with native provider search. Perplexity supports a maximum of 20; values above 20 are clamped.""" search_context_size: Annotated[ Optional[SearchContextSizeEnum], PlainValidator(validate_open_enum(False)) ] = None r"""Size of the search context for web search tools""" user_location: OptionalNullable[WebSearchUserLocation] = UNSET r"""User location information for web search""" @model_serializer(mode="wrap") def serialize_model(self, handler): optional_fields = [ "engine", "filters", "max_results", "search_context_size", "user_location", ] nullable_fields = ["filters", "user_location"] null_default_fields = [] serialized = handler(self) m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) serialized.pop(k, None) optional_nullable = k in optional_fields and k in nullable_fields is_set = ( self.__pydantic_fields_set__.intersection({n}) or k in null_default_fields ) # pylint: disable=no-member if val is not None and val != UNSET_SENTINEL: m[k] = val elif val != UNSET_SENTINEL and ( not k in optional_fields or (optional_nullable and is_set) ): m[k] = val return m