Skip to content

Commit a8dcf47

Browse files
Centralize schema preprocessing for manager payloads
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 58cb5d3 commit a8dcf47

File tree

11 files changed

+64
-92
lines changed

11 files changed

+64
-92
lines changed

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import jsonref
21
from typing import Optional
32

43
from hyperbrowser.exceptions import HyperbrowserError
54
from ....polling import poll_until_terminal_status_async, retry_operation_async
5+
from ....schema_utils import resolve_schema_input
66

77
from .....models import (
88
POLLING_ATTEMPTS,
@@ -22,13 +22,9 @@ async def start(
2222
self, params: StartBrowserUseTaskParams
2323
) -> StartBrowserUseTaskResponse:
2424
payload = params.model_dump(exclude_none=True, by_alias=True)
25-
if params.output_model_schema and hasattr(
26-
params.output_model_schema, "model_json_schema"
27-
):
28-
payload["outputModelSchema"] = jsonref.replace_refs(
29-
params.output_model_schema.model_json_schema(),
30-
proxies=False,
31-
lazy_load=False,
25+
if params.output_model_schema:
26+
payload["outputModelSchema"] = resolve_schema_input(
27+
params.output_model_schema
3228
)
3329
response = await self._client.transport.post(
3430
self._client._build_url("/task/browser-use"),

hyperbrowser/client/managers/async_manager/extract.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
StartExtractJobParams,
99
StartExtractJobResponse,
1010
)
11-
import jsonref
1211
from ...polling import poll_until_terminal_status_async, retry_operation_async
12+
from ...schema_utils import resolve_schema_input
1313

1414

1515
class ExtractManager:
@@ -21,10 +21,8 @@ async def start(self, params: StartExtractJobParams) -> StartExtractJobResponse:
2121
raise HyperbrowserError("Either schema or prompt must be provided")
2222

2323
payload = params.model_dump(exclude_none=True, by_alias=True)
24-
if params.schema_ and hasattr(params.schema_, "model_json_schema"):
25-
payload["schema"] = jsonref.replace_refs(
26-
params.schema_.model_json_schema(), proxies=False, lazy_load=False
27-
)
24+
if params.schema_:
25+
payload["schema"] = resolve_schema_input(params.schema_)
2826

2927
response = await self._client.transport.post(
3028
self._client._build_url("/extract"),

hyperbrowser/client/managers/async_manager/web/__init__.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@
33
from hyperbrowser.models import (
44
FetchParams,
55
FetchResponse,
6-
FetchOutputJson,
76
WebSearchParams,
87
WebSearchResponse,
98
)
10-
import jsonref
9+
from ....schema_utils import inject_web_output_schemas
1110

1211

1312
class WebManager:
@@ -18,15 +17,9 @@ def __init__(self, client):
1817

1918
async def fetch(self, params: FetchParams) -> FetchResponse:
2019
payload = params.model_dump(exclude_none=True, by_alias=True)
21-
if params.outputs and params.outputs.formats:
22-
for index, output in enumerate(params.outputs.formats):
23-
if isinstance(output, FetchOutputJson) and output.schema_:
24-
if hasattr(output.schema_, "model_json_schema"):
25-
payload["outputs"]["formats"][index]["schema"] = jsonref.replace_refs(
26-
output.schema_.model_json_schema(),
27-
proxies=False,
28-
lazy_load=False,
29-
)
20+
inject_web_output_schemas(
21+
payload, params.outputs.formats if params.outputs else None
22+
)
3023

3124
response = await self._client.transport.post(
3225
self._client._build_url("/web/fetch"),

hyperbrowser/client/managers/async_manager/web/batch_fetch.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,16 @@
77
GetBatchFetchJobParams,
88
BatchFetchJobResponse,
99
POLLING_ATTEMPTS,
10-
FetchOutputJson,
1110
)
1211
from hyperbrowser.exceptions import HyperbrowserError
1312
from ....polling import (
1413
has_exceeded_max_wait,
1514
poll_until_terminal_status_async,
1615
retry_operation_async,
1716
)
17+
from ....schema_utils import inject_web_output_schemas
1818
import asyncio
1919
import time
20-
import jsonref
2120

2221

2322
class BatchFetchManager:
@@ -28,15 +27,9 @@ async def start(
2827
self, params: StartBatchFetchJobParams
2928
) -> StartBatchFetchJobResponse:
3029
payload = params.model_dump(exclude_none=True, by_alias=True)
31-
if params.outputs and params.outputs.formats:
32-
for index, output in enumerate(params.outputs.formats):
33-
if isinstance(output, FetchOutputJson) and output.schema_:
34-
if hasattr(output.schema_, "model_json_schema"):
35-
payload["outputs"]["formats"][index]["schema"] = jsonref.replace_refs(
36-
output.schema_.model_json_schema(),
37-
proxies=False,
38-
lazy_load=False,
39-
)
30+
inject_web_output_schemas(
31+
payload, params.outputs.formats if params.outputs else None
32+
)
4033

4134
response = await self._client.transport.post(
4235
self._client._build_url("/web/batch-fetch"),

hyperbrowser/client/managers/async_manager/web/crawl.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,16 @@
77
GetWebCrawlJobParams,
88
WebCrawlJobResponse,
99
POLLING_ATTEMPTS,
10-
FetchOutputJson,
1110
)
1211
from hyperbrowser.exceptions import HyperbrowserError
1312
from ....polling import (
1413
has_exceeded_max_wait,
1514
poll_until_terminal_status_async,
1615
retry_operation_async,
1716
)
17+
from ....schema_utils import inject_web_output_schemas
1818
import asyncio
1919
import time
20-
import jsonref
2120

2221

2322
class WebCrawlManager:
@@ -26,15 +25,9 @@ def __init__(self, client):
2625

2726
async def start(self, params: StartWebCrawlJobParams) -> StartWebCrawlJobResponse:
2827
payload = params.model_dump(exclude_none=True, by_alias=True)
29-
if params.outputs and params.outputs.formats:
30-
for index, output in enumerate(params.outputs.formats):
31-
if isinstance(output, FetchOutputJson) and output.schema_:
32-
if hasattr(output.schema_, "model_json_schema"):
33-
payload["outputs"]["formats"][index]["schema"] = jsonref.replace_refs(
34-
output.schema_.model_json_schema(),
35-
proxies=False,
36-
lazy_load=False,
37-
)
28+
inject_web_output_schemas(
29+
payload, params.outputs.formats if params.outputs else None
30+
)
3831

3932
response = await self._client.transport.post(
4033
self._client._build_url("/web/crawl"),

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import jsonref
21
from typing import Optional
32

43
from hyperbrowser.exceptions import HyperbrowserError
54
from ....polling import poll_until_terminal_status, retry_operation
5+
from ....schema_utils import resolve_schema_input
66

77
from .....models import (
88
POLLING_ATTEMPTS,
@@ -20,13 +20,9 @@ def __init__(self, client):
2020

2121
def start(self, params: StartBrowserUseTaskParams) -> StartBrowserUseTaskResponse:
2222
payload = params.model_dump(exclude_none=True, by_alias=True)
23-
if params.output_model_schema and hasattr(
24-
params.output_model_schema, "model_json_schema"
25-
):
26-
payload["outputModelSchema"] = jsonref.replace_refs(
27-
params.output_model_schema.model_json_schema(),
28-
proxies=False,
29-
lazy_load=False,
23+
if params.output_model_schema:
24+
payload["outputModelSchema"] = resolve_schema_input(
25+
params.output_model_schema
3026
)
3127
response = self._client.transport.post(
3228
self._client._build_url("/task/browser-use"),

hyperbrowser/client/managers/sync_manager/extract.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
StartExtractJobParams,
99
StartExtractJobResponse,
1010
)
11-
import jsonref
1211
from ...polling import poll_until_terminal_status, retry_operation
12+
from ...schema_utils import resolve_schema_input
1313

1414

1515
class ExtractManager:
@@ -21,10 +21,8 @@ def start(self, params: StartExtractJobParams) -> StartExtractJobResponse:
2121
raise HyperbrowserError("Either schema or prompt must be provided")
2222

2323
payload = params.model_dump(exclude_none=True, by_alias=True)
24-
if params.schema_ and hasattr(params.schema_, "model_json_schema"):
25-
payload["schema"] = jsonref.replace_refs(
26-
params.schema_.model_json_schema(), proxies=False, lazy_load=False
27-
)
24+
if params.schema_:
25+
payload["schema"] = resolve_schema_input(params.schema_)
2826

2927
response = self._client.transport.post(
3028
self._client._build_url("/extract"),

hyperbrowser/client/managers/sync_manager/web/__init__.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@
33
from hyperbrowser.models import (
44
FetchParams,
55
FetchResponse,
6-
FetchOutputJson,
76
WebSearchParams,
87
WebSearchResponse,
98
)
10-
import jsonref
9+
from ....schema_utils import inject_web_output_schemas
1110

1211

1312
class WebManager:
@@ -18,15 +17,9 @@ def __init__(self, client):
1817

1918
def fetch(self, params: FetchParams) -> FetchResponse:
2019
payload = params.model_dump(exclude_none=True, by_alias=True)
21-
if params.outputs and params.outputs.formats:
22-
for index, output in enumerate(params.outputs.formats):
23-
if isinstance(output, FetchOutputJson) and output.schema_:
24-
if hasattr(output.schema_, "model_json_schema"):
25-
payload["outputs"]["formats"][index]["schema"] = jsonref.replace_refs(
26-
output.schema_.model_json_schema(),
27-
proxies=False,
28-
lazy_load=False,
29-
)
20+
inject_web_output_schemas(
21+
payload, params.outputs.formats if params.outputs else None
22+
)
3023

3124
response = self._client.transport.post(
3225
self._client._build_url("/web/fetch"),

hyperbrowser/client/managers/sync_manager/web/batch_fetch.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,15 @@
77
GetBatchFetchJobParams,
88
BatchFetchJobResponse,
99
POLLING_ATTEMPTS,
10-
FetchOutputJson,
1110
)
1211
from hyperbrowser.exceptions import HyperbrowserError
1312
from ....polling import (
1413
has_exceeded_max_wait,
1514
poll_until_terminal_status,
1615
retry_operation,
1716
)
17+
from ....schema_utils import inject_web_output_schemas
1818
import time
19-
import jsonref
2019

2120

2221
class BatchFetchManager:
@@ -25,15 +24,9 @@ def __init__(self, client):
2524

2625
def start(self, params: StartBatchFetchJobParams) -> StartBatchFetchJobResponse:
2726
payload = params.model_dump(exclude_none=True, by_alias=True)
28-
if params.outputs and params.outputs.formats:
29-
for index, output in enumerate(params.outputs.formats):
30-
if isinstance(output, FetchOutputJson) and output.schema_:
31-
if hasattr(output.schema_, "model_json_schema"):
32-
payload["outputs"]["formats"][index]["schema"] = jsonref.replace_refs(
33-
output.schema_.model_json_schema(),
34-
proxies=False,
35-
lazy_load=False,
36-
)
27+
inject_web_output_schemas(
28+
payload, params.outputs.formats if params.outputs else None
29+
)
3730

3831
response = self._client.transport.post(
3932
self._client._build_url("/web/batch-fetch"),

hyperbrowser/client/managers/sync_manager/web/crawl.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,15 @@
77
GetWebCrawlJobParams,
88
WebCrawlJobResponse,
99
POLLING_ATTEMPTS,
10-
FetchOutputJson,
1110
)
1211
from hyperbrowser.exceptions import HyperbrowserError
1312
from ....polling import (
1413
has_exceeded_max_wait,
1514
poll_until_terminal_status,
1615
retry_operation,
1716
)
17+
from ....schema_utils import inject_web_output_schemas
1818
import time
19-
import jsonref
2019

2120

2221
class WebCrawlManager:
@@ -25,15 +24,9 @@ def __init__(self, client):
2524

2625
def start(self, params: StartWebCrawlJobParams) -> StartWebCrawlJobResponse:
2726
payload = params.model_dump(exclude_none=True, by_alias=True)
28-
if params.outputs and params.outputs.formats:
29-
for index, output in enumerate(params.outputs.formats):
30-
if isinstance(output, FetchOutputJson) and output.schema_:
31-
if hasattr(output.schema_, "model_json_schema"):
32-
payload["outputs"]["formats"][index]["schema"] = jsonref.replace_refs(
33-
output.schema_.model_json_schema(),
34-
proxies=False,
35-
lazy_load=False,
36-
)
27+
inject_web_output_schemas(
28+
payload, params.outputs.formats if params.outputs else None
29+
)
3730

3831
response = self._client.transport.post(
3932
self._client._build_url("/web/crawl"),

0 commit comments

Comments
 (0)