synapse-sdk 1.0.0a23__py3-none-any.whl → 2025.12.3__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.
- synapse_sdk/__init__.py +24 -0
- synapse_sdk/cli/__init__.py +310 -5
- synapse_sdk/cli/alias/__init__.py +22 -0
- synapse_sdk/cli/alias/create.py +36 -0
- synapse_sdk/cli/alias/dataclass.py +31 -0
- synapse_sdk/cli/alias/default.py +16 -0
- synapse_sdk/cli/alias/delete.py +15 -0
- synapse_sdk/cli/alias/list.py +19 -0
- synapse_sdk/cli/alias/read.py +15 -0
- synapse_sdk/cli/alias/update.py +17 -0
- synapse_sdk/cli/alias/utils.py +61 -0
- synapse_sdk/cli/code_server.py +687 -0
- synapse_sdk/cli/config.py +440 -0
- synapse_sdk/cli/devtools.py +90 -0
- synapse_sdk/cli/plugin/__init__.py +33 -0
- synapse_sdk/cli/{create_plugin.py → plugin/create.py} +2 -2
- synapse_sdk/{plugins/cli → cli/plugin}/publish.py +23 -15
- synapse_sdk/clients/agent/__init__.py +9 -3
- synapse_sdk/clients/agent/container.py +143 -0
- synapse_sdk/clients/agent/core.py +19 -0
- synapse_sdk/clients/agent/ray.py +298 -9
- synapse_sdk/clients/backend/__init__.py +30 -12
- synapse_sdk/clients/backend/annotation.py +13 -5
- synapse_sdk/clients/backend/core.py +31 -4
- synapse_sdk/clients/backend/data_collection.py +186 -0
- synapse_sdk/clients/backend/hitl.py +17 -0
- synapse_sdk/clients/backend/integration.py +16 -1
- synapse_sdk/clients/backend/ml.py +5 -1
- synapse_sdk/clients/backend/models.py +78 -0
- synapse_sdk/clients/base.py +384 -41
- synapse_sdk/clients/ray/serve.py +2 -0
- synapse_sdk/clients/validators/collections.py +31 -0
- synapse_sdk/devtools/config.py +94 -0
- synapse_sdk/devtools/server.py +41 -0
- synapse_sdk/devtools/streamlit_app/__init__.py +5 -0
- synapse_sdk/devtools/streamlit_app/app.py +128 -0
- synapse_sdk/devtools/streamlit_app/services/__init__.py +11 -0
- synapse_sdk/devtools/streamlit_app/services/job_service.py +233 -0
- synapse_sdk/devtools/streamlit_app/services/plugin_service.py +236 -0
- synapse_sdk/devtools/streamlit_app/services/serve_service.py +95 -0
- synapse_sdk/devtools/streamlit_app/ui/__init__.py +15 -0
- synapse_sdk/devtools/streamlit_app/ui/config_tab.py +76 -0
- synapse_sdk/devtools/streamlit_app/ui/deployment_tab.py +66 -0
- synapse_sdk/devtools/streamlit_app/ui/http_tab.py +125 -0
- synapse_sdk/devtools/streamlit_app/ui/jobs_tab.py +573 -0
- synapse_sdk/devtools/streamlit_app/ui/serve_tab.py +346 -0
- synapse_sdk/devtools/streamlit_app/ui/status_bar.py +118 -0
- synapse_sdk/devtools/streamlit_app/utils/__init__.py +40 -0
- synapse_sdk/devtools/streamlit_app/utils/json_viewer.py +197 -0
- synapse_sdk/devtools/streamlit_app/utils/log_formatter.py +38 -0
- synapse_sdk/devtools/streamlit_app/utils/styles.py +241 -0
- synapse_sdk/devtools/streamlit_app/utils/ui_components.py +289 -0
- synapse_sdk/devtools/streamlit_app.py +10 -0
- synapse_sdk/loggers.py +120 -9
- synapse_sdk/plugins/README.md +1340 -0
- synapse_sdk/plugins/__init__.py +0 -13
- synapse_sdk/plugins/categories/base.py +117 -11
- synapse_sdk/plugins/categories/data_validation/actions/validation.py +72 -0
- synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +33 -5
- synapse_sdk/plugins/categories/export/actions/__init__.py +3 -0
- synapse_sdk/plugins/categories/export/actions/export/__init__.py +28 -0
- synapse_sdk/plugins/categories/export/actions/export/action.py +165 -0
- synapse_sdk/plugins/categories/export/actions/export/enums.py +113 -0
- synapse_sdk/plugins/categories/export/actions/export/exceptions.py +53 -0
- synapse_sdk/plugins/categories/export/actions/export/models.py +74 -0
- synapse_sdk/plugins/categories/export/actions/export/run.py +195 -0
- synapse_sdk/plugins/categories/export/actions/export/utils.py +187 -0
- synapse_sdk/plugins/categories/export/templates/config.yaml +21 -0
- synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +390 -0
- synapse_sdk/plugins/categories/export/templates/plugin/export.py +160 -0
- synapse_sdk/plugins/categories/neural_net/actions/deployment.py +13 -12
- synapse_sdk/plugins/categories/neural_net/actions/train.py +1134 -31
- synapse_sdk/plugins/categories/neural_net/actions/tune.py +534 -0
- synapse_sdk/plugins/categories/neural_net/base/inference.py +1 -1
- synapse_sdk/plugins/categories/neural_net/templates/config.yaml +32 -4
- synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +26 -10
- synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +4 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/__init__.py +3 -0
- synapse_sdk/plugins/categories/{export/actions/export.py → pre_annotation/actions/pre_annotation/action.py} +4 -4
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/__init__.py +28 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/action.py +148 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/enums.py +269 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/exceptions.py +14 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/factory.py +76 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/models.py +100 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/orchestrator.py +248 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/run.py +64 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/__init__.py +17 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/annotation.py +265 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/base.py +170 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/extraction.py +83 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/metrics.py +92 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/preprocessor.py +243 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/validation.py +143 -0
- synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +19 -0
- synapse_sdk/plugins/categories/pre_annotation/templates/plugin/to_task.py +40 -0
- synapse_sdk/plugins/categories/smart_tool/templates/config.yaml +2 -0
- synapse_sdk/plugins/categories/upload/__init__.py +0 -0
- synapse_sdk/plugins/categories/upload/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/upload/actions/upload/__init__.py +19 -0
- synapse_sdk/plugins/categories/upload/actions/upload/action.py +236 -0
- synapse_sdk/plugins/categories/upload/actions/upload/context.py +185 -0
- synapse_sdk/plugins/categories/upload/actions/upload/enums.py +493 -0
- synapse_sdk/plugins/categories/upload/actions/upload/exceptions.py +36 -0
- synapse_sdk/plugins/categories/upload/actions/upload/factory.py +138 -0
- synapse_sdk/plugins/categories/upload/actions/upload/models.py +214 -0
- synapse_sdk/plugins/categories/upload/actions/upload/orchestrator.py +183 -0
- synapse_sdk/plugins/categories/upload/actions/upload/registry.py +113 -0
- synapse_sdk/plugins/categories/upload/actions/upload/run.py +179 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/base.py +107 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/cleanup.py +62 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/collection.py +63 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/generate.py +91 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/initialize.py +82 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/metadata.py +235 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/organize.py +201 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/upload.py +104 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/validate.py +71 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/base.py +82 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/batch.py +39 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/single.py +29 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/flat.py +300 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/recursive.py +287 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/excel.py +174 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/none.py +16 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/sync.py +84 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/default.py +60 -0
- synapse_sdk/plugins/categories/upload/actions/upload/utils.py +250 -0
- synapse_sdk/plugins/categories/upload/templates/README.md +470 -0
- synapse_sdk/plugins/categories/upload/templates/config.yaml +33 -0
- synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +310 -0
- synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +102 -0
- synapse_sdk/plugins/enums.py +3 -1
- synapse_sdk/plugins/models.py +148 -11
- synapse_sdk/plugins/templates/plugin-config-schema.json +406 -0
- synapse_sdk/plugins/templates/schema.json +491 -0
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/config.yaml +1 -0
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +1 -1
- synapse_sdk/plugins/utils/__init__.py +46 -0
- synapse_sdk/plugins/utils/actions.py +119 -0
- synapse_sdk/plugins/utils/config.py +203 -0
- synapse_sdk/plugins/{utils.py → utils/legacy.py} +26 -46
- synapse_sdk/plugins/utils/ray_gcs.py +66 -0
- synapse_sdk/plugins/utils/registry.py +58 -0
- synapse_sdk/shared/__init__.py +25 -0
- synapse_sdk/shared/enums.py +93 -0
- synapse_sdk/types.py +19 -0
- synapse_sdk/utils/converters/__init__.py +240 -0
- synapse_sdk/utils/converters/coco/__init__.py +0 -0
- synapse_sdk/utils/converters/coco/from_dm.py +322 -0
- synapse_sdk/utils/converters/coco/to_dm.py +215 -0
- synapse_sdk/utils/converters/dm/__init__.py +57 -0
- synapse_sdk/utils/converters/dm/base.py +137 -0
- synapse_sdk/utils/converters/dm/from_v1.py +273 -0
- synapse_sdk/utils/converters/dm/to_v1.py +321 -0
- synapse_sdk/utils/converters/dm/tools/__init__.py +214 -0
- synapse_sdk/utils/converters/dm/tools/answer.py +95 -0
- synapse_sdk/utils/converters/dm/tools/bounding_box.py +132 -0
- synapse_sdk/utils/converters/dm/tools/bounding_box_3d.py +121 -0
- synapse_sdk/utils/converters/dm/tools/classification.py +75 -0
- synapse_sdk/utils/converters/dm/tools/keypoint.py +117 -0
- synapse_sdk/utils/converters/dm/tools/named_entity.py +111 -0
- synapse_sdk/utils/converters/dm/tools/polygon.py +122 -0
- synapse_sdk/utils/converters/dm/tools/polyline.py +124 -0
- synapse_sdk/utils/converters/dm/tools/prompt.py +94 -0
- synapse_sdk/utils/converters/dm/tools/relation.py +86 -0
- synapse_sdk/utils/converters/dm/tools/segmentation.py +141 -0
- synapse_sdk/utils/converters/dm/tools/segmentation_3d.py +83 -0
- synapse_sdk/utils/converters/dm/types.py +168 -0
- synapse_sdk/utils/converters/dm/utils.py +162 -0
- synapse_sdk/utils/converters/dm_legacy/__init__.py +56 -0
- synapse_sdk/utils/converters/dm_legacy/from_v1.py +627 -0
- synapse_sdk/utils/converters/dm_legacy/to_v1.py +367 -0
- synapse_sdk/utils/converters/pascal/__init__.py +0 -0
- synapse_sdk/utils/converters/pascal/from_dm.py +244 -0
- synapse_sdk/utils/converters/pascal/to_dm.py +214 -0
- synapse_sdk/utils/converters/yolo/__init__.py +0 -0
- synapse_sdk/utils/converters/yolo/from_dm.py +384 -0
- synapse_sdk/utils/converters/yolo/to_dm.py +267 -0
- synapse_sdk/utils/dataset.py +46 -0
- synapse_sdk/utils/encryption.py +158 -0
- synapse_sdk/utils/file/__init__.py +58 -0
- synapse_sdk/utils/file/archive.py +32 -0
- synapse_sdk/utils/file/checksum.py +56 -0
- synapse_sdk/utils/file/chunking.py +31 -0
- synapse_sdk/utils/file/download.py +385 -0
- synapse_sdk/utils/file/encoding.py +40 -0
- synapse_sdk/utils/file/io.py +22 -0
- synapse_sdk/utils/file/upload.py +165 -0
- synapse_sdk/utils/file/video/__init__.py +29 -0
- synapse_sdk/utils/file/video/transcode.py +307 -0
- synapse_sdk/utils/file.py.backup +301 -0
- synapse_sdk/utils/http.py +138 -0
- synapse_sdk/utils/network.py +309 -0
- synapse_sdk/utils/storage/__init__.py +72 -0
- synapse_sdk/utils/storage/providers/__init__.py +183 -0
- synapse_sdk/utils/storage/providers/file_system.py +134 -0
- synapse_sdk/utils/storage/providers/gcp.py +13 -0
- synapse_sdk/utils/storage/providers/http.py +190 -0
- synapse_sdk/utils/storage/providers/s3.py +91 -0
- synapse_sdk/utils/storage/providers/sftp.py +47 -0
- synapse_sdk/utils/storage/registry.py +17 -0
- synapse_sdk-2025.12.3.dist-info/METADATA +123 -0
- synapse_sdk-2025.12.3.dist-info/RECORD +279 -0
- {synapse_sdk-1.0.0a23.dist-info → synapse_sdk-2025.12.3.dist-info}/WHEEL +1 -1
- synapse_sdk/clients/backend/dataset.py +0 -51
- synapse_sdk/plugins/categories/import/actions/import.py +0 -10
- synapse_sdk/plugins/cli/__init__.py +0 -21
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env +0 -24
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env.dist +0 -24
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/main.py +0 -4
- synapse_sdk/utils/file.py +0 -168
- synapse_sdk/utils/storage.py +0 -91
- synapse_sdk-1.0.0a23.dist-info/METADATA +0 -44
- synapse_sdk-1.0.0a23.dist-info/RECORD +0 -114
- /synapse_sdk/{plugins/cli → cli/plugin}/run.py +0 -0
- /synapse_sdk/{plugins/categories/import → clients/validators}/__init__.py +0 -0
- /synapse_sdk/{plugins/categories/import/actions → devtools}/__init__.py +0 -0
- {synapse_sdk-1.0.0a23.dist-info → synapse_sdk-2025.12.3.dist-info}/entry_points.txt +0 -0
- {synapse_sdk-1.0.0a23.dist-info → synapse_sdk-2025.12.3.dist-info/licenses}/LICENSE +0 -0
- {synapse_sdk-1.0.0a23.dist-info → synapse_sdk-2025.12.3.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
from multiprocessing import Pool
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from typing import Dict, Optional, Union
|
|
4
|
+
|
|
5
|
+
from tqdm import tqdm
|
|
6
|
+
|
|
7
|
+
from synapse_sdk.clients.base import BaseClient
|
|
8
|
+
from synapse_sdk.clients.utils import get_batched_list, get_default_url_conversion
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class DataCollectionClientMixin(BaseClient):
|
|
12
|
+
"""Mixin class for data collection operations.
|
|
13
|
+
|
|
14
|
+
Provides methods for managing data collections, files, and units
|
|
15
|
+
in the Synapse backend. Supports both regular file uploads and
|
|
16
|
+
chunked uploads for large files.
|
|
17
|
+
|
|
18
|
+
This mixin extends BaseClient with data collection-specific functionality
|
|
19
|
+
including file upload capabilities, data unit management, and batch processing
|
|
20
|
+
operations for efficient data collection workflows.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def list_data_collection(self):
|
|
24
|
+
path = 'data_collections/'
|
|
25
|
+
return self._list(path)
|
|
26
|
+
|
|
27
|
+
def get_data_collection(self, data_collection_id):
|
|
28
|
+
"""Get data_collection from synapse-backend.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
data_collection_id: The data_collection id to get.
|
|
32
|
+
"""
|
|
33
|
+
path = f'data_collections/{data_collection_id}/?expand=file_specifications'
|
|
34
|
+
return self._get(path)
|
|
35
|
+
|
|
36
|
+
def create_data_file(
|
|
37
|
+
self, file_path: Path, use_chunked_upload: bool = False
|
|
38
|
+
) -> Union[Dict[str, Union[str, int]], str]:
|
|
39
|
+
"""Create and upload a data file to the Synapse backend.
|
|
40
|
+
|
|
41
|
+
This method supports two upload strategies:
|
|
42
|
+
1. Direct file upload for smaller files (default)
|
|
43
|
+
2. Chunked upload for large files (automatic when flag is enabled)
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
file_path: Path object pointing to the file to upload.
|
|
47
|
+
Must be a valid file path that exists on the filesystem.
|
|
48
|
+
use_chunked_upload: Boolean flag to enable chunked upload for the file.
|
|
49
|
+
When True, automatically creates a chunked upload for the file
|
|
50
|
+
instead of uploading it directly. Defaults to False.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
Dictionary containing the created data file information including:
|
|
54
|
+
- id: The unique identifier of the created data file
|
|
55
|
+
- checksum: The MD5 checksum of the uploaded file
|
|
56
|
+
- size: The file size in bytes
|
|
57
|
+
- created_at: Timestamp of creation
|
|
58
|
+
- Additional metadata fields from the backend
|
|
59
|
+
Or a string response in case of non-JSON response.
|
|
60
|
+
|
|
61
|
+
Raises:
|
|
62
|
+
FileNotFoundError: If the specified file doesn't exist (for direct upload)
|
|
63
|
+
PermissionError: If the file can't be read due to permissions
|
|
64
|
+
ClientError: If the backend returns an error response
|
|
65
|
+
ValueError: If file_path is not a valid Path object
|
|
66
|
+
|
|
67
|
+
Examples:
|
|
68
|
+
Direct file upload for small files:
|
|
69
|
+
```python
|
|
70
|
+
client = DataCollectionClientMixin(base_url='https://api.example.com')
|
|
71
|
+
file_path = Path('/path/to/small_file.csv')
|
|
72
|
+
result = client.create_data_file(file_path)
|
|
73
|
+
print(f"File uploaded with ID: {result['id']}")
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Using chunked upload for large files:
|
|
77
|
+
```python
|
|
78
|
+
# Automatically create chunked upload for large file
|
|
79
|
+
file_path = Path('/path/to/large_file.zip')
|
|
80
|
+
result = client.create_data_file(file_path, use_chunked_upload=True)
|
|
81
|
+
print(f"Large file uploaded with ID: {result['id']}")
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Note:
|
|
85
|
+
- For files larger than 100MB, consider using chunked upload
|
|
86
|
+
- The chunked upload will be automatically created when the flag is enabled
|
|
87
|
+
- Chunked uploads provide better reliability for large files
|
|
88
|
+
"""
|
|
89
|
+
path = 'data_files/'
|
|
90
|
+
if use_chunked_upload:
|
|
91
|
+
chunked_upload = self.create_chunked_upload(file_path)
|
|
92
|
+
data = {'chunked_upload': chunked_upload['id'], 'meta': {'filename': file_path.name}}
|
|
93
|
+
return self._post(path, data=data)
|
|
94
|
+
else:
|
|
95
|
+
return self._post(path, files={'file': file_path})
|
|
96
|
+
|
|
97
|
+
def get_data_unit(self, data_unit_id: int, params=None):
|
|
98
|
+
path = f'data_units/{data_unit_id}/'
|
|
99
|
+
return self._get(path, params=params)
|
|
100
|
+
|
|
101
|
+
def create_data_units(self, data):
|
|
102
|
+
"""Create data units to synapse-backend.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
data: The data bindings to upload from create_data_file interface.
|
|
106
|
+
"""
|
|
107
|
+
path = 'data_units/'
|
|
108
|
+
return self._post(path, data=data)
|
|
109
|
+
|
|
110
|
+
def list_data_units(self, params=None, url_conversion=None, list_all=False):
|
|
111
|
+
path = 'data_units/'
|
|
112
|
+
url_conversion = get_default_url_conversion(url_conversion, files_fields=['files'])
|
|
113
|
+
return self._list(path, params=params, url_conversion=url_conversion, list_all=list_all)
|
|
114
|
+
|
|
115
|
+
def data_files_verify_checksums(self, checksums: list[str]):
|
|
116
|
+
"""Check checksums from files are exists.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
checksums: A list of MD5 checksums to verify.
|
|
120
|
+
"""
|
|
121
|
+
path = 'data_files/verify_checksums/'
|
|
122
|
+
data = {'checksums': checksums}
|
|
123
|
+
return self._post(path, data=data)
|
|
124
|
+
|
|
125
|
+
def upload_data_collection(
|
|
126
|
+
self,
|
|
127
|
+
data_collection_id: int,
|
|
128
|
+
data_collection: Dict,
|
|
129
|
+
project_id: Optional[int] = None,
|
|
130
|
+
batch_size: int = 1000,
|
|
131
|
+
process_pool: int = 10,
|
|
132
|
+
):
|
|
133
|
+
"""Upload data_collection to synapse-backend.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
data_collection_id: The data_collection id to upload the data to.
|
|
137
|
+
data_collection: The data_collection to upload.
|
|
138
|
+
* structure:
|
|
139
|
+
- files: The files to upload. (key: file name, value: file pathlib object)
|
|
140
|
+
- meta: The meta data to upload.
|
|
141
|
+
project_id: The project id to upload the data to.
|
|
142
|
+
batch_size: The batch size to upload the data.
|
|
143
|
+
process_pool: The process pool to upload the data.
|
|
144
|
+
"""
|
|
145
|
+
# TODO validate data_collection with schema
|
|
146
|
+
|
|
147
|
+
params = [(data, data_collection_id) for data in data_collection]
|
|
148
|
+
|
|
149
|
+
with Pool(processes=process_pool) as pool:
|
|
150
|
+
data_collection = pool.starmap(self.upload_data_file, tqdm(params))
|
|
151
|
+
|
|
152
|
+
batches = get_batched_list(data_collection, batch_size)
|
|
153
|
+
|
|
154
|
+
for batch in tqdm(batches):
|
|
155
|
+
data_units = self.create_data_units(batch)
|
|
156
|
+
|
|
157
|
+
if project_id:
|
|
158
|
+
tasks_data = []
|
|
159
|
+
for data, data_unit in zip(batch, data_units):
|
|
160
|
+
task_data = {'project': project_id, 'data_unit': data_unit['id']}
|
|
161
|
+
# TODO: Additional logic needed here if task data storage is required during import.
|
|
162
|
+
|
|
163
|
+
tasks_data.append(task_data)
|
|
164
|
+
|
|
165
|
+
self.create_tasks(tasks_data)
|
|
166
|
+
|
|
167
|
+
def upload_data_file(self, data: Dict, data_collection_id: int, use_chunked_upload: bool = False) -> Dict:
|
|
168
|
+
"""Upload files to synapse-backend.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
data: The data to upload.
|
|
172
|
+
* structure:
|
|
173
|
+
- files: The files to upload. (key: file name, value: file pathlib object)
|
|
174
|
+
- meta: The meta data to upload.
|
|
175
|
+
data_collection_id: The data_collection id to upload the data to.
|
|
176
|
+
use_chunked_upload: Whether to use chunked upload for large files.(default False)
|
|
177
|
+
Automatically determined based on file size threshold in upload plugin (default 50MB).
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
Dict: The result of the upload.
|
|
181
|
+
"""
|
|
182
|
+
for name, path in data['files'].items():
|
|
183
|
+
data_file = self.create_data_file(path, use_chunked_upload)
|
|
184
|
+
data['data_collection'] = data_collection_id
|
|
185
|
+
data['files'][name] = {'checksum': data_file['checksum'], 'path': str(path)}
|
|
186
|
+
return data
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from synapse_sdk.clients.base import BaseClient
|
|
2
|
+
from synapse_sdk.clients.utils import get_default_url_conversion
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class HITLClientMixin(BaseClient):
|
|
6
|
+
def get_assignment(self, pk):
|
|
7
|
+
path = f'assignments/{pk}/'
|
|
8
|
+
return self._get(path)
|
|
9
|
+
|
|
10
|
+
def list_assignments(self, params=None, url_conversion=None, list_all=False):
|
|
11
|
+
path = 'sdk/assignments/'
|
|
12
|
+
url_conversion = get_default_url_conversion(url_conversion, files_fields=['files'])
|
|
13
|
+
return self._list(path, params=params, url_conversion=url_conversion, list_all=list_all)
|
|
14
|
+
|
|
15
|
+
def set_tags_assignments(self, data, params=None):
|
|
16
|
+
path = 'assignments/set_tags/'
|
|
17
|
+
return self._post(path, payload=data, params=params)
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
from synapse_sdk.clients.backend.models import Storage, UpdateJob
|
|
1
2
|
from synapse_sdk.clients.base import BaseClient
|
|
3
|
+
from synapse_sdk.utils.file import convert_file_to_base64
|
|
2
4
|
|
|
3
5
|
|
|
4
6
|
class IntegrationClientMixin(BaseClient):
|
|
@@ -41,7 +43,7 @@ class IntegrationClientMixin(BaseClient):
|
|
|
41
43
|
|
|
42
44
|
def update_job(self, pk, data):
|
|
43
45
|
path = f'jobs/{pk}/'
|
|
44
|
-
return self._patch(path, data=data)
|
|
46
|
+
return self._patch(path, request_model=UpdateJob, data=data)
|
|
45
47
|
|
|
46
48
|
def list_job_console_logs(self, pk):
|
|
47
49
|
path = f'jobs/{pk}/console_logs/'
|
|
@@ -60,6 +62,13 @@ class IntegrationClientMixin(BaseClient):
|
|
|
60
62
|
|
|
61
63
|
def create_logs(self, data):
|
|
62
64
|
path = 'logs/'
|
|
65
|
+
if not isinstance(data, list):
|
|
66
|
+
data = [data]
|
|
67
|
+
|
|
68
|
+
for item in data:
|
|
69
|
+
if 'file' in item:
|
|
70
|
+
item['file'] = convert_file_to_base64(item['file'])
|
|
71
|
+
|
|
63
72
|
return self._post(path, data=data)
|
|
64
73
|
|
|
65
74
|
def create_serve_application(self, data):
|
|
@@ -69,3 +78,9 @@ class IntegrationClientMixin(BaseClient):
|
|
|
69
78
|
def list_serve_applications(self, params=None, list_all=False):
|
|
70
79
|
path = 'serve_applications/'
|
|
71
80
|
return self._list(path, params=params, list_all=list_all)
|
|
81
|
+
|
|
82
|
+
def get_storage(self, pk):
|
|
83
|
+
"""Get specific storage data from synapse backend."""
|
|
84
|
+
path = f'storages/{pk}/'
|
|
85
|
+
params = {'with_configuration': True}
|
|
86
|
+
return self._get(path, params=params, response_model=Storage)
|
|
@@ -19,6 +19,10 @@ class MLClientMixin(BaseClient):
|
|
|
19
19
|
return self._post(path, data=data)
|
|
20
20
|
|
|
21
21
|
def list_ground_truth_events(self, params=None, url_conversion=None, list_all=False):
|
|
22
|
-
path = 'ground_truth_events/'
|
|
22
|
+
path = 'sdk/ground_truth_events/'
|
|
23
23
|
url_conversion = get_default_url_conversion(url_conversion, files_fields=['files'])
|
|
24
24
|
return self._list(path, params=params, url_conversion=url_conversion, list_all=list_all)
|
|
25
|
+
|
|
26
|
+
def get_ground_truth_version(self, pk):
|
|
27
|
+
path = f'ground_truth_dataset_versions/{pk}/'
|
|
28
|
+
return self._get(path)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from typing import Dict, Optional
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class StorageCategory(str, Enum):
|
|
8
|
+
"""Synapse Backend Storage Category Enum."""
|
|
9
|
+
|
|
10
|
+
INTERNAL = 'internal'
|
|
11
|
+
EXTERNAL = 'external'
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class StorageProvider(str, Enum):
|
|
15
|
+
"""Synapse Backend Storage Provider Enum."""
|
|
16
|
+
|
|
17
|
+
AMAZON_S3 = 'amazon_s3'
|
|
18
|
+
AZURE = 'azure'
|
|
19
|
+
DIGITAL_OCEAN = 'digital_ocean'
|
|
20
|
+
FILE_SYSTEM = 'file_system'
|
|
21
|
+
FTP = 'ftp'
|
|
22
|
+
SFTP = 'sftp'
|
|
23
|
+
MINIO = 'minio'
|
|
24
|
+
GCP = 'gcp'
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class Storage(BaseModel):
|
|
28
|
+
"""Synapse Backend Storage Model.
|
|
29
|
+
|
|
30
|
+
Attrs:
|
|
31
|
+
id (int): The storage pk.
|
|
32
|
+
name (str): The storage name.
|
|
33
|
+
category (str): The storage category. (ex: internal, external)
|
|
34
|
+
provider (str): The storage provider. (ex: s3, gcp)
|
|
35
|
+
configuration (Dict): The storage configuration.
|
|
36
|
+
is_default (bool): The storage is default for Synapse backend workspace.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
id: int
|
|
40
|
+
name: str
|
|
41
|
+
category: StorageCategory
|
|
42
|
+
provider: StorageProvider
|
|
43
|
+
configuration: Dict
|
|
44
|
+
is_default: bool
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class JobStatus(str, Enum):
|
|
48
|
+
"""Synapse Backend Job Status Enum."""
|
|
49
|
+
|
|
50
|
+
PENDING = 'pending'
|
|
51
|
+
RUNNING = 'running'
|
|
52
|
+
STOPPED = 'stopped'
|
|
53
|
+
SUCCEEDED = 'succeeded'
|
|
54
|
+
FAILED = 'failed'
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class UpdateJob(BaseModel):
|
|
58
|
+
"""Synapse Backend Update Job Request Payload Model.
|
|
59
|
+
|
|
60
|
+
Attrs:
|
|
61
|
+
status (str): The job status. (ex: pending, running, stopped, succeeded, failed)
|
|
62
|
+
progress_record (Dict): The job progress record.
|
|
63
|
+
metrics_record (Dict): The job metrics record.
|
|
64
|
+
console_logs (Dict): The job console logs.
|
|
65
|
+
result (Dict): The job result.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
status: Optional[JobStatus] = None
|
|
69
|
+
progress_record: Optional[Dict] = None
|
|
70
|
+
metrics_record: Optional[Dict] = None
|
|
71
|
+
console_logs: Optional[Dict | list] = None
|
|
72
|
+
result: Optional[Dict | list] = None
|
|
73
|
+
|
|
74
|
+
def model_dump(self, **kwargs):
|
|
75
|
+
data = super().model_dump(**kwargs)
|
|
76
|
+
if data.get('status') is not None:
|
|
77
|
+
data['status'] = data['status'].value
|
|
78
|
+
return data
|