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.
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
@@ -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,8 @@
1
+ from enum import Enum
2
+
3
+ class ExtractionAttemptKind(str, Enum):
4
+ PRIMARY = "primary"
5
+ REPAIR = "repair"
6
+
7
+ def __str__(self) -> str:
8
+ return str(self.value)
@@ -0,0 +1,9 @@
1
+ from enum import Enum
2
+
3
+ class ExtractionAttemptStatus(str, Enum):
4
+ FAILED = "failed"
5
+ INDETERMINATE = "indeterminate"
6
+ SUCCEEDED = "succeeded"
7
+
8
+ def __str__(self) -> str:
9
+ return str(self.value)
@@ -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,8 @@
1
+ from enum import Enum
2
+
3
+ class ExtractionCitationGranularity(str, Enum):
4
+ BLOCK = "block"
5
+ REGION = "region"
6
+
7
+ def __str__(self) -> str:
8
+ return str(self.value)
@@ -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
@@ -0,0 +1,8 @@
1
+ from enum import Enum
2
+
3
+ class ExtractionGroundingMode(str, Enum):
4
+ FIELD = "field"
5
+ NONE = "none"
6
+
7
+ def __str__(self) -> str:
8
+ return str(self.value)