synapse-sdk 1.0.0a11__py3-none-any.whl → 2026.1.1b2__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.
Potentially problematic release.
This version of synapse-sdk might be problematic. Click here for more details.
- synapse_sdk/__init__.py +24 -0
- synapse_sdk/cli/__init__.py +9 -8
- synapse_sdk/cli/agent/__init__.py +25 -0
- synapse_sdk/cli/agent/config.py +104 -0
- synapse_sdk/cli/agent/select.py +197 -0
- synapse_sdk/cli/auth.py +104 -0
- synapse_sdk/cli/main.py +1025 -0
- synapse_sdk/cli/plugin/__init__.py +58 -0
- synapse_sdk/cli/plugin/create.py +566 -0
- synapse_sdk/cli/plugin/job.py +196 -0
- synapse_sdk/cli/plugin/publish.py +322 -0
- synapse_sdk/cli/plugin/run.py +131 -0
- synapse_sdk/cli/plugin/test.py +200 -0
- synapse_sdk/clients/README.md +239 -0
- synapse_sdk/clients/__init__.py +5 -0
- synapse_sdk/clients/_template.py +266 -0
- synapse_sdk/clients/agent/__init__.py +84 -29
- synapse_sdk/clients/agent/async_ray.py +289 -0
- synapse_sdk/clients/agent/container.py +83 -0
- synapse_sdk/clients/agent/plugin.py +101 -0
- synapse_sdk/clients/agent/ray.py +296 -39
- synapse_sdk/clients/backend/__init__.py +152 -12
- synapse_sdk/clients/backend/annotation.py +164 -22
- synapse_sdk/clients/backend/core.py +101 -0
- synapse_sdk/clients/backend/data_collection.py +292 -0
- synapse_sdk/clients/backend/hitl.py +87 -0
- synapse_sdk/clients/backend/integration.py +374 -46
- synapse_sdk/clients/backend/ml.py +134 -22
- synapse_sdk/clients/backend/models.py +247 -0
- synapse_sdk/clients/base.py +538 -59
- synapse_sdk/clients/exceptions.py +35 -7
- synapse_sdk/clients/pipeline/__init__.py +5 -0
- synapse_sdk/clients/pipeline/client.py +636 -0
- synapse_sdk/clients/protocols.py +178 -0
- synapse_sdk/clients/utils.py +86 -8
- synapse_sdk/clients/validation.py +58 -0
- synapse_sdk/enums.py +76 -0
- synapse_sdk/exceptions.py +168 -0
- synapse_sdk/integrations/__init__.py +74 -0
- synapse_sdk/integrations/_base.py +119 -0
- synapse_sdk/integrations/_context.py +53 -0
- synapse_sdk/integrations/ultralytics/__init__.py +78 -0
- synapse_sdk/integrations/ultralytics/_callbacks.py +126 -0
- synapse_sdk/integrations/ultralytics/_patches.py +124 -0
- synapse_sdk/loggers.py +476 -95
- synapse_sdk/mcp/MCP.md +69 -0
- synapse_sdk/mcp/__init__.py +48 -0
- synapse_sdk/mcp/__main__.py +6 -0
- synapse_sdk/mcp/config.py +349 -0
- synapse_sdk/mcp/prompts/__init__.py +4 -0
- synapse_sdk/mcp/resources/__init__.py +4 -0
- synapse_sdk/mcp/server.py +1352 -0
- synapse_sdk/mcp/tools/__init__.py +6 -0
- synapse_sdk/plugins/__init__.py +133 -9
- synapse_sdk/plugins/action.py +229 -0
- synapse_sdk/plugins/actions/__init__.py +82 -0
- synapse_sdk/plugins/actions/dataset/__init__.py +37 -0
- synapse_sdk/plugins/actions/dataset/action.py +471 -0
- synapse_sdk/plugins/actions/export/__init__.py +55 -0
- synapse_sdk/plugins/actions/export/action.py +183 -0
- synapse_sdk/plugins/actions/export/context.py +59 -0
- synapse_sdk/plugins/actions/inference/__init__.py +84 -0
- synapse_sdk/plugins/actions/inference/action.py +285 -0
- synapse_sdk/plugins/actions/inference/context.py +81 -0
- synapse_sdk/plugins/actions/inference/deployment.py +322 -0
- synapse_sdk/plugins/actions/inference/serve.py +252 -0
- synapse_sdk/plugins/actions/train/__init__.py +54 -0
- synapse_sdk/plugins/actions/train/action.py +326 -0
- synapse_sdk/plugins/actions/train/context.py +57 -0
- synapse_sdk/plugins/actions/upload/__init__.py +49 -0
- synapse_sdk/plugins/actions/upload/action.py +165 -0
- synapse_sdk/plugins/actions/upload/context.py +61 -0
- synapse_sdk/plugins/config.py +98 -0
- synapse_sdk/plugins/context/__init__.py +109 -0
- synapse_sdk/plugins/context/env.py +113 -0
- synapse_sdk/plugins/datasets/__init__.py +113 -0
- synapse_sdk/plugins/datasets/converters/__init__.py +76 -0
- synapse_sdk/plugins/datasets/converters/base.py +347 -0
- synapse_sdk/plugins/datasets/converters/yolo/__init__.py +9 -0
- synapse_sdk/plugins/datasets/converters/yolo/from_dm.py +468 -0
- synapse_sdk/plugins/datasets/converters/yolo/to_dm.py +381 -0
- synapse_sdk/plugins/datasets/formats/__init__.py +82 -0
- synapse_sdk/plugins/datasets/formats/dm.py +351 -0
- synapse_sdk/plugins/datasets/formats/yolo.py +240 -0
- synapse_sdk/plugins/decorators.py +83 -0
- synapse_sdk/plugins/discovery.py +790 -0
- synapse_sdk/plugins/docs/ACTION_DEV_GUIDE.md +933 -0
- synapse_sdk/plugins/docs/ARCHITECTURE.md +1225 -0
- synapse_sdk/plugins/docs/LOGGING_SYSTEM.md +683 -0
- synapse_sdk/plugins/docs/OVERVIEW.md +531 -0
- synapse_sdk/plugins/docs/PIPELINE_GUIDE.md +145 -0
- synapse_sdk/plugins/docs/README.md +513 -0
- synapse_sdk/plugins/docs/STEP.md +656 -0
- synapse_sdk/plugins/enums.py +70 -10
- synapse_sdk/plugins/errors.py +92 -0
- synapse_sdk/plugins/executors/__init__.py +43 -0
- synapse_sdk/plugins/executors/local.py +99 -0
- synapse_sdk/plugins/executors/ray/__init__.py +18 -0
- synapse_sdk/plugins/executors/ray/base.py +282 -0
- synapse_sdk/plugins/executors/ray/job.py +298 -0
- synapse_sdk/plugins/executors/ray/jobs_api.py +511 -0
- synapse_sdk/plugins/executors/ray/packaging.py +137 -0
- synapse_sdk/plugins/executors/ray/pipeline.py +792 -0
- synapse_sdk/plugins/executors/ray/task.py +257 -0
- synapse_sdk/plugins/models/__init__.py +26 -0
- synapse_sdk/plugins/models/logger.py +173 -0
- synapse_sdk/plugins/models/pipeline.py +25 -0
- synapse_sdk/plugins/pipelines/__init__.py +81 -0
- synapse_sdk/plugins/pipelines/action_pipeline.py +417 -0
- synapse_sdk/plugins/pipelines/context.py +107 -0
- synapse_sdk/plugins/pipelines/display.py +311 -0
- synapse_sdk/plugins/runner.py +114 -0
- synapse_sdk/plugins/schemas/__init__.py +19 -0
- synapse_sdk/plugins/schemas/results.py +152 -0
- synapse_sdk/plugins/steps/__init__.py +63 -0
- synapse_sdk/plugins/steps/base.py +128 -0
- synapse_sdk/plugins/steps/context.py +90 -0
- synapse_sdk/plugins/steps/orchestrator.py +128 -0
- synapse_sdk/plugins/steps/registry.py +103 -0
- synapse_sdk/plugins/steps/utils/__init__.py +20 -0
- synapse_sdk/plugins/steps/utils/logging.py +85 -0
- synapse_sdk/plugins/steps/utils/timing.py +71 -0
- synapse_sdk/plugins/steps/utils/validation.py +68 -0
- synapse_sdk/plugins/templates/__init__.py +50 -0
- synapse_sdk/plugins/templates/base/.gitignore.j2 +26 -0
- synapse_sdk/plugins/templates/base/.synapseignore.j2 +11 -0
- synapse_sdk/plugins/templates/base/README.md.j2 +26 -0
- synapse_sdk/plugins/templates/base/plugin/__init__.py.j2 +1 -0
- synapse_sdk/plugins/templates/base/pyproject.toml.j2 +14 -0
- synapse_sdk/plugins/templates/base/requirements.txt.j2 +1 -0
- synapse_sdk/plugins/templates/custom/plugin/main.py.j2 +18 -0
- synapse_sdk/plugins/templates/data_validation/plugin/validate.py.j2 +32 -0
- synapse_sdk/plugins/templates/export/plugin/export.py.j2 +36 -0
- synapse_sdk/plugins/templates/neural_net/plugin/inference.py.j2 +36 -0
- synapse_sdk/plugins/templates/neural_net/plugin/train.py.j2 +33 -0
- synapse_sdk/plugins/templates/post_annotation/plugin/post_annotate.py.j2 +32 -0
- synapse_sdk/plugins/templates/pre_annotation/plugin/pre_annotate.py.j2 +32 -0
- synapse_sdk/plugins/templates/smart_tool/plugin/auto_label.py.j2 +44 -0
- synapse_sdk/plugins/templates/upload/plugin/upload.py.j2 +35 -0
- synapse_sdk/plugins/testing/__init__.py +25 -0
- synapse_sdk/plugins/testing/sample_actions.py +98 -0
- synapse_sdk/plugins/types.py +206 -0
- synapse_sdk/plugins/upload.py +595 -64
- synapse_sdk/plugins/utils.py +325 -37
- synapse_sdk/shared/__init__.py +25 -0
- synapse_sdk/utils/__init__.py +1 -0
- synapse_sdk/utils/auth.py +74 -0
- synapse_sdk/utils/file/__init__.py +58 -0
- synapse_sdk/utils/file/archive.py +449 -0
- synapse_sdk/utils/file/checksum.py +167 -0
- synapse_sdk/utils/file/download.py +286 -0
- synapse_sdk/utils/file/io.py +129 -0
- synapse_sdk/utils/file/requirements.py +36 -0
- synapse_sdk/utils/network.py +168 -0
- synapse_sdk/utils/storage/__init__.py +238 -0
- synapse_sdk/utils/storage/config.py +188 -0
- synapse_sdk/utils/storage/errors.py +52 -0
- synapse_sdk/utils/storage/providers/__init__.py +13 -0
- synapse_sdk/utils/storage/providers/base.py +76 -0
- synapse_sdk/utils/storage/providers/gcs.py +168 -0
- synapse_sdk/utils/storage/providers/http.py +250 -0
- synapse_sdk/utils/storage/providers/local.py +126 -0
- synapse_sdk/utils/storage/providers/s3.py +177 -0
- synapse_sdk/utils/storage/providers/sftp.py +208 -0
- synapse_sdk/utils/storage/registry.py +125 -0
- synapse_sdk/utils/websocket.py +99 -0
- synapse_sdk-2026.1.1b2.dist-info/METADATA +715 -0
- synapse_sdk-2026.1.1b2.dist-info/RECORD +172 -0
- {synapse_sdk-1.0.0a11.dist-info → synapse_sdk-2026.1.1b2.dist-info}/WHEEL +1 -1
- synapse_sdk-2026.1.1b2.dist-info/licenses/LICENSE +201 -0
- locale/en/LC_MESSAGES/messages.mo +0 -0
- locale/en/LC_MESSAGES/messages.po +0 -39
- locale/ko/LC_MESSAGES/messages.mo +0 -0
- locale/ko/LC_MESSAGES/messages.po +0 -34
- synapse_sdk/cli/create_plugin.py +0 -10
- synapse_sdk/clients/agent/core.py +0 -7
- synapse_sdk/clients/agent/service.py +0 -15
- synapse_sdk/clients/backend/dataset.py +0 -51
- synapse_sdk/clients/ray/__init__.py +0 -6
- synapse_sdk/clients/ray/core.py +0 -22
- synapse_sdk/clients/ray/serve.py +0 -20
- synapse_sdk/i18n.py +0 -35
- synapse_sdk/plugins/categories/__init__.py +0 -0
- synapse_sdk/plugins/categories/base.py +0 -235
- synapse_sdk/plugins/categories/data_validation/__init__.py +0 -0
- synapse_sdk/plugins/categories/data_validation/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/data_validation/actions/validation.py +0 -10
- synapse_sdk/plugins/categories/data_validation/templates/config.yaml +0 -3
- synapse_sdk/plugins/categories/data_validation/templates/plugin/__init__.py +0 -0
- synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +0 -5
- synapse_sdk/plugins/categories/decorators.py +0 -13
- synapse_sdk/plugins/categories/export/__init__.py +0 -0
- synapse_sdk/plugins/categories/export/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/export/actions/export.py +0 -10
- synapse_sdk/plugins/categories/import/__init__.py +0 -0
- synapse_sdk/plugins/categories/import/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/import/actions/import.py +0 -10
- synapse_sdk/plugins/categories/neural_net/__init__.py +0 -0
- synapse_sdk/plugins/categories/neural_net/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/neural_net/actions/deployment.py +0 -45
- synapse_sdk/plugins/categories/neural_net/actions/inference.py +0 -18
- synapse_sdk/plugins/categories/neural_net/actions/test.py +0 -10
- synapse_sdk/plugins/categories/neural_net/actions/train.py +0 -143
- synapse_sdk/plugins/categories/neural_net/templates/config.yaml +0 -12
- synapse_sdk/plugins/categories/neural_net/templates/plugin/__init__.py +0 -0
- synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +0 -4
- synapse_sdk/plugins/categories/neural_net/templates/plugin/test.py +0 -2
- synapse_sdk/plugins/categories/neural_net/templates/plugin/train.py +0 -14
- synapse_sdk/plugins/categories/post_annotation/__init__.py +0 -0
- synapse_sdk/plugins/categories/post_annotation/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/post_annotation/actions/post_annotation.py +0 -10
- synapse_sdk/plugins/categories/post_annotation/templates/config.yaml +0 -3
- synapse_sdk/plugins/categories/post_annotation/templates/plugin/__init__.py +0 -0
- synapse_sdk/plugins/categories/post_annotation/templates/plugin/post_annotation.py +0 -3
- synapse_sdk/plugins/categories/pre_annotation/__init__.py +0 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation.py +0 -10
- synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +0 -3
- synapse_sdk/plugins/categories/pre_annotation/templates/plugin/__init__.py +0 -0
- synapse_sdk/plugins/categories/pre_annotation/templates/plugin/pre_annotation.py +0 -3
- synapse_sdk/plugins/categories/registry.py +0 -16
- synapse_sdk/plugins/categories/smart_tool/__init__.py +0 -0
- synapse_sdk/plugins/categories/smart_tool/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/smart_tool/actions/auto_label.py +0 -37
- synapse_sdk/plugins/categories/smart_tool/templates/config.yaml +0 -7
- synapse_sdk/plugins/categories/smart_tool/templates/plugin/__init__.py +0 -0
- synapse_sdk/plugins/categories/smart_tool/templates/plugin/auto_label.py +0 -11
- synapse_sdk/plugins/categories/templates.py +0 -32
- synapse_sdk/plugins/cli/__init__.py +0 -21
- synapse_sdk/plugins/cli/publish.py +0 -37
- synapse_sdk/plugins/cli/run.py +0 -67
- synapse_sdk/plugins/exceptions.py +0 -22
- synapse_sdk/plugins/models.py +0 -121
- synapse_sdk/plugins/templates/cookiecutter.json +0 -11
- synapse_sdk/plugins/templates/hooks/post_gen_project.py +0 -3
- synapse_sdk/plugins/templates/hooks/pre_prompt.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/.gitignore +0 -27
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.pre-commit-config.yaml +0 -7
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/README.md +0 -5
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/config.yaml +0 -6
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/main.py +0 -4
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/plugin/__init__.py +0 -0
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/pyproject.toml +0 -13
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +0 -1
- synapse_sdk/shared/enums.py +0 -8
- synapse_sdk/utils/debug.py +0 -5
- synapse_sdk/utils/file.py +0 -87
- synapse_sdk/utils/module_loading.py +0 -29
- synapse_sdk/utils/pydantic/__init__.py +0 -0
- synapse_sdk/utils/pydantic/config.py +0 -4
- synapse_sdk/utils/pydantic/errors.py +0 -33
- synapse_sdk/utils/pydantic/validators.py +0 -7
- synapse_sdk/utils/storage.py +0 -91
- synapse_sdk/utils/string.py +0 -11
- synapse_sdk-1.0.0a11.dist-info/LICENSE +0 -21
- synapse_sdk-1.0.0a11.dist-info/METADATA +0 -43
- synapse_sdk-1.0.0a11.dist-info/RECORD +0 -111
- {synapse_sdk-1.0.0a11.dist-info → synapse_sdk-2026.1.1b2.dist-info}/entry_points.txt +0 -0
- {synapse_sdk-1.0.0a11.dist-info → synapse_sdk-2026.1.1b2.dist-info}/top_level.txt +0 -0
synapse_sdk/plugins/__init__.py
CHANGED
|
@@ -1,13 +1,137 @@
|
|
|
1
|
-
|
|
1
|
+
"""Plugin architecture for Synapse SDK.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This module provides the core plugin framework including:
|
|
4
|
+
- Plugin configuration and discovery
|
|
5
|
+
- Action definition (class-based and function-based)
|
|
6
|
+
- Execution modes (local, task, job)
|
|
7
|
+
- Pipeline patterns (step-based workflows)
|
|
4
8
|
|
|
5
|
-
|
|
9
|
+
Example:
|
|
10
|
+
>>> from synapse_sdk.plugins import action, run_plugin
|
|
11
|
+
>>> from pydantic import BaseModel
|
|
12
|
+
>>>
|
|
13
|
+
>>> class TrainParams(BaseModel):
|
|
14
|
+
... epochs: int = 10
|
|
15
|
+
>>>
|
|
16
|
+
>>> @action(params=TrainParams)
|
|
17
|
+
... def train(params: TrainParams, context) -> dict:
|
|
18
|
+
... return {'trained': True}
|
|
19
|
+
>>>
|
|
20
|
+
>>> # Execute the plugin action
|
|
21
|
+
>>> result = run_plugin('my_plugin', 'train', {'epochs': 20})
|
|
22
|
+
"""
|
|
6
23
|
|
|
24
|
+
from synapse_sdk.plugins.action import BaseAction, NoResult, validate_result
|
|
25
|
+
from synapse_sdk.plugins.actions import (
|
|
26
|
+
BaseDeploymentAction,
|
|
27
|
+
BaseExportAction,
|
|
28
|
+
BaseInferenceAction,
|
|
29
|
+
BaseServeDeployment,
|
|
30
|
+
BaseTrainAction,
|
|
31
|
+
BaseUploadAction,
|
|
32
|
+
DeploymentContext,
|
|
33
|
+
DeploymentProgressCategories,
|
|
34
|
+
ExportContext,
|
|
35
|
+
ExportProgressCategories,
|
|
36
|
+
InferenceContext,
|
|
37
|
+
InferenceProgressCategories,
|
|
38
|
+
TrainContext,
|
|
39
|
+
TrainProgressCategories,
|
|
40
|
+
UploadContext,
|
|
41
|
+
UploadProgressCategories,
|
|
42
|
+
create_serve_multiplexed_model_id,
|
|
43
|
+
)
|
|
44
|
+
from synapse_sdk.plugins.config import ActionConfig, PluginConfig
|
|
45
|
+
from synapse_sdk.plugins.context import RuntimeContext
|
|
46
|
+
from synapse_sdk.plugins.decorators import action
|
|
47
|
+
from synapse_sdk.plugins.enums import PluginCategory
|
|
48
|
+
from synapse_sdk.plugins.errors import (
|
|
49
|
+
ActionNotFoundError,
|
|
50
|
+
ExecutionError,
|
|
51
|
+
PluginError,
|
|
52
|
+
ValidationError,
|
|
53
|
+
)
|
|
54
|
+
from synapse_sdk.plugins.runner import run_plugin
|
|
55
|
+
from synapse_sdk.plugins.schemas import (
|
|
56
|
+
ExportResult,
|
|
57
|
+
InferenceResult,
|
|
58
|
+
MetricsResult,
|
|
59
|
+
TrainResult,
|
|
60
|
+
UploadResult,
|
|
61
|
+
WeightsResult,
|
|
62
|
+
)
|
|
63
|
+
from synapse_sdk.plugins.steps import (
|
|
64
|
+
BaseStep,
|
|
65
|
+
BaseStepContext,
|
|
66
|
+
LoggingStep,
|
|
67
|
+
Orchestrator,
|
|
68
|
+
StepRegistry,
|
|
69
|
+
StepResult,
|
|
70
|
+
TimingStep,
|
|
71
|
+
ValidationStep,
|
|
72
|
+
)
|
|
73
|
+
from synapse_sdk.plugins.utils import get_action_ui_schema, pydantic_to_ui_schema
|
|
7
74
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
75
|
+
__all__ = [
|
|
76
|
+
# Types
|
|
77
|
+
'PluginCategory',
|
|
78
|
+
# Config
|
|
79
|
+
'ActionConfig',
|
|
80
|
+
'PluginConfig',
|
|
81
|
+
# Context
|
|
82
|
+
'RuntimeContext',
|
|
83
|
+
# Errors
|
|
84
|
+
'ActionNotFoundError',
|
|
85
|
+
'ExecutionError',
|
|
86
|
+
'PluginError',
|
|
87
|
+
'ValidationError',
|
|
88
|
+
# Actions - Base
|
|
89
|
+
'BaseAction',
|
|
90
|
+
'NoResult',
|
|
91
|
+
'validate_result',
|
|
92
|
+
'action',
|
|
93
|
+
# Actions - Train
|
|
94
|
+
'BaseTrainAction',
|
|
95
|
+
'TrainContext',
|
|
96
|
+
'TrainProgressCategories',
|
|
97
|
+
# Actions - Export
|
|
98
|
+
'BaseExportAction',
|
|
99
|
+
'ExportContext',
|
|
100
|
+
'ExportProgressCategories',
|
|
101
|
+
# Actions - Upload
|
|
102
|
+
'BaseUploadAction',
|
|
103
|
+
'UploadContext',
|
|
104
|
+
'UploadProgressCategories',
|
|
105
|
+
# Actions - Inference
|
|
106
|
+
'BaseInferenceAction',
|
|
107
|
+
'InferenceContext',
|
|
108
|
+
'InferenceProgressCategories',
|
|
109
|
+
# Actions - Deployment
|
|
110
|
+
'BaseDeploymentAction',
|
|
111
|
+
'DeploymentContext',
|
|
112
|
+
'DeploymentProgressCategories',
|
|
113
|
+
# Ray Serve
|
|
114
|
+
'BaseServeDeployment',
|
|
115
|
+
'create_serve_multiplexed_model_id',
|
|
116
|
+
# Pipeline Steps
|
|
117
|
+
'BaseStep',
|
|
118
|
+
'BaseStepContext',
|
|
119
|
+
'StepResult',
|
|
120
|
+
'StepRegistry',
|
|
121
|
+
'Orchestrator',
|
|
122
|
+
'LoggingStep',
|
|
123
|
+
'TimingStep',
|
|
124
|
+
'ValidationStep',
|
|
125
|
+
# Runner
|
|
126
|
+
'run_plugin',
|
|
127
|
+
# Schema utilities
|
|
128
|
+
'pydantic_to_ui_schema',
|
|
129
|
+
'get_action_ui_schema',
|
|
130
|
+
# Result types
|
|
131
|
+
'ExportResult',
|
|
132
|
+
'InferenceResult',
|
|
133
|
+
'MetricsResult',
|
|
134
|
+
'TrainResult',
|
|
135
|
+
'UploadResult',
|
|
136
|
+
'WeightsResult',
|
|
137
|
+
]
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from abc import ABC, abstractmethod
|
|
5
|
+
from typing import TYPE_CHECKING, Any, Generic, TypeVar, get_args, get_origin
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, ValidationError as PydanticValidationError
|
|
8
|
+
|
|
9
|
+
from synapse_sdk.plugins.enums import PluginCategory
|
|
10
|
+
from synapse_sdk.plugins.types import DataType
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from synapse_sdk.plugins.context import RuntimeContext
|
|
14
|
+
|
|
15
|
+
P = TypeVar('P', bound=BaseModel)
|
|
16
|
+
|
|
17
|
+
_logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class NoResult:
|
|
21
|
+
"""Sentinel indicating no result schema is defined.
|
|
22
|
+
|
|
23
|
+
Used as the default for result_model to indicate that an action
|
|
24
|
+
does not have a typed result schema.
|
|
25
|
+
|
|
26
|
+
Example:
|
|
27
|
+
>>> class MyAction(BaseAction[MyParams]):
|
|
28
|
+
... pass # result_model defaults to NoResult
|
|
29
|
+
>>>
|
|
30
|
+
>>> class TypedAction(BaseAction[MyParams]):
|
|
31
|
+
... result_model = MyResult # Explicitly set result schema
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
pass
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class BaseAction(ABC, Generic[P]):
|
|
38
|
+
"""Base class for plugin actions with typed params and optional result schema.
|
|
39
|
+
|
|
40
|
+
Supports typed input parameters via the generic parameter, and optional
|
|
41
|
+
typed output via the result_model class attribute.
|
|
42
|
+
|
|
43
|
+
Class Attributes:
|
|
44
|
+
action_name: Action name used for invocation (optional, from config.yaml).
|
|
45
|
+
category: Category for grouping actions (optional, from config.yaml).
|
|
46
|
+
input_type: DataType subclass declaring expected input (e.g., YOLODataset).
|
|
47
|
+
output_type: DataType subclass declaring produced output (e.g., ModelWeights).
|
|
48
|
+
params_model: Pydantic model class for input validation (auto-extracted from generic).
|
|
49
|
+
result_model: Pydantic model class for output validation (optional, defaults to NoResult).
|
|
50
|
+
|
|
51
|
+
Instance Attributes:
|
|
52
|
+
params: Pre-validated parameters (Pydantic model instance).
|
|
53
|
+
ctx: Runtime context with logger, env, etc.
|
|
54
|
+
|
|
55
|
+
Example (without result schema):
|
|
56
|
+
>>> class TrainParams(BaseModel):
|
|
57
|
+
... epochs: int = 10
|
|
58
|
+
>>>
|
|
59
|
+
>>> class TrainAction(BaseAction[TrainParams]):
|
|
60
|
+
... def execute(self) -> dict:
|
|
61
|
+
... return {'status': 'completed'}
|
|
62
|
+
|
|
63
|
+
Example (with type declarations):
|
|
64
|
+
>>> from synapse_sdk.plugins.types import YOLODataset, ModelWeights
|
|
65
|
+
>>>
|
|
66
|
+
>>> class TrainAction(BaseAction[TrainParams]):
|
|
67
|
+
... input_type = YOLODataset
|
|
68
|
+
... output_type = ModelWeights
|
|
69
|
+
... result_model = TrainResult
|
|
70
|
+
...
|
|
71
|
+
... def execute(self) -> TrainResult:
|
|
72
|
+
... return TrainResult(weights_path='/model.pt', final_loss=0.1)
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
# Optional: injected from config.yaml during discovery if not set
|
|
76
|
+
action_name: str | None = None
|
|
77
|
+
category: PluginCategory | None = None
|
|
78
|
+
|
|
79
|
+
# Semantic types for pipeline compatibility validation
|
|
80
|
+
# Use DataType subclasses for type-safe declarations
|
|
81
|
+
input_type: type[DataType] | None = None
|
|
82
|
+
output_type: type[DataType] | None = None
|
|
83
|
+
|
|
84
|
+
# Auto-extracted from generic parameter, can be overridden
|
|
85
|
+
params_model: type[P]
|
|
86
|
+
|
|
87
|
+
# Optional: set to a Pydantic model to enable result validation
|
|
88
|
+
result_model: type[BaseModel] | type[NoResult] = NoResult
|
|
89
|
+
|
|
90
|
+
def __init_subclass__(cls, **kwargs: Any) -> None:
|
|
91
|
+
"""Extract params_model from generic type parameter."""
|
|
92
|
+
super().__init_subclass__(**kwargs)
|
|
93
|
+
|
|
94
|
+
# Skip if params_model is explicitly set
|
|
95
|
+
if 'params_model' in cls.__dict__:
|
|
96
|
+
return
|
|
97
|
+
|
|
98
|
+
# Extract from generic parameter: BaseAction[TrainParams] -> TrainParams
|
|
99
|
+
for base in getattr(cls, '__orig_bases__', ()):
|
|
100
|
+
origin = get_origin(base)
|
|
101
|
+
if origin is None:
|
|
102
|
+
continue
|
|
103
|
+
|
|
104
|
+
# Check if this base is BaseAction or a subclass
|
|
105
|
+
if isinstance(origin, type) and issubclass(origin, BaseAction):
|
|
106
|
+
args = get_args(base)
|
|
107
|
+
if args and isinstance(args[0], type) and issubclass(args[0], BaseModel):
|
|
108
|
+
cls.params_model = args[0]
|
|
109
|
+
return
|
|
110
|
+
|
|
111
|
+
def __init__(self, params: P, ctx: RuntimeContext) -> None:
|
|
112
|
+
"""Initialize action with validated params and runtime context.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
params: Pre-validated Pydantic model instance.
|
|
116
|
+
ctx: Runtime context with logger, env, etc.
|
|
117
|
+
"""
|
|
118
|
+
self.params = params
|
|
119
|
+
self.ctx = ctx
|
|
120
|
+
|
|
121
|
+
@abstractmethod
|
|
122
|
+
def execute(self) -> Any:
|
|
123
|
+
"""Execute the action.
|
|
124
|
+
|
|
125
|
+
Implement this method with your action's main logic.
|
|
126
|
+
Use self.params for input and self.ctx for dependencies.
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
Action result (should be serializable).
|
|
130
|
+
|
|
131
|
+
Raises:
|
|
132
|
+
ExecutionError: If execution fails.
|
|
133
|
+
"""
|
|
134
|
+
...
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def logger(self):
|
|
138
|
+
"""Access the logger from context."""
|
|
139
|
+
return self.ctx.logger
|
|
140
|
+
|
|
141
|
+
def log(self, event: str, data: dict[str, Any], file: str | None = None) -> None:
|
|
142
|
+
"""Log an event with data.
|
|
143
|
+
|
|
144
|
+
Args:
|
|
145
|
+
event: Event name/type.
|
|
146
|
+
data: Dictionary of event data.
|
|
147
|
+
file: Optional file path associated with the event.
|
|
148
|
+
"""
|
|
149
|
+
self.ctx.log(event, data, file)
|
|
150
|
+
|
|
151
|
+
def set_progress(self, current: int, total: int, category: str | None = None) -> None:
|
|
152
|
+
"""Set progress for the current operation.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
current: Current progress value (0 to total).
|
|
156
|
+
total: Total progress value.
|
|
157
|
+
category: Optional category name for multi-phase progress.
|
|
158
|
+
"""
|
|
159
|
+
self.ctx.set_progress(current, total, category)
|
|
160
|
+
|
|
161
|
+
def set_metrics(self, value: dict[str, Any], category: str) -> None:
|
|
162
|
+
"""Set metrics for a category.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
value: Dictionary of metric values.
|
|
166
|
+
category: Non-empty category name.
|
|
167
|
+
"""
|
|
168
|
+
self.ctx.set_metrics(value, category)
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def validate_result(
|
|
172
|
+
result: Any,
|
|
173
|
+
result_model: type[BaseModel] | type[NoResult],
|
|
174
|
+
logger: Any = None,
|
|
175
|
+
) -> Any:
|
|
176
|
+
"""Validate action result against schema with warning-only mode.
|
|
177
|
+
|
|
178
|
+
This function validates the result returned by an action's execute() method
|
|
179
|
+
against its declared result_model schema. If validation fails, it logs a
|
|
180
|
+
warning but still returns the original result (warning-only mode).
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
result: The raw result from execute().
|
|
184
|
+
result_model: The expected Pydantic model, or NoResult to skip validation.
|
|
185
|
+
logger: Optional logger for warnings. Falls back to module logger if None.
|
|
186
|
+
|
|
187
|
+
Returns:
|
|
188
|
+
The original result (unchanged even if validation fails).
|
|
189
|
+
|
|
190
|
+
Example:
|
|
191
|
+
>>> class MyResult(BaseModel):
|
|
192
|
+
... value: int
|
|
193
|
+
>>>
|
|
194
|
+
>>> result = validate_result({'value': 42}, MyResult)
|
|
195
|
+
>>> # No warning, result passes validation
|
|
196
|
+
>>>
|
|
197
|
+
>>> result = validate_result({'wrong': 'data'}, MyResult)
|
|
198
|
+
>>> # Logs warning, returns {'wrong': 'data'} unchanged
|
|
199
|
+
"""
|
|
200
|
+
if result_model is NoResult:
|
|
201
|
+
return result
|
|
202
|
+
|
|
203
|
+
log = logger if logger else _logger
|
|
204
|
+
|
|
205
|
+
try:
|
|
206
|
+
# If result is already the correct model instance, it's valid
|
|
207
|
+
if isinstance(result, result_model):
|
|
208
|
+
return result
|
|
209
|
+
|
|
210
|
+
# If result is a dict, try to validate it against the model
|
|
211
|
+
if isinstance(result, dict):
|
|
212
|
+
result_model.model_validate(result)
|
|
213
|
+
else:
|
|
214
|
+
# Result is neither a model instance nor a dict
|
|
215
|
+
if hasattr(log, 'warning'):
|
|
216
|
+
log.warning(
|
|
217
|
+
f'Result type mismatch: expected {result_model.__name__} or dict, got {type(result).__name__}'
|
|
218
|
+
)
|
|
219
|
+
except PydanticValidationError as e:
|
|
220
|
+
if hasattr(log, 'warning'):
|
|
221
|
+
log.warning(f'Result validation warning for {result_model.__name__}: {e}')
|
|
222
|
+
except Exception as e:
|
|
223
|
+
if hasattr(log, 'warning'):
|
|
224
|
+
log.warning(f'Result validation failed: {e}')
|
|
225
|
+
|
|
226
|
+
return result
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
__all__ = ['BaseAction', 'NoResult', 'validate_result']
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"""Category-specific action base classes.
|
|
2
|
+
|
|
3
|
+
Provides specialized base classes for common action types:
|
|
4
|
+
- DatasetAction: Download and convert dataset workflows
|
|
5
|
+
- BaseTrainAction: Training workflows with dataset/model helpers
|
|
6
|
+
- BaseExportAction: Export workflows with filtered results
|
|
7
|
+
- BaseUploadAction: Upload workflows with step-based execution
|
|
8
|
+
- BaseInferenceAction: Inference workflows with model loading
|
|
9
|
+
- BaseDeploymentAction: Ray Serve deployment workflows
|
|
10
|
+
|
|
11
|
+
Each base class provides:
|
|
12
|
+
- Standard progress category names
|
|
13
|
+
- Helper methods with sensible defaults
|
|
14
|
+
- Override points for custom behavior
|
|
15
|
+
- Optional step-based workflow execution
|
|
16
|
+
|
|
17
|
+
For pipeline orchestration, use the pipelines module:
|
|
18
|
+
from synapse_sdk.plugins.pipelines import ActionPipeline
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from synapse_sdk.plugins.actions.dataset import (
|
|
22
|
+
DatasetAction,
|
|
23
|
+
DatasetOperation,
|
|
24
|
+
DatasetParams,
|
|
25
|
+
DatasetResult,
|
|
26
|
+
)
|
|
27
|
+
from synapse_sdk.plugins.actions.export import (
|
|
28
|
+
BaseExportAction,
|
|
29
|
+
ExportContext,
|
|
30
|
+
ExportProgressCategories,
|
|
31
|
+
)
|
|
32
|
+
from synapse_sdk.plugins.actions.inference import (
|
|
33
|
+
BaseDeploymentAction,
|
|
34
|
+
BaseInferenceAction,
|
|
35
|
+
BaseServeDeployment,
|
|
36
|
+
DeploymentContext,
|
|
37
|
+
DeploymentProgressCategories,
|
|
38
|
+
InferenceContext,
|
|
39
|
+
InferenceProgressCategories,
|
|
40
|
+
create_serve_multiplexed_model_id,
|
|
41
|
+
)
|
|
42
|
+
from synapse_sdk.plugins.actions.train import (
|
|
43
|
+
BaseTrainAction,
|
|
44
|
+
TrainContext,
|
|
45
|
+
TrainProgressCategories,
|
|
46
|
+
)
|
|
47
|
+
from synapse_sdk.plugins.actions.upload import (
|
|
48
|
+
BaseUploadAction,
|
|
49
|
+
UploadContext,
|
|
50
|
+
UploadProgressCategories,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
__all__ = [
|
|
54
|
+
# Dataset
|
|
55
|
+
'DatasetAction',
|
|
56
|
+
'DatasetOperation',
|
|
57
|
+
'DatasetParams',
|
|
58
|
+
'DatasetResult',
|
|
59
|
+
# Train
|
|
60
|
+
'BaseTrainAction',
|
|
61
|
+
'TrainContext',
|
|
62
|
+
'TrainProgressCategories',
|
|
63
|
+
# Export
|
|
64
|
+
'BaseExportAction',
|
|
65
|
+
'ExportContext',
|
|
66
|
+
'ExportProgressCategories',
|
|
67
|
+
# Upload
|
|
68
|
+
'BaseUploadAction',
|
|
69
|
+
'UploadContext',
|
|
70
|
+
'UploadProgressCategories',
|
|
71
|
+
# Inference
|
|
72
|
+
'BaseInferenceAction',
|
|
73
|
+
'InferenceContext',
|
|
74
|
+
'InferenceProgressCategories',
|
|
75
|
+
# Deployment
|
|
76
|
+
'BaseDeploymentAction',
|
|
77
|
+
'DeploymentContext',
|
|
78
|
+
'DeploymentProgressCategories',
|
|
79
|
+
# Serve
|
|
80
|
+
'BaseServeDeployment',
|
|
81
|
+
'create_serve_multiplexed_model_id',
|
|
82
|
+
]
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""Dataset actions for download and conversion workflows.
|
|
2
|
+
|
|
3
|
+
Provides a single DatasetAction that can perform either download or convert
|
|
4
|
+
operations based on the operation parameter. This allows for flexible
|
|
5
|
+
pipeline composition.
|
|
6
|
+
|
|
7
|
+
Example:
|
|
8
|
+
>>> from synapse_sdk.plugins.pipelines import ActionPipeline
|
|
9
|
+
>>> from synapse_sdk.plugins.actions.dataset import DatasetAction
|
|
10
|
+
>>>
|
|
11
|
+
>>> # Create a download -> convert pipeline
|
|
12
|
+
>>> pipeline = ActionPipeline([
|
|
13
|
+
... DatasetAction, # operation='download'
|
|
14
|
+
... DatasetAction, # operation='convert', uses path from download
|
|
15
|
+
... TrainAction,
|
|
16
|
+
... ])
|
|
17
|
+
>>>
|
|
18
|
+
>>> result = pipeline.execute({
|
|
19
|
+
... 'operation': 'download',
|
|
20
|
+
... 'dataset_id': 123,
|
|
21
|
+
... 'target_format': 'yolo', # for convert step
|
|
22
|
+
... }, ctx)
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from synapse_sdk.plugins.actions.dataset.action import (
|
|
26
|
+
DatasetAction,
|
|
27
|
+
DatasetOperation,
|
|
28
|
+
DatasetParams,
|
|
29
|
+
DatasetResult,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
__all__ = [
|
|
33
|
+
'DatasetAction',
|
|
34
|
+
'DatasetOperation',
|
|
35
|
+
'DatasetParams',
|
|
36
|
+
'DatasetResult',
|
|
37
|
+
]
|