retab 0.0.36__py3-none-any.whl → 0.0.37__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 (119) hide show
  1. {uiform → retab}/_utils/ai_models.py +2 -2
  2. {uiform → retab}/_utils/benchmarking.py +15 -16
  3. {uiform → retab}/_utils/chat.py +9 -14
  4. {uiform → retab}/_utils/display.py +0 -3
  5. {uiform → retab}/_utils/json_schema.py +9 -14
  6. {uiform → retab}/_utils/mime.py +11 -14
  7. {uiform → retab}/_utils/responses.py +9 -3
  8. {uiform → retab}/_utils/stream_context_managers.py +1 -1
  9. {uiform → retab}/_utils/usage/usage.py +28 -28
  10. {uiform → retab}/client.py +32 -31
  11. {uiform → retab}/resources/consensus/client.py +17 -36
  12. {uiform → retab}/resources/consensus/completions.py +24 -47
  13. {uiform → retab}/resources/consensus/completions_stream.py +26 -38
  14. {uiform → retab}/resources/consensus/responses.py +31 -80
  15. {uiform → retab}/resources/consensus/responses_stream.py +31 -79
  16. {uiform → retab}/resources/documents/client.py +59 -45
  17. {uiform → retab}/resources/documents/extractions.py +181 -90
  18. {uiform → retab}/resources/evals.py +56 -43
  19. retab/resources/evaluations/__init__.py +3 -0
  20. retab/resources/evaluations/client.py +301 -0
  21. retab/resources/evaluations/documents.py +233 -0
  22. retab/resources/evaluations/iterations.py +452 -0
  23. {uiform → retab}/resources/files.py +2 -2
  24. {uiform → retab}/resources/jsonlUtils.py +220 -216
  25. retab/resources/models.py +73 -0
  26. retab/resources/processors/automations/client.py +244 -0
  27. {uiform → retab}/resources/processors/automations/endpoints.py +77 -118
  28. retab/resources/processors/automations/links.py +294 -0
  29. {uiform → retab}/resources/processors/automations/logs.py +30 -19
  30. {uiform → retab}/resources/processors/automations/mailboxes.py +136 -174
  31. retab/resources/processors/automations/outlook.py +337 -0
  32. {uiform → retab}/resources/processors/automations/tests.py +22 -25
  33. {uiform → retab}/resources/processors/client.py +179 -164
  34. {uiform → retab}/resources/schemas.py +78 -66
  35. {uiform → retab}/resources/secrets/external_api_keys.py +1 -5
  36. retab/resources/secrets/webhook.py +64 -0
  37. {uiform → retab}/resources/usage.py +39 -2
  38. {uiform → retab}/types/ai_models.py +13 -13
  39. {uiform → retab}/types/automations/cron.py +19 -12
  40. {uiform → retab}/types/automations/endpoints.py +7 -4
  41. {uiform → retab}/types/automations/links.py +7 -3
  42. {uiform → retab}/types/automations/mailboxes.py +9 -9
  43. {uiform → retab}/types/automations/outlook.py +15 -11
  44. retab/types/browser_canvas.py +3 -0
  45. {uiform → retab}/types/chat.py +2 -2
  46. {uiform → retab}/types/completions.py +9 -12
  47. retab/types/consensus.py +19 -0
  48. {uiform → retab}/types/db/annotations.py +3 -3
  49. {uiform → retab}/types/db/files.py +8 -6
  50. {uiform → retab}/types/documents/create_messages.py +18 -20
  51. {uiform → retab}/types/documents/extractions.py +69 -24
  52. {uiform → retab}/types/evals.py +5 -5
  53. retab/types/evaluations/__init__.py +31 -0
  54. retab/types/evaluations/documents.py +30 -0
  55. retab/types/evaluations/iterations.py +112 -0
  56. retab/types/evaluations/model.py +73 -0
  57. retab/types/events.py +79 -0
  58. {uiform → retab}/types/extractions.py +33 -10
  59. retab/types/inference_settings.py +15 -0
  60. retab/types/jobs/base.py +54 -0
  61. retab/types/jobs/batch_annotation.py +12 -0
  62. {uiform → retab}/types/jobs/evaluation.py +1 -2
  63. {uiform → retab}/types/logs.py +37 -34
  64. retab/types/metrics.py +32 -0
  65. {uiform → retab}/types/mime.py +22 -20
  66. {uiform → retab}/types/modalities.py +10 -10
  67. retab/types/predictions.py +19 -0
  68. {uiform → retab}/types/schemas/enhance.py +4 -2
  69. {uiform → retab}/types/schemas/evaluate.py +7 -4
  70. {uiform → retab}/types/schemas/generate.py +6 -3
  71. {uiform → retab}/types/schemas/layout.py +1 -1
  72. {uiform → retab}/types/schemas/object.py +13 -14
  73. {uiform → retab}/types/schemas/templates.py +1 -3
  74. {uiform → retab}/types/secrets/external_api_keys.py +0 -1
  75. {uiform → retab}/types/standards.py +18 -1
  76. {retab-0.0.36.dist-info → retab-0.0.37.dist-info}/METADATA +7 -6
  77. retab-0.0.37.dist-info/RECORD +107 -0
  78. retab-0.0.37.dist-info/top_level.txt +1 -0
  79. retab-0.0.36.dist-info/RECORD +0 -96
  80. retab-0.0.36.dist-info/top_level.txt +0 -1
  81. uiform/_utils/benchmarking copy.py +0 -588
  82. uiform/resources/models.py +0 -45
  83. uiform/resources/processors/automations/client.py +0 -78
  84. uiform/resources/processors/automations/links.py +0 -356
  85. uiform/resources/processors/automations/outlook.py +0 -444
  86. uiform/resources/secrets/webhook.py +0 -62
  87. uiform/types/consensus.py +0 -10
  88. uiform/types/events.py +0 -76
  89. uiform/types/jobs/base.py +0 -150
  90. uiform/types/jobs/batch_annotation.py +0 -22
  91. {uiform → retab}/__init__.py +0 -0
  92. {uiform → retab}/_resource.py +0 -0
  93. {uiform → retab}/_utils/__init__.py +0 -0
  94. {uiform → retab}/_utils/usage/__init__.py +0 -0
  95. {uiform → retab}/py.typed +0 -0
  96. {uiform → retab}/resources/__init__.py +0 -0
  97. {uiform → retab}/resources/consensus/__init__.py +0 -0
  98. {uiform → retab}/resources/documents/__init__.py +0 -0
  99. {uiform → retab}/resources/finetuning.py +0 -0
  100. {uiform → retab}/resources/openai_example.py +0 -0
  101. {uiform → retab}/resources/processors/__init__.py +0 -0
  102. {uiform → retab}/resources/processors/automations/__init__.py +0 -0
  103. {uiform → retab}/resources/prompt_optimization.py +0 -0
  104. {uiform → retab}/resources/secrets/__init__.py +0 -0
  105. {uiform → retab}/resources/secrets/client.py +0 -0
  106. {uiform → retab}/types/__init__.py +0 -0
  107. {uiform → retab}/types/automations/__init__.py +0 -0
  108. {uiform → retab}/types/automations/webhooks.py +0 -0
  109. {uiform → retab}/types/db/__init__.py +0 -0
  110. {uiform → retab}/types/documents/__init__.py +0 -0
  111. {uiform → retab}/types/documents/correct_orientation.py +0 -0
  112. {uiform → retab}/types/jobs/__init__.py +0 -0
  113. {uiform → retab}/types/jobs/finetune.py +0 -0
  114. {uiform → retab}/types/jobs/prompt_optimization.py +0 -0
  115. {uiform → retab}/types/jobs/webcrawl.py +0 -0
  116. {uiform → retab}/types/pagination.py +0 -0
  117. {uiform → retab}/types/schemas/__init__.py +0 -0
  118. {uiform → retab}/types/secrets/__init__.py +0 -0
  119. {retab-0.0.36.dist-info → retab-0.0.37.dist-info}/WHEEL +0 -0
@@ -1,33 +1,20 @@
1
- import json
2
- from pathlib import Path
3
- from typing import Any, AsyncGenerator, Generator, TypeVar, Generic, Optional, Union, List, Sequence, cast
1
+ from typing import Optional, TypeVar, Union
4
2
 
5
- from openai.types.chat.chat_completion_reasoning_effort import ChatCompletionReasoningEffort
6
- from openai.types.chat.parsed_chat_completion import ParsedChatCompletionMessage
7
3
  from openai.types.responses.response import Response
8
- from openai.types.responses.response_input_param import ResponseInputParam, ResponseInputItemParam
9
- from openai.types.responses.response_output_item import ResponseOutputItem
10
- from openai.types.shared_params.response_format_json_schema import ResponseFormatJSONSchema
4
+ from openai.types.responses.response_input_param import ResponseInputParam
5
+ from openai.types.responses.response_text_config_param import ResponseTextConfigParam
6
+ from openai.types.shared_params.reasoning import Reasoning
11
7
  from pydantic import BaseModel
12
8
 
13
9
  from ..._resource import AsyncAPIResource, SyncAPIResource
14
10
  from ..._utils.ai_models import assert_valid_model_extraction
15
- from ..._utils.json_schema import load_json_schema, unflatten_dict
16
- from ..._utils.responses import convert_to_openai_format, convert_from_openai_format, parse_openai_responses_response
17
- from ..._utils.stream_context_managers import as_async_context_manager, as_context_manager
18
- from ...types.chat import ChatCompletionUiformMessage
19
- from ...types.completions import UiChatResponseCreateRequest, UiChatCompletionsRequest
20
- from ...types.documents.extractions import UiParsedChatCompletion, UiParsedChatCompletionChunk, UiParsedChoice, UiResponse
21
- from ...types.standards import PreparedRequest
11
+ from ...types.completions import UiChatResponseCreateRequest
12
+ from ...types.documents.extractions import UiResponse
22
13
  from ...types.schemas.object import Schema
14
+ from ...types.standards import PreparedRequest
23
15
 
24
- from typing import Optional, Union
25
- from openai.types.shared_params.reasoning import Reasoning
26
- from openai.types.responses.response_input_param import ResponseInputParam
27
- from openai.types.responses.response_text_config_param import ResponseTextConfigParam
28
- from openai.types.shared_params.response_format_json_schema import ResponseFormatJSONSchema
16
+ T = TypeVar("T", bound=BaseModel)
29
17
 
30
- T = TypeVar('T', bound=BaseModel)
31
18
 
32
19
  class BaseResponsesMixin:
33
20
  def prepare_create(
@@ -55,35 +42,20 @@ class BaseResponsesMixin:
55
42
 
56
43
  if instructions is None:
57
44
  instructions = schema_obj.developer_system_prompt
58
-
45
+
59
46
  # Create the request object based on the UiChatResponseCreateRequest model
60
- data = UiChatResponseCreateRequest(
47
+ request = UiChatResponseCreateRequest(
61
48
  model=model,
62
49
  input=input,
63
50
  temperature=temperature,
64
51
  stream=False,
65
- reasoning=reasoning,
52
+ reasoning=reasoning,
66
53
  n_consensus=n_consensus,
67
- text={
68
- "format": {
69
- "type": "json_schema",
70
- "name": schema_obj.id,
71
- "schema": schema_obj.inference_json_schema,
72
- "strict": True
73
- }
74
- },
54
+ text={"format": {"type": "json_schema", "name": schema_obj.id, "schema": schema_obj.inference_json_schema, "strict": True}},
75
55
  instructions=instructions,
76
56
  )
77
57
 
78
- # Validate the request data
79
- ui_chat_response_create_request = UiChatResponseCreateRequest.model_validate(data)
80
-
81
- return PreparedRequest(
82
- method="POST",
83
- url="/v1/responses",
84
- data=ui_chat_response_create_request.model_dump(),
85
- idempotency_key=idempotency_key
86
- )
58
+ return PreparedRequest(method="POST", url="/v1/responses", data=request.model_dump(), idempotency_key=idempotency_key)
87
59
 
88
60
  def prepare_parse(
89
61
  self,
@@ -106,42 +78,24 @@ class BaseResponsesMixin:
106
78
 
107
79
  if instructions is None:
108
80
  instructions = schema_obj.developer_system_prompt
109
-
81
+
110
82
  # Create the request object based on the UiChatResponseCreateRequest model
111
- data = UiChatResponseCreateRequest(
83
+ request = UiChatResponseCreateRequest(
112
84
  model=model,
113
85
  input=input,
114
86
  temperature=temperature,
115
87
  stream=False,
116
- reasoning=reasoning,
88
+ reasoning=reasoning,
117
89
  n_consensus=n_consensus,
118
- text={
119
- "format": {
120
- "type": "json_schema",
121
- "name": schema_obj.id,
122
- "schema": schema_obj.inference_json_schema,
123
- "strict": True
124
- }
125
- },
90
+ text={"format": {"type": "json_schema", "name": schema_obj.id, "schema": schema_obj.inference_json_schema, "strict": True}},
126
91
  instructions=instructions,
127
92
  )
128
93
 
129
- # Validate the request data
130
- ui_chat_response_create_request = UiChatResponseCreateRequest.model_validate(data)
131
-
132
- return PreparedRequest(
133
- method="POST",
134
- url="/v1/responses",
135
- data=ui_chat_response_create_request.model_dump(),
136
- idempotency_key=idempotency_key
137
- )
138
-
139
-
140
94
  return PreparedRequest(
141
- method="POST",
142
- url="/v1/completions",
143
- data=ui_chat_completions_request.model_dump(),
144
- idempotency_key=idempotency_key
95
+ method="POST",
96
+ url="/v1/responses",
97
+ data=request.model_dump(),
98
+ idempotency_key=idempotency_key,
145
99
  )
146
100
 
147
101
 
@@ -161,7 +115,7 @@ class Responses(SyncAPIResource, BaseResponsesMixin):
161
115
  ) -> Response:
162
116
  """
163
117
  Create a completion using the UiForm API with OpenAI Responses API compatible interface.
164
-
118
+
165
119
  Args:
166
120
  model: The model to use
167
121
  input: The input text or message array
@@ -187,9 +141,9 @@ class Responses(SyncAPIResource, BaseResponsesMixin):
187
141
 
188
142
  result = self._client._prepared_request(request)
189
143
  response = UiResponse.model_validate(result)
190
-
144
+
191
145
  return response
192
-
146
+
193
147
  def parse(
194
148
  self,
195
149
  model: str,
@@ -203,7 +157,7 @@ class Responses(SyncAPIResource, BaseResponsesMixin):
203
157
  ) -> Response:
204
158
  """
205
159
  Parse content using the UiForm API with OpenAI Responses API compatible interface.
206
-
160
+
207
161
  Args:
208
162
  model: The model to use
209
163
  input: The input text or message array
@@ -213,7 +167,7 @@ class Responses(SyncAPIResource, BaseResponsesMixin):
213
167
  n_consensus: Number of consensus models to use
214
168
  instructions: Optional system instructions
215
169
  idempotency_key: Idempotency key for request
216
-
170
+
217
171
  Returns:
218
172
  Response: OpenAI Responses API compatible response with parsed content
219
173
  """
@@ -230,7 +184,7 @@ class Responses(SyncAPIResource, BaseResponsesMixin):
230
184
 
231
185
  result = self._client._prepared_request(request)
232
186
  response = UiResponse.model_validate(result)
233
-
187
+
234
188
  return response
235
189
 
236
190
 
@@ -250,7 +204,7 @@ class AsyncResponses(AsyncAPIResource, BaseResponsesMixin):
250
204
  ) -> UiResponse:
251
205
  """
252
206
  Create a completion using the UiForm API asynchronously with OpenAI Responses API compatible interface.
253
-
207
+
254
208
  Args:
255
209
  model: The model to use
256
210
  input: The input text or message array
@@ -260,7 +214,7 @@ class AsyncResponses(AsyncAPIResource, BaseResponsesMixin):
260
214
  n_consensus: Number of consensus models to use
261
215
  instructions: Optional system instructions
262
216
  idempotency_key: Idempotency key for request
263
-
217
+
264
218
  Returns:
265
219
  Response: OpenAI Responses API compatible response
266
220
  """
@@ -278,9 +232,7 @@ class AsyncResponses(AsyncAPIResource, BaseResponsesMixin):
278
232
  result = await self._client._prepared_request(request)
279
233
  response = UiResponse.model_validate(result)
280
234
  return response
281
-
282
235
 
283
-
284
236
  async def parse(
285
237
  self,
286
238
  model: str,
@@ -294,7 +246,7 @@ class AsyncResponses(AsyncAPIResource, BaseResponsesMixin):
294
246
  ) -> UiResponse:
295
247
  """
296
248
  Parse content using the UiForm API asynchronously with OpenAI Responses API compatible interface.
297
-
249
+
298
250
  Args:
299
251
  model: The model to use
300
252
  input: The input text or message array
@@ -304,7 +256,7 @@ class AsyncResponses(AsyncAPIResource, BaseResponsesMixin):
304
256
  n_consensus: Number of consensus models to use
305
257
  instructions: Optional system instructions
306
258
  idempotency_key: Idempotency key for request
307
-
259
+
308
260
  Returns:
309
261
  Response: OpenAI Responses API compatible response with parsed content
310
262
  """
@@ -322,4 +274,3 @@ class AsyncResponses(AsyncAPIResource, BaseResponsesMixin):
322
274
  result = await self._client._prepared_request(request)
323
275
  response = UiResponse.model_validate(result)
324
276
  return response
325
-
@@ -1,33 +1,20 @@
1
- import json
2
- from pathlib import Path
3
- from typing import Any, AsyncGenerator, Generator, TypeVar, Generic, Optional, Union, List, Sequence, cast
4
-
5
- from openai.types.chat.chat_completion_reasoning_effort import ChatCompletionReasoningEffort
6
- from openai.types.chat.parsed_chat_completion import ParsedChatCompletionMessage
7
- from openai.types.responses.response import Response
8
- from openai.types.responses.response_input_param import ResponseInputParam, ResponseInputItemParam
9
- from openai.types.responses.response_output_item import ResponseOutputItem
10
- from openai.types.shared_params.response_format_json_schema import ResponseFormatJSONSchema
1
+ from typing import AsyncGenerator, Generator, Optional, TypeVar, Union
2
+
3
+ from openai.types.responses.response_input_param import ResponseInputParam
4
+ from openai.types.responses.response_text_config_param import ResponseTextConfigParam
5
+ from openai.types.shared_params.reasoning import Reasoning
11
6
  from pydantic import BaseModel
12
7
 
13
8
  from ..._resource import AsyncAPIResource, SyncAPIResource
14
9
  from ..._utils.ai_models import assert_valid_model_extraction
15
- from ..._utils.json_schema import load_json_schema, unflatten_dict
16
- from ..._utils.responses import convert_to_openai_format, convert_from_openai_format, parse_openai_responses_response
17
10
  from ..._utils.stream_context_managers import as_async_context_manager, as_context_manager
18
- from ...types.chat import ChatCompletionUiformMessage
19
- from ...types.completions import UiChatResponseCreateRequest, UiChatCompletionsRequest
20
- from ...types.documents.extractions import UiParsedChatCompletion, UiParsedChatCompletionChunk, UiParsedChoice, UiResponse
21
- from ...types.standards import PreparedRequest
11
+ from ...types.completions import UiChatResponseCreateRequest
12
+ from ...types.documents.extractions import UiResponse
22
13
  from ...types.schemas.object import Schema
14
+ from ...types.standards import PreparedRequest
23
15
 
24
- from typing import Optional, Union
25
- from openai.types.shared_params.reasoning import Reasoning
26
- from openai.types.responses.response_input_param import ResponseInputParam
27
- from openai.types.responses.response_text_config_param import ResponseTextConfigParam
28
- from openai.types.shared_params.response_format_json_schema import ResponseFormatJSONSchema
16
+ T = TypeVar("T", bound=BaseModel)
29
17
 
30
- T = TypeVar('T', bound=BaseModel)
31
18
 
32
19
  class BaseResponsesMixin:
33
20
  def prepare_create(
@@ -56,35 +43,20 @@ class BaseResponsesMixin:
56
43
 
57
44
  if instructions is None:
58
45
  instructions = schema_obj.developer_system_prompt
59
-
46
+
60
47
  # Create the request object based on the UiChatResponseCreateRequest model
61
- data = UiChatResponseCreateRequest(
48
+ request = UiChatResponseCreateRequest(
62
49
  model=model,
63
50
  input=input,
64
51
  temperature=temperature,
65
52
  stream=stream,
66
- reasoning=reasoning,
53
+ reasoning=reasoning,
67
54
  n_consensus=n_consensus,
68
- text={
69
- "format": {
70
- "type": "json_schema",
71
- "name": schema_obj.id,
72
- "schema": schema_obj.inference_json_schema,
73
- "strict": True
74
- }
75
- },
55
+ text={"format": {"type": "json_schema", "name": schema_obj.id, "schema": schema_obj.inference_json_schema, "strict": True}},
76
56
  instructions=instructions,
77
57
  )
78
58
 
79
- # Validate the request data
80
- ui_chat_response_create_request = UiChatResponseCreateRequest.model_validate(data)
81
-
82
- return PreparedRequest(
83
- method="POST",
84
- url="/v1/responses",
85
- data=ui_chat_response_create_request.model_dump(),
86
- idempotency_key=idempotency_key
87
- )
59
+ return PreparedRequest(method="POST", url="/v1/responses", data=request.model_dump(), idempotency_key=idempotency_key)
88
60
 
89
61
  def prepare_parse(
90
62
  self,
@@ -108,42 +80,24 @@ class BaseResponsesMixin:
108
80
 
109
81
  if instructions is None:
110
82
  instructions = schema_obj.developer_system_prompt
111
-
83
+
112
84
  # Create the request object based on the UiChatResponseCreateRequest model
113
- data = UiChatResponseCreateRequest(
85
+ request = UiChatResponseCreateRequest(
114
86
  model=model,
115
87
  input=input,
116
88
  temperature=temperature,
117
89
  stream=stream,
118
- reasoning=reasoning,
90
+ reasoning=reasoning,
119
91
  n_consensus=n_consensus,
120
- text={
121
- "format": {
122
- "type": "json_schema",
123
- "name": schema_obj.id,
124
- "schema": schema_obj.inference_json_schema,
125
- "strict": True
126
- }
127
- },
92
+ text={"format": {"type": "json_schema", "name": schema_obj.id, "schema": schema_obj.inference_json_schema, "strict": True}},
128
93
  instructions=instructions,
129
94
  )
130
95
 
131
- # Validate the request data
132
- ui_chat_response_create_request = UiChatResponseCreateRequest.model_validate(data)
133
-
134
- return PreparedRequest(
135
- method="POST",
136
- url="/v1/responses",
137
- data=ui_chat_response_create_request.model_dump(),
138
- idempotency_key=idempotency_key
139
- )
140
-
141
-
142
96
  return PreparedRequest(
143
- method="POST",
144
- url="/v1/completions",
145
- data=ui_chat_completions_request.model_dump(),
146
- idempotency_key=idempotency_key
97
+ method="POST",
98
+ url="/v1/responses",
99
+ data=request.model_dump(),
100
+ idempotency_key=idempotency_key,
147
101
  )
148
102
 
149
103
 
@@ -164,7 +118,7 @@ class Responses(SyncAPIResource, BaseResponsesMixin):
164
118
  ) -> Generator[UiResponse, None, None]:
165
119
  """
166
120
  Create a completion using the UiForm API with streaming enabled.
167
-
121
+
168
122
  Args:
169
123
  model: The model to use
170
124
  input: The input text or message array
@@ -174,7 +128,7 @@ class Responses(SyncAPIResource, BaseResponsesMixin):
174
128
  n_consensus: Number of consensus models to use
175
129
  instructions: Optional system instructions
176
130
  idempotency_key: Idempotency key for request
177
-
131
+
178
132
  Returns:
179
133
  Generator[UiResponse]: Stream of responses
180
134
 
@@ -218,7 +172,7 @@ class Responses(SyncAPIResource, BaseResponsesMixin):
218
172
  ) -> Generator[UiResponse, None, None]:
219
173
  """
220
174
  Parse content using the UiForm API with streaming enabled.
221
-
175
+
222
176
  Args:
223
177
  model: The model to use
224
178
  input: The input text or message array
@@ -228,7 +182,7 @@ class Responses(SyncAPIResource, BaseResponsesMixin):
228
182
  n_consensus: Number of consensus models to use
229
183
  instructions: Optional system instructions
230
184
  idempotency_key: Idempotency key for request
231
-
185
+
232
186
  Returns:
233
187
  Generator[UiResponse]: Stream of parsed responses
234
188
 
@@ -259,7 +213,6 @@ class Responses(SyncAPIResource, BaseResponsesMixin):
259
213
  yield response
260
214
 
261
215
 
262
-
263
216
  class AsyncResponses(AsyncAPIResource, BaseResponsesMixin):
264
217
  """UiForm Responses API compatible with OpenAI Responses API for async usage"""
265
218
 
@@ -277,7 +230,7 @@ class AsyncResponses(AsyncAPIResource, BaseResponsesMixin):
277
230
  ) -> AsyncGenerator[UiResponse, None]:
278
231
  """
279
232
  Create a completion using the UiForm API asynchronously with streaming enabled.
280
-
233
+
281
234
  Args:
282
235
  model: The model to use
283
236
  input: The input text or message array
@@ -287,7 +240,7 @@ class AsyncResponses(AsyncAPIResource, BaseResponsesMixin):
287
240
  n_consensus: Number of consensus models to use
288
241
  instructions: Optional system instructions
289
242
  idempotency_key: Idempotency key for request
290
-
243
+
291
244
  Returns:
292
245
  AsyncGenerator[UiResponse]: Async stream of responses
293
246
 
@@ -316,7 +269,7 @@ class AsyncResponses(AsyncAPIResource, BaseResponsesMixin):
316
269
  continue
317
270
  response = UiResponse.model_validate(chunk_json)
318
271
  yield response
319
-
272
+
320
273
  @as_async_context_manager
321
274
  async def stream_parse(
322
275
  self,
@@ -331,7 +284,7 @@ class AsyncResponses(AsyncAPIResource, BaseResponsesMixin):
331
284
  ) -> AsyncGenerator[UiResponse, None]:
332
285
  """
333
286
  Parse content using the UiForm API asynchronously with streaming enabled.
334
-
287
+
335
288
  Args:
336
289
  model: The model to use
337
290
  input: The input text or message array
@@ -341,7 +294,7 @@ class AsyncResponses(AsyncAPIResource, BaseResponsesMixin):
341
294
  n_consensus: Number of consensus models to use
342
295
  instructions: Optional system instructions
343
296
  idempotency_key: Idempotency key for request
344
-
297
+
345
298
  Returns:
346
299
  AsyncGenerator[UiResponse]: Async stream of parsed responses
347
300
 
@@ -370,4 +323,3 @@ class AsyncResponses(AsyncAPIResource, BaseResponsesMixin):
370
323
  continue
371
324
  response = UiResponse.model_validate(chunk_json)
372
325
  yield response
373
-
@@ -1,18 +1,20 @@
1
1
  from io import IOBase
2
2
  from pathlib import Path
3
- from typing import Any, Literal
3
+ from typing import Any
4
4
 
5
5
  import PIL.Image
6
6
  from pydantic import HttpUrl
7
+ from pydantic_core import PydanticUndefined
7
8
 
8
9
  from ..._resource import AsyncAPIResource, SyncAPIResource
10
+ from ..._utils.json_schema import load_json_schema
9
11
  from ..._utils.mime import convert_mime_data_to_pil_image, prepare_mime_document
10
- from ...types.documents.create_messages import DocumentCreateMessageRequest, DocumentMessage, DocumentCreateInputRequest
12
+ from ...types.documents.create_messages import DocumentCreateInputRequest, DocumentCreateMessageRequest, DocumentMessage
13
+ from ...types.browser_canvas import BrowserCanvas
11
14
  from ...types.mime import MIMEData
12
15
  from ...types.modalities import Modality
13
16
  from ...types.standards import PreparedRequest
14
17
  from .extractions import AsyncExtractions, Extractions
15
- from ..._utils.json_schema import load_json_schema
16
18
 
17
19
 
18
20
  class BaseDocumentsMixin:
@@ -20,21 +22,18 @@ class BaseDocumentsMixin:
20
22
  self,
21
23
  document: Path | str | IOBase | MIMEData | PIL.Image.Image | HttpUrl,
22
24
  modality: Modality = "native",
23
- image_resolution_dpi: int | None = None,
24
- browser_canvas: Literal['A3', 'A4', 'A5'] | None = None,
25
+ image_resolution_dpi: int = PydanticUndefined, # type: ignore[assignment]
26
+ browser_canvas: BrowserCanvas = PydanticUndefined, # type: ignore[assignment]
25
27
  idempotency_key: str | None = None,
26
28
  ) -> PreparedRequest:
27
29
  mime_document = prepare_mime_document(document)
28
- data: dict[str, Any] = {
29
- "document": mime_document.model_dump(),
30
- "modality": modality,
31
- }
32
- if image_resolution_dpi:
33
- data["image_resolution_dpi"] = image_resolution_dpi
34
- if browser_canvas:
35
- data["browser_canvas"] = browser_canvas
36
-
37
- loading_request = DocumentCreateMessageRequest.model_validate(data)
30
+
31
+ loading_request = DocumentCreateMessageRequest(
32
+ document=mime_document,
33
+ modality=modality,
34
+ image_resolution_dpi=image_resolution_dpi,
35
+ browser_canvas=browser_canvas,
36
+ )
38
37
  return PreparedRequest(method="POST", url="/v1/documents/create_messages", data=loading_request.model_dump(), idempotency_key=idempotency_key)
39
38
 
40
39
  def _prepare_create_inputs(
@@ -42,24 +41,20 @@ class BaseDocumentsMixin:
42
41
  document: Path | str | IOBase | MIMEData | PIL.Image.Image | HttpUrl,
43
42
  json_schema: dict[str, Any] | Path | str,
44
43
  modality: Modality = "native",
45
- image_resolution_dpi: int | None = None,
46
- browser_canvas: Literal['A3', 'A4', 'A5'] | None = None,
44
+ image_resolution_dpi: int = PydanticUndefined, # type: ignore[assignment],
45
+ browser_canvas: BrowserCanvas = PydanticUndefined, # type: ignore[assignment],
47
46
  idempotency_key: str | None = None,
48
47
  ) -> PreparedRequest:
49
48
  mime_document = prepare_mime_document(document)
50
49
  loaded_schema = load_json_schema(json_schema)
51
50
 
52
- data: dict[str, Any] = {
53
- "document": mime_document.model_dump(),
54
- "modality": modality,
55
- "json_schema": loaded_schema,
56
- }
57
- if image_resolution_dpi:
58
- data["image_resolution_dpi"] = image_resolution_dpi
59
- if browser_canvas:
60
- data["browser_canvas"] = browser_canvas
61
-
62
- loading_request = DocumentCreateInputRequest.model_validate(data)
51
+ loading_request = DocumentCreateInputRequest(
52
+ document=mime_document,
53
+ modality=modality,
54
+ json_schema=loaded_schema,
55
+ image_resolution_dpi=image_resolution_dpi,
56
+ browser_canvas=browser_canvas,
57
+ )
63
58
  return PreparedRequest(method="POST", url="/v1/documents/create_inputs", data=loading_request.model_dump(), idempotency_key=idempotency_key)
64
59
 
65
60
  def _prepare_correct_image_orientation(self, document: Path | str | IOBase | MIMEData | PIL.Image.Image) -> PreparedRequest:
@@ -105,15 +100,15 @@ class Documents(SyncAPIResource, BaseDocumentsMixin):
105
100
  """
106
101
  request = self._prepare_correct_image_orientation(document)
107
102
  response = self._client._prepared_request(request)
108
- mime_response = MIMEData.model_validate(response['document'])
103
+ mime_response = MIMEData.model_validate(response["document"])
109
104
  return convert_mime_data_to_pil_image(mime_response)
110
105
 
111
106
  def create_messages(
112
107
  self,
113
108
  document: Path | str | IOBase | MIMEData | PIL.Image.Image | HttpUrl,
114
109
  modality: Modality = "native",
115
- image_resolution_dpi: int | None = None,
116
- browser_canvas: Literal['A3', 'A4', 'A5'] | None = None,
110
+ image_resolution_dpi: int = PydanticUndefined, # type: ignore[assignment]
111
+ browser_canvas: BrowserCanvas = PydanticUndefined, # type: ignore[assignment]
117
112
  idempotency_key: str | None = None,
118
113
  ) -> DocumentMessage:
119
114
  """
@@ -131,7 +126,9 @@ class Documents(SyncAPIResource, BaseDocumentsMixin):
131
126
  Raises:
132
127
  UiformAPIError: If the API request fails.
133
128
  """
134
- request = self._prepare_create_messages(document, modality, image_resolution_dpi, browser_canvas, idempotency_key)
129
+ request = self._prepare_create_messages(
130
+ document=document, modality=modality, image_resolution_dpi=image_resolution_dpi, browser_canvas=browser_canvas, idempotency_key=idempotency_key
131
+ )
135
132
  response = self._client._prepared_request(request)
136
133
  return DocumentMessage.model_validate(response)
137
134
 
@@ -140,8 +137,8 @@ class Documents(SyncAPIResource, BaseDocumentsMixin):
140
137
  document: Path | str | IOBase | MIMEData | PIL.Image.Image | HttpUrl,
141
138
  json_schema: dict[str, Any] | Path | str,
142
139
  modality: Modality = "native",
143
- image_resolution_dpi: int | None = None,
144
- browser_canvas: Literal['A3', 'A4', 'A5'] | None = None,
140
+ image_resolution_dpi: int = PydanticUndefined, # type: ignore[assignment]
141
+ browser_canvas: BrowserCanvas = PydanticUndefined, # type: ignore[assignment]
145
142
  idempotency_key: str | None = None,
146
143
  ) -> DocumentMessage:
147
144
  """
@@ -160,7 +157,14 @@ class Documents(SyncAPIResource, BaseDocumentsMixin):
160
157
  Raises:
161
158
  UiformAPIError: If the API request fails.
162
159
  """
163
- request = self._prepare_create_inputs(document, json_schema, modality, image_resolution_dpi, browser_canvas, idempotency_key)
160
+ request = self._prepare_create_inputs(
161
+ document=document,
162
+ json_schema=json_schema,
163
+ modality=modality,
164
+ image_resolution_dpi=image_resolution_dpi,
165
+ browser_canvas=browser_canvas,
166
+ idempotency_key=idempotency_key,
167
+ )
164
168
  response = self._client._prepared_request(request)
165
169
  return DocumentMessage.model_validate(response)
166
170
 
@@ -176,8 +180,8 @@ class AsyncDocuments(AsyncAPIResource, BaseDocumentsMixin):
176
180
  self,
177
181
  document: Path | str | IOBase | MIMEData | PIL.Image.Image,
178
182
  modality: Modality = "native",
179
- image_resolution_dpi: int | None = None,
180
- browser_canvas: Literal['A3', 'A4', 'A5'] | None = None,
183
+ image_resolution_dpi: int = PydanticUndefined, # type: ignore[assignment]
184
+ browser_canvas: BrowserCanvas = PydanticUndefined, # type: ignore[assignment]
181
185
  idempotency_key: str | None = None,
182
186
  ) -> DocumentMessage:
183
187
  """
@@ -193,10 +197,13 @@ class AsyncDocuments(AsyncAPIResource, BaseDocumentsMixin):
193
197
  Raises:
194
198
  UiformAPIError: If the API request fails.
195
199
  """
196
- request = self._prepare_create_messages(document, modality, image_resolution_dpi, browser_canvas, idempotency_key)
197
- assert request.data is not None
198
- print(request.data.keys())
199
- print(request.data)
200
+ request = self._prepare_create_messages(
201
+ document=document,
202
+ modality=modality,
203
+ image_resolution_dpi=image_resolution_dpi,
204
+ browser_canvas=browser_canvas,
205
+ idempotency_key=idempotency_key,
206
+ )
200
207
  response = await self._client._prepared_request(request)
201
208
  return DocumentMessage.model_validate(response)
202
209
 
@@ -205,8 +212,8 @@ class AsyncDocuments(AsyncAPIResource, BaseDocumentsMixin):
205
212
  document: Path | str | IOBase | MIMEData | PIL.Image.Image | HttpUrl,
206
213
  json_schema: dict[str, Any] | Path | str,
207
214
  modality: Modality = "native",
208
- image_resolution_dpi: int | None = None,
209
- browser_canvas: Literal['A3', 'A4', 'A5'] | None = None,
215
+ image_resolution_dpi: int = PydanticUndefined, # type: ignore[assignment]
216
+ browser_canvas: BrowserCanvas = PydanticUndefined, # type: ignore[assignment]
210
217
  idempotency_key: str | None = None,
211
218
  ) -> DocumentMessage:
212
219
  """
@@ -225,7 +232,14 @@ class AsyncDocuments(AsyncAPIResource, BaseDocumentsMixin):
225
232
  Raises:
226
233
  UiformAPIError: If the API request fails.
227
234
  """
228
- request = self._prepare_create_inputs(document, json_schema, modality, image_resolution_dpi, browser_canvas, idempotency_key)
235
+ request = self._prepare_create_inputs(
236
+ document=document,
237
+ json_schema=json_schema,
238
+ modality=modality,
239
+ image_resolution_dpi=image_resolution_dpi,
240
+ browser_canvas=browser_canvas,
241
+ idempotency_key=idempotency_key,
242
+ )
229
243
  response = await self._client._prepared_request(request)
230
244
  return DocumentMessage.model_validate(response)
231
245
 
@@ -251,5 +265,5 @@ class AsyncDocuments(AsyncAPIResource, BaseDocumentsMixin):
251
265
  """
252
266
  request = self._prepare_correct_image_orientation(document)
253
267
  response = await self._client._prepared_request(request)
254
- mime_response = MIMEData.model_validate(response['document'])
268
+ mime_response = MIMEData.model_validate(response["document"])
255
269
  return convert_mime_data_to_pil_image(mime_response)