{"record":{"id":"ea85700975621c46","repo":"zylon-ai/private-gpt","slug":"unsupported-web-search-provider-self-settings-w","errorCode":null,"errorMessage":"Unsupported web search provider: {self._settings.web_search.provider}","messagePattern":"Unsupported web search provider: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"private_gpt/components/web/web_search/web_search_service.py","lineNumber":101,"sourceCode":"\n    def _initialize_providers(self) -> None:\n        if self._settings.web_search.provider == \"brave\":\n            from private_gpt.components.web.web_search.providers.brave import (\n                BraveSearchProvider,\n            )\n\n            self._provider = BraveSearchProvider(self._settings)\n        elif self._settings.web_search.provider == \"mock\":\n            from private_gpt.components.web.web_search.providers.mock import (\n                MockSearchProvider,\n            )\n\n            self._provider = MockSearchProvider()\n        else:\n            logger.error(\n                f\"Unsupported web search provider: {self._settings.web_search.provider}\"\n            )\n            raise ValueError(\n                f\"Unsupported web search provider: {self._settings.web_search.provider}\"\n            )\n\n        if self._settings.web_search.cached:\n            from private_gpt.components.web.web_search.providers.cached import (\n                CachedProvider,\n            )\n\n            self._provider = CachedProvider(self._provider)\n\n    def _initialize_processor(self) -> None:\n        if self._settings.web_search.processor == \"simple_text\":\n            from private_gpt.components.web.web_search.processors.simple_text import (\n                SimpleTextProcessor,\n            )\n\n            self._processor = SimpleTextProcessor(self._settings)\n","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/zylon-ai/private-gpt/blob/4a030776a31a901ad80b1bf4d7faa2c1a367efbb/private_gpt/components/web/web_search/web_search_service.py#L83-L119","documentation":"ValueError raised in WebSearchService._initialize_providers when the configured provider string matches neither 'brave' nor 'mock'. In normal operation the pydantic Literal['brave','mock'] on WebSearchSettings.provider rejects other values at config load, so this branch fires when settings are constructed/bypassed without validation (programmatic Settings mutation, hand-built Settings objects in tests, or a version skew between config schema and code).","triggerScenarios":"Settings object built or mutated in code (settings.web_search.provider = 'serper') and passed to a manually constructed WebSearchService; older config files from versions where other provider names existed; test fixtures instantiating WebSearchSettings with validate_assignment off.","commonSituations":"Extending private-gpt with a custom search provider without patching the Literal and the branch; YAML from an older/newer release carrying a provider name this build does not know.","solutions":["Set web_search.provider to 'brave' (or 'mock' for tests) — the only supported values in this build.","If you need a custom provider, register it in both the WebSearchSettings Literal and _initialize_providers, then rebuild.","Construct Settings through the normal loader so pydantic validation catches bad names at startup, not at first search."],"exampleFix":"# settings.yaml\nweb_search:\n  provider: brave   # was e.g. 'serper' (unsupported in this build)","handlingStrategy":"type-guard","validationCode":"SUPPORTED_PROVIDERS = {'brave', 'mock'}\nif settings.web_search.provider not in SUPPORTED_PROVIDERS:\n    raise ValueError(\n        f'provider must be one of {sorted(SUPPORTED_PROVIDERS)}, '\n        f'got {settings.web_search.provider!r}'\n    )","typeGuard":"from typing import Literal\n\nWebSearchProviderName = Literal['brave', 'mock']\n\ndef is_supported_provider(name: str) -> bool:\n    return name in ('brave', 'mock')","tryCatchPattern":"try:\n    svc = WebSearchService(settings, scraper, llm, summary_builder)\nexcept ValueError as e:\n    if 'Unsupported web search provider' in str(e):\n        settings.web_search.provider = 'brave'  # safe default\n        svc = WebSearchService(settings, scraper, llm, summary_builder)\n    else:\n        raise","preventionTips":["Always build Settings via the pydantic loader so Literal validation runs.","Extend the Literal when adding providers, keep the branch list in sync.","Fail config validation at boot, not at first search."],"tags":["configuration","web-search","provider","validation"],"backgroundTag":null,"analyzedSha":"4a030776a31a901ad80b1bf4d7faa2c1a367efbb","analyzedAt":"2026-08-15T03:51:26.951Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}