{"record":{"id":"9f7aedd1948db962","repo":"unclecode/crawl4ai","slug":"link-preview-config-must-be-linkpreviewconfig-obje","errorCode":null,"errorMessage":"link_preview_config must be LinkPreviewConfig object or dict","messagePattern":"link_preview_config must be LinkPreviewConfig object or dict","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"crawl4ai/async_configs.py","lineNumber":1880,"sourceCode":"            )\n\n        # Set default chunking strategy if None\n        if self.chunking_strategy is None:\n            self.chunking_strategy = RegexChunking()\n\n        # Deep Crawl Parameters\n        self.deep_crawl_strategy = deep_crawl_strategy\n        \n        # Link Extraction Parameters\n        if link_preview_config is None:\n            self.link_preview_config = None\n        elif isinstance(link_preview_config, LinkPreviewConfig):\n            self.link_preview_config = link_preview_config\n        elif isinstance(link_preview_config, dict):\n            # Convert dict to config object for backward compatibility\n            self.link_preview_config = LinkPreviewConfig.from_dict(link_preview_config)\n        else:\n            raise ValueError(\"link_preview_config must be LinkPreviewConfig object or dict\")\n        \n        # Virtual Scroll Parameters\n        if virtual_scroll_config is None:\n            self.virtual_scroll_config = None\n        elif isinstance(virtual_scroll_config, VirtualScrollConfig):\n            self.virtual_scroll_config = virtual_scroll_config\n        elif isinstance(virtual_scroll_config, dict):\n            # Convert dict to config object for backward compatibility\n            self.virtual_scroll_config = VirtualScrollConfig.from_dict(virtual_scroll_config)\n        else:\n            raise ValueError(\"virtual_scroll_config must be VirtualScrollConfig object or dict\")\n        \n        # URL Matching Parameters\n        self.url_matcher = url_matcher\n        self.match_mode = match_mode\n        \n        # Experimental Parameters\n        self.experimental = experimental or {}","sourceCodeStart":1862,"sourceCodeEnd":1898,"githubUrl":"https://github.com/unclecode/crawl4ai/blob/7e801521428ee12509994d39151006f64055ebe3/crawl4ai/async_configs.py#L1862-L1898","documentation":"CrawlerRunConfig accepts link_preview_config as None, a LinkPreviewConfig instance, or a plain dict (which it converts via LinkPreviewConfig.from_dict for backward compatibility). Any other type — string, tuple, list — raises this error.","triggerScenarios":"Passing link_preview_config=\"enabled\", a JSON string, a list of settings, or a config object from a different library/version.","commonSituations":"JSON config where the value parses as a string instead of an object; mixing crawl4ai versions where LinkPreviewConfig was imported from a relocated module.","solutions":["Pass a dict of LinkPreviewConfig fields: link_preview_config={\"include_external\": True, \"max_links\": 10}","Or construct the object: LinkPreviewConfig(include_external=True)","If the value arrives as a JSON string, json.loads it first"],"exampleFix":"// before\ncfg = CrawlerRunConfig(link_preview_config='{\"max_links\": 10}')\n// after\nimport json\ncfg = CrawlerRunConfig(link_preview_config=json.loads('{\"max_links\": 10}'))","handlingStrategy":"type-guard","validationCode":"from crawl4ai.async_configs import LinkPreviewConfig\n\nif isinstance(link_preview_config, str):\n    import json\n    link_preview_config = json.loads(link_preview_config)\nassert link_preview_config is None or isinstance(link_preview_config, (LinkPreviewConfig, dict))","typeGuard":"def is_link_preview_config(v) -> bool:\n    return v is None or isinstance(v, (LinkPreviewConfig, dict))","tryCatchPattern":null,"preventionTips":["json.loads stringified config values before passing","Keep nested config objects as dicts in JSON pipelines"],"tags":["validation","link-preview","configuration","type-error"],"backgroundTag":null,"analyzedSha":"7e801521428ee12509994d39151006f64055ebe3","analyzedAt":"2026-08-14T20:46:20.673Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}