retab 0.0.40__tar.gz → 0.0.41__tar.gz
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.
- {retab-0.0.40 → retab-0.0.41}/PKG-INFO +5 -5
- {retab-0.0.40 → retab-0.0.41}/README.md +4 -4
- {retab-0.0.40 → retab-0.0.41}/retab/resources/consensus/completions.py +1 -1
- {retab-0.0.40 → retab-0.0.41}/retab/resources/consensus/completions_stream.py +3 -3
- {retab-0.0.40 → retab-0.0.41}/retab/resources/consensus/responses.py +1 -1
- {retab-0.0.40 → retab-0.0.41}/retab/resources/consensus/responses_stream.py +2 -2
- {retab-0.0.40 → retab-0.0.41}/retab/resources/documents/client.py +3 -3
- {retab-0.0.40 → retab-0.0.41}/retab/resources/documents/extractions.py +4 -4
- {retab-0.0.40 → retab-0.0.41}/retab/resources/evals.py +1 -1
- {retab-0.0.40 → retab-0.0.41}/retab/resources/evaluations/documents.py +1 -1
- {retab-0.0.40 → retab-0.0.41}/retab/resources/jsonlUtils.py +4 -4
- {retab-0.0.40 → retab-0.0.41}/retab/resources/processors/automations/endpoints.py +1 -1
- {retab-0.0.40 → retab-0.0.41}/retab/resources/processors/automations/mailboxes.py +1 -1
- {retab-0.0.40 → retab-0.0.41}/retab/resources/processors/automations/tests.py +1 -1
- {retab-0.0.40 → retab-0.0.41}/retab/resources/processors/client.py +23 -14
- {retab-0.0.40 → retab-0.0.41}/retab/resources/prompt_optimization.py +1 -1
- {retab-0.0.40 → retab-0.0.41}/retab/resources/schemas.py +3 -3
- {retab-0.0.40 → retab-0.0.41}/retab/types/completions.py +1 -1
- {retab-0.0.40 → retab-0.0.41}/retab/types/documents/create_messages.py +4 -4
- {retab-0.0.40 → retab-0.0.41}/retab/types/documents/extractions.py +1 -1
- {retab-0.0.40 → retab-0.0.41}/retab/types/evals.py +2 -2
- {retab-0.0.40 → retab-0.0.41}/retab/types/evaluations/iterations.py +2 -2
- {retab-0.0.40 → retab-0.0.41}/retab/types/evaluations/model.py +2 -2
- {retab-0.0.40 → retab-0.0.41}/retab/types/extractions.py +1 -1
- {retab-0.0.40 → retab-0.0.41}/retab/types/jobs/prompt_optimization.py +1 -1
- {retab-0.0.40 → retab-0.0.41}/retab/types/logs.py +3 -3
- {retab-0.0.40 → retab-0.0.41}/retab/types/schemas/object.py +4 -4
- {retab-0.0.40 → retab-0.0.41}/retab/types/schemas/templates.py +1 -1
- {retab-0.0.40/retab/_utils → retab-0.0.41/retab/utils}/usage/usage.py +1 -1
- {retab-0.0.40 → retab-0.0.41}/retab.egg-info/PKG-INFO +5 -5
- {retab-0.0.40 → retab-0.0.41}/retab.egg-info/SOURCES.txt +16 -16
- {retab-0.0.40 → retab-0.0.41}/setup.py +1 -1
- {retab-0.0.40 → retab-0.0.41}/pyproject.toml +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/_resource.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/client.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/py.typed +0 -0
- {retab-0.0.40/retab/_utils → retab-0.0.41/retab/resources}/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/consensus/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/consensus/client.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/documents/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/evaluations/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/evaluations/client.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/evaluations/iterations.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/files.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/finetuning.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/models.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/openai_example.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/processors/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/processors/automations/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/processors/automations/client.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/processors/automations/links.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/processors/automations/logs.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/processors/automations/outlook.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/secrets/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/secrets/client.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/secrets/external_api_keys.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/secrets/webhook.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/resources/usage.py +0 -0
- {retab-0.0.40/retab/_utils/usage → retab-0.0.41/retab/types}/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/ai_models.py +0 -0
- {retab-0.0.40/retab/resources → retab-0.0.41/retab/types/automations}/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/automations/cron.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/automations/endpoints.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/automations/links.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/automations/mailboxes.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/automations/outlook.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/automations/webhooks.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/browser_canvas.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/chat.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/consensus.py +0 -0
- {retab-0.0.40/retab/types → retab-0.0.41/retab/types/db}/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/db/annotations.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/db/files.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/documents/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/documents/correct_orientation.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/documents/parse.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/evaluations/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/evaluations/documents.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/events.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/inference_settings.py +0 -0
- {retab-0.0.40/retab/types/automations → retab-0.0.41/retab/types/jobs}/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/jobs/base.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/jobs/batch_annotation.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/jobs/evaluation.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/jobs/finetune.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/jobs/webcrawl.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/metrics.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/mime.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/modalities.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/pagination.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/predictions.py +0 -0
- {retab-0.0.40/retab/types/db → retab-0.0.41/retab/types/schemas}/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/schemas/enhance.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/schemas/evaluate.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/schemas/generate.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/schemas/layout.py +0 -0
- {retab-0.0.40/retab/types/jobs → retab-0.0.41/retab/types/secrets}/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/secrets/external_api_keys.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab/types/standards.py +0 -0
- {retab-0.0.40/retab/types/schemas → retab-0.0.41/retab/utils}/__init__.py +0 -0
- {retab-0.0.40/retab/_utils → retab-0.0.41/retab/utils}/_model_cards/anthropic.yaml +0 -0
- {retab-0.0.40/retab/_utils → retab-0.0.41/retab/utils}/_model_cards/auto.yaml +0 -0
- {retab-0.0.40/retab/_utils → retab-0.0.41/retab/utils}/_model_cards/gemini.yaml +0 -0
- {retab-0.0.40/retab/_utils → retab-0.0.41/retab/utils}/_model_cards/openai.yaml +0 -0
- {retab-0.0.40/retab/_utils → retab-0.0.41/retab/utils}/_model_cards/xai.yaml +0 -0
- {retab-0.0.40/retab/_utils → retab-0.0.41/retab/utils}/ai_models.py +0 -0
- {retab-0.0.40/retab/_utils → retab-0.0.41/retab/utils}/benchmarking.py +0 -0
- {retab-0.0.40/retab/_utils → retab-0.0.41/retab/utils}/chat.py +0 -0
- {retab-0.0.40/retab/_utils → retab-0.0.41/retab/utils}/display.py +0 -0
- {retab-0.0.40/retab/_utils → retab-0.0.41/retab/utils}/json_schema.py +0 -0
- {retab-0.0.40/retab/_utils → retab-0.0.41/retab/utils}/mime.py +0 -0
- {retab-0.0.40/retab/_utils → retab-0.0.41/retab/utils}/responses.py +0 -0
- {retab-0.0.40/retab/_utils → retab-0.0.41/retab/utils}/stream_context_managers.py +0 -0
- {retab-0.0.40/retab/types/secrets → retab-0.0.41/retab/utils/usage}/__init__.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab.egg-info/dependency_links.txt +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab.egg-info/requires.txt +0 -0
- {retab-0.0.40 → retab-0.0.41}/retab.egg-info/top_level.txt +0 -0
- {retab-0.0.40 → retab-0.0.41}/setup.cfg +0 -0
- {retab-0.0.40 → retab-0.0.41}/tests/test_automations_links.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/tests/test_automations_mailboxes.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/tests/test_documents_api.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/tests/test_evaluations.py +0 -0
- {retab-0.0.40 → retab-0.0.41}/tests/test_preprocessor.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: retab
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.41
|
4
4
|
Summary: Retab official python library
|
5
5
|
Home-page: https://github.com/Retab-dev/retab
|
6
6
|
Author: Retab
|
@@ -45,7 +45,7 @@ Requires-Dist: ruff
|
|
45
45
|
|
46
46
|
<div align="center" style="margin-bottom: 1em;">
|
47
47
|
|
48
|
-
<img src="https://raw.githubusercontent.com/Retab/retab/refs/heads/main/assets/retab-logo.png" alt="Retab Logo" width="150">
|
48
|
+
<img src="https://raw.githubusercontent.com/Retab-dev/retab/refs/heads/main/assets/retab-logo.png" alt="Retab Logo" width="150">
|
49
49
|
|
50
50
|
|
51
51
|
*The AI Automation Platform*
|
@@ -95,7 +95,7 @@ You come with your own API key from your favorite AI provider, and we handle the
|
|
95
95
|
We currently support [OpenAI](https://platform.openai.com/docs/overview), [Anthropic](https://www.anthropic.com/api), [Gemini](https://aistudio.google.com/prompts/new_chat) and [xAI](https://x.ai/api) models.
|
96
96
|
|
97
97
|
<p align="center">
|
98
|
-
<img src="https://raw.githubusercontent.com/Retab/retab/refs/heads/main/assets/supported_models.png" alt="Supported Models" width="600">
|
98
|
+
<img src="https://raw.githubusercontent.com/Retab-dev/retab/refs/heads/main/assets/supported_models.png" alt="Supported Models" width="600">
|
99
99
|
</p>
|
100
100
|
|
101
101
|
---
|
@@ -105,7 +105,7 @@ We currently support [OpenAI](https://platform.openai.com/docs/overview), [Anthr
|
|
105
105
|
Explore our [Playground](https://www.retab.dev/dashboard/playground) and create your first automations easily 🚀!
|
106
106
|
|
107
107
|
<p align="center">
|
108
|
-
<img src="https://raw.githubusercontent.com/Retab/retab/refs/heads/main/assets/retab-playground.png" alt="Retab Playground" width="600">
|
108
|
+
<img src="https://raw.githubusercontent.com/Retab-dev/retab/refs/heads/main/assets/retab-playground.png" alt="Retab Playground" width="600">
|
109
109
|
</p>
|
110
110
|
|
111
111
|
---
|
@@ -244,7 +244,7 @@ completion = client.beta.chat.completions.parse(
|
|
244
244
|
print("Extracted data:", completion.choices[0].message.parsed)
|
245
245
|
|
246
246
|
# Validate the response against the original schema if you want to remove the reasoning fields
|
247
|
-
from retab.
|
247
|
+
from retab.utils.json_schema import filter_auxiliary_fields_json
|
248
248
|
assert completion.choices[0].message.content is not None
|
249
249
|
extraction = schema_obj.pydantic_model.model_validate(
|
250
250
|
filter_auxiliary_fields_json(completion.choices[0].message.content, schema_obj.pydantic_model)
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
<div align="center" style="margin-bottom: 1em;">
|
4
4
|
|
5
|
-
<img src="https://raw.githubusercontent.com/Retab/retab/refs/heads/main/assets/retab-logo.png" alt="Retab Logo" width="150">
|
5
|
+
<img src="https://raw.githubusercontent.com/Retab-dev/retab/refs/heads/main/assets/retab-logo.png" alt="Retab Logo" width="150">
|
6
6
|
|
7
7
|
|
8
8
|
*The AI Automation Platform*
|
@@ -52,7 +52,7 @@ You come with your own API key from your favorite AI provider, and we handle the
|
|
52
52
|
We currently support [OpenAI](https://platform.openai.com/docs/overview), [Anthropic](https://www.anthropic.com/api), [Gemini](https://aistudio.google.com/prompts/new_chat) and [xAI](https://x.ai/api) models.
|
53
53
|
|
54
54
|
<p align="center">
|
55
|
-
<img src="https://raw.githubusercontent.com/Retab/retab/refs/heads/main/assets/supported_models.png" alt="Supported Models" width="600">
|
55
|
+
<img src="https://raw.githubusercontent.com/Retab-dev/retab/refs/heads/main/assets/supported_models.png" alt="Supported Models" width="600">
|
56
56
|
</p>
|
57
57
|
|
58
58
|
---
|
@@ -62,7 +62,7 @@ We currently support [OpenAI](https://platform.openai.com/docs/overview), [Anthr
|
|
62
62
|
Explore our [Playground](https://www.retab.dev/dashboard/playground) and create your first automations easily 🚀!
|
63
63
|
|
64
64
|
<p align="center">
|
65
|
-
<img src="https://raw.githubusercontent.com/Retab/retab/refs/heads/main/assets/retab-playground.png" alt="Retab Playground" width="600">
|
65
|
+
<img src="https://raw.githubusercontent.com/Retab-dev/retab/refs/heads/main/assets/retab-playground.png" alt="Retab Playground" width="600">
|
66
66
|
</p>
|
67
67
|
|
68
68
|
---
|
@@ -201,7 +201,7 @@ completion = client.beta.chat.completions.parse(
|
|
201
201
|
print("Extracted data:", completion.choices[0].message.parsed)
|
202
202
|
|
203
203
|
# Validate the response against the original schema if you want to remove the reasoning fields
|
204
|
-
from retab.
|
204
|
+
from retab.utils.json_schema import filter_auxiliary_fields_json
|
205
205
|
assert completion.choices[0].message.content is not None
|
206
206
|
extraction = schema_obj.pydantic_model.model_validate(
|
207
207
|
filter_auxiliary_fields_json(completion.choices[0].message.content, schema_obj.pydantic_model)
|
@@ -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 ...
|
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 ...
|
13
|
-
from ...
|
14
|
-
from ...
|
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
|
@@ -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 ...
|
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 ...
|
10
|
-
from ...
|
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,9 +8,9 @@ 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 ...
|
12
|
-
from ...
|
13
|
-
from ...
|
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
|
@@ -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 ...
|
18
|
-
from ...
|
19
|
-
from ...
|
20
|
-
from ...
|
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
|
@@ -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 ..
|
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 ...
|
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 ..
|
22
|
-
from ..
|
23
|
-
from ..
|
24
|
-
from ..
|
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 ....
|
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
|
|
@@ -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 ....
|
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
|
@@ -6,7 +6,7 @@ from PIL.Image import Image
|
|
6
6
|
from pydantic import HttpUrl
|
7
7
|
|
8
8
|
from ...._resource import AsyncAPIResource, SyncAPIResource
|
9
|
-
from ....
|
9
|
+
from ....utils.mime import prepare_mime_document
|
10
10
|
from ....types.logs import AutomationLog
|
11
11
|
from ....types.mime import MIMEData
|
12
12
|
from ....types.standards import PreparedRequest
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import base64
|
2
2
|
from io import IOBase
|
3
3
|
from pathlib import Path
|
4
|
-
from typing import Any,
|
4
|
+
from typing import Any, List, Literal
|
5
5
|
|
6
6
|
import PIL.Image
|
7
7
|
from openai.types.chat.chat_completion_reasoning_effort import ChatCompletionReasoningEffort
|
@@ -9,8 +9,9 @@ from pydantic import BaseModel, HttpUrl
|
|
9
9
|
from pydantic_core import PydanticUndefined
|
10
10
|
|
11
11
|
from ..._resource import AsyncAPIResource, SyncAPIResource
|
12
|
-
from ...
|
13
|
-
from ...
|
12
|
+
from ...utils.ai_models import assert_valid_model_extraction
|
13
|
+
from ...utils.json_schema import load_json_schema
|
14
|
+
from ...utils.mime import MIMEData, prepare_mime_document
|
14
15
|
from ...types.browser_canvas import BrowserCanvas
|
15
16
|
from ...types.documents.extractions import RetabParsedChatCompletion
|
16
17
|
from ...types.logs import ProcessorConfig, UpdateProcessorRequest
|
@@ -31,7 +32,7 @@ class ProcessorsMixin:
|
|
31
32
|
def prepare_create(
|
32
33
|
self,
|
33
34
|
name: str,
|
34
|
-
json_schema: dict[str, Any],
|
35
|
+
json_schema: dict[str, Any] | Path | str,
|
35
36
|
modality: Modality = "native",
|
36
37
|
model: str = "gpt-4o-mini",
|
37
38
|
temperature: float = PydanticUndefined, # type: ignore[assignment]
|
@@ -42,9 +43,12 @@ class ProcessorsMixin:
|
|
42
43
|
) -> PreparedRequest:
|
43
44
|
assert_valid_model_extraction(model)
|
44
45
|
|
46
|
+
# Load the JSON schema from file path, string, or dict
|
47
|
+
loaded_schema = load_json_schema(json_schema)
|
48
|
+
|
45
49
|
processor_config = ProcessorConfig(
|
46
50
|
name=name,
|
47
|
-
json_schema=
|
51
|
+
json_schema=loaded_schema,
|
48
52
|
modality=modality,
|
49
53
|
model=model,
|
50
54
|
temperature=temperature,
|
@@ -104,7 +108,7 @@ class ProcessorsMixin:
|
|
104
108
|
image_resolution_dpi: int | None = None,
|
105
109
|
browser_canvas: BrowserCanvas | None = None,
|
106
110
|
model: str | None = None,
|
107
|
-
json_schema: dict[str, Any] | None = None,
|
111
|
+
json_schema: dict[str, Any] | Path | str | None = None,
|
108
112
|
temperature: float | None = None,
|
109
113
|
reasoning_effort: ChatCompletionReasoningEffort | None = None,
|
110
114
|
n_consensus: int | None = None,
|
@@ -112,13 +116,18 @@ class ProcessorsMixin:
|
|
112
116
|
if model is not None:
|
113
117
|
assert_valid_model_extraction(model)
|
114
118
|
|
119
|
+
# Load the JSON schema from file path, string, or dict if provided
|
120
|
+
loaded_schema = None
|
121
|
+
if json_schema is not None:
|
122
|
+
loaded_schema = load_json_schema(json_schema)
|
123
|
+
|
115
124
|
update_request = UpdateProcessorRequest(
|
116
125
|
name=name,
|
117
126
|
modality=modality,
|
118
127
|
image_resolution_dpi=image_resolution_dpi,
|
119
128
|
browser_canvas=browser_canvas,
|
120
129
|
model=model,
|
121
|
-
json_schema=
|
130
|
+
json_schema=loaded_schema,
|
122
131
|
temperature=temperature,
|
123
132
|
reasoning_effort=reasoning_effort,
|
124
133
|
n_consensus=n_consensus,
|
@@ -203,7 +212,7 @@ class Processors(SyncAPIResource, ProcessorsMixin):
|
|
203
212
|
def create(
|
204
213
|
self,
|
205
214
|
name: str,
|
206
|
-
json_schema:
|
215
|
+
json_schema: dict[str, Any] | Path | str,
|
207
216
|
modality: Modality = "native",
|
208
217
|
model: str = "gpt-4o-mini",
|
209
218
|
temperature: float = PydanticUndefined, # type: ignore[assignment]
|
@@ -216,7 +225,7 @@ class Processors(SyncAPIResource, ProcessorsMixin):
|
|
216
225
|
|
217
226
|
Args:
|
218
227
|
name: Name of the processor
|
219
|
-
json_schema: JSON schema for the processor
|
228
|
+
json_schema: JSON schema for the processor. Can be a dictionary, file path (Path or str), or JSON string.
|
220
229
|
image_resolution_dpi: Optional image resolution DPI
|
221
230
|
browser_canvas: Optional browser canvas size
|
222
231
|
modality: Processing modality (currently only "native" supported)
|
@@ -295,7 +304,7 @@ class Processors(SyncAPIResource, ProcessorsMixin):
|
|
295
304
|
image_resolution_dpi: int | None = None,
|
296
305
|
browser_canvas: BrowserCanvas | None = None,
|
297
306
|
model: str | None = None,
|
298
|
-
json_schema: dict[str, Any] | None = None,
|
307
|
+
json_schema: dict[str, Any] | Path | str | None = None,
|
299
308
|
temperature: float | None = None,
|
300
309
|
reasoning_effort: ChatCompletionReasoningEffort | None = None,
|
301
310
|
n_consensus: int | None = None,
|
@@ -309,7 +318,7 @@ class Processors(SyncAPIResource, ProcessorsMixin):
|
|
309
318
|
image_resolution_dpi: New image resolution DPI
|
310
319
|
browser_canvas: New browser canvas size
|
311
320
|
model: New AI model
|
312
|
-
json_schema: New JSON schema for the processor
|
321
|
+
json_schema: New JSON schema for the processor. Can be a dictionary, file path (Path or str), or JSON string.
|
313
322
|
temperature: New temperature setting
|
314
323
|
reasoning_effort: The effort level for the model to reason about the input data.
|
315
324
|
n_consensus: New number of consensus required
|
@@ -378,7 +387,7 @@ class AsyncProcessors(AsyncAPIResource, ProcessorsMixin):
|
|
378
387
|
async def create(
|
379
388
|
self,
|
380
389
|
name: str,
|
381
|
-
json_schema:
|
390
|
+
json_schema: dict[str, Any] | Path | str,
|
382
391
|
modality: Modality = "native",
|
383
392
|
model: str = "gpt-4o-mini",
|
384
393
|
temperature: float = PydanticUndefined, # type: ignore[assignment]
|
@@ -432,7 +441,7 @@ class AsyncProcessors(AsyncAPIResource, ProcessorsMixin):
|
|
432
441
|
image_resolution_dpi: int | None = None,
|
433
442
|
browser_canvas: BrowserCanvas | None = None,
|
434
443
|
model: str | None = None,
|
435
|
-
json_schema: dict[str, Any] | None = None,
|
444
|
+
json_schema: dict[str, Any] | Path | str | None = None,
|
436
445
|
temperature: float | None = None,
|
437
446
|
reasoning_effort: ChatCompletionReasoningEffort | None = None,
|
438
447
|
n_consensus: int | None = None,
|
@@ -446,7 +455,7 @@ class AsyncProcessors(AsyncAPIResource, ProcessorsMixin):
|
|
446
455
|
image_resolution_dpi: New image resolution DPI
|
447
456
|
browser_canvas: New browser canvas size
|
448
457
|
model: New AI model
|
449
|
-
json_schema: New JSON schema for the processor
|
458
|
+
json_schema: New JSON schema for the processor. Can be a dictionary, file path (Path or str), or JSON string.
|
450
459
|
temperature: New temperature setting
|
451
460
|
reasoning_effort: The effort level for the model to reason about the input data.
|
452
461
|
n_consensus: New number of consensus required
|
@@ -3,7 +3,7 @@
|
|
3
3
|
# import json
|
4
4
|
|
5
5
|
# from .._resource import SyncAPIResource, AsyncAPIResource
|
6
|
-
# from ..
|
6
|
+
# from ..utils.json_schema import load_json_schema
|
7
7
|
# from ..types.jobs import JobResponse
|
8
8
|
# from ..types.jobs.prompt_optimization import PromptOptimizationObject, PromptOptimizationProps, PromptOptimizationJobInputData, PromptOptimizationJob
|
9
9
|
|
@@ -7,9 +7,9 @@ from openai.types.chat.chat_completion_reasoning_effort import ChatCompletionRea
|
|
7
7
|
from pydantic import BaseModel
|
8
8
|
|
9
9
|
from .._resource import AsyncAPIResource, SyncAPIResource
|
10
|
-
from ..
|
11
|
-
from ..
|
12
|
-
from ..
|
10
|
+
from ..utils.ai_models import assert_valid_model_schema_generation
|
11
|
+
from ..utils.json_schema import load_json_schema
|
12
|
+
from ..utils.mime import prepare_mime_document_list
|
13
13
|
from ..types.mime import MIMEData
|
14
14
|
from ..types.modalities import Modality
|
15
15
|
from ..types.schemas.enhance import EnhanceSchemaConfig, EnhanceSchemaConfigDict, EnhanceSchemaRequest
|
@@ -7,7 +7,7 @@ from openai.types.shared_params.reasoning import Reasoning
|
|
7
7
|
from openai.types.shared_params.response_format_json_schema import ResponseFormatJSONSchema
|
8
8
|
from pydantic import BaseModel, ConfigDict, Field
|
9
9
|
|
10
|
-
from ..
|
10
|
+
from ..utils.ai_models import get_provider_for_model
|
11
11
|
from .ai_models import AIProvider
|
12
12
|
from .chat import ChatCompletionRetabMessage
|
13
13
|
|
@@ -10,10 +10,10 @@ from openai.types.chat.chat_completion_message_param import ChatCompletionMessag
|
|
10
10
|
from openai.types.responses.response_input_param import ResponseInputItemParam
|
11
11
|
from pydantic import BaseModel, Field, computed_field
|
12
12
|
|
13
|
-
from ...
|
14
|
-
from ...
|
15
|
-
from ...
|
16
|
-
from ...
|
13
|
+
from ...utils.chat import convert_to_anthropic_format, convert_to_google_genai_format, str_messages
|
14
|
+
from ...utils.chat import convert_to_openai_format as convert_to_openai_completions_api_format
|
15
|
+
from ...utils.display import count_image_tokens, count_text_tokens
|
16
|
+
from ...utils.responses import convert_to_openai_format as convert_to_openai_responses_api_format
|
17
17
|
from ..chat import ChatCompletionRetabMessage
|
18
18
|
from ..mime import MIMEData
|
19
19
|
from ..modalities import Modality
|
@@ -15,7 +15,7 @@ from openai.types.responses.response import Response
|
|
15
15
|
from openai.types.responses.response_input_param import ResponseInputItemParam
|
16
16
|
from pydantic import BaseModel, ConfigDict, Field, ValidationInfo, computed_field, field_validator, model_validator
|
17
17
|
|
18
|
-
from ...
|
18
|
+
from ...utils.usage.usage import CostBreakdown, compute_cost_from_model, compute_cost_from_model_with_breakdown
|
19
19
|
from ..ai_models import Amount
|
20
20
|
from ..chat import ChatCompletionRetabMessage
|
21
21
|
from ..mime import MIMEData
|
@@ -6,8 +6,8 @@ from typing import Any, List, Literal, Optional
|
|
6
6
|
import nanoid # type: ignore
|
7
7
|
from pydantic import BaseModel, Field, computed_field
|
8
8
|
|
9
|
-
from ..
|
10
|
-
from ..
|
9
|
+
from ..utils.json_schema import clean_schema, compute_schema_data_id
|
10
|
+
from ..utils.mime import generate_blake2b_hash_from_string
|
11
11
|
from .ai_models import Amount
|
12
12
|
from .inference_settings import InferenceSettings
|
13
13
|
from .mime import MIMEData
|
@@ -6,8 +6,8 @@ from typing import Any, Optional, Self
|
|
6
6
|
import nanoid # type: ignore
|
7
7
|
from pydantic import BaseModel, Field, computed_field, model_validator
|
8
8
|
|
9
|
-
from ...
|
10
|
-
from ...
|
9
|
+
from ...utils.json_schema import clean_schema
|
10
|
+
from ...utils.mime import generate_blake2b_hash_from_string
|
11
11
|
from ..inference_settings import InferenceSettings
|
12
12
|
from ..metrics import MetricResult
|
13
13
|
from ..predictions import PredictionData
|
@@ -5,8 +5,8 @@ from typing import Any, Optional
|
|
5
5
|
import nanoid # type: ignore
|
6
6
|
from pydantic import BaseModel, Field, computed_field
|
7
7
|
|
8
|
-
from ...
|
9
|
-
from ...
|
8
|
+
from ...utils.json_schema import compute_schema_data_id
|
9
|
+
from ...utils.mime import generate_blake2b_hash_from_string
|
10
10
|
from ..inference_settings import InferenceSettings
|
11
11
|
from .documents import EvaluationDocument
|
12
12
|
from .iterations import Iteration
|
@@ -9,7 +9,7 @@ from pydantic import BaseModel, Field, computed_field, model_validator
|
|
9
9
|
from retab.types.chat import ChatCompletionRetabMessage
|
10
10
|
from retab.types.documents.extractions import RetabParsedChatCompletion
|
11
11
|
|
12
|
-
from ..
|
12
|
+
from ..utils.usage.usage import CostBreakdown, compute_cost_from_model, compute_cost_from_model_with_breakdown
|
13
13
|
from .ai_models import Amount
|
14
14
|
from .modalities import Modality
|
15
15
|
|
@@ -7,9 +7,9 @@ from openai.types.chat.chat_completion import ChatCompletion
|
|
7
7
|
from openai.types.chat.chat_completion_reasoning_effort import ChatCompletionReasoningEffort
|
8
8
|
from pydantic import BaseModel, EmailStr, Field, HttpUrl, computed_field, field_validator
|
9
9
|
|
10
|
-
from ..
|
11
|
-
from ..
|
12
|
-
from ..
|
10
|
+
from ..utils.json_schema import compute_schema_data_id
|
11
|
+
from ..utils.mime import generate_blake2b_hash_from_string
|
12
|
+
from ..utils.usage.usage import CostBreakdown, compute_cost_from_model, compute_cost_from_model_with_breakdown
|
13
13
|
from .ai_models import Amount
|
14
14
|
from .documents.extractions import RetabParsedChatCompletion
|
15
15
|
from .mime import BaseMIMEData
|
@@ -10,9 +10,9 @@ from openai.types.chat.chat_completion_message_param import ChatCompletionMessag
|
|
10
10
|
from openai.types.responses.response_input_param import ResponseInputItemParam
|
11
11
|
from pydantic import BaseModel, Field, PrivateAttr, computed_field, model_validator
|
12
12
|
|
13
|
-
from ...
|
14
|
-
from ...
|
15
|
-
from ...
|
13
|
+
from ...utils.chat import convert_to_anthropic_format, convert_to_google_genai_format
|
14
|
+
from ...utils.chat import convert_to_openai_format as convert_to_openai_completions_api_format
|
15
|
+
from ...utils.json_schema import (
|
16
16
|
convert_basemodel_to_partial_basemodel,
|
17
17
|
convert_json_schema_to_basemodel,
|
18
18
|
create_reasoning_schema,
|
@@ -25,7 +25,7 @@ from ..._utils.json_schema import (
|
|
25
25
|
load_json_schema,
|
26
26
|
schema_to_ts_type,
|
27
27
|
)
|
28
|
-
from ...
|
28
|
+
from ...utils.responses import convert_to_openai_format as convert_to_openai_responses_api_format
|
29
29
|
from ...types.standards import StreamingBaseModel
|
30
30
|
from ..chat import ChatCompletionRetabMessage
|
31
31
|
|
@@ -4,7 +4,7 @@ from typing import Any, Literal, Optional
|
|
4
4
|
import nanoid # type: ignore
|
5
5
|
from pydantic import BaseModel, Field, PrivateAttr, computed_field
|
6
6
|
|
7
|
-
from ...
|
7
|
+
from ...utils.json_schema import generate_schema_data_id, generate_schema_id
|
8
8
|
from ...types.mime import MIMEData
|
9
9
|
|
10
10
|
|
@@ -5,7 +5,7 @@ from pydantic import BaseModel, Field
|
|
5
5
|
|
6
6
|
# https://platform.openai.com/docs/guides/prompt-caching
|
7
7
|
from ...types.ai_models import Amount, Pricing
|
8
|
-
from ...
|
8
|
+
from ...utils.ai_models import get_model_card
|
9
9
|
|
10
10
|
# ─── PRICING MODELS ────────────────────────────────────────────────────────────
|
11
11
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: retab
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.41
|
4
4
|
Summary: Retab official python library
|
5
5
|
Home-page: https://github.com/Retab-dev/retab
|
6
6
|
Author: Retab
|
@@ -45,7 +45,7 @@ Requires-Dist: ruff
|
|
45
45
|
|
46
46
|
<div align="center" style="margin-bottom: 1em;">
|
47
47
|
|
48
|
-
<img src="https://raw.githubusercontent.com/Retab/retab/refs/heads/main/assets/retab-logo.png" alt="Retab Logo" width="150">
|
48
|
+
<img src="https://raw.githubusercontent.com/Retab-dev/retab/refs/heads/main/assets/retab-logo.png" alt="Retab Logo" width="150">
|
49
49
|
|
50
50
|
|
51
51
|
*The AI Automation Platform*
|
@@ -95,7 +95,7 @@ You come with your own API key from your favorite AI provider, and we handle the
|
|
95
95
|
We currently support [OpenAI](https://platform.openai.com/docs/overview), [Anthropic](https://www.anthropic.com/api), [Gemini](https://aistudio.google.com/prompts/new_chat) and [xAI](https://x.ai/api) models.
|
96
96
|
|
97
97
|
<p align="center">
|
98
|
-
<img src="https://raw.githubusercontent.com/Retab/retab/refs/heads/main/assets/supported_models.png" alt="Supported Models" width="600">
|
98
|
+
<img src="https://raw.githubusercontent.com/Retab-dev/retab/refs/heads/main/assets/supported_models.png" alt="Supported Models" width="600">
|
99
99
|
</p>
|
100
100
|
|
101
101
|
---
|
@@ -105,7 +105,7 @@ We currently support [OpenAI](https://platform.openai.com/docs/overview), [Anthr
|
|
105
105
|
Explore our [Playground](https://www.retab.dev/dashboard/playground) and create your first automations easily 🚀!
|
106
106
|
|
107
107
|
<p align="center">
|
108
|
-
<img src="https://raw.githubusercontent.com/Retab/retab/refs/heads/main/assets/retab-playground.png" alt="Retab Playground" width="600">
|
108
|
+
<img src="https://raw.githubusercontent.com/Retab-dev/retab/refs/heads/main/assets/retab-playground.png" alt="Retab Playground" width="600">
|
109
109
|
</p>
|
110
110
|
|
111
111
|
---
|
@@ -244,7 +244,7 @@ completion = client.beta.chat.completions.parse(
|
|
244
244
|
print("Extracted data:", completion.choices[0].message.parsed)
|
245
245
|
|
246
246
|
# Validate the response against the original schema if you want to remove the reasoning fields
|
247
|
-
from retab.
|
247
|
+
from retab.utils.json_schema import filter_auxiliary_fields_json
|
248
248
|
assert completion.choices[0].message.content is not None
|
249
249
|
extraction = schema_obj.pydantic_model.model_validate(
|
250
250
|
filter_auxiliary_fields_json(completion.choices[0].message.content, schema_obj.pydantic_model)
|
@@ -10,22 +10,6 @@ retab.egg-info/SOURCES.txt
|
|
10
10
|
retab.egg-info/dependency_links.txt
|
11
11
|
retab.egg-info/requires.txt
|
12
12
|
retab.egg-info/top_level.txt
|
13
|
-
retab/_utils/__init__.py
|
14
|
-
retab/_utils/ai_models.py
|
15
|
-
retab/_utils/benchmarking.py
|
16
|
-
retab/_utils/chat.py
|
17
|
-
retab/_utils/display.py
|
18
|
-
retab/_utils/json_schema.py
|
19
|
-
retab/_utils/mime.py
|
20
|
-
retab/_utils/responses.py
|
21
|
-
retab/_utils/stream_context_managers.py
|
22
|
-
retab/_utils/_model_cards/anthropic.yaml
|
23
|
-
retab/_utils/_model_cards/auto.yaml
|
24
|
-
retab/_utils/_model_cards/gemini.yaml
|
25
|
-
retab/_utils/_model_cards/openai.yaml
|
26
|
-
retab/_utils/_model_cards/xai.yaml
|
27
|
-
retab/_utils/usage/__init__.py
|
28
|
-
retab/_utils/usage/usage.py
|
29
13
|
retab/resources/__init__.py
|
30
14
|
retab/resources/evals.py
|
31
15
|
retab/resources/files.py
|
@@ -115,6 +99,22 @@ retab/types/schemas/object.py
|
|
115
99
|
retab/types/schemas/templates.py
|
116
100
|
retab/types/secrets/__init__.py
|
117
101
|
retab/types/secrets/external_api_keys.py
|
102
|
+
retab/utils/__init__.py
|
103
|
+
retab/utils/ai_models.py
|
104
|
+
retab/utils/benchmarking.py
|
105
|
+
retab/utils/chat.py
|
106
|
+
retab/utils/display.py
|
107
|
+
retab/utils/json_schema.py
|
108
|
+
retab/utils/mime.py
|
109
|
+
retab/utils/responses.py
|
110
|
+
retab/utils/stream_context_managers.py
|
111
|
+
retab/utils/_model_cards/anthropic.yaml
|
112
|
+
retab/utils/_model_cards/auto.yaml
|
113
|
+
retab/utils/_model_cards/gemini.yaml
|
114
|
+
retab/utils/_model_cards/openai.yaml
|
115
|
+
retab/utils/_model_cards/xai.yaml
|
116
|
+
retab/utils/usage/__init__.py
|
117
|
+
retab/utils/usage/usage.py
|
118
118
|
tests/test_automations_links.py
|
119
119
|
tests/test_automations_mailboxes.py
|
120
120
|
tests/test_documents_api.py
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|