Source code for ralph.mcp.websearch.secrets

"""Secret resolution helpers for web-search backends."""

from __future__ import annotations

import os
from collections.abc import Callable

from .backends.base import WebSearchError

type EnvGetter = Callable[[str], str | None]


[docs] def resolve_secret( api_key: str | None, api_key_env: str | None, *, getenv: EnvGetter = os.getenv, ) -> str: """Resolve a backend secret from either an inline value or an env var name.""" normalized_key = _normalize_optional_string(api_key) normalized_env = _normalize_optional_string(api_key_env) provided = [value is not None for value in (normalized_key, normalized_env)] if sum(provided) != 1: raise ValueError("configure exactly one of 'api_key' or 'api_key_env'") if normalized_key is not None: return normalized_key if normalized_env is None: raise ValueError("configure exactly one of 'api_key' or 'api_key_env'") resolved = getenv(normalized_env) if not resolved: raise WebSearchError(f"environment variable '{normalized_env}' is not set") return resolved
def _normalize_optional_string(value: str | None) -> str | None: if value is None: return None normalized = value.strip() return normalized or None __all__ = ["resolve_secret"]