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.

Files changed (261) hide show
  1. synapse_sdk/__init__.py +24 -0
  2. synapse_sdk/cli/__init__.py +9 -8
  3. synapse_sdk/cli/agent/__init__.py +25 -0
  4. synapse_sdk/cli/agent/config.py +104 -0
  5. synapse_sdk/cli/agent/select.py +197 -0
  6. synapse_sdk/cli/auth.py +104 -0
  7. synapse_sdk/cli/main.py +1025 -0
  8. synapse_sdk/cli/plugin/__init__.py +58 -0
  9. synapse_sdk/cli/plugin/create.py +566 -0
  10. synapse_sdk/cli/plugin/job.py +196 -0
  11. synapse_sdk/cli/plugin/publish.py +322 -0
  12. synapse_sdk/cli/plugin/run.py +131 -0
  13. synapse_sdk/cli/plugin/test.py +200 -0
  14. synapse_sdk/clients/README.md +239 -0
  15. synapse_sdk/clients/__init__.py +5 -0
  16. synapse_sdk/clients/_template.py +266 -0
  17. synapse_sdk/clients/agent/__init__.py +84 -29
  18. synapse_sdk/clients/agent/async_ray.py +289 -0
  19. synapse_sdk/clients/agent/container.py +83 -0
  20. synapse_sdk/clients/agent/plugin.py +101 -0
  21. synapse_sdk/clients/agent/ray.py +296 -39
  22. synapse_sdk/clients/backend/__init__.py +152 -12
  23. synapse_sdk/clients/backend/annotation.py +164 -22
  24. synapse_sdk/clients/backend/core.py +101 -0
  25. synapse_sdk/clients/backend/data_collection.py +292 -0
  26. synapse_sdk/clients/backend/hitl.py +87 -0
  27. synapse_sdk/clients/backend/integration.py +374 -46
  28. synapse_sdk/clients/backend/ml.py +134 -22
  29. synapse_sdk/clients/backend/models.py +247 -0
  30. synapse_sdk/clients/base.py +538 -59
  31. synapse_sdk/clients/exceptions.py +35 -7
  32. synapse_sdk/clients/pipeline/__init__.py +5 -0
  33. synapse_sdk/clients/pipeline/client.py +636 -0
  34. synapse_sdk/clients/protocols.py +178 -0
  35. synapse_sdk/clients/utils.py +86 -8
  36. synapse_sdk/clients/validation.py +58 -0
  37. synapse_sdk/enums.py +76 -0
  38. synapse_sdk/exceptions.py +168 -0
  39. synapse_sdk/integrations/__init__.py +74 -0
  40. synapse_sdk/integrations/_base.py +119 -0
  41. synapse_sdk/integrations/_context.py +53 -0
  42. synapse_sdk/integrations/ultralytics/__init__.py +78 -0
  43. synapse_sdk/integrations/ultralytics/_callbacks.py +126 -0
  44. synapse_sdk/integrations/ultralytics/_patches.py +124 -0
  45. synapse_sdk/loggers.py +476 -95
  46. synapse_sdk/mcp/MCP.md +69 -0
  47. synapse_sdk/mcp/__init__.py +48 -0
  48. synapse_sdk/mcp/__main__.py +6 -0
  49. synapse_sdk/mcp/config.py +349 -0
  50. synapse_sdk/mcp/prompts/__init__.py +4 -0
  51. synapse_sdk/mcp/resources/__init__.py +4 -0
  52. synapse_sdk/mcp/server.py +1352 -0
  53. synapse_sdk/mcp/tools/__init__.py +6 -0
  54. synapse_sdk/plugins/__init__.py +133 -9
  55. synapse_sdk/plugins/action.py +229 -0
  56. synapse_sdk/plugins/actions/__init__.py +82 -0
  57. synapse_sdk/plugins/actions/dataset/__init__.py +37 -0
  58. synapse_sdk/plugins/actions/dataset/action.py +471 -0
  59. synapse_sdk/plugins/actions/export/__init__.py +55 -0
  60. synapse_sdk/plugins/actions/export/action.py +183 -0
  61. synapse_sdk/plugins/actions/export/context.py +59 -0
  62. synapse_sdk/plugins/actions/inference/__init__.py +84 -0
  63. synapse_sdk/plugins/actions/inference/action.py +285 -0
  64. synapse_sdk/plugins/actions/inference/context.py +81 -0
  65. synapse_sdk/plugins/actions/inference/deployment.py +322 -0
  66. synapse_sdk/plugins/actions/inference/serve.py +252 -0
  67. synapse_sdk/plugins/actions/train/__init__.py +54 -0
  68. synapse_sdk/plugins/actions/train/action.py +326 -0
  69. synapse_sdk/plugins/actions/train/context.py +57 -0
  70. synapse_sdk/plugins/actions/upload/__init__.py +49 -0
  71. synapse_sdk/plugins/actions/upload/action.py +165 -0
  72. synapse_sdk/plugins/actions/upload/context.py +61 -0
  73. synapse_sdk/plugins/config.py +98 -0
  74. synapse_sdk/plugins/context/__init__.py +109 -0
  75. synapse_sdk/plugins/context/env.py +113 -0
  76. synapse_sdk/plugins/datasets/__init__.py +113 -0
  77. synapse_sdk/plugins/datasets/converters/__init__.py +76 -0
  78. synapse_sdk/plugins/datasets/converters/base.py +347 -0
  79. synapse_sdk/plugins/datasets/converters/yolo/__init__.py +9 -0
  80. synapse_sdk/plugins/datasets/converters/yolo/from_dm.py +468 -0
  81. synapse_sdk/plugins/datasets/converters/yolo/to_dm.py +381 -0
  82. synapse_sdk/plugins/datasets/formats/__init__.py +82 -0
  83. synapse_sdk/plugins/datasets/formats/dm.py +351 -0
  84. synapse_sdk/plugins/datasets/formats/yolo.py +240 -0
  85. synapse_sdk/plugins/decorators.py +83 -0
  86. synapse_sdk/plugins/discovery.py +790 -0
  87. synapse_sdk/plugins/docs/ACTION_DEV_GUIDE.md +933 -0
  88. synapse_sdk/plugins/docs/ARCHITECTURE.md +1225 -0
  89. synapse_sdk/plugins/docs/LOGGING_SYSTEM.md +683 -0
  90. synapse_sdk/plugins/docs/OVERVIEW.md +531 -0
  91. synapse_sdk/plugins/docs/PIPELINE_GUIDE.md +145 -0
  92. synapse_sdk/plugins/docs/README.md +513 -0
  93. synapse_sdk/plugins/docs/STEP.md +656 -0
  94. synapse_sdk/plugins/enums.py +70 -10
  95. synapse_sdk/plugins/errors.py +92 -0
  96. synapse_sdk/plugins/executors/__init__.py +43 -0
  97. synapse_sdk/plugins/executors/local.py +99 -0
  98. synapse_sdk/plugins/executors/ray/__init__.py +18 -0
  99. synapse_sdk/plugins/executors/ray/base.py +282 -0
  100. synapse_sdk/plugins/executors/ray/job.py +298 -0
  101. synapse_sdk/plugins/executors/ray/jobs_api.py +511 -0
  102. synapse_sdk/plugins/executors/ray/packaging.py +137 -0
  103. synapse_sdk/plugins/executors/ray/pipeline.py +792 -0
  104. synapse_sdk/plugins/executors/ray/task.py +257 -0
  105. synapse_sdk/plugins/models/__init__.py +26 -0
  106. synapse_sdk/plugins/models/logger.py +173 -0
  107. synapse_sdk/plugins/models/pipeline.py +25 -0
  108. synapse_sdk/plugins/pipelines/__init__.py +81 -0
  109. synapse_sdk/plugins/pipelines/action_pipeline.py +417 -0
  110. synapse_sdk/plugins/pipelines/context.py +107 -0
  111. synapse_sdk/plugins/pipelines/display.py +311 -0
  112. synapse_sdk/plugins/runner.py +114 -0
  113. synapse_sdk/plugins/schemas/__init__.py +19 -0
  114. synapse_sdk/plugins/schemas/results.py +152 -0
  115. synapse_sdk/plugins/steps/__init__.py +63 -0
  116. synapse_sdk/plugins/steps/base.py +128 -0
  117. synapse_sdk/plugins/steps/context.py +90 -0
  118. synapse_sdk/plugins/steps/orchestrator.py +128 -0
  119. synapse_sdk/plugins/steps/registry.py +103 -0
  120. synapse_sdk/plugins/steps/utils/__init__.py +20 -0
  121. synapse_sdk/plugins/steps/utils/logging.py +85 -0
  122. synapse_sdk/plugins/steps/utils/timing.py +71 -0
  123. synapse_sdk/plugins/steps/utils/validation.py +68 -0
  124. synapse_sdk/plugins/templates/__init__.py +50 -0
  125. synapse_sdk/plugins/templates/base/.gitignore.j2 +26 -0
  126. synapse_sdk/plugins/templates/base/.synapseignore.j2 +11 -0
  127. synapse_sdk/plugins/templates/base/README.md.j2 +26 -0
  128. synapse_sdk/plugins/templates/base/plugin/__init__.py.j2 +1 -0
  129. synapse_sdk/plugins/templates/base/pyproject.toml.j2 +14 -0
  130. synapse_sdk/plugins/templates/base/requirements.txt.j2 +1 -0
  131. synapse_sdk/plugins/templates/custom/plugin/main.py.j2 +18 -0
  132. synapse_sdk/plugins/templates/data_validation/plugin/validate.py.j2 +32 -0
  133. synapse_sdk/plugins/templates/export/plugin/export.py.j2 +36 -0
  134. synapse_sdk/plugins/templates/neural_net/plugin/inference.py.j2 +36 -0
  135. synapse_sdk/plugins/templates/neural_net/plugin/train.py.j2 +33 -0
  136. synapse_sdk/plugins/templates/post_annotation/plugin/post_annotate.py.j2 +32 -0
  137. synapse_sdk/plugins/templates/pre_annotation/plugin/pre_annotate.py.j2 +32 -0
  138. synapse_sdk/plugins/templates/smart_tool/plugin/auto_label.py.j2 +44 -0
  139. synapse_sdk/plugins/templates/upload/plugin/upload.py.j2 +35 -0
  140. synapse_sdk/plugins/testing/__init__.py +25 -0
  141. synapse_sdk/plugins/testing/sample_actions.py +98 -0
  142. synapse_sdk/plugins/types.py +206 -0
  143. synapse_sdk/plugins/upload.py +595 -64
  144. synapse_sdk/plugins/utils.py +325 -37
  145. synapse_sdk/shared/__init__.py +25 -0
  146. synapse_sdk/utils/__init__.py +1 -0
  147. synapse_sdk/utils/auth.py +74 -0
  148. synapse_sdk/utils/file/__init__.py +58 -0
  149. synapse_sdk/utils/file/archive.py +449 -0
  150. synapse_sdk/utils/file/checksum.py +167 -0
  151. synapse_sdk/utils/file/download.py +286 -0
  152. synapse_sdk/utils/file/io.py +129 -0
  153. synapse_sdk/utils/file/requirements.py +36 -0
  154. synapse_sdk/utils/network.py +168 -0
  155. synapse_sdk/utils/storage/__init__.py +238 -0
  156. synapse_sdk/utils/storage/config.py +188 -0
  157. synapse_sdk/utils/storage/errors.py +52 -0
  158. synapse_sdk/utils/storage/providers/__init__.py +13 -0
  159. synapse_sdk/utils/storage/providers/base.py +76 -0
  160. synapse_sdk/utils/storage/providers/gcs.py +168 -0
  161. synapse_sdk/utils/storage/providers/http.py +250 -0
  162. synapse_sdk/utils/storage/providers/local.py +126 -0
  163. synapse_sdk/utils/storage/providers/s3.py +177 -0
  164. synapse_sdk/utils/storage/providers/sftp.py +208 -0
  165. synapse_sdk/utils/storage/registry.py +125 -0
  166. synapse_sdk/utils/websocket.py +99 -0
  167. synapse_sdk-2026.1.1b2.dist-info/METADATA +715 -0
  168. synapse_sdk-2026.1.1b2.dist-info/RECORD +172 -0
  169. {synapse_sdk-1.0.0a11.dist-info → synapse_sdk-2026.1.1b2.dist-info}/WHEEL +1 -1
  170. synapse_sdk-2026.1.1b2.dist-info/licenses/LICENSE +201 -0
  171. locale/en/LC_MESSAGES/messages.mo +0 -0
  172. locale/en/LC_MESSAGES/messages.po +0 -39
  173. locale/ko/LC_MESSAGES/messages.mo +0 -0
  174. locale/ko/LC_MESSAGES/messages.po +0 -34
  175. synapse_sdk/cli/create_plugin.py +0 -10
  176. synapse_sdk/clients/agent/core.py +0 -7
  177. synapse_sdk/clients/agent/service.py +0 -15
  178. synapse_sdk/clients/backend/dataset.py +0 -51
  179. synapse_sdk/clients/ray/__init__.py +0 -6
  180. synapse_sdk/clients/ray/core.py +0 -22
  181. synapse_sdk/clients/ray/serve.py +0 -20
  182. synapse_sdk/i18n.py +0 -35
  183. synapse_sdk/plugins/categories/__init__.py +0 -0
  184. synapse_sdk/plugins/categories/base.py +0 -235
  185. synapse_sdk/plugins/categories/data_validation/__init__.py +0 -0
  186. synapse_sdk/plugins/categories/data_validation/actions/__init__.py +0 -0
  187. synapse_sdk/plugins/categories/data_validation/actions/validation.py +0 -10
  188. synapse_sdk/plugins/categories/data_validation/templates/config.yaml +0 -3
  189. synapse_sdk/plugins/categories/data_validation/templates/plugin/__init__.py +0 -0
  190. synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +0 -5
  191. synapse_sdk/plugins/categories/decorators.py +0 -13
  192. synapse_sdk/plugins/categories/export/__init__.py +0 -0
  193. synapse_sdk/plugins/categories/export/actions/__init__.py +0 -0
  194. synapse_sdk/plugins/categories/export/actions/export.py +0 -10
  195. synapse_sdk/plugins/categories/import/__init__.py +0 -0
  196. synapse_sdk/plugins/categories/import/actions/__init__.py +0 -0
  197. synapse_sdk/plugins/categories/import/actions/import.py +0 -10
  198. synapse_sdk/plugins/categories/neural_net/__init__.py +0 -0
  199. synapse_sdk/plugins/categories/neural_net/actions/__init__.py +0 -0
  200. synapse_sdk/plugins/categories/neural_net/actions/deployment.py +0 -45
  201. synapse_sdk/plugins/categories/neural_net/actions/inference.py +0 -18
  202. synapse_sdk/plugins/categories/neural_net/actions/test.py +0 -10
  203. synapse_sdk/plugins/categories/neural_net/actions/train.py +0 -143
  204. synapse_sdk/plugins/categories/neural_net/templates/config.yaml +0 -12
  205. synapse_sdk/plugins/categories/neural_net/templates/plugin/__init__.py +0 -0
  206. synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +0 -4
  207. synapse_sdk/plugins/categories/neural_net/templates/plugin/test.py +0 -2
  208. synapse_sdk/plugins/categories/neural_net/templates/plugin/train.py +0 -14
  209. synapse_sdk/plugins/categories/post_annotation/__init__.py +0 -0
  210. synapse_sdk/plugins/categories/post_annotation/actions/__init__.py +0 -0
  211. synapse_sdk/plugins/categories/post_annotation/actions/post_annotation.py +0 -10
  212. synapse_sdk/plugins/categories/post_annotation/templates/config.yaml +0 -3
  213. synapse_sdk/plugins/categories/post_annotation/templates/plugin/__init__.py +0 -0
  214. synapse_sdk/plugins/categories/post_annotation/templates/plugin/post_annotation.py +0 -3
  215. synapse_sdk/plugins/categories/pre_annotation/__init__.py +0 -0
  216. synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +0 -0
  217. synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation.py +0 -10
  218. synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +0 -3
  219. synapse_sdk/plugins/categories/pre_annotation/templates/plugin/__init__.py +0 -0
  220. synapse_sdk/plugins/categories/pre_annotation/templates/plugin/pre_annotation.py +0 -3
  221. synapse_sdk/plugins/categories/registry.py +0 -16
  222. synapse_sdk/plugins/categories/smart_tool/__init__.py +0 -0
  223. synapse_sdk/plugins/categories/smart_tool/actions/__init__.py +0 -0
  224. synapse_sdk/plugins/categories/smart_tool/actions/auto_label.py +0 -37
  225. synapse_sdk/plugins/categories/smart_tool/templates/config.yaml +0 -7
  226. synapse_sdk/plugins/categories/smart_tool/templates/plugin/__init__.py +0 -0
  227. synapse_sdk/plugins/categories/smart_tool/templates/plugin/auto_label.py +0 -11
  228. synapse_sdk/plugins/categories/templates.py +0 -32
  229. synapse_sdk/plugins/cli/__init__.py +0 -21
  230. synapse_sdk/plugins/cli/publish.py +0 -37
  231. synapse_sdk/plugins/cli/run.py +0 -67
  232. synapse_sdk/plugins/exceptions.py +0 -22
  233. synapse_sdk/plugins/models.py +0 -121
  234. synapse_sdk/plugins/templates/cookiecutter.json +0 -11
  235. synapse_sdk/plugins/templates/hooks/post_gen_project.py +0 -3
  236. synapse_sdk/plugins/templates/hooks/pre_prompt.py +0 -21
  237. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env +0 -24
  238. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env.dist +0 -24
  239. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.gitignore +0 -27
  240. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.pre-commit-config.yaml +0 -7
  241. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/README.md +0 -5
  242. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/config.yaml +0 -6
  243. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/main.py +0 -4
  244. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/plugin/__init__.py +0 -0
  245. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/pyproject.toml +0 -13
  246. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +0 -1
  247. synapse_sdk/shared/enums.py +0 -8
  248. synapse_sdk/utils/debug.py +0 -5
  249. synapse_sdk/utils/file.py +0 -87
  250. synapse_sdk/utils/module_loading.py +0 -29
  251. synapse_sdk/utils/pydantic/__init__.py +0 -0
  252. synapse_sdk/utils/pydantic/config.py +0 -4
  253. synapse_sdk/utils/pydantic/errors.py +0 -33
  254. synapse_sdk/utils/pydantic/validators.py +0 -7
  255. synapse_sdk/utils/storage.py +0 -91
  256. synapse_sdk/utils/string.py +0 -11
  257. synapse_sdk-1.0.0a11.dist-info/LICENSE +0 -21
  258. synapse_sdk-1.0.0a11.dist-info/METADATA +0 -43
  259. synapse_sdk-1.0.0a11.dist-info/RECORD +0 -111
  260. {synapse_sdk-1.0.0a11.dist-info → synapse_sdk-2026.1.1b2.dist-info}/entry_points.txt +0 -0
  261. {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
+ ]