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,683 @@
1
+ # Logging System
2
+
3
+ Comprehensive logging system for progress tracking, metrics collection, and event logging across the Synapse SDK plugin system.
4
+
5
+ ## Architecture
6
+
7
+ ```mermaid
8
+ flowchart TB
9
+ subgraph Loggers["Logger Implementations"]
10
+ base["BaseLogger<br/>(Abstract)"]
11
+ console["ConsoleLogger<br/>- Python logging"]
12
+ backend["BackendLogger<br/>- Remote sync"]
13
+ noop["NoOpLogger<br/>- Silent"]
14
+ end
15
+
16
+ subgraph Models["Data Models"]
17
+ loglevel["LogLevel<br/>DEBUG|INFO|WARNING|ERROR|CRITICAL"]
18
+ progress["ProgressData<br/>- percent<br/>- time_remaining<br/>- elapsed_time"]
19
+ logentry["LogEntry<br/>- event<br/>- data<br/>- step<br/>- level"]
20
+ end
21
+
22
+ subgraph Integration["Integration Points"]
23
+ context["RuntimeContext<br/>- logger property"]
24
+ stepctx["BaseStepContext<br/>- logger property"]
25
+ action["BaseAction<br/>- self.log()<br/>- self.set_progress()"]
26
+ end
27
+
28
+ base --> console
29
+ base --> backend
30
+ base --> noop
31
+
32
+ loglevel --> base
33
+ progress --> base
34
+ logentry --> backend
35
+
36
+ context --> base
37
+ stepctx --> base
38
+ action --> context
39
+
40
+ style Loggers fill:#e1f5fe
41
+ style Models fill:#f3e5f5
42
+ style Integration fill:#fff3e0
43
+ ```
44
+
45
+ ## Core Components
46
+
47
+ ### BaseLogger (Abstract)
48
+
49
+ Location: `synapse_sdk/loggers.py`
50
+
51
+ Abstract base class providing the logging interface. All logging state is instance-level to prevent cross-instance contamination.
52
+
53
+ ```python
54
+ from synapse_sdk.loggers import BaseLogger
55
+ from synapse_sdk.plugins.models.logger import LogLevel
56
+
57
+ class CustomLogger(BaseLogger):
58
+ def _log_impl(
59
+ self,
60
+ event: str,
61
+ data: dict[str, Any],
62
+ file: str | None,
63
+ step: str | None,
64
+ level: LogLevel | None = None,
65
+ ) -> None:
66
+ # Custom implementation
67
+ print(f"[{level.value}] {event}: {data}")
68
+ ```
69
+
70
+ **Key Methods:**
71
+
72
+ | Method | Description |
73
+ |--------|-------------|
74
+ | `log(level, event, data, file, step)` | Log an event with structured data |
75
+ | `info(message)` | Log info-level message |
76
+ | `debug(message)` | Log debug-level message |
77
+ | `warning(message)` | Log warning-level message |
78
+ | `error(message)` | Log error-level message |
79
+ | `critical(message)` | Log critical-level message |
80
+ | `set_progress(current, total, step)` | Update progress with ETA calculation |
81
+ | `set_progress_failed(category)` | Mark progress as failed |
82
+ | `set_metrics(value, step)` | Record metrics for a step |
83
+ | `set_step(step)` | Set current step context |
84
+ | `get_step()` | Get current step name |
85
+ | `get_progress(category)` | Retrieve progress data |
86
+ | `get_metrics(category)` | Retrieve recorded metrics |
87
+ | `finish()` | Mark logger as complete |
88
+
89
+ **Extension Hooks:**
90
+
91
+ ```python
92
+ class CustomLogger(BaseLogger):
93
+ def _log_impl(self, event, data, file, step, level):
94
+ """Required: Handle log events."""
95
+ pass
96
+
97
+ def _on_progress(self, progress: ProgressData, category: str | None):
98
+ """Optional: Called when progress updates."""
99
+ pass
100
+
101
+ def _on_metrics(self, category: str, metrics: dict[str, Any]):
102
+ """Optional: Called when metrics update."""
103
+ pass
104
+
105
+ def _on_finish(self):
106
+ """Optional: Called when logger finishes."""
107
+ pass
108
+ ```
109
+
110
+ ### LogLevel
111
+
112
+ Location: `synapse_sdk/plugins/models/logger.py`
113
+
114
+ Enumeration for log severity levels:
115
+
116
+ ```python
117
+ from synapse_sdk.plugins.models.logger import LogLevel
118
+
119
+ class LogLevel(str, Enum):
120
+ DEBUG = 'debug' # Detailed debugging information
121
+ INFO = 'info' # General operational messages
122
+ WARNING = 'warning' # Warning conditions
123
+ ERROR = 'error' # Error conditions
124
+ CRITICAL = 'critical' # Critical failures
125
+ ```
126
+
127
+ **Python Logging Level Mapping:**
128
+
129
+ | LogLevel | Python Level |
130
+ |----------|--------------|
131
+ | `DEBUG` | `logging.DEBUG` (10) |
132
+ | `INFO` | `logging.INFO` (20) |
133
+ | `WARNING` | `logging.WARNING` (30) |
134
+ | `ERROR` | `logging.ERROR` (40) |
135
+ | `CRITICAL` | `logging.CRITICAL` (50) |
136
+
137
+ ### ProgressData
138
+
139
+ Immutable snapshot of progress state:
140
+
141
+ ```python
142
+ from synapse_sdk.loggers import ProgressData
143
+
144
+ @dataclass
145
+ class ProgressData:
146
+ percent: float # Progress percentage (0-100)
147
+ time_remaining: float | None # Estimated seconds remaining
148
+ elapsed_time: float | None # Seconds elapsed
149
+ status: str = 'running' # 'running' or 'failed'
150
+ ```
151
+
152
+ **Automatic ETA Calculation:**
153
+
154
+ ```python
155
+ logger.set_progress(50, 100, step='training')
156
+ progress = logger.get_progress('training')
157
+ # progress.percent = 50.0
158
+ # progress.time_remaining = estimated based on elapsed/progress rate
159
+ # progress.elapsed_time = seconds since first progress call
160
+ ```
161
+
162
+ ### LogEntry
163
+
164
+ Structured log entry with metadata:
165
+
166
+ ```python
167
+ from synapse_sdk.loggers import LogEntry
168
+
169
+ @dataclass
170
+ class LogEntry:
171
+ event: str # Event name/type
172
+ data: dict[str, Any] # Event payload
173
+ timestamp: float # Unix timestamp
174
+ file: str | None # Associated file path
175
+ step: str | None # Step context
176
+ level: LogLevel | None # Log level
177
+
178
+ def to_dict(self) -> dict[str, Any]:
179
+ """Serialize for API transmission."""
180
+ ```
181
+
182
+ ---
183
+
184
+ ## Logger Implementations
185
+
186
+ ### ConsoleLogger
187
+
188
+ Prints logs to console using Python's `logging` module. Best for development and debugging.
189
+
190
+ ```python
191
+ from synapse_sdk.loggers import ConsoleLogger
192
+ from synapse_sdk.plugins.models.logger import LogLevel
193
+
194
+ logger = ConsoleLogger()
195
+
196
+ # Log messages at different levels
197
+ logger.info("Starting process")
198
+ logger.debug("Processing item 1")
199
+ logger.warning("Slow performance detected")
200
+ logger.error("Failed to connect")
201
+
202
+ # Structured logging
203
+ logger.log(LogLevel.INFO, 'model_loaded', {'path': '/models/yolo.pt'})
204
+
205
+ # Progress tracking
206
+ logger.set_step('training')
207
+ for epoch in range(100):
208
+ logger.set_progress(epoch + 1, 100)
209
+ # Output: [training] Progress: 50% | ETA: 30.5s
210
+
211
+ # Metrics
212
+ logger.set_metrics({'loss': 0.05, 'accuracy': 0.95}, step='training')
213
+ # Output: [training] Metrics: {'loss': 0.05, 'accuracy': 0.95}
214
+
215
+ logger.finish()
216
+ ```
217
+
218
+ **Output Format:**
219
+
220
+ ```
221
+ INFO:synapse_sdk.loggers:[training] model_loaded {'path': '/models/yolo.pt'}
222
+ INFO:synapse_sdk.loggers:[training] Progress: 50.0% | ETA: 30.5s
223
+ INFO:synapse_sdk.loggers:[training] Metrics: {'loss': 0.05, 'accuracy': 0.95}
224
+ ```
225
+
226
+ ### BackendLogger
227
+
228
+ Synchronizes logs with a remote backend service. Used in production environments for centralized monitoring.
229
+
230
+ ```python
231
+ from synapse_sdk.loggers import BackendLogger, LoggerBackend
232
+
233
+ class MyBackend(LoggerBackend):
234
+ def publish_progress(self, job_id: str, progress: ProgressData) -> None:
235
+ # Send to backend API
236
+ requests.post(f'/api/jobs/{job_id}/progress', json=progress.__dict__)
237
+
238
+ def publish_metrics(self, job_id: str, metrics: dict[str, Any]) -> None:
239
+ requests.post(f'/api/jobs/{job_id}/metrics', json=metrics)
240
+
241
+ def publish_log(self, job_id: str, log_entry: LogEntry) -> None:
242
+ requests.post(f'/api/jobs/{job_id}/logs', json=log_entry.to_dict())
243
+
244
+ # Initialize with backend
245
+ backend = MyBackend()
246
+ logger = BackendLogger(backend=backend, job_id='job-123')
247
+
248
+ # All logging operations sync to backend
249
+ logger.set_progress(50, 100, step='training')
250
+ logger.set_metrics({'loss': 0.05}, step='training')
251
+ logger.log(LogLevel.INFO, 'checkpoint', {'epoch': 5})
252
+
253
+ logger.finish() # Flushes remaining logs
254
+ ```
255
+
256
+ **Error Handling:**
257
+
258
+ BackendLogger silently logs errors without raising exceptions:
259
+
260
+ ```python
261
+ # If backend.publish_progress() fails:
262
+ # ERROR:synapse_sdk.loggers:Failed to publish progress: ConnectionError
263
+ ```
264
+
265
+ ### NoOpLogger
266
+
267
+ Silent logger for testing or disabled logging scenarios:
268
+
269
+ ```python
270
+ from synapse_sdk.loggers import NoOpLogger
271
+
272
+ logger = NoOpLogger()
273
+
274
+ # All operations are no-ops
275
+ logger.info("This goes nowhere")
276
+ logger.set_progress(50, 100)
277
+ logger.set_metrics({'loss': 0.05}, step='train')
278
+ logger.finish() # Does nothing
279
+ ```
280
+
281
+ ---
282
+
283
+ ## LoggerBackend Protocol
284
+
285
+ Protocol interface for implementing custom backend integrations:
286
+
287
+ ```python
288
+ from synapse_sdk.loggers import LoggerBackend, ProgressData, LogEntry
289
+
290
+ class LoggerBackend(Protocol):
291
+ """Protocol for logger backends that handle data synchronization."""
292
+
293
+ def publish_progress(self, job_id: str, progress: ProgressData) -> None:
294
+ """Publish progress update to backend."""
295
+ ...
296
+
297
+ def publish_metrics(self, job_id: str, metrics: dict[str, Any]) -> None:
298
+ """Publish metrics to backend."""
299
+ ...
300
+
301
+ def publish_log(self, job_id: str, log_entry: LogEntry) -> None:
302
+ """Publish log entry to backend."""
303
+ ...
304
+ ```
305
+
306
+ **Implementation Example:**
307
+
308
+ ```python
309
+ import httpx
310
+ from synapse_sdk.loggers import LoggerBackend, ProgressData, LogEntry
311
+
312
+ class HTTPBackend:
313
+ """HTTP-based backend implementation."""
314
+
315
+ def __init__(self, base_url: str, api_key: str):
316
+ self.client = httpx.Client(
317
+ base_url=base_url,
318
+ headers={'Authorization': f'Bearer {api_key}'},
319
+ )
320
+
321
+ def publish_progress(self, job_id: str, progress: ProgressData) -> None:
322
+ self.client.post(f'/jobs/{job_id}/progress', json={
323
+ 'percent': progress.percent,
324
+ 'time_remaining': progress.time_remaining,
325
+ 'elapsed_time': progress.elapsed_time,
326
+ 'status': progress.status,
327
+ })
328
+
329
+ def publish_metrics(self, job_id: str, metrics: dict[str, Any]) -> None:
330
+ self.client.post(f'/jobs/{job_id}/metrics', json=metrics)
331
+
332
+ def publish_log(self, job_id: str, log_entry: LogEntry) -> None:
333
+ self.client.post(f'/jobs/{job_id}/logs', json=log_entry.to_dict())
334
+ ```
335
+
336
+ ---
337
+
338
+ ## Integration with Actions
339
+
340
+ ### RuntimeContext
341
+
342
+ Actions access logging through `RuntimeContext`:
343
+
344
+ ```python
345
+ from synapse_sdk.plugins import BaseAction
346
+ from synapse_sdk.plugins.context import RuntimeContext
347
+
348
+ class MyAction(BaseAction[MyParams]):
349
+ def execute(self) -> dict:
350
+ # Access logger via context
351
+ self.ctx.logger.info("Starting execution")
352
+
353
+ # Convenience methods on context
354
+ self.ctx.set_progress(50, 100)
355
+ self.ctx.set_metrics({'items': 100}, category='process')
356
+ self.ctx.log('custom_event', {'data': 'value'})
357
+
358
+ # User-facing messages
359
+ self.ctx.log_message("Processing complete!", context='success')
360
+
361
+ # Developer debug events
362
+ self.ctx.log_dev_event("Checkpoint saved", {'path': '/tmp/ckpt'})
363
+
364
+ return {'status': 'done'}
365
+ ```
366
+
367
+ **RuntimeContext Methods:**
368
+
369
+ | Method | Description |
370
+ |--------|-------------|
371
+ | `log(event, data, file)` | Log structured event |
372
+ | `set_progress(current, total, category)` | Update progress |
373
+ | `set_metrics(value, category)` | Record metrics |
374
+ | `log_message(message, context)` | User-facing message |
375
+ | `log_dev_event(message, data)` | Developer debug event |
376
+ | `end_log()` | Signal execution complete |
377
+
378
+ ### BaseAction Shortcuts
379
+
380
+ `BaseAction` provides convenience methods that delegate to the logger:
381
+
382
+ ```python
383
+ class TrainAction(BaseAction[TrainParams]):
384
+ def execute(self) -> dict:
385
+ # Direct logging methods
386
+ self.log('epoch_start', {'epoch': 1})
387
+ self.set_progress(1, 100)
388
+ self.set_metrics({'loss': 0.5}, category='train')
389
+
390
+ # These call self.ctx.logger internally
391
+ return {'status': 'done'}
392
+ ```
393
+
394
+ ---
395
+
396
+ ## Integration with Steps
397
+
398
+ ### BaseStepContext
399
+
400
+ Steps access logging through `BaseStepContext`:
401
+
402
+ ```python
403
+ from dataclasses import dataclass
404
+ from synapse_sdk.plugins.steps import BaseStep, StepResult, BaseStepContext
405
+
406
+ @dataclass
407
+ class MyContext(BaseStepContext):
408
+ data: list[str] = field(default_factory=list)
409
+
410
+ class ProcessStep(BaseStep[MyContext]):
411
+ @property
412
+ def name(self) -> str:
413
+ return 'process'
414
+
415
+ @property
416
+ def progress_weight(self) -> float:
417
+ return 0.5
418
+
419
+ def execute(self, context: MyContext) -> StepResult:
420
+ # Log through context
421
+ context.log('process_start', {'count': len(context.data)})
422
+
423
+ for i, item in enumerate(context.data):
424
+ context.set_progress(i + 1, len(context.data))
425
+ # Process item...
426
+
427
+ context.set_metrics({'processed': len(context.data)})
428
+
429
+ return StepResult(success=True)
430
+ ```
431
+
432
+ ### LoggingStep Wrapper
433
+
434
+ Wrap any step with automatic timing and logging:
435
+
436
+ ```python
437
+ from synapse_sdk.plugins.steps.utils import LoggingStep
438
+
439
+ # Wrap step with logging
440
+ logged_step = LoggingStep(ProcessStep())
441
+ registry.register(logged_step)
442
+
443
+ # Execution logs:
444
+ # step_start {'step': 'process'}
445
+ # step_end {'step': 'process', 'elapsed': 1.234, 'success': True}
446
+ ```
447
+
448
+ ---
449
+
450
+ ## Progress Tracking
451
+
452
+ ### Step-Based Progress
453
+
454
+ Modern API using step names for progress categorization:
455
+
456
+ ```python
457
+ logger = ConsoleLogger()
458
+
459
+ # Set current step context
460
+ logger.set_step('download')
461
+ logger.set_progress(50, 100) # Uses current step
462
+
463
+ # Or specify step explicitly
464
+ logger.set_progress(50, 100, step='training')
465
+
466
+ # Multiple concurrent progress tracks
467
+ logger.set_progress(100, 100, step='download') # Complete
468
+ logger.set_progress(25, 100, step='training') # 25%
469
+ ```
470
+
471
+ ### Category Parameter (Deprecated)
472
+
473
+ The `category` parameter is deprecated in favor of `step`:
474
+
475
+ ```python
476
+ # Deprecated
477
+ logger.set_progress(50, 100, category='train')
478
+ # DeprecationWarning: Use 'step' instead
479
+
480
+ # Recommended
481
+ logger.set_progress(50, 100, step='train')
482
+ ```
483
+
484
+ **Priority Order:**
485
+ 1. Explicit `step` parameter
486
+ 2. Current step from `set_step()`
487
+ 3. `category` parameter (deprecated, warns)
488
+ 4. `__default__` key
489
+
490
+ ### ETA Calculation
491
+
492
+ Automatic time remaining estimation:
493
+
494
+ ```python
495
+ logger.set_step('training')
496
+
497
+ # First call initializes timer
498
+ logger.set_progress(0, 100)
499
+ time.sleep(1)
500
+
501
+ # Subsequent calls calculate ETA
502
+ logger.set_progress(10, 100)
503
+ progress = logger.get_progress('training')
504
+ # progress.percent = 10.0
505
+ # progress.elapsed_time = 1.0 # seconds
506
+ # progress.time_remaining = 9.0 # estimated
507
+
508
+ # Reset timer by setting current=0
509
+ logger.set_progress(0, 100) # Timer resets
510
+ ```
511
+
512
+ ### Failed Progress
513
+
514
+ Mark progress as failed:
515
+
516
+ ```python
517
+ try:
518
+ for i in range(100):
519
+ logger.set_progress(i + 1, 100, step='process')
520
+ process_item(i)
521
+ except Exception:
522
+ logger.set_progress_failed('process')
523
+ # progress.status = 'failed'
524
+ raise
525
+ ```
526
+
527
+ ---
528
+
529
+ ## Pipeline Progress Models
530
+
531
+ ### ActionProgress
532
+
533
+ Track progress for a single action in a pipeline:
534
+
535
+ ```python
536
+ from synapse_sdk.plugins.models.logger import ActionProgress
537
+ from synapse_sdk.plugins.models.pipeline import ActionStatus
538
+
539
+ action_progress = ActionProgress(
540
+ name='train',
541
+ status=ActionStatus.RUNNING,
542
+ progress=75.5,
543
+ progress_category='epoch',
544
+ message='Training epoch 75/100',
545
+ metrics={'loss': 0.05, 'accuracy': 0.95},
546
+ started_at=datetime.now(),
547
+ )
548
+
549
+ # Serialize for API
550
+ data = action_progress.to_dict()
551
+ ```
552
+
553
+ ### PipelineProgress
554
+
555
+ Overall pipeline state tracking:
556
+
557
+ ```python
558
+ from synapse_sdk.plugins.models.logger import PipelineProgress, ActionProgress
559
+ from synapse_sdk.plugins.models.pipeline import RunStatus
560
+
561
+ pipeline_progress = PipelineProgress(
562
+ run_id='run-123',
563
+ status=RunStatus.RUNNING,
564
+ current_action='train',
565
+ started_at=datetime.now(),
566
+ )
567
+
568
+ # Add action progress
569
+ pipeline_progress.actions['download'] = ActionProgress(
570
+ name='download',
571
+ status=ActionStatus.COMPLETED,
572
+ progress=100.0,
573
+ )
574
+ pipeline_progress.actions['train'] = ActionProgress(
575
+ name='train',
576
+ status=ActionStatus.RUNNING,
577
+ progress=50.0,
578
+ )
579
+
580
+ # Calculate overall progress
581
+ print(pipeline_progress.overall_progress) # 75.0 (average)
582
+ print(pipeline_progress.completed_actions) # 1
583
+ ```
584
+
585
+ ---
586
+
587
+ ## Best Practices
588
+
589
+ ### Use Step Context
590
+
591
+ Always set step context for organized logging:
592
+
593
+ ```python
594
+ def execute(self) -> dict:
595
+ # Set step for automatic categorization
596
+ self.ctx.logger.set_step('download')
597
+
598
+ for i in range(100):
599
+ self.ctx.set_progress(i + 1, 100)
600
+ # Progress automatically associated with 'download'
601
+
602
+ self.ctx.logger.set_step('process')
603
+ # Subsequent logs go to 'process'
604
+ ```
605
+
606
+ ### Structured Event Names
607
+
608
+ Use consistent, descriptive event names:
609
+
610
+ ```python
611
+ # Good: specific, actionable names
612
+ logger.log(LogLevel.INFO, 'model_checkpoint_saved', {'path': path, 'epoch': 5})
613
+ logger.log(LogLevel.ERROR, 'dataset_validation_failed', {'errors': errors})
614
+ logger.log(LogLevel.DEBUG, 'batch_processed', {'batch_id': i, 'items': 32})
615
+
616
+ # Avoid: vague or generic names
617
+ logger.log(LogLevel.INFO, 'done', {})
618
+ logger.log(LogLevel.INFO, 'step1', {'data': data})
619
+ ```
620
+
621
+ ### Include Relevant Data
622
+
623
+ Log actionable information:
624
+
625
+ ```python
626
+ # Good: includes context for debugging
627
+ logger.log(LogLevel.ERROR, 'file_not_found', {
628
+ 'path': '/data/train.csv',
629
+ 'checked_paths': ['/data', '/tmp/data'],
630
+ 'suggestion': 'Ensure dataset is downloaded',
631
+ })
632
+
633
+ # Avoid: minimal information
634
+ logger.log(LogLevel.ERROR, 'error', {'msg': 'not found'})
635
+ ```
636
+
637
+ ### Handle Logger Lifecycle
638
+
639
+ Always finish the logger:
640
+
641
+ ```python
642
+ logger = ConsoleLogger()
643
+ try:
644
+ # ... operations ...
645
+ logger.set_progress(100, 100)
646
+ except Exception:
647
+ logger.set_progress_failed()
648
+ raise
649
+ finally:
650
+ logger.finish() # Always call finish
651
+ ```
652
+
653
+ ### Guard Against Finished Logger
654
+
655
+ ```python
656
+ logger.finish()
657
+
658
+ try:
659
+ logger.info("After finish")
660
+ except RuntimeError as e:
661
+ # "Cannot log to a finished logger"
662
+ pass
663
+ ```
664
+
665
+ ---
666
+
667
+ ## Module Reference
668
+
669
+ | Module | Classes | Purpose |
670
+ |--------|---------|---------|
671
+ | `synapse_sdk.loggers` | `BaseLogger`, `ConsoleLogger`, `BackendLogger`, `NoOpLogger`, `LoggerBackend`, `ProgressData`, `LogEntry` | Core logging system |
672
+ | `synapse_sdk.plugins.models.logger` | `LogLevel`, `ActionProgress`, `PipelineProgress`, `Checkpoint` | Progress models and enums |
673
+ | `synapse_sdk.plugins.steps.utils.logging` | `LoggingStep` | Step wrapper with timing |
674
+ | `synapse_sdk.plugins.context` | `RuntimeContext` | Action context with logger |
675
+
676
+ ---
677
+
678
+ ## Related Documentation
679
+
680
+ - **[OVERVIEW.md](OVERVIEW.md)** - Plugin system introduction
681
+ - **[ARCHITECTURE.md](ARCHITECTURE.md)** - Technical architecture
682
+ - **[STEP.md](STEP.md)** - Step implementations
683
+ - **[README.md](README.md)** - Quick reference