Skip to content

Commit 694907a

Browse files
committed
fix: finish python browser routing cleanup
Preserve browser routing settings across copy(), skip cache warming for raw response wrappers, and clean up the handwritten routing files so lint can pass on the current branch. Made-with: Cursor
1 parent 622f844 commit 694907a

8 files changed

Lines changed: 51 additions & 31 deletions

File tree

examples/browser_routing.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
11
"""Example: direct-to-VM browser routing for process exec and raw HTTP."""
22

3-
from kernel import BrowserRoutingConfig, Kernel
3+
from typing import Any, cast
4+
5+
import httpx
6+
7+
from kernel import Kernel, BrowserRoutingConfig
48

59

610
def main() -> None:
711
with Kernel(browser_routing=BrowserRoutingConfig(enabled=True, subresources=("process",))) as client:
8-
browser = client.browsers.create(headless=True)
12+
browsers = cast(Any, client.browsers)
13+
browser = browsers.create(headless=True)
914
try:
10-
client.browsers.process.exec(browser.session_id, command="uname", args=["-a"])
15+
browsers.process.exec(browser.session_id, command="uname", args=["-a"])
1116

12-
response = client.browsers.request(browser.session_id, "GET", "https://example.com")
17+
response = cast(httpx.Response, browsers.request(browser.session_id, "GET", "https://example.com"))
1318
print("status", response.status_code)
1419

15-
with client.browsers.stream(browser.session_id, "GET", "https://example.com") as streamed:
20+
with cast(Any, browsers.stream(browser.session_id, "GET", "https://example.com")) as streamed:
1621
print("streamed-bytes", len(streamed.read()))
1722
finally:
18-
client.browsers.delete_by_id(browser.session_id)
23+
browsers.delete_by_id(browser.session_id)
1924

2025

2126
if __name__ == "__main__":

src/kernel/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from ._utils import file_from_path
88
from ._client import (
99
ENVIRONMENTS,
10-
BrowserRoutingConfig,
1110
Client,
1211
Kernel,
1312
Stream,
@@ -17,6 +16,7 @@
1716
AsyncKernel,
1817
AsyncStream,
1918
RequestOptions,
19+
BrowserRoutingConfig,
2020
)
2121
from ._models import BaseModel
2222
from ._version import __title__, __version__

src/kernel/_client.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232
from .lib.browser_routing.routing import (
3333
BrowserRouteCache,
3434
BrowserRoutingConfig,
35-
rewrite_direct_vm_options,
3635
strip_direct_vm_auth,
36+
rewrite_direct_vm_options,
3737
)
3838

3939
if TYPE_CHECKING:
@@ -301,6 +301,8 @@ def copy(
301301
set_default_headers: Mapping[str, str] | None = None,
302302
default_query: Mapping[str, object] | None = None,
303303
set_default_query: Mapping[str, object] | None = None,
304+
browser_routing: BrowserRoutingConfig | None = None,
305+
_browser_route_cache: BrowserRouteCache | None = None,
304306
_extra_kwargs: Mapping[str, Any] = {},
305307
) -> Self:
306308
"""
@@ -334,8 +336,8 @@ def copy(
334336
max_retries=max_retries if is_given(max_retries) else self.max_retries,
335337
default_headers=headers,
336338
default_query=params,
337-
browser_routing=self._browser_routing,
338-
_browser_route_cache=self.browser_route_cache,
339+
browser_routing=browser_routing if browser_routing is not None else self._browser_routing,
340+
_browser_route_cache=_browser_route_cache or self.browser_route_cache,
339341
**_extra_kwargs,
340342
)
341343

@@ -595,6 +597,8 @@ def copy(
595597
set_default_headers: Mapping[str, str] | None = None,
596598
default_query: Mapping[str, object] | None = None,
597599
set_default_query: Mapping[str, object] | None = None,
600+
browser_routing: BrowserRoutingConfig | None = None,
601+
_browser_route_cache: BrowserRouteCache | None = None,
598602
_extra_kwargs: Mapping[str, Any] = {},
599603
) -> Self:
600604
"""
@@ -628,8 +632,8 @@ def copy(
628632
max_retries=max_retries if is_given(max_retries) else self.max_retries,
629633
default_headers=headers,
630634
default_query=params,
631-
browser_routing=self._browser_routing,
632-
_browser_route_cache=self.browser_route_cache,
635+
browser_routing=browser_routing if browser_routing is not None else self._browser_routing,
636+
_browser_route_cache=_browser_route_cache or self.browser_route_cache,
633637
**_extra_kwargs,
634638
)
635639

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1+
from __future__ import annotations
2+
13
__all__: list[str] = []

src/kernel/lib/browser_routing/raw_http.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
from __future__ import annotations
22

3-
from collections.abc import AsyncIterator, Iterable, Iterator
4-
from contextlib import asynccontextmanager, contextmanager
53
from typing import IO, Any, Mapping, cast
4+
from contextlib import contextmanager, asynccontextmanager
5+
from collections.abc import Iterable, Iterator, AsyncIterator
66

77
import httpx
88

9-
from ..._models import FinalRequestOptions
10-
from ..._types import BinaryTypes, Body, NotGiven, Timeout, not_given
11-
from .routing import BrowserRoute
129
from .util import sanitize_curl_raw_params
10+
from .routing import BrowserRoute
11+
from ..._types import Body, Timeout, NotGiven, BinaryTypes, not_given
12+
from ..._models import FinalRequestOptions
1313

1414

1515
def request_via_browser_route(

src/kernel/lib/browser_routing/routing.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
from __future__ import annotations
22

3-
from dataclasses import dataclass, field
43
from typing import Any, Mapping, cast
4+
from dataclasses import field, dataclass
55

66
import httpx
77

8+
from .util import (
9+
jwt_from_cdp_ws_url,
10+
base_url_from_browser_like,
11+
cdp_ws_url_from_browser_like,
12+
session_id_from_browser_like,
13+
)
814
from ..._compat import model_copy
915
from ..._models import FinalRequestOptions
10-
from .util import base_url_from_browser_like, cdp_ws_url_from_browser_like, jwt_from_cdp_ws_url, session_id_from_browser_like
1116

1217

1318
@dataclass
@@ -45,7 +50,11 @@ def values(self) -> list[BrowserRoute]:
4550

4651

4752
def browser_route_from_browser(browser: Any) -> BrowserRoute | None:
48-
session_id = session_id_from_browser_like(browser)
53+
try:
54+
session_id = session_id_from_browser_like(browser)
55+
except TypeError:
56+
return None
57+
4958
base_url = base_url_from_browser_like(browser)
5059
if not base_url:
5160
return None

src/kernel/resources/browsers/browsers.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
from __future__ import annotations
44

5-
from contextlib import asynccontextmanager, contextmanager
65
import typing_extensions
7-
from typing import AsyncIterator, Dict, Iterator, Mapping, Iterable, Optional, cast
6+
from typing import Dict, Mapping, Iterable, Iterator, Optional, AsyncIterator, cast
7+
from contextlib import contextmanager, asynccontextmanager
88
from typing_extensions import Literal
99

1010
import httpx
@@ -79,22 +79,22 @@
7979
)
8080
from ...pagination import SyncOffsetPagination, AsyncOffsetPagination
8181
from ..._base_client import AsyncPaginator, make_request_options
82+
from ...lib.browser_routing.routing import browser_route_from_browser
8283
from ...types.browser_curl_response import BrowserCurlResponse
8384
from ...types.browser_list_response import BrowserListResponse
85+
from ...lib.browser_routing.raw_http import (
86+
stream_via_browser_route,
87+
request_via_browser_route,
88+
async_stream_via_browser_route,
89+
async_request_via_browser_route,
90+
)
8491
from ...types.browser_create_response import BrowserCreateResponse
8592
from ...types.browser_update_response import BrowserUpdateResponse
8693
from ...types.browser_persistence_param import BrowserPersistenceParam
8794
from ...types.browser_retrieve_response import BrowserRetrieveResponse
8895
from ...types.shared_params.browser_profile import BrowserProfile
8996
from ...types.shared_params.browser_viewport import BrowserViewport
9097
from ...types.shared_params.browser_extension import BrowserExtension
91-
from ...lib.browser_routing.raw_http import (
92-
async_request_via_browser_route,
93-
async_stream_via_browser_route,
94-
request_via_browser_route,
95-
stream_via_browser_route,
96-
)
97-
from ...lib.browser_routing.routing import browser_route_from_browser
9898

9999
__all__ = ["BrowsersResource", "AsyncBrowsersResource"]
100100

tests/test_browser_routing.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
from typing import Any, cast
55

66
import httpx
7-
import pytest
87
import respx
8+
import pytest
99

1010
from kernel import Kernel
11-
from kernel.lib.browser_routing.routing import BrowserRoutingConfig, browser_route_from_browser
1211
from kernel.lib.browser_routing.util import jwt_from_cdp_ws_url
12+
from kernel.lib.browser_routing.routing import BrowserRoutingConfig, browser_route_from_browser
1313

1414
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
1515
api_key = "sk-123"

0 commit comments

Comments
 (0)