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,513 @@
1
+ # Plugin System Developer Guide
2
+
3
+ Quick reference and extension guide for the Synapse SDK Plugin System.
4
+
5
+ ## Documentation Index
6
+
7
+ | Document | Description | When to Read |
8
+ |----------|-------------|--------------|
9
+ | **[OVERVIEW.md](OVERVIEW.md)** | Introduction, key concepts, tutorials | Start here for new developers |
10
+ | **[ACTION_DEV_GUIDE.md](ACTION_DEV_GUIDE.md)** | Action development, async patterns | Building custom actions |
11
+ | **[ARCHITECTURE.md](ARCHITECTURE.md)** | Technical architecture, component details | Deep dive into internals |
12
+ | **[STEP.md](STEP.md)** | Step implementations, orchestration | Building step-based workflows |
13
+ | **[LOGGING_SYSTEM.md](LOGGING_SYSTEM.md)** | Logging, progress tracking, metrics | Implementing observability |
14
+ | **[PIPELINE_GUIDE.md](PIPELINE_GUIDE.md)** | Multi-action pipeline execution | Building complex workflows |
15
+
16
+ ### Recommended Reading Order
17
+
18
+ 1. **OVERVIEW.md** - Understand concepts, create your first plugin
19
+ 2. **ACTION_DEV_GUIDE.md** - For developing custom actions
20
+ 3. **ARCHITECTURE.md** - Learn component details as needed
21
+ 4. **STEP.md** - For step-based workflows within actions
22
+ 5. **LOGGING_SYSTEM.md** - For progress tracking and logging
23
+ 6. **PIPELINE_GUIDE.md** - For multi-action workflows
24
+
25
+ ---
26
+
27
+ ## Quick Reference
28
+
29
+ ### Module Reference
30
+
31
+ | Module | Purpose | Key Classes |
32
+ |--------|---------|-------------|
33
+ | `synapse_sdk.plugins` | Main API | `BaseAction`, `run_plugin`, `action` |
34
+ | `synapse_sdk.plugins.context` | Runtime services | `RuntimeContext`, `PluginEnvironment` |
35
+ | `synapse_sdk.plugins.steps` | Workflow steps | `BaseStep`, `StepRegistry`, `Orchestrator` |
36
+ | `synapse_sdk.loggers` | Logging system | `BaseLogger`, `ConsoleLogger`, `BackendLogger` |
37
+ | `synapse_sdk.plugins.models.logger` | Logger models | `LogLevel`, `ActionProgress`, `PipelineProgress` |
38
+ | `synapse_sdk.plugins.executors` | Execution backends | `LocalExecutor` |
39
+ | `synapse_sdk.plugins.executors.ray` | Ray execution | `RayActorExecutor`, `RayJobExecutor` |
40
+ | `synapse_sdk.plugins.pipelines` | Multi-action | `ActionPipeline` |
41
+ | `synapse_sdk.plugins.enums` | Enumerations | `PluginCategory`, `RunMethod` |
42
+ | `synapse_sdk.plugins.types` | Semantic types | `DataType`, `YOLODataset`, `ModelWeights` |
43
+ | `synapse_sdk.plugins.config` | Configuration | `PluginConfig`, `ActionConfig` |
44
+ | `synapse_sdk.plugins.discovery` | Plugin loading | `PluginDiscovery` |
45
+ | `synapse_sdk.plugins.errors` | Exceptions | `PluginError`, `ValidationError` |
46
+
47
+ ### Common Imports
48
+
49
+ ```python
50
+ # Basic action development
51
+ from synapse_sdk.plugins import BaseAction, action, run_plugin
52
+ from synapse_sdk.plugins.context import RuntimeContext
53
+ from synapse_sdk.plugins.enums import PluginCategory
54
+
55
+ # Step-based workflows
56
+ from synapse_sdk.plugins.steps import (
57
+ BaseStep,
58
+ StepResult,
59
+ BaseStepContext,
60
+ StepRegistry,
61
+ Orchestrator,
62
+ )
63
+
64
+ # Specialized actions
65
+ from synapse_sdk.plugins.actions.train import BaseTrainAction, TrainContext
66
+ from synapse_sdk.plugins.actions.upload import BaseUploadAction, UploadContext
67
+
68
+ # Executors
69
+ from synapse_sdk.plugins.executors import LocalExecutor
70
+ from synapse_sdk.plugins.executors.ray import RayActorExecutor, RayJobExecutor
71
+
72
+ # Types
73
+ from synapse_sdk.plugins.types import DataType, YOLODataset, ModelWeights
74
+
75
+ # Logging
76
+ from synapse_sdk.loggers import BaseLogger, ConsoleLogger, BackendLogger
77
+ from synapse_sdk.plugins.models.logger import LogLevel, ActionProgress, PipelineProgress
78
+
79
+ # Discovery
80
+ from synapse_sdk.plugins.discovery import PluginDiscovery
81
+ ```
82
+
83
+ ### Common Patterns
84
+
85
+ | Pattern | When to Use | Example |
86
+ |---------|-------------|---------|
87
+ | Class-based action | Complex actions, type declarations | `class MyAction(BaseAction[Params])` |
88
+ | Function action | Simple, stateless operations | `@action(params=Params)` |
89
+ | Step workflow | Multi-phase with rollback | `BaseStep` + `Orchestrator` |
90
+ | Local execution | Development, testing | `mode='local'` |
91
+ | Ray task | Light parallel tasks | `mode='task'` |
92
+ | Ray job | Production workloads | `mode='job'` |
93
+
94
+ ---
95
+
96
+ ## Extension Points Guide
97
+
98
+ ### Creating Custom Actions
99
+
100
+ **Checklist:**
101
+ - [ ] Define Pydantic params model
102
+ - [ ] Create action class or decorated function
103
+ - [ ] Implement `execute()` method
104
+ - [ ] Add to `config.yaml`
105
+ - [ ] Test with `LocalExecutor`
106
+
107
+ **Template:**
108
+
109
+ ```python
110
+ from synapse_sdk.plugins import BaseAction
111
+ from synapse_sdk.plugins.enums import PluginCategory
112
+ from pydantic import BaseModel, Field
113
+
114
+ class MyParams(BaseModel):
115
+ """Action parameters."""
116
+ input_path: str = Field(..., description='Input file path')
117
+ output_path: str = Field(..., description='Output file path')
118
+ option: int = Field(default=10, ge=1, le=100)
119
+
120
+ class MyResult(BaseModel):
121
+ """Action result."""
122
+ status: str
123
+ processed_count: int
124
+
125
+ class MyAction(BaseAction[MyParams]):
126
+ """My custom action."""
127
+
128
+ action_name = 'my_action'
129
+ category = PluginCategory.CUSTOM
130
+ result_model = MyResult
131
+
132
+ def execute(self) -> MyResult:
133
+ # Log start
134
+ self.log('start', {'input': self.params.input_path})
135
+
136
+ # Process with progress
137
+ total = 100
138
+ for i in range(total):
139
+ self.set_progress(i + 1, total)
140
+ # ... processing ...
141
+
142
+ # Return result
143
+ return MyResult(
144
+ status='completed',
145
+ processed_count=total,
146
+ )
147
+ ```
148
+
149
+ **Testing:**
150
+
151
+ ```python
152
+ from synapse_sdk.plugins.executors import LocalExecutor
153
+
154
+ executor = LocalExecutor()
155
+ result = executor.execute(
156
+ action_cls=MyAction,
157
+ params={'input_path': '/in', 'output_path': '/out'},
158
+ )
159
+ assert result['status'] == 'completed'
160
+ ```
161
+
162
+ ### Creating Custom Steps
163
+
164
+ **Checklist:**
165
+ - [ ] Define context class extending `BaseStepContext`
166
+ - [ ] Implement step class with `name`, `progress_weight`, `execute()`
167
+ - [ ] Optionally implement `can_skip()` and `rollback()`
168
+ - [ ] Register steps in `StepRegistry`
169
+ - [ ] Execute with `Orchestrator`
170
+
171
+ **Template:**
172
+
173
+ ```python
174
+ from dataclasses import dataclass, field
175
+ from synapse_sdk.plugins.steps import (
176
+ BaseStep,
177
+ StepResult,
178
+ BaseStepContext,
179
+ StepRegistry,
180
+ Orchestrator,
181
+ )
182
+
183
+ @dataclass
184
+ class MyContext(BaseStepContext):
185
+ """Shared state for my workflow."""
186
+ items: list[str] = field(default_factory=list)
187
+ processed: list[str] = field(default_factory=list)
188
+
189
+ class LoadStep(BaseStep[MyContext]):
190
+ @property
191
+ def name(self) -> str:
192
+ return 'load'
193
+
194
+ @property
195
+ def progress_weight(self) -> float:
196
+ return 0.2
197
+
198
+ def execute(self, context: MyContext) -> StepResult:
199
+ context.items = ['item1', 'item2', 'item3']
200
+ return StepResult(success=True, data={'count': len(context.items)})
201
+
202
+ class ProcessStep(BaseStep[MyContext]):
203
+ @property
204
+ def name(self) -> str:
205
+ return 'process'
206
+
207
+ @property
208
+ def progress_weight(self) -> float:
209
+ return 0.8
210
+
211
+ def execute(self, context: MyContext) -> StepResult:
212
+ for item in context.items:
213
+ context.set_progress(len(context.processed), len(context.items))
214
+ context.processed.append(f"processed_{item}")
215
+ return StepResult(success=True)
216
+
217
+ def rollback(self, context: MyContext, result: StepResult) -> None:
218
+ context.processed.clear()
219
+
220
+ # Usage
221
+ registry = StepRegistry[MyContext]()
222
+ registry.register(LoadStep())
223
+ registry.register(ProcessStep())
224
+
225
+ context = MyContext(runtime_ctx=runtime_ctx)
226
+ orchestrator = Orchestrator(registry, context)
227
+ result = orchestrator.execute()
228
+ ```
229
+
230
+ ### Creating Custom DataTypes
231
+
232
+ **When needed:**
233
+ - Pipeline validation between actions
234
+ - Semantic type declarations
235
+ - Custom format compatibility
236
+
237
+ **Template:**
238
+
239
+ ```python
240
+ from synapse_sdk.plugins.types import DataType
241
+
242
+ class MyDataset(DataType):
243
+ """My custom dataset format."""
244
+ name = 'my_dataset'
245
+ format = 'my_format'
246
+ description = 'Custom dataset format for my use case'
247
+
248
+ class MyModel(DataType):
249
+ """My custom model format."""
250
+ name = 'my_model'
251
+ format = 'my_format'
252
+ ```
253
+
254
+ **Usage:**
255
+
256
+ ```python
257
+ class MyTrainAction(BaseAction[TrainParams]):
258
+ input_type = MyDataset
259
+ output_type = MyModel
260
+ ```
261
+
262
+ ### Creating Custom Contexts
263
+
264
+ **Template:**
265
+
266
+ ```python
267
+ from dataclasses import dataclass, field
268
+ from synapse_sdk.plugins.steps import BaseStepContext
269
+
270
+ @dataclass
271
+ class MyContext(BaseStepContext):
272
+ """Context for my workflow."""
273
+
274
+ # Required fields (no default)
275
+ config_path: str
276
+
277
+ # Optional fields (with default)
278
+ items: list[str] = field(default_factory=list)
279
+ processed_count: int = 0
280
+ error_messages: list[str] = field(default_factory=list)
281
+
282
+ def add_item(self, item: str) -> None:
283
+ """Helper method for steps."""
284
+ self.items.append(item)
285
+ self.processed_count += 1
286
+ ```
287
+
288
+ ---
289
+
290
+ ## Best Practices
291
+
292
+ ### Progress Tracking
293
+
294
+ **Weight Distribution:**
295
+ - Assign weights proportional to expected duration
296
+ - Total weights should represent relative time spent
297
+ - Consider user perception (fast steps feel slower)
298
+
299
+ ```python
300
+ # Example: 80% time in training, 10% each for setup/cleanup
301
+ class SetupStep(BaseStep):
302
+ progress_weight = 0.1
303
+
304
+ class TrainStep(BaseStep):
305
+ progress_weight = 0.8
306
+
307
+ class CleanupStep(BaseStep):
308
+ progress_weight = 0.1
309
+ ```
310
+
311
+ **Category Naming:**
312
+ - Use descriptive, consistent category names
313
+ - Categories appear in UI progress displays
314
+
315
+ ```python
316
+ # Good categories
317
+ self.set_progress(1, 10, category='dataset_download')
318
+ self.set_progress(5, 100, category='model_training')
319
+ self.set_progress(1, 1, category='checkpoint_save')
320
+
321
+ # Avoid generic names
322
+ self.set_progress(1, 10, category='step1') # Not descriptive
323
+ ```
324
+
325
+ ### Error Handling
326
+
327
+ **Exception Hierarchy:**
328
+
329
+ ```python
330
+ from synapse_sdk.plugins.errors import (
331
+ PluginError, # Base exception
332
+ ValidationError, # Parameter validation failed
333
+ ActionNotFoundError, # Action not in plugin
334
+ ExecutionError, # Runtime execution failed
335
+ )
336
+ ```
337
+
338
+ **Best Practices:**
339
+
340
+ ```python
341
+ def execute(self) -> dict:
342
+ # Validate early
343
+ if not os.path.exists(self.params.input_path):
344
+ raise ValidationError(f"Input not found: {self.params.input_path}")
345
+
346
+ try:
347
+ result = process_data(self.params.input_path)
348
+ except IOError as e:
349
+ # Wrap with context
350
+ raise ExecutionError(f"Failed to process: {e}") from e
351
+
352
+ return result
353
+ ```
354
+
355
+ **Step Rollback:**
356
+
357
+ ```python
358
+ class UploadStep(BaseStep[MyContext]):
359
+ def execute(self, context: MyContext) -> StepResult:
360
+ urls = []
361
+ for file in context.files:
362
+ url = upload(file)
363
+ urls.append(url)
364
+
365
+ return StepResult(
366
+ success=True,
367
+ rollback_data={'urls': urls}, # Save for rollback
368
+ )
369
+
370
+ def rollback(self, context: MyContext, result: StepResult) -> None:
371
+ # Clean up on failure
372
+ for url in result.rollback_data.get('urls', []):
373
+ try:
374
+ delete(url)
375
+ except Exception as e:
376
+ # Log but don't fail rollback
377
+ context.errors.append(f"Rollback failed: {url}: {e}")
378
+ ```
379
+
380
+ ### Context Usage
381
+
382
+ **State Management:**
383
+
384
+ ```python
385
+ # Good: Use context fields for state
386
+ @dataclass
387
+ class ProcessContext(BaseStepContext):
388
+ items: list[str] = field(default_factory=list)
389
+ results: dict[str, Any] = field(default_factory=dict)
390
+
391
+ class Step1(BaseStep[ProcessContext]):
392
+ def execute(self, context: ProcessContext) -> StepResult:
393
+ context.items = load_items()
394
+ return StepResult(success=True)
395
+
396
+ class Step2(BaseStep[ProcessContext]):
397
+ def execute(self, context: ProcessContext) -> StepResult:
398
+ # Access state from previous step
399
+ for item in context.items:
400
+ context.results[item] = process(item)
401
+ return StepResult(success=True)
402
+ ```
403
+
404
+ **Avoid Side Effects:**
405
+
406
+ ```python
407
+ # Bad: Modifying global state
408
+ class BadStep(BaseStep[MyContext]):
409
+ def execute(self, context: MyContext) -> StepResult:
410
+ global_cache.update(data) # Side effect!
411
+ return StepResult(success=True)
412
+
413
+ # Good: Use context
414
+ class GoodStep(BaseStep[MyContext]):
415
+ def execute(self, context: MyContext) -> StepResult:
416
+ context.cache_data = data # State in context
417
+ return StepResult(success=True)
418
+ ```
419
+
420
+ ---
421
+
422
+ ## Troubleshooting
423
+
424
+ ### Common Errors
425
+
426
+ **"Action not found"**
427
+ ```
428
+ ActionNotFoundError: Action 'train' not found in plugin 'my_plugin'
429
+ ```
430
+ - Check `config.yaml` has the action defined
431
+ - Verify entrypoint format: `module.path:ClassName`
432
+ - Ensure module is importable
433
+
434
+ **"Parameter validation failed"**
435
+ ```
436
+ ValidationError: 1 validation error for TrainParams
437
+ epochs: Input should be greater than 0
438
+ ```
439
+ - Check parameter values against Pydantic constraints
440
+ - Review Field validators in params model
441
+
442
+ **"Step failed with rollback"**
443
+ ```
444
+ RuntimeError: Step 'upload' failed: Connection timeout
445
+ ```
446
+ - Check step's error message for root cause
447
+ - Verify rollback completed (check logs)
448
+ - Implement better error handling in step
449
+
450
+ **"Cannot import action class"**
451
+ ```
452
+ ImportError: cannot import name 'MyAction' from 'my_module'
453
+ ```
454
+ - Verify class is exported in module's `__all__`
455
+ - Check for circular imports
456
+ - Ensure dependencies are installed
457
+
458
+ ### Debugging Tips
459
+
460
+ **Enable debug logging:**
461
+
462
+ ```python
463
+ import logging
464
+ logging.basicConfig(level=logging.DEBUG)
465
+
466
+ # Or for specific module
467
+ logging.getLogger('synapse_sdk.plugins').setLevel(logging.DEBUG)
468
+ ```
469
+
470
+ **Test with LocalExecutor first:**
471
+
472
+ ```python
473
+ from synapse_sdk.plugins.executors import LocalExecutor
474
+
475
+ executor = LocalExecutor(env={'DEBUG': 'true'})
476
+ result = executor.execute(MyAction, params)
477
+ ```
478
+
479
+ **Inspect discovered actions:**
480
+
481
+ ```python
482
+ from synapse_sdk.plugins.discovery import PluginDiscovery
483
+
484
+ discovery = PluginDiscovery.from_path('/path/to/plugin')
485
+ print(f"Actions: {discovery.list_actions()}")
486
+
487
+ for name in discovery.list_actions():
488
+ cls = discovery.get_action_class(name)
489
+ print(f"{name}: {cls.params_model}, {cls.result_model}")
490
+ ```
491
+
492
+ **Check step execution order:**
493
+
494
+ ```python
495
+ registry = StepRegistry[MyContext]()
496
+ # ... register steps ...
497
+
498
+ for step in registry.get_steps():
499
+ print(f"{step.name}: weight={step.progress_weight}")
500
+
501
+ print(f"Total weight: {registry.total_weight}")
502
+ ```
503
+
504
+ ---
505
+
506
+ ## Related Documentation
507
+
508
+ - **[../../AGENT.md](../../AGENT.md)** - Project development guide
509
+ - **[../../README.md](../../README.md)** - SDK overview
510
+ - **[ACTION_DEV_GUIDE.md](ACTION_DEV_GUIDE.md)** - Action development
511
+ - **[STEP.md](STEP.md)** - Step implementations
512
+ - **[LOGGING_SYSTEM.md](LOGGING_SYSTEM.md)** - Logging system
513
+ - **[PIPELINE_GUIDE.md](PIPELINE_GUIDE.md)** - Pipeline execution