Skip to content

Commit a1502dd

Browse files
feat: Telemetry: expose opt-in categories + full event taxonomy (public API)
1 parent 5623fd3 commit a1502dd

25 files changed

Lines changed: 584 additions & 39 deletions

.stats.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 117
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-53de38ec04ee49846c89946b2fe72641c5ee005956d1fff4e8a50de9ba22e874.yml
3-
openapi_spec_hash: 96162b6a1e4a2521be1b6c4fb9b0e5ce
4-
config_hash: 590bf8cb85948cf1e63b7b5ef60686c8
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-9d489e3e43edfa64a754d4281241718e01c85d9a82ef3687df12bbd3c4ff5b42.yml
3+
openapi_spec_hash: a953cafb7f40ec8495dbd7df8bab8bad
4+
config_hash: bb7acce8576a50dd449b0c8f58ef0f1d

api.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,11 @@ Types:
108108

109109
```python
110110
from kernel.types.browsers import (
111+
BrowserAPICallEvent,
111112
BrowserCallStack,
113+
BrowserCaptchaSolveResultEvent,
114+
BrowserCdpConnectEvent,
115+
BrowserCdpDisconnectEvent,
112116
BrowserConsoleErrorEvent,
113117
BrowserConsoleLogEvent,
114118
BrowserEventContext,
@@ -117,6 +121,8 @@ from kernel.types.browsers import (
117121
BrowserInteractionClickEvent,
118122
BrowserInteractionKeyEvent,
119123
BrowserInteractionScrollSettledEvent,
124+
BrowserLiveViewConnectEvent,
125+
BrowserLiveViewDisconnectEvent,
120126
BrowserMonitorDisconnectedEvent,
121127
BrowserMonitorInitFailedEvent,
122128
BrowserMonitorReconnectFailedEvent,
@@ -134,6 +140,8 @@ from kernel.types.browsers import (
134140
BrowserPageNavigationEvent,
135141
BrowserPageNavigationSettledEvent,
136142
BrowserPageTabOpenedEvent,
143+
BrowserServiceCrashedEvent,
144+
BrowserSystemOomKillEvent,
137145
BrowserTelemetryCategoriesConfig,
138146
BrowserTelemetryCategoryConfig,
139147
BrowserTelemetryConfig,

src/kernel/types/browser_create_params.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,17 +131,18 @@ class Telemetry(TypedDict, total=False):
131131
"""
132132

133133
browser: BrowserTelemetryCategoriesConfigParam
134-
"""Per-category enable/disable flags.
134+
"""Per-category capture flags.
135135
136-
If enabled is true and browser is omitted or empty, the VM default category set
137-
is used. Explicitly disabling all four categories stops capture on update and
138-
starts no capture on create.
136+
Selection is opt-in: only the categories set to enabled=true are captured;
137+
anything omitted is off. If enabled is true and browser is omitted or empty, the
138+
default category set is used. A browser config that enables nothing stops
139+
capture on update and starts no capture on create.
139140
"""
140141

141142
enabled: bool
142143
"""Request shortcut for browser telemetry capture.
143144
144-
True enables capture using VM defaults unless browser category settings are
145-
provided. False stops capture on update and starts no capture on create.
146-
enabled=false cannot be combined with browser category settings.
145+
True enables capture using the default category set unless browser category
146+
settings are provided. False stops capture on update and starts no capture on
147+
create. enabled=false cannot be combined with browser category settings.
147148
"""

src/kernel/types/browser_update_params.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,19 +52,20 @@ class Telemetry(TypedDict, total=False):
5252
"""
5353

5454
browser: BrowserTelemetryCategoriesConfigParam
55-
"""Per-category enable/disable flags.
55+
"""Per-category capture flags.
5656
57-
If enabled is true and browser is omitted or empty, the VM default category set
58-
is used. Explicitly disabling all four categories stops capture on update and
59-
starts no capture on create.
57+
Selection is opt-in: only the categories set to enabled=true are captured;
58+
anything omitted is off. If enabled is true and browser is omitted or empty, the
59+
default category set is used. A browser config that enables nothing stops
60+
capture on update and starts no capture on create.
6061
"""
6162

6263
enabled: bool
6364
"""Request shortcut for browser telemetry capture.
6465
65-
True enables capture using VM defaults unless browser category settings are
66-
provided. False stops capture on update and starts no capture on create.
67-
enabled=false cannot be combined with browser category settings.
66+
True enables capture using the default category set unless browser category
67+
settings are provided. False stops capture on update and starts no capture on
68+
create. enabled=false cannot be combined with browser category settings.
6869
"""
6970

7071

src/kernel/types/browsers/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from .process_kill_response import ProcessKillResponse as ProcessKillResponse
2929
from .process_resize_params import ProcessResizeParams as ProcessResizeParams
3030
from .replay_start_response import ReplayStartResponse as ReplayStartResponse
31+
from .browser_api_call_event import BrowserAPICallEvent as BrowserAPICallEvent
3132
from .browser_page_lcp_event import BrowserPageLcpEvent as BrowserPageLcpEvent
3233
from .computer_scroll_params import ComputerScrollParams as ComputerScrollParams
3334
from .process_spawn_response import ProcessSpawnResponse as ProcessSpawnResponse
@@ -37,6 +38,7 @@
3738
from .process_resize_response import ProcessResizeResponse as ProcessResizeResponse
3839
from .process_status_response import ProcessStatusResponse as ProcessStatusResponse
3940
from .browser_telemetry_config import BrowserTelemetryConfig as BrowserTelemetryConfig
41+
from .browser_cdp_connect_event import BrowserCdpConnectEvent as BrowserCdpConnectEvent
4042
from .browser_console_log_event import BrowserConsoleLogEvent as BrowserConsoleLogEvent
4143
from .computer_press_key_params import ComputerPressKeyParams as ComputerPressKeyParams
4244
from .computer_type_text_params import ComputerTypeTextParams as ComputerTypeTextParams
@@ -51,14 +53,18 @@
5153
from .browser_console_error_event import BrowserConsoleErrorEvent as BrowserConsoleErrorEvent
5254
from .computer_click_mouse_params import ComputerClickMouseParams as ComputerClickMouseParams
5355
from .playwright_execute_response import PlaywrightExecuteResponse as PlaywrightExecuteResponse
56+
from .browser_cdp_disconnect_event import BrowserCdpDisconnectEvent as BrowserCdpDisconnectEvent
5457
from .browser_interaction_key_event import BrowserInteractionKeyEvent as BrowserInteractionKeyEvent
5558
from .browser_network_request_event import BrowserNetworkRequestEvent as BrowserNetworkRequestEvent
5659
from .browser_page_navigation_event import BrowserPageNavigationEvent as BrowserPageNavigationEvent
5760
from .browser_page_tab_opened_event import BrowserPageTabOpenedEvent as BrowserPageTabOpenedEvent
61+
from .browser_service_crashed_event import BrowserServiceCrashedEvent as BrowserServiceCrashedEvent
62+
from .browser_system_oom_kill_event import BrowserSystemOomKillEvent as BrowserSystemOomKillEvent
5863
from .f_set_file_permissions_params import FSetFilePermissionsParams as FSetFilePermissionsParams
5964
from .browser_network_response_event import BrowserNetworkResponseEvent as BrowserNetworkResponseEvent
6065
from .process_stdout_stream_response import ProcessStdoutStreamResponse as ProcessStdoutStreamResponse
6166
from .browser_interaction_click_event import BrowserInteractionClickEvent as BrowserInteractionClickEvent
67+
from .browser_live_view_connect_event import BrowserLiveViewConnectEvent as BrowserLiveViewConnectEvent
6268
from .browser_page_layout_shift_event import BrowserPageLayoutShiftEvent as BrowserPageLayoutShiftEvent
6369
from .computer_write_clipboard_params import ComputerWriteClipboardParams as ComputerWriteClipboardParams
6470
from .browser_monitor_screenshot_event import BrowserMonitorScreenshotEvent as BrowserMonitorScreenshotEvent
@@ -67,6 +73,8 @@
6773
from .browser_monitor_reconnected_event import BrowserMonitorReconnectedEvent as BrowserMonitorReconnectedEvent
6874
from .browser_page_layout_settled_event import BrowserPageLayoutSettledEvent as BrowserPageLayoutSettledEvent
6975
from .browser_telemetry_category_config import BrowserTelemetryCategoryConfig as BrowserTelemetryCategoryConfig
76+
from .browser_captcha_solve_result_event import BrowserCaptchaSolveResultEvent as BrowserCaptchaSolveResultEvent
77+
from .browser_live_view_disconnect_event import BrowserLiveViewDisconnectEvent as BrowserLiveViewDisconnectEvent
7078
from .browser_monitor_disconnected_event import BrowserMonitorDisconnectedEvent as BrowserMonitorDisconnectedEvent
7179
from .computer_capture_screenshot_params import ComputerCaptureScreenshotParams as ComputerCaptureScreenshotParams
7280
from .browser_telemetry_categories_config import BrowserTelemetryCategoriesConfig as BrowserTelemetryCategoriesConfig
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing import Optional
4+
from typing_extensions import Literal
5+
6+
from ..._models import BaseModel
7+
from .browser_event_source import BrowserEventSource
8+
9+
__all__ = ["BrowserAPICallEvent", "Data"]
10+
11+
12+
class Data(BaseModel):
13+
duration_ms: float
14+
"""Wall-clock duration of the handler in milliseconds."""
15+
16+
operation_id: str
17+
"""OpenAPI operationId of the matched route (e.g. processExec, takeScreenshot)."""
18+
19+
request_id: str
20+
"""Per-request identifier from the in-VM API request middleware."""
21+
22+
status: int
23+
"""HTTP response status code."""
24+
25+
26+
class BrowserAPICallEvent(BaseModel):
27+
"""An agent-driven HTTP call handled by the in-VM API server."""
28+
29+
category: Literal["control"]
30+
31+
source: BrowserEventSource
32+
"""Provenance metadata identifying which producer emitted the event."""
33+
34+
ts: int
35+
"""Event timestamp in Unix microseconds."""
36+
37+
type: Literal["api_call"]
38+
39+
data: Optional[Data] = None
40+
41+
truncated: Optional[bool] = None
42+
"""True if the data field was truncated due to size limits."""
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing import Optional
4+
from typing_extensions import Literal
5+
6+
from ..._models import BaseModel
7+
from .browser_event_source import BrowserEventSource
8+
9+
__all__ = ["BrowserCaptchaSolveResultEvent", "Data"]
10+
11+
12+
class Data(BaseModel):
13+
captcha_type: Literal["hcaptcha", "recaptcha_v2", "recaptcha_v3", "turnstile", "geetest", "other"]
14+
"""Captcha vendor family.
15+
16+
Provider-specific task names are normalized into this set; anything not covered
17+
is reported as other.
18+
"""
19+
20+
duration_ms: float
21+
"""Wall-clock duration from solve start to terminal outcome."""
22+
23+
status: Literal["success", "failure", "timeout", "abandoned"]
24+
"""Terminal outcome.
25+
26+
success: solver returned a usable solution. failure: solver returned an error
27+
(see error_code). timeout: solver did not return within the caller's wait
28+
budget. abandoned: caller cancelled or the page navigated away mid-solve.
29+
"""
30+
31+
error_code: Optional[str] = None
32+
"""Solver-specific error code on failure (e.g.
33+
34+
ERROR_CAPTCHA_UNSOLVABLE). Absent on success.
35+
"""
36+
37+
task_id: Optional[str] = None
38+
"""Solver-assigned identifier. Opaque, useful for support cross-references."""
39+
40+
website_host: Optional[str] = None
41+
"""Host of the page where the captcha was solved."""
42+
43+
website_path: Optional[str] = None
44+
"""Path of the page where the captcha was solved. Query string excluded."""
45+
46+
47+
class BrowserCaptchaSolveResultEvent(BaseModel):
48+
"""A captcha solve attempt reached a terminal outcome."""
49+
50+
category: Literal["captcha"]
51+
52+
source: BrowserEventSource
53+
"""Provenance metadata identifying which producer emitted the event."""
54+
55+
ts: int
56+
"""Event timestamp in Unix microseconds."""
57+
58+
type: Literal["captcha_solve_result"]
59+
60+
data: Optional[Data] = None
61+
62+
truncated: Optional[bool] = None
63+
"""True if the data field was truncated due to size limits."""
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing import Optional
4+
from typing_extensions import Literal
5+
6+
from ..._models import BaseModel
7+
from .browser_event_source import BrowserEventSource
8+
9+
__all__ = ["BrowserCdpConnectEvent"]
10+
11+
12+
class BrowserCdpConnectEvent(BaseModel):
13+
"""An external client (e.g.
14+
15+
customer SDK, Playwright, Puppeteer) connected to the CDP WebSocket proxy on this VM.
16+
"""
17+
18+
category: Literal["connection"]
19+
20+
source: BrowserEventSource
21+
"""Provenance metadata identifying which producer emitted the event."""
22+
23+
ts: int
24+
"""Event timestamp in Unix microseconds."""
25+
26+
type: Literal["cdp_connect"]
27+
28+
truncated: Optional[bool] = None
29+
"""True if the data field was truncated due to size limits."""
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing import Optional
4+
from typing_extensions import Literal
5+
6+
from ..._models import BaseModel
7+
from .browser_event_source import BrowserEventSource
8+
9+
__all__ = ["BrowserCdpDisconnectEvent", "Data"]
10+
11+
12+
class Data(BaseModel):
13+
duration_ms: float
14+
"""Wall-clock duration of the connection in milliseconds."""
15+
16+
message_count: int
17+
"""Number of CDP messages relayed across the connection in either direction."""
18+
19+
reason: Literal["client_close", "upstream_changed", "upstream_error", "context_cancelled"]
20+
"""Why the connection ended.
21+
22+
client_close: the client initiated the close. upstream_changed: Chromium
23+
restarted mid-session and the proxy tore down so the client could reconnect
24+
against the new upstream. upstream_error: upstream dial or message pump errored.
25+
context_cancelled: the request context was cancelled (typically server
26+
shutdown).
27+
"""
28+
29+
30+
class BrowserCdpDisconnectEvent(BaseModel):
31+
"""An external client disconnected from the CDP WebSocket proxy on this VM.
32+
33+
Pair with the immediately preceding cdp_connect on the same stream.
34+
"""
35+
36+
category: Literal["connection"]
37+
38+
source: BrowserEventSource
39+
"""Provenance metadata identifying which producer emitted the event."""
40+
41+
ts: int
42+
"""Event timestamp in Unix microseconds."""
43+
44+
type: Literal["cdp_disconnect"]
45+
46+
data: Optional[Data] = None
47+
48+
truncated: Optional[bool] = None
49+
"""True if the data field was truncated due to size limits."""
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing import Optional
4+
from typing_extensions import Literal
5+
6+
from ..._models import BaseModel
7+
from .browser_event_source import BrowserEventSource
8+
9+
__all__ = ["BrowserLiveViewConnectEvent", "Data"]
10+
11+
12+
class Data(BaseModel):
13+
session_id: str
14+
"""Live view session identifier.
15+
16+
Stable across reconnects, so a transient network blip can emit two events with
17+
the same session_id.
18+
"""
19+
20+
21+
class BrowserLiveViewConnectEvent(BaseModel):
22+
"""A live view client connected to the headful browser's WebRTC server.
23+
24+
Headful only; not emitted for headless images.
25+
"""
26+
27+
category: Literal["connection"]
28+
29+
source: BrowserEventSource
30+
"""Provenance metadata identifying which producer emitted the event."""
31+
32+
ts: int
33+
"""Event timestamp in Unix microseconds."""
34+
35+
type: Literal["live_view_connect"]
36+
37+
data: Optional[Data] = None
38+
39+
truncated: Optional[bool] = None
40+
"""True if the data field was truncated due to size limits."""

0 commit comments

Comments
 (0)