diff --git a/tests/tools/test_browser_cloud_provider_cache.py b/tests/tools/test_browser_cloud_provider_cache.py index d0ea09eab5e..c41dd1be1d1 100644 --- a/tests/tools/test_browser_cloud_provider_cache.py +++ b/tests/tools/test_browser_cloud_provider_cache.py @@ -10,7 +10,7 @@ All other ``None`` outcomes (no credentials yet, config read error, explicit provider instantiation failure) leave the cache unset so the next call retries. """ import logging -from unittest.mock import Mock, patch +from unittest.mock import Mock import pytest diff --git a/tools/browser_tool.py b/tools/browser_tool.py index 0a48fc8977a..084c4d3d31e 100644 --- a/tools/browser_tool.py +++ b/tools/browser_tool.py @@ -447,19 +447,24 @@ def _get_cloud_provider() -> Optional[CloudBrowserProvider]: ) return None except Exception as e: + # Config file may be temporarily unreadable; still try auto-detect so + # env-based / managed-gateway credentials can resolve. Don't pin cache. logger.debug("Could not read cloud_provider from config: %s", e) - return None if resolved is None: # Prefer Browser Use (managed Nous gateway or direct API key), # fall back to Browserbase (direct credentials only). - fallback_provider = BrowserUseProvider() - if fallback_provider.is_configured(): - resolved = fallback_provider - else: - fallback_provider = BrowserbaseProvider() + try: + fallback_provider = BrowserUseProvider() if fallback_provider.is_configured(): resolved = fallback_provider + else: + fallback_provider = BrowserbaseProvider() + if fallback_provider.is_configured(): + resolved = fallback_provider + except Exception: # pragma: no cover - defensive: never poison cache + logger.debug("Cloud provider auto-detect failed", exc_info=True) + return None if resolved is None: # Transient None — credentials may self-heal. Don't poison the cache.