openparser-sdk 0.0.1__py3-none-any.whl

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 openparser-sdk might be problematic. Click here for more details.

Files changed (173) hide show
  1. openparser/__init__.py +54 -0
  2. openparser/_files.py +43 -0
  3. openparser/_generated/__init__.py +8 -0
  4. openparser/_generated/api/__init__.py +1 -0
  5. openparser/_generated/api/extract/__init__.py +1 -0
  6. openparser/_generated/api/extract/extract_async.py +280 -0
  7. openparser/_generated/api/extract/extract_batch.py +284 -0
  8. openparser/_generated/api/extract/extract_sync.py +315 -0
  9. openparser/_generated/api/extract/suggest_schema.py +260 -0
  10. openparser/_generated/api/files/__init__.py +1 -0
  11. openparser/_generated/api/files/create_file.py +237 -0
  12. openparser/_generated/api/files/delete_file.py +200 -0
  13. openparser/_generated/api/files/get_file.py +200 -0
  14. openparser/_generated/api/files/get_file_content.py +198 -0
  15. openparser/_generated/api/jobs/__init__.py +1 -0
  16. openparser/_generated/api/jobs/get_job.py +261 -0
  17. openparser/_generated/api/jobs/get_job_result.py +305 -0
  18. openparser/_generated/api/jobs/get_job_source.py +233 -0
  19. openparser/_generated/api/jobs/list_jobs.py +340 -0
  20. openparser/_generated/api/models/__init__.py +1 -0
  21. openparser/_generated/api/models/list_llm_models.py +288 -0
  22. openparser/_generated/api/models/list_ocr_models.py +184 -0
  23. openparser/_generated/api/parse/__init__.py +1 -0
  24. openparser/_generated/api/parse/parse_async.py +316 -0
  25. openparser/_generated/api/parse/parse_batch.py +280 -0
  26. openparser/_generated/api/parse/parse_sync.py +369 -0
  27. openparser/_generated/api/pipelines/__init__.py +1 -0
  28. openparser/_generated/api/pipelines/create_extraction_pipeline.py +242 -0
  29. openparser/_generated/api/pipelines/delete_extraction_pipeline.py +212 -0
  30. openparser/_generated/api/pipelines/get_extraction_pipeline.py +212 -0
  31. openparser/_generated/api/pipelines/list_extraction_pipelines.py +180 -0
  32. openparser/_generated/api/pipelines/update_extraction_pipeline.py +258 -0
  33. openparser/_generated/client.py +270 -0
  34. openparser/_generated/errors.py +14 -0
  35. openparser/_generated/models/__init__.py +261 -0
  36. openparser/_generated/models/batch_child_page.py +97 -0
  37. openparser/_generated/models/batch_child_summary.py +195 -0
  38. openparser/_generated/models/batch_job_accepted.py +139 -0
  39. openparser/_generated/models/batch_job_accepted_operation.py +8 -0
  40. openparser/_generated/models/batch_summary_counts.py +97 -0
  41. openparser/_generated/models/bounding_box.py +82 -0
  42. openparser/_generated/models/chunk_provenance_span.py +97 -0
  43. openparser/_generated/models/content_kind.py +10 -0
  44. openparser/_generated/models/create_extraction_pipeline_request.py +177 -0
  45. openparser/_generated/models/create_extraction_pipeline_request_grounding.py +8 -0
  46. openparser/_generated/models/create_extraction_pipeline_request_llm_options.py +84 -0
  47. openparser/_generated/models/create_extraction_pipeline_request_llm_options_reasoning_effort_type_1.py +13 -0
  48. openparser/_generated/models/create_extraction_pipeline_request_ocr_options.py +78 -0
  49. openparser/_generated/models/create_extraction_pipeline_request_schema.py +68 -0
  50. openparser/_generated/models/create_file_body.py +78 -0
  51. openparser/_generated/models/delete_extraction_pipeline_response.py +66 -0
  52. openparser/_generated/models/delete_file_response.py +57 -0
  53. openparser/_generated/models/error_body.py +106 -0
  54. openparser/_generated/models/error_body_details.py +65 -0
  55. openparser/_generated/models/error_response.py +65 -0
  56. openparser/_generated/models/extract_async_body.py +136 -0
  57. openparser/_generated/models/extract_batch_body.py +143 -0
  58. openparser/_generated/models/extract_batch_item.py +207 -0
  59. openparser/_generated/models/extract_batch_item_grounding.py +8 -0
  60. openparser/_generated/models/extract_batch_item_llm_options.py +84 -0
  61. openparser/_generated/models/extract_batch_item_llm_options_reasoning_effort_type_1.py +13 -0
  62. openparser/_generated/models/extract_batch_item_ocr_options.py +78 -0
  63. openparser/_generated/models/extract_batch_item_schema.py +65 -0
  64. openparser/_generated/models/extract_batch_request.py +99 -0
  65. openparser/_generated/models/extract_batch_request_items_item.py +201 -0
  66. openparser/_generated/models/extract_batch_request_items_item_grounding.py +8 -0
  67. openparser/_generated/models/extract_batch_request_items_item_llm_options.py +84 -0
  68. openparser/_generated/models/extract_batch_request_items_item_llm_options_reasoning_effort_type_1.py +13 -0
  69. openparser/_generated/models/extract_batch_request_items_item_ocr_options.py +78 -0
  70. openparser/_generated/models/extract_batch_request_items_item_schema.py +65 -0
  71. openparser/_generated/models/extract_batch_request_output_format.py +8 -0
  72. openparser/_generated/models/extract_request.py +226 -0
  73. openparser/_generated/models/extract_request_grounding.py +8 -0
  74. openparser/_generated/models/extract_request_llm_options.py +84 -0
  75. openparser/_generated/models/extract_request_llm_options_reasoning_effort_type_1.py +13 -0
  76. openparser/_generated/models/extract_request_ocr_options.py +78 -0
  77. openparser/_generated/models/extract_request_output_format.py +8 -0
  78. openparser/_generated/models/extract_request_schema.py +65 -0
  79. openparser/_generated/models/extract_sync_body.py +136 -0
  80. openparser/_generated/models/extraction_attempt.py +122 -0
  81. openparser/_generated/models/extraction_attempt_kind.py +8 -0
  82. openparser/_generated/models/extraction_attempt_status.py +9 -0
  83. openparser/_generated/models/extraction_chunk.py +184 -0
  84. openparser/_generated/models/extraction_citation.py +169 -0
  85. openparser/_generated/models/extraction_citation_granularity.py +8 -0
  86. openparser/_generated/models/extraction_citation_source_type.py +16 -0
  87. openparser/_generated/models/extraction_grounding_field.py +102 -0
  88. openparser/_generated/models/extraction_grounding_mode.py +8 -0
  89. openparser/_generated/models/extraction_grounding_result.py +87 -0
  90. openparser/_generated/models/extraction_pipeline.py +201 -0
  91. openparser/_generated/models/extraction_pipeline_list_response.py +76 -0
  92. openparser/_generated/models/extraction_pipeline_llm_options.py +84 -0
  93. openparser/_generated/models/extraction_pipeline_llm_options_reasoning_effort_type_0_type_1.py +13 -0
  94. openparser/_generated/models/extraction_pipeline_ocr_options.py +73 -0
  95. openparser/_generated/models/extraction_pipeline_schema.py +67 -0
  96. openparser/_generated/models/extraction_terminal_result.py +206 -0
  97. openparser/_generated/models/extraction_terminal_result_reasoning_effort_type_0.py +13 -0
  98. openparser/_generated/models/extraction_usage_totals.py +80 -0
  99. openparser/_generated/models/job.py +437 -0
  100. openparser/_generated/models/job_accepted.py +131 -0
  101. openparser/_generated/models/job_accepted_operation.py +8 -0
  102. openparser/_generated/models/job_extraction_schema.py +65 -0
  103. openparser/_generated/models/job_failure.py +98 -0
  104. openparser/_generated/models/job_failure_details.py +65 -0
  105. openparser/_generated/models/job_list_response.py +91 -0
  106. openparser/_generated/models/job_operation.py +10 -0
  107. openparser/_generated/models/job_progress.py +68 -0
  108. openparser/_generated/models/job_related_extractions_item.py +145 -0
  109. openparser/_generated/models/job_status.py +11 -0
  110. openparser/_generated/models/job_summary.py +264 -0
  111. openparser/_generated/models/json_schema_object.py +66 -0
  112. openparser/_generated/models/list_llm_models_mode.py +8 -0
  113. openparser/_generated/models/ocr_llm_model_catalog_entry.py +257 -0
  114. openparser/_generated/models/ocr_llm_model_catalog_entry_pricing.py +76 -0
  115. openparser/_generated/models/ocr_llm_model_catalog_entry_reasoning_type_0.py +134 -0
  116. openparser/_generated/models/ocr_llm_model_catalog_entry_reasoning_type_0_default_effort_type_0.py +13 -0
  117. openparser/_generated/models/ocr_llm_model_catalog_entry_reasoning_type_0_supported_efforts_type_0_item.py +13 -0
  118. openparser/_generated/models/ocr_llm_model_catalog_entry_recommendation.py +8 -0
  119. openparser/_generated/models/ocr_llm_models_response.py +150 -0
  120. openparser/_generated/models/ocr_llm_models_response_mode.py +8 -0
  121. openparser/_generated/models/ocr_model.py +7 -0
  122. openparser/_generated/models/ocr_model_catalog_entry.py +131 -0
  123. openparser/_generated/models/ocr_model_catalog_entry_availability.py +9 -0
  124. openparser/_generated/models/ocr_model_catalog_entry_capabilities.py +97 -0
  125. openparser/_generated/models/ocr_model_catalog_entry_capabilities_options.py +73 -0
  126. openparser/_generated/models/ocr_model_catalog_entry_option_defaults.py +73 -0
  127. openparser/_generated/models/ocr_model_catalog_entry_pricing.py +68 -0
  128. openparser/_generated/models/ocr_models_response.py +76 -0
  129. openparser/_generated/models/ocr_output_format.py +8 -0
  130. openparser/_generated/models/paddle_raw_profile.py +76 -0
  131. openparser/_generated/models/paddle_raw_profile_options.py +115 -0
  132. openparser/_generated/models/page_block.py +332 -0
  133. openparser/_generated/models/page_block_kind.py +9 -0
  134. openparser/_generated/models/page_block_polygon_type_0_item.py +65 -0
  135. openparser/_generated/models/parse_async_body.py +133 -0
  136. openparser/_generated/models/parse_batch_body.py +143 -0
  137. openparser/_generated/models/parse_batch_item.py +109 -0
  138. openparser/_generated/models/parse_batch_item_ocr_options.py +78 -0
  139. openparser/_generated/models/parse_batch_request.py +100 -0
  140. openparser/_generated/models/parse_batch_request_items_item.py +108 -0
  141. openparser/_generated/models/parse_batch_request_items_item_ocr_options.py +78 -0
  142. openparser/_generated/models/parse_batch_request_output_format.py +8 -0
  143. openparser/_generated/models/parse_request.py +112 -0
  144. openparser/_generated/models/parse_request_ocr_options.py +78 -0
  145. openparser/_generated/models/parse_request_output_format.py +8 -0
  146. openparser/_generated/models/parse_sync_body.py +133 -0
  147. openparser/_generated/models/parsed_document.py +187 -0
  148. openparser/_generated/models/public_file.py +117 -0
  149. openparser/_generated/models/raw_parse_result.py +110 -0
  150. openparser/_generated/models/raw_parse_result_result.py +65 -0
  151. openparser/_generated/models/region.py +224 -0
  152. openparser/_generated/models/region_content.py +155 -0
  153. openparser/_generated/models/region_polygon_type_0_item.py +65 -0
  154. openparser/_generated/models/region_type.py +16 -0
  155. openparser/_generated/models/suggest_schema_request.py +69 -0
  156. openparser/_generated/models/suggest_schema_response.py +74 -0
  157. openparser/_generated/models/suggest_schema_response_schema.py +66 -0
  158. openparser/_generated/models/update_extraction_pipeline_request.py +227 -0
  159. openparser/_generated/models/update_extraction_pipeline_request_grounding.py +8 -0
  160. openparser/_generated/models/update_extraction_pipeline_request_llm_options_type_0.py +84 -0
  161. openparser/_generated/models/update_extraction_pipeline_request_llm_options_type_0_reasoning_effort_type_1.py +13 -0
  162. openparser/_generated/models/update_extraction_pipeline_request_ocr_options_type_0.py +78 -0
  163. openparser/_generated/models/update_extraction_pipeline_request_schema.py +67 -0
  164. openparser/_generated/py.typed +1 -0
  165. openparser/_generated/types.py +53 -0
  166. openparser/_telemetry.py +34 -0
  167. openparser/client.py +541 -0
  168. openparser/errors.py +172 -0
  169. openparser/py.typed +0 -0
  170. openparser_sdk-0.0.1.dist-info/METADATA +178 -0
  171. openparser_sdk-0.0.1.dist-info/RECORD +173 -0
  172. openparser_sdk-0.0.1.dist-info/WHEEL +4 -0
  173. openparser_sdk-0.0.1.dist-info/licenses/LICENSE +201 -0
openparser/__init__.py ADDED
@@ -0,0 +1,54 @@
1
+ """Official Python SDK for the OpenParser API.
2
+
3
+ Example
4
+ -------
5
+
6
+ from openparser import OpenParserClient
7
+
8
+ client = OpenParserClient(api_key=os.environ["OPENPARSER_API_KEY"])
9
+
10
+ result = client.parse.sync(
11
+ {"ocr_model": "paddleocr-vl-1.6", "output_format": "openparser@1"},
12
+ file=Path("invoice.pdf"),
13
+ )
14
+
15
+ print(result.page_count)
16
+ """
17
+
18
+ from openparser.client import OpenParserClient
19
+ from openparser.errors import (
20
+ OpenParserAuthError,
21
+ OpenParserConflictError,
22
+ OpenParserError,
23
+ OpenParserForbiddenError,
24
+ OpenParserGatewayTimeoutError,
25
+ OpenParserLimitExceededError,
26
+ OpenParserNotFoundError,
27
+ OpenParserPaymentRequiredError,
28
+ OpenParserRateLimitError,
29
+ OpenParserServerError,
30
+ OpenParserServiceUnavailableError,
31
+ OpenParserTimeoutError,
32
+ OpenParserUnprocessableError,
33
+ OpenParserUnsupportedMediaError,
34
+ OpenParserValidationError,
35
+ )
36
+
37
+ __all__ = [
38
+ "OpenParserClient",
39
+ "OpenParserError",
40
+ "OpenParserAuthError",
41
+ "OpenParserForbiddenError",
42
+ "OpenParserNotFoundError",
43
+ "OpenParserValidationError",
44
+ "OpenParserPaymentRequiredError",
45
+ "OpenParserConflictError",
46
+ "OpenParserLimitExceededError",
47
+ "OpenParserUnsupportedMediaError",
48
+ "OpenParserUnprocessableError",
49
+ "OpenParserRateLimitError",
50
+ "OpenParserServiceUnavailableError",
51
+ "OpenParserGatewayTimeoutError",
52
+ "OpenParserServerError",
53
+ "OpenParserTimeoutError",
54
+ ]
openparser/_files.py ADDED
@@ -0,0 +1,43 @@
1
+ """File upload helpers for parse, extract, and file pool requests."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import mimetypes
6
+ from pathlib import Path
7
+ from typing import IO, Any, Optional, Tuple
8
+
9
+
10
+ def is_file_input(value: Any) -> bool:
11
+ if isinstance(value, Path):
12
+ return True
13
+ if isinstance(value, dict):
14
+ content = value.get("content")
15
+ filename = value.get("filename")
16
+ return isinstance(filename, str) and isinstance(content, (bytes, bytearray))
17
+ if hasattr(value, "read") and hasattr(value, "name"):
18
+ return True
19
+ return False
20
+
21
+
22
+ def to_upload_tuple(value: Any) -> Tuple[str, bytes, str]:
23
+ if isinstance(value, Path):
24
+ content = value.read_bytes()
25
+ filename = value.name
26
+ mime_type, _ = mimetypes.guess_type(filename)
27
+ return (filename, content, mime_type or "application/octet-stream")
28
+
29
+ if isinstance(value, dict):
30
+ raw_content = value["content"]
31
+ content = bytes(raw_content) if isinstance(raw_content, bytearray) else raw_content
32
+ filename = value["filename"]
33
+ mime_type = value.get("mime_type") or value.get("mimeType")
34
+ if not mime_type:
35
+ mime_type, _ = mimetypes.guess_type(filename)
36
+ return (filename, content, mime_type or "application/octet-stream")
37
+
38
+ handle: IO[bytes] = value
39
+ content = handle.read()
40
+ name = getattr(handle, "name", None)
41
+ filename = Path(name).name if isinstance(name, str) else "file"
42
+ mime_type, _ = mimetypes.guess_type(filename)
43
+ return (filename, content, mime_type or "application/octet-stream")
@@ -0,0 +1,8 @@
1
+
2
+ """ A client library for accessing OpenParser API """
3
+ from .client import AuthenticatedClient, Client
4
+
5
+ __all__ = (
6
+ "AuthenticatedClient",
7
+ "Client",
8
+ )
@@ -0,0 +1 @@
1
+ """ Contains methods for accessing the API """
@@ -0,0 +1 @@
1
+ """ Contains endpoint functions for accessing the API """
@@ -0,0 +1,280 @@
1
+ from http import HTTPStatus
2
+ from typing import Any, cast
3
+ from urllib.parse import quote
4
+
5
+ import httpx
6
+
7
+ from ...client import AuthenticatedClient, Client
8
+ from ...types import Response, UNSET
9
+ from ... import errors
10
+
11
+ from ...models.error_response import ErrorResponse
12
+ from ...models.extract_async_body import ExtractAsyncBody
13
+ from ...models.job_accepted import JobAccepted
14
+ from typing import cast
15
+
16
+
17
+
18
+ def _get_kwargs(
19
+ *,
20
+ body: ExtractAsyncBody,
21
+ idempotency_key: str,
22
+
23
+ ) -> dict[str, Any]:
24
+ headers: dict[str, Any] = {}
25
+ headers["Idempotency-Key"] = idempotency_key
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+ _kwargs: dict[str, Any] = {
34
+ "method": "post",
35
+ "url": "/extract/async",
36
+ }
37
+
38
+ _kwargs["files"] = body.to_multipart()
39
+
40
+
41
+
42
+ _kwargs["headers"] = headers
43
+ return _kwargs
44
+
45
+
46
+
47
+ def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> ErrorResponse | JobAccepted | None:
48
+ if response.status_code == 202:
49
+ response_202 = JobAccepted.from_dict(response.json())
50
+
51
+
52
+
53
+ return response_202
54
+
55
+ if response.status_code == 400:
56
+ response_400 = ErrorResponse.from_dict(response.json())
57
+
58
+
59
+
60
+ return response_400
61
+
62
+ if response.status_code == 401:
63
+ response_401 = ErrorResponse.from_dict(response.json())
64
+
65
+
66
+
67
+ return response_401
68
+
69
+ if response.status_code == 402:
70
+ response_402 = ErrorResponse.from_dict(response.json())
71
+
72
+
73
+
74
+ return response_402
75
+
76
+ if response.status_code == 403:
77
+ response_403 = ErrorResponse.from_dict(response.json())
78
+
79
+
80
+
81
+ return response_403
82
+
83
+ if response.status_code == 409:
84
+ response_409 = ErrorResponse.from_dict(response.json())
85
+
86
+
87
+
88
+ return response_409
89
+
90
+ if response.status_code == 413:
91
+ response_413 = ErrorResponse.from_dict(response.json())
92
+
93
+
94
+
95
+ return response_413
96
+
97
+ if response.status_code == 415:
98
+ response_415 = ErrorResponse.from_dict(response.json())
99
+
100
+
101
+
102
+ return response_415
103
+
104
+ if response.status_code == 422:
105
+ response_422 = ErrorResponse.from_dict(response.json())
106
+
107
+
108
+
109
+ return response_422
110
+
111
+ if response.status_code == 429:
112
+ response_429 = ErrorResponse.from_dict(response.json())
113
+
114
+
115
+
116
+ return response_429
117
+
118
+ if response.status_code == 503:
119
+ response_503 = ErrorResponse.from_dict(response.json())
120
+
121
+
122
+
123
+ return response_503
124
+
125
+ if client.raise_on_unexpected_status:
126
+ raise errors.UnexpectedStatus(response.status_code, response.content)
127
+ else:
128
+ return None
129
+
130
+
131
+ def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[ErrorResponse | JobAccepted]:
132
+ return Response(
133
+ status_code=HTTPStatus(response.status_code),
134
+ content=response.content,
135
+ headers=response.headers,
136
+ parsed=_parse_response(client=client, response=response),
137
+ )
138
+
139
+
140
+ def sync_detailed(
141
+ *,
142
+ client: AuthenticatedClient | Client,
143
+ body: ExtractAsyncBody,
144
+ idempotency_key: str,
145
+
146
+ ) -> Response[ErrorResponse | JobAccepted]:
147
+ """ Extract structured data asynchronously
148
+
149
+ Admit a durable single extract job from file bytes, `file_id`, or `parse_job_id` and
150
+ return immediately. Parse reuse does not run OCR or add a page charge; OpenRouter usage
151
+ remains billable.
152
+
153
+ Args:
154
+ idempotency_key (str):
155
+ body (ExtractAsyncBody):
156
+
157
+ Raises:
158
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
159
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
160
+
161
+ Returns:
162
+ Response[ErrorResponse | JobAccepted]
163
+ """
164
+
165
+
166
+ kwargs = _get_kwargs(
167
+ body=body,
168
+ idempotency_key=idempotency_key,
169
+
170
+ )
171
+
172
+ response = client.get_httpx_client().request(
173
+ **kwargs,
174
+ )
175
+
176
+ return _build_response(client=client, response=response)
177
+
178
+ def sync(
179
+ *,
180
+ client: AuthenticatedClient | Client,
181
+ body: ExtractAsyncBody,
182
+ idempotency_key: str,
183
+
184
+ ) -> ErrorResponse | JobAccepted | None:
185
+ """ Extract structured data asynchronously
186
+
187
+ Admit a durable single extract job from file bytes, `file_id`, or `parse_job_id` and
188
+ return immediately. Parse reuse does not run OCR or add a page charge; OpenRouter usage
189
+ remains billable.
190
+
191
+ Args:
192
+ idempotency_key (str):
193
+ body (ExtractAsyncBody):
194
+
195
+ Raises:
196
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
197
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
198
+
199
+ Returns:
200
+ ErrorResponse | JobAccepted
201
+ """
202
+
203
+
204
+ return sync_detailed(
205
+ client=client,
206
+ body=body,
207
+ idempotency_key=idempotency_key,
208
+
209
+ ).parsed
210
+
211
+ async def asyncio_detailed(
212
+ *,
213
+ client: AuthenticatedClient | Client,
214
+ body: ExtractAsyncBody,
215
+ idempotency_key: str,
216
+
217
+ ) -> Response[ErrorResponse | JobAccepted]:
218
+ """ Extract structured data asynchronously
219
+
220
+ Admit a durable single extract job from file bytes, `file_id`, or `parse_job_id` and
221
+ return immediately. Parse reuse does not run OCR or add a page charge; OpenRouter usage
222
+ remains billable.
223
+
224
+ Args:
225
+ idempotency_key (str):
226
+ body (ExtractAsyncBody):
227
+
228
+ Raises:
229
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
230
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
231
+
232
+ Returns:
233
+ Response[ErrorResponse | JobAccepted]
234
+ """
235
+
236
+
237
+ kwargs = _get_kwargs(
238
+ body=body,
239
+ idempotency_key=idempotency_key,
240
+
241
+ )
242
+
243
+ response = await client.get_async_httpx_client().request(
244
+ **kwargs
245
+ )
246
+
247
+ return _build_response(client=client, response=response)
248
+
249
+ async def asyncio(
250
+ *,
251
+ client: AuthenticatedClient | Client,
252
+ body: ExtractAsyncBody,
253
+ idempotency_key: str,
254
+
255
+ ) -> ErrorResponse | JobAccepted | None:
256
+ """ Extract structured data asynchronously
257
+
258
+ Admit a durable single extract job from file bytes, `file_id`, or `parse_job_id` and
259
+ return immediately. Parse reuse does not run OCR or add a page charge; OpenRouter usage
260
+ remains billable.
261
+
262
+ Args:
263
+ idempotency_key (str):
264
+ body (ExtractAsyncBody):
265
+
266
+ Raises:
267
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
268
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
269
+
270
+ Returns:
271
+ ErrorResponse | JobAccepted
272
+ """
273
+
274
+
275
+ return (await asyncio_detailed(
276
+ client=client,
277
+ body=body,
278
+ idempotency_key=idempotency_key,
279
+
280
+ )).parsed
@@ -0,0 +1,284 @@
1
+ from http import HTTPStatus
2
+ from typing import Any, cast
3
+ from urllib.parse import quote
4
+
5
+ import httpx
6
+
7
+ from ...client import AuthenticatedClient, Client
8
+ from ...types import Response, UNSET
9
+ from ... import errors
10
+
11
+ from ...models.batch_job_accepted import BatchJobAccepted
12
+ from ...models.error_response import ErrorResponse
13
+ from ...models.extract_batch_body import ExtractBatchBody
14
+ from typing import cast
15
+
16
+
17
+
18
+ def _get_kwargs(
19
+ *,
20
+ body: ExtractBatchBody,
21
+ idempotency_key: str,
22
+
23
+ ) -> dict[str, Any]:
24
+ headers: dict[str, Any] = {}
25
+ headers["Idempotency-Key"] = idempotency_key
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+ _kwargs: dict[str, Any] = {
34
+ "method": "post",
35
+ "url": "/extract/batch",
36
+ }
37
+
38
+ _kwargs["files"] = body.to_multipart()
39
+
40
+
41
+
42
+ _kwargs["headers"] = headers
43
+ return _kwargs
44
+
45
+
46
+
47
+ def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> BatchJobAccepted | ErrorResponse | None:
48
+ if response.status_code == 202:
49
+ response_202 = BatchJobAccepted.from_dict(response.json())
50
+
51
+
52
+
53
+ return response_202
54
+
55
+ if response.status_code == 400:
56
+ response_400 = ErrorResponse.from_dict(response.json())
57
+
58
+
59
+
60
+ return response_400
61
+
62
+ if response.status_code == 401:
63
+ response_401 = ErrorResponse.from_dict(response.json())
64
+
65
+
66
+
67
+ return response_401
68
+
69
+ if response.status_code == 402:
70
+ response_402 = ErrorResponse.from_dict(response.json())
71
+
72
+
73
+
74
+ return response_402
75
+
76
+ if response.status_code == 403:
77
+ response_403 = ErrorResponse.from_dict(response.json())
78
+
79
+
80
+
81
+ return response_403
82
+
83
+ if response.status_code == 409:
84
+ response_409 = ErrorResponse.from_dict(response.json())
85
+
86
+
87
+
88
+ return response_409
89
+
90
+ if response.status_code == 413:
91
+ response_413 = ErrorResponse.from_dict(response.json())
92
+
93
+
94
+
95
+ return response_413
96
+
97
+ if response.status_code == 415:
98
+ response_415 = ErrorResponse.from_dict(response.json())
99
+
100
+
101
+
102
+ return response_415
103
+
104
+ if response.status_code == 422:
105
+ response_422 = ErrorResponse.from_dict(response.json())
106
+
107
+
108
+
109
+ return response_422
110
+
111
+ if response.status_code == 429:
112
+ response_429 = ErrorResponse.from_dict(response.json())
113
+
114
+
115
+
116
+ return response_429
117
+
118
+ if response.status_code == 503:
119
+ response_503 = ErrorResponse.from_dict(response.json())
120
+
121
+
122
+
123
+ return response_503
124
+
125
+ if client.raise_on_unexpected_status:
126
+ raise errors.UnexpectedStatus(response.status_code, response.content)
127
+ else:
128
+ return None
129
+
130
+
131
+ def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[BatchJobAccepted | ErrorResponse]:
132
+ return Response(
133
+ status_code=HTTPStatus(response.status_code),
134
+ content=response.content,
135
+ headers=response.headers,
136
+ parsed=_parse_response(client=client, response=response),
137
+ )
138
+
139
+
140
+ def sync_detailed(
141
+ *,
142
+ client: AuthenticatedClient | Client,
143
+ body: ExtractBatchBody,
144
+ idempotency_key: str,
145
+
146
+ ) -> Response[BatchJobAccepted | ErrorResponse]:
147
+ """ Extract structured data from multiple documents
148
+
149
+ Admit up to 100 file-backed extract child jobs in one durable batch. Every item uses
150
+ `file_index` or `file_id`; `parse_job_id` reuse is single-extract-only and is not accepted
151
+ in batch. Partial child failures are preserved. Parent status derivation follows
152
+ `JobStatus`; billing is evaluated per child.
153
+
154
+ Args:
155
+ idempotency_key (str):
156
+ body (ExtractBatchBody):
157
+
158
+ Raises:
159
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
160
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
161
+
162
+ Returns:
163
+ Response[BatchJobAccepted | ErrorResponse]
164
+ """
165
+
166
+
167
+ kwargs = _get_kwargs(
168
+ body=body,
169
+ idempotency_key=idempotency_key,
170
+
171
+ )
172
+
173
+ response = client.get_httpx_client().request(
174
+ **kwargs,
175
+ )
176
+
177
+ return _build_response(client=client, response=response)
178
+
179
+ def sync(
180
+ *,
181
+ client: AuthenticatedClient | Client,
182
+ body: ExtractBatchBody,
183
+ idempotency_key: str,
184
+
185
+ ) -> BatchJobAccepted | ErrorResponse | None:
186
+ """ Extract structured data from multiple documents
187
+
188
+ Admit up to 100 file-backed extract child jobs in one durable batch. Every item uses
189
+ `file_index` or `file_id`; `parse_job_id` reuse is single-extract-only and is not accepted
190
+ in batch. Partial child failures are preserved. Parent status derivation follows
191
+ `JobStatus`; billing is evaluated per child.
192
+
193
+ Args:
194
+ idempotency_key (str):
195
+ body (ExtractBatchBody):
196
+
197
+ Raises:
198
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
199
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
200
+
201
+ Returns:
202
+ BatchJobAccepted | ErrorResponse
203
+ """
204
+
205
+
206
+ return sync_detailed(
207
+ client=client,
208
+ body=body,
209
+ idempotency_key=idempotency_key,
210
+
211
+ ).parsed
212
+
213
+ async def asyncio_detailed(
214
+ *,
215
+ client: AuthenticatedClient | Client,
216
+ body: ExtractBatchBody,
217
+ idempotency_key: str,
218
+
219
+ ) -> Response[BatchJobAccepted | ErrorResponse]:
220
+ """ Extract structured data from multiple documents
221
+
222
+ Admit up to 100 file-backed extract child jobs in one durable batch. Every item uses
223
+ `file_index` or `file_id`; `parse_job_id` reuse is single-extract-only and is not accepted
224
+ in batch. Partial child failures are preserved. Parent status derivation follows
225
+ `JobStatus`; billing is evaluated per child.
226
+
227
+ Args:
228
+ idempotency_key (str):
229
+ body (ExtractBatchBody):
230
+
231
+ Raises:
232
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
233
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
234
+
235
+ Returns:
236
+ Response[BatchJobAccepted | ErrorResponse]
237
+ """
238
+
239
+
240
+ kwargs = _get_kwargs(
241
+ body=body,
242
+ idempotency_key=idempotency_key,
243
+
244
+ )
245
+
246
+ response = await client.get_async_httpx_client().request(
247
+ **kwargs
248
+ )
249
+
250
+ return _build_response(client=client, response=response)
251
+
252
+ async def asyncio(
253
+ *,
254
+ client: AuthenticatedClient | Client,
255
+ body: ExtractBatchBody,
256
+ idempotency_key: str,
257
+
258
+ ) -> BatchJobAccepted | ErrorResponse | None:
259
+ """ Extract structured data from multiple documents
260
+
261
+ Admit up to 100 file-backed extract child jobs in one durable batch. Every item uses
262
+ `file_index` or `file_id`; `parse_job_id` reuse is single-extract-only and is not accepted
263
+ in batch. Partial child failures are preserved. Parent status derivation follows
264
+ `JobStatus`; billing is evaluated per child.
265
+
266
+ Args:
267
+ idempotency_key (str):
268
+ body (ExtractBatchBody):
269
+
270
+ Raises:
271
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
272
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
273
+
274
+ Returns:
275
+ BatchJobAccepted | ErrorResponse
276
+ """
277
+
278
+
279
+ return (await asyncio_detailed(
280
+ client=client,
281
+ body=body,
282
+ idempotency_key=idempotency_key,
283
+
284
+ )).parsed