Source code for ralph.config._web_search_backend_spec
"""WebSearchBackendSpec model — backend configuration for built-in web search providers."""
from __future__ import annotations
from typing import Literal, Self
from pydantic import ConfigDict, model_validator
from ralph.pydantic_compat import RalphBaseModel
[docs]
class WebSearchBackendSpec(RalphBaseModel):
"""Backend configuration for built-in web search providers."""
model_config = ConfigDict(frozen=True)
backend: Literal["ddgs", "searxng", "tavily", "brave", "exa"]
url: str | None = None
api_key: str | None = None
api_key_env: str | None = None
@model_validator(mode="after")
def validate_secret_shape(self) -> Self:
if self.backend == "searxng" and not self.url:
raise ValueError("searxng backend requires url")
if self.backend in {"tavily", "brave", "exa"}:
has_api_key = self.api_key is not None
has_api_key_env = self.api_key_env is not None
if has_api_key == has_api_key_env:
raise ValueError("api_key xor api_key_env is required for keyed backends")
return self
__all__ = ["WebSearchBackendSpec"]