Explains step-based workflow system for Synapse plugin actions. Use when the user mentions "BaseStep", "StepRegistry", "Orchestrator", "StepResult", "BaseStepContext", "step-based workflow", "workflow steps", "rollback", "progress_weight", or needs help with multi-step action development.
Explains step-based workflow system for multi-phase Synapse plugin actions with rollback.
/plugin marketplace add datamaker-kr/synapse-claude-marketplace/plugin install synapse-plugin-helper@synapse-marketplaceThis skill inherits all available tools. When active, it can use any tool Claude has access to.
references/contexts.mdreferences/orchestrator.mdreferences/step-classes.mdSynapse SDK provides a step-based workflow system for complex actions that need:
| Component | Purpose |
|---|---|
BaseStep | Abstract step definition |
StepResult | Step execution result |
StepRegistry | Ordered step registration |
Orchestrator | Step execution with rollback |
BaseStepContext | State sharing between steps |
from dataclasses import dataclass, field
from synapse_sdk.plugins.steps import (
BaseStep,
StepResult,
StepRegistry,
Orchestrator,
BaseStepContext,
)
from synapse_sdk.plugins.context import RuntimeContext
# 1. Define context for state sharing
@dataclass
class ProcessContext(BaseStepContext):
data: list = field(default_factory=list)
processed: int = 0
# 2. Define steps
class LoadStep(BaseStep[ProcessContext]):
@property
def name(self) -> str:
return 'load'
@property
def progress_weight(self) -> float:
return 0.3
def execute(self, ctx: ProcessContext) -> StepResult:
ctx.data = load_data()
return StepResult(success=True, data={'count': len(ctx.data)})
class ProcessStep(BaseStep[ProcessContext]):
@property
def name(self) -> str:
return 'process'
@property
def progress_weight(self) -> float:
return 0.7
def execute(self, ctx: ProcessContext) -> StepResult:
for item in ctx.data:
process(item)
ctx.processed += 1
ctx.set_progress(ctx.processed, len(ctx.data))
return StepResult(success=True)
# 3. Register and run
registry = StepRegistry[ProcessContext]()
registry.register(LoadStep())
registry.register(ProcessStep())
context = ProcessContext(runtime_ctx=runtime_ctx)
orchestrator = Orchestrator(registry, context)
result = orchestrator.execute()
Override setup_steps() in specialized actions:
from synapse_sdk.plugins.actions.train import BaseTrainAction, TrainContext
from synapse_sdk.plugins.steps import StepRegistry
class MyTrainAction(BaseTrainAction[TrainParams]):
def setup_steps(self, registry: StepRegistry[TrainContext]) -> None:
registry.register(LoadDatasetStep())
registry.register(TrainStep())
registry.register(UploadModelStep())
Progress is calculated based on step weights:
# Total weight = 0.2 + 0.6 + 0.2 = 1.0
LoadStep() # progress_weight = 0.2 -> 0-20%
TrainStep() # progress_weight = 0.6 -> 20-80%
UploadStep() # progress_weight = 0.2 -> 80-100%
On failure, executed steps are rolled back in reverse order:
class UploadStep(BaseStep[UploadContext]):
def execute(self, ctx: UploadContext) -> StepResult:
ctx.uploaded_files = upload_files()
return StepResult(success=True)
def rollback(self, ctx: UploadContext, result: StepResult) -> None:
for file in ctx.uploaded_files:
delete_file(file)
Skip steps based on context:
class OptionalStep(BaseStep[MyContext]):
def can_skip(self, ctx: MyContext) -> bool:
return not ctx.params.get('enable_validation', True)
Activates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use for discovering, retrieving, and improving prompts.
Search, retrieve, and install Agent Skills from the prompts.chat registry using MCP tools. Use when the user asks to find skills, browse skill catalogs, install a skill for Claude, or extend Claude's capabilities with reusable AI agent components.
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.