11import asyncio
2+ from typing import TYPE_CHECKING
23
3- from crawl4ai import BrowserConfig , CrawlerRunConfig , CacheMode , AsyncWebCrawler
44from loguru import logger
55
66from flowllm .context .flow_context import FlowContext
99from flowllm .schema .tool_call import ToolCall
1010from flowllm .utils .web_utils import get_random_user_agent
1111
12+ if TYPE_CHECKING :
13+ from crawl4ai import BrowserConfig , CrawlerRunConfig , AsyncWebCrawler
14+
1215
1316@C .register_op (register_app = "FlowLLM" )
1417class Crawl4aiOp (BaseAsyncToolOp ):
@@ -24,14 +27,8 @@ def __init__(self,
2427 ** kwargs )
2528
2629 self .max_content_len : int = max_content_len
27-
28- self .browser_config = BrowserConfig (headless = True ,
29- java_script_enabled = True ,
30- user_agent = get_random_user_agent (),
31- viewport = {"width" : 1280 , "height" : 800 },
32- verbose = True )
33-
34- self .crawler_config = CrawlerRunConfig (cache_mode = CacheMode .BYPASS , verbose = True )
30+ self .browser_config = None
31+ self .crawler_config = None
3532
3633 def build_tool_call (self ) -> ToolCall :
3734 return ToolCall (** {
@@ -46,6 +43,9 @@ def build_tool_call(self) -> ToolCall:
4643 })
4744
4845 async def async_execute (self ):
46+ # Lazy import crawl4ai only when actually needed
47+ from crawl4ai import BrowserConfig , CrawlerRunConfig , CacheMode , AsyncWebCrawler
48+
4949 url : str = self .input_dict ["url" ]
5050
5151 if self .enable_cache :
@@ -54,6 +54,17 @@ async def async_execute(self):
5454 self .set_result (cached_result ["response_content" ])
5555 return
5656
57+ # Initialize configs lazily
58+ self .browser_config = BrowserConfig (
59+ headless = True ,
60+ java_script_enabled = True ,
61+ user_agent = get_random_user_agent (),
62+ viewport = {"width" : 1280 , "height" : 800 },
63+ verbose = True
64+ )
65+
66+ self .crawler_config = CrawlerRunConfig (cache_mode = CacheMode .BYPASS , verbose = True )
67+
5768 async with AsyncWebCrawler (config = self .browser_config ) as crawler :
5869 result = await crawler .arun (url = url , config = self .crawler_config )
5970 response_content = result .markdown [:self .max_content_len ]
0 commit comments