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.
- openparser/__init__.py +54 -0
- openparser/_files.py +43 -0
- openparser/_generated/__init__.py +8 -0
- openparser/_generated/api/__init__.py +1 -0
- openparser/_generated/api/extract/__init__.py +1 -0
- openparser/_generated/api/extract/extract_async.py +280 -0
- openparser/_generated/api/extract/extract_batch.py +284 -0
- openparser/_generated/api/extract/extract_sync.py +315 -0
- openparser/_generated/api/extract/suggest_schema.py +260 -0
- openparser/_generated/api/files/__init__.py +1 -0
- openparser/_generated/api/files/create_file.py +237 -0
- openparser/_generated/api/files/delete_file.py +200 -0
- openparser/_generated/api/files/get_file.py +200 -0
- openparser/_generated/api/files/get_file_content.py +198 -0
- openparser/_generated/api/jobs/__init__.py +1 -0
- openparser/_generated/api/jobs/get_job.py +261 -0
- openparser/_generated/api/jobs/get_job_result.py +305 -0
- openparser/_generated/api/jobs/get_job_source.py +233 -0
- openparser/_generated/api/jobs/list_jobs.py +340 -0
- openparser/_generated/api/models/__init__.py +1 -0
- openparser/_generated/api/models/list_llm_models.py +288 -0
- openparser/_generated/api/models/list_ocr_models.py +184 -0
- openparser/_generated/api/parse/__init__.py +1 -0
- openparser/_generated/api/parse/parse_async.py +316 -0
- openparser/_generated/api/parse/parse_batch.py +280 -0
- openparser/_generated/api/parse/parse_sync.py +369 -0
- openparser/_generated/api/pipelines/__init__.py +1 -0
- openparser/_generated/api/pipelines/create_extraction_pipeline.py +242 -0
- openparser/_generated/api/pipelines/delete_extraction_pipeline.py +212 -0
- openparser/_generated/api/pipelines/get_extraction_pipeline.py +212 -0
- openparser/_generated/api/pipelines/list_extraction_pipelines.py +180 -0
- openparser/_generated/api/pipelines/update_extraction_pipeline.py +258 -0
- openparser/_generated/client.py +270 -0
- openparser/_generated/errors.py +14 -0
- openparser/_generated/models/__init__.py +261 -0
- openparser/_generated/models/batch_child_page.py +97 -0
- openparser/_generated/models/batch_child_summary.py +195 -0
- openparser/_generated/models/batch_job_accepted.py +139 -0
- openparser/_generated/models/batch_job_accepted_operation.py +8 -0
- openparser/_generated/models/batch_summary_counts.py +97 -0
- openparser/_generated/models/bounding_box.py +82 -0
- openparser/_generated/models/chunk_provenance_span.py +97 -0
- openparser/_generated/models/content_kind.py +10 -0
- openparser/_generated/models/create_extraction_pipeline_request.py +177 -0
- openparser/_generated/models/create_extraction_pipeline_request_grounding.py +8 -0
- openparser/_generated/models/create_extraction_pipeline_request_llm_options.py +84 -0
- openparser/_generated/models/create_extraction_pipeline_request_llm_options_reasoning_effort_type_1.py +13 -0
- openparser/_generated/models/create_extraction_pipeline_request_ocr_options.py +78 -0
- openparser/_generated/models/create_extraction_pipeline_request_schema.py +68 -0
- openparser/_generated/models/create_file_body.py +78 -0
- openparser/_generated/models/delete_extraction_pipeline_response.py +66 -0
- openparser/_generated/models/delete_file_response.py +57 -0
- openparser/_generated/models/error_body.py +106 -0
- openparser/_generated/models/error_body_details.py +65 -0
- openparser/_generated/models/error_response.py +65 -0
- openparser/_generated/models/extract_async_body.py +136 -0
- openparser/_generated/models/extract_batch_body.py +143 -0
- openparser/_generated/models/extract_batch_item.py +207 -0
- openparser/_generated/models/extract_batch_item_grounding.py +8 -0
- openparser/_generated/models/extract_batch_item_llm_options.py +84 -0
- openparser/_generated/models/extract_batch_item_llm_options_reasoning_effort_type_1.py +13 -0
- openparser/_generated/models/extract_batch_item_ocr_options.py +78 -0
- openparser/_generated/models/extract_batch_item_schema.py +65 -0
- openparser/_generated/models/extract_batch_request.py +99 -0
- openparser/_generated/models/extract_batch_request_items_item.py +201 -0
- openparser/_generated/models/extract_batch_request_items_item_grounding.py +8 -0
- openparser/_generated/models/extract_batch_request_items_item_llm_options.py +84 -0
- openparser/_generated/models/extract_batch_request_items_item_llm_options_reasoning_effort_type_1.py +13 -0
- openparser/_generated/models/extract_batch_request_items_item_ocr_options.py +78 -0
- openparser/_generated/models/extract_batch_request_items_item_schema.py +65 -0
- openparser/_generated/models/extract_batch_request_output_format.py +8 -0
- openparser/_generated/models/extract_request.py +226 -0
- openparser/_generated/models/extract_request_grounding.py +8 -0
- openparser/_generated/models/extract_request_llm_options.py +84 -0
- openparser/_generated/models/extract_request_llm_options_reasoning_effort_type_1.py +13 -0
- openparser/_generated/models/extract_request_ocr_options.py +78 -0
- openparser/_generated/models/extract_request_output_format.py +8 -0
- openparser/_generated/models/extract_request_schema.py +65 -0
- openparser/_generated/models/extract_sync_body.py +136 -0
- openparser/_generated/models/extraction_attempt.py +122 -0
- openparser/_generated/models/extraction_attempt_kind.py +8 -0
- openparser/_generated/models/extraction_attempt_status.py +9 -0
- openparser/_generated/models/extraction_chunk.py +184 -0
- openparser/_generated/models/extraction_citation.py +169 -0
- openparser/_generated/models/extraction_citation_granularity.py +8 -0
- openparser/_generated/models/extraction_citation_source_type.py +16 -0
- openparser/_generated/models/extraction_grounding_field.py +102 -0
- openparser/_generated/models/extraction_grounding_mode.py +8 -0
- openparser/_generated/models/extraction_grounding_result.py +87 -0
- openparser/_generated/models/extraction_pipeline.py +201 -0
- openparser/_generated/models/extraction_pipeline_list_response.py +76 -0
- openparser/_generated/models/extraction_pipeline_llm_options.py +84 -0
- openparser/_generated/models/extraction_pipeline_llm_options_reasoning_effort_type_0_type_1.py +13 -0
- openparser/_generated/models/extraction_pipeline_ocr_options.py +73 -0
- openparser/_generated/models/extraction_pipeline_schema.py +67 -0
- openparser/_generated/models/extraction_terminal_result.py +206 -0
- openparser/_generated/models/extraction_terminal_result_reasoning_effort_type_0.py +13 -0
- openparser/_generated/models/extraction_usage_totals.py +80 -0
- openparser/_generated/models/job.py +437 -0
- openparser/_generated/models/job_accepted.py +131 -0
- openparser/_generated/models/job_accepted_operation.py +8 -0
- openparser/_generated/models/job_extraction_schema.py +65 -0
- openparser/_generated/models/job_failure.py +98 -0
- openparser/_generated/models/job_failure_details.py +65 -0
- openparser/_generated/models/job_list_response.py +91 -0
- openparser/_generated/models/job_operation.py +10 -0
- openparser/_generated/models/job_progress.py +68 -0
- openparser/_generated/models/job_related_extractions_item.py +145 -0
- openparser/_generated/models/job_status.py +11 -0
- openparser/_generated/models/job_summary.py +264 -0
- openparser/_generated/models/json_schema_object.py +66 -0
- openparser/_generated/models/list_llm_models_mode.py +8 -0
- openparser/_generated/models/ocr_llm_model_catalog_entry.py +257 -0
- openparser/_generated/models/ocr_llm_model_catalog_entry_pricing.py +76 -0
- openparser/_generated/models/ocr_llm_model_catalog_entry_reasoning_type_0.py +134 -0
- openparser/_generated/models/ocr_llm_model_catalog_entry_reasoning_type_0_default_effort_type_0.py +13 -0
- openparser/_generated/models/ocr_llm_model_catalog_entry_reasoning_type_0_supported_efforts_type_0_item.py +13 -0
- openparser/_generated/models/ocr_llm_model_catalog_entry_recommendation.py +8 -0
- openparser/_generated/models/ocr_llm_models_response.py +150 -0
- openparser/_generated/models/ocr_llm_models_response_mode.py +8 -0
- openparser/_generated/models/ocr_model.py +7 -0
- openparser/_generated/models/ocr_model_catalog_entry.py +131 -0
- openparser/_generated/models/ocr_model_catalog_entry_availability.py +9 -0
- openparser/_generated/models/ocr_model_catalog_entry_capabilities.py +97 -0
- openparser/_generated/models/ocr_model_catalog_entry_capabilities_options.py +73 -0
- openparser/_generated/models/ocr_model_catalog_entry_option_defaults.py +73 -0
- openparser/_generated/models/ocr_model_catalog_entry_pricing.py +68 -0
- openparser/_generated/models/ocr_models_response.py +76 -0
- openparser/_generated/models/ocr_output_format.py +8 -0
- openparser/_generated/models/paddle_raw_profile.py +76 -0
- openparser/_generated/models/paddle_raw_profile_options.py +115 -0
- openparser/_generated/models/page_block.py +332 -0
- openparser/_generated/models/page_block_kind.py +9 -0
- openparser/_generated/models/page_block_polygon_type_0_item.py +65 -0
- openparser/_generated/models/parse_async_body.py +133 -0
- openparser/_generated/models/parse_batch_body.py +143 -0
- openparser/_generated/models/parse_batch_item.py +109 -0
- openparser/_generated/models/parse_batch_item_ocr_options.py +78 -0
- openparser/_generated/models/parse_batch_request.py +100 -0
- openparser/_generated/models/parse_batch_request_items_item.py +108 -0
- openparser/_generated/models/parse_batch_request_items_item_ocr_options.py +78 -0
- openparser/_generated/models/parse_batch_request_output_format.py +8 -0
- openparser/_generated/models/parse_request.py +112 -0
- openparser/_generated/models/parse_request_ocr_options.py +78 -0
- openparser/_generated/models/parse_request_output_format.py +8 -0
- openparser/_generated/models/parse_sync_body.py +133 -0
- openparser/_generated/models/parsed_document.py +187 -0
- openparser/_generated/models/public_file.py +117 -0
- openparser/_generated/models/raw_parse_result.py +110 -0
- openparser/_generated/models/raw_parse_result_result.py +65 -0
- openparser/_generated/models/region.py +224 -0
- openparser/_generated/models/region_content.py +155 -0
- openparser/_generated/models/region_polygon_type_0_item.py +65 -0
- openparser/_generated/models/region_type.py +16 -0
- openparser/_generated/models/suggest_schema_request.py +69 -0
- openparser/_generated/models/suggest_schema_response.py +74 -0
- openparser/_generated/models/suggest_schema_response_schema.py +66 -0
- openparser/_generated/models/update_extraction_pipeline_request.py +227 -0
- openparser/_generated/models/update_extraction_pipeline_request_grounding.py +8 -0
- openparser/_generated/models/update_extraction_pipeline_request_llm_options_type_0.py +84 -0
- openparser/_generated/models/update_extraction_pipeline_request_llm_options_type_0_reasoning_effort_type_1.py +13 -0
- openparser/_generated/models/update_extraction_pipeline_request_ocr_options_type_0.py +78 -0
- openparser/_generated/models/update_extraction_pipeline_request_schema.py +67 -0
- openparser/_generated/py.typed +1 -0
- openparser/_generated/types.py +53 -0
- openparser/_telemetry.py +34 -0
- openparser/client.py +541 -0
- openparser/errors.py +172 -0
- openparser/py.typed +0 -0
- openparser_sdk-0.0.1.dist-info/METADATA +178 -0
- openparser_sdk-0.0.1.dist-info/RECORD +173 -0
- openparser_sdk-0.0.1.dist-info/WHEEL +4 -0
- 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 @@
|
|
|
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
|