retab 0.0.43__py3-none-any.whl → 0.0.45__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 (36) hide show
  1. retab/client.py +11 -7
  2. retab/generate_types.py +180 -0
  3. retab/resources/deployments/__init__.py +3 -0
  4. retab/resources/deployments/automations/__init__.py +9 -0
  5. retab/resources/deployments/automations/client.py +244 -0
  6. retab/resources/deployments/automations/endpoints.py +290 -0
  7. retab/resources/deployments/automations/links.py +303 -0
  8. retab/resources/deployments/automations/logs.py +222 -0
  9. retab/resources/deployments/automations/mailboxes.py +423 -0
  10. retab/resources/deployments/automations/outlook.py +377 -0
  11. retab/resources/deployments/automations/tests.py +161 -0
  12. retab/resources/deployments/client.py +148 -0
  13. retab/resources/evaluations/__init__.py +2 -2
  14. retab/resources/evaluations/client.py +46 -75
  15. retab/resources/evaluations/documents.py +41 -31
  16. retab/resources/evaluations/iterations.py +12 -12
  17. retab/resources/projects/__init__.py +3 -0
  18. retab/resources/projects/client.py +285 -0
  19. retab/resources/projects/documents.py +244 -0
  20. retab/resources/projects/iterations.py +470 -0
  21. retab/types/ai_models.py +1 -0
  22. retab/types/deprecated_evals.py +7 -7
  23. retab/types/evaluations/model.py +2 -5
  24. retab/types/jobs/base.py +1 -1
  25. retab/types/jobs/evaluation.py +1 -1
  26. retab/types/projects/__init__.py +34 -0
  27. retab/types/projects/documents.py +30 -0
  28. retab/types/projects/iterations.py +78 -0
  29. retab/types/projects/model.py +68 -0
  30. retab/types/schemas/evaluate.py +1 -1
  31. retab/types/schemas/object.py +5 -29
  32. retab/utils/usage/usage.py +0 -1
  33. {retab-0.0.43.dist-info → retab-0.0.45.dist-info}/METADATA +2 -2
  34. {retab-0.0.43.dist-info → retab-0.0.45.dist-info}/RECORD +36 -17
  35. {retab-0.0.43.dist-info → retab-0.0.45.dist-info}/WHEEL +0 -0
  36. {retab-0.0.43.dist-info → retab-0.0.45.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,78 @@
1
+ import datetime
2
+ from typing import Any, Optional, Self
3
+
4
+ import nanoid # type: ignore
5
+ from pydantic import BaseModel, Field, model_validator
6
+
7
+ from ..inference_settings import InferenceSettings
8
+ from ..predictions import PredictionData
9
+
10
+
11
+ class BaseIteration(BaseModel):
12
+ id: str = Field(default_factory=lambda: "eval_iter_" + nanoid.generate())
13
+ inference_settings: InferenceSettings
14
+ json_schema: dict[str, Any]
15
+ updated_at: datetime.datetime = Field(
16
+ default_factory=lambda: datetime.datetime.now(tz=datetime.timezone.utc),
17
+ description="The last update date of inference settings or json schema",
18
+ )
19
+
20
+ class Iteration(BaseIteration):
21
+ predictions: dict[str, PredictionData] = Field(default_factory=dict, description="The predictions of the iteration for all the documents")
22
+
23
+ class CreateIterationRequest(BaseModel):
24
+ """
25
+ Request model for performing a new iteration with custom inference settings and optional JSON schema.
26
+ """
27
+
28
+ inference_settings: InferenceSettings
29
+ json_schema: Optional[dict[str, Any]] = None
30
+ from_iteration_id: Optional[str] = Field(
31
+ default=None,
32
+ description="The ID of the iteration to copy the JSON Schema from.",
33
+ )
34
+
35
+ # validate that exactly one of from_iteration_id or json_schema is provided
36
+ @model_validator(mode="after")
37
+ def validate_one_of_from_iteration_id_or_json_schema(self) -> Self:
38
+ if (self.from_iteration_id is None) ^ (self.json_schema is None):
39
+ return self
40
+ raise ValueError("Exactly one of from_iteration_id or json_schema must be provided")
41
+
42
+
43
+ class PatchIterationRequest(BaseModel):
44
+ inference_settings: Optional[InferenceSettings] = Field(default=None, description="The new inference settings of the iteration")
45
+ json_schema: Optional[dict[str, Any]] = Field(default=None, description="The new json schema of the iteration")
46
+ version: Optional[int] = Field(default=None, description="Current version for optimistic locking")
47
+
48
+
49
+ class ProcessIterationRequest(BaseModel):
50
+ """Request model for processing an iteration - running extractions on documents."""
51
+
52
+ document_ids: Optional[list[str]] = Field(default=None, description="Specific document IDs to process. If None, all documents will be processed.")
53
+ only_outdated: bool = Field(default=True, description="Only process documents that need updates (prediction.updated_at is None or older than iteration.updated_at)")
54
+
55
+
56
+ class DocumentStatus(BaseModel):
57
+ """Status of a document within an iteration."""
58
+
59
+ document_id: str
60
+ filename: str
61
+ needs_update: bool = Field(description="True if prediction is missing or outdated")
62
+ has_prediction: bool = Field(description="True if any prediction exists")
63
+ prediction_updated_at: Optional[datetime.datetime] = Field(description="When the prediction was last updated")
64
+ iteration_updated_at: datetime.datetime = Field(description="When the iteration settings were last updated")
65
+
66
+
67
+ class IterationDocumentStatusResponse(BaseModel):
68
+ """Response showing the status of all documents in an iteration."""
69
+
70
+ iteration_id: str
71
+ documents: list[DocumentStatus]
72
+ total_documents: int
73
+ documents_needing_update: int
74
+ documents_up_to_date: int
75
+
76
+
77
+ class AddIterationFromJsonlRequest(BaseModel):
78
+ jsonl_gcs_path: str
@@ -0,0 +1,68 @@
1
+ import datetime
2
+ from typing import Any, Optional
3
+
4
+ import nanoid # type: ignore
5
+ from pydantic import BaseModel, Field, computed_field
6
+
7
+ from ...utils.json_schema import generate_schema_data_id, generate_schema_id
8
+ from ..inference_settings import InferenceSettings
9
+ from .documents import ProjectDocument
10
+ from .iterations import Iteration
11
+
12
+
13
+ class BaseProject(BaseModel):
14
+ id: str = Field(default_factory=lambda: "proj_" + nanoid.generate())
15
+ name: str = Field(default="", description="The name of the project")
16
+ json_schema: dict[str, Any] = Field(default_factory=dict, description="The json schema of the project")
17
+ default_inference_settings: InferenceSettings = Field(default=InferenceSettings(), description="The default inference properties for the project.")
18
+ updated_at: datetime.datetime = Field(default_factory=lambda: datetime.datetime.now(tz=datetime.timezone.utc))
19
+
20
+
21
+ # Actual Object stored in DB
22
+ class Project(BaseProject):
23
+ documents: list[ProjectDocument] = Field(default_factory=list)
24
+ iterations: list[Iteration] = Field(default_factory=list)
25
+
26
+ @computed_field # type: ignore
27
+ @property
28
+ def schema_data_id(self) -> str:
29
+ """Returns the SHA1 hash of the schema data, ignoring all prompt/description/default fields.
30
+
31
+ Returns:
32
+ str: A SHA1 hash string representing the schema data version.
33
+ """
34
+ return generate_schema_data_id(self.json_schema)
35
+
36
+ # This is a computed field, it is exposed when serializing the object
37
+ @computed_field # type: ignore
38
+ @property
39
+ def schema_id(self) -> str:
40
+ """Returns the SHA1 hash of the complete schema.
41
+
42
+ Returns:
43
+ str: A SHA1 hash string representing the complete schema version.
44
+ """
45
+ return generate_schema_id(self.json_schema)
46
+
47
+
48
+ class ListProjectParams(BaseModel):
49
+ schema_id: Optional[str] = Field(default=None, description="The ID of the schema")
50
+ schema_data_id: Optional[str] = Field(default=None, description="The ID of the schema data")
51
+
52
+
53
+ class CreateProjectRequest(BaseModel):
54
+ name: str
55
+ json_schema: dict[str, Any]
56
+ default_inference_settings: InferenceSettings
57
+
58
+
59
+ # This is basically the same as BaseProject, but everything is optional.
60
+ # Could be achieved by convert_basemodel_to_partial_basemodel(BaseProject) but we prefer explicitness
61
+ class PatchProjectRequest(BaseModel):
62
+ name: Optional[str] = Field(default=None, description="The name of the document")
63
+ json_schema: Optional[dict[str, Any]] = Field(default=None, description="The json schema of the project")
64
+ default_inference_settings: Optional[InferenceSettings] = Field(default=None, description="The default inference properties for the project (mostly used in the frontend)")
65
+
66
+
67
+ class AddIterationFromJsonlRequest(BaseModel):
68
+ jsonl_gcs_path: str
@@ -45,7 +45,7 @@ class EvaluateSchemaRequest(BaseModel):
45
45
  if len(self.documents) != len(self.ground_truths):
46
46
  raise ValueError("Distance mode requires equal number of documents and ground_truths")
47
47
  if len(self.documents) == 0:
48
- raise ValueError("Evaluation mode requires at least one document")
48
+ raise ValueError("Project mode requires at least one document")
49
49
 
50
50
  return self
51
51
 
@@ -237,10 +237,7 @@ When provided with a **JSON schema** and a **document**, you must:
237
237
 
238
238
  When extracting date, time, or datetime values:
239
239
 
240
- - **Always use ISO format** for dates and times (e.g., "2023-12-25", "14:30:00", "2023-12-25T14:30:00Z")
241
- - **Include timezone information** when available (e.g., "2023-12-25T14:30:00+02:00")
242
- - **Use UTC timezone** when timezone is not specified or unclear (e.g., "2023-12-25T14:30:00Z")
243
- - **Maintain precision** as found in the source document (seconds, milliseconds if present)
240
+ - **Always use ISO format** for dates and times (e.g., "2023-12-25", "14:30:00", "2023-12-25T14:30:00")
244
241
 
245
242
  **Examples:**
246
243
 
@@ -383,32 +380,11 @@ When performing extraction, explicitly follow these core principles:
383
380
  - **Structure Preservation**: Always maintain explicitly the full schema structure, even when entire nested objects lack data (leaf attributes as null).
384
381
 
385
382
 
386
- ## Source Fields
387
-
388
- Some leaf fields require you to explicitly provide the source of the data (verbatim from the document).
389
- The idea is to simply provide a verbatim quote from the document, without any additional formatting or commentary, keeping it as close as possible to the original text.
390
- Make sure to reasonably include some surrounding text to provide context about the quote.
391
-
392
- You can easily identify the fields that require a source by the `quote___[attributename]` naming pattern.
393
-
394
- **Example:**
395
-
396
- ```json
397
- {
398
- "quote___name": "NAME:\nJohn Doe",
399
- "name": "John Doe"
400
- }
401
- ```
402
-
403
- ---
404
-
405
- # User Defined System Prompt
406
-
407
- """
383
+ ---"""
408
384
 
409
385
  @property
410
- def user_system_prompt(self) -> str:
411
- return self.json_schema.get("X-SystemPrompt", "")
386
+ def user_system_prompt(self) -> str | None:
387
+ return self.json_schema.get("X-SystemPrompt", None)
412
388
 
413
389
  @property
414
390
  def schema_system_prompt(self) -> str:
@@ -423,7 +399,7 @@ You can easily identify the fields that require a source by the `quote___[attrib
423
399
  Returns:
424
400
  str: The combined system prompt string.
425
401
  """
426
- return self.developer_system_prompt + "\n\n" + self.user_system_prompt + "\n\n" + self.schema_system_prompt
402
+ return self.developer_system_prompt + "\n\n" + (self.user_system_prompt + "\n\n" if self.user_system_prompt else "") + self.schema_system_prompt
427
403
 
428
404
  @property
429
405
  def title(self) -> str:
@@ -117,7 +117,6 @@ class CompletionsUsage(BaseModel):
117
117
  input_audio_tokens: int = Field(description="The aggregated number of audio input tokens used, including cached tokens.")
118
118
  output_audio_tokens: int = Field(description="The aggregated number of audio output tokens used.")
119
119
  num_model_requests: int = Field(description="The count of requests made to the model.")
120
- project_id: Optional[str] = Field(default=None, description="When group_by=project_id, this field provides the project ID of the grouped usage result.")
121
120
  user_id: Optional[str] = Field(default=None, description="When group_by=user_id, this field provides the user ID of the grouped usage result.")
122
121
  api_key_id: Optional[str] = Field(default=None, description="When group_by=api_key_id, this field provides the API key ID of the grouped usage result.")
123
122
  model: Optional[str] = Field(default=None, description="When group_by=model, this field provides the model name of the grouped usage result.")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: retab
3
- Version: 0.0.43
3
+ Version: 0.0.45
4
4
  Summary: Retab official python library
5
5
  Home-page: https://github.com/Retab-dev/retab
6
6
  Author: Retab
@@ -67,7 +67,7 @@ Retab solves all the major challenges in document processing with Large Language
67
67
  2. **Structured, Schema-driven Extraction**: Get consistent, reliable outputs using schema-based prompt engineering
68
68
  3. **Processors**: Publish a live, stable, shareable document processor.
69
69
  4. **Automations**: Create document processing workflows that can be triggered by events (mailbox, upload link, endpoint, outlook plugin).
70
- 5. **Evaluations**: Evaluate the performance of models against annotated datasets
70
+ 5. **Projects**: Evaluate the performance of models against annotated datasets
71
71
  6. **Optimizations**: Identify the most used processors and help you finetune models to reduce costs and improve performance
72
72
 
73
73
  We are offering you all the software-defined primitives to build your own document processing solutions. We see it as **Stripe** for document processing.
@@ -1,6 +1,7 @@
1
1
  retab/__init__.py,sha256=IfXoXvlvx4t1q5Ge6_pCOQnGOymVPxT7Dm1vQJ0OqoA,153
2
2
  retab/_resource.py,sha256=JfAU4UTa05ugWfbrpO7fsVr_pFewht99NkoIfK6kBQM,577
3
- retab/client.py,sha256=iO7J5n4k767IuIvOSkWFD-QARUFwpVgLef3rIttGZmA,27633
3
+ retab/client.py,sha256=iONTgYnm2qc17BfrKht8kbLAooKD7_ie3Wmfny5xE9I,27915
4
+ retab/generate_types.py,sha256=BK9coDsfUdoKQ632xbVlkul3EuEeolmTxzpCN0prKcw,7781
4
5
  retab/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
6
  retab/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
7
  retab/resources/evals.py,sha256=vOMyCJ0dVy6YZUv4NtkujZBZCByvr0PmSpV6UGnorHw,29927
@@ -18,13 +19,23 @@ retab/resources/consensus/completions.py,sha256=6vTnqADY6GueV28smYRDQ2yooj94G2WH
18
19
  retab/resources/consensus/completions_stream.py,sha256=DlU9od01F1Fmh9WjTLhq4KsntfqXy5jGGwrYauS43Ec,10893
19
20
  retab/resources/consensus/responses.py,sha256=hf1_gXBG8iwrBGyuXx16qCh6ULDXn9a0Uty1C-WiG7s,9966
20
21
  retab/resources/consensus/responses_stream.py,sha256=OopJ9aoO7HctfhLnXzJx8-dkk-4jK_juOw6jUAkzwVM,11671
22
+ retab/resources/deployments/__init__.py,sha256=sGTfJ8ozhkTtEzHC_LziiffYFElm6XjtYIZ0jEDFLg4,97
23
+ retab/resources/deployments/client.py,sha256=y2zc1gRnzvLVoR_ZDOBPy_Fdq1iOYafA12ThAaqfDrA,6169
24
+ retab/resources/deployments/automations/__init__.py,sha256=Iej-_yIxc8xAuhYmR0e2VI7j_EXVsNk1_L98OJSD82E,121
25
+ retab/resources/deployments/automations/client.py,sha256=3w54F0JfC2GYDosLux8LVEjDd_RXqQ29-SyNXGa28U8,10500
26
+ retab/resources/deployments/automations/endpoints.py,sha256=zJ556BNighciPff1laA_bBPZNxT4mWmGi-kDMXa5_tw,10893
27
+ retab/resources/deployments/automations/links.py,sha256=cSWLYE1g9VbR2kCckYNuE2xrMHYyGQ6Ei5YXmYjLkR0,11163
28
+ retab/resources/deployments/automations/logs.py,sha256=seBjzv4Tm8fMJcApzZcyR5yXG5YLP0yW5BH5ql7JMcg,8827
29
+ retab/resources/deployments/automations/mailboxes.py,sha256=OwThPbkjixPnmIIsOmKRqDp4upGhyrXtwMJ9JFwJUIw,15795
30
+ retab/resources/deployments/automations/outlook.py,sha256=UrzyVRMfzkSwbMo4EsAxYkqOs3J8IBN2yrXrv40lo3w,14616
31
+ retab/resources/deployments/automations/tests.py,sha256=nbO6qIkQnpr629ZkCchbfCJOm7KyjDOaLsxXxB3i0cg,6219
21
32
  retab/resources/documents/__init__.py,sha256=OjXmngFN0RKqO4SI-mJBNzr6Ex6rMxfq0DxaqzP0RQs,89
22
33
  retab/resources/documents/client.py,sha256=Okf4NvNjH4F5-jTJ7xIBv4LiMyM7TZkonTEDD5SuG6Q,25872
23
34
  retab/resources/documents/extractions.py,sha256=KQJMgu_w5TfR3NI-pvNaGayjZc61sCNQleoXfmA00j0,25041
24
- retab/resources/evaluations/__init__.py,sha256=3npbUDbxYn3ihnUKV7PRYNBYqL7MZ9AwhQHr7LaIESg,97
25
- retab/resources/evaluations/client.py,sha256=JmiyzfomM63jEsv_JoLNz6lySVmq_kla-nq3Z1JMdlg,11241
26
- retab/resources/evaluations/documents.py,sha256=E6PF7PcIX3r1cTrxYwdaRp8XKp9hCc58wnH0i7Gjnm8,9807
27
- retab/resources/evaluations/iterations.py,sha256=yJbiNGv9u2ze8t0Ple_o9QpL4W-9ftbxKOu4jsEjrTI,18742
35
+ retab/resources/evaluations/__init__.py,sha256=tPR3_3tr7bsoYd618qmGjnYN2R23PmF5oCFd7Z5_HGY,85
36
+ retab/resources/evaluations/client.py,sha256=dQQZ9JCYnx65tfBn2lNXz0w0M1NfXFMucVqTdyLtg0I,9721
37
+ retab/resources/evaluations/documents.py,sha256=i1KoC0aOCYw3_UFuYBZ8WcYhYugpv2JwP94YdMp3vqA,9786
38
+ retab/resources/evaluations/iterations.py,sha256=jz7whsf7GJSz2MoBJFbjoOoN4ziF-hwkP12XfSlElOI,18696
28
39
  retab/resources/processors/__init__.py,sha256=w1HrMdSi3xlrcEDFMQ9BA7rbUhOFWSTkTKkkR2PfFHQ,93
29
40
  retab/resources/processors/client.py,sha256=81CG3CH63pI7FAxOLHCgAEJWh-1TgNmkvsaxpTkjcRM,20530
30
41
  retab/resources/processors/automations/__init__.py,sha256=Iej-_yIxc8xAuhYmR0e2VI7j_EXVsNk1_L98OJSD82E,121
@@ -35,17 +46,21 @@ retab/resources/processors/automations/logs.py,sha256=seBjzv4Tm8fMJcApzZcyR5yXG5
35
46
  retab/resources/processors/automations/mailboxes.py,sha256=OwThPbkjixPnmIIsOmKRqDp4upGhyrXtwMJ9JFwJUIw,15795
36
47
  retab/resources/processors/automations/outlook.py,sha256=UrzyVRMfzkSwbMo4EsAxYkqOs3J8IBN2yrXrv40lo3w,14616
37
48
  retab/resources/processors/automations/tests.py,sha256=nbO6qIkQnpr629ZkCchbfCJOm7KyjDOaLsxXxB3i0cg,6219
49
+ retab/resources/projects/__init__.py,sha256=tPR3_3tr7bsoYd618qmGjnYN2R23PmF5oCFd7Z5_HGY,85
50
+ retab/resources/projects/client.py,sha256=7J0UT9sY_I0DOolaBiALS6Z9yDO6xLnTW-hovdQo32M,9715
51
+ retab/resources/projects/documents.py,sha256=i1KoC0aOCYw3_UFuYBZ8WcYhYugpv2JwP94YdMp3vqA,9786
52
+ retab/resources/projects/iterations.py,sha256=jz7whsf7GJSz2MoBJFbjoOoN4ziF-hwkP12XfSlElOI,18696
38
53
  retab/resources/secrets/__init__.py,sha256=SwofMyk96k0YSyj1d_GRxhpVx4wb4TA97TISsTjB0Kc,105
39
54
  retab/resources/secrets/client.py,sha256=nXt1cgvkWqhA99WTnC1PWbWJq-EbwvoDuCQOa0GJOOU,599
40
55
  retab/resources/secrets/external_api_keys.py,sha256=3TuJxjk65EPUT2XC3wBcYWaVwqzc6QGv9BoHufzxTLU,3759
41
56
  retab/resources/secrets/webhook.py,sha256=2mFDNblQYBGOwgqOG5gfRJkusQX7Hjy28XZ7O7ffkl8,1805
42
57
  retab/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- retab/types/ai_models.py,sha256=tnwYd7fgacsz7TAFoheHMCCyS7DRDfLVc8B0l-EV3_I,4945
58
+ retab/types/ai_models.py,sha256=RaRrHtDq_LsR77hQlt4EgoGjlLlviKO2j684TT5taZA,4982
44
59
  retab/types/browser_canvas.py,sha256=U3yLqJcSwfturcIsNFSblRtFtnG3p-UL1YYoM9KZfdE,70
45
60
  retab/types/chat.py,sha256=l32vhLtNcdmHFjG4iVC617j38x6a2oH7CNPwlvqdF8g,424
46
61
  retab/types/completions.py,sha256=ZQU29bm-FhdOzky4_Dp2N--fedR82C3QfCRZCJCQ-P8,5381
47
62
  retab/types/consensus.py,sha256=EsFCsyZK8NhkQ1BizFpnGN54D24hRFKc0xwt9VpH11c,1161
48
- retab/types/deprecated_evals.py,sha256=YHxtQxzQ8RgQyzN1CEdAfOP2Nwc07b-XVPydPveTxbg,9306
63
+ retab/types/deprecated_evals.py,sha256=Yuz3OMlqUG_enS04apJEwTA7S6arv_U8-FC9eqPYZAA,9285
49
64
  retab/types/evals.py,sha256=JNdWu4hplfSEuSzu9l27ZVr2RO2opUKEruIpKXZosmU,9953
50
65
  retab/types/events.py,sha256=NrisdzJAaJ_kkfgdsqoiDB-Upm0LnbIGZikU_e9XXWw,2195
51
66
  retab/types/extractions.py,sha256=_slYXQrWPi93iMdJIOIm-WzYwWPG2Fiyd3Xx0zfekl0,6144
@@ -75,20 +90,24 @@ retab/types/documents/parse.py,sha256=-gCzloJhZraR_Pi9Je0SL8aP52n0GfO9qH838usPA3
75
90
  retab/types/evaluations/__init__.py,sha256=Jr-y_b7hE20LXMJoq4gkA3VF6bCUVGgAIbOWmMaXc7Q,1012
76
91
  retab/types/evaluations/documents.py,sha256=oy0nqTrv0Pe__5ligeNWn5MbqVDAFRSrXYbCVoLxyXw,1268
77
92
  retab/types/evaluations/iterations.py,sha256=YfiqaTvCxmPIJORHzCgtafshUBRZN9LAo1y2cOPSBco,3306
78
- retab/types/evaluations/model.py,sha256=I9C8_LxkjrpzYBxcNbhAFUiq9cXAjoSlZDunK23305o,3159
93
+ retab/types/evaluations/model.py,sha256=S9U3pLnF-wz45jzfUQL5uSKhEi0-ylubQJi25amW-OA,2865
79
94
  retab/types/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
- retab/types/jobs/base.py,sha256=R4UXcvgDmkgm4FB0ke5kQrSDWC95TweBLlc08ptfqt8,1695
95
+ retab/types/jobs/base.py,sha256=wxst8l329NHGQcI1tLVBzddc8OoJUtRexsW2kei-lVU,1692
81
96
  retab/types/jobs/batch_annotation.py,sha256=Rftuu4Q6YzB4c39kWsqPGJ1QbPJrJWjWhupaKGO9kGE,281
82
- retab/types/jobs/evaluation.py,sha256=R3Itl721bybXXnBCqU16C0gl5EAwTdcf_HZySkI_wsA,4524
97
+ retab/types/jobs/evaluation.py,sha256=BLDRDuaAs2n26vvW4UVT9qn93o_kL89Ga3ycb8-xGro,4521
83
98
  retab/types/jobs/finetune.py,sha256=6O9NUy-ap_aqZ73tYx-NRRdFgKOIvk8WcItGhEUvrSQ,187
84
99
  retab/types/jobs/prompt_optimization.py,sha256=P7JI0zKFExCN4ws8kpFrCHBFbrJ4m4-zGJnNVXWa-ic,1306
85
100
  retab/types/jobs/webcrawl.py,sha256=C3_7mW2mmOXs6ypktDIHdjMnify90pFo70wmhrs_TP8,183
101
+ retab/types/projects/__init__.py,sha256=63kk9c9PZX9cknPSYeK2gG5_ys98PqjEnj5OyYtsujY,964
102
+ retab/types/projects/documents.py,sha256=tgnT1f3vSd6LEA6ipm_Kt-nyCYUmI9wZMveH1aJQ8T4,1259
103
+ retab/types/projects/iterations.py,sha256=YfiqaTvCxmPIJORHzCgtafshUBRZN9LAo1y2cOPSBco,3306
104
+ retab/types/projects/model.py,sha256=xfDb1rcMWx-xSAwfCg2z2l0xKSsKOvBB_skBDsNxWc8,2820
86
105
  retab/types/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
106
  retab/types/schemas/enhance.py,sha256=2FR3APE1yh6_GLoQ8EDFAS1y3oM6B4D4pexP1ohazug,2738
88
- retab/types/schemas/evaluate.py,sha256=vCXVfC4H44r0lgP1IbxtvlxhoPTZV2l7wWlyERetvBc,2208
107
+ retab/types/schemas/evaluate.py,sha256=mTgl8rZWYnFYReN2bA7R4Vr2RijAOiEOtYQg0K4C2JM,2205
89
108
  retab/types/schemas/generate.py,sha256=pb6e6yJ2KPswmNHNkFcRhata7B698yBLnzlFVspJ9mE,1194
90
109
  retab/types/schemas/layout.py,sha256=JLPwQGIWfPBoe1Y5r-MhiNDJigzZ-yKZnVGgox0uqMk,1487
91
- retab/types/schemas/object.py,sha256=3GG9dpP0qG2E9BTWuSmMjELQtcf4cpM26Uy5nim2QV0,26222
110
+ retab/types/schemas/object.py,sha256=lPnuqJGSChTf_8zGalhj_ez9Qqoyz0QsEmCseXR5VQ4,25383
92
111
  retab/types/schemas/templates.py,sha256=Of4gYULkxULhMOv1X1zXe9pd7o3b21vDUF4BYSouAsc,3465
93
112
  retab/types/secrets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
113
  retab/types/secrets/external_api_keys.py,sha256=-yaaOfNLxKpll3oD-0htQlW8S03lyWs9Mmk9HOdyQ3g,437
@@ -108,8 +127,8 @@ retab/utils/_model_cards/gemini.yaml,sha256=irV9c0WumgEOIYbAkR2jsisfK_4dY1Tzja2D
108
127
  retab/utils/_model_cards/openai.yaml,sha256=PcmjqAioomqWOw25H4BluVfJ1WO_zapg_nPxORUR7JM,7639
109
128
  retab/utils/_model_cards/xai.yaml,sha256=OdVV33_WODc4UBZhDezcUq_5mHQK5zeOT49EjJUJ764,612
110
129
  retab/utils/usage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
- retab/utils/usage/usage.py,sha256=PoQAMSWqEXYIRdp-JW9HjecFVitD_oMbxDMtDJdqWnQ,12948
112
- retab-0.0.43.dist-info/METADATA,sha256=Z3U8j90ruwggK7JMSjKGJoH8TnDlh9hrKgC4DkxBk_I,4484
113
- retab-0.0.43.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
114
- retab-0.0.43.dist-info/top_level.txt,sha256=waQR0EGdhLIQtztoE3AXg7ik5ONQ9q_bsKVpyFuJdq0,6
115
- retab-0.0.43.dist-info/RECORD,,
130
+ retab/utils/usage/usage.py,sha256=Dxi4EyTBMsu4mgUg7hwh4gTQlE70Xn3gxMZb0EEbti4,12791
131
+ retab-0.0.45.dist-info/METADATA,sha256=toZpfwd-Ph4A7IwGXxxNBp6a0XVckntEHA00vi2TPVU,4481
132
+ retab-0.0.45.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
133
+ retab-0.0.45.dist-info/top_level.txt,sha256=waQR0EGdhLIQtztoE3AXg7ik5ONQ9q_bsKVpyFuJdq0,6
134
+ retab-0.0.45.dist-info/RECORD,,
File without changes