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,6 @@
1
+ """MCP Tools for Synapse SDK.
2
+
3
+ Tools are registered directly in server.py using @mcp.tool() decorators.
4
+ This package exists for future organization if tools need to be split into
5
+ separate modules.
6
+ """
@@ -1,13 +1,137 @@
1
- import os
1
+ """Plugin architecture for Synapse SDK.
2
2
 
3
- from dotenv import load_dotenv
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
- from synapse_sdk.plugins.cli import cli
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
- def init():
9
- load_dotenv(os.path.join(os.getcwd(), '.env'))
10
- cli(obj={}, auto_envvar_prefix='SYNAPSE_PLUGIN')
11
-
12
-
13
- __all__ = ['init']
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
+ ]