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
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, Field
|
|
6
|
+
|
|
7
|
+
from synapse_sdk.plugins.enums import (
|
|
8
|
+
AnnotationCategory,
|
|
9
|
+
AnnotationType,
|
|
10
|
+
DataType,
|
|
11
|
+
PackageManager,
|
|
12
|
+
PluginCategory,
|
|
13
|
+
RunMethod,
|
|
14
|
+
SmartToolType,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ActionConfig(BaseModel):
|
|
19
|
+
"""Configuration for a single plugin action.
|
|
20
|
+
|
|
21
|
+
Attributes:
|
|
22
|
+
name: Action name (e.g., 'train', 'infer', 'export').
|
|
23
|
+
description: Human-readable description of the action.
|
|
24
|
+
entrypoint: Module path to action class (e.g., 'my_plugin.actions:TrainAction').
|
|
25
|
+
method: Execution method (job, task, or serve).
|
|
26
|
+
params_schema: Pydantic model class for parameter validation.
|
|
27
|
+
input_type: Semantic input type (e.g., 'yolo_dataset'). Auto-synced from code.
|
|
28
|
+
output_type: Semantic output type (e.g., 'model_weights'). Auto-synced from code.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
name: str
|
|
32
|
+
description: str = ''
|
|
33
|
+
entrypoint: str = ''
|
|
34
|
+
method: RunMethod = RunMethod.TASK
|
|
35
|
+
params_schema: type[BaseModel] | None = None
|
|
36
|
+
|
|
37
|
+
# Semantic types for pipeline compatibility (auto-synced from action class)
|
|
38
|
+
input_type: str | None = None
|
|
39
|
+
output_type: str | None = None
|
|
40
|
+
|
|
41
|
+
model_config = {'arbitrary_types_allowed': True}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class PluginConfig(BaseModel):
|
|
45
|
+
"""Configuration for a plugin.
|
|
46
|
+
|
|
47
|
+
Attributes:
|
|
48
|
+
name: Human-readable plugin name.
|
|
49
|
+
code: Unique identifier for the plugin (e.g., 'yolov8').
|
|
50
|
+
version: Semantic version string.
|
|
51
|
+
category: Plugin category for organization.
|
|
52
|
+
description: Human-readable description.
|
|
53
|
+
readme: Path to README file relative to plugin root.
|
|
54
|
+
package_manager: Package manager for dependencies ('pip' or 'uv').
|
|
55
|
+
package_manager_options: Additional options for package manager.
|
|
56
|
+
wheels_dir: Directory containing .whl files for local installation (default: 'wheels').
|
|
57
|
+
env: Environment variables to inject into runtime environment.
|
|
58
|
+
runtime_env: Full Ray runtime_env configuration (merged with auto-generated settings).
|
|
59
|
+
data_type: Primary data type handled by the plugin.
|
|
60
|
+
tasks: List of tasks in format 'data_type.task_name' (e.g., 'image.object_detection').
|
|
61
|
+
supported_data_type: Data types supported by upload plugins.
|
|
62
|
+
annotation_category: Annotation category for smart tools.
|
|
63
|
+
annotation_type: Annotation type for smart tools.
|
|
64
|
+
smart_tool: Smart tool implementation type.
|
|
65
|
+
actions: Dictionary of action name to ActionConfig.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
name: str
|
|
69
|
+
code: str
|
|
70
|
+
version: str = '0.1.0'
|
|
71
|
+
category: PluginCategory = PluginCategory.CUSTOM
|
|
72
|
+
description: str = ''
|
|
73
|
+
readme: str = 'README.md'
|
|
74
|
+
|
|
75
|
+
# Package management
|
|
76
|
+
package_manager: PackageManager = PackageManager.PIP
|
|
77
|
+
package_manager_options: list[str] = Field(default_factory=list)
|
|
78
|
+
wheels_dir: str = 'wheels'
|
|
79
|
+
|
|
80
|
+
# Runtime environment
|
|
81
|
+
env: dict[str, Any] = Field(default_factory=dict)
|
|
82
|
+
runtime_env: dict[str, Any] = Field(default_factory=dict)
|
|
83
|
+
|
|
84
|
+
# Data type configuration
|
|
85
|
+
data_type: DataType | None = None
|
|
86
|
+
tasks: list[str] = Field(default_factory=list)
|
|
87
|
+
supported_data_type: list[DataType] = Field(default_factory=list)
|
|
88
|
+
|
|
89
|
+
# Smart tool configuration
|
|
90
|
+
annotation_category: AnnotationCategory | None = None
|
|
91
|
+
annotation_type: AnnotationType | None = None
|
|
92
|
+
smart_tool: SmartToolType | None = None
|
|
93
|
+
|
|
94
|
+
# Actions
|
|
95
|
+
actions: dict[str, ActionConfig] = Field(default_factory=dict)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
__all__ = ['ActionConfig', 'PluginConfig']
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import TYPE_CHECKING, Any
|
|
5
|
+
|
|
6
|
+
from synapse_sdk.plugins.context.env import PluginEnvironment
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from synapse_sdk.clients.agent import AgentClient
|
|
10
|
+
from synapse_sdk.clients.backend import BackendClient
|
|
11
|
+
from synapse_sdk.loggers import BaseLogger
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class RuntimeContext:
|
|
16
|
+
"""Runtime context injected into actions.
|
|
17
|
+
|
|
18
|
+
Provides access to logging, environment, and client dependencies.
|
|
19
|
+
All action dependencies are accessed through this context object.
|
|
20
|
+
|
|
21
|
+
Attributes:
|
|
22
|
+
logger: Logger instance for progress, metrics, and event logging.
|
|
23
|
+
env: Environment variables and configuration as PluginEnvironment.
|
|
24
|
+
job_id: Optional job identifier for tracking.
|
|
25
|
+
client: Optional backend client for API access.
|
|
26
|
+
agent_client: Optional agent client for Ray operations.
|
|
27
|
+
checkpoint: Optional checkpoint info for pretrained models.
|
|
28
|
+
Contains 'category' ('base' or fine-tuned) and 'path' to model.
|
|
29
|
+
|
|
30
|
+
Example:
|
|
31
|
+
>>> ctx = RuntimeContext(
|
|
32
|
+
... logger=ConsoleLogger(),
|
|
33
|
+
... env=PluginEnvironment.from_environ(),
|
|
34
|
+
... job_id='job-123',
|
|
35
|
+
... checkpoint={'category': 'base', 'path': '/models/yolov8n.pt'},
|
|
36
|
+
... )
|
|
37
|
+
>>> ctx.set_progress(50, 100)
|
|
38
|
+
>>> ctx.log('checkpoint', {'epoch': 5})
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
logger: BaseLogger
|
|
42
|
+
env: PluginEnvironment
|
|
43
|
+
job_id: str | None = None
|
|
44
|
+
client: BackendClient | None = None
|
|
45
|
+
agent_client: AgentClient | None = None
|
|
46
|
+
checkpoint: dict[str, Any] | None = None
|
|
47
|
+
|
|
48
|
+
def log(self, event: str, data: dict[str, Any], file: str | None = None) -> None:
|
|
49
|
+
"""Log an event with data.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
event: Event name/type.
|
|
53
|
+
data: Dictionary of event data.
|
|
54
|
+
file: Optional file path associated with the event.
|
|
55
|
+
"""
|
|
56
|
+
from synapse_sdk.plugins.models.logger import LogLevel
|
|
57
|
+
|
|
58
|
+
self.logger.log(LogLevel.INFO, event, data, file)
|
|
59
|
+
|
|
60
|
+
def set_progress(self, current: int, total: int, category: str | None = None) -> None:
|
|
61
|
+
"""Set progress for the current operation.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
current: Current progress value (0 to total).
|
|
65
|
+
total: Total progress value.
|
|
66
|
+
category: Optional category name for multi-phase progress.
|
|
67
|
+
"""
|
|
68
|
+
self.logger.set_progress(current, total, category)
|
|
69
|
+
|
|
70
|
+
def set_metrics(self, value: dict[str, Any], category: str) -> None:
|
|
71
|
+
"""Set metrics for a category.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
value: Dictionary of metric values.
|
|
75
|
+
category: Non-empty category name.
|
|
76
|
+
"""
|
|
77
|
+
self.logger.set_metrics(value, category)
|
|
78
|
+
|
|
79
|
+
def log_message(self, message: str, context: str = 'info') -> None:
|
|
80
|
+
"""Log a user-facing message.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
message: Message content.
|
|
84
|
+
context: Message context/level ('info', 'warning', 'danger', 'success').
|
|
85
|
+
"""
|
|
86
|
+
from synapse_sdk.plugins.models.logger import LogLevel
|
|
87
|
+
|
|
88
|
+
self.logger.log(LogLevel.INFO, 'message', {'context': context, 'content': message})
|
|
89
|
+
|
|
90
|
+
def log_dev_event(self, message: str, data: dict[str, Any] | None = None) -> None:
|
|
91
|
+
"""Log a development/debug event.
|
|
92
|
+
|
|
93
|
+
For plugin developers to log custom events during execution.
|
|
94
|
+
Not shown to end users by default.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
message: Event message.
|
|
98
|
+
data: Optional additional data.
|
|
99
|
+
"""
|
|
100
|
+
from synapse_sdk.plugins.models.logger import LogLevel
|
|
101
|
+
|
|
102
|
+
self.logger.log(LogLevel.DEBUG, 'dev_event', {'message': message, 'data': data})
|
|
103
|
+
|
|
104
|
+
def end_log(self) -> None:
|
|
105
|
+
"""Signal that plugin execution is complete."""
|
|
106
|
+
self.log_message('Plugin run is complete.')
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
__all__ = ['PluginEnvironment', 'RuntimeContext']
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import tomllib
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class PluginEnvironment:
|
|
10
|
+
"""Environment configuration for plugin execution.
|
|
11
|
+
|
|
12
|
+
Auto-loads from:
|
|
13
|
+
1. os.environ (lowest priority)
|
|
14
|
+
2. Config file if provided (highest priority)
|
|
15
|
+
|
|
16
|
+
Example:
|
|
17
|
+
>>> env = PluginEnvironment.from_environ()
|
|
18
|
+
>>> env.get_str('API_KEY')
|
|
19
|
+
>>> env.get_int('BATCH_SIZE', default=32)
|
|
20
|
+
>>> env.get_bool('DEBUG', default=False)
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def __init__(self, data: dict[str, Any] | None = None) -> None:
|
|
24
|
+
self._data: dict[str, Any] = data or {}
|
|
25
|
+
|
|
26
|
+
@classmethod
|
|
27
|
+
def from_environ(cls, prefix: str = '') -> PluginEnvironment:
|
|
28
|
+
"""Load from os.environ, optionally filtering by prefix."""
|
|
29
|
+
data = {}
|
|
30
|
+
for key, value in os.environ.items():
|
|
31
|
+
if prefix and not key.startswith(prefix):
|
|
32
|
+
continue
|
|
33
|
+
clean_key = key[len(prefix) :] if prefix else key
|
|
34
|
+
data[clean_key] = value
|
|
35
|
+
return cls(data)
|
|
36
|
+
|
|
37
|
+
@classmethod
|
|
38
|
+
def from_file(cls, path: str | Path) -> PluginEnvironment:
|
|
39
|
+
"""Load from TOML config file."""
|
|
40
|
+
path = Path(path)
|
|
41
|
+
if not path.exists():
|
|
42
|
+
raise FileNotFoundError(f'Config file not found: {path}')
|
|
43
|
+
with path.open('rb') as f:
|
|
44
|
+
data = tomllib.load(f)
|
|
45
|
+
return cls(data)
|
|
46
|
+
|
|
47
|
+
@classmethod
|
|
48
|
+
def merge(cls, *envs: PluginEnvironment) -> PluginEnvironment:
|
|
49
|
+
"""Merge multiple environments (later overrides earlier)."""
|
|
50
|
+
merged: dict[str, Any] = {}
|
|
51
|
+
for env in envs:
|
|
52
|
+
merged.update(env._data)
|
|
53
|
+
return cls(merged)
|
|
54
|
+
|
|
55
|
+
def get(self, key: str, default: Any = None) -> Any:
|
|
56
|
+
"""Get raw value."""
|
|
57
|
+
return self._data.get(key, default)
|
|
58
|
+
|
|
59
|
+
def get_str(self, key: str, default: str | None = None) -> str | None:
|
|
60
|
+
"""Get string value."""
|
|
61
|
+
val = self._data.get(key)
|
|
62
|
+
if val is None:
|
|
63
|
+
return default
|
|
64
|
+
return str(val)
|
|
65
|
+
|
|
66
|
+
def get_int(self, key: str, default: int | None = None) -> int | None:
|
|
67
|
+
"""Get integer value."""
|
|
68
|
+
val = self._data.get(key)
|
|
69
|
+
if val is None:
|
|
70
|
+
return default
|
|
71
|
+
return int(val)
|
|
72
|
+
|
|
73
|
+
def get_float(self, key: str, default: float | None = None) -> float | None:
|
|
74
|
+
"""Get float value."""
|
|
75
|
+
val = self._data.get(key)
|
|
76
|
+
if val is None:
|
|
77
|
+
return default
|
|
78
|
+
return float(val)
|
|
79
|
+
|
|
80
|
+
def get_bool(self, key: str, default: bool | None = None) -> bool | None:
|
|
81
|
+
"""Get boolean value (handles string 'true'/'false')."""
|
|
82
|
+
val = self._data.get(key)
|
|
83
|
+
if val is None:
|
|
84
|
+
return default
|
|
85
|
+
if isinstance(val, bool):
|
|
86
|
+
return val
|
|
87
|
+
if isinstance(val, str):
|
|
88
|
+
return val.lower() in ('true', '1', 'yes')
|
|
89
|
+
return bool(val)
|
|
90
|
+
|
|
91
|
+
def get_list(self, key: str, default: list | None = None) -> list | None:
|
|
92
|
+
"""Get list value (splits comma-separated strings)."""
|
|
93
|
+
val = self._data.get(key)
|
|
94
|
+
if val is None:
|
|
95
|
+
return default
|
|
96
|
+
if isinstance(val, list):
|
|
97
|
+
return val
|
|
98
|
+
if isinstance(val, str):
|
|
99
|
+
return [s.strip() for s in val.split(',') if s.strip()]
|
|
100
|
+
return default
|
|
101
|
+
|
|
102
|
+
def to_dict(self) -> dict[str, Any]:
|
|
103
|
+
"""Export as dictionary."""
|
|
104
|
+
return dict(self._data)
|
|
105
|
+
|
|
106
|
+
def __contains__(self, key: str) -> bool:
|
|
107
|
+
return key in self._data
|
|
108
|
+
|
|
109
|
+
def __getitem__(self, key: str) -> Any:
|
|
110
|
+
return self._data[key]
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
__all__ = ['PluginEnvironment']
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"""Dataset formats and converters.
|
|
2
|
+
|
|
3
|
+
This module provides:
|
|
4
|
+
- Pydantic models for dataset formats (Datamaker v1/v2, YOLO)
|
|
5
|
+
- Bidirectional converters between formats
|
|
6
|
+
|
|
7
|
+
For dataset download and conversion workflows, use DatasetAction:
|
|
8
|
+
from synapse_sdk.plugins.actions import DatasetAction, DatasetParams
|
|
9
|
+
|
|
10
|
+
For pipeline orchestration:
|
|
11
|
+
from synapse_sdk.plugins.pipelines import ActionPipeline
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
>>> from synapse_sdk.plugins.datasets import (
|
|
15
|
+
... DatasetFormat,
|
|
16
|
+
... FromDMToYOLOConverter,
|
|
17
|
+
... DMVersion,
|
|
18
|
+
... )
|
|
19
|
+
>>> from synapse_sdk.plugins.actions import DatasetAction
|
|
20
|
+
>>> from synapse_sdk.plugins.pipelines import ActionPipeline
|
|
21
|
+
>>>
|
|
22
|
+
>>> # Pipeline: Download | Convert | Train
|
|
23
|
+
>>> pipeline = ActionPipeline([DatasetAction, DatasetAction, TrainAction])
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
from synapse_sdk.plugins.datasets.converters import (
|
|
29
|
+
BaseConverter,
|
|
30
|
+
DatasetFormat,
|
|
31
|
+
FromDMConverter,
|
|
32
|
+
FromDMToYOLOConverter,
|
|
33
|
+
ToDMConverter,
|
|
34
|
+
YOLOToDMConverter,
|
|
35
|
+
get_converter,
|
|
36
|
+
)
|
|
37
|
+
from synapse_sdk.plugins.datasets.formats import (
|
|
38
|
+
# DM Shared
|
|
39
|
+
DMAttribute,
|
|
40
|
+
# DM Aliases (V2)
|
|
41
|
+
DMBoundingBox,
|
|
42
|
+
DMDataset,
|
|
43
|
+
DMGroup,
|
|
44
|
+
DMImageItem,
|
|
45
|
+
DMKeypoint,
|
|
46
|
+
DMPolygon,
|
|
47
|
+
DMPolyline,
|
|
48
|
+
DMRelation,
|
|
49
|
+
# DM V1
|
|
50
|
+
DMv1AnnotationBase,
|
|
51
|
+
DMv1Classification,
|
|
52
|
+
DMv1Dataset,
|
|
53
|
+
# DM V2
|
|
54
|
+
DMv2BoundingBox,
|
|
55
|
+
DMv2Dataset,
|
|
56
|
+
DMv2Group,
|
|
57
|
+
DMv2ImageItem,
|
|
58
|
+
DMv2Keypoint,
|
|
59
|
+
DMv2Polygon,
|
|
60
|
+
DMv2Polyline,
|
|
61
|
+
DMv2Relation,
|
|
62
|
+
# DM Version
|
|
63
|
+
DMVersion,
|
|
64
|
+
# YOLO
|
|
65
|
+
YOLOAnnotation,
|
|
66
|
+
YOLODataset,
|
|
67
|
+
YOLODatasetConfig,
|
|
68
|
+
YOLOImage,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
__all__ = [
|
|
72
|
+
# DM Version
|
|
73
|
+
'DMVersion',
|
|
74
|
+
# DM Shared
|
|
75
|
+
'DMAttribute',
|
|
76
|
+
# DM V1
|
|
77
|
+
'DMv1AnnotationBase',
|
|
78
|
+
'DMv1Classification',
|
|
79
|
+
'DMv1Dataset',
|
|
80
|
+
# DM V2
|
|
81
|
+
'DMv2BoundingBox',
|
|
82
|
+
'DMv2Dataset',
|
|
83
|
+
'DMv2ImageItem',
|
|
84
|
+
'DMv2Keypoint',
|
|
85
|
+
'DMv2Polygon',
|
|
86
|
+
'DMv2Polyline',
|
|
87
|
+
'DMv2Relation',
|
|
88
|
+
'DMv2Group',
|
|
89
|
+
# DM Aliases (V2 default)
|
|
90
|
+
'DMBoundingBox',
|
|
91
|
+
'DMDataset',
|
|
92
|
+
'DMGroup',
|
|
93
|
+
'DMImageItem',
|
|
94
|
+
'DMKeypoint',
|
|
95
|
+
'DMPolygon',
|
|
96
|
+
'DMPolyline',
|
|
97
|
+
'DMRelation',
|
|
98
|
+
# YOLO Formats
|
|
99
|
+
'YOLOAnnotation',
|
|
100
|
+
'YOLODataset',
|
|
101
|
+
'YOLODatasetConfig',
|
|
102
|
+
'YOLOImage',
|
|
103
|
+
# Converters - Base
|
|
104
|
+
'BaseConverter',
|
|
105
|
+
'DatasetFormat',
|
|
106
|
+
'FromDMConverter',
|
|
107
|
+
'ToDMConverter',
|
|
108
|
+
# Converters - YOLO
|
|
109
|
+
'FromDMToYOLOConverter',
|
|
110
|
+
'YOLOToDMConverter',
|
|
111
|
+
# Converter factory
|
|
112
|
+
'get_converter',
|
|
113
|
+
]
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""Dataset format converters.
|
|
2
|
+
|
|
3
|
+
Structure:
|
|
4
|
+
- base.py: BaseConverter, FromDMConverter, ToDMConverter
|
|
5
|
+
- yolo/: YOLO format converters
|
|
6
|
+
- from_dm.py: DM -> YOLO
|
|
7
|
+
- to_dm.py: YOLO -> DM
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from synapse_sdk.plugins.datasets.converters.base import (
|
|
11
|
+
BaseConverter,
|
|
12
|
+
DatasetFormat,
|
|
13
|
+
FromDMConverter,
|
|
14
|
+
ToDMConverter,
|
|
15
|
+
)
|
|
16
|
+
from synapse_sdk.plugins.datasets.converters.yolo import (
|
|
17
|
+
FromDMToYOLOConverter,
|
|
18
|
+
YOLOToDMConverter,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def get_converter(
|
|
23
|
+
source: DatasetFormat | str,
|
|
24
|
+
target: DatasetFormat | str,
|
|
25
|
+
**kwargs,
|
|
26
|
+
) -> BaseConverter:
|
|
27
|
+
"""Get converter for source -> target format conversion.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
source: Source dataset format.
|
|
31
|
+
target: Target dataset format.
|
|
32
|
+
**kwargs: Additional arguments passed to converter constructor.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
Converter instance.
|
|
36
|
+
|
|
37
|
+
Raises:
|
|
38
|
+
ValueError: If no converter exists for the format pair.
|
|
39
|
+
|
|
40
|
+
Example:
|
|
41
|
+
>>> converter = get_converter('dm_v2', 'yolo', is_categorized=True)
|
|
42
|
+
>>> converter.convert()
|
|
43
|
+
>>> converter.save_to_folder('/output')
|
|
44
|
+
"""
|
|
45
|
+
source = DatasetFormat(source)
|
|
46
|
+
target = DatasetFormat(target)
|
|
47
|
+
|
|
48
|
+
# Map format pairs to converter classes
|
|
49
|
+
converters: dict[tuple[DatasetFormat, DatasetFormat], type[BaseConverter]] = {
|
|
50
|
+
# DM -> YOLO
|
|
51
|
+
(DatasetFormat.DM_V1, DatasetFormat.YOLO): FromDMToYOLOConverter,
|
|
52
|
+
(DatasetFormat.DM_V2, DatasetFormat.YOLO): FromDMToYOLOConverter,
|
|
53
|
+
# YOLO -> DM
|
|
54
|
+
(DatasetFormat.YOLO, DatasetFormat.DM_V1): YOLOToDMConverter,
|
|
55
|
+
(DatasetFormat.YOLO, DatasetFormat.DM_V2): YOLOToDMConverter,
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
converter_cls = converters.get((source, target))
|
|
59
|
+
if converter_cls is None:
|
|
60
|
+
raise ValueError(f'No converter available for {source} -> {target}')
|
|
61
|
+
|
|
62
|
+
return converter_cls(**kwargs)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
__all__ = [
|
|
66
|
+
# Base classes
|
|
67
|
+
'BaseConverter',
|
|
68
|
+
'DatasetFormat',
|
|
69
|
+
'FromDMConverter',
|
|
70
|
+
'ToDMConverter',
|
|
71
|
+
# YOLO converters
|
|
72
|
+
'FromDMToYOLOConverter',
|
|
73
|
+
'YOLOToDMConverter',
|
|
74
|
+
# Factory
|
|
75
|
+
'get_converter',
|
|
76
|
+
]
|