{"record":{"id":"7080ce153ade2ba7","repo":"ScrapeGraphAI/Scrapegraph-ai","slug":"invalid-search-configuration-str-e","errorCode":null,"errorMessage":"Invalid search configuration: {str(e)}","messagePattern":"Invalid search configuration: (.+?)","errorType":"exception","errorClass":"SearchConfigError","httpStatus":null,"severity":"error","filePath":"scrapegraphai/utils/research_web.py","lineNumber":243,"sourceCode":"\n        elif config.search_engine == \"searxng\":\n            results = _search_searxng(\n                config.query, config.max_results, config.port, config.timeout\n            )\n\n        elif config.search_engine == \"serper\":\n            results = _search_serper(\n                config.query, config.max_results, config.serper_api_key, config.timeout\n            )\n\n        return filter_pdf_links(results)\n\n    except requests.Timeout:\n        raise TimeoutError(f\"Search request timed out after {timeout} seconds\")\n    except requests.RequestException as e:\n        raise SearchRequestError(f\"Search request failed: {str(e)}\")\n    except ValueError as e:\n        raise SearchConfigError(f\"Invalid search configuration: {str(e)}\")\n\n\ndef _search_duckduckgo(\n    query: str, max_results: int, proxy: Optional[str] = None\n) -> List[str]:\n    \"\"\"\n    Helper function for DuckDuckGo search using the ``ddgs`` package.\n\n    The ``duckduckgo-search`` package was renamed to ``ddgs``; recent\n    ``langchain-community`` releases import ``from ddgs import DDGS``, which\n    silently broke the previous langchain-based implementation. This calls\n    ``ddgs`` directly so results no longer depend on parsing a formatted string.\n\n    Args:\n        query (str): Search query\n        max_results (int): Maximum number of results to return\n        proxy (str, optional): Proxy configuration\n","sourceCodeStart":225,"sourceCodeEnd":261,"githubUrl":"https://github.com/ScrapeGraphAI/Scrapegraph-ai/blob/532dfffbf6ee823a6c9cf8cfedc24a93bf026780/scrapegraphai/utils/research_web.py#L225-L261","documentation":"Raised by search_on_web when engine-specific validation fails with ValueError before/during the search, wrapped into SearchConfigError. It signals a malformed configuration rather than a network problem.","triggerScenarios":"Calling search_on_web with an invalid or missing search engine name, a bad max_results value, or a malformed query that a backend validates with ValueError. The test_invalid_search_engine case shows an unknown engine string triggers it.","commonSituations":"Typos in the engine name ('googel' vs 'google'), passing an engine not supported by the installed version, wrong types for max_results/timeout.","solutions":["Check the engine string against supported engines (google, bing, duckduckgo, searxng, serper)","Validate max_results and timeout are positive ints before calling","Upgrade scrapegraphai if the engine was added in a newer release"],"exampleFix":"// before\nconfig = SearchConfig(query=\"x\", search_engine=\"googel\")\n// after\nconfig = SearchConfig(query=\"x\", search_engine=\"google\")","handlingStrategy":"validation","validationCode":"SUPPORTED = {\"google\", \"bing\", \"duckduckgo\", \"searxng\", \"serper\"}\nassert config.search_engine in SUPPORTED, f\"unknown engine {config.search_engine}\"\nassert isinstance(config.max_results, int) and config.max_results > 0","typeGuard":"def is_valid_engine(name: str) -> bool:\n    return name in {\"google\", \"bing\", \"duckduckgo\", \"searxng\", \"serper\"}","tryCatchPattern":"try:\n    results = search_on_web(config)\nexcept SearchConfigError as e:\n    raise ValueError(f\"fix search config: {e}\") from e","preventionTips":["Validate the engine string against the docs before calling","Keep engine names lowercase and spelled exactly","Fail fast on config errors instead of retrying"],"tags":["config","validation","web-search"],"backgroundTag":"invalid-config-value","analyzedSha":"532dfffbf6ee823a6c9cf8cfedc24a93bf026780","analyzedAt":"2026-08-28T15:19:38.821Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}