Skip to content

Commit 8c38292

Browse files
Adopt shared response parser across remaining managers
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 6e06ea8 commit 8c38292

23 files changed

Lines changed: 682 additions & 78 deletions

hyperbrowser/client/managers/async_manager/agents/browser_use.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from hyperbrowser.exceptions import HyperbrowserError
44
from ....polling import build_operation_name, wait_for_job_result_async
55
from ....schema_utils import resolve_schema_input
6+
from ...response_utils import parse_response_model
67

78
from .....models import (
89
POLLING_ATTEMPTS,
@@ -30,25 +31,41 @@ async def start(
3031
self._client._build_url("/task/browser-use"),
3132
data=payload,
3233
)
33-
return StartBrowserUseTaskResponse(**response.data)
34+
return parse_response_model(
35+
response.data,
36+
model=StartBrowserUseTaskResponse,
37+
operation_name="browser-use start",
38+
)
3439

3540
async def get(self, job_id: str) -> BrowserUseTaskResponse:
3641
response = await self._client.transport.get(
3742
self._client._build_url(f"/task/browser-use/{job_id}")
3843
)
39-
return BrowserUseTaskResponse(**response.data)
44+
return parse_response_model(
45+
response.data,
46+
model=BrowserUseTaskResponse,
47+
operation_name="browser-use task",
48+
)
4049

4150
async def get_status(self, job_id: str) -> BrowserUseTaskStatusResponse:
4251
response = await self._client.transport.get(
4352
self._client._build_url(f"/task/browser-use/{job_id}/status")
4453
)
45-
return BrowserUseTaskStatusResponse(**response.data)
54+
return parse_response_model(
55+
response.data,
56+
model=BrowserUseTaskStatusResponse,
57+
operation_name="browser-use task status",
58+
)
4659

4760
async def stop(self, job_id: str) -> BasicResponse:
4861
response = await self._client.transport.put(
4962
self._client._build_url(f"/task/browser-use/{job_id}/stop")
5063
)
51-
return BasicResponse(**response.data)
64+
return parse_response_model(
65+
response.data,
66+
model=BasicResponse,
67+
operation_name="browser-use task stop",
68+
)
5269

5370
async def start_and_wait(
5471
self,

hyperbrowser/client/managers/async_manager/agents/claude_computer_use.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from hyperbrowser.exceptions import HyperbrowserError
44
from ....polling import build_operation_name, wait_for_job_result_async
5+
from ...response_utils import parse_response_model
56

67
from .....models import (
78
POLLING_ATTEMPTS,
@@ -24,25 +25,41 @@ async def start(
2425
self._client._build_url("/task/claude-computer-use"),
2526
data=params.model_dump(exclude_none=True, by_alias=True),
2627
)
27-
return StartClaudeComputerUseTaskResponse(**response.data)
28+
return parse_response_model(
29+
response.data,
30+
model=StartClaudeComputerUseTaskResponse,
31+
operation_name="claude computer use start",
32+
)
2833

2934
async def get(self, job_id: str) -> ClaudeComputerUseTaskResponse:
3035
response = await self._client.transport.get(
3136
self._client._build_url(f"/task/claude-computer-use/{job_id}")
3237
)
33-
return ClaudeComputerUseTaskResponse(**response.data)
38+
return parse_response_model(
39+
response.data,
40+
model=ClaudeComputerUseTaskResponse,
41+
operation_name="claude computer use task",
42+
)
3443

3544
async def get_status(self, job_id: str) -> ClaudeComputerUseTaskStatusResponse:
3645
response = await self._client.transport.get(
3746
self._client._build_url(f"/task/claude-computer-use/{job_id}/status")
3847
)
39-
return ClaudeComputerUseTaskStatusResponse(**response.data)
48+
return parse_response_model(
49+
response.data,
50+
model=ClaudeComputerUseTaskStatusResponse,
51+
operation_name="claude computer use task status",
52+
)
4053

4154
async def stop(self, job_id: str) -> BasicResponse:
4255
response = await self._client.transport.put(
4356
self._client._build_url(f"/task/claude-computer-use/{job_id}/stop")
4457
)
45-
return BasicResponse(**response.data)
58+
return parse_response_model(
59+
response.data,
60+
model=BasicResponse,
61+
operation_name="claude computer use task stop",
62+
)
4663

4764
async def start_and_wait(
4865
self,

hyperbrowser/client/managers/async_manager/agents/cua.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from hyperbrowser.exceptions import HyperbrowserError
44
from ....polling import build_operation_name, wait_for_job_result_async
5+
from ...response_utils import parse_response_model
56

67
from .....models import (
78
POLLING_ATTEMPTS,
@@ -22,25 +23,41 @@ async def start(self, params: StartCuaTaskParams) -> StartCuaTaskResponse:
2223
self._client._build_url("/task/cua"),
2324
data=params.model_dump(exclude_none=True, by_alias=True),
2425
)
25-
return StartCuaTaskResponse(**response.data)
26+
return parse_response_model(
27+
response.data,
28+
model=StartCuaTaskResponse,
29+
operation_name="cua start",
30+
)
2631

2732
async def get(self, job_id: str) -> CuaTaskResponse:
2833
response = await self._client.transport.get(
2934
self._client._build_url(f"/task/cua/{job_id}")
3035
)
31-
return CuaTaskResponse(**response.data)
36+
return parse_response_model(
37+
response.data,
38+
model=CuaTaskResponse,
39+
operation_name="cua task",
40+
)
3241

3342
async def get_status(self, job_id: str) -> CuaTaskStatusResponse:
3443
response = await self._client.transport.get(
3544
self._client._build_url(f"/task/cua/{job_id}/status")
3645
)
37-
return CuaTaskStatusResponse(**response.data)
46+
return parse_response_model(
47+
response.data,
48+
model=CuaTaskStatusResponse,
49+
operation_name="cua task status",
50+
)
3851

3952
async def stop(self, job_id: str) -> BasicResponse:
4053
response = await self._client.transport.put(
4154
self._client._build_url(f"/task/cua/{job_id}/stop")
4255
)
43-
return BasicResponse(**response.data)
56+
return parse_response_model(
57+
response.data,
58+
model=BasicResponse,
59+
operation_name="cua task stop",
60+
)
4461

4562
async def start_and_wait(
4663
self,

hyperbrowser/client/managers/async_manager/agents/gemini_computer_use.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from hyperbrowser.exceptions import HyperbrowserError
44
from ....polling import build_operation_name, wait_for_job_result_async
5+
from ...response_utils import parse_response_model
56

67
from .....models import (
78
POLLING_ATTEMPTS,
@@ -24,25 +25,41 @@ async def start(
2425
self._client._build_url("/task/gemini-computer-use"),
2526
data=params.model_dump(exclude_none=True, by_alias=True),
2627
)
27-
return StartGeminiComputerUseTaskResponse(**response.data)
28+
return parse_response_model(
29+
response.data,
30+
model=StartGeminiComputerUseTaskResponse,
31+
operation_name="gemini computer use start",
32+
)
2833

2934
async def get(self, job_id: str) -> GeminiComputerUseTaskResponse:
3035
response = await self._client.transport.get(
3136
self._client._build_url(f"/task/gemini-computer-use/{job_id}")
3237
)
33-
return GeminiComputerUseTaskResponse(**response.data)
38+
return parse_response_model(
39+
response.data,
40+
model=GeminiComputerUseTaskResponse,
41+
operation_name="gemini computer use task",
42+
)
3443

3544
async def get_status(self, job_id: str) -> GeminiComputerUseTaskStatusResponse:
3645
response = await self._client.transport.get(
3746
self._client._build_url(f"/task/gemini-computer-use/{job_id}/status")
3847
)
39-
return GeminiComputerUseTaskStatusResponse(**response.data)
48+
return parse_response_model(
49+
response.data,
50+
model=GeminiComputerUseTaskStatusResponse,
51+
operation_name="gemini computer use task status",
52+
)
4053

4154
async def stop(self, job_id: str) -> BasicResponse:
4255
response = await self._client.transport.put(
4356
self._client._build_url(f"/task/gemini-computer-use/{job_id}/stop")
4457
)
45-
return BasicResponse(**response.data)
58+
return parse_response_model(
59+
response.data,
60+
model=BasicResponse,
61+
operation_name="gemini computer use task stop",
62+
)
4663

4764
async def start_and_wait(
4865
self,

hyperbrowser/client/managers/async_manager/agents/hyper_agent.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from hyperbrowser.exceptions import HyperbrowserError
44
from ....polling import build_operation_name, wait_for_job_result_async
5+
from ...response_utils import parse_response_model
56

67
from .....models import (
78
POLLING_ATTEMPTS,
@@ -24,25 +25,41 @@ async def start(
2425
self._client._build_url("/task/hyper-agent"),
2526
data=params.model_dump(exclude_none=True, by_alias=True),
2627
)
27-
return StartHyperAgentTaskResponse(**response.data)
28+
return parse_response_model(
29+
response.data,
30+
model=StartHyperAgentTaskResponse,
31+
operation_name="hyper agent start",
32+
)
2833

2934
async def get(self, job_id: str) -> HyperAgentTaskResponse:
3035
response = await self._client.transport.get(
3136
self._client._build_url(f"/task/hyper-agent/{job_id}")
3237
)
33-
return HyperAgentTaskResponse(**response.data)
38+
return parse_response_model(
39+
response.data,
40+
model=HyperAgentTaskResponse,
41+
operation_name="hyper agent task",
42+
)
3443

3544
async def get_status(self, job_id: str) -> HyperAgentTaskStatusResponse:
3645
response = await self._client.transport.get(
3746
self._client._build_url(f"/task/hyper-agent/{job_id}/status")
3847
)
39-
return HyperAgentTaskStatusResponse(**response.data)
48+
return parse_response_model(
49+
response.data,
50+
model=HyperAgentTaskStatusResponse,
51+
operation_name="hyper agent task status",
52+
)
4053

4154
async def stop(self, job_id: str) -> BasicResponse:
4255
response = await self._client.transport.put(
4356
self._client._build_url(f"/task/hyper-agent/{job_id}/stop")
4457
)
45-
return BasicResponse(**response.data)
58+
return parse_response_model(
59+
response.data,
60+
model=BasicResponse,
61+
operation_name="hyper agent task stop",
62+
)
4663

4764
async def start_and_wait(
4865
self,

hyperbrowser/client/managers/async_manager/crawl.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
poll_until_terminal_status_async,
99
retry_operation_async,
1010
)
11+
from ..response_utils import parse_response_model
1112
from ....models.crawl import (
1213
CrawlJobResponse,
1314
CrawlJobStatusResponse,
@@ -27,13 +28,21 @@ async def start(self, params: StartCrawlJobParams) -> StartCrawlJobResponse:
2728
self._client._build_url("/crawl"),
2829
data=params.model_dump(exclude_none=True, by_alias=True),
2930
)
30-
return StartCrawlJobResponse(**response.data)
31+
return parse_response_model(
32+
response.data,
33+
model=StartCrawlJobResponse,
34+
operation_name="crawl start",
35+
)
3136

3237
async def get_status(self, job_id: str) -> CrawlJobStatusResponse:
3338
response = await self._client.transport.get(
3439
self._client._build_url(f"/crawl/{job_id}/status")
3540
)
36-
return CrawlJobStatusResponse(**response.data)
41+
return parse_response_model(
42+
response.data,
43+
model=CrawlJobStatusResponse,
44+
operation_name="crawl status",
45+
)
3746

3847
async def get(
3948
self, job_id: str, params: Optional[GetCrawlJobParams] = None
@@ -43,7 +52,11 @@ async def get(
4352
self._client._build_url(f"/crawl/{job_id}"),
4453
params=params_obj.model_dump(exclude_none=True, by_alias=True),
4554
)
46-
return CrawlJobResponse(**response.data)
55+
return parse_response_model(
56+
response.data,
57+
model=CrawlJobResponse,
58+
operation_name="crawl job",
59+
)
4760

4861
async def start_and_wait(
4962
self,

hyperbrowser/client/managers/async_manager/extension.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from hyperbrowser.exceptions import HyperbrowserError
44
from ...file_utils import ensure_existing_file_path
55
from ..extension_utils import parse_extension_list_response_data
6+
from ..response_utils import parse_response_model
67
from hyperbrowser.models.extension import CreateExtensionParams, ExtensionResponse
78

89

@@ -35,7 +36,11 @@ async def create(self, params: CreateExtensionParams) -> ExtensionResponse:
3536
f"Failed to open extension file at path: {file_path}",
3637
original_error=exc,
3738
) from exc
38-
return ExtensionResponse(**response.data)
39+
return parse_response_model(
40+
response.data,
41+
model=ExtensionResponse,
42+
operation_name="create extension",
43+
)
3944

4045
async def list(self) -> List[ExtensionResponse]:
4146
response = await self._client.transport.get(

hyperbrowser/client/managers/async_manager/extract.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
)
1111
from ...polling import build_operation_name, wait_for_job_result_async
1212
from ...schema_utils import resolve_schema_input
13+
from ..response_utils import parse_response_model
1314

1415

1516
class ExtractManager:
@@ -28,19 +29,31 @@ async def start(self, params: StartExtractJobParams) -> StartExtractJobResponse:
2829
self._client._build_url("/extract"),
2930
data=payload,
3031
)
31-
return StartExtractJobResponse(**response.data)
32+
return parse_response_model(
33+
response.data,
34+
model=StartExtractJobResponse,
35+
operation_name="extract start",
36+
)
3237

3338
async def get_status(self, job_id: str) -> ExtractJobStatusResponse:
3439
response = await self._client.transport.get(
3540
self._client._build_url(f"/extract/{job_id}/status")
3641
)
37-
return ExtractJobStatusResponse(**response.data)
42+
return parse_response_model(
43+
response.data,
44+
model=ExtractJobStatusResponse,
45+
operation_name="extract status",
46+
)
3847

3948
async def get(self, job_id: str) -> ExtractJobResponse:
4049
response = await self._client.transport.get(
4150
self._client._build_url(f"/extract/{job_id}")
4251
)
43-
return ExtractJobResponse(**response.data)
52+
return parse_response_model(
53+
response.data,
54+
model=ExtractJobResponse,
55+
operation_name="extract job",
56+
)
4457

4558
async def start_and_wait(
4659
self,

0 commit comments

Comments
 (0)