retab 0.0.40__py3-none-any.whl → 0.0.42__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 (53) hide show
  1. retab/client.py +5 -5
  2. retab/resources/consensus/completions.py +1 -1
  3. retab/resources/consensus/completions_stream.py +5 -5
  4. retab/resources/consensus/responses.py +1 -1
  5. retab/resources/consensus/responses_stream.py +2 -2
  6. retab/resources/documents/client.py +12 -11
  7. retab/resources/documents/extractions.py +4 -4
  8. retab/resources/evals.py +1 -1
  9. retab/resources/evaluations/documents.py +1 -1
  10. retab/resources/jsonlUtils.py +4 -4
  11. retab/resources/processors/automations/endpoints.py +9 -5
  12. retab/resources/processors/automations/links.py +2 -2
  13. retab/resources/processors/automations/logs.py +2 -2
  14. retab/resources/processors/automations/mailboxes.py +43 -32
  15. retab/resources/processors/automations/outlook.py +25 -7
  16. retab/resources/processors/automations/tests.py +8 -2
  17. retab/resources/processors/client.py +25 -16
  18. retab/resources/prompt_optimization.py +1 -1
  19. retab/resources/schemas.py +3 -3
  20. retab/types/automations/mailboxes.py +1 -1
  21. retab/types/completions.py +1 -1
  22. retab/types/documents/create_messages.py +4 -4
  23. retab/types/documents/extractions.py +3 -3
  24. retab/types/documents/parse.py +3 -1
  25. retab/types/evals.py +2 -2
  26. retab/types/evaluations/iterations.py +2 -2
  27. retab/types/evaluations/model.py +2 -2
  28. retab/types/extractions.py +34 -9
  29. retab/types/jobs/prompt_optimization.py +1 -1
  30. retab/types/logs.py +3 -3
  31. retab/types/schemas/object.py +4 -4
  32. retab/types/schemas/templates.py +1 -1
  33. retab/utils/__init__.py +0 -0
  34. retab/utils/_model_cards/anthropic.yaml +59 -0
  35. retab/utils/_model_cards/auto.yaml +43 -0
  36. retab/utils/_model_cards/gemini.yaml +117 -0
  37. retab/utils/_model_cards/openai.yaml +301 -0
  38. retab/utils/_model_cards/xai.yaml +28 -0
  39. retab/utils/ai_models.py +138 -0
  40. retab/utils/benchmarking.py +484 -0
  41. retab/utils/chat.py +327 -0
  42. retab/utils/display.py +440 -0
  43. retab/utils/json_schema.py +2156 -0
  44. retab/utils/mime.py +165 -0
  45. retab/utils/responses.py +169 -0
  46. retab/utils/stream_context_managers.py +52 -0
  47. retab/utils/usage/__init__.py +0 -0
  48. retab/utils/usage/usage.py +301 -0
  49. retab-0.0.42.dist-info/METADATA +119 -0
  50. {retab-0.0.40.dist-info → retab-0.0.42.dist-info}/RECORD +52 -36
  51. retab-0.0.40.dist-info/METADATA +0 -418
  52. {retab-0.0.40.dist-info → retab-0.0.42.dist-info}/WHEEL +0 -0
  53. {retab-0.0.40.dist-info → retab-0.0.42.dist-info}/top_level.txt +0 -0
retab/client.py CHANGED
@@ -34,7 +34,7 @@ class BaseRetab:
34
34
 
35
35
  Args:
36
36
  api_key (str, optional): Retab API key. If not provided, will look for RETAB_API_KEY env variable.
37
- base_url (str, optional): Base URL for API requests. Defaults to https://api.retab.dev
37
+ base_url (str, optional): Base URL for API requests. Defaults to https://api.retab.com
38
38
  timeout (float): Request timeout in seconds. Defaults to 240.0
39
39
  max_retries (int): Maximum number of retries for failed requests. Defaults to 3
40
40
  openai_api_key (str, optional): OpenAI API key. Will look for OPENAI_API_KEY env variable if not provided
@@ -63,12 +63,12 @@ class BaseRetab:
63
63
 
64
64
  if api_key is None:
65
65
  raise ValueError(
66
- "No API key provided. You can create an API key at https://retab.dev\n"
66
+ "No API key provided. You can create an API key at https://retab.com\n"
67
67
  "Then either pass it to the client (api_key='your-key') or set the RETAB_API_KEY environment variable"
68
68
  )
69
69
 
70
70
  if base_url is None:
71
- base_url = os.environ.get("RETAB_API_BASE_URL", "https://api.retab.dev")
71
+ base_url = os.environ.get("RETAB_API_BASE_URL", "https://api.retab.com")
72
72
 
73
73
  truststore.inject_into_ssl()
74
74
  self.api_key = api_key
@@ -154,7 +154,7 @@ class Retab(BaseRetab):
154
154
 
155
155
  Args:
156
156
  api_key (str, optional): Retab API key. If not provided, will look for RETAB_API_KEY env variable.
157
- base_url (str, optional): Base URL for API requests. Defaults to https://api.retab.dev
157
+ base_url (str, optional): Base URL for API requests. Defaults to https://api.retab.com
158
158
  timeout (float): Request timeout in seconds. Defaults to 240.0
159
159
  max_retries (int): Maximum number of retries for failed requests. Defaults to 3
160
160
  openai_api_key (str, optional): OpenAI API key. Will look for OPENAI_API_KEY env variable if not provided
@@ -422,7 +422,7 @@ class AsyncRetab(BaseRetab):
422
422
 
423
423
  Args:
424
424
  api_key (str, optional): Retab API key. If not provided, will look for RETAB_API_KEY env variable.
425
- base_url (str, optional): Base URL for API requests. Defaults to https://api.retab.dev
425
+ base_url (str, optional): Base URL for API requests. Defaults to https://api.retab.com
426
426
  timeout (float): Request timeout in seconds. Defaults to 240.0
427
427
  max_retries (int): Maximum number of retries for failed requests. Defaults to 3
428
428
  openai_api_key (str, optional): OpenAI API key. Will look for OPENAI_API_KEY env variable if not provided
@@ -5,7 +5,7 @@ from openai.types.shared_params.response_format_json_schema import ResponseForma
5
5
  from pydantic import BaseModel as ResponseFormatT
6
6
 
7
7
  from ..._resource import AsyncAPIResource, SyncAPIResource
8
- from ..._utils.ai_models import assert_valid_model_extraction
8
+ from ...utils.ai_models import assert_valid_model_extraction
9
9
  from ...types.chat import ChatCompletionRetabMessage
10
10
  from ...types.completions import RetabChatCompletionsRequest
11
11
  from ...types.documents.extractions import RetabParsedChatCompletion
@@ -9,9 +9,9 @@ from openai.types.shared_params.response_format_json_schema import ResponseForma
9
9
  from pydantic import BaseModel as ResponseFormatT
10
10
 
11
11
  from ..._resource import AsyncAPIResource, SyncAPIResource
12
- from ..._utils.ai_models import assert_valid_model_extraction
13
- from ..._utils.json_schema import unflatten_dict
14
- from ..._utils.stream_context_managers import as_async_context_manager, as_context_manager
12
+ from ...utils.ai_models import assert_valid_model_extraction
13
+ from ...utils.json_schema import unflatten_dict
14
+ from ...utils.stream_context_managers import as_async_context_manager, as_context_manager
15
15
  from ...types.chat import ChatCompletionRetabMessage
16
16
  from ...types.completions import RetabChatCompletionsRequest
17
17
  from ...types.documents.extractions import RetabParsedChatCompletion, RetabParsedChatCompletionChunk, RetabParsedChoice
@@ -123,7 +123,7 @@ class Completions(SyncAPIResource, BaseCompletionsMixin):
123
123
 
124
124
  Usage:
125
125
  ```python
126
- with retab.devpletions.stream(json_schema, messages, model, temperature, reasoning_effort) as stream:
126
+ with retab.completions.stream(json_schema, messages, model, temperature, reasoning_effort) as stream:
127
127
  for response in stream:
128
128
  print(response)
129
129
  ```
@@ -210,7 +210,7 @@ class AsyncCompletions(AsyncAPIResource, BaseCompletionsMixin):
210
210
 
211
211
  Usage:
212
212
  ```python
213
- async with retab.devpletions.stream(json_schema, messages, model, temperature, reasoning_effort, n_consensus) as stream:
213
+ async with retab.completions.stream(json_schema, messages, model, temperature, reasoning_effort, n_consensus) as stream:
214
214
  async for response in stream:
215
215
  print(response)
216
216
  ```
@@ -7,7 +7,7 @@ from openai.types.shared_params.reasoning import Reasoning
7
7
  from pydantic import BaseModel
8
8
 
9
9
  from ..._resource import AsyncAPIResource, SyncAPIResource
10
- from ..._utils.ai_models import assert_valid_model_extraction
10
+ from ...utils.ai_models import assert_valid_model_extraction
11
11
  from ...types.completions import RetabChatResponseCreateRequest
12
12
  from ...types.documents.extractions import UiResponse
13
13
  from ...types.schemas.object import Schema
@@ -6,8 +6,8 @@ from openai.types.shared_params.reasoning import Reasoning
6
6
  from pydantic import BaseModel
7
7
 
8
8
  from ..._resource import AsyncAPIResource, SyncAPIResource
9
- from ..._utils.ai_models import assert_valid_model_extraction
10
- from ..._utils.stream_context_managers import as_async_context_manager, as_context_manager
9
+ from ...utils.ai_models import assert_valid_model_extraction
10
+ from ...utils.stream_context_managers import as_async_context_manager, as_context_manager
11
11
  from ...types.completions import RetabChatResponseCreateRequest
12
12
  from ...types.documents.extractions import UiResponse
13
13
  from ...types.schemas.object import Schema
@@ -8,15 +8,16 @@ from pydantic_core import PydanticUndefined
8
8
  from openai.types.chat.chat_completion_reasoning_effort import ChatCompletionReasoningEffort
9
9
 
10
10
  from ..._resource import AsyncAPIResource, SyncAPIResource
11
- from ..._utils.json_schema import load_json_schema, filter_auxiliary_fields_json
12
- from ..._utils.mime import convert_mime_data_to_pil_image, prepare_mime_document
13
- from ..._utils.ai_models import assert_valid_model_extraction
11
+ from ...utils.json_schema import load_json_schema, filter_auxiliary_fields_json
12
+ from ...utils.mime import convert_mime_data_to_pil_image, prepare_mime_document
13
+ from ...utils.ai_models import assert_valid_model_extraction
14
14
  from ...types.documents.create_messages import DocumentCreateInputRequest, DocumentCreateMessageRequest, DocumentMessage
15
15
  from ...types.documents.extractions import DocumentExtractRequest, RetabParsedChatCompletion
16
16
  from ...types.documents.parse import ParseRequest, ParseResult, TableParsingFormat
17
17
  from ...types.browser_canvas import BrowserCanvas
18
18
  from ...types.mime import MIMEData
19
19
  from ...types.modalities import Modality
20
+ from ...types.ai_models import LLMModel
20
21
  from ...types.schemas.object import Schema
21
22
  from ...types.standards import PreparedRequest
22
23
  from .extractions import AsyncExtractions, Extractions
@@ -89,7 +90,7 @@ class BaseDocumentsMixin:
89
90
  def _prepare_parse(
90
91
  self,
91
92
  document: Path | str | IOBase | MIMEData | PIL.Image.Image | HttpUrl,
92
- fast_mode: bool = False,
93
+ model: LLMModel,
93
94
  table_parsing_format: TableParsingFormat = "html",
94
95
  image_resolution_dpi: int = 72,
95
96
  browser_canvas: BrowserCanvas = "A4",
@@ -99,7 +100,7 @@ class BaseDocumentsMixin:
99
100
 
100
101
  parse_request = ParseRequest(
101
102
  document=mime_document,
102
- fast_mode=fast_mode,
103
+ model=model,
103
104
  table_parsing_format=table_parsing_format,
104
105
  image_resolution_dpi=image_resolution_dpi,
105
106
  browser_canvas=browser_canvas,
@@ -290,7 +291,7 @@ class Documents(SyncAPIResource, BaseDocumentsMixin):
290
291
  def parse(
291
292
  self,
292
293
  document: Path | str | IOBase | MIMEData | PIL.Image.Image | HttpUrl,
293
- fast_mode: bool = False,
294
+ model: LLMModel,
294
295
  table_parsing_format: TableParsingFormat = "html",
295
296
  image_resolution_dpi: int = 72,
296
297
  browser_canvas: BrowserCanvas = "A4",
@@ -304,7 +305,7 @@ class Documents(SyncAPIResource, BaseDocumentsMixin):
304
305
 
305
306
  Args:
306
307
  document: The document to parse. Can be a file path (Path or str), file-like object, MIMEData, PIL Image, or URL.
307
- fast_mode: Use fast mode for parsing (may reduce quality). Defaults to False.
308
+ model: The AI model to use for document parsing.
308
309
  table_parsing_format: Format for parsing tables. Options: "html", "json", "yaml", "markdown". Defaults to "html".
309
310
  image_resolution_dpi: DPI for image processing. Defaults to 72.
310
311
  browser_canvas: Canvas size for document rendering. Defaults to "A4".
@@ -318,7 +319,7 @@ class Documents(SyncAPIResource, BaseDocumentsMixin):
318
319
  """
319
320
  request = self._prepare_parse(
320
321
  document=document,
321
- fast_mode=fast_mode,
322
+ model=model,
322
323
  table_parsing_format=table_parsing_format,
323
324
  image_resolution_dpi=image_resolution_dpi,
324
325
  browser_canvas=browser_canvas,
@@ -512,7 +513,7 @@ class AsyncDocuments(AsyncAPIResource, BaseDocumentsMixin):
512
513
  async def parse(
513
514
  self,
514
515
  document: Path | str | IOBase | MIMEData | PIL.Image.Image | HttpUrl,
515
- fast_mode: bool = False,
516
+ model: LLMModel,
516
517
  table_parsing_format: TableParsingFormat = "html",
517
518
  image_resolution_dpi: int = 72,
518
519
  browser_canvas: BrowserCanvas = "A4",
@@ -526,7 +527,7 @@ class AsyncDocuments(AsyncAPIResource, BaseDocumentsMixin):
526
527
 
527
528
  Args:
528
529
  document: The document to parse. Can be a file path (Path or str), file-like object, MIMEData, PIL Image, or URL.
529
- fast_mode: Use fast mode for parsing (may reduce quality). Defaults to False.
530
+ model: The AI model to use for document parsing.
530
531
  table_parsing_format: Format for parsing tables. Options: "html", "json", "yaml", "markdown". Defaults to "html".
531
532
  image_resolution_dpi: DPI for image processing. Defaults to 72.
532
533
  browser_canvas: Canvas size for document rendering. Defaults to "A4".
@@ -540,7 +541,7 @@ class AsyncDocuments(AsyncAPIResource, BaseDocumentsMixin):
540
541
  """
541
542
  request = self._prepare_parse(
542
543
  document=document,
543
- fast_mode=fast_mode,
544
+ model=model,
544
545
  table_parsing_format=table_parsing_format,
545
546
  image_resolution_dpi=image_resolution_dpi,
546
547
  browser_canvas=browser_canvas,
@@ -14,10 +14,10 @@ from pydantic_core import PydanticUndefined
14
14
  from pydantic import HttpUrl
15
15
 
16
16
  from ..._resource import AsyncAPIResource, SyncAPIResource
17
- from ..._utils.ai_models import assert_valid_model_extraction
18
- from ..._utils.json_schema import filter_auxiliary_fields_json, load_json_schema, unflatten_dict
19
- from ..._utils.mime import MIMEData, prepare_mime_document
20
- from ..._utils.stream_context_managers import as_async_context_manager, as_context_manager
17
+ from ...utils.ai_models import assert_valid_model_extraction
18
+ from ...utils.json_schema import filter_auxiliary_fields_json, load_json_schema, unflatten_dict
19
+ from ...utils.mime import MIMEData, prepare_mime_document
20
+ from ...utils.stream_context_managers import as_async_context_manager, as_context_manager
21
21
  from ...types.chat import ChatCompletionRetabMessage
22
22
  from ...types.documents.extractions import DocumentExtractRequest, LogExtractionRequest, RetabParsedChatCompletion, RetabParsedChatCompletionChunk, RetabParsedChoice
23
23
  from ...types.browser_canvas import BrowserCanvas
retab/resources/evals.py CHANGED
@@ -7,7 +7,7 @@ from openai.types.chat.chat_completion_reasoning_effort import ChatCompletionRea
7
7
  from pydantic import HttpUrl
8
8
 
9
9
  from .._resource import AsyncAPIResource, SyncAPIResource
10
- from .._utils.mime import prepare_mime_document
10
+ from ..utils.mime import prepare_mime_document
11
11
  from ..types.evals import (
12
12
  CreateIterationRequest,
13
13
  DistancesResult,
@@ -6,7 +6,7 @@ import PIL.Image
6
6
  from pydantic import HttpUrl
7
7
 
8
8
  from ..._resource import AsyncAPIResource, SyncAPIResource
9
- from ..._utils.mime import prepare_mime_document
9
+ from ...utils.mime import prepare_mime_document
10
10
  from ...types.evaluations import DocumentItem, EvaluationDocument, PatchEvaluationDocumentRequest
11
11
  from ...types.mime import MIMEData
12
12
  from ...types.standards import PreparedRequest, DeleteResponse, FieldUnset
@@ -18,10 +18,10 @@ from pydantic_core import PydanticUndefined
18
18
  from tqdm import tqdm
19
19
 
20
20
  from .._resource import AsyncAPIResource, SyncAPIResource
21
- from .._utils.ai_models import assert_valid_model_extraction, get_provider_for_model
22
- from .._utils.chat import convert_to_anthropic_format, convert_to_openai_format, separate_messages
23
- from .._utils.display import Metrics, display_metrics, process_dataset_and_compute_metrics
24
- from .._utils.json_schema import load_json_schema
21
+ from ..utils.ai_models import assert_valid_model_extraction, get_provider_for_model
22
+ from ..utils.chat import convert_to_anthropic_format, convert_to_openai_format, separate_messages
23
+ from ..utils.display import Metrics, display_metrics, process_dataset_and_compute_metrics
24
+ from ..utils.json_schema import load_json_schema
25
25
  from ..types.chat import ChatCompletionRetabMessage
26
26
  from ..types.modalities import Modality
27
27
  from ..types.schemas.object import Schema
@@ -3,7 +3,7 @@ from typing import Literal, Optional
3
3
  from pydantic_core import PydanticUndefined
4
4
 
5
5
  from ...._resource import AsyncAPIResource, SyncAPIResource
6
- from ...._utils.ai_models import assert_valid_model_extraction
6
+ from ....utils.ai_models import assert_valid_model_extraction
7
7
  from ....types.automations.endpoints import Endpoint, ListEndpoints, UpdateEndpointRequest
8
8
  from ....types.standards import PreparedRequest
9
9
 
@@ -31,6 +31,7 @@ class EndpointsMixin:
31
31
 
32
32
  def prepare_list(
33
33
  self,
34
+ processor_id: str,
34
35
  before: Optional[str] = None,
35
36
  after: Optional[str] = None,
36
37
  limit: Optional[int] = 10,
@@ -40,6 +41,7 @@ class EndpointsMixin:
40
41
  webhook_url: Optional[str] = None,
41
42
  ) -> PreparedRequest:
42
43
  params = {
44
+ "processor_id": processor_id,
43
45
  "before": before,
44
46
  "after": after,
45
47
  "limit": limit,
@@ -120,11 +122,12 @@ class Endpoints(SyncAPIResource, EndpointsMixin):
120
122
  need_validation=need_validation,
121
123
  )
122
124
  response = self._client._prepared_request(request)
123
- print(f"Endpoint Created. Url: https://www.retab.dev/dashboard/processors/automations/{response['id']}")
125
+ print(f"Endpoint Created. Url: https://www.retab.com/dashboard/processors/automations/{response['id']}")
124
126
  return Endpoint.model_validate(response)
125
127
 
126
128
  def list(
127
129
  self,
130
+ processor_id: str,
128
131
  before: Optional[str] = None,
129
132
  after: Optional[str] = None,
130
133
  limit: Optional[int] = 10,
@@ -145,7 +148,7 @@ class Endpoints(SyncAPIResource, EndpointsMixin):
145
148
  Returns:
146
149
  ListEndpoints: Paginated list of endpoint configurations with metadata
147
150
  """
148
- request = self.prepare_list(before, after, limit, order, name, webhook_url)
151
+ request = self.prepare_list(processor_id, before, after, limit, order, name, webhook_url)
149
152
  response = self._client._prepared_request(request)
150
153
  return ListEndpoints.model_validate(response)
151
154
 
@@ -229,12 +232,13 @@ class AsyncEndpoints(AsyncAPIResource, EndpointsMixin):
229
232
  need_validation=need_validation,
230
233
  )
231
234
  response = await self._client._prepared_request(request)
232
- print(f"Endpoint Created. Url: https://www.retab.dev/dashboard/processors/automations/{response['id']}")
235
+ print(f"Endpoint Created. Url: https://www.retab.com/dashboard/processors/automations/{response['id']}")
233
236
 
234
237
  return Endpoint.model_validate(response)
235
238
 
236
239
  async def list(
237
240
  self,
241
+ processor_id: str,
238
242
  before: Optional[str] = None,
239
243
  after: Optional[str] = None,
240
244
  limit: Optional[int] = 10,
@@ -242,7 +246,7 @@ class AsyncEndpoints(AsyncAPIResource, EndpointsMixin):
242
246
  name: Optional[str] = None,
243
247
  webhook_url: Optional[str] = None,
244
248
  ) -> ListEndpoints:
245
- request = self.prepare_list(before, after, limit, order, name, webhook_url)
249
+ request = self.prepare_list(processor_id, before, after, limit, order, name, webhook_url)
246
250
  response = await self._client._prepared_request(request)
247
251
  return ListEndpoints.model_validate(response)
248
252
 
@@ -128,7 +128,7 @@ class Links(SyncAPIResource, LinksMixin):
128
128
  )
129
129
  response = self._client._prepared_request(request)
130
130
 
131
- print(f"Link Created. Url: https://www.retab.dev/dashboard/processors/automations/{response['id']}")
131
+ print(f"Link Created. Url: https://www.retab.com/dashboard/processors/automations/{response['id']}")
132
132
  return Link.model_validate(response)
133
133
 
134
134
  def list(
@@ -248,7 +248,7 @@ class AsyncLinks(AsyncAPIResource, LinksMixin):
248
248
  password=password,
249
249
  )
250
250
  response = await self._client._prepared_request(request)
251
- print(f"Link Created. Url: https://www.retab.dev/dashboard/processors/automations/{response['id']}")
251
+ print(f"Link Created. Url: https://www.retab.com/dashboard/processors/automations/{response['id']}")
252
252
  return Link.model_validate(response)
253
253
 
254
254
  async def list(
@@ -147,7 +147,7 @@ class Logs(SyncAPIResource, LogsMixin):
147
147
  request = self.prepare_rerun(processor_id, log_id)
148
148
  response = self._client._prepared_request(request)
149
149
 
150
- print(f"Webhook call run successfully. Log available at https://www.retab.dev/dashboard/processors/{processor_id}/logs/{log_id}")
150
+ print(f"Webhook call run successfully. Log available at https://www.retab.com/dashboard/processors/{processor_id}/logs/{log_id}")
151
151
 
152
152
  return ExternalRequestLog.model_validate(response)
153
153
 
@@ -217,6 +217,6 @@ class AsyncLogs(AsyncAPIResource, LogsMixin):
217
217
  request = self.prepare_rerun(processor_id, log_id)
218
218
  response = await self._client._prepared_request(request)
219
219
 
220
- print(f"Webhook call run successfully. Log available at https://www.retab.dev/dashboard/processors/{processor_id}/logs/{log_id}")
220
+ print(f"Webhook call run successfully. Log available at https://www.retab.com/dashboard/processors/{processor_id}/logs/{log_id}")
221
221
 
222
222
  return ExternalRequestLog.model_validate(response)
@@ -6,7 +6,7 @@ from pydantic import EmailStr, HttpUrl
6
6
  from pydantic_core import PydanticUndefined
7
7
 
8
8
  from ...._resource import AsyncAPIResource, SyncAPIResource
9
- from ...._utils.mime import prepare_mime_document
9
+ from ....utils.mime import prepare_mime_document
10
10
  from ....types.automations.mailboxes import ListMailboxes, Mailbox, UpdateMailboxRequest
11
11
  from ....types.mime import EmailData, MIMEData
12
12
  from ....types.standards import PreparedRequest
@@ -43,6 +43,7 @@ class MailBoxesMixin:
43
43
 
44
44
  def prepare_list(
45
45
  self,
46
+ processor_id: str,
46
47
  before: str | None = None,
47
48
  after: str | None = None,
48
49
  limit: int = 10,
@@ -52,6 +53,7 @@ class MailBoxesMixin:
52
53
  webhook_url: Optional[str] = None,
53
54
  ) -> PreparedRequest:
54
55
  params = {
56
+ "processor_id": processor_id,
55
57
  "before": before,
56
58
  "after": after,
57
59
  "limit": limit,
@@ -65,15 +67,12 @@ class MailBoxesMixin:
65
67
 
66
68
  return PreparedRequest(method="GET", url=self.mailboxes_base_url, params=params)
67
69
 
68
- def prepare_get(self, email: str) -> PreparedRequest:
69
- return PreparedRequest(method="GET", url=f"{self.mailboxes_base_url}/{email}")
70
-
71
- def prepare_get_from_id(self, mailbox_id: str) -> PreparedRequest:
72
- return PreparedRequest(method="GET", url=f"{self.mailboxes_base_url}/from_id/{mailbox_id}")
70
+ def prepare_get(self, mailbox_id: str) -> PreparedRequest:
71
+ return PreparedRequest(method="GET", url=f"{self.mailboxes_base_url}/{mailbox_id}")
73
72
 
74
73
  def prepare_update(
75
74
  self,
76
- email: str,
75
+ mailbox_id: str,
77
76
  name: str = PydanticUndefined, # type: ignore[assignment]
78
77
  default_language: str = PydanticUndefined, # type: ignore[assignment]
79
78
  webhook_url: str = PydanticUndefined, # type: ignore[assignment]
@@ -91,10 +90,10 @@ class MailBoxesMixin:
91
90
  authorized_domains=authorized_domains,
92
91
  authorized_emails=authorized_emails,
93
92
  )
94
- return PreparedRequest(method="PUT", url=f"/v1/processors/automations/mailboxes/{email}", data=update_mailbox_request.model_dump(mode="json"))
93
+ return PreparedRequest(method="PUT", url=f"/v1/processors/automations/mailboxes/{mailbox_id}", data=update_mailbox_request.model_dump(mode="json"))
95
94
 
96
- def prepare_delete(self, email: str) -> PreparedRequest:
97
- return PreparedRequest(method="DELETE", url=f"/v1/processors/automations/mailboxes/{email}", raise_for_status=True)
95
+ def prepare_delete(self, mailbox_id: str) -> PreparedRequest:
96
+ return PreparedRequest(method="DELETE", url=f"/v1/processors/automations/mailboxes/{mailbox_id}", raise_for_status=True)
98
97
 
99
98
 
100
99
  class Mailboxes(SyncAPIResource, MailBoxesMixin):
@@ -144,12 +143,13 @@ class Mailboxes(SyncAPIResource, MailBoxesMixin):
144
143
  )
145
144
  response = self._client._prepared_request(request)
146
145
 
147
- print(f"Mailbox {response['email']} created. Url: https://www.retab.dev/dashboard/processors/automations/{response['id']}")
146
+ print(f"Mailbox {response['email']} created. Url: https://www.retab.com/dashboard/processors/automations/{response['id']}")
148
147
 
149
148
  return Mailbox.model_validate(response)
150
149
 
151
150
  def list(
152
151
  self,
152
+ processor_id: str,
153
153
  before: str | None = None,
154
154
  after: str | None = None,
155
155
  limit: int = 10,
@@ -174,6 +174,7 @@ class Mailboxes(SyncAPIResource, MailBoxesMixin):
174
174
  ListMailboxes: List of mailbox configurations
175
175
  """
176
176
  request = self.prepare_list(
177
+ processor_id=processor_id,
177
178
  before=before,
178
179
  after=after,
179
180
  limit=limit,
@@ -185,22 +186,22 @@ class Mailboxes(SyncAPIResource, MailBoxesMixin):
185
186
  response = self._client._prepared_request(request)
186
187
  return ListMailboxes.model_validate(response)
187
188
 
188
- def get(self, email: str) -> Mailbox:
189
+ def get(self, mailbox_id: str) -> Mailbox:
189
190
  """Get a specific email automation configuration.
190
191
 
191
192
  Args:
192
- email: Email address of the mailbox
193
+ mailbox_id: ID of the mailbox
193
194
 
194
195
  Returns:
195
196
  Mailbox: The mailbox configuration
196
197
  """
197
- request = self.prepare_get(email)
198
+ request = self.prepare_get(mailbox_id)
198
199
  response = self._client._prepared_request(request)
199
200
  return Mailbox.model_validate(response)
200
201
 
201
202
  def update(
202
203
  self,
203
- email: str,
204
+ mailbox_id: str,
204
205
  name: str = PydanticUndefined, # type: ignore[assignment]
205
206
  default_language: str = PydanticUndefined, # type: ignore[assignment]
206
207
  webhook_url: str = PydanticUndefined, # type: ignore[assignment]
@@ -225,7 +226,7 @@ class Mailboxes(SyncAPIResource, MailBoxesMixin):
225
226
  Mailbox: The updated mailbox configuration
226
227
  """
227
228
  request = self.prepare_update(
228
- email=email,
229
+ mailbox_id=mailbox_id,
229
230
  name=name,
230
231
  default_language=default_language,
231
232
  webhook_url=webhook_url,
@@ -237,13 +238,13 @@ class Mailboxes(SyncAPIResource, MailBoxesMixin):
237
238
  response = self._client._prepared_request(request)
238
239
  return Mailbox.model_validate(response)
239
240
 
240
- def delete(self, email: str) -> None:
241
+ def delete(self, mailbox_id: str) -> None:
241
242
  """Delete an email automation configuration.
242
243
 
243
244
  Args:
244
245
  email: Email address of the mailbox to delete
245
246
  """
246
- request = self.prepare_delete(email)
247
+ request = self.prepare_delete(mailbox_id)
247
248
  self._client._prepared_request(request)
248
249
  return None
249
250
 
@@ -278,12 +279,13 @@ class AsyncMailboxes(AsyncAPIResource, MailBoxesMixin):
278
279
  )
279
280
  response = await self._client._prepared_request(request)
280
281
 
281
- print(f"Mailbox {response['email']} created. Url: https://www.retab.dev/dashboard/processors/automations/{response['id']}")
282
+ print(f"Mailbox {response['email']} created. Url: https://www.retab.com/dashboard/processors/automations/{response['id']}")
282
283
 
283
284
  return Mailbox.model_validate(response)
284
285
 
285
286
  async def list(
286
287
  self,
288
+ processor_id: str,
287
289
  before: str | None = None,
288
290
  after: str | None = None,
289
291
  limit: int = 10,
@@ -292,18 +294,27 @@ class AsyncMailboxes(AsyncAPIResource, MailBoxesMixin):
292
294
  name: str | None = None,
293
295
  webhook_url: str | None = None,
294
296
  ) -> ListMailboxes:
295
- request = self.prepare_list(before=before, after=after, limit=limit, order=order, email=email, name=name, webhook_url=webhook_url)
297
+ request = self.prepare_list(
298
+ processor_id=processor_id,
299
+ before=before,
300
+ after=after,
301
+ limit=limit,
302
+ order=order,
303
+ email=email,
304
+ name=name,
305
+ webhook_url=webhook_url,
306
+ )
296
307
  response = await self._client._prepared_request(request)
297
308
  return ListMailboxes.model_validate(response)
298
309
 
299
- async def get(self, email: str) -> Mailbox:
300
- request = self.prepare_get(email)
310
+ async def get(self, mailbox_id: str) -> Mailbox:
311
+ request = self.prepare_get(mailbox_id)
301
312
  response = await self._client._prepared_request(request)
302
313
  return Mailbox.model_validate(response)
303
314
 
304
315
  async def update(
305
316
  self,
306
- email: str,
317
+ mailbox_id: str,
307
318
  name: str = PydanticUndefined, # type: ignore[assignment]
308
319
  default_language: str = PydanticUndefined, # type: ignore[assignment]
309
320
  webhook_url: str = PydanticUndefined, # type: ignore[assignment]
@@ -313,7 +324,7 @@ class AsyncMailboxes(AsyncAPIResource, MailBoxesMixin):
313
324
  authorized_emails: List[str] = PydanticUndefined, # type: ignore[assignment]
314
325
  ) -> Mailbox:
315
326
  request = self.prepare_update(
316
- email=email,
327
+ mailbox_id=mailbox_id,
317
328
  name=name,
318
329
  default_language=default_language,
319
330
  webhook_url=webhook_url,
@@ -325,8 +336,8 @@ class AsyncMailboxes(AsyncAPIResource, MailBoxesMixin):
325
336
  response = await self._client._prepared_request(request)
326
337
  return Mailbox.model_validate(response)
327
338
 
328
- async def delete(self, email: str) -> None:
329
- request = self.prepare_delete(email)
339
+ async def delete(self, mailbox_id: str) -> None:
340
+ request = self.prepare_delete(mailbox_id)
330
341
  await self._client._prepared_request(request)
331
342
  return None
332
343
 
@@ -334,12 +345,12 @@ class AsyncMailboxes(AsyncAPIResource, MailBoxesMixin):
334
345
  class TestMailboxesMixin:
335
346
  def prepare_forward(
336
347
  self,
337
- email: str,
348
+ mailbox_id: str,
338
349
  document: Path | str | IOBase | HttpUrl | MIMEData,
339
350
  verbose: bool = True,
340
351
  ) -> PreparedRequest:
341
352
  mime_document = prepare_mime_document(document)
342
- return PreparedRequest(method="POST", url=f"/v1/processors/automations/mailboxes/tests/forward/{email}", data={"document": mime_document.model_dump()})
353
+ return PreparedRequest(method="POST", url=f"/v1/processors/automations/mailboxes/tests/forward/{mailbox_id}", data={"document": mime_document.model_dump()})
343
354
 
344
355
  def print_forward_verbose(self, email_data: EmailData) -> None:
345
356
  print("\nTEST EMAIL FORWARDING RESULTS:")
@@ -360,7 +371,7 @@ class TestMailboxesMixin:
360
371
  class TestMailboxes(SyncAPIResource, TestMailboxesMixin):
361
372
  def forward(
362
373
  self,
363
- email: str,
374
+ mailbox_id: str,
364
375
  document: Path | str | IOBase | HttpUrl | MIMEData,
365
376
  verbose: bool = True,
366
377
  ) -> EmailData:
@@ -372,7 +383,7 @@ class TestMailboxes(SyncAPIResource, TestMailboxesMixin):
372
383
  Returns:
373
384
  DocumentExtractResponse: The simulated extraction response
374
385
  """
375
- request = self.prepare_forward(email, document, verbose)
386
+ request = self.prepare_forward(mailbox_id, document, verbose)
376
387
  response = self._client._prepared_request(request)
377
388
 
378
389
  email_data = EmailData.model_validate(response)
@@ -385,11 +396,11 @@ class TestMailboxes(SyncAPIResource, TestMailboxesMixin):
385
396
  class AsyncTestMailboxes(AsyncAPIResource, TestMailboxesMixin):
386
397
  async def forward(
387
398
  self,
388
- email: str,
399
+ mailbox_id: str,
389
400
  document: Path | str | IOBase | HttpUrl | MIMEData,
390
401
  verbose: bool = True,
391
402
  ) -> EmailData:
392
- request = self.prepare_forward(email, document, verbose)
403
+ request = self.prepare_forward(mailbox_id, document, verbose)
393
404
  response = await self._client._prepared_request(request)
394
405
  email_data = EmailData.model_validate(response)
395
406
  if verbose: