hyperbrowser 0.30.0__tar.gz → 0.31.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of hyperbrowser might be problematic. Click here for more details.

Files changed (44) hide show
  1. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/PKG-INFO +1 -1
  2. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/client/async_client.py +2 -0
  3. hyperbrowser-0.31.0/hyperbrowser/client/managers/async_manager/beta/__init__.py +6 -0
  4. hyperbrowser-0.31.0/hyperbrowser/client/managers/async_manager/beta/agents/__init__.py +5 -0
  5. hyperbrowser-0.31.0/hyperbrowser/client/managers/async_manager/beta/agents/browser_use.py +69 -0
  6. hyperbrowser-0.31.0/hyperbrowser/client/managers/sync_manager/beta/__init__.py +6 -0
  7. hyperbrowser-0.31.0/hyperbrowser/client/managers/sync_manager/beta/agents/__init__.py +5 -0
  8. hyperbrowser-0.31.0/hyperbrowser/client/managers/sync_manager/beta/agents/browser_use.py +67 -0
  9. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/client/sync.py +2 -0
  10. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/config.py +2 -2
  11. hyperbrowser-0.31.0/hyperbrowser/models/__init__.py +142 -0
  12. hyperbrowser-0.31.0/hyperbrowser/models/beta/agents/browser_use.py +177 -0
  13. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/models/consts.py +10 -0
  14. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/models/extract.py +1 -1
  15. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/pyproject.toml +1 -1
  16. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/LICENSE +0 -0
  17. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/README.md +0 -0
  18. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/__init__.py +0 -0
  19. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/client/base.py +0 -0
  20. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/client/managers/async_manager/crawl.py +0 -0
  21. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/client/managers/async_manager/extension.py +0 -0
  22. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/client/managers/async_manager/extract.py +0 -0
  23. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/client/managers/async_manager/profile.py +0 -0
  24. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/client/managers/async_manager/scrape.py +0 -0
  25. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/client/managers/async_manager/session.py +0 -0
  26. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/client/managers/sync_manager/crawl.py +0 -0
  27. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/client/managers/sync_manager/extension.py +0 -0
  28. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/client/managers/sync_manager/extract.py +0 -0
  29. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/client/managers/sync_manager/profile.py +0 -0
  30. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/client/managers/sync_manager/scrape.py +0 -0
  31. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/client/managers/sync_manager/session.py +0 -0
  32. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/exceptions.py +0 -0
  33. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/models/crawl.py +0 -0
  34. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/models/extension.py +0 -0
  35. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/models/profile.py +0 -0
  36. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/models/scrape.py +0 -0
  37. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/models/session.py +0 -0
  38. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/tools/__init__.py +0 -0
  39. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/tools/anthropic.py +0 -0
  40. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/tools/openai.py +0 -0
  41. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/tools/schema.py +0 -0
  42. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/transport/async_transport.py +0 -0
  43. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/transport/base.py +0 -0
  44. {hyperbrowser-0.30.0 → hyperbrowser-0.31.0}/hyperbrowser/transport/sync.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: hyperbrowser
3
- Version: 0.30.0
3
+ Version: 0.31.0
4
4
  Summary: Python SDK for hyperbrowser
5
5
  License: MIT
6
6
  Author: Nikhil Shahi
@@ -6,6 +6,7 @@ from .managers.async_manager.session import SessionManager
6
6
  from .managers.async_manager.scrape import ScrapeManager
7
7
  from .managers.async_manager.crawl import CrawlManager
8
8
  from .managers.async_manager.extension import ExtensionManager
9
+ from .managers.async_manager.beta import Beta
9
10
  from .base import HyperbrowserBase
10
11
  from ..transport.async_transport import AsyncTransport
11
12
  from ..config import ClientConfig
@@ -29,6 +30,7 @@ class AsyncHyperbrowser(HyperbrowserBase):
29
30
  self.extract = ExtractManager(self)
30
31
  self.profiles = ProfileManager(self)
31
32
  self.extensions = ExtensionManager(self)
33
+ self.beta = Beta(self)
32
34
 
33
35
  async def close(self) -> None:
34
36
  await self.transport.close()
@@ -0,0 +1,6 @@
1
+ from .agents import Agents
2
+
3
+
4
+ class Beta:
5
+ def __init__(self, client):
6
+ self.agents = Agents(client)
@@ -0,0 +1,5 @@
1
+ class Agents:
2
+ def __init__(self, client):
3
+ from .browser_use import BrowserUseManager
4
+
5
+ self.browser_use = BrowserUseManager(client)
@@ -0,0 +1,69 @@
1
+ import asyncio
2
+ from hyperbrowser.exceptions import HyperbrowserError
3
+ from ......models import (
4
+ POLLING_ATTEMPTS,
5
+ BasicResponse,
6
+ StartBrowserUseTaskParams,
7
+ StartBrowserUseTaskResponse,
8
+ BrowserUseTaskStatusResponse,
9
+ BrowserUseTaskResponse,
10
+ )
11
+
12
+
13
+ class BrowserUseManager:
14
+ def __init__(self, client):
15
+ self._client = client
16
+
17
+ async def start(
18
+ self, params: StartBrowserUseTaskParams
19
+ ) -> StartBrowserUseTaskResponse:
20
+ response = await self._client.transport.post(
21
+ self._client._build_url("/task/browser-use"),
22
+ data=params.model_dump(exclude_none=True, by_alias=True),
23
+ )
24
+ return StartBrowserUseTaskResponse(**response.data)
25
+
26
+ async def get(self, job_id: str) -> BrowserUseTaskResponse:
27
+ response = await self._client.transport.get(
28
+ self._client._build_url(f"/task/browser-use/{job_id}")
29
+ )
30
+ return BrowserUseTaskResponse(**response.data)
31
+
32
+ async def get_status(self, job_id: str) -> BrowserUseTaskStatusResponse:
33
+ response = await self._client.transport.get(
34
+ self._client._build_url(f"/task/browser-use/{job_id}/status")
35
+ )
36
+ return BrowserUseTaskStatusResponse(**response.data)
37
+
38
+ async def stop(self, job_id: str) -> BasicResponse:
39
+ response = await self._client.transport.put(
40
+ self._client._build_url(f"/task/browser-use/{job_id}/stop")
41
+ )
42
+ return BasicResponse(**response.data)
43
+
44
+ async def start_and_wait(
45
+ self, params: StartBrowserUseTaskParams
46
+ ) -> BrowserUseTaskResponse:
47
+ job_start_resp = await self.start(params)
48
+ job_id = job_start_resp.job_id
49
+ if not job_id:
50
+ raise HyperbrowserError("Failed to start browser-use task job")
51
+
52
+ failures = 0
53
+ while True:
54
+ try:
55
+ job_response = await self.get_status(job_id)
56
+ if (
57
+ job_response.status == "completed"
58
+ or job_response.status == "failed"
59
+ or job_response.status == "stopped"
60
+ ):
61
+ return await self.get(job_id)
62
+ failures = 0
63
+ except Exception as e:
64
+ failures += 1
65
+ if failures >= POLLING_ATTEMPTS:
66
+ raise HyperbrowserError(
67
+ f"Failed to poll browser-use task job {job_id} after {POLLING_ATTEMPTS} attempts: {e}"
68
+ )
69
+ await asyncio.sleep(2)
@@ -0,0 +1,6 @@
1
+ from .agents import Agents
2
+
3
+
4
+ class Beta:
5
+ def __init__(self, client):
6
+ self.agents = Agents(client)
@@ -0,0 +1,5 @@
1
+ class Agents:
2
+ def __init__(self, client):
3
+ from .browser_use import BrowserUseManager
4
+
5
+ self.browser_use = BrowserUseManager(client)
@@ -0,0 +1,67 @@
1
+ import time
2
+ from hyperbrowser.exceptions import HyperbrowserError
3
+ from ......models import (
4
+ POLLING_ATTEMPTS,
5
+ BasicResponse,
6
+ StartBrowserUseTaskParams,
7
+ StartBrowserUseTaskResponse,
8
+ BrowserUseTaskStatusResponse,
9
+ BrowserUseTaskResponse,
10
+ )
11
+
12
+
13
+ class BrowserUseManager:
14
+ def __init__(self, client):
15
+ self._client = client
16
+
17
+ def start(self, params: StartBrowserUseTaskParams) -> StartBrowserUseTaskResponse:
18
+ response = self._client.transport.post(
19
+ self._client._build_url("/task/browser-use"),
20
+ data=params.model_dump(exclude_none=True, by_alias=True),
21
+ )
22
+ return StartBrowserUseTaskResponse(**response.data)
23
+
24
+ def get(self, job_id: str) -> BrowserUseTaskResponse:
25
+ response = self._client.transport.get(
26
+ self._client._build_url(f"/task/browser-use/{job_id}")
27
+ )
28
+ return BrowserUseTaskResponse(**response.data)
29
+
30
+ def get_status(self, job_id: str) -> BrowserUseTaskStatusResponse:
31
+ response = self._client.transport.get(
32
+ self._client._build_url(f"/task/browser-use/{job_id}/status")
33
+ )
34
+ return BrowserUseTaskStatusResponse(**response.data)
35
+
36
+ def stop(self, job_id: str) -> BasicResponse:
37
+ response = self._client.transport.put(
38
+ self._client._build_url(f"/task/browser-use/{job_id}/stop")
39
+ )
40
+ return BasicResponse(**response.data)
41
+
42
+ def start_and_wait(
43
+ self, params: StartBrowserUseTaskParams
44
+ ) -> BrowserUseTaskResponse:
45
+ job_start_resp = self.start(params)
46
+ job_id = job_start_resp.job_id
47
+ if not job_id:
48
+ raise HyperbrowserError("Failed to start browser-use task job")
49
+
50
+ failures = 0
51
+ while True:
52
+ try:
53
+ job_response = self.get_status(job_id)
54
+ if (
55
+ job_response.status == "completed"
56
+ or job_response.status == "failed"
57
+ or job_response.status == "stopped"
58
+ ):
59
+ return self.get(job_id)
60
+ failures = 0
61
+ except Exception as e:
62
+ failures += 1
63
+ if failures >= POLLING_ATTEMPTS:
64
+ raise HyperbrowserError(
65
+ f"Failed to poll browser-use task job {job_id} after {POLLING_ATTEMPTS} attempts: {e}"
66
+ )
67
+ time.sleep(2)
@@ -5,6 +5,7 @@ from .managers.sync_manager.profile import ProfileManager
5
5
  from .managers.sync_manager.session import SessionManager
6
6
  from .managers.sync_manager.scrape import ScrapeManager
7
7
  from .managers.sync_manager.crawl import CrawlManager
8
+ from .managers.sync_manager.beta import Beta
8
9
  from .managers.sync_manager.extension import ExtensionManager
9
10
  from .base import HyperbrowserBase
10
11
  from ..transport.sync import SyncTransport
@@ -29,6 +30,7 @@ class Hyperbrowser(HyperbrowserBase):
29
30
  self.extract = ExtractManager(self)
30
31
  self.profiles = ProfileManager(self)
31
32
  self.extensions = ExtensionManager(self)
33
+ self.beta = Beta(self)
32
34
 
33
35
  def close(self) -> None:
34
36
  self.transport.close()
@@ -8,7 +8,7 @@ class ClientConfig:
8
8
  """Configuration for the Hyperbrowser client"""
9
9
 
10
10
  api_key: str
11
- base_url: str = "https://api.hyperbrowser.com"
11
+ base_url: str = "https://app.hyperbrowser.ai"
12
12
 
13
13
  @classmethod
14
14
  def from_env(cls) -> "ClientConfig":
@@ -17,6 +17,6 @@ class ClientConfig:
17
17
  raise ValueError("HYPERBROWSER_API_KEY environment variable is required")
18
18
 
19
19
  base_url = os.environ.get(
20
- "HYPERBROWSER_BASE_URL", "https://api.hyperbrowser.com"
20
+ "HYPERBROWSER_BASE_URL", "https://app.hyperbrowser.ai"
21
21
  )
22
22
  return cls(api_key=api_key, base_url=base_url)
@@ -0,0 +1,142 @@
1
+ from .consts import (
2
+ ScrapeFormat,
3
+ ScrapeWaitUntil,
4
+ ScrapePageStatus,
5
+ ScrapeScreenshotFormat,
6
+ RecordingStatus,
7
+ DownloadsStatus,
8
+ POLLING_ATTEMPTS,
9
+ Country,
10
+ OperatingSystem,
11
+ Platform,
12
+ ISO639_1,
13
+ State,
14
+ BrowserUseLlm,
15
+ )
16
+ from .crawl import (
17
+ CrawlJobStatus,
18
+ CrawlPageStatus,
19
+ StartCrawlJobParams,
20
+ StartCrawlJobResponse,
21
+ CrawledPage,
22
+ GetCrawlJobParams,
23
+ CrawlJobResponse,
24
+ )
25
+ from .extension import CreateExtensionParams, ExtensionResponse
26
+ from .extract import (
27
+ ExtractJobStatus,
28
+ StartExtractJobParams,
29
+ StartExtractJobResponse,
30
+ ExtractJobResponse,
31
+ )
32
+ from .profile import (
33
+ CreateProfileResponse,
34
+ ProfileResponse,
35
+ ProfileListParams,
36
+ ProfileListResponse,
37
+ )
38
+ from .scrape import (
39
+ ScrapeJobStatus,
40
+ ScreenshotOptions,
41
+ ScrapeOptions,
42
+ StartScrapeJobParams,
43
+ StartScrapeJobResponse,
44
+ ScrapeJobData,
45
+ ScrapeJobResponse,
46
+ StartBatchScrapeJobParams,
47
+ ScrapedPage,
48
+ GetBatchScrapeJobParams,
49
+ StartBatchScrapeJobResponse,
50
+ BatchScrapeJobResponse,
51
+ )
52
+ from .session import (
53
+ SessionStatus,
54
+ BasicResponse,
55
+ Session,
56
+ SessionDetail,
57
+ SessionListParams,
58
+ SessionListResponse,
59
+ ScreenConfig,
60
+ CreateSessionProfile,
61
+ CreateSessionParams,
62
+ SessionRecording,
63
+ GetSessionRecordingUrlResponse,
64
+ GetSessionDownloadsUrlResponse,
65
+ )
66
+ from .beta.agents.browser_use import (
67
+ StartBrowserUseTaskParams,
68
+ StartBrowserUseTaskResponse,
69
+ BrowserUseTaskStatusResponse,
70
+ BrowserUseTaskData,
71
+ BrowserUseTaskResponse,
72
+ )
73
+
74
+ __all__ = [
75
+ # consts
76
+ "BrowserUseLlm",
77
+ "ScrapeFormat",
78
+ "ScrapeWaitUntil",
79
+ "ScrapePageStatus",
80
+ "ScrapeScreenshotFormat",
81
+ "RecordingStatus",
82
+ "DownloadsStatus",
83
+ "POLLING_ATTEMPTS",
84
+ "Country",
85
+ "OperatingSystem",
86
+ "Platform",
87
+ "ISO639_1",
88
+ "State",
89
+ # crawl
90
+ "CrawlJobStatus",
91
+ "CrawlPageStatus",
92
+ "StartCrawlJobParams",
93
+ "StartCrawlJobResponse",
94
+ "CrawledPage",
95
+ "GetCrawlJobParams",
96
+ "CrawlJobResponse",
97
+ # extension
98
+ "CreateExtensionParams",
99
+ "ExtensionResponse",
100
+ # extract
101
+ "ExtractJobStatus",
102
+ "StartExtractJobParams",
103
+ "StartExtractJobResponse",
104
+ "ExtractJobResponse",
105
+ # profile
106
+ "CreateProfileResponse",
107
+ "ProfileResponse",
108
+ "ProfileListParams",
109
+ "ProfileListResponse",
110
+ # scrape
111
+ "ScrapeJobStatus",
112
+ "ScreenshotOptions",
113
+ "ScrapeOptions",
114
+ "StartScrapeJobParams",
115
+ "StartScrapeJobResponse",
116
+ "ScrapeJobData",
117
+ "ScrapeJobResponse",
118
+ "StartBatchScrapeJobParams",
119
+ "ScrapedPage",
120
+ "GetBatchScrapeJobParams",
121
+ "StartBatchScrapeJobResponse",
122
+ "BatchScrapeJobResponse",
123
+ # session
124
+ "SessionStatus",
125
+ "BasicResponse",
126
+ "Session",
127
+ "SessionDetail",
128
+ "SessionListParams",
129
+ "SessionListResponse",
130
+ "ScreenConfig",
131
+ "CreateSessionProfile",
132
+ "CreateSessionParams",
133
+ "SessionRecording",
134
+ "GetSessionRecordingUrlResponse",
135
+ "GetSessionDownloadsUrlResponse",
136
+ # agents
137
+ "StartBrowserUseTaskParams",
138
+ "StartBrowserUseTaskResponse",
139
+ "BrowserUseTaskStatusResponse",
140
+ "BrowserUseTaskData",
141
+ "BrowserUseTaskResponse",
142
+ ]
@@ -0,0 +1,177 @@
1
+ from typing import Literal, Optional, Union
2
+ from pydantic import BaseModel, ConfigDict, Field
3
+
4
+ from ...consts import BrowserUseLlm
5
+ from ...session import CreateSessionParams
6
+
7
+ BrowserUseTaskStatus = Literal["pending", "running", "completed", "failed", "stopped"]
8
+
9
+
10
+ class StartBrowserUseTaskParams(BaseModel):
11
+ """
12
+ Parameters for creating a new browser use task.
13
+ """
14
+
15
+ model_config = ConfigDict(
16
+ populate_by_alias=True,
17
+ )
18
+
19
+ task: str
20
+ llm: Optional[BrowserUseLlm] = Field(default=None, serialization_alias="llm")
21
+ session_id: Optional[str] = Field(default=None, serialization_alias="sessionId")
22
+ validate_output: Optional[bool] = Field(
23
+ default=None, serialization_alias="validateOutput"
24
+ )
25
+ use_vision: Optional[bool] = Field(default=None, serialization_alias="useVision")
26
+ use_vision_for_planner: Optional[bool] = Field(
27
+ default=None, serialization_alias="useVisionForPlanner"
28
+ )
29
+ max_actions_per_step: Optional[int] = Field(
30
+ default=None, serialization_alias="maxActionsPerStep"
31
+ )
32
+ max_input_tokens: Optional[int] = Field(
33
+ default=None, serialization_alias="maxInputTokens"
34
+ )
35
+ planner_llm: Optional[BrowserUseLlm] = Field(
36
+ default=None, serialization_alias="plannerLlm"
37
+ )
38
+ page_extraction_llm: Optional[BrowserUseLlm] = Field(
39
+ default=None, serialization_alias="pageExtractionLlm"
40
+ )
41
+ planner_interval: Optional[int] = Field(
42
+ default=None, serialization_alias="plannerInterval"
43
+ )
44
+ max_steps: Optional[int] = Field(default=None, serialization_alias="maxSteps")
45
+ keep_browser_open: Optional[bool] = Field(
46
+ default=None, serialization_alias="keepBrowserOpen"
47
+ )
48
+ session_options: Optional[CreateSessionParams] = Field(
49
+ default=None, serialization_alias="sessionOptions"
50
+ )
51
+
52
+
53
+ class StartBrowserUseTaskResponse(BaseModel):
54
+ """
55
+ Response from starting a browser use task.
56
+ """
57
+
58
+ model_config = ConfigDict(
59
+ populate_by_alias=True,
60
+ )
61
+
62
+ job_id: str = Field(alias="jobId")
63
+
64
+
65
+ class BrowserUseTaskStatusResponse(BaseModel):
66
+ """
67
+ Response from getting a browser use task status.
68
+ """
69
+
70
+ model_config = ConfigDict(
71
+ populate_by_alias=True,
72
+ )
73
+
74
+ status: BrowserUseTaskStatus
75
+
76
+
77
+ class BrowserUseAgentBrain(BaseModel):
78
+ evaluation_previous_goal: str
79
+ memory: str
80
+ next_goal: str
81
+
82
+
83
+ class BrowserUseAgentOutput(BaseModel):
84
+ current_state: BrowserUseAgentBrain
85
+ action: list[dict]
86
+
87
+
88
+ class BrowserUseActionResult(BaseModel):
89
+ is_done: Optional[bool] = False
90
+ success: Optional[bool] = None
91
+ extracted_content: Optional[str] = None
92
+ error: Optional[str] = None
93
+ include_in_memory: bool = False
94
+
95
+
96
+ class BrowserUseStepMetadata(BaseModel):
97
+ step_start_time: float
98
+ step_end_time: float
99
+ input_tokens: int
100
+ step_number: int
101
+
102
+
103
+ class BrowserUseTabInfo(BaseModel):
104
+ page_id: int
105
+ url: str
106
+ title: str
107
+
108
+
109
+ class BrowserUseCoordinates(BaseModel):
110
+ x: int
111
+ y: int
112
+
113
+
114
+ class BrowserUseCoordinateSet(BaseModel):
115
+ top_left: BrowserUseCoordinates
116
+ top_right: BrowserUseCoordinates
117
+ bottom_left: BrowserUseCoordinates
118
+ bottom_right: BrowserUseCoordinates
119
+ center: BrowserUseCoordinates
120
+ width: int
121
+ height: int
122
+
123
+
124
+ class BrowserUseViewportInfo(BaseModel):
125
+ scroll_x: int
126
+ scroll_y: int
127
+ width: int
128
+ height: int
129
+
130
+
131
+ class BrowserUseDOMHistoryElement(BaseModel):
132
+ tag_name: str
133
+ xpath: str
134
+ highlight_index: Optional[int]
135
+ entire_parent_branch_path: list[str]
136
+ attributes: dict[str, str]
137
+ shadow_root: bool = False
138
+ css_selector: Optional[str] = None
139
+ page_coordinates: Optional[BrowserUseCoordinateSet] = None
140
+ viewport_coordinates: Optional[BrowserUseCoordinateSet] = None
141
+ viewport_info: Optional[BrowserUseViewportInfo] = None
142
+
143
+
144
+ class BrowserUseBrowserStateHistory(BaseModel):
145
+ url: str
146
+ title: str
147
+ tabs: list[BrowserUseTabInfo]
148
+ interacted_element: Union[
149
+ list[Union[BrowserUseDOMHistoryElement, None]], list[None]
150
+ ]
151
+ screenshot: Optional[str] = None
152
+
153
+
154
+ class BrowserUseAgentHistory(BaseModel):
155
+ model_output: Union[BrowserUseAgentOutput, None]
156
+ result: list[BrowserUseActionResult]
157
+ state: BrowserUseBrowserStateHistory
158
+ metadata: Optional[BrowserUseStepMetadata] = None
159
+
160
+
161
+ class BrowserUseTaskData(BaseModel):
162
+ history: list[BrowserUseAgentHistory]
163
+
164
+
165
+ class BrowserUseTaskResponse(BaseModel):
166
+ """
167
+ Response from a browser use task.
168
+ """
169
+
170
+ model_config = ConfigDict(
171
+ populate_by_alias=True,
172
+ )
173
+
174
+ job_id: str = Field(alias="jobId")
175
+ status: BrowserUseTaskStatus
176
+ data: Optional[BrowserUseTaskData] = Field(default=None, alias="data")
177
+ error: Optional[str] = Field(default=None, alias="error")
@@ -13,6 +13,16 @@ DownloadsStatus = Literal[
13
13
 
14
14
  POLLING_ATTEMPTS = 5
15
15
 
16
+ BrowserUseLlm = Literal[
17
+ "gpt-4o",
18
+ "gpt-4o-mini",
19
+ "claude-3-7-sonnet-20250219",
20
+ "claude-3-5-haiku-20241022",
21
+ "gemini-2.0-flash",
22
+ "gemini-2.0-flash-thinking",
23
+ "gemini-2.0-pro",
24
+ ]
25
+
16
26
  Country = Literal[
17
27
  "AD",
18
28
  "AE",
@@ -55,4 +55,4 @@ class ExtractJobResponse(BaseModel):
55
55
  job_id: str = Field(alias="jobId")
56
56
  status: ExtractJobStatus
57
57
  error: Optional[str] = None
58
- data: Optional[Any] = None
58
+ data: Optional[dict] = None
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "hyperbrowser"
3
- version = "0.30.0"
3
+ version = "0.31.0"
4
4
  description = "Python SDK for hyperbrowser"
5
5
  authors = ["Nikhil Shahi <nshahi1998@gmail.com>"]
6
6
  license = "MIT"
File without changes
File without changes