retab 0.0.35__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.
- {uiform → retab}/_utils/ai_models.py +2 -2
- {uiform → retab}/_utils/benchmarking.py +15 -16
- {uiform → retab}/_utils/chat.py +9 -14
- {uiform → retab}/_utils/display.py +0 -3
- {uiform → retab}/_utils/json_schema.py +9 -14
- {uiform → retab}/_utils/mime.py +11 -14
- {uiform → retab}/_utils/responses.py +9 -3
- {uiform → retab}/_utils/stream_context_managers.py +1 -1
- {uiform → retab}/_utils/usage/usage.py +28 -28
- {uiform → retab}/client.py +32 -31
- {uiform → retab}/resources/consensus/client.py +17 -36
- {uiform → retab}/resources/consensus/completions.py +24 -47
- {uiform → retab}/resources/consensus/completions_stream.py +26 -38
- {uiform → retab}/resources/consensus/responses.py +31 -80
- {uiform → retab}/resources/consensus/responses_stream.py +31 -79
- {uiform → retab}/resources/documents/client.py +59 -45
- {uiform → retab}/resources/documents/extractions.py +181 -90
- {uiform → retab}/resources/evals.py +56 -43
- retab/resources/evaluations/__init__.py +3 -0
- retab/resources/evaluations/client.py +301 -0
- retab/resources/evaluations/documents.py +233 -0
- retab/resources/evaluations/iterations.py +452 -0
- {uiform → retab}/resources/files.py +2 -2
- {uiform → retab}/resources/jsonlUtils.py +220 -216
- retab/resources/models.py +73 -0
- retab/resources/processors/automations/client.py +244 -0
- {uiform → retab}/resources/processors/automations/endpoints.py +77 -118
- retab/resources/processors/automations/links.py +294 -0
- {uiform → retab}/resources/processors/automations/logs.py +30 -19
- {uiform → retab}/resources/processors/automations/mailboxes.py +136 -174
- retab/resources/processors/automations/outlook.py +337 -0
- {uiform → retab}/resources/processors/automations/tests.py +22 -25
- {uiform → retab}/resources/processors/client.py +179 -164
- {uiform → retab}/resources/schemas.py +78 -66
- {uiform → retab}/resources/secrets/external_api_keys.py +1 -5
- retab/resources/secrets/webhook.py +64 -0
- {uiform → retab}/resources/usage.py +39 -2
- {uiform → retab}/types/ai_models.py +13 -13
- {uiform → retab}/types/automations/cron.py +19 -12
- {uiform → retab}/types/automations/endpoints.py +7 -4
- {uiform → retab}/types/automations/links.py +7 -3
- {uiform → retab}/types/automations/mailboxes.py +9 -9
- {uiform → retab}/types/automations/outlook.py +15 -11
- retab/types/browser_canvas.py +3 -0
- {uiform → retab}/types/chat.py +2 -2
- {uiform → retab}/types/completions.py +9 -12
- retab/types/consensus.py +19 -0
- {uiform → retab}/types/db/annotations.py +3 -3
- {uiform → retab}/types/db/files.py +8 -6
- {uiform → retab}/types/documents/create_messages.py +18 -20
- {uiform → retab}/types/documents/extractions.py +69 -24
- {uiform → retab}/types/evals.py +5 -5
- retab/types/evaluations/__init__.py +31 -0
- retab/types/evaluations/documents.py +30 -0
- retab/types/evaluations/iterations.py +112 -0
- retab/types/evaluations/model.py +73 -0
- retab/types/events.py +79 -0
- {uiform → retab}/types/extractions.py +33 -10
- retab/types/inference_settings.py +15 -0
- retab/types/jobs/base.py +54 -0
- retab/types/jobs/batch_annotation.py +12 -0
- {uiform → retab}/types/jobs/evaluation.py +1 -2
- {uiform → retab}/types/logs.py +37 -34
- retab/types/metrics.py +32 -0
- {uiform → retab}/types/mime.py +22 -20
- {uiform → retab}/types/modalities.py +10 -10
- retab/types/predictions.py +19 -0
- {uiform → retab}/types/schemas/enhance.py +4 -2
- {uiform → retab}/types/schemas/evaluate.py +7 -4
- {uiform → retab}/types/schemas/generate.py +6 -3
- {uiform → retab}/types/schemas/layout.py +1 -1
- {uiform → retab}/types/schemas/object.py +13 -14
- {uiform → retab}/types/schemas/templates.py +1 -3
- {uiform → retab}/types/secrets/external_api_keys.py +0 -1
- {uiform → retab}/types/standards.py +18 -1
- {retab-0.0.35.dist-info → retab-0.0.37.dist-info}/METADATA +7 -6
- retab-0.0.37.dist-info/RECORD +107 -0
- retab-0.0.37.dist-info/top_level.txt +1 -0
- retab-0.0.35.dist-info/RECORD +0 -111
- retab-0.0.35.dist-info/top_level.txt +0 -1
- uiform/_utils/benchmarking copy.py +0 -588
- uiform/resources/deployments/__init__.py +0 -9
- uiform/resources/deployments/client.py +0 -78
- uiform/resources/deployments/endpoints.py +0 -322
- uiform/resources/deployments/links.py +0 -452
- uiform/resources/deployments/logs.py +0 -211
- uiform/resources/deployments/mailboxes.py +0 -496
- uiform/resources/deployments/outlook.py +0 -531
- uiform/resources/deployments/tests.py +0 -158
- uiform/resources/models.py +0 -45
- uiform/resources/processors/automations/client.py +0 -78
- uiform/resources/processors/automations/links.py +0 -356
- uiform/resources/processors/automations/outlook.py +0 -444
- uiform/resources/secrets/webhook.py +0 -62
- uiform/types/consensus.py +0 -10
- uiform/types/deployments/cron.py +0 -59
- uiform/types/deployments/endpoints.py +0 -28
- uiform/types/deployments/links.py +0 -36
- uiform/types/deployments/mailboxes.py +0 -67
- uiform/types/deployments/outlook.py +0 -76
- uiform/types/deployments/webhooks.py +0 -21
- uiform/types/events.py +0 -76
- uiform/types/jobs/base.py +0 -150
- uiform/types/jobs/batch_annotation.py +0 -22
- uiform/types/secrets/__init__.py +0 -0
- {uiform → retab}/__init__.py +0 -0
- {uiform → retab}/_resource.py +0 -0
- {uiform → retab}/_utils/__init__.py +0 -0
- {uiform → retab}/_utils/usage/__init__.py +0 -0
- {uiform → retab}/py.typed +0 -0
- {uiform → retab}/resources/__init__.py +0 -0
- {uiform → retab}/resources/consensus/__init__.py +0 -0
- {uiform → retab}/resources/documents/__init__.py +0 -0
- {uiform → retab}/resources/finetuning.py +0 -0
- {uiform → retab}/resources/openai_example.py +0 -0
- {uiform → retab}/resources/processors/__init__.py +0 -0
- {uiform → retab}/resources/processors/automations/__init__.py +0 -0
- {uiform → retab}/resources/prompt_optimization.py +0 -0
- {uiform → retab}/resources/secrets/__init__.py +0 -0
- {uiform → retab}/resources/secrets/client.py +0 -0
- {uiform → retab}/types/__init__.py +0 -0
- {uiform → retab}/types/automations/__init__.py +0 -0
- {uiform → retab}/types/automations/webhooks.py +0 -0
- {uiform → retab}/types/db/__init__.py +0 -0
- {uiform/types/deployments → retab/types/documents}/__init__.py +0 -0
- {uiform → retab}/types/documents/correct_orientation.py +0 -0
- {uiform/types/documents → retab/types/jobs}/__init__.py +0 -0
- {uiform → retab}/types/jobs/finetune.py +0 -0
- {uiform → retab}/types/jobs/prompt_optimization.py +0 -0
- {uiform → retab}/types/jobs/webcrawl.py +0 -0
- {uiform → retab}/types/pagination.py +0 -0
- {uiform/types/jobs → retab/types/schemas}/__init__.py +0 -0
- {uiform/types/schemas → retab/types/secrets}/__init__.py +0 -0
- {retab-0.0.35.dist-info → retab-0.0.37.dist-info}/WHEEL +0 -0
@@ -1,33 +1,20 @@
|
|
1
|
-
import
|
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
|
9
|
-
from openai.types.responses.
|
10
|
-
from openai.types.shared_params.
|
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 ...
|
16
|
-
from ...
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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/
|
143
|
-
data=
|
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
|
2
|
-
|
3
|
-
from
|
4
|
-
|
5
|
-
from openai.types.
|
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.
|
19
|
-
from ...types.
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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/
|
145
|
-
data=
|
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
|
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
|
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
|
24
|
-
browser_canvas:
|
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
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
46
|
-
browser_canvas:
|
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
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
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[
|
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
|
116
|
-
browser_canvas:
|
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(
|
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
|
144
|
-
browser_canvas:
|
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(
|
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
|
180
|
-
browser_canvas:
|
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(
|
197
|
-
|
198
|
-
|
199
|
-
|
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
|
209
|
-
browser_canvas:
|
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(
|
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[
|
268
|
+
mime_response = MIMEData.model_validate(response["document"])
|
255
269
|
return convert_mime_data_to_pil_image(mime_response)
|