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,162 @@
|
|
|
1
|
+
"""
|
|
2
|
+
DM Schema V1/V2 Converter Utility Functions
|
|
3
|
+
|
|
4
|
+
Created: 2025-12-11
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import random
|
|
8
|
+
import string
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from .types import MEDIA_TYPE_MAP, MEDIA_TYPE_REVERSE_MAP
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def generate_random_id(length: int = 10) -> str:
|
|
15
|
+
"""Generate a random ID compatible with V1 format
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
length: ID length (default: 10)
|
|
19
|
+
|
|
20
|
+
Returns:
|
|
21
|
+
Random alphanumeric string
|
|
22
|
+
|
|
23
|
+
Example:
|
|
24
|
+
>>> generate_random_id()
|
|
25
|
+
'Cd1qfFQFI4'
|
|
26
|
+
"""
|
|
27
|
+
chars = string.ascii_letters + string.digits
|
|
28
|
+
return ''.join(random.choice(chars) for _ in range(length))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def extract_media_type_info(media_id: str) -> tuple[str, str]:
|
|
32
|
+
"""Extract type information from media ID
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
media_id: Media ID (e.g., 'image_1', 'video_2')
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
(singular, plural) tuple (e.g., ('image', 'images'))
|
|
39
|
+
|
|
40
|
+
Raises:
|
|
41
|
+
ValueError: Unknown media type
|
|
42
|
+
|
|
43
|
+
Example:
|
|
44
|
+
>>> extract_media_type_info('image_1')
|
|
45
|
+
('image', 'images')
|
|
46
|
+
>>> extract_media_type_info('video_2')
|
|
47
|
+
('video', 'videos')
|
|
48
|
+
"""
|
|
49
|
+
# Extract type from media ID (e.g., 'image_1' -> 'image')
|
|
50
|
+
for media_type in MEDIA_TYPE_MAP:
|
|
51
|
+
if media_id.startswith(media_type):
|
|
52
|
+
return media_type, MEDIA_TYPE_MAP[media_type]
|
|
53
|
+
|
|
54
|
+
raise ValueError(f'Unknown media type: {media_id}')
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def detect_file_type(data: dict[str, Any], is_v2: bool = False) -> str:
|
|
58
|
+
"""Auto-detect file type from data
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
data: Input data (V1 or V2)
|
|
62
|
+
is_v2: Whether the format is V2
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
Detected file type ('image', 'video', etc.)
|
|
66
|
+
|
|
67
|
+
Raises:
|
|
68
|
+
ValueError: Unable to detect file type
|
|
69
|
+
"""
|
|
70
|
+
if is_v2:
|
|
71
|
+
# Detect from V2 data (annotation_data or direct data)
|
|
72
|
+
check_data = data.get('annotation_data', data)
|
|
73
|
+
for plural_type in MEDIA_TYPE_REVERSE_MAP:
|
|
74
|
+
if plural_type in check_data and check_data[plural_type]:
|
|
75
|
+
return MEDIA_TYPE_REVERSE_MAP[plural_type]
|
|
76
|
+
else:
|
|
77
|
+
# Detect from V1 data (from annotations or annotationsData keys)
|
|
78
|
+
for key in ['annotations', 'annotationsData']:
|
|
79
|
+
if key in data and data[key]:
|
|
80
|
+
# Extract type from first media ID
|
|
81
|
+
first_media_id = next(iter(data[key].keys()), None)
|
|
82
|
+
if first_media_id:
|
|
83
|
+
singular, _ = extract_media_type_info(first_media_id)
|
|
84
|
+
return singular
|
|
85
|
+
|
|
86
|
+
raise ValueError('Unable to detect file type')
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def get_attr_value(attrs: list[dict[str, Any]], name: str, default: Any = None) -> Any:
|
|
90
|
+
"""Extract value for a specific name from attrs list
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
attrs: V2 attrs list [{"name": "...", "value": ...}, ...]
|
|
94
|
+
name: Attribute name to find
|
|
95
|
+
default: Default value (if not found)
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
Found value or default
|
|
99
|
+
"""
|
|
100
|
+
for attr in attrs:
|
|
101
|
+
if attr.get('name') == name:
|
|
102
|
+
return attr.get('value', default)
|
|
103
|
+
return default
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def set_attr_value(attrs: list[dict[str, Any]], name: str, value: Any) -> list[dict[str, Any]]:
|
|
107
|
+
"""Add or update attribute in attrs list
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
attrs: V2 attrs list
|
|
111
|
+
name: Attribute name
|
|
112
|
+
value: Attribute value
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
Updated attrs list
|
|
116
|
+
"""
|
|
117
|
+
# Update existing attribute
|
|
118
|
+
for attr in attrs:
|
|
119
|
+
if attr.get('name') == name:
|
|
120
|
+
attr['value'] = value
|
|
121
|
+
return attrs
|
|
122
|
+
|
|
123
|
+
# Add new attribute
|
|
124
|
+
attrs.append({'name': name, 'value': value})
|
|
125
|
+
return attrs
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def build_v1_annotation_base(
|
|
129
|
+
annotation_id: str,
|
|
130
|
+
tool: str,
|
|
131
|
+
classification: dict[str, Any] | None = None,
|
|
132
|
+
is_locked: bool = False,
|
|
133
|
+
is_visible: bool = True,
|
|
134
|
+
is_valid: bool = False,
|
|
135
|
+
is_draw_completed: bool = True,
|
|
136
|
+
label: list[str] | None = None,
|
|
137
|
+
) -> dict[str, Any]:
|
|
138
|
+
"""Create V1 AnnotationBase object
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
annotation_id: Annotation ID
|
|
142
|
+
tool: Tool code
|
|
143
|
+
classification: Classification info
|
|
144
|
+
is_locked: Edit lock
|
|
145
|
+
is_visible: Display visibility
|
|
146
|
+
is_valid: Validity
|
|
147
|
+
is_draw_completed: Drawing completed
|
|
148
|
+
label: Label array
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
V1 AnnotationBase dictionary
|
|
152
|
+
"""
|
|
153
|
+
return {
|
|
154
|
+
'id': annotation_id,
|
|
155
|
+
'tool': tool,
|
|
156
|
+
'isLocked': is_locked,
|
|
157
|
+
'isVisible': is_visible,
|
|
158
|
+
'isValid': is_valid,
|
|
159
|
+
'isDrawCompleted': is_draw_completed,
|
|
160
|
+
'classification': classification,
|
|
161
|
+
'label': label or [],
|
|
162
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
|
|
3
|
+
from synapse_sdk.shared.enums import SupportedTools
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class BaseDMConverter(ABC):
|
|
7
|
+
"""Base class for DM format converters."""
|
|
8
|
+
|
|
9
|
+
SUPPORTED_TOOLS = SupportedTools.get_all_values()
|
|
10
|
+
|
|
11
|
+
def __init__(self, file_type=None):
|
|
12
|
+
"""Initialize the base converter.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
file_type (str, optional): Type of file being converted (image, video, pcd, text, audio)
|
|
16
|
+
"""
|
|
17
|
+
self.file_type = file_type
|
|
18
|
+
self.tool_processors = self._setup_tool_processors()
|
|
19
|
+
|
|
20
|
+
def _setup_tool_processors(self):
|
|
21
|
+
"""Setup tool processor mapping dynamically based on file_type."""
|
|
22
|
+
if not self.file_type:
|
|
23
|
+
return {}
|
|
24
|
+
|
|
25
|
+
processors = {}
|
|
26
|
+
tools = SupportedTools.get_tools_for_file_type(self.file_type)
|
|
27
|
+
|
|
28
|
+
for tool in tools:
|
|
29
|
+
# For other tools, use generic method names
|
|
30
|
+
method_name = f'_convert_{tool.method_name}'
|
|
31
|
+
|
|
32
|
+
if hasattr(self, method_name):
|
|
33
|
+
processors[tool.annotation_tool] = getattr(self, method_name)
|
|
34
|
+
|
|
35
|
+
return processors
|
|
36
|
+
|
|
37
|
+
@abstractmethod
|
|
38
|
+
def convert(self):
|
|
39
|
+
"""Convert data from one format to another."""
|
|
40
|
+
|
|
41
|
+
def _handle_unknown_tool(self, tool_type, item_id=None):
|
|
42
|
+
"""Handle unknown tool types with consistent warning message."""
|
|
43
|
+
warning_msg = f"Warning: Unknown tool type '{tool_type}'"
|
|
44
|
+
if item_id:
|
|
45
|
+
warning_msg += f' for item {item_id}'
|
|
46
|
+
print(warning_msg)
|
|
47
|
+
|
|
48
|
+
def _extract_media_type_info(self, media_id):
|
|
49
|
+
"""Extract media type information from media ID."""
|
|
50
|
+
media_type = media_id.split('_')[0] if '_' in media_id else media_id
|
|
51
|
+
media_type_plural = media_type + 's' if not media_type.endswith('s') else media_type
|
|
52
|
+
return media_type, media_type_plural
|
|
53
|
+
|
|
54
|
+
def _singularize_media_type(self, media_type_plural):
|
|
55
|
+
"""Convert plural media type to singular."""
|
|
56
|
+
return media_type_plural.rstrip('s')
|