retab 0.0.35__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 (111) hide show
  1. retab-0.0.35.dist-info/METADATA +417 -0
  2. retab-0.0.35.dist-info/RECORD +111 -0
  3. retab-0.0.35.dist-info/WHEEL +5 -0
  4. retab-0.0.35.dist-info/top_level.txt +1 -0
  5. uiform/__init__.py +4 -0
  6. uiform/_resource.py +28 -0
  7. uiform/_utils/__init__.py +0 -0
  8. uiform/_utils/ai_models.py +100 -0
  9. uiform/_utils/benchmarking copy.py +588 -0
  10. uiform/_utils/benchmarking.py +485 -0
  11. uiform/_utils/chat.py +332 -0
  12. uiform/_utils/display.py +443 -0
  13. uiform/_utils/json_schema.py +2161 -0
  14. uiform/_utils/mime.py +168 -0
  15. uiform/_utils/responses.py +163 -0
  16. uiform/_utils/stream_context_managers.py +52 -0
  17. uiform/_utils/usage/__init__.py +0 -0
  18. uiform/_utils/usage/usage.py +300 -0
  19. uiform/client.py +701 -0
  20. uiform/py.typed +0 -0
  21. uiform/resources/__init__.py +0 -0
  22. uiform/resources/consensus/__init__.py +3 -0
  23. uiform/resources/consensus/client.py +114 -0
  24. uiform/resources/consensus/completions.py +252 -0
  25. uiform/resources/consensus/completions_stream.py +278 -0
  26. uiform/resources/consensus/responses.py +325 -0
  27. uiform/resources/consensus/responses_stream.py +373 -0
  28. uiform/resources/deployments/__init__.py +9 -0
  29. uiform/resources/deployments/client.py +78 -0
  30. uiform/resources/deployments/endpoints.py +322 -0
  31. uiform/resources/deployments/links.py +452 -0
  32. uiform/resources/deployments/logs.py +211 -0
  33. uiform/resources/deployments/mailboxes.py +496 -0
  34. uiform/resources/deployments/outlook.py +531 -0
  35. uiform/resources/deployments/tests.py +158 -0
  36. uiform/resources/documents/__init__.py +3 -0
  37. uiform/resources/documents/client.py +255 -0
  38. uiform/resources/documents/extractions.py +441 -0
  39. uiform/resources/evals.py +812 -0
  40. uiform/resources/files.py +24 -0
  41. uiform/resources/finetuning.py +62 -0
  42. uiform/resources/jsonlUtils.py +1046 -0
  43. uiform/resources/models.py +45 -0
  44. uiform/resources/openai_example.py +22 -0
  45. uiform/resources/processors/__init__.py +3 -0
  46. uiform/resources/processors/automations/__init__.py +9 -0
  47. uiform/resources/processors/automations/client.py +78 -0
  48. uiform/resources/processors/automations/endpoints.py +317 -0
  49. uiform/resources/processors/automations/links.py +356 -0
  50. uiform/resources/processors/automations/logs.py +211 -0
  51. uiform/resources/processors/automations/mailboxes.py +435 -0
  52. uiform/resources/processors/automations/outlook.py +444 -0
  53. uiform/resources/processors/automations/tests.py +158 -0
  54. uiform/resources/processors/client.py +474 -0
  55. uiform/resources/prompt_optimization.py +76 -0
  56. uiform/resources/schemas.py +369 -0
  57. uiform/resources/secrets/__init__.py +9 -0
  58. uiform/resources/secrets/client.py +20 -0
  59. uiform/resources/secrets/external_api_keys.py +109 -0
  60. uiform/resources/secrets/webhook.py +62 -0
  61. uiform/resources/usage.py +271 -0
  62. uiform/types/__init__.py +0 -0
  63. uiform/types/ai_models.py +645 -0
  64. uiform/types/automations/__init__.py +0 -0
  65. uiform/types/automations/cron.py +58 -0
  66. uiform/types/automations/endpoints.py +21 -0
  67. uiform/types/automations/links.py +28 -0
  68. uiform/types/automations/mailboxes.py +60 -0
  69. uiform/types/automations/outlook.py +68 -0
  70. uiform/types/automations/webhooks.py +21 -0
  71. uiform/types/chat.py +8 -0
  72. uiform/types/completions.py +93 -0
  73. uiform/types/consensus.py +10 -0
  74. uiform/types/db/__init__.py +0 -0
  75. uiform/types/db/annotations.py +24 -0
  76. uiform/types/db/files.py +36 -0
  77. uiform/types/deployments/__init__.py +0 -0
  78. uiform/types/deployments/cron.py +59 -0
  79. uiform/types/deployments/endpoints.py +28 -0
  80. uiform/types/deployments/links.py +36 -0
  81. uiform/types/deployments/mailboxes.py +67 -0
  82. uiform/types/deployments/outlook.py +76 -0
  83. uiform/types/deployments/webhooks.py +21 -0
  84. uiform/types/documents/__init__.py +0 -0
  85. uiform/types/documents/correct_orientation.py +13 -0
  86. uiform/types/documents/create_messages.py +226 -0
  87. uiform/types/documents/extractions.py +297 -0
  88. uiform/types/evals.py +207 -0
  89. uiform/types/events.py +76 -0
  90. uiform/types/extractions.py +85 -0
  91. uiform/types/jobs/__init__.py +0 -0
  92. uiform/types/jobs/base.py +150 -0
  93. uiform/types/jobs/batch_annotation.py +22 -0
  94. uiform/types/jobs/evaluation.py +133 -0
  95. uiform/types/jobs/finetune.py +6 -0
  96. uiform/types/jobs/prompt_optimization.py +41 -0
  97. uiform/types/jobs/webcrawl.py +6 -0
  98. uiform/types/logs.py +231 -0
  99. uiform/types/mime.py +257 -0
  100. uiform/types/modalities.py +68 -0
  101. uiform/types/pagination.py +6 -0
  102. uiform/types/schemas/__init__.py +0 -0
  103. uiform/types/schemas/enhance.py +53 -0
  104. uiform/types/schemas/evaluate.py +55 -0
  105. uiform/types/schemas/generate.py +32 -0
  106. uiform/types/schemas/layout.py +58 -0
  107. uiform/types/schemas/object.py +631 -0
  108. uiform/types/schemas/templates.py +107 -0
  109. uiform/types/secrets/__init__.py +0 -0
  110. uiform/types/secrets/external_api_keys.py +22 -0
  111. uiform/types/standards.py +39 -0
@@ -0,0 +1,356 @@
1
+ import datetime
2
+ import json
3
+ from io import IOBase
4
+ from pathlib import Path
5
+ from typing import Any, Dict, Literal, Optional
6
+
7
+ import httpx
8
+ from openai.types.chat.chat_completion_reasoning_effort import ChatCompletionReasoningEffort
9
+ from PIL.Image import Image
10
+ from pydantic import HttpUrl
11
+
12
+ from ...._resource import AsyncAPIResource, SyncAPIResource
13
+ from ...._utils.ai_models import assert_valid_model_extraction
14
+ from ...._utils.mime import prepare_mime_document
15
+ from ....types.automations.links import Link, ListLinks, UpdateLinkRequest
16
+ from ....types.documents.extractions import UiParsedChatCompletion
17
+ from ....types.logs import AutomationLog, ExternalRequestLog, ListLogs
18
+ from ....types.mime import BaseMIMEData, MIMEData
19
+ from ....types.modalities import Modality
20
+ from ....types.standards import PreparedRequest
21
+
22
+
23
+ class LinksMixin:
24
+ def prepare_create(
25
+ self,
26
+ name: str,
27
+ json_schema: Dict[str, Any],
28
+ webhook_url: HttpUrl,
29
+ webhook_headers: Optional[Dict[str, str]] = None,
30
+ password: str | None = None,
31
+ # DocumentExtraction Config
32
+ image_resolution_dpi: Optional[int] = None,
33
+ browser_canvas: Optional[str] = None,
34
+ modality: Modality = "native",
35
+ model: str = "gpt-4o-mini",
36
+ temperature: float = 0,
37
+ reasoning_effort: ChatCompletionReasoningEffort = "medium",
38
+ ) -> PreparedRequest:
39
+ assert_valid_model_extraction(model)
40
+
41
+ data = {
42
+ "name": name,
43
+ "webhook_url": webhook_url,
44
+ "webhook_headers": webhook_headers or {},
45
+ "json_schema": json_schema,
46
+ "password": password,
47
+ "image_resolution_dpi": image_resolution_dpi,
48
+ "browser_canvas": browser_canvas,
49
+ "modality": modality,
50
+ "model": model,
51
+ "temperature": temperature,
52
+ "reasoning_effort": reasoning_effort,
53
+ }
54
+
55
+ request = Link.model_validate(data)
56
+ return PreparedRequest(method="POST", url="/v1/deployments/links", data=request.model_dump(mode='json'))
57
+
58
+ def prepare_list(
59
+ self,
60
+ before: Optional[str] = None,
61
+ after: Optional[str] = None,
62
+ limit: Optional[int] = 10,
63
+ order: Optional[Literal["asc", "desc"]] = "desc",
64
+ # Filtering parameters
65
+ link_id: Optional[str] = None,
66
+ name: Optional[str] = None,
67
+ webhook_url: Optional[str] = None,
68
+ schema_id: Optional[str] = None,
69
+ schema_data_id: Optional[str] = None,
70
+ ) -> PreparedRequest:
71
+ params = {
72
+ "before": before,
73
+ "after": after,
74
+ "limit": limit,
75
+ "order": order,
76
+ "automation_id": link_id,
77
+ "name": name,
78
+ "webhook_url": webhook_url,
79
+ "schema_id": schema_id,
80
+ "schema_data_id": schema_data_id,
81
+ }
82
+ # Remove None values
83
+ params = {k: v for k, v in params.items() if v is not None}
84
+
85
+ return PreparedRequest(method="GET", url="/v1/deployments", params=params)
86
+
87
+ def prepare_get(self, link_id: str) -> PreparedRequest:
88
+ """Get a specific extraction link configuration.
89
+
90
+ Args:
91
+ link_id: ID of the extraction link
92
+
93
+ Returns:
94
+ Link: The extraction link configuration
95
+ """
96
+ return PreparedRequest(method="GET", url=f"/v1/deployments/{link_id}")
97
+
98
+ def prepare_update(
99
+ self,
100
+ link_id: str,
101
+ name: Optional[str] = None,
102
+ webhook_url: Optional[HttpUrl] = None,
103
+ webhook_headers: Optional[Dict[str, str]] = None,
104
+ password: Optional[str] = None,
105
+ image_resolution_dpi: Optional[int] = None,
106
+ browser_canvas: Optional[str] = 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
+ ) -> PreparedRequest:
113
+ data: dict[str, Any] = {}
114
+
115
+ if link_id is not None:
116
+ data["id"] = link_id
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 password is not None:
124
+ data["password"] = password
125
+ if image_resolution_dpi is not None:
126
+ data["image_resolution_dpi"] = image_resolution_dpi
127
+ if browser_canvas is not None:
128
+ data["browser_canvas"] = browser_canvas
129
+ if modality is not None:
130
+ data["modality"] = modality
131
+ if model is not None:
132
+ assert_valid_model_extraction(model)
133
+ data["model"] = model
134
+ if temperature is not None:
135
+ data["temperature"] = temperature
136
+ if json_schema is not None:
137
+ data["json_schema"] = json_schema
138
+ if reasoning_effort is not None:
139
+ data["reasoning_effort"] = reasoning_effort
140
+
141
+ request = UpdateLinkRequest.model_validate(data)
142
+ return PreparedRequest(method="PUT", url=f"/v1/deployments/{link_id}", data=request.model_dump(mode='json'))
143
+
144
+ def prepare_delete(self, link_id: str) -> PreparedRequest:
145
+ return PreparedRequest(method="DELETE", url=f"/v1/processors/automations/links/{link_id}", raise_for_status=True)
146
+
147
+ class Links(SyncAPIResource, LinksMixin):
148
+ """Extraction Link API wrapper for managing extraction link configurations"""
149
+
150
+ def __init__(self, client: Any) -> None:
151
+ super().__init__(client=client)
152
+
153
+ def create(
154
+ self,
155
+ name: str,
156
+ json_schema: Dict[str, Any],
157
+ webhook_url: HttpUrl,
158
+ webhook_headers: Optional[Dict[str, str]] = None,
159
+ password: str | None = None,
160
+ # DocumentExtraction Config
161
+ image_resolution_dpi: Optional[int] = None,
162
+ browser_canvas: Optional[str] = None,
163
+ modality: Modality = "native",
164
+ model: str = "gpt-4o-mini",
165
+ temperature: float = 0,
166
+ reasoning_effort: ChatCompletionReasoningEffort = "medium",
167
+ ) -> Link:
168
+ """Create a new extraction link configuration.
169
+
170
+ Args:
171
+ name: Name of the extraction link
172
+ json_schema: JSON schema to validate extracted data
173
+ webhook_url: Webhook endpoint for forwarding processed files
174
+ webhook_headers: Optional HTTP headers for webhook requests
175
+ password: Optional password for protected links
176
+ image_resolution_dpi: Optional image resolution DPI
177
+ browser_canvas: Optional browser canvas
178
+ modality: Processing modality (currently only "native" supported)
179
+ model: AI model to use for processing
180
+ temperature: Model temperature setting
181
+ reasoning_effort: The effort level for the model to reason about the input data.
182
+ Returns:
183
+ Link: The created extraction link configuration
184
+ """
185
+
186
+ request = self.prepare_create(name, json_schema, webhook_url, webhook_headers, password, image_resolution_dpi, browser_canvas, modality, model, temperature, reasoning_effort)
187
+ response = self._client._prepared_request(request)
188
+
189
+ print(f"Extraction Link Created. Link available at https://www.uiform.com/dashboard/processors/{response['id']}")
190
+ return Link.model_validate(response)
191
+
192
+ def list(
193
+ self,
194
+ before: Optional[str] = None,
195
+ after: Optional[str] = None,
196
+ limit: Optional[int] = 10,
197
+ order: Optional[Literal["asc", "desc"]] = "desc",
198
+ # Filtering parameters
199
+ link_id: Optional[str] = None,
200
+ name: Optional[str] = None,
201
+ webhook_url: Optional[str] = None,
202
+ schema_id: Optional[str] = None,
203
+ schema_data_id: Optional[str] = None,
204
+ ) -> ListLinks:
205
+ """List extraction link configurations with pagination support.
206
+
207
+ Args:
208
+ before: Optional cursor for pagination before a specific link ID
209
+ after: Optional cursor for pagination after a specific link ID
210
+ limit: Optional limit on number of results (max 100)
211
+ order: Optional sort order ("asc" or "desc")
212
+ link_id: Optional filter by extraction link ID
213
+ name: Optional filter by link name
214
+ webhook_url: Optional filter by webhook URL
215
+ schema_id: Optional filter by schema ID
216
+ schema_data_id: Optional filter by schema data ID
217
+
218
+ Returns:
219
+ ListLinks: Paginated list of extraction link configurations with metadata
220
+ """
221
+ request = self.prepare_list(before, after, limit, order, link_id, name, webhook_url, schema_id, schema_data_id)
222
+ response = self._client._prepared_request(request)
223
+ return ListLinks.model_validate(response)
224
+
225
+ def get(self, link_id: str) -> Link:
226
+ """Get a specific extraction link configuration.
227
+
228
+ Args:
229
+ link_id: ID of the extraction link
230
+
231
+ Returns:
232
+ Link: The extraction link configuration
233
+ """
234
+ request = self.prepare_get(link_id)
235
+ response = self._client._prepared_request(request)
236
+ return Link.model_validate(response)
237
+
238
+ def update(
239
+ self,
240
+ link_id: str,
241
+ name: Optional[str] = None,
242
+ webhook_url: Optional[HttpUrl] = None,
243
+ webhook_headers: Optional[Dict[str, str]] = None,
244
+ password: Optional[str] = None,
245
+ image_resolution_dpi: Optional[int] = None,
246
+ browser_canvas: Optional[str] = None,
247
+ modality: Optional[Modality] = None,
248
+ model: Optional[str] = None,
249
+ temperature: Optional[float] = None,
250
+ reasoning_effort: Optional[ChatCompletionReasoningEffort] = None,
251
+ json_schema: Optional[Dict[str, Any]] = None,
252
+ ) -> Link:
253
+ """Update an extraction link configuration.
254
+
255
+ Args:
256
+ link_id: ID of the extraction link to update
257
+ name: New name for the link
258
+ webhook_url: New webhook endpoint URL
259
+ webhook_headers: New webhook headers
260
+ password: New password for protected links
261
+ image_resolution_dpi: New image resolution DPI
262
+ browser_canvas: New browser canvas
263
+ modality: New processing modality
264
+ model: New AI model
265
+ temperature: New temperature setting
266
+ reasoning_effort: The effort level for the model to reason about the input data.
267
+ json_schema: New JSON schema
268
+
269
+ Returns:
270
+ Link: The updated extraction link configuration
271
+ """
272
+
273
+ request = self.prepare_update(link_id, name, webhook_url, webhook_headers, password, image_resolution_dpi, browser_canvas, modality, model, temperature, reasoning_effort, json_schema)
274
+ response = self._client._prepared_request(request)
275
+ return Link.model_validate(response)
276
+
277
+ def delete(self, link_id: str) -> None:
278
+ """Delete an extraction link configuration.
279
+
280
+ Args:
281
+ link_id: ID of the extraction link to delete
282
+
283
+ Returns:
284
+ Dict[str, str]: Response message confirming deletion
285
+ """
286
+ request = self.prepare_delete(link_id)
287
+ self._client._prepared_request(request)
288
+
289
+ class AsyncLinks(AsyncAPIResource, LinksMixin):
290
+ """Async Extraction Link API wrapper for managing extraction link configurations"""
291
+
292
+ def __init__(self, client: Any) -> None:
293
+ super().__init__(client=client)
294
+
295
+ async def create(
296
+ self,
297
+ name: str,
298
+ json_schema: Dict[str, Any],
299
+ webhook_url: HttpUrl,
300
+ webhook_headers: Optional[Dict[str, str]] = None,
301
+ password: str | None = None,
302
+ image_resolution_dpi: Optional[int] = None,
303
+ browser_canvas: Optional[str] = None,
304
+ modality: Modality = "native",
305
+ model: str = "gpt-4o-mini",
306
+ temperature: float = 0,
307
+ reasoning_effort: ChatCompletionReasoningEffort = "medium",
308
+ ) -> Link:
309
+ request = self.prepare_create(name, json_schema, webhook_url, webhook_headers, password, image_resolution_dpi, browser_canvas, modality, model, temperature, reasoning_effort)
310
+ response = await self._client._prepared_request(request)
311
+ print(f"Extraction Link Created. Link available at https://www.uiform.com/dashboard/processors/{response['id']}")
312
+ return Link.model_validate(response)
313
+
314
+ async def list(
315
+ self,
316
+ before: Optional[str] = None,
317
+ after: Optional[str] = None,
318
+ limit: Optional[int] = 10,
319
+ order: Optional[Literal["asc", "desc"]] = "desc",
320
+ link_id: Optional[str] = None,
321
+ name: Optional[str] = None,
322
+ webhook_url: Optional[str] = None,
323
+ schema_id: Optional[str] = None,
324
+ schema_data_id: Optional[str] = None,
325
+ ) -> ListLinks:
326
+ request = self.prepare_list(before, after, limit, order, link_id, name, webhook_url, schema_id, schema_data_id)
327
+ response = await self._client._prepared_request(request)
328
+ return ListLinks.model_validate(response)
329
+
330
+ async def get(self, link_id: str) -> Link:
331
+ request = self.prepare_get(link_id)
332
+ response = await self._client._prepared_request(request)
333
+ return Link.model_validate(response)
334
+
335
+ async def update(
336
+ self,
337
+ link_id: str,
338
+ name: Optional[str] = None,
339
+ webhook_url: Optional[HttpUrl] = None,
340
+ webhook_headers: Optional[Dict[str, str]] = None,
341
+ password: Optional[str] = None,
342
+ image_resolution_dpi: Optional[int] = None,
343
+ browser_canvas: Optional[str] = None,
344
+ modality: Optional[Modality] = None,
345
+ model: Optional[str] = None,
346
+ temperature: Optional[float] = None,
347
+ reasoning_effort: Optional[ChatCompletionReasoningEffort] = None,
348
+ json_schema: Optional[Dict[str, Any]] = None,
349
+ ) -> Link:
350
+ request = self.prepare_update(link_id, name, webhook_url, webhook_headers, password, image_resolution_dpi, browser_canvas, modality, model, temperature, reasoning_effort, json_schema)
351
+ response = await self._client._prepared_request(request)
352
+ return Link.model_validate(response)
353
+
354
+ async def delete(self, link_id: str) -> None:
355
+ request = self.prepare_delete(link_id)
356
+ await self._client._prepared_request(request)
@@ -0,0 +1,211 @@
1
+ from typing import Any, Dict, Literal, Optional
2
+
3
+ from ...._resource import SyncAPIResource, AsyncAPIResource
4
+ from ....types.logs import AutomationLog, ExternalRequestLog, ListLogs
5
+ from ....types.standards import PreparedRequest
6
+
7
+
8
+ class LogsMixin:
9
+ def prepare_get(self, log_id: str) -> PreparedRequest:
10
+ """Get a specific automation log by ID.
11
+
12
+ Args:
13
+ log_id: ID of the log to retrieve
14
+
15
+ Returns:
16
+ PreparedRequest: The prepared request
17
+ """
18
+ return PreparedRequest(method="GET", url=f"/v1/processors/automations/logs/{log_id}")
19
+
20
+ def prepare_list(
21
+ self,
22
+ before: Optional[str] = None,
23
+ after: Optional[str] = None,
24
+ limit: Optional[int] = 10,
25
+ order: Optional[Literal["asc", "desc"]] = "desc",
26
+ # Filtering parameters
27
+ status_code: Optional[int] = None,
28
+ status_class: Optional[Literal["2xx", "3xx", "4xx", "5xx"]] = None,
29
+ automation_id: Optional[str] = None,
30
+ webhook_url: Optional[str] = None,
31
+ schema_id: Optional[str] = None,
32
+ schema_data_id: Optional[str] = None,
33
+ ) -> PreparedRequest:
34
+ """List automation logs with pagination support.
35
+
36
+ Args:
37
+ before: Optional cursor for pagination before a specific log ID
38
+ after: Optional cursor for pagination after a specific log ID
39
+ limit: Optional limit on number of results (max 100)
40
+ order: Optional sort order ("asc" or "desc")
41
+ status_code: Optional filter by status code
42
+ status_class: Optional filter by status_class
43
+ automation_id: Optional filter by deployment ID
44
+ webhook_url: Optional filter by webhook URL
45
+ schema_id: Optional filter by schema ID
46
+ schema_data_id: Optional filter by schema data ID
47
+
48
+ Returns:
49
+ PreparedRequest: The prepared request
50
+ """
51
+ params = {
52
+ "before": before,
53
+ "after": after,
54
+ "limit": limit,
55
+ "order": order,
56
+ "status_code": status_code,
57
+ "status_class": status_class,
58
+ "automation_id": automation_id,
59
+ "webhook_url": webhook_url,
60
+ "schema_id": schema_id,
61
+ "schema_data_id": schema_data_id,
62
+ }
63
+ # Remove None values
64
+ params = {k: v for k, v in params.items() if v is not None}
65
+
66
+ return PreparedRequest(method="GET", url="/v1/processors/automations/logs", params=params)
67
+
68
+ def prepare_rerun(self, log_id: str) -> PreparedRequest:
69
+ """Rerun a webhook from an existing AutomationLog.
70
+
71
+ Args:
72
+ log_id: ID of the log to rerun
73
+
74
+ Returns:
75
+ PreparedRequest: The prepared request
76
+ """
77
+ return PreparedRequest(method="POST", url=f"/v1/processors/automations/logs/{log_id}/rerun")
78
+
79
+
80
+ class Logs(SyncAPIResource, LogsMixin):
81
+ """Logs API wrapper for managing automation logs"""
82
+
83
+ def get(self, log_id: str) -> AutomationLog:
84
+ """Get a specific automation log by ID.
85
+
86
+ Args:
87
+ log_id: ID of the log to retrieve
88
+
89
+ Returns:
90
+ AutomationLog: The automation log
91
+ """
92
+ request = self.prepare_get(log_id)
93
+ response = self._client._prepared_request(request)
94
+ return AutomationLog.model_validate(response)
95
+
96
+ def list(
97
+ self,
98
+ before: Optional[str] = None,
99
+ after: Optional[str] = None,
100
+ limit: Optional[int] = 10,
101
+ order: Optional[Literal["asc", "desc"]] = "desc",
102
+ status_code: Optional[int] = None,
103
+ status_class: Optional[Literal["2xx", "3xx", "4xx", "5xx"]] = None,
104
+ automation_id: Optional[str] = None,
105
+ webhook_url: Optional[str] = None,
106
+ schema_id: Optional[str] = None,
107
+ schema_data_id: Optional[str] = None,
108
+ ) -> ListLogs:
109
+ """List automation logs with pagination support.
110
+
111
+ Args:
112
+ before: Optional cursor for pagination before a specific log ID
113
+ after: Optional cursor for pagination after a specific log ID
114
+ limit: Optional limit on number of results (max 100)
115
+ order: Optional sort order ("asc" or "desc")
116
+ status_code: Optional filter by status code
117
+ status_class: Optional filter by status_class
118
+ automation_id: Optional filter by deployment ID
119
+ webhook_url: Optional filter by webhook URL
120
+ schema_id: Optional filter by schema ID
121
+ schema_data_id: Optional filter by schema data ID
122
+
123
+ Returns:
124
+ ListLogs: Paginated list of automation logs with metadata
125
+ """
126
+ request = self.prepare_list(before, after, limit, order, status_code, status_class, automation_id, webhook_url, schema_id, schema_data_id)
127
+ response = self._client._prepared_request(request)
128
+ return ListLogs.model_validate(response)
129
+
130
+ def rerun(self, log_id: str) -> ExternalRequestLog:
131
+ """Rerun a webhook from an existing AutomationLog.
132
+
133
+ Args:
134
+ log_id: ID of the log to rerun
135
+
136
+ Returns:
137
+ ExternalRequestLog: The result of the rerun webhook call
138
+ """
139
+ request = self.prepare_rerun(log_id)
140
+ response = self._client._prepared_request(request)
141
+
142
+ print(f"Webhook call run successfully. Log available at https://docs.uiform.com/dashboard/processors/logs/{log_id}")
143
+
144
+ return ExternalRequestLog.model_validate(response)
145
+
146
+
147
+ class AsyncLogs(AsyncAPIResource, LogsMixin):
148
+ """Async Logs API wrapper for managing automation logs"""
149
+
150
+ async def get(self, log_id: str) -> AutomationLog:
151
+ """Get a specific automation log by ID.
152
+
153
+ Args:
154
+ log_id: ID of the log to retrieve
155
+
156
+ Returns:
157
+ AutomationLog: The automation log
158
+ """
159
+ request = self.prepare_get(log_id)
160
+ response = await self._client._prepared_request(request)
161
+ return AutomationLog.model_validate(response)
162
+
163
+ async def list(
164
+ self,
165
+ before: Optional[str] = None,
166
+ after: Optional[str] = None,
167
+ limit: Optional[int] = 10,
168
+ order: Optional[Literal["asc", "desc"]] = "desc",
169
+ status_code: Optional[int] = None,
170
+ status_class: Optional[Literal["2xx", "3xx", "4xx", "5xx"]] = None,
171
+ automation_id: Optional[str] = None,
172
+ webhook_url: Optional[str] = None,
173
+ schema_id: Optional[str] = None,
174
+ schema_data_id: Optional[str] = None,
175
+ ) -> ListLogs:
176
+ """List automation logs with pagination support.
177
+
178
+ Args:
179
+ before: Optional cursor for pagination before a specific log ID
180
+ after: Optional cursor for pagination after a specific log ID
181
+ limit: Optional limit on number of results (max 100)
182
+ order: Optional sort order ("asc" or "desc")
183
+ status_code: Optional filter by status code
184
+ status_class: Optional filter by status_class
185
+ automation_id: Optional filter by deployment ID
186
+ webhook_url: Optional filter by webhook URL
187
+ schema_id: Optional filter by schema ID
188
+ schema_data_id: Optional filter by schema data ID
189
+
190
+ Returns:
191
+ ListLogs: Paginated list of automation logs with metadata
192
+ """
193
+ request = self.prepare_list(before, after, limit, order, status_code, status_class, automation_id, webhook_url, schema_id, schema_data_id)
194
+ response = await self._client._prepared_request(request)
195
+ return ListLogs.model_validate(response)
196
+
197
+ async def rerun(self, log_id: str) -> ExternalRequestLog:
198
+ """Rerun a webhook from an existing AutomationLog.
199
+
200
+ Args:
201
+ log_id: ID of the log to rerun
202
+
203
+ Returns:
204
+ ExternalRequestLog: The result of the rerun webhook call
205
+ """
206
+ request = self.prepare_rerun(log_id)
207
+ response = await self._client._prepared_request(request)
208
+
209
+ print(f"Webhook call run successfully. Log available at https://docs.uiform.com/dashboard/processors/logs/{log_id}")
210
+
211
+ return ExternalRequestLog.model_validate(response)