synapse-sdk 1.0.0a11__py3-none-any.whl → 2026.1.1b2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of synapse-sdk might be problematic. Click here for more details.
- synapse_sdk/__init__.py +24 -0
- synapse_sdk/cli/__init__.py +9 -8
- synapse_sdk/cli/agent/__init__.py +25 -0
- synapse_sdk/cli/agent/config.py +104 -0
- synapse_sdk/cli/agent/select.py +197 -0
- synapse_sdk/cli/auth.py +104 -0
- synapse_sdk/cli/main.py +1025 -0
- synapse_sdk/cli/plugin/__init__.py +58 -0
- synapse_sdk/cli/plugin/create.py +566 -0
- synapse_sdk/cli/plugin/job.py +196 -0
- synapse_sdk/cli/plugin/publish.py +322 -0
- synapse_sdk/cli/plugin/run.py +131 -0
- synapse_sdk/cli/plugin/test.py +200 -0
- synapse_sdk/clients/README.md +239 -0
- synapse_sdk/clients/__init__.py +5 -0
- synapse_sdk/clients/_template.py +266 -0
- synapse_sdk/clients/agent/__init__.py +84 -29
- synapse_sdk/clients/agent/async_ray.py +289 -0
- synapse_sdk/clients/agent/container.py +83 -0
- synapse_sdk/clients/agent/plugin.py +101 -0
- synapse_sdk/clients/agent/ray.py +296 -39
- synapse_sdk/clients/backend/__init__.py +152 -12
- synapse_sdk/clients/backend/annotation.py +164 -22
- synapse_sdk/clients/backend/core.py +101 -0
- synapse_sdk/clients/backend/data_collection.py +292 -0
- synapse_sdk/clients/backend/hitl.py +87 -0
- synapse_sdk/clients/backend/integration.py +374 -46
- synapse_sdk/clients/backend/ml.py +134 -22
- synapse_sdk/clients/backend/models.py +247 -0
- synapse_sdk/clients/base.py +538 -59
- synapse_sdk/clients/exceptions.py +35 -7
- synapse_sdk/clients/pipeline/__init__.py +5 -0
- synapse_sdk/clients/pipeline/client.py +636 -0
- synapse_sdk/clients/protocols.py +178 -0
- synapse_sdk/clients/utils.py +86 -8
- synapse_sdk/clients/validation.py +58 -0
- synapse_sdk/enums.py +76 -0
- synapse_sdk/exceptions.py +168 -0
- synapse_sdk/integrations/__init__.py +74 -0
- synapse_sdk/integrations/_base.py +119 -0
- synapse_sdk/integrations/_context.py +53 -0
- synapse_sdk/integrations/ultralytics/__init__.py +78 -0
- synapse_sdk/integrations/ultralytics/_callbacks.py +126 -0
- synapse_sdk/integrations/ultralytics/_patches.py +124 -0
- synapse_sdk/loggers.py +476 -95
- synapse_sdk/mcp/MCP.md +69 -0
- synapse_sdk/mcp/__init__.py +48 -0
- synapse_sdk/mcp/__main__.py +6 -0
- synapse_sdk/mcp/config.py +349 -0
- synapse_sdk/mcp/prompts/__init__.py +4 -0
- synapse_sdk/mcp/resources/__init__.py +4 -0
- synapse_sdk/mcp/server.py +1352 -0
- synapse_sdk/mcp/tools/__init__.py +6 -0
- synapse_sdk/plugins/__init__.py +133 -9
- synapse_sdk/plugins/action.py +229 -0
- synapse_sdk/plugins/actions/__init__.py +82 -0
- synapse_sdk/plugins/actions/dataset/__init__.py +37 -0
- synapse_sdk/plugins/actions/dataset/action.py +471 -0
- synapse_sdk/plugins/actions/export/__init__.py +55 -0
- synapse_sdk/plugins/actions/export/action.py +183 -0
- synapse_sdk/plugins/actions/export/context.py +59 -0
- synapse_sdk/plugins/actions/inference/__init__.py +84 -0
- synapse_sdk/plugins/actions/inference/action.py +285 -0
- synapse_sdk/plugins/actions/inference/context.py +81 -0
- synapse_sdk/plugins/actions/inference/deployment.py +322 -0
- synapse_sdk/plugins/actions/inference/serve.py +252 -0
- synapse_sdk/plugins/actions/train/__init__.py +54 -0
- synapse_sdk/plugins/actions/train/action.py +326 -0
- synapse_sdk/plugins/actions/train/context.py +57 -0
- synapse_sdk/plugins/actions/upload/__init__.py +49 -0
- synapse_sdk/plugins/actions/upload/action.py +165 -0
- synapse_sdk/plugins/actions/upload/context.py +61 -0
- synapse_sdk/plugins/config.py +98 -0
- synapse_sdk/plugins/context/__init__.py +109 -0
- synapse_sdk/plugins/context/env.py +113 -0
- synapse_sdk/plugins/datasets/__init__.py +113 -0
- synapse_sdk/plugins/datasets/converters/__init__.py +76 -0
- synapse_sdk/plugins/datasets/converters/base.py +347 -0
- synapse_sdk/plugins/datasets/converters/yolo/__init__.py +9 -0
- synapse_sdk/plugins/datasets/converters/yolo/from_dm.py +468 -0
- synapse_sdk/plugins/datasets/converters/yolo/to_dm.py +381 -0
- synapse_sdk/plugins/datasets/formats/__init__.py +82 -0
- synapse_sdk/plugins/datasets/formats/dm.py +351 -0
- synapse_sdk/plugins/datasets/formats/yolo.py +240 -0
- synapse_sdk/plugins/decorators.py +83 -0
- synapse_sdk/plugins/discovery.py +790 -0
- synapse_sdk/plugins/docs/ACTION_DEV_GUIDE.md +933 -0
- synapse_sdk/plugins/docs/ARCHITECTURE.md +1225 -0
- synapse_sdk/plugins/docs/LOGGING_SYSTEM.md +683 -0
- synapse_sdk/plugins/docs/OVERVIEW.md +531 -0
- synapse_sdk/plugins/docs/PIPELINE_GUIDE.md +145 -0
- synapse_sdk/plugins/docs/README.md +513 -0
- synapse_sdk/plugins/docs/STEP.md +656 -0
- synapse_sdk/plugins/enums.py +70 -10
- synapse_sdk/plugins/errors.py +92 -0
- synapse_sdk/plugins/executors/__init__.py +43 -0
- synapse_sdk/plugins/executors/local.py +99 -0
- synapse_sdk/plugins/executors/ray/__init__.py +18 -0
- synapse_sdk/plugins/executors/ray/base.py +282 -0
- synapse_sdk/plugins/executors/ray/job.py +298 -0
- synapse_sdk/plugins/executors/ray/jobs_api.py +511 -0
- synapse_sdk/plugins/executors/ray/packaging.py +137 -0
- synapse_sdk/plugins/executors/ray/pipeline.py +792 -0
- synapse_sdk/plugins/executors/ray/task.py +257 -0
- synapse_sdk/plugins/models/__init__.py +26 -0
- synapse_sdk/plugins/models/logger.py +173 -0
- synapse_sdk/plugins/models/pipeline.py +25 -0
- synapse_sdk/plugins/pipelines/__init__.py +81 -0
- synapse_sdk/plugins/pipelines/action_pipeline.py +417 -0
- synapse_sdk/plugins/pipelines/context.py +107 -0
- synapse_sdk/plugins/pipelines/display.py +311 -0
- synapse_sdk/plugins/runner.py +114 -0
- synapse_sdk/plugins/schemas/__init__.py +19 -0
- synapse_sdk/plugins/schemas/results.py +152 -0
- synapse_sdk/plugins/steps/__init__.py +63 -0
- synapse_sdk/plugins/steps/base.py +128 -0
- synapse_sdk/plugins/steps/context.py +90 -0
- synapse_sdk/plugins/steps/orchestrator.py +128 -0
- synapse_sdk/plugins/steps/registry.py +103 -0
- synapse_sdk/plugins/steps/utils/__init__.py +20 -0
- synapse_sdk/plugins/steps/utils/logging.py +85 -0
- synapse_sdk/plugins/steps/utils/timing.py +71 -0
- synapse_sdk/plugins/steps/utils/validation.py +68 -0
- synapse_sdk/plugins/templates/__init__.py +50 -0
- synapse_sdk/plugins/templates/base/.gitignore.j2 +26 -0
- synapse_sdk/plugins/templates/base/.synapseignore.j2 +11 -0
- synapse_sdk/plugins/templates/base/README.md.j2 +26 -0
- synapse_sdk/plugins/templates/base/plugin/__init__.py.j2 +1 -0
- synapse_sdk/plugins/templates/base/pyproject.toml.j2 +14 -0
- synapse_sdk/plugins/templates/base/requirements.txt.j2 +1 -0
- synapse_sdk/plugins/templates/custom/plugin/main.py.j2 +18 -0
- synapse_sdk/plugins/templates/data_validation/plugin/validate.py.j2 +32 -0
- synapse_sdk/plugins/templates/export/plugin/export.py.j2 +36 -0
- synapse_sdk/plugins/templates/neural_net/plugin/inference.py.j2 +36 -0
- synapse_sdk/plugins/templates/neural_net/plugin/train.py.j2 +33 -0
- synapse_sdk/plugins/templates/post_annotation/plugin/post_annotate.py.j2 +32 -0
- synapse_sdk/plugins/templates/pre_annotation/plugin/pre_annotate.py.j2 +32 -0
- synapse_sdk/plugins/templates/smart_tool/plugin/auto_label.py.j2 +44 -0
- synapse_sdk/plugins/templates/upload/plugin/upload.py.j2 +35 -0
- synapse_sdk/plugins/testing/__init__.py +25 -0
- synapse_sdk/plugins/testing/sample_actions.py +98 -0
- synapse_sdk/plugins/types.py +206 -0
- synapse_sdk/plugins/upload.py +595 -64
- synapse_sdk/plugins/utils.py +325 -37
- synapse_sdk/shared/__init__.py +25 -0
- synapse_sdk/utils/__init__.py +1 -0
- synapse_sdk/utils/auth.py +74 -0
- synapse_sdk/utils/file/__init__.py +58 -0
- synapse_sdk/utils/file/archive.py +449 -0
- synapse_sdk/utils/file/checksum.py +167 -0
- synapse_sdk/utils/file/download.py +286 -0
- synapse_sdk/utils/file/io.py +129 -0
- synapse_sdk/utils/file/requirements.py +36 -0
- synapse_sdk/utils/network.py +168 -0
- synapse_sdk/utils/storage/__init__.py +238 -0
- synapse_sdk/utils/storage/config.py +188 -0
- synapse_sdk/utils/storage/errors.py +52 -0
- synapse_sdk/utils/storage/providers/__init__.py +13 -0
- synapse_sdk/utils/storage/providers/base.py +76 -0
- synapse_sdk/utils/storage/providers/gcs.py +168 -0
- synapse_sdk/utils/storage/providers/http.py +250 -0
- synapse_sdk/utils/storage/providers/local.py +126 -0
- synapse_sdk/utils/storage/providers/s3.py +177 -0
- synapse_sdk/utils/storage/providers/sftp.py +208 -0
- synapse_sdk/utils/storage/registry.py +125 -0
- synapse_sdk/utils/websocket.py +99 -0
- synapse_sdk-2026.1.1b2.dist-info/METADATA +715 -0
- synapse_sdk-2026.1.1b2.dist-info/RECORD +172 -0
- {synapse_sdk-1.0.0a11.dist-info → synapse_sdk-2026.1.1b2.dist-info}/WHEEL +1 -1
- synapse_sdk-2026.1.1b2.dist-info/licenses/LICENSE +201 -0
- locale/en/LC_MESSAGES/messages.mo +0 -0
- locale/en/LC_MESSAGES/messages.po +0 -39
- locale/ko/LC_MESSAGES/messages.mo +0 -0
- locale/ko/LC_MESSAGES/messages.po +0 -34
- synapse_sdk/cli/create_plugin.py +0 -10
- synapse_sdk/clients/agent/core.py +0 -7
- synapse_sdk/clients/agent/service.py +0 -15
- synapse_sdk/clients/backend/dataset.py +0 -51
- synapse_sdk/clients/ray/__init__.py +0 -6
- synapse_sdk/clients/ray/core.py +0 -22
- synapse_sdk/clients/ray/serve.py +0 -20
- synapse_sdk/i18n.py +0 -35
- synapse_sdk/plugins/categories/__init__.py +0 -0
- synapse_sdk/plugins/categories/base.py +0 -235
- synapse_sdk/plugins/categories/data_validation/__init__.py +0 -0
- synapse_sdk/plugins/categories/data_validation/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/data_validation/actions/validation.py +0 -10
- synapse_sdk/plugins/categories/data_validation/templates/config.yaml +0 -3
- synapse_sdk/plugins/categories/data_validation/templates/plugin/__init__.py +0 -0
- synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +0 -5
- synapse_sdk/plugins/categories/decorators.py +0 -13
- synapse_sdk/plugins/categories/export/__init__.py +0 -0
- synapse_sdk/plugins/categories/export/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/export/actions/export.py +0 -10
- synapse_sdk/plugins/categories/import/__init__.py +0 -0
- synapse_sdk/plugins/categories/import/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/import/actions/import.py +0 -10
- synapse_sdk/plugins/categories/neural_net/__init__.py +0 -0
- synapse_sdk/plugins/categories/neural_net/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/neural_net/actions/deployment.py +0 -45
- synapse_sdk/plugins/categories/neural_net/actions/inference.py +0 -18
- synapse_sdk/plugins/categories/neural_net/actions/test.py +0 -10
- synapse_sdk/plugins/categories/neural_net/actions/train.py +0 -143
- synapse_sdk/plugins/categories/neural_net/templates/config.yaml +0 -12
- synapse_sdk/plugins/categories/neural_net/templates/plugin/__init__.py +0 -0
- synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +0 -4
- synapse_sdk/plugins/categories/neural_net/templates/plugin/test.py +0 -2
- synapse_sdk/plugins/categories/neural_net/templates/plugin/train.py +0 -14
- synapse_sdk/plugins/categories/post_annotation/__init__.py +0 -0
- synapse_sdk/plugins/categories/post_annotation/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/post_annotation/actions/post_annotation.py +0 -10
- synapse_sdk/plugins/categories/post_annotation/templates/config.yaml +0 -3
- synapse_sdk/plugins/categories/post_annotation/templates/plugin/__init__.py +0 -0
- synapse_sdk/plugins/categories/post_annotation/templates/plugin/post_annotation.py +0 -3
- synapse_sdk/plugins/categories/pre_annotation/__init__.py +0 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation.py +0 -10
- synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +0 -3
- synapse_sdk/plugins/categories/pre_annotation/templates/plugin/__init__.py +0 -0
- synapse_sdk/plugins/categories/pre_annotation/templates/plugin/pre_annotation.py +0 -3
- synapse_sdk/plugins/categories/registry.py +0 -16
- synapse_sdk/plugins/categories/smart_tool/__init__.py +0 -0
- synapse_sdk/plugins/categories/smart_tool/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/smart_tool/actions/auto_label.py +0 -37
- synapse_sdk/plugins/categories/smart_tool/templates/config.yaml +0 -7
- synapse_sdk/plugins/categories/smart_tool/templates/plugin/__init__.py +0 -0
- synapse_sdk/plugins/categories/smart_tool/templates/plugin/auto_label.py +0 -11
- synapse_sdk/plugins/categories/templates.py +0 -32
- synapse_sdk/plugins/cli/__init__.py +0 -21
- synapse_sdk/plugins/cli/publish.py +0 -37
- synapse_sdk/plugins/cli/run.py +0 -67
- synapse_sdk/plugins/exceptions.py +0 -22
- synapse_sdk/plugins/models.py +0 -121
- synapse_sdk/plugins/templates/cookiecutter.json +0 -11
- synapse_sdk/plugins/templates/hooks/post_gen_project.py +0 -3
- synapse_sdk/plugins/templates/hooks/pre_prompt.py +0 -21
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env +0 -24
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env.dist +0 -24
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.gitignore +0 -27
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.pre-commit-config.yaml +0 -7
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/README.md +0 -5
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/config.yaml +0 -6
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/main.py +0 -4
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/plugin/__init__.py +0 -0
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/pyproject.toml +0 -13
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +0 -1
- synapse_sdk/shared/enums.py +0 -8
- synapse_sdk/utils/debug.py +0 -5
- synapse_sdk/utils/file.py +0 -87
- synapse_sdk/utils/module_loading.py +0 -29
- synapse_sdk/utils/pydantic/__init__.py +0 -0
- synapse_sdk/utils/pydantic/config.py +0 -4
- synapse_sdk/utils/pydantic/errors.py +0 -33
- synapse_sdk/utils/pydantic/validators.py +0 -7
- synapse_sdk/utils/storage.py +0 -91
- synapse_sdk/utils/string.py +0 -11
- synapse_sdk-1.0.0a11.dist-info/LICENSE +0 -21
- synapse_sdk-1.0.0a11.dist-info/METADATA +0 -43
- synapse_sdk-1.0.0a11.dist-info/RECORD +0 -111
- {synapse_sdk-1.0.0a11.dist-info → synapse_sdk-2026.1.1b2.dist-info}/entry_points.txt +0 -0
- {synapse_sdk-1.0.0a11.dist-info → synapse_sdk-2026.1.1b2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,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
|