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,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
|