{"record":{"id":"0b82ec13d178597c","repo":"unclecode/crawl4ai","slug":"crawlerrunconfig-must-be-provided-0b82ec","errorCode":null,"errorMessage":"CrawlerRunConfig must be provided","messagePattern":"CrawlerRunConfig must be provided","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"crawl4ai/deep_crawling/base_strategy.py:100","lineNumber":9356,"sourceCode":"    async def arun(\n        self,\n        start_url: str,\n        crawler: AsyncWebCrawler,\n        config: Optional[CrawlerRunConfig] = None,\n    ) -> RunManyReturn:\n        \"\"\"\n        Traverse the given URL using the specified crawler.\n        \n        Args:\n            start_url (str): The URL from which to start crawling.\n            crawler (AsyncWebCrawler): The crawler instance to use.\n            crawler_run_config (Optional[CrawlerRunConfig]): Crawler configuration.\n        \n        Returns:\n            Union[CrawlResultT, List[CrawlResultT], AsyncGenerator[CrawlResultT, None]]\n        \"\"\"\n        if config is None:\n            raise ValueError(\"CrawlerRunConfig must be provided\")\n\n        if config.stream:\n            return self._arun_stream(start_url, crawler, config)\n        else:\n            return await self._arun_batch(start_url, crawler, config)\n\n    def __call__(self, start_url: str, crawler: AsyncWebCrawler, config: CrawlerRunConfig):\n        return self.arun(start_url, crawler, config)\n\n    @abstractmethod\n    async def shutdown(self) -> None:\n        \"\"\"\n        Clean up resources used by the deep crawl strategy.\n        \"\"\"\n        pass\n\n    @abstractmethod\n    async def can_process_url(self, url: str, depth: int) -> bool:","sourceCodeStart":9338,"sourceCodeEnd":9374,"githubUrl":"https://github.com/unclecode/crawl4ai/blob/7e801521428ee12509994d39151006f64055ebe3/deploy/docker/c4ai-code-context.md#L9338-L9374","documentation":"Deep-crawl strategies (the traversal base class used by deep crawls) require a CrawlerRunConfig for every arun() call — it decides stream vs batch mode and carries per-crawl options. arun() accepts config as an Optional parameter but immediately raises ValueError when it is None.","triggerScenarios":"Calling strategy.arun(start_url, crawler) with no third argument, or explicitly passing config=None; building the strategy's own CrawlerRunConfig inside a subclass but forgetting to forward it to super().arun().","commonSituations":"New users assuming the crawler instance alone carries the run config; wrapper code with an optional config parameter that defaults to None and is passed through unchecked; upgrades where a previously defaulted config became mandatory.","solutions":["Construct a CrawlerRunConfig (at minimum CrawlerRunConfig()) and pass it as the third argument: await strategy.arun(start_url, crawler, run_config)","If your wrapper accepts an optional config, default it to CrawlerRunConfig() instead of None","Set config.stream=True only if you will consume the async generator it returns"],"exampleFix":"# before\nresults = await strategy.arun(start_url, crawler)\n# after\nfrom crawl4ai import CrawlerRunConfig\nresults = await strategy.arun(start_url, crawler, CrawlerRunConfig(cache_mode=\"bypass\", stream=False))\n","handlingStrategy":"validation","validationCode":"from crawl4ai import CrawlerRunConfig\n\ndef require_run_config(config):\n    if config is None:\n        return CrawlerRunConfig()\n    return config\n\nresults = await strategy.arun(start_url, crawler, require_run_config(config))","typeGuard":"from crawl4ai import CrawlerRunConfig\n\ndef is_run_config(obj) -> bool:\n    return isinstance(obj, CrawlerRunConfig) and obj is not None","tryCatchPattern":"try:\n    results = await strategy.arun(start_url, crawler, config)\nexcept ValueError as e:\n    if \"CrawlerRunConfig\" in str(e):\n        results = await strategy.arun(start_url, crawler, CrawlerRunConfig())\n    else:\n        raise","preventionTips":["Never call strategy.arun without an explicit CrawlerRunConfig","Default optional config parameters to CrawlerRunConfig(), not None","Decide stream vs batch up front: config.stream=True returns an async generator"],"tags":["crawl4ai","deep-crawl","config-required","validation"],"backgroundTag":null,"analyzedSha":"7e801521428ee12509994d39151006f64055ebe3","analyzedAt":"2026-08-14T20:46:20.673Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}