|
5 | 5 |
|
6 | 6 | from hyperbrowser.display_utils import format_string_key_for_error |
7 | 7 | from hyperbrowser.exceptions import HyperbrowserError |
8 | | -from hyperbrowser.mapping_utils import copy_mapping_values_by_string_keys |
| 8 | +from hyperbrowser.mapping_utils import ( |
| 9 | + copy_mapping_values_by_string_keys, |
| 10 | + read_string_mapping_keys, |
| 11 | +) |
9 | 12 | from hyperbrowser.models.agents.browser_use import StartBrowserUseTaskParams |
10 | 13 | from hyperbrowser.models.crawl import StartCrawlJobParams |
11 | 14 | from hyperbrowser.models.extract import StartExtractJobParams |
@@ -60,20 +63,14 @@ def _format_tool_param_key_for_error(key: str) -> str: |
60 | 63 | def _normalize_extract_schema_mapping( |
61 | 64 | schema_value: MappingABC[object, Any], |
62 | 65 | ) -> Dict[str, Any]: |
63 | | - try: |
64 | | - schema_keys = list(schema_value.keys()) |
65 | | - except HyperbrowserError: |
66 | | - raise |
67 | | - except Exception as exc: |
68 | | - raise HyperbrowserError( |
69 | | - "Failed to read extract tool `schema` object keys", |
70 | | - original_error=exc, |
71 | | - ) from exc |
72 | | - normalized_schema_keys: list[str] = [] |
73 | | - for key in schema_keys: |
74 | | - if type(key) is not str: |
75 | | - raise HyperbrowserError("Extract tool `schema` object keys must be strings") |
76 | | - normalized_schema_keys.append(key) |
| 66 | + normalized_schema_keys = read_string_mapping_keys( |
| 67 | + schema_value, |
| 68 | + expected_mapping_error="Extract tool `schema` must be an object or JSON string", |
| 69 | + read_keys_error="Failed to read extract tool `schema` object keys", |
| 70 | + non_string_key_error_builder=lambda _key: ( |
| 71 | + "Extract tool `schema` object keys must be strings" |
| 72 | + ), |
| 73 | + ) |
77 | 74 | return copy_mapping_values_by_string_keys( |
78 | 75 | schema_value, |
79 | 76 | normalized_schema_keys, |
@@ -114,67 +111,58 @@ def _prepare_extract_tool_params(params: Mapping[str, Any]) -> Dict[str, Any]: |
114 | 111 |
|
115 | 112 |
|
116 | 113 | def _to_param_dict(params: Mapping[str, Any]) -> Dict[str, Any]: |
117 | | - if not isinstance(params, Mapping): |
118 | | - raise HyperbrowserError("tool params must be a mapping") |
119 | | - try: |
120 | | - param_keys = list(params.keys()) |
121 | | - except HyperbrowserError: |
122 | | - raise |
123 | | - except Exception as exc: |
124 | | - raise HyperbrowserError( |
125 | | - "Failed to read tool params keys", |
126 | | - original_error=exc, |
127 | | - ) from exc |
| 114 | + param_keys = read_string_mapping_keys( |
| 115 | + params, |
| 116 | + expected_mapping_error="tool params must be a mapping", |
| 117 | + read_keys_error="Failed to read tool params keys", |
| 118 | + non_string_key_error_builder=lambda _key: "tool params keys must be strings", |
| 119 | + ) |
128 | 120 | for key in param_keys: |
129 | | - if type(key) is str: |
130 | | - try: |
131 | | - normalized_key = key.strip() |
132 | | - if type(normalized_key) is not str: |
133 | | - raise TypeError("normalized tool param key must be a string") |
134 | | - is_empty_key = len(normalized_key) == 0 |
135 | | - except HyperbrowserError: |
136 | | - raise |
137 | | - except Exception as exc: |
138 | | - raise HyperbrowserError( |
139 | | - "Failed to normalize tool param key", |
140 | | - original_error=exc, |
141 | | - ) from exc |
142 | | - if is_empty_key: |
143 | | - raise HyperbrowserError("tool params keys must not be empty") |
144 | | - try: |
145 | | - has_surrounding_whitespace = key != normalized_key |
146 | | - except HyperbrowserError: |
147 | | - raise |
148 | | - except Exception as exc: |
149 | | - raise HyperbrowserError( |
150 | | - "Failed to normalize tool param key", |
151 | | - original_error=exc, |
152 | | - ) from exc |
153 | | - if has_surrounding_whitespace: |
154 | | - raise HyperbrowserError( |
155 | | - "tool params keys must not contain leading or trailing whitespace" |
156 | | - ) |
157 | | - try: |
158 | | - contains_control_character = any( |
159 | | - ord(character) < 32 or ord(character) == 127 for character in key |
160 | | - ) |
161 | | - except HyperbrowserError: |
162 | | - raise |
163 | | - except Exception as exc: |
164 | | - raise HyperbrowserError( |
165 | | - "Failed to validate tool param key characters", |
166 | | - original_error=exc, |
167 | | - ) from exc |
168 | | - if contains_control_character: |
169 | | - raise HyperbrowserError( |
170 | | - "tool params keys must not contain control characters" |
171 | | - ) |
172 | | - continue |
173 | | - raise HyperbrowserError("tool params keys must be strings") |
174 | | - normalized_param_keys = [key for key in param_keys if type(key) is str] |
| 121 | + try: |
| 122 | + normalized_key = key.strip() |
| 123 | + if type(normalized_key) is not str: |
| 124 | + raise TypeError("normalized tool param key must be a string") |
| 125 | + is_empty_key = len(normalized_key) == 0 |
| 126 | + except HyperbrowserError: |
| 127 | + raise |
| 128 | + except Exception as exc: |
| 129 | + raise HyperbrowserError( |
| 130 | + "Failed to normalize tool param key", |
| 131 | + original_error=exc, |
| 132 | + ) from exc |
| 133 | + if is_empty_key: |
| 134 | + raise HyperbrowserError("tool params keys must not be empty") |
| 135 | + try: |
| 136 | + has_surrounding_whitespace = key != normalized_key |
| 137 | + except HyperbrowserError: |
| 138 | + raise |
| 139 | + except Exception as exc: |
| 140 | + raise HyperbrowserError( |
| 141 | + "Failed to normalize tool param key", |
| 142 | + original_error=exc, |
| 143 | + ) from exc |
| 144 | + if has_surrounding_whitespace: |
| 145 | + raise HyperbrowserError( |
| 146 | + "tool params keys must not contain leading or trailing whitespace" |
| 147 | + ) |
| 148 | + try: |
| 149 | + contains_control_character = any( |
| 150 | + ord(character) < 32 or ord(character) == 127 for character in key |
| 151 | + ) |
| 152 | + except HyperbrowserError: |
| 153 | + raise |
| 154 | + except Exception as exc: |
| 155 | + raise HyperbrowserError( |
| 156 | + "Failed to validate tool param key characters", |
| 157 | + original_error=exc, |
| 158 | + ) from exc |
| 159 | + if contains_control_character: |
| 160 | + raise HyperbrowserError( |
| 161 | + "tool params keys must not contain control characters" |
| 162 | + ) |
175 | 163 | return copy_mapping_values_by_string_keys( |
176 | 164 | params, |
177 | | - normalized_param_keys, |
| 165 | + param_keys, |
178 | 166 | read_value_error_builder=lambda key_display: ( |
179 | 167 | f"Failed to read tool param '{key_display}'" |
180 | 168 | ), |
|
0 commit comments