{"record":{"id":"ee4442fd9789d30e","repo":"stanford-oval/storm","slug":"you-must-supply-a-serper-search-api-key-param-or-s","errorCode":null,"errorMessage":"You must supply a serper_search_api_key param or set environment variable SERPER_API_KEY","messagePattern":"You must supply a serper_search_api_key param or set environment variable SERPER_API_KEY","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"knowledge_storm/rm.py","lineNumber":454,"sourceCode":"        \"\"\"\n        super().__init__(k=k)\n        self.usage = 0\n        self.query_params = None\n        self.ENABLE_EXTRA_SNIPPET_EXTRACTION = ENABLE_EXTRA_SNIPPET_EXTRACTION\n        self.webpage_helper = WebPageHelper(\n            min_char_count=min_char_count,\n            snippet_chunk_size=snippet_chunk_size,\n            max_thread_num=webpage_helper_max_threads,\n        )\n\n        if query_params is None:\n            self.query_params = {\"num\": k, \"autocorrect\": True, \"page\": 1}\n        else:\n            self.query_params = query_params\n            self.query_params.update({\"num\": k})\n        self.serper_search_api_key = serper_search_api_key\n        if not self.serper_search_api_key and not os.environ.get(\"SERPER_API_KEY\"):\n            raise RuntimeError(\n                \"You must supply a serper_search_api_key param or set environment variable SERPER_API_KEY\"\n            )\n\n        elif self.serper_search_api_key:\n            self.serper_search_api_key = serper_search_api_key\n\n        else:\n            self.serper_search_api_key = os.environ[\"SERPER_API_KEY\"]\n\n        self.base_url = \"https://google.serper.dev\"\n\n    def serper_runner(self, query_params):\n        self.search_url = f\"{self.base_url}/search\"\n\n        headers = {\n            \"X-API-KEY\": self.serper_search_api_key,\n            \"Content-Type\": \"application/json\",\n        }","sourceCodeStart":436,"sourceCodeEnd":472,"githubUrl":"https://github.com/stanford-oval/storm/blob/fb951af7744dab086e34962e9bc6fe878e145f83/knowledge_storm/rm.py#L436-L472","documentation":"The SerperRM module of knowledge-storm requires a serper.dev API key, accepted either as the serper_search_api_key constructor argument or the SERPER_API_KEY environment variable; lacking both raises RuntimeError at construction. Serper.dev is a paid Google-Search-Results API commonly used as STORM's retrieval source.","triggerScenarios":"Constructing SerperRM(...) with no key while SERPER_API_KEY is unset; passing serper_search_api_key='' or None and relying on an env var that was never exported (e.g. .env not loaded in the shell/CI).","commonSituations":"New serper.dev account key never exported; CI pipeline missing the SERPER_API_KEY secret; using python-dotenv but forgetting load_dotenv() before constructing SerperRM; key passed to a different parameter name.","solutions":["Get a key at serper.dev and export it: export SERPER_API_KEY=your-key","Or pass it directly: SerperRM(serper_search_api_key='your-key', k=10)","Call load_dotenv() before construction if the key lives in .env","Add SERPER_API_KEY to your CI secret store"],"exampleFix":"// before\nrm = SerperRM(k=3)  # RuntimeError: You must supply a serper_search_api_key ...\n// after\nimport os\nfrom dotenv import load_dotenv\nload_dotenv()\nrm = SerperRM(serper_search_api_key=os.environ['SERPER_API_KEY'], k=3)","handlingStrategy":"validation","validationCode":"import os\nfrom dotenv import load_dotenv\nload_dotenv()\nif not (os.getenv('SERPER_API_KEY')):\n    raise SystemExit('Set SERPER_API_KEY (https://serper.dev) or pass serper_search_api_key=')\nrm = SerperRM(serper_search_api_key=os.environ['SERPER_API_KEY'], k=3)","typeGuard":"def has_serper_key(key: str | None) -> bool:\n    import os\n    return bool(key or os.getenv('SERPER_API_KEY'))","tryCatchPattern":"try:\n    rm = SerperRM(k=3)\nexcept RuntimeError as e:\n    if 'serper_search_api_key' in str(e):\n        raise SystemExit('Missing SERPER_API_KEY — get one at serper.dev and export it')\n    raise","preventionTips":["Call load_dotenv() as the first line of your entrypoint\nStore SERPER_API_KEY in CI/secret manager and fail fast at startup","Prefer the env var over hardcoding the key in source"],"tags":["python","serper","web-search","authentication","missing-env-var"],"backgroundTag":"missing-api-key","analyzedSha":"fb951af7744dab086e34962e9bc6fe878e145f83","analyzedAt":"2026-08-28T11:56:54.780Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}