From 0b5d5ffcc6871e54356d41c1f49d1a5924175c40 Mon Sep 17 00:00:00 2001 From: MagMueller Date: Wed, 26 Aug 2026 21:37:24 -0700 Subject: [PATCH] fix(tools): use Browser Use Cloud V4 Signed-off-by: MagMueller --- packages/tools/browser_providers.py | 4 +- tests/unit/tools/test_browser_providers.py | 53 ++++++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 tests/unit/tools/test_browser_providers.py diff --git a/packages/tools/browser_providers.py b/packages/tools/browser_providers.py index f7da9d5..105a471 100644 --- a/packages/tools/browser_providers.py +++ b/packages/tools/browser_providers.py @@ -43,7 +43,7 @@ def create_session(self, task_id: str) -> CloudBrowserSession: api_key = os.environ.get("BROWSER_USE_API_KEY", "") response = _http_json( "POST", - os.environ.get("BROWSER_USE_API_URL", "https://api.browser-use.com/api/v3").rstrip("/") + "/browsers", + os.environ.get("BROWSER_USE_API_URL", "https://api.browser-use.com/api/v4").rstrip("/") + "/browsers", headers={"X-Browser-Use-API-Key": api_key, "Content-Type": "application/json"}, payload={"timeout": int(os.environ.get("BROWSER_USE_TIMEOUT_MINUTES", "5"))}, ) @@ -62,7 +62,7 @@ def close_session(self, session_id: str) -> None: api_key = os.environ.get("BROWSER_USE_API_KEY", "") _http_json( "PATCH", - os.environ.get("BROWSER_USE_API_URL", "https://api.browser-use.com/api/v3").rstrip() + os.environ.get("BROWSER_USE_API_URL", "https://api.browser-use.com/api/v4").rstrip() + f"/browsers/{session_id}", headers={"X-Browser-Use-API-Key": api_key, "Content-Type": "application/json"}, payload={"action": "stop"}, diff --git a/tests/unit/tools/test_browser_providers.py b/tests/unit/tools/test_browser_providers.py new file mode 100644 index 0000000..ae779f8 --- /dev/null +++ b/tests/unit/tools/test_browser_providers.py @@ -0,0 +1,53 @@ +from __future__ import annotations + +import os +import unittest +from unittest import mock + +from packages.tools import browser_providers as browser_providers_module +from packages.tools.browser_providers import BrowserUseProvider + + +class BrowserUseProviderTests(unittest.TestCase): + @mock.patch.dict(os.environ, {"BROWSER_USE_API_KEY": "test-key"}, clear=True) + @mock.patch.object(browser_providers_module, "_http_json") + def test_default_api_uses_v4_for_browser_lifecycle(self, request: mock.Mock) -> None: + request.return_value = { + "id": "session-1", + "cdpUrl": "wss://example.test/session-1", + } + + provider = BrowserUseProvider() + session = provider.create_session("task-1") + provider.close_session(session.session_id) + + self.assertEqual("session-1", session.session_id) + self.assertEqual("wss://example.test/session-1", session.cdp_url) + self.assertEqual( + [ + mock.call( + "POST", + "https://api.browser-use.com/api/v4/browsers", + headers={ + "X-Browser-Use-API-Key": "test-key", + "Content-Type": "application/json", + }, + payload={"timeout": 5}, + ), + mock.call( + "PATCH", + "https://api.browser-use.com/api/v4/browsers/session-1", + headers={ + "X-Browser-Use-API-Key": "test-key", + "Content-Type": "application/json", + }, + payload={"action": "stop"}, + tolerate_http_errors=True, + ), + ], + request.call_args_list, + ) + + +if __name__ == "__main__": + unittest.main()