From 07bf888509b22360feb406791b8fb1e02a6843a8 Mon Sep 17 00:00:00 2001 From: SyedaAnshrahGillani Date: Thu, 14 Aug 2025 13:26:41 +0500 Subject: [PATCH 1/2] Feat: Add timeout to Tavily search --- src/open_deep_research/utils.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/open_deep_research/utils.py b/src/open_deep_research/utils.py index 4828b8888..3cdd5a7db 100644 --- a/src/open_deep_research/utils.py +++ b/src/open_deep_research/utils.py @@ -169,8 +169,12 @@ async def tavily_search_async( ] # Execute all search queries in parallel and return results - search_results = await asyncio.gather(*search_tasks) - return search_results + try: + search_results = await asyncio.wait_for(asyncio.gather(*search_tasks), timeout=60.0) + return search_results + except asyncio.TimeoutError: + logging.warning("Tavily search timed out after 60 seconds") + return [] async def summarize_webpage(model: BaseChatModel, webpage_content: str) -> str: """Summarize webpage content using AI model with timeout protection. From 529749d026a75aa1614f36ffd670a43ca073825c Mon Sep 17 00:00:00 2001 From: SyedaAnshrahGillani Date: Thu, 14 Aug 2025 13:31:12 +0500 Subject: [PATCH 2/2] Feat: Make Tavily search timeout configurable --- src/open_deep_research/configuration.py | 12 ++++++++++++ src/open_deep_research/utils.py | 5 +++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/open_deep_research/configuration.py b/src/open_deep_research/configuration.py index 1c5bac9e9..e9004ee91 100644 --- a/src/open_deep_research/configuration.py +++ b/src/open_deep_research/configuration.py @@ -117,6 +117,18 @@ class Configuration(BaseModel): } } ) + tavily_timeout: int = Field( + default=60, + metadata={ + "x_oap_ui_config": { + "type": "number", + "default": 60, + "min": 1, + "max": 300, + "description": "Timeout for Tavily search in seconds." + } + } + ) # Model Configuration summarization_model: str = Field( default="openai:gpt-4.1-mini", diff --git a/src/open_deep_research/utils.py b/src/open_deep_research/utils.py index 3cdd5a7db..7a83a5bcc 100644 --- a/src/open_deep_research/utils.py +++ b/src/open_deep_research/utils.py @@ -169,11 +169,12 @@ async def tavily_search_async( ] # Execute all search queries in parallel and return results + configurable = Configuration.from_runnable_config(config) try: - search_results = await asyncio.wait_for(asyncio.gather(*search_tasks), timeout=60.0) + search_results = await asyncio.wait_for(asyncio.gather(*search_tasks), timeout=configurable.tavily_timeout) return search_results except asyncio.TimeoutError: - logging.warning("Tavily search timed out after 60 seconds") + logging.warning(f"Tavily search timed out after {configurable.tavily_timeout} seconds") return [] async def summarize_webpage(model: BaseChatModel, webpage_content: str) -> str: