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,444 +0,0 @@
|
|
1
|
-
import json
|
2
|
-
from io import IOBase
|
3
|
-
from pathlib import Path
|
4
|
-
from typing import Any, Dict, List, Literal, Optional
|
5
|
-
|
6
|
-
from openai.types.chat.chat_completion_reasoning_effort import ChatCompletionReasoningEffort
|
7
|
-
from PIL.Image import Image
|
8
|
-
from pydantic import HttpUrl
|
9
|
-
|
10
|
-
from ...._resource import AsyncAPIResource, SyncAPIResource
|
11
|
-
from ...._utils.ai_models import assert_valid_model_extraction
|
12
|
-
from ....types.automations.outlook import FetchParams, ListOutlooks, MatchParams, Outlook, UpdateOutlookRequest
|
13
|
-
from ....types.logs import AutomationLog
|
14
|
-
from ....types.modalities import Modality
|
15
|
-
from ....types.standards import PreparedRequest
|
16
|
-
|
17
|
-
|
18
|
-
class OutlooksMixin:
|
19
|
-
def prepare_create(
|
20
|
-
self,
|
21
|
-
name: str,
|
22
|
-
json_schema: Dict[str, Any],
|
23
|
-
webhook_url: HttpUrl,
|
24
|
-
# email specific opitonals Fields
|
25
|
-
authorized_domains: List[str] = [],
|
26
|
-
authorized_emails: List[str] = [],
|
27
|
-
# HTTP Config Optional Fields
|
28
|
-
webhook_headers: Dict[str, str] = {},
|
29
|
-
# DocumentExtraction Config
|
30
|
-
image_resolution_dpi: Optional[int] = None,
|
31
|
-
browser_canvas: Optional[Literal['A3', 'A4', 'A5']] = None,
|
32
|
-
modality: Modality = "native",
|
33
|
-
model: str = "gpt-4o-mini",
|
34
|
-
temperature: float = 0,
|
35
|
-
reasoning_effort: ChatCompletionReasoningEffort = "medium",
|
36
|
-
# Optional Fields for data integration
|
37
|
-
match_params: Optional[List[MatchParams]] = None,
|
38
|
-
fetch_params: Optional[List[FetchParams]] = None,
|
39
|
-
layout_schema: Optional[Dict[str, Any]] = None,
|
40
|
-
) -> PreparedRequest:
|
41
|
-
assert_valid_model_extraction(model)
|
42
|
-
|
43
|
-
data = {
|
44
|
-
"name": name,
|
45
|
-
"webhook_url": webhook_url,
|
46
|
-
"webhook_headers": webhook_headers,
|
47
|
-
"json_schema": json_schema,
|
48
|
-
"authorized_domains": authorized_domains,
|
49
|
-
"authorized_emails": authorized_emails,
|
50
|
-
"image_resolution_dpi": image_resolution_dpi,
|
51
|
-
"browser_canvas": browser_canvas,
|
52
|
-
"modality": modality,
|
53
|
-
"model": model,
|
54
|
-
"temperature": temperature,
|
55
|
-
"reasoning_effort": reasoning_effort,
|
56
|
-
"layout_schema": layout_schema,
|
57
|
-
}
|
58
|
-
|
59
|
-
if match_params is not None:
|
60
|
-
data["match_params"] = match_params
|
61
|
-
if fetch_params is not None:
|
62
|
-
data["fetch_params"] = fetch_params
|
63
|
-
|
64
|
-
# Validate the data
|
65
|
-
outlook_data = Outlook.model_validate(data)
|
66
|
-
return PreparedRequest(method="POST", url="/v1/deployments/outlook", data=outlook_data.model_dump(mode="json"))
|
67
|
-
|
68
|
-
def prepare_list(
|
69
|
-
self,
|
70
|
-
before: str | None = None,
|
71
|
-
after: str | None = None,
|
72
|
-
limit: int = 10,
|
73
|
-
order: Literal["asc", "desc"] | None = "desc",
|
74
|
-
name: Optional[str] = None,
|
75
|
-
webhook_url: Optional[str] = None,
|
76
|
-
schema_id: Optional[str] = None,
|
77
|
-
schema_data_id: Optional[str] = None,
|
78
|
-
) -> PreparedRequest:
|
79
|
-
params = {
|
80
|
-
"before": before,
|
81
|
-
"after": after,
|
82
|
-
"limit": limit,
|
83
|
-
"order": order,
|
84
|
-
"name": name,
|
85
|
-
"webhook_url": webhook_url,
|
86
|
-
"schema_id": schema_id,
|
87
|
-
"schema_data_id": schema_data_id,
|
88
|
-
}
|
89
|
-
# Remove None values
|
90
|
-
params = {k: v for k, v in params.items() if v is not None}
|
91
|
-
|
92
|
-
return PreparedRequest(method="GET", url="/v1/deployments/outlook", params=params)
|
93
|
-
|
94
|
-
def prepare_get(self, outlook_id: str) -> PreparedRequest:
|
95
|
-
return PreparedRequest(method="GET", url=f"/v1/processors/automations/outlook/{outlook_id}")
|
96
|
-
|
97
|
-
def prepare_update(
|
98
|
-
self,
|
99
|
-
outlook_id: str,
|
100
|
-
name: Optional[str] = None,
|
101
|
-
webhook_url: Optional[HttpUrl] = None,
|
102
|
-
webhook_headers: Optional[Dict[str, str]] = None,
|
103
|
-
authorized_domains: Optional[List[str]] = None,
|
104
|
-
authorized_emails: Optional[List[str]] = None,
|
105
|
-
image_resolution_dpi: Optional[int] = None,
|
106
|
-
browser_canvas: Optional[Literal['A3', 'A4', 'A5']] = None,
|
107
|
-
modality: Optional[Modality] = None,
|
108
|
-
model: Optional[str] = None,
|
109
|
-
temperature: Optional[float] = None,
|
110
|
-
reasoning_effort: Optional[ChatCompletionReasoningEffort] = None,
|
111
|
-
json_schema: Optional[Dict[str, Any]] = None,
|
112
|
-
match_params: Optional[List[MatchParams]] = None,
|
113
|
-
fetch_params: Optional[List[FetchParams]] = None,
|
114
|
-
layout_schema: Optional[Dict[str, Any]] = None,
|
115
|
-
) -> PreparedRequest:
|
116
|
-
data: dict[str, Any] = {}
|
117
|
-
if name is not None:
|
118
|
-
data["name"] = name
|
119
|
-
if webhook_url is not None:
|
120
|
-
data["webhook_url"] = webhook_url
|
121
|
-
if webhook_headers is not None:
|
122
|
-
data["webhook_headers"] = webhook_headers
|
123
|
-
if authorized_domains is not None:
|
124
|
-
data["authorized_domains"] = authorized_domains
|
125
|
-
if authorized_emails is not None:
|
126
|
-
data["authorized_emails"] = authorized_emails
|
127
|
-
if image_resolution_dpi is not None:
|
128
|
-
data["image_resolution_dpi"] = image_resolution_dpi
|
129
|
-
if browser_canvas is not None:
|
130
|
-
data["browser_canvas"] = browser_canvas
|
131
|
-
if modality is not None:
|
132
|
-
data["modality"] = modality
|
133
|
-
if model is not None:
|
134
|
-
assert_valid_model_extraction(model)
|
135
|
-
data["model"] = model
|
136
|
-
if temperature is not None:
|
137
|
-
data["temperature"] = temperature
|
138
|
-
if json_schema is not None:
|
139
|
-
data["json_schema"] = json_schema
|
140
|
-
if match_params is not None:
|
141
|
-
data["match_params"] = match_params
|
142
|
-
if fetch_params is not None:
|
143
|
-
data["fetch_params"] = fetch_params
|
144
|
-
if reasoning_effort is not None:
|
145
|
-
data["reasoning_effort"] = reasoning_effort
|
146
|
-
if layout_schema is not None:
|
147
|
-
data["layout_schema"] = layout_schema
|
148
|
-
|
149
|
-
update_outlook_request = UpdateOutlookRequest.model_validate(data)
|
150
|
-
|
151
|
-
return PreparedRequest(method="PUT", url=f"/v1/processors/automations/outlook/{outlook_id}", data=update_outlook_request.model_dump(mode="json"))
|
152
|
-
|
153
|
-
def prepare_delete(self, outlook_id: str) -> PreparedRequest:
|
154
|
-
return PreparedRequest(method="DELETE", url=f"/v1/processors/automations/outlook/{outlook_id}")
|
155
|
-
|
156
|
-
class Outlooks(SyncAPIResource, OutlooksMixin):
|
157
|
-
"""Outlook API wrapper for managing outlook automation configurations"""
|
158
|
-
|
159
|
-
def __init__(self, client: Any) -> None:
|
160
|
-
super().__init__(client=client)
|
161
|
-
|
162
|
-
def create(
|
163
|
-
self,
|
164
|
-
name: str,
|
165
|
-
json_schema: Dict[str, Any],
|
166
|
-
webhook_url: HttpUrl,
|
167
|
-
authorized_domains: List[str] = [],
|
168
|
-
authorized_emails: List[str] = [],
|
169
|
-
webhook_headers: Dict[str, str] = {},
|
170
|
-
image_resolution_dpi: Optional[int] = None,
|
171
|
-
browser_canvas: Optional[Literal['A3', 'A4', 'A5']] = None,
|
172
|
-
modality: Modality = "native",
|
173
|
-
model: str = "gpt-4o-mini",
|
174
|
-
temperature: float = 0,
|
175
|
-
reasoning_effort: ChatCompletionReasoningEffort = "medium",
|
176
|
-
match_params: Optional[List[MatchParams]] = None,
|
177
|
-
fetch_params: Optional[List[FetchParams]] = None,
|
178
|
-
) -> Outlook:
|
179
|
-
"""Create a new outlook automation configuration.
|
180
|
-
|
181
|
-
Args:
|
182
|
-
name: Name of the outlook plugin
|
183
|
-
json_schema: JSON schema to validate extracted data
|
184
|
-
webhook_url: Webhook URL to receive processed data
|
185
|
-
webhook_headers: Webhook headers to send with processed data
|
186
|
-
authorized_domains: List of authorized domains
|
187
|
-
authorized_emails: List of authorized emails
|
188
|
-
image_resolution_dpi: Optional image resolution DPI
|
189
|
-
browser_canvas: Optional browser canvas size
|
190
|
-
modality: Processing modality (currently only "native" supported)
|
191
|
-
model: AI model to use for processing
|
192
|
-
temperature: Model temperature setting
|
193
|
-
reasoning_effort: The effort level for the model to reason about the input data.
|
194
|
-
match_params: List of match parameters for the outlook automation
|
195
|
-
fetch_params: List of fetch parameters for the outlook automation
|
196
|
-
Returns:
|
197
|
-
Outlook: The created outlook plugin configuration
|
198
|
-
"""
|
199
|
-
|
200
|
-
request = self.prepare_create(
|
201
|
-
name,
|
202
|
-
json_schema,
|
203
|
-
webhook_url,
|
204
|
-
authorized_domains,
|
205
|
-
authorized_emails,
|
206
|
-
webhook_headers,
|
207
|
-
image_resolution_dpi,
|
208
|
-
browser_canvas,
|
209
|
-
modality,
|
210
|
-
model,
|
211
|
-
temperature,
|
212
|
-
reasoning_effort,
|
213
|
-
match_params,
|
214
|
-
fetch_params,
|
215
|
-
)
|
216
|
-
response = self._client._prepared_request(request)
|
217
|
-
|
218
|
-
print(f"Outlook automation created. Outlook available at https://www.uiform.com/dashboard/processors/{response['id']}")
|
219
|
-
|
220
|
-
return Outlook.model_validate(response)
|
221
|
-
|
222
|
-
def list(
|
223
|
-
self,
|
224
|
-
before: str | None = None,
|
225
|
-
after: str | None = None,
|
226
|
-
limit: int = 10,
|
227
|
-
order: Literal["asc", "desc"] | None = "desc",
|
228
|
-
name: Optional[str] = None,
|
229
|
-
webhook_url: Optional[str] = None,
|
230
|
-
schema_id: Optional[str] = None,
|
231
|
-
schema_data_id: Optional[str] = None,
|
232
|
-
) -> ListOutlooks:
|
233
|
-
"""List all outlook automation configurations.
|
234
|
-
|
235
|
-
Args:
|
236
|
-
before: Optional cursor for pagination - get results before this log ID
|
237
|
-
after: Optional cursor for pagination - get results after this log ID
|
238
|
-
limit: Maximum number of logs to return (1-100, default 10)
|
239
|
-
order: Sort order by creation time - "asc" or "desc" (default "desc")
|
240
|
-
name: Optional name filter
|
241
|
-
webhook_url: Optional webhook URL filter
|
242
|
-
schema_id: Optional schema ID filter
|
243
|
-
schema_data_id: Optional schema data ID filter
|
244
|
-
match_params: Optional list of match parameters for the outlook automation
|
245
|
-
fetch_params: Optional list of fetch parameters for the outlook automation
|
246
|
-
Returns:
|
247
|
-
List[Outlook]: List of outlook plugin configurations
|
248
|
-
"""
|
249
|
-
request = self.prepare_list(before, after, limit, order, name, webhook_url, schema_id, schema_data_id)
|
250
|
-
response = self._client._prepared_request(request)
|
251
|
-
return ListOutlooks.model_validate(response)
|
252
|
-
|
253
|
-
def get(self, id: str) -> Outlook:
|
254
|
-
"""Get a specific outlook automation configuration.
|
255
|
-
|
256
|
-
Args:
|
257
|
-
id: ID of the outlook plugin
|
258
|
-
|
259
|
-
Returns:
|
260
|
-
Outlook: The outlook plugin configuration
|
261
|
-
"""
|
262
|
-
request = self.prepare_get(id)
|
263
|
-
response = self._client._prepared_request(request)
|
264
|
-
return Outlook.model_validate(response)
|
265
|
-
|
266
|
-
def update(
|
267
|
-
self,
|
268
|
-
outlook_id: str,
|
269
|
-
name: Optional[str] = None,
|
270
|
-
webhook_url: Optional[HttpUrl] = None,
|
271
|
-
webhook_headers: Optional[Dict[str, str]] = None,
|
272
|
-
authorized_domains: Optional[List[str]] = None,
|
273
|
-
authorized_emails: Optional[List[str]] = None,
|
274
|
-
image_resolution_dpi: Optional[int] = None,
|
275
|
-
browser_canvas: Optional[Literal['A3', 'A4', 'A5']] = None,
|
276
|
-
modality: Optional[Modality] = None,
|
277
|
-
model: Optional[str] = None,
|
278
|
-
temperature: Optional[float] = None,
|
279
|
-
reasoning_effort: Optional[ChatCompletionReasoningEffort] = None,
|
280
|
-
json_schema: Optional[Dict[str, Any]] = None,
|
281
|
-
match_params: Optional[List[MatchParams]] = None,
|
282
|
-
fetch_params: Optional[List[FetchParams]] = None,
|
283
|
-
layout_schema: Optional[Dict[str, Any]] = None,
|
284
|
-
) -> Outlook:
|
285
|
-
"""Update an outlook automation configuration.
|
286
|
-
|
287
|
-
Args:
|
288
|
-
outlook_id: ID of the outlook plugin to update
|
289
|
-
name: New name for the outlook plugin
|
290
|
-
webhook_url: New webhook URL
|
291
|
-
webhook_headers: New webhook headers
|
292
|
-
authorized_domains: New authorized domains
|
293
|
-
authorized_emails: New authorized emails
|
294
|
-
image_resolution_dpi: New image resolution DPI
|
295
|
-
browser_canvas: New browser canvas size
|
296
|
-
modality: New processing modality
|
297
|
-
model: New AI model
|
298
|
-
temperature: New temperature setting
|
299
|
-
reasoning_effort: New reasoning effort
|
300
|
-
json_schema: New JSON schema
|
301
|
-
match_params: New match parameters for the outlook automation
|
302
|
-
fetch_params: New fetch parameters for the outlook automation
|
303
|
-
layout_schema: New layout schema for the outlook automation
|
304
|
-
|
305
|
-
Returns:
|
306
|
-
Outlook: The updated outlook plugin configuration
|
307
|
-
"""
|
308
|
-
request = self.prepare_update(
|
309
|
-
outlook_id,
|
310
|
-
name,
|
311
|
-
webhook_url,
|
312
|
-
webhook_headers,
|
313
|
-
authorized_domains,
|
314
|
-
authorized_emails,
|
315
|
-
image_resolution_dpi,
|
316
|
-
browser_canvas,
|
317
|
-
modality,
|
318
|
-
model,
|
319
|
-
temperature,
|
320
|
-
reasoning_effort,
|
321
|
-
json_schema,
|
322
|
-
match_params,
|
323
|
-
fetch_params,
|
324
|
-
layout_schema,
|
325
|
-
)
|
326
|
-
response = self._client._prepared_request(request)
|
327
|
-
return Outlook.model_validate(response)
|
328
|
-
|
329
|
-
def delete(self, outlook_id: str) -> None:
|
330
|
-
"""Delete an outlook automation configuration.
|
331
|
-
|
332
|
-
Args:
|
333
|
-
outlook_id: ID of the outlook plugin to delete
|
334
|
-
"""
|
335
|
-
request = self.prepare_delete(outlook_id)
|
336
|
-
response = self._client._prepared_request(request)
|
337
|
-
return None
|
338
|
-
|
339
|
-
|
340
|
-
class AsyncOutlooks(AsyncAPIResource, OutlooksMixin):
|
341
|
-
def __init__(self, client: Any) -> None:
|
342
|
-
super().__init__(client=client)
|
343
|
-
|
344
|
-
async def create(
|
345
|
-
self,
|
346
|
-
name: str,
|
347
|
-
json_schema: Dict[str, Any],
|
348
|
-
webhook_url: HttpUrl,
|
349
|
-
authorized_domains: List[str] = [],
|
350
|
-
authorized_emails: List[str] = [],
|
351
|
-
webhook_headers: Dict[str, str] = {},
|
352
|
-
image_resolution_dpi: Optional[int] = None,
|
353
|
-
browser_canvas: Optional[Literal['A3', 'A4', 'A5']] = None,
|
354
|
-
modality: Modality = "native",
|
355
|
-
model: str = "gpt-4o-mini",
|
356
|
-
temperature: float = 0,
|
357
|
-
reasoning_effort: ChatCompletionReasoningEffort = "medium",
|
358
|
-
match_params: List[MatchParams] = [],
|
359
|
-
fetch_params: List[FetchParams] = [],
|
360
|
-
) -> Outlook:
|
361
|
-
request = self.prepare_create(
|
362
|
-
name,
|
363
|
-
json_schema,
|
364
|
-
webhook_url,
|
365
|
-
authorized_domains,
|
366
|
-
authorized_emails,
|
367
|
-
webhook_headers,
|
368
|
-
image_resolution_dpi,
|
369
|
-
browser_canvas,
|
370
|
-
modality,
|
371
|
-
model,
|
372
|
-
temperature,
|
373
|
-
reasoning_effort,
|
374
|
-
match_params,
|
375
|
-
fetch_params,
|
376
|
-
)
|
377
|
-
response = await self._client._prepared_request(request)
|
378
|
-
print(f"Outlook automation created. Outlook available at https://www.uiform.com/dashboard/processors/{response['id']}")
|
379
|
-
return Outlook.model_validate(response)
|
380
|
-
|
381
|
-
async def list(
|
382
|
-
self,
|
383
|
-
before: str | None = None,
|
384
|
-
after: str | None = None,
|
385
|
-
limit: int = 10,
|
386
|
-
order: Literal["asc", "desc"] | None = "desc",
|
387
|
-
name: Optional[str] = None,
|
388
|
-
webhook_url: Optional[str] = None,
|
389
|
-
schema_id: Optional[str] = None,
|
390
|
-
schema_data_id: Optional[str] = None,
|
391
|
-
) -> ListOutlooks:
|
392
|
-
request = self.prepare_list(before, after, limit, order, name, webhook_url, schema_id, schema_data_id)
|
393
|
-
response = await self._client._prepared_request(request)
|
394
|
-
return ListOutlooks.model_validate(response)
|
395
|
-
|
396
|
-
async def get(self, outlook_id: str) -> Outlook:
|
397
|
-
request = self.prepare_get(outlook_id)
|
398
|
-
response = await self._client._prepared_request(request)
|
399
|
-
return Outlook.model_validate(response)
|
400
|
-
|
401
|
-
async def update(
|
402
|
-
self,
|
403
|
-
outlook_id: str,
|
404
|
-
name: Optional[str] = None,
|
405
|
-
webhook_url: Optional[HttpUrl] = None,
|
406
|
-
webhook_headers: Optional[Dict[str, str]] = None,
|
407
|
-
authorized_domains: Optional[List[str]] = None,
|
408
|
-
authorized_emails: Optional[List[str]] = None,
|
409
|
-
image_resolution_dpi: Optional[int] = None,
|
410
|
-
browser_canvas: Optional[Literal['A3', 'A4', 'A5']] = None,
|
411
|
-
modality: Optional[Modality] = None,
|
412
|
-
model: Optional[str] = None,
|
413
|
-
temperature: Optional[float] = None,
|
414
|
-
reasoning_effort: Optional[ChatCompletionReasoningEffort] = None,
|
415
|
-
json_schema: Optional[Dict[str, Any]] = None,
|
416
|
-
match_params: Optional[List[MatchParams]] = None,
|
417
|
-
fetch_params: Optional[List[FetchParams]] = None,
|
418
|
-
layout_schema: Optional[Dict[str, Any]] = None,
|
419
|
-
) -> Outlook:
|
420
|
-
request = self.prepare_update(
|
421
|
-
outlook_id,
|
422
|
-
name,
|
423
|
-
webhook_url,
|
424
|
-
webhook_headers,
|
425
|
-
authorized_domains,
|
426
|
-
authorized_emails,
|
427
|
-
image_resolution_dpi,
|
428
|
-
browser_canvas,
|
429
|
-
modality,
|
430
|
-
model,
|
431
|
-
temperature,
|
432
|
-
reasoning_effort,
|
433
|
-
json_schema,
|
434
|
-
match_params,
|
435
|
-
fetch_params,
|
436
|
-
layout_schema,
|
437
|
-
)
|
438
|
-
response = await self._client._prepared_request(request)
|
439
|
-
return Outlook.model_validate(response)
|
440
|
-
|
441
|
-
async def delete(self, outlook_id: str) -> None:
|
442
|
-
request = self.prepare_delete(outlook_id)
|
443
|
-
await self._client._prepared_request(request)
|
444
|
-
return None
|
@@ -1,62 +0,0 @@
|
|
1
|
-
from ..._resource import AsyncAPIResource, SyncAPIResource
|
2
|
-
from ...types.standards import PreparedRequest
|
3
|
-
|
4
|
-
|
5
|
-
class WebhookMixin:
|
6
|
-
def prepare_create(self) -> PreparedRequest:
|
7
|
-
return PreparedRequest(method="POST", url="/v1/secrets/webhook")
|
8
|
-
|
9
|
-
def prepare_delete(self) -> PreparedRequest:
|
10
|
-
return PreparedRequest(method="DELETE", url="/v1/secrets/webhook")
|
11
|
-
|
12
|
-
|
13
|
-
class Webhook(SyncAPIResource, WebhookMixin):
|
14
|
-
"""Webhook secret management wrapper"""
|
15
|
-
|
16
|
-
def create(
|
17
|
-
self,
|
18
|
-
) -> dict:
|
19
|
-
"""Create a webhook secret.
|
20
|
-
|
21
|
-
Returns:
|
22
|
-
dict: Response indicating success
|
23
|
-
"""
|
24
|
-
request = self.prepare_create()
|
25
|
-
response = self._client._prepared_request(request)
|
26
|
-
|
27
|
-
return response
|
28
|
-
|
29
|
-
def delete(self) -> dict:
|
30
|
-
"""Delete a webhook secret.
|
31
|
-
|
32
|
-
Returns:
|
33
|
-
dict: Response indicating success
|
34
|
-
"""
|
35
|
-
request = self.prepare_delete()
|
36
|
-
response = self._client._prepared_request(request)
|
37
|
-
|
38
|
-
return response
|
39
|
-
|
40
|
-
|
41
|
-
class AsyncWebhook(AsyncAPIResource, WebhookMixin):
|
42
|
-
"""Webhook secret management wrapper"""
|
43
|
-
|
44
|
-
async def create(self) -> dict:
|
45
|
-
"""Create a webhook secret.
|
46
|
-
|
47
|
-
Returns:
|
48
|
-
dict: Response indicating success
|
49
|
-
"""
|
50
|
-
request = self.prepare_create()
|
51
|
-
response = await self._client._prepared_request(request)
|
52
|
-
return response
|
53
|
-
|
54
|
-
async def delete(self) -> dict:
|
55
|
-
"""Delete a webhook secret.
|
56
|
-
|
57
|
-
Returns:
|
58
|
-
dict: Response indicating success
|
59
|
-
"""
|
60
|
-
request = self.prepare_delete()
|
61
|
-
response = await self._client._prepared_request(request)
|
62
|
-
return response
|
uiform/types/consensus.py
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
from pydantic import BaseModel, Field
|
2
|
-
|
3
|
-
|
4
|
-
class ReconciliationResponse(BaseModel):
|
5
|
-
consensus_dict: dict = Field(
|
6
|
-
description="The consensus dictionary containing the reconciled values from the input dictionaries."
|
7
|
-
)
|
8
|
-
likelihoods: dict = Field(
|
9
|
-
description="A dictionary containing the likelihood/confidence scores for each field in the consensus dictionary."
|
10
|
-
)
|
uiform/types/deployments/cron.py
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
import datetime
|
2
|
-
from typing import Any, Literal, Optional
|
3
|
-
|
4
|
-
import nanoid # type: ignore
|
5
|
-
from openai.types.chat.chat_completion_reasoning_effort import ChatCompletionReasoningEffort
|
6
|
-
from pydantic import BaseModel, Field, HttpUrl, field_serializer
|
7
|
-
from pydantic_core import Url
|
8
|
-
|
9
|
-
from ..modalities import Modality
|
10
|
-
|
11
|
-
|
12
|
-
def scrapping_action(link: HttpUrl) -> dict[str, Any]:
|
13
|
-
raise NotImplementedError("Scrapping action not implemented")
|
14
|
-
|
15
|
-
|
16
|
-
class CronSchedule(BaseModel):
|
17
|
-
second: Optional[int] = Field(0, ge=0, le=59, description="Second (0-59), defaults to 0")
|
18
|
-
minute: int = Field(..., ge=0, le=59, description="Minute (0-59)")
|
19
|
-
hour: int = Field(..., ge=0, le=23, description="Hour (0-23)")
|
20
|
-
day_of_month: Optional[int] = Field(None, ge=1, le=31, description="Day of the month (1-31), None means any day")
|
21
|
-
month: Optional[int] = Field(None, ge=1, le=12, description="Month (1-12), None means every month")
|
22
|
-
day_of_week: Optional[int] = Field(None, ge=0, le=6, description="Day of the week (0-6, Sunday = 0), None means any day")
|
23
|
-
|
24
|
-
def to_cron_string(self) -> str:
|
25
|
-
return f"{self.second or '*'} {self.minute} {self.hour} {self.day_of_month or '*'} {self.month or '*'} {self.day_of_week or '*'}"
|
26
|
-
|
27
|
-
|
28
|
-
from ..logs import AutomationConfig
|
29
|
-
|
30
|
-
|
31
|
-
class ScrappingConfig(AutomationConfig):
|
32
|
-
object: Literal['deployment.scrapping_cron'] = "deployment.scrapping_cron"
|
33
|
-
id: str = Field(default_factory=lambda: "scrapping_" + nanoid.generate(), description="Unique identifier for the scrapping job")
|
34
|
-
|
35
|
-
# Scrapping Specific Config
|
36
|
-
link: HttpUrl = Field(..., description="Link to be scrapped")
|
37
|
-
schedule: CronSchedule
|
38
|
-
|
39
|
-
updated_at: datetime.datetime = Field(default_factory=lambda: datetime.datetime.now(datetime.timezone.utc))
|
40
|
-
|
41
|
-
# HTTP Config
|
42
|
-
webhook_url: HttpUrl = Field(..., description="Url of the webhook to send the data to")
|
43
|
-
webhook_headers: dict[str, str] = Field(default_factory=dict, description="Headers to send with the request")
|
44
|
-
|
45
|
-
modality: Modality
|
46
|
-
image_resolution_dpi: int = Field(default=96, description="Resolution of the image sent to the LLM")
|
47
|
-
browser_canvas: Literal['A3', 'A4', 'A5'] = Field(default='A4', description="Sets the size of the browser canvas for rendering documents in browser-based processing. Choose a size that matches the document type.")
|
48
|
-
|
49
|
-
# New attributes
|
50
|
-
model: str = Field(..., description="Model used for chat completion")
|
51
|
-
json_schema: dict[str, Any] = Field(..., description="JSON schema format used to validate the output data.")
|
52
|
-
temperature: float = Field(default=0.0, description="Temperature for sampling. If not provided, the default temperature for the model will be used.", examples=[0.0])
|
53
|
-
reasoning_effort: ChatCompletionReasoningEffort = Field(
|
54
|
-
default="medium", description="The effort level for the model to reason about the input data. If not provided, the default reasoning effort for the model will be used."
|
55
|
-
)
|
56
|
-
|
57
|
-
@field_serializer('webhook_url', 'link')
|
58
|
-
def url2str(self, val: HttpUrl) -> str:
|
59
|
-
return str(val)
|
@@ -1,28 +0,0 @@
|
|
1
|
-
import copy
|
2
|
-
import datetime
|
3
|
-
import json
|
4
|
-
from typing import Any, Literal, Optional
|
5
|
-
|
6
|
-
import nanoid # type: ignore
|
7
|
-
from openai.types.chat.chat_completion_reasoning_effort import ChatCompletionReasoningEffort
|
8
|
-
from pydantic import BaseModel, Field, HttpUrl, computed_field, field_serializer
|
9
|
-
|
10
|
-
from ..._utils.json_schema import clean_schema
|
11
|
-
from ..._utils.mime import generate_blake2b_hash_from_string
|
12
|
-
from ..logs import AutomationConfig, UpdateAutomationRequest
|
13
|
-
from ..modalities import Modality
|
14
|
-
from ..pagination import ListMetadata
|
15
|
-
|
16
|
-
|
17
|
-
class Endpoint(AutomationConfig):
|
18
|
-
object: Literal['deployment.endpoint'] = "deployment.endpoint"
|
19
|
-
id: str = Field(default_factory=lambda: "endp_" + nanoid.generate(), description="Unique identifier for the extraction endpoint")
|
20
|
-
|
21
|
-
class ListEndpoints(BaseModel):
|
22
|
-
data: list[Endpoint]
|
23
|
-
list_metadata: ListMetadata
|
24
|
-
|
25
|
-
|
26
|
-
# Inherits from the methods of UpdateAutomationRequest
|
27
|
-
class UpdateEndpointRequest(UpdateAutomationRequest):
|
28
|
-
pass
|
@@ -1,36 +0,0 @@
|
|
1
|
-
import copy
|
2
|
-
import datetime
|
3
|
-
import json
|
4
|
-
from typing import Any, Dict, Literal, Optional
|
5
|
-
|
6
|
-
import nanoid # type: ignore
|
7
|
-
from openai.types.chat.chat_completion_reasoning_effort import ChatCompletionReasoningEffort
|
8
|
-
from pydantic import BaseModel, Field, HttpUrl, computed_field, field_serializer
|
9
|
-
from pydantic_core import Url
|
10
|
-
|
11
|
-
from ..._utils.json_schema import clean_schema
|
12
|
-
from ..._utils.mime import generate_blake2b_hash_from_string
|
13
|
-
from ..logs import AutomationConfig, UpdateAutomationRequest
|
14
|
-
from ..modalities import Modality
|
15
|
-
from ..pagination import ListMetadata
|
16
|
-
|
17
|
-
|
18
|
-
class Link(AutomationConfig):
|
19
|
-
object: Literal['deployment.link'] = "deployment.link"
|
20
|
-
id: str = Field(default_factory=lambda: "lnk_" + nanoid.generate(), description="Unique identifier for the extraction link")
|
21
|
-
|
22
|
-
# Link Specific Config
|
23
|
-
password: Optional[str] = Field(None, description="Password to access the link")
|
24
|
-
|
25
|
-
|
26
|
-
class ListLinks(BaseModel):
|
27
|
-
data: list[Link]
|
28
|
-
list_metadata: ListMetadata
|
29
|
-
|
30
|
-
|
31
|
-
# Inherits from the methods of UpdateAutomationRequest
|
32
|
-
class UpdateLinkRequest(UpdateAutomationRequest):
|
33
|
-
# ------------------------------
|
34
|
-
# Link Config
|
35
|
-
# ------------------------------
|
36
|
-
password: Optional[str] = None
|