synapse-sdk 1.0.0b5__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/code_server.py +305 -33
- synapse_sdk/clients/agent/__init__.py +2 -1
- synapse_sdk/clients/agent/container.py +143 -0
- synapse_sdk/clients/agent/ray.py +296 -38
- synapse_sdk/clients/backend/annotation.py +1 -1
- synapse_sdk/clients/backend/core.py +31 -4
- synapse_sdk/clients/backend/data_collection.py +82 -7
- synapse_sdk/clients/backend/hitl.py +1 -1
- synapse_sdk/clients/backend/ml.py +1 -1
- synapse_sdk/clients/base.py +211 -61
- synapse_sdk/loggers.py +46 -0
- synapse_sdk/plugins/README.md +1340 -0
- synapse_sdk/plugins/categories/base.py +59 -9
- 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 +19 -1
- synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +390 -0
- synapse_sdk/plugins/categories/export/templates/plugin/export.py +153 -177
- synapse_sdk/plugins/categories/neural_net/actions/train.py +1130 -32
- synapse_sdk/plugins/categories/neural_net/actions/tune.py +157 -4
- synapse_sdk/plugins/categories/neural_net/templates/config.yaml +7 -4
- 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/pre_annotation/actions/pre_annotation/action.py +10 -0
- 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/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 +28 -2
- synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +310 -0
- synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +82 -20
- synapse_sdk/plugins/models.py +111 -9
- synapse_sdk/plugins/templates/plugin-config-schema.json +7 -0
- synapse_sdk/plugins/templates/schema.json +7 -0
- synapse_sdk/plugins/utils/__init__.py +3 -0
- synapse_sdk/plugins/utils/ray_gcs.py +66 -0
- synapse_sdk/shared/__init__.py +25 -0
- synapse_sdk/utils/converters/dm/__init__.py +42 -41
- synapse_sdk/utils/converters/dm/base.py +137 -0
- synapse_sdk/utils/converters/dm/from_v1.py +208 -562
- synapse_sdk/utils/converters/dm/to_v1.py +258 -304
- 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/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 → file.py.backup} +77 -0
- synapse_sdk/utils/network.py +272 -0
- synapse_sdk/utils/storage/__init__.py +6 -2
- synapse_sdk/utils/storage/providers/file_system.py +6 -0
- {synapse_sdk-1.0.0b5.dist-info → synapse_sdk-2025.12.3.dist-info}/METADATA +19 -2
- {synapse_sdk-1.0.0b5.dist-info → synapse_sdk-2025.12.3.dist-info}/RECORD +134 -74
- synapse_sdk/devtools/docs/.gitignore +0 -20
- synapse_sdk/devtools/docs/README.md +0 -41
- synapse_sdk/devtools/docs/blog/2019-05-28-first-blog-post.md +0 -12
- synapse_sdk/devtools/docs/blog/2019-05-29-long-blog-post.md +0 -44
- synapse_sdk/devtools/docs/blog/2021-08-01-mdx-blog-post.mdx +0 -24
- synapse_sdk/devtools/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
- synapse_sdk/devtools/docs/blog/2021-08-26-welcome/index.md +0 -29
- synapse_sdk/devtools/docs/blog/authors.yml +0 -25
- synapse_sdk/devtools/docs/blog/tags.yml +0 -19
- synapse_sdk/devtools/docs/docusaurus.config.ts +0 -138
- synapse_sdk/devtools/docs/package-lock.json +0 -17455
- synapse_sdk/devtools/docs/package.json +0 -47
- synapse_sdk/devtools/docs/sidebars.ts +0 -44
- synapse_sdk/devtools/docs/src/components/HomepageFeatures/index.tsx +0 -71
- synapse_sdk/devtools/docs/src/components/HomepageFeatures/styles.module.css +0 -11
- synapse_sdk/devtools/docs/src/css/custom.css +0 -30
- synapse_sdk/devtools/docs/src/pages/index.module.css +0 -23
- synapse_sdk/devtools/docs/src/pages/index.tsx +0 -21
- synapse_sdk/devtools/docs/src/pages/markdown-page.md +0 -7
- synapse_sdk/devtools/docs/static/.nojekyll +0 -0
- synapse_sdk/devtools/docs/static/img/docusaurus-social-card.jpg +0 -0
- synapse_sdk/devtools/docs/static/img/docusaurus.png +0 -0
- synapse_sdk/devtools/docs/static/img/favicon.ico +0 -0
- synapse_sdk/devtools/docs/static/img/logo.png +0 -0
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_mountain.svg +0 -171
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_react.svg +0 -170
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_tree.svg +0 -40
- synapse_sdk/devtools/docs/tsconfig.json +0 -8
- synapse_sdk/plugins/categories/export/actions/export.py +0 -346
- synapse_sdk/plugins/categories/export/enums.py +0 -7
- synapse_sdk/plugins/categories/neural_net/actions/gradio.py +0 -151
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task.py +0 -943
- synapse_sdk/plugins/categories/upload/actions/upload.py +0 -954
- {synapse_sdk-1.0.0b5.dist-info → synapse_sdk-2025.12.3.dist-info}/WHEEL +0 -0
- {synapse_sdk-1.0.0b5.dist-info → synapse_sdk-2025.12.3.dist-info}/entry_points.txt +0 -0
- {synapse_sdk-1.0.0b5.dist-info → synapse_sdk-2025.12.3.dist-info}/licenses/LICENSE +0 -0
- {synapse_sdk-1.0.0b5.dist-info → synapse_sdk-2025.12.3.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
from synapse_sdk.shared.enums import Context
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class AnnotationMethod(str, Enum):
|
|
7
|
+
FILE = 'file'
|
|
8
|
+
INFERENCE = 'inference'
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class AnnotateTaskDataStatus(str, Enum):
|
|
12
|
+
SUCCESS = 'success'
|
|
13
|
+
FAILED = 'failed'
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class LogCode(str, Enum):
|
|
17
|
+
"""Type-safe logging codes for to_task operations.
|
|
18
|
+
|
|
19
|
+
Enumeration of all possible log events during to_task processing. Each code
|
|
20
|
+
corresponds to a specific event or error state with predefined message
|
|
21
|
+
templates and log levels.
|
|
22
|
+
|
|
23
|
+
The codes are organized by category:
|
|
24
|
+
- Validation codes (INVALID_PROJECT_RESPONSE, NO_DATA_COLLECTION, etc.)
|
|
25
|
+
- Processing codes (ANNOTATING_DATA, ANNOTATION_COMPLETED, etc.)
|
|
26
|
+
- Error codes (CRITICAL_ERROR, TASK_PROCESSING_FAILED, etc.)
|
|
27
|
+
- Inference codes (ANNOTATING_INFERENCE_DATA, INFERENCE_PROCESSING_FAILED, etc.)
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
INVALID_PROJECT_RESPONSE = 'INVALID_PROJECT_RESPONSE'
|
|
31
|
+
NO_DATA_COLLECTION = 'NO_DATA_COLLECTION'
|
|
32
|
+
INVALID_DATA_COLLECTION_RESPONSE = 'INVALID_DATA_COLLECTION_RESPONSE'
|
|
33
|
+
NO_TASKS_FOUND = 'NO_TASKS_FOUND'
|
|
34
|
+
TARGET_SPEC_REQUIRED = 'TARGET_SPEC_REQUIRED'
|
|
35
|
+
TARGET_SPEC_NOT_FOUND = 'TARGET_SPEC_NOT_FOUND'
|
|
36
|
+
UNSUPPORTED_METHOD = 'UNSUPPORTED_METHOD'
|
|
37
|
+
ANNOTATING_DATA = 'ANNOTATING_DATA'
|
|
38
|
+
CRITICAL_ERROR = 'CRITICAL_ERROR'
|
|
39
|
+
TASK_PROCESSING_FAILED = 'TASK_PROCESSING_FAILED'
|
|
40
|
+
ANNOTATION_COMPLETED = 'ANNOTATION_COMPLETED'
|
|
41
|
+
INVALID_TASK_RESPONSE = 'INVALID_TASK_RESPONSE'
|
|
42
|
+
TARGET_SPEC_REQUIRED_FOR_TASK = 'TARGET_SPEC_REQUIRED_FOR_TASK'
|
|
43
|
+
UNSUPPORTED_METHOD_FOR_TASK = 'UNSUPPORTED_METHOD_FOR_TASK'
|
|
44
|
+
PRIMARY_IMAGE_URL_NOT_FOUND = 'PRIMARY_IMAGE_URL_NOT_FOUND'
|
|
45
|
+
FILE_SPEC_NOT_FOUND = 'FILE_SPEC_NOT_FOUND'
|
|
46
|
+
FILE_ORIGINAL_NAME_NOT_FOUND = 'FILE_ORIGINAL_NAME_NOT_FOUND'
|
|
47
|
+
URL_NOT_FOUND = 'URL_NOT_FOUND'
|
|
48
|
+
FETCH_DATA_FAILED = 'FETCH_DATA_FAILED'
|
|
49
|
+
CONVERT_DATA_FAILED = 'CONVERT_DATA_FAILED'
|
|
50
|
+
PREPROCESSOR_ID_REQUIRED = 'PREPROCESSOR_ID_REQUIRED'
|
|
51
|
+
INFERENCE_PROCESSING_FAILED = 'INFERENCE_PROCESSING_FAILED'
|
|
52
|
+
ANNOTATING_INFERENCE_DATA = 'ANNOTATING_INFERENCE_DATA'
|
|
53
|
+
INFERENCE_ANNOTATION_COMPLETED = 'INFERENCE_ANNOTATION_COMPLETED'
|
|
54
|
+
INFERENCE_PREPROCESSOR_FAILED = 'INFERENCE_PREPROCESSOR_FAILED'
|
|
55
|
+
|
|
56
|
+
# Orchestrator workflow codes
|
|
57
|
+
TO_TASK_STARTED = 'TO_TASK_STARTED'
|
|
58
|
+
TO_TASK_COMPLETED = 'TO_TASK_COMPLETED'
|
|
59
|
+
TO_TASK_FAILED = 'TO_TASK_FAILED'
|
|
60
|
+
STEP_STARTED = 'STEP_STARTED'
|
|
61
|
+
STEP_COMPLETED = 'STEP_COMPLETED'
|
|
62
|
+
STEP_FAILED = 'STEP_FAILED'
|
|
63
|
+
ROLLBACK_FAILED = 'ROLLBACK_FAILED'
|
|
64
|
+
ROLLBACK_ACTION_FAILED = 'ROLLBACK_ACTION_FAILED'
|
|
65
|
+
|
|
66
|
+
# Additional strategy codes
|
|
67
|
+
VALIDATION_FAILED = 'VALIDATION_FAILED'
|
|
68
|
+
NO_DATA_UNIT = 'NO_DATA_UNIT'
|
|
69
|
+
NO_DATA_UNIT_FILES = 'NO_DATA_UNIT_FILES'
|
|
70
|
+
TARGET_SPEC_URL_NOT_FOUND = 'TARGET_SPEC_URL_NOT_FOUND'
|
|
71
|
+
DATA_DOWNLOAD_FAILED = 'DATA_DOWNLOAD_FAILED'
|
|
72
|
+
JSON_DECODE_FAILED = 'JSON_DECODE_FAILED'
|
|
73
|
+
ANNOTATION_SUBMISSION_FAILED = 'ANNOTATION_SUBMISSION_FAILED'
|
|
74
|
+
NO_PREPROCESSOR_ID = 'NO_PREPROCESSOR_ID'
|
|
75
|
+
DATA_EXTRACTION_FAILED = 'DATA_EXTRACTION_FAILED'
|
|
76
|
+
PROGRESS_UPDATE_FAILED = 'PROGRESS_UPDATE_FAILED'
|
|
77
|
+
METRICS_RECORDING_FAILED = 'METRICS_RECORDING_FAILED'
|
|
78
|
+
METRICS_UPDATE_FAILED = 'METRICS_UPDATE_FAILED'
|
|
79
|
+
METRICS_FINALIZATION_FAILED = 'METRICS_FINALIZATION_FAILED'
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
LOG_MESSAGES = {
|
|
83
|
+
LogCode.INVALID_PROJECT_RESPONSE: {
|
|
84
|
+
'message': 'Invalid project response received.',
|
|
85
|
+
'level': Context.DANGER,
|
|
86
|
+
},
|
|
87
|
+
LogCode.NO_DATA_COLLECTION: {
|
|
88
|
+
'message': 'Project does not have a data collection.',
|
|
89
|
+
'level': Context.DANGER,
|
|
90
|
+
},
|
|
91
|
+
LogCode.INVALID_DATA_COLLECTION_RESPONSE: {
|
|
92
|
+
'message': 'Invalid data collection response received.',
|
|
93
|
+
'level': Context.DANGER,
|
|
94
|
+
},
|
|
95
|
+
LogCode.NO_TASKS_FOUND: {
|
|
96
|
+
'message': 'Tasks to annotate not found.',
|
|
97
|
+
'level': Context.WARNING,
|
|
98
|
+
},
|
|
99
|
+
LogCode.TARGET_SPEC_REQUIRED: {
|
|
100
|
+
'message': 'Target specification name is required for file annotation method.',
|
|
101
|
+
'level': Context.DANGER,
|
|
102
|
+
},
|
|
103
|
+
LogCode.TARGET_SPEC_NOT_FOUND: {
|
|
104
|
+
'message': 'Target specification name "{}" not found in file specifications',
|
|
105
|
+
'level': Context.DANGER,
|
|
106
|
+
},
|
|
107
|
+
LogCode.UNSUPPORTED_METHOD: {
|
|
108
|
+
'message': 'Unsupported annotation method: {}',
|
|
109
|
+
'level': Context.DANGER,
|
|
110
|
+
},
|
|
111
|
+
LogCode.ANNOTATING_DATA: {
|
|
112
|
+
'message': 'Annotating data to tasks...',
|
|
113
|
+
'level': None,
|
|
114
|
+
},
|
|
115
|
+
LogCode.CRITICAL_ERROR: {
|
|
116
|
+
'message': 'Critical error occured while processing task. Stopping the job.',
|
|
117
|
+
'level': Context.DANGER,
|
|
118
|
+
},
|
|
119
|
+
LogCode.TASK_PROCESSING_FAILED: {
|
|
120
|
+
'message': 'Failed to process task {}: {}',
|
|
121
|
+
'level': Context.DANGER,
|
|
122
|
+
},
|
|
123
|
+
LogCode.ANNOTATION_COMPLETED: {
|
|
124
|
+
'message': 'Annotation completed. Success: {}, Failed: {}',
|
|
125
|
+
'level': None,
|
|
126
|
+
},
|
|
127
|
+
LogCode.INVALID_TASK_RESPONSE: {
|
|
128
|
+
'message': 'Invalid task response received for task {}',
|
|
129
|
+
'level': Context.DANGER,
|
|
130
|
+
},
|
|
131
|
+
LogCode.TARGET_SPEC_REQUIRED_FOR_TASK: {
|
|
132
|
+
'message': 'Target specification name is required for file annotation method for task {}',
|
|
133
|
+
'level': Context.DANGER,
|
|
134
|
+
},
|
|
135
|
+
LogCode.UNSUPPORTED_METHOD_FOR_TASK: {
|
|
136
|
+
'message': 'Unsupported annotation method: {} for task {}',
|
|
137
|
+
'level': Context.DANGER,
|
|
138
|
+
},
|
|
139
|
+
LogCode.PRIMARY_IMAGE_URL_NOT_FOUND: {
|
|
140
|
+
'message': 'Primary image URL not found in task data for task {}',
|
|
141
|
+
'level': Context.DANGER,
|
|
142
|
+
},
|
|
143
|
+
LogCode.FILE_SPEC_NOT_FOUND: {
|
|
144
|
+
'message': 'File specification not found for task {}',
|
|
145
|
+
'level': Context.DANGER,
|
|
146
|
+
},
|
|
147
|
+
LogCode.FILE_ORIGINAL_NAME_NOT_FOUND: {
|
|
148
|
+
'message': 'File original name not found for task {}',
|
|
149
|
+
'level': Context.DANGER,
|
|
150
|
+
},
|
|
151
|
+
LogCode.URL_NOT_FOUND: {
|
|
152
|
+
'message': 'URL not found for task {}',
|
|
153
|
+
'level': Context.DANGER,
|
|
154
|
+
},
|
|
155
|
+
LogCode.FETCH_DATA_FAILED: {
|
|
156
|
+
'message': 'Failed to fetch data from URL: {} for task {}',
|
|
157
|
+
'level': Context.DANGER,
|
|
158
|
+
},
|
|
159
|
+
LogCode.CONVERT_DATA_FAILED: {
|
|
160
|
+
'message': 'Failed to convert data to task object: {} for task {}',
|
|
161
|
+
'level': Context.DANGER,
|
|
162
|
+
},
|
|
163
|
+
LogCode.PREPROCESSOR_ID_REQUIRED: {
|
|
164
|
+
'message': 'Pre-processor ID is required for inference annotation method for task {}',
|
|
165
|
+
'level': Context.DANGER,
|
|
166
|
+
},
|
|
167
|
+
LogCode.INFERENCE_PROCESSING_FAILED: {
|
|
168
|
+
'message': 'Failed to process inference for task {}: {}',
|
|
169
|
+
'level': Context.DANGER,
|
|
170
|
+
},
|
|
171
|
+
LogCode.ANNOTATING_INFERENCE_DATA: {
|
|
172
|
+
'message': 'Annotating data to tasks using inference...',
|
|
173
|
+
'level': None,
|
|
174
|
+
},
|
|
175
|
+
LogCode.INFERENCE_ANNOTATION_COMPLETED: {
|
|
176
|
+
'message': 'Inference annotation completed. Success: {}, Failed: {}',
|
|
177
|
+
'level': None,
|
|
178
|
+
},
|
|
179
|
+
LogCode.INFERENCE_PREPROCESSOR_FAILED: {
|
|
180
|
+
'message': 'Inference pre processor failed for task {}: {}',
|
|
181
|
+
'level': Context.DANGER,
|
|
182
|
+
},
|
|
183
|
+
# Orchestrator workflow messages
|
|
184
|
+
LogCode.TO_TASK_STARTED: {
|
|
185
|
+
'message': 'ToTask action started.',
|
|
186
|
+
'level': Context.INFO,
|
|
187
|
+
},
|
|
188
|
+
LogCode.TO_TASK_COMPLETED: {
|
|
189
|
+
'message': 'ToTask action completed successfully.',
|
|
190
|
+
'level': Context.SUCCESS,
|
|
191
|
+
},
|
|
192
|
+
LogCode.TO_TASK_FAILED: {
|
|
193
|
+
'message': 'ToTask action failed: {}',
|
|
194
|
+
'level': Context.DANGER,
|
|
195
|
+
},
|
|
196
|
+
LogCode.STEP_STARTED: {
|
|
197
|
+
'message': 'Starting workflow step: {}',
|
|
198
|
+
'level': Context.INFO,
|
|
199
|
+
},
|
|
200
|
+
LogCode.STEP_COMPLETED: {
|
|
201
|
+
'message': 'Completed workflow step: {}',
|
|
202
|
+
'level': Context.INFO,
|
|
203
|
+
},
|
|
204
|
+
LogCode.STEP_FAILED: {
|
|
205
|
+
'message': 'Failed workflow step {}: {}',
|
|
206
|
+
'level': Context.DANGER,
|
|
207
|
+
},
|
|
208
|
+
LogCode.ROLLBACK_FAILED: {
|
|
209
|
+
'message': 'Failed to rollback step {}: {}',
|
|
210
|
+
'level': Context.WARNING,
|
|
211
|
+
},
|
|
212
|
+
LogCode.ROLLBACK_ACTION_FAILED: {
|
|
213
|
+
'message': 'Failed to execute rollback action: {}',
|
|
214
|
+
'level': Context.WARNING,
|
|
215
|
+
},
|
|
216
|
+
# Additional strategy messages
|
|
217
|
+
LogCode.VALIDATION_FAILED: {
|
|
218
|
+
'message': 'Validation failed: {}',
|
|
219
|
+
'level': Context.DANGER,
|
|
220
|
+
},
|
|
221
|
+
LogCode.NO_DATA_UNIT: {
|
|
222
|
+
'message': 'Task does not have a data unit',
|
|
223
|
+
'level': Context.DANGER,
|
|
224
|
+
},
|
|
225
|
+
LogCode.NO_DATA_UNIT_FILES: {
|
|
226
|
+
'message': 'Data unit does not have files',
|
|
227
|
+
'level': Context.DANGER,
|
|
228
|
+
},
|
|
229
|
+
LogCode.TARGET_SPEC_URL_NOT_FOUND: {
|
|
230
|
+
'message': 'Target specification URL not found for {} in task {}',
|
|
231
|
+
'level': Context.DANGER,
|
|
232
|
+
},
|
|
233
|
+
LogCode.DATA_DOWNLOAD_FAILED: {
|
|
234
|
+
'message': 'Failed to download data for task {}: {}',
|
|
235
|
+
'level': Context.DANGER,
|
|
236
|
+
},
|
|
237
|
+
LogCode.JSON_DECODE_FAILED: {
|
|
238
|
+
'message': 'Failed to decode JSON data for task {}: {}',
|
|
239
|
+
'level': Context.DANGER,
|
|
240
|
+
},
|
|
241
|
+
LogCode.ANNOTATION_SUBMISSION_FAILED: {
|
|
242
|
+
'message': 'Failed to submit annotation data for task {}: {}',
|
|
243
|
+
'level': Context.DANGER,
|
|
244
|
+
},
|
|
245
|
+
LogCode.NO_PREPROCESSOR_ID: {
|
|
246
|
+
'message': 'Pre-processor ID is required for inference annotation method',
|
|
247
|
+
'level': Context.DANGER,
|
|
248
|
+
},
|
|
249
|
+
LogCode.DATA_EXTRACTION_FAILED: {
|
|
250
|
+
'message': 'Data extraction failed: {}',
|
|
251
|
+
'level': Context.DANGER,
|
|
252
|
+
},
|
|
253
|
+
LogCode.PROGRESS_UPDATE_FAILED: {
|
|
254
|
+
'message': 'Progress update failed: {}',
|
|
255
|
+
'level': Context.WARNING,
|
|
256
|
+
},
|
|
257
|
+
LogCode.METRICS_RECORDING_FAILED: {
|
|
258
|
+
'message': 'Metrics recording failed: {}',
|
|
259
|
+
'level': Context.WARNING,
|
|
260
|
+
},
|
|
261
|
+
LogCode.METRICS_UPDATE_FAILED: {
|
|
262
|
+
'message': 'Metrics update failed: {}',
|
|
263
|
+
'level': Context.WARNING,
|
|
264
|
+
},
|
|
265
|
+
LogCode.METRICS_FINALIZATION_FAILED: {
|
|
266
|
+
'message': 'Metrics finalization failed: {}',
|
|
267
|
+
'level': Context.WARNING,
|
|
268
|
+
},
|
|
269
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
class CriticalError(Exception):
|
|
2
|
+
"""Critical error."""
|
|
3
|
+
|
|
4
|
+
def __init__(self, message: str = 'Critical error occured while processing task'):
|
|
5
|
+
self.message = message
|
|
6
|
+
super().__init__(self.message)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class PreAnnotationToTaskFailed(Exception):
|
|
10
|
+
"""Pre-annotation to task failed."""
|
|
11
|
+
|
|
12
|
+
def __init__(self, message: str = 'Pre-annotation to task failed'):
|
|
13
|
+
self.message = message
|
|
14
|
+
super().__init__(self.message)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""Factory for creating ToTask strategies based on context."""
|
|
2
|
+
|
|
3
|
+
from typing import Dict, Type
|
|
4
|
+
|
|
5
|
+
from .enums import AnnotationMethod
|
|
6
|
+
from .strategies.base import (
|
|
7
|
+
AnnotationStrategy,
|
|
8
|
+
DataExtractionStrategy,
|
|
9
|
+
MetricsStrategy,
|
|
10
|
+
PreProcessorStrategy,
|
|
11
|
+
ValidationStrategy,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ToTaskStrategyFactory:
|
|
16
|
+
"""Factory for creating action strategies based on context."""
|
|
17
|
+
|
|
18
|
+
def __init__(self):
|
|
19
|
+
# Import strategies here to avoid circular imports
|
|
20
|
+
from .strategies.annotation import FileAnnotationStrategy, InferenceAnnotationStrategy
|
|
21
|
+
from .strategies.extraction import FileUrlExtractionStrategy, InferenceDataExtractionStrategy
|
|
22
|
+
from .strategies.metrics import ProgressTrackingStrategy
|
|
23
|
+
from .strategies.preprocessor import PreProcessorManagementStrategy
|
|
24
|
+
from .strategies.validation import (
|
|
25
|
+
ProjectValidationStrategy,
|
|
26
|
+
TargetSpecificationValidationStrategy,
|
|
27
|
+
TaskValidationStrategy,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
self._annotation_strategies: Dict[AnnotationMethod, Type[AnnotationStrategy]] = {
|
|
31
|
+
AnnotationMethod.FILE: FileAnnotationStrategy,
|
|
32
|
+
AnnotationMethod.INFERENCE: InferenceAnnotationStrategy,
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
self._validation_strategies = {
|
|
36
|
+
'project': ProjectValidationStrategy,
|
|
37
|
+
'task': TaskValidationStrategy,
|
|
38
|
+
'target_spec': TargetSpecificationValidationStrategy,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
self._extraction_strategies = {
|
|
42
|
+
AnnotationMethod.FILE: FileUrlExtractionStrategy,
|
|
43
|
+
AnnotationMethod.INFERENCE: InferenceDataExtractionStrategy,
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
self._preprocessor_strategy = PreProcessorManagementStrategy
|
|
47
|
+
self._metrics_strategy = ProgressTrackingStrategy
|
|
48
|
+
|
|
49
|
+
def create_annotation_strategy(self, method: AnnotationMethod) -> AnnotationStrategy:
|
|
50
|
+
"""Create annotation strategy based on method."""
|
|
51
|
+
strategy_class = self._annotation_strategies.get(method)
|
|
52
|
+
if not strategy_class:
|
|
53
|
+
raise ValueError(f'No annotation strategy available for method: {method}')
|
|
54
|
+
return strategy_class()
|
|
55
|
+
|
|
56
|
+
def create_validation_strategy(self, validation_type: str) -> ValidationStrategy:
|
|
57
|
+
"""Create validation strategy based on type."""
|
|
58
|
+
strategy_class = self._validation_strategies.get(validation_type)
|
|
59
|
+
if not strategy_class:
|
|
60
|
+
raise ValueError(f'No validation strategy available for type: {validation_type}')
|
|
61
|
+
return strategy_class()
|
|
62
|
+
|
|
63
|
+
def create_extraction_strategy(self, method: AnnotationMethod) -> DataExtractionStrategy:
|
|
64
|
+
"""Create data extraction strategy based on method."""
|
|
65
|
+
strategy_class = self._extraction_strategies.get(method)
|
|
66
|
+
if not strategy_class:
|
|
67
|
+
raise ValueError(f'No extraction strategy available for method: {method}')
|
|
68
|
+
return strategy_class()
|
|
69
|
+
|
|
70
|
+
def create_preprocessor_strategy(self) -> PreProcessorStrategy:
|
|
71
|
+
"""Create pre-processor management strategy."""
|
|
72
|
+
return self._preprocessor_strategy()
|
|
73
|
+
|
|
74
|
+
def create_metrics_strategy(self) -> MetricsStrategy:
|
|
75
|
+
"""Create metrics tracking strategy."""
|
|
76
|
+
return self._metrics_strategy()
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
from typing import Annotated, Any, Dict, Optional
|
|
2
|
+
|
|
3
|
+
from pydantic import AfterValidator, BaseModel, field_validator
|
|
4
|
+
from pydantic_core import PydanticCustomError
|
|
5
|
+
|
|
6
|
+
from synapse_sdk.clients.backend.models import JobStatus
|
|
7
|
+
from synapse_sdk.clients.exceptions import ClientError
|
|
8
|
+
from synapse_sdk.plugins.categories.upload.actions.upload.enums import VALIDATION_ERROR_MESSAGES, ValidationErrorCode
|
|
9
|
+
from synapse_sdk.shared.enums import Context
|
|
10
|
+
from synapse_sdk.utils.pydantic.validators import non_blank
|
|
11
|
+
|
|
12
|
+
from .enums import AnnotateTaskDataStatus
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ToTaskParams(BaseModel):
|
|
16
|
+
"""ToTask action parameters.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
name (str): The name of the action.
|
|
20
|
+
description (str | None): The description of the action.
|
|
21
|
+
project (int): The project ID.
|
|
22
|
+
agent (int): The agent ID.
|
|
23
|
+
task_filters (dict): The filters of tasks.
|
|
24
|
+
method (AnnotationMethod): The method of annotation.
|
|
25
|
+
target_specification_name (str | None): The name of the target specification.
|
|
26
|
+
model (int): The model ID.
|
|
27
|
+
pre_processor (int | None): The pre processor ID.
|
|
28
|
+
pre_processor_params (dict): The params of the pre processor.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
name: Annotated[str, AfterValidator(non_blank)]
|
|
32
|
+
description: Optional[str] = None
|
|
33
|
+
project: int
|
|
34
|
+
agent: int
|
|
35
|
+
task_filters: Dict[str, Any]
|
|
36
|
+
method: Optional[str] = None
|
|
37
|
+
target_specification_name: Optional[str] = None
|
|
38
|
+
model: Optional[int] = None
|
|
39
|
+
pre_processor: Optional[int] = None
|
|
40
|
+
pre_processor_params: Dict[str, Any]
|
|
41
|
+
|
|
42
|
+
@field_validator('project', mode='before')
|
|
43
|
+
@classmethod
|
|
44
|
+
def check_project_exists(cls, value: int, info) -> int:
|
|
45
|
+
"""Validate synapse-backend project exists."""
|
|
46
|
+
if not value:
|
|
47
|
+
return value
|
|
48
|
+
|
|
49
|
+
action = info.context['action']
|
|
50
|
+
client = action.client
|
|
51
|
+
try:
|
|
52
|
+
client.get_project(value)
|
|
53
|
+
except ClientError as e:
|
|
54
|
+
error_code = ValidationErrorCode.PROJECT_NOT_FOUND
|
|
55
|
+
error_message = VALIDATION_ERROR_MESSAGES[error_code].format(value, str(e))
|
|
56
|
+
raise PydanticCustomError(error_code.value, error_message)
|
|
57
|
+
return value
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class ToTaskResult(BaseModel):
|
|
61
|
+
"""Result model for ToTaskAction.start method.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
status (JobStatus): The job status from the action execution.
|
|
65
|
+
message (str): A descriptive message about the action result.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
status: JobStatus
|
|
69
|
+
message: str
|
|
70
|
+
|
|
71
|
+
def model_dump(self, **kwargs):
|
|
72
|
+
"""Override model_dump to return status as enum value."""
|
|
73
|
+
data = super().model_dump(**kwargs)
|
|
74
|
+
if 'status' in data and isinstance(data['status'], JobStatus):
|
|
75
|
+
data['status'] = data['status'].value
|
|
76
|
+
return data
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class AnnotateTaskEventLog(BaseModel):
|
|
80
|
+
"""Annotate task event log model."""
|
|
81
|
+
|
|
82
|
+
info: Optional[str] = None
|
|
83
|
+
status: Context
|
|
84
|
+
created: str
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class AnnotateTaskDataLog(BaseModel):
|
|
88
|
+
"""Log model for annotate task data."""
|
|
89
|
+
|
|
90
|
+
task_info: Optional[str] = None
|
|
91
|
+
status: AnnotateTaskDataStatus
|
|
92
|
+
created: str
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class MetricsRecord(BaseModel):
|
|
96
|
+
"""Metrics record model."""
|
|
97
|
+
|
|
98
|
+
stand_by: int
|
|
99
|
+
failed: int
|
|
100
|
+
success: int
|