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,264 @@
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.job_operation import JobOperation
12
+ from ..models.job_status import JobStatus
13
+ from ..models.ocr_output_format import OcrOutputFormat
14
+ from ..types import UNSET, Unset
15
+ from dateutil.parser import isoparse
16
+ from typing import cast
17
+ import datetime
18
+
19
+ if TYPE_CHECKING:
20
+ from ..models.job_failure import JobFailure
21
+
22
+
23
+
24
+
25
+
26
+ T = TypeVar("T", bound="JobSummary")
27
+
28
+
29
+
30
+ @_attrs_define
31
+ class JobSummary:
32
+ """ Lightweight list row for `GET /jobs`. Omits result bodies, idempotency keys,
33
+ storage object keys, and provider cost fields.
34
+
35
+ Attributes:
36
+ id (str): Prefixed public id for an OCR job (`opj_…`). Example: opj_V1StGXR8_Z5jdHi6B-myT.
37
+ operation (JobOperation):
38
+ status (JobStatus): Durable job status. For batch parent jobs, status is derived from children after each
39
+ child transition:
40
+ 1. If any child is non-terminal, the parent remains `queued` only while every child is
41
+ queued; it becomes `running` once any child is running or terminal.
42
+ 2. When every child is terminal and any child is `indeterminate`, the parent is
43
+ `indeterminate`.
44
+ 3. When every child is terminal, none are `indeterminate`, and any child is `failed`:
45
+ the parent is `failed` if zero children succeeded, otherwise `succeeded` (mixed
46
+ success/failure closes as parent `succeeded` while preserving failed children in
47
+ summaries).
48
+ 4. When every child is `succeeded`, the parent is `succeeded`.
49
+
50
+ Partial failures are always retained on child summaries; parent status does not drop
51
+ failed children from results.
52
+ output_format (OcrOutputFormat):
53
+ page_count (int):
54
+ created_at (datetime.datetime):
55
+ updated_at (datetime.datetime):
56
+ has_result (bool): True when `GET /jobs/{id}` includes a terminal `result`.
57
+ url (str): Path-absolute job resource URL (for example `/jobs/{id}`).
58
+ pipeline_id (None | str): Snapshot of the saved extraction pipeline id at admit time, or `null` for parse jobs,
59
+ inline extract config, and other non-pipeline work.
60
+ pipeline_version (int | None): Snapshot of the saved extraction pipeline version at admit time, or `null` when
61
+ `pipeline_id` is `null`.
62
+ ocr_model (None | str | Unset):
63
+ llm_model (None | str | Unset):
64
+ error (JobFailure | Unset):
65
+ has_source (bool | Unset):
66
+ """
67
+
68
+ id: str
69
+ operation: JobOperation
70
+ status: JobStatus
71
+ output_format: OcrOutputFormat
72
+ page_count: int
73
+ created_at: datetime.datetime
74
+ updated_at: datetime.datetime
75
+ has_result: bool
76
+ url: str
77
+ pipeline_id: None | str
78
+ pipeline_version: int | None
79
+ ocr_model: None | str | Unset = UNSET
80
+ llm_model: None | str | Unset = UNSET
81
+ error: JobFailure | Unset = UNSET
82
+ has_source: bool | Unset = UNSET
83
+
84
+
85
+
86
+
87
+
88
+ def to_dict(self) -> dict[str, Any]:
89
+ from ..models.job_failure import JobFailure
90
+ id = self.id
91
+
92
+ operation = self.operation.value
93
+
94
+ status = self.status.value
95
+
96
+ output_format = self.output_format.value
97
+
98
+ page_count = self.page_count
99
+
100
+ created_at = self.created_at.isoformat()
101
+
102
+ updated_at = self.updated_at.isoformat()
103
+
104
+ has_result = self.has_result
105
+
106
+ url = self.url
107
+
108
+ pipeline_id: None | str
109
+ pipeline_id = self.pipeline_id
110
+
111
+ pipeline_version: int | None
112
+ pipeline_version = self.pipeline_version
113
+
114
+ ocr_model: None | str | Unset
115
+ if isinstance(self.ocr_model, Unset):
116
+ ocr_model = UNSET
117
+ else:
118
+ ocr_model = self.ocr_model
119
+
120
+ llm_model: None | str | Unset
121
+ if isinstance(self.llm_model, Unset):
122
+ llm_model = UNSET
123
+ else:
124
+ llm_model = self.llm_model
125
+
126
+ error: dict[str, Any] | Unset = UNSET
127
+ if not isinstance(self.error, Unset):
128
+ error = self.error.to_dict()
129
+
130
+ has_source = self.has_source
131
+
132
+
133
+ field_dict: dict[str, Any] = {}
134
+
135
+ field_dict.update({
136
+ "id": id,
137
+ "operation": operation,
138
+ "status": status,
139
+ "output_format": output_format,
140
+ "page_count": page_count,
141
+ "created_at": created_at,
142
+ "updated_at": updated_at,
143
+ "has_result": has_result,
144
+ "url": url,
145
+ "pipeline_id": pipeline_id,
146
+ "pipeline_version": pipeline_version,
147
+ })
148
+ if ocr_model is not UNSET:
149
+ field_dict["ocr_model"] = ocr_model
150
+ if llm_model is not UNSET:
151
+ field_dict["llm_model"] = llm_model
152
+ if error is not UNSET:
153
+ field_dict["error"] = error
154
+ if has_source is not UNSET:
155
+ field_dict["has_source"] = has_source
156
+
157
+ return field_dict
158
+
159
+
160
+
161
+ @classmethod
162
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
163
+ from ..models.job_failure import JobFailure
164
+ d = dict(src_dict)
165
+ id = d.pop("id")
166
+
167
+ operation = JobOperation(d.pop("operation"))
168
+
169
+
170
+
171
+
172
+ status = JobStatus(d.pop("status"))
173
+
174
+
175
+
176
+
177
+ output_format = OcrOutputFormat(d.pop("output_format"))
178
+
179
+
180
+
181
+
182
+ page_count = d.pop("page_count")
183
+
184
+ created_at = isoparse(d.pop("created_at"))
185
+
186
+
187
+
188
+
189
+ updated_at = isoparse(d.pop("updated_at"))
190
+
191
+
192
+
193
+
194
+ has_result = d.pop("has_result")
195
+
196
+ url = d.pop("url")
197
+
198
+ def _parse_pipeline_id(data: object) -> None | str:
199
+ if data is None:
200
+ return data
201
+ return cast(None | str, data)
202
+
203
+ pipeline_id = _parse_pipeline_id(d.pop("pipeline_id"))
204
+
205
+
206
+ def _parse_pipeline_version(data: object) -> int | None:
207
+ if data is None:
208
+ return data
209
+ return cast(int | None, data)
210
+
211
+ pipeline_version = _parse_pipeline_version(d.pop("pipeline_version"))
212
+
213
+
214
+ def _parse_ocr_model(data: object) -> None | str | Unset:
215
+ if data is None:
216
+ return data
217
+ if isinstance(data, Unset):
218
+ return data
219
+ return cast(None | str | Unset, data)
220
+
221
+ ocr_model = _parse_ocr_model(d.pop("ocr_model", UNSET))
222
+
223
+
224
+ def _parse_llm_model(data: object) -> None | str | Unset:
225
+ if data is None:
226
+ return data
227
+ if isinstance(data, Unset):
228
+ return data
229
+ return cast(None | str | Unset, data)
230
+
231
+ llm_model = _parse_llm_model(d.pop("llm_model", UNSET))
232
+
233
+
234
+ _error = d.pop("error", UNSET)
235
+ error: JobFailure | Unset
236
+ if isinstance(_error, Unset):
237
+ error = UNSET
238
+ else:
239
+ error = JobFailure.from_dict(_error)
240
+
241
+
242
+
243
+
244
+ has_source = d.pop("has_source", UNSET)
245
+
246
+ job_summary = cls(
247
+ id=id,
248
+ operation=operation,
249
+ status=status,
250
+ output_format=output_format,
251
+ page_count=page_count,
252
+ created_at=created_at,
253
+ updated_at=updated_at,
254
+ has_result=has_result,
255
+ url=url,
256
+ pipeline_id=pipeline_id,
257
+ pipeline_version=pipeline_version,
258
+ ocr_model=ocr_model,
259
+ llm_model=llm_model,
260
+ error=error,
261
+ has_source=has_source,
262
+ )
263
+
264
+ return job_summary
@@ -0,0 +1,66 @@
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
+
12
+
13
+
14
+
15
+
16
+
17
+ T = TypeVar("T", bound="JsonSchemaObject")
18
+
19
+
20
+
21
+ @_attrs_define
22
+ class JsonSchemaObject:
23
+ """ Supported JSON Schema object describing the requested extraction output.
24
+
25
+ """
26
+
27
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
28
+
29
+
30
+
31
+
32
+
33
+ def to_dict(self) -> dict[str, Any]:
34
+
35
+ field_dict: dict[str, Any] = {}
36
+ field_dict.update(self.additional_properties)
37
+
38
+ return field_dict
39
+
40
+
41
+
42
+ @classmethod
43
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
44
+ d = dict(src_dict)
45
+ json_schema_object = cls(
46
+ )
47
+
48
+
49
+ json_schema_object.additional_properties = d
50
+ return json_schema_object
51
+
52
+ @property
53
+ def additional_keys(self) -> list[str]:
54
+ return list(self.additional_properties.keys())
55
+
56
+ def __getitem__(self, key: str) -> Any:
57
+ return self.additional_properties[key]
58
+
59
+ def __setitem__(self, key: str, value: Any) -> None:
60
+ self.additional_properties[key] = value
61
+
62
+ def __delitem__(self, key: str) -> None:
63
+ del self.additional_properties[key]
64
+
65
+ def __contains__(self, key: str) -> bool:
66
+ return key in self.additional_properties
@@ -0,0 +1,8 @@
1
+ from enum import Enum
2
+
3
+ class ListLlmModelsMode(str, Enum):
4
+ SEARCH = "search"
5
+ SUGGESTED = "suggested"
6
+
7
+ def __str__(self) -> str:
8
+ return str(self.value)
@@ -0,0 +1,257 @@
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.ocr_llm_model_catalog_entry_recommendation import OcrLlmModelCatalogEntryRecommendation
12
+ from dateutil.parser import isoparse
13
+ from typing import cast
14
+ import datetime
15
+
16
+ if TYPE_CHECKING:
17
+ from ..models.ocr_llm_model_catalog_entry_pricing import OcrLlmModelCatalogEntryPricing
18
+ from ..models.ocr_llm_model_catalog_entry_reasoning_type_0 import OcrLlmModelCatalogEntryReasoningType0
19
+
20
+
21
+
22
+
23
+
24
+ T = TypeVar("T", bound="OcrLlmModelCatalogEntry")
25
+
26
+
27
+
28
+ @_attrs_define
29
+ class OcrLlmModelCatalogEntry:
30
+ """ One compatible extraction LLM. `recommendation` is `suggested` or `compatible`.
31
+ `certified_grounding` / `certified_suggest` (and compatibility aliases
32
+ `supports_grounding` / `supports_suggest`) gate heavier schemas. `pricing` is customer retail USD per 1M tokens
33
+ (`basis: customer_retail`) — the rates customers are charged, not raw provider list cost.
34
+
35
+ Attributes:
36
+ id (str):
37
+ label (str):
38
+ provider (str):
39
+ created_at (datetime.datetime | None):
40
+ context_length (int | None):
41
+ recommendation (OcrLlmModelCatalogEntryRecommendation):
42
+ is_default (bool):
43
+ certified_grounding (bool):
44
+ certified_suggest (bool):
45
+ supports_grounding (bool):
46
+ supports_suggest (bool):
47
+ pricing_known (bool):
48
+ reasoning (None | OcrLlmModelCatalogEntryReasoningType0):
49
+ deprecated_at (datetime.datetime | None):
50
+ pricing (OcrLlmModelCatalogEntryPricing):
51
+ """
52
+
53
+ id: str
54
+ label: str
55
+ provider: str
56
+ created_at: datetime.datetime | None
57
+ context_length: int | None
58
+ recommendation: OcrLlmModelCatalogEntryRecommendation
59
+ is_default: bool
60
+ certified_grounding: bool
61
+ certified_suggest: bool
62
+ supports_grounding: bool
63
+ supports_suggest: bool
64
+ pricing_known: bool
65
+ reasoning: None | OcrLlmModelCatalogEntryReasoningType0
66
+ deprecated_at: datetime.datetime | None
67
+ pricing: OcrLlmModelCatalogEntryPricing
68
+
69
+
70
+
71
+
72
+
73
+ def to_dict(self) -> dict[str, Any]:
74
+ from ..models.ocr_llm_model_catalog_entry_pricing import OcrLlmModelCatalogEntryPricing
75
+ from ..models.ocr_llm_model_catalog_entry_reasoning_type_0 import OcrLlmModelCatalogEntryReasoningType0
76
+ id = self.id
77
+
78
+ label = self.label
79
+
80
+ provider = self.provider
81
+
82
+ created_at: None | str
83
+ if isinstance(self.created_at, datetime.datetime):
84
+ created_at = self.created_at.isoformat()
85
+ else:
86
+ created_at = self.created_at
87
+
88
+ context_length: int | None
89
+ context_length = self.context_length
90
+
91
+ recommendation = self.recommendation.value
92
+
93
+ is_default = self.is_default
94
+
95
+ certified_grounding = self.certified_grounding
96
+
97
+ certified_suggest = self.certified_suggest
98
+
99
+ supports_grounding = self.supports_grounding
100
+
101
+ supports_suggest = self.supports_suggest
102
+
103
+ pricing_known = self.pricing_known
104
+
105
+ reasoning: dict[str, Any] | None
106
+ if isinstance(self.reasoning, OcrLlmModelCatalogEntryReasoningType0):
107
+ reasoning = self.reasoning.to_dict()
108
+ else:
109
+ reasoning = self.reasoning
110
+
111
+ deprecated_at: None | str
112
+ if isinstance(self.deprecated_at, datetime.datetime):
113
+ deprecated_at = self.deprecated_at.isoformat()
114
+ else:
115
+ deprecated_at = self.deprecated_at
116
+
117
+ pricing = self.pricing.to_dict()
118
+
119
+
120
+ field_dict: dict[str, Any] = {}
121
+
122
+ field_dict.update({
123
+ "id": id,
124
+ "label": label,
125
+ "provider": provider,
126
+ "created_at": created_at,
127
+ "context_length": context_length,
128
+ "recommendation": recommendation,
129
+ "is_default": is_default,
130
+ "certified_grounding": certified_grounding,
131
+ "certified_suggest": certified_suggest,
132
+ "supports_grounding": supports_grounding,
133
+ "supports_suggest": supports_suggest,
134
+ "pricing_known": pricing_known,
135
+ "reasoning": reasoning,
136
+ "deprecated_at": deprecated_at,
137
+ "pricing": pricing,
138
+ })
139
+
140
+ return field_dict
141
+
142
+
143
+
144
+ @classmethod
145
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
146
+ from ..models.ocr_llm_model_catalog_entry_pricing import OcrLlmModelCatalogEntryPricing
147
+ from ..models.ocr_llm_model_catalog_entry_reasoning_type_0 import OcrLlmModelCatalogEntryReasoningType0
148
+ d = dict(src_dict)
149
+ id = d.pop("id")
150
+
151
+ label = d.pop("label")
152
+
153
+ provider = d.pop("provider")
154
+
155
+ def _parse_created_at(data: object) -> datetime.datetime | None:
156
+ if data is None:
157
+ return data
158
+ try:
159
+ if not isinstance(data, str):
160
+ raise TypeError()
161
+ created_at_type_0 = isoparse(data)
162
+
163
+
164
+
165
+ return created_at_type_0
166
+ except (TypeError, ValueError, AttributeError, KeyError):
167
+ pass
168
+ return cast(datetime.datetime | None, data)
169
+
170
+ created_at = _parse_created_at(d.pop("created_at"))
171
+
172
+
173
+ def _parse_context_length(data: object) -> int | None:
174
+ if data is None:
175
+ return data
176
+ return cast(int | None, data)
177
+
178
+ context_length = _parse_context_length(d.pop("context_length"))
179
+
180
+
181
+ recommendation = OcrLlmModelCatalogEntryRecommendation(d.pop("recommendation"))
182
+
183
+
184
+
185
+
186
+ is_default = d.pop("is_default")
187
+
188
+ certified_grounding = d.pop("certified_grounding")
189
+
190
+ certified_suggest = d.pop("certified_suggest")
191
+
192
+ supports_grounding = d.pop("supports_grounding")
193
+
194
+ supports_suggest = d.pop("supports_suggest")
195
+
196
+ pricing_known = d.pop("pricing_known")
197
+
198
+ def _parse_reasoning(data: object) -> None | OcrLlmModelCatalogEntryReasoningType0:
199
+ if data is None:
200
+ return data
201
+ try:
202
+ if not isinstance(data, dict):
203
+ raise TypeError()
204
+ reasoning_type_0 = OcrLlmModelCatalogEntryReasoningType0.from_dict(data)
205
+
206
+
207
+
208
+ return reasoning_type_0
209
+ except (TypeError, ValueError, AttributeError, KeyError):
210
+ pass
211
+ return cast(None | OcrLlmModelCatalogEntryReasoningType0, data)
212
+
213
+ reasoning = _parse_reasoning(d.pop("reasoning"))
214
+
215
+
216
+ def _parse_deprecated_at(data: object) -> datetime.datetime | None:
217
+ if data is None:
218
+ return data
219
+ try:
220
+ if not isinstance(data, str):
221
+ raise TypeError()
222
+ deprecated_at_type_0 = isoparse(data)
223
+
224
+
225
+
226
+ return deprecated_at_type_0
227
+ except (TypeError, ValueError, AttributeError, KeyError):
228
+ pass
229
+ return cast(datetime.datetime | None, data)
230
+
231
+ deprecated_at = _parse_deprecated_at(d.pop("deprecated_at"))
232
+
233
+
234
+ pricing = OcrLlmModelCatalogEntryPricing.from_dict(d.pop("pricing"))
235
+
236
+
237
+
238
+
239
+ ocr_llm_model_catalog_entry = cls(
240
+ id=id,
241
+ label=label,
242
+ provider=provider,
243
+ created_at=created_at,
244
+ context_length=context_length,
245
+ recommendation=recommendation,
246
+ is_default=is_default,
247
+ certified_grounding=certified_grounding,
248
+ certified_suggest=certified_suggest,
249
+ supports_grounding=supports_grounding,
250
+ supports_suggest=supports_suggest,
251
+ pricing_known=pricing_known,
252
+ reasoning=reasoning,
253
+ deprecated_at=deprecated_at,
254
+ pricing=pricing,
255
+ )
256
+
257
+ return ocr_llm_model_catalog_entry
@@ -0,0 +1,76 @@
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 typing import Literal, cast
12
+
13
+
14
+
15
+
16
+
17
+
18
+ T = TypeVar("T", bound="OcrLlmModelCatalogEntryPricing")
19
+
20
+
21
+
22
+ @_attrs_define
23
+ class OcrLlmModelCatalogEntryPricing:
24
+ """
25
+ Attributes:
26
+ prompt_usd_per_1m (float):
27
+ completion_usd_per_1m (float):
28
+ basis (Literal['customer_retail']):
29
+ """
30
+
31
+ prompt_usd_per_1m: float
32
+ completion_usd_per_1m: float
33
+ basis: Literal['customer_retail']
34
+
35
+
36
+
37
+
38
+
39
+ def to_dict(self) -> dict[str, Any]:
40
+ prompt_usd_per_1m = self.prompt_usd_per_1m
41
+
42
+ completion_usd_per_1m = self.completion_usd_per_1m
43
+
44
+ basis = self.basis
45
+
46
+
47
+ field_dict: dict[str, Any] = {}
48
+
49
+ field_dict.update({
50
+ "prompt_usd_per_1m": prompt_usd_per_1m,
51
+ "completion_usd_per_1m": completion_usd_per_1m,
52
+ "basis": basis,
53
+ })
54
+
55
+ return field_dict
56
+
57
+
58
+
59
+ @classmethod
60
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
61
+ d = dict(src_dict)
62
+ prompt_usd_per_1m = d.pop("prompt_usd_per_1m")
63
+
64
+ completion_usd_per_1m = d.pop("completion_usd_per_1m")
65
+
66
+ basis = cast(Literal['customer_retail'] , d.pop("basis"))
67
+ if basis != 'customer_retail':
68
+ raise ValueError(f"basis must match const 'customer_retail', got '{basis}'")
69
+
70
+ ocr_llm_model_catalog_entry_pricing = cls(
71
+ prompt_usd_per_1m=prompt_usd_per_1m,
72
+ completion_usd_per_1m=completion_usd_per_1m,
73
+ basis=basis,
74
+ )
75
+
76
+ return ocr_llm_model_catalog_entry_pricing