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.
- 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
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Mapping
|
|
4
|
+
from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
|
|
5
|
+
|
|
6
|
+
from attrs import define as _attrs_define
|
|
7
|
+
from attrs import field as _attrs_field
|
|
8
|
+
|
|
9
|
+
from ..types import UNSET, Unset
|
|
10
|
+
|
|
11
|
+
from ..models.extraction_attempt_kind import ExtractionAttemptKind
|
|
12
|
+
from ..models.extraction_attempt_status import ExtractionAttemptStatus
|
|
13
|
+
from ..types import UNSET, Unset
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
T = TypeVar("T", bound="ExtractionAttempt")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@_attrs_define
|
|
25
|
+
class ExtractionAttempt:
|
|
26
|
+
"""
|
|
27
|
+
Attributes:
|
|
28
|
+
index (int): Zero-based attempt index in execution order.
|
|
29
|
+
kind (ExtractionAttemptKind):
|
|
30
|
+
llm_model (str): OpenRouter model slug from the compatible OCR extraction catalog
|
|
31
|
+
(`GET /models/llm`). Unknown or deprecated values return `422 unsupported_llm_model`.
|
|
32
|
+
Ordinary extract may use any currently compatible model; field grounding requires a
|
|
33
|
+
certified model.
|
|
34
|
+
Example: openai/gpt-5.6-terra.
|
|
35
|
+
status (ExtractionAttemptStatus):
|
|
36
|
+
input_tokens (int | Unset):
|
|
37
|
+
output_tokens (int | Unset):
|
|
38
|
+
cost_usd (float | Unset): Customer retail USD for this attempt (OpenRouter provider cost converted to the
|
|
39
|
+
rates customers are charged). Distinct from the OCR page charge.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
index: int
|
|
43
|
+
kind: ExtractionAttemptKind
|
|
44
|
+
llm_model: str
|
|
45
|
+
status: ExtractionAttemptStatus
|
|
46
|
+
input_tokens: int | Unset = UNSET
|
|
47
|
+
output_tokens: int | Unset = UNSET
|
|
48
|
+
cost_usd: float | Unset = UNSET
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def to_dict(self) -> dict[str, Any]:
|
|
55
|
+
index = self.index
|
|
56
|
+
|
|
57
|
+
kind = self.kind.value
|
|
58
|
+
|
|
59
|
+
llm_model = self.llm_model
|
|
60
|
+
|
|
61
|
+
status = self.status.value
|
|
62
|
+
|
|
63
|
+
input_tokens = self.input_tokens
|
|
64
|
+
|
|
65
|
+
output_tokens = self.output_tokens
|
|
66
|
+
|
|
67
|
+
cost_usd = self.cost_usd
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
field_dict: dict[str, Any] = {}
|
|
71
|
+
|
|
72
|
+
field_dict.update({
|
|
73
|
+
"index": index,
|
|
74
|
+
"kind": kind,
|
|
75
|
+
"llm_model": llm_model,
|
|
76
|
+
"status": status,
|
|
77
|
+
})
|
|
78
|
+
if input_tokens is not UNSET:
|
|
79
|
+
field_dict["input_tokens"] = input_tokens
|
|
80
|
+
if output_tokens is not UNSET:
|
|
81
|
+
field_dict["output_tokens"] = output_tokens
|
|
82
|
+
if cost_usd is not UNSET:
|
|
83
|
+
field_dict["cost_usd"] = cost_usd
|
|
84
|
+
|
|
85
|
+
return field_dict
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@classmethod
|
|
90
|
+
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
91
|
+
d = dict(src_dict)
|
|
92
|
+
index = d.pop("index")
|
|
93
|
+
|
|
94
|
+
kind = ExtractionAttemptKind(d.pop("kind"))
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
llm_model = d.pop("llm_model")
|
|
100
|
+
|
|
101
|
+
status = ExtractionAttemptStatus(d.pop("status"))
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
input_tokens = d.pop("input_tokens", UNSET)
|
|
107
|
+
|
|
108
|
+
output_tokens = d.pop("output_tokens", UNSET)
|
|
109
|
+
|
|
110
|
+
cost_usd = d.pop("cost_usd", UNSET)
|
|
111
|
+
|
|
112
|
+
extraction_attempt = cls(
|
|
113
|
+
index=index,
|
|
114
|
+
kind=kind,
|
|
115
|
+
llm_model=llm_model,
|
|
116
|
+
status=status,
|
|
117
|
+
input_tokens=input_tokens,
|
|
118
|
+
output_tokens=output_tokens,
|
|
119
|
+
cost_usd=cost_usd,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
return extraction_attempt
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Mapping
|
|
4
|
+
from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
|
|
5
|
+
|
|
6
|
+
from attrs import define as _attrs_define
|
|
7
|
+
from attrs import field as _attrs_field
|
|
8
|
+
|
|
9
|
+
from ..types import UNSET, Unset
|
|
10
|
+
|
|
11
|
+
from ..types import UNSET, Unset
|
|
12
|
+
from typing import cast
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from ..models.chunk_provenance_span import ChunkProvenanceSpan
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
T = TypeVar("T", bound="ExtractionChunk")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@_attrs_define
|
|
26
|
+
class ExtractionChunk:
|
|
27
|
+
""" Canonical extraction chunk. `id` and `content_sha256` are lowercase SHA-256 hashes;
|
|
28
|
+
`content_sha256` hashes `text`. Page numbers are sorted and unique. When present,
|
|
29
|
+
`page_start` and `page_end` equal the minimum and maximum `page_numbers`. Region IDs and
|
|
30
|
+
provenance spans must match the parent document's regions.
|
|
31
|
+
|
|
32
|
+
Attributes:
|
|
33
|
+
id (str):
|
|
34
|
+
index (int):
|
|
35
|
+
document_id (str):
|
|
36
|
+
text (str):
|
|
37
|
+
content_sha256 (str):
|
|
38
|
+
page_numbers (list[int]):
|
|
39
|
+
region_ids (list[str]):
|
|
40
|
+
provenance_spans (list[ChunkProvenanceSpan]):
|
|
41
|
+
page_start (int | None | Unset):
|
|
42
|
+
page_end (int | None | Unset):
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
id: str
|
|
46
|
+
index: int
|
|
47
|
+
document_id: str
|
|
48
|
+
text: str
|
|
49
|
+
content_sha256: str
|
|
50
|
+
page_numbers: list[int]
|
|
51
|
+
region_ids: list[str]
|
|
52
|
+
provenance_spans: list[ChunkProvenanceSpan]
|
|
53
|
+
page_start: int | None | Unset = UNSET
|
|
54
|
+
page_end: int | None | Unset = UNSET
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def to_dict(self) -> dict[str, Any]:
|
|
61
|
+
from ..models.chunk_provenance_span import ChunkProvenanceSpan
|
|
62
|
+
id = self.id
|
|
63
|
+
|
|
64
|
+
index = self.index
|
|
65
|
+
|
|
66
|
+
document_id = self.document_id
|
|
67
|
+
|
|
68
|
+
text = self.text
|
|
69
|
+
|
|
70
|
+
content_sha256 = self.content_sha256
|
|
71
|
+
|
|
72
|
+
page_numbers = self.page_numbers
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
region_ids = self.region_ids
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
provenance_spans = []
|
|
81
|
+
for provenance_spans_item_data in self.provenance_spans:
|
|
82
|
+
provenance_spans_item = provenance_spans_item_data.to_dict()
|
|
83
|
+
provenance_spans.append(provenance_spans_item)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
page_start: int | None | Unset
|
|
88
|
+
if isinstance(self.page_start, Unset):
|
|
89
|
+
page_start = UNSET
|
|
90
|
+
else:
|
|
91
|
+
page_start = self.page_start
|
|
92
|
+
|
|
93
|
+
page_end: int | None | Unset
|
|
94
|
+
if isinstance(self.page_end, Unset):
|
|
95
|
+
page_end = UNSET
|
|
96
|
+
else:
|
|
97
|
+
page_end = self.page_end
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
field_dict: dict[str, Any] = {}
|
|
101
|
+
|
|
102
|
+
field_dict.update({
|
|
103
|
+
"id": id,
|
|
104
|
+
"index": index,
|
|
105
|
+
"document_id": document_id,
|
|
106
|
+
"text": text,
|
|
107
|
+
"content_sha256": content_sha256,
|
|
108
|
+
"page_numbers": page_numbers,
|
|
109
|
+
"region_ids": region_ids,
|
|
110
|
+
"provenance_spans": provenance_spans,
|
|
111
|
+
})
|
|
112
|
+
if page_start is not UNSET:
|
|
113
|
+
field_dict["page_start"] = page_start
|
|
114
|
+
if page_end is not UNSET:
|
|
115
|
+
field_dict["page_end"] = page_end
|
|
116
|
+
|
|
117
|
+
return field_dict
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
@classmethod
|
|
122
|
+
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
123
|
+
from ..models.chunk_provenance_span import ChunkProvenanceSpan
|
|
124
|
+
d = dict(src_dict)
|
|
125
|
+
id = d.pop("id")
|
|
126
|
+
|
|
127
|
+
index = d.pop("index")
|
|
128
|
+
|
|
129
|
+
document_id = d.pop("document_id")
|
|
130
|
+
|
|
131
|
+
text = d.pop("text")
|
|
132
|
+
|
|
133
|
+
content_sha256 = d.pop("content_sha256")
|
|
134
|
+
|
|
135
|
+
page_numbers = cast(list[int], d.pop("page_numbers"))
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
region_ids = cast(list[str], d.pop("region_ids"))
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
provenance_spans = []
|
|
142
|
+
_provenance_spans = d.pop("provenance_spans")
|
|
143
|
+
for provenance_spans_item_data in (_provenance_spans):
|
|
144
|
+
provenance_spans_item = ChunkProvenanceSpan.from_dict(provenance_spans_item_data)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
provenance_spans.append(provenance_spans_item)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _parse_page_start(data: object) -> int | None | Unset:
|
|
152
|
+
if data is None:
|
|
153
|
+
return data
|
|
154
|
+
if isinstance(data, Unset):
|
|
155
|
+
return data
|
|
156
|
+
return cast(int | None | Unset, data)
|
|
157
|
+
|
|
158
|
+
page_start = _parse_page_start(d.pop("page_start", UNSET))
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def _parse_page_end(data: object) -> int | None | Unset:
|
|
162
|
+
if data is None:
|
|
163
|
+
return data
|
|
164
|
+
if isinstance(data, Unset):
|
|
165
|
+
return data
|
|
166
|
+
return cast(int | None | Unset, data)
|
|
167
|
+
|
|
168
|
+
page_end = _parse_page_end(d.pop("page_end", UNSET))
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
extraction_chunk = cls(
|
|
172
|
+
id=id,
|
|
173
|
+
index=index,
|
|
174
|
+
document_id=document_id,
|
|
175
|
+
text=text,
|
|
176
|
+
content_sha256=content_sha256,
|
|
177
|
+
page_numbers=page_numbers,
|
|
178
|
+
region_ids=region_ids,
|
|
179
|
+
provenance_spans=provenance_spans,
|
|
180
|
+
page_start=page_start,
|
|
181
|
+
page_end=page_end,
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
return extraction_chunk
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Mapping
|
|
4
|
+
from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
|
|
5
|
+
|
|
6
|
+
from attrs import define as _attrs_define
|
|
7
|
+
from attrs import field as _attrs_field
|
|
8
|
+
|
|
9
|
+
from ..types import UNSET, Unset
|
|
10
|
+
|
|
11
|
+
from ..models.extraction_citation_granularity import ExtractionCitationGranularity
|
|
12
|
+
from ..models.extraction_citation_source_type import ExtractionCitationSourceType
|
|
13
|
+
from ..types import UNSET, Unset
|
|
14
|
+
from typing import cast
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from ..models.bounding_box import BoundingBox
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
T = TypeVar("T", bound="ExtractionCitation")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@_attrs_define
|
|
28
|
+
class ExtractionCitation:
|
|
29
|
+
""" Verified provenance for one extracted leaf citation. Geometry comes from the parse, never the model.
|
|
30
|
+
|
|
31
|
+
Attributes:
|
|
32
|
+
block_index (int):
|
|
33
|
+
page_number (int):
|
|
34
|
+
bbox (BoundingBox): Axis-aligned integer page coordinates with exclusive right and bottom edges.
|
|
35
|
+
source_type (ExtractionCitationSourceType):
|
|
36
|
+
granularity (ExtractionCitationGranularity): Citation geometry granularity. Citation v1 emits only `block`;
|
|
37
|
+
`region` is reserved
|
|
38
|
+
for a later narrowing release.
|
|
39
|
+
region_id (str | Unset):
|
|
40
|
+
coordinate_width (int | None | Unset):
|
|
41
|
+
coordinate_height (int | None | Unset):
|
|
42
|
+
confidence (float | Unset):
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
block_index: int
|
|
46
|
+
page_number: int
|
|
47
|
+
bbox: BoundingBox
|
|
48
|
+
source_type: ExtractionCitationSourceType
|
|
49
|
+
granularity: ExtractionCitationGranularity
|
|
50
|
+
region_id: str | Unset = UNSET
|
|
51
|
+
coordinate_width: int | None | Unset = UNSET
|
|
52
|
+
coordinate_height: int | None | Unset = UNSET
|
|
53
|
+
confidence: float | Unset = UNSET
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def to_dict(self) -> dict[str, Any]:
|
|
60
|
+
from ..models.bounding_box import BoundingBox
|
|
61
|
+
block_index = self.block_index
|
|
62
|
+
|
|
63
|
+
page_number = self.page_number
|
|
64
|
+
|
|
65
|
+
bbox = self.bbox.to_dict()
|
|
66
|
+
|
|
67
|
+
source_type = self.source_type.value
|
|
68
|
+
|
|
69
|
+
granularity = self.granularity.value
|
|
70
|
+
|
|
71
|
+
region_id = self.region_id
|
|
72
|
+
|
|
73
|
+
coordinate_width: int | None | Unset
|
|
74
|
+
if isinstance(self.coordinate_width, Unset):
|
|
75
|
+
coordinate_width = UNSET
|
|
76
|
+
else:
|
|
77
|
+
coordinate_width = self.coordinate_width
|
|
78
|
+
|
|
79
|
+
coordinate_height: int | None | Unset
|
|
80
|
+
if isinstance(self.coordinate_height, Unset):
|
|
81
|
+
coordinate_height = UNSET
|
|
82
|
+
else:
|
|
83
|
+
coordinate_height = self.coordinate_height
|
|
84
|
+
|
|
85
|
+
confidence = self.confidence
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
field_dict: dict[str, Any] = {}
|
|
89
|
+
|
|
90
|
+
field_dict.update({
|
|
91
|
+
"block_index": block_index,
|
|
92
|
+
"page_number": page_number,
|
|
93
|
+
"bbox": bbox,
|
|
94
|
+
"source_type": source_type,
|
|
95
|
+
"granularity": granularity,
|
|
96
|
+
})
|
|
97
|
+
if region_id is not UNSET:
|
|
98
|
+
field_dict["region_id"] = region_id
|
|
99
|
+
if coordinate_width is not UNSET:
|
|
100
|
+
field_dict["coordinate_width"] = coordinate_width
|
|
101
|
+
if coordinate_height is not UNSET:
|
|
102
|
+
field_dict["coordinate_height"] = coordinate_height
|
|
103
|
+
if confidence is not UNSET:
|
|
104
|
+
field_dict["confidence"] = confidence
|
|
105
|
+
|
|
106
|
+
return field_dict
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
@classmethod
|
|
111
|
+
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
112
|
+
from ..models.bounding_box import BoundingBox
|
|
113
|
+
d = dict(src_dict)
|
|
114
|
+
block_index = d.pop("block_index")
|
|
115
|
+
|
|
116
|
+
page_number = d.pop("page_number")
|
|
117
|
+
|
|
118
|
+
bbox = BoundingBox.from_dict(d.pop("bbox"))
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
source_type = ExtractionCitationSourceType(d.pop("source_type"))
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
granularity = ExtractionCitationGranularity(d.pop("granularity"))
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
region_id = d.pop("region_id", UNSET)
|
|
134
|
+
|
|
135
|
+
def _parse_coordinate_width(data: object) -> int | None | Unset:
|
|
136
|
+
if data is None:
|
|
137
|
+
return data
|
|
138
|
+
if isinstance(data, Unset):
|
|
139
|
+
return data
|
|
140
|
+
return cast(int | None | Unset, data)
|
|
141
|
+
|
|
142
|
+
coordinate_width = _parse_coordinate_width(d.pop("coordinate_width", UNSET))
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def _parse_coordinate_height(data: object) -> int | None | Unset:
|
|
146
|
+
if data is None:
|
|
147
|
+
return data
|
|
148
|
+
if isinstance(data, Unset):
|
|
149
|
+
return data
|
|
150
|
+
return cast(int | None | Unset, data)
|
|
151
|
+
|
|
152
|
+
coordinate_height = _parse_coordinate_height(d.pop("coordinate_height", UNSET))
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
confidence = d.pop("confidence", UNSET)
|
|
156
|
+
|
|
157
|
+
extraction_citation = cls(
|
|
158
|
+
block_index=block_index,
|
|
159
|
+
page_number=page_number,
|
|
160
|
+
bbox=bbox,
|
|
161
|
+
source_type=source_type,
|
|
162
|
+
granularity=granularity,
|
|
163
|
+
region_id=region_id,
|
|
164
|
+
coordinate_width=coordinate_width,
|
|
165
|
+
coordinate_height=coordinate_height,
|
|
166
|
+
confidence=confidence,
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
return extraction_citation
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
class ExtractionCitationSourceType(str, Enum):
|
|
4
|
+
BARCODE = "barcode"
|
|
5
|
+
CHECKBOX = "checkbox"
|
|
6
|
+
FIGURE = "figure"
|
|
7
|
+
FORMULA = "formula"
|
|
8
|
+
HEADER_FOOTER = "header_footer"
|
|
9
|
+
HEADING = "heading"
|
|
10
|
+
KEY_VALUE = "key_value"
|
|
11
|
+
SIGNATURE = "signature"
|
|
12
|
+
TABLE = "table"
|
|
13
|
+
TEXT = "text"
|
|
14
|
+
|
|
15
|
+
def __str__(self) -> str:
|
|
16
|
+
return str(self.value)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Mapping
|
|
4
|
+
from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
|
|
5
|
+
|
|
6
|
+
from attrs import define as _attrs_define
|
|
7
|
+
from attrs import field as _attrs_field
|
|
8
|
+
|
|
9
|
+
from ..types import UNSET, Unset
|
|
10
|
+
|
|
11
|
+
from ..types import UNSET, Unset
|
|
12
|
+
from typing import cast
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from ..models.extraction_citation import ExtractionCitation
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
T = TypeVar("T", bound="ExtractionGroundingField")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@_attrs_define
|
|
26
|
+
class ExtractionGroundingField:
|
|
27
|
+
""" Grounding metadata for one leaf in the unwrapped extraction output. `path` uses
|
|
28
|
+
dot-separated property segments and decimal array-index segments, for example
|
|
29
|
+
`line_items.0.amount`.
|
|
30
|
+
|
|
31
|
+
Attributes:
|
|
32
|
+
path (str): Dot-separated path from the output root. Array positions are decimal segments.
|
|
33
|
+
Property names containing dots are outside the field-grounding schema subset.
|
|
34
|
+
citations (list[ExtractionCitation]):
|
|
35
|
+
dropped_source_ids (list[str] | Unset):
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
path: str
|
|
39
|
+
citations: list[ExtractionCitation]
|
|
40
|
+
dropped_source_ids: list[str] | Unset = UNSET
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def to_dict(self) -> dict[str, Any]:
|
|
47
|
+
from ..models.extraction_citation import ExtractionCitation
|
|
48
|
+
path = self.path
|
|
49
|
+
|
|
50
|
+
citations = []
|
|
51
|
+
for citations_item_data in self.citations:
|
|
52
|
+
citations_item = citations_item_data.to_dict()
|
|
53
|
+
citations.append(citations_item)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
dropped_source_ids: list[str] | Unset = UNSET
|
|
58
|
+
if not isinstance(self.dropped_source_ids, Unset):
|
|
59
|
+
dropped_source_ids = self.dropped_source_ids
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
field_dict: dict[str, Any] = {}
|
|
65
|
+
|
|
66
|
+
field_dict.update({
|
|
67
|
+
"path": path,
|
|
68
|
+
"citations": citations,
|
|
69
|
+
})
|
|
70
|
+
if dropped_source_ids is not UNSET:
|
|
71
|
+
field_dict["dropped_source_ids"] = dropped_source_ids
|
|
72
|
+
|
|
73
|
+
return field_dict
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@classmethod
|
|
78
|
+
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
79
|
+
from ..models.extraction_citation import ExtractionCitation
|
|
80
|
+
d = dict(src_dict)
|
|
81
|
+
path = d.pop("path")
|
|
82
|
+
|
|
83
|
+
citations = []
|
|
84
|
+
_citations = d.pop("citations")
|
|
85
|
+
for citations_item_data in (_citations):
|
|
86
|
+
citations_item = ExtractionCitation.from_dict(citations_item_data)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
citations.append(citations_item)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
dropped_source_ids = cast(list[str], d.pop("dropped_source_ids", UNSET))
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
extraction_grounding_field = cls(
|
|
97
|
+
path=path,
|
|
98
|
+
citations=citations,
|
|
99
|
+
dropped_source_ids=dropped_source_ids,
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
return extraction_grounding_field
|