mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-05-06 19:49:36 +00:00
feat: Add complete Python workflow executor from AutoMetabuilder
Add full Python workflow execution engine with: Core Executor: - engine.py: WorkflowEngine for running n8n configs - n8n_executor.py: N8N-style workflow execution with connections - node_executor.py: Individual node execution with plugin dispatch - loop_executor.py: Loop node execution with iteration control - execution_order.py: Topological sort for node ordering Schema & Validation: - n8n_schema.py: N8N workflow schema types and validation - n8n_converter.py: Legacy to n8n schema conversion Plugin System: - plugin_loader.py: Dynamic plugin loading - plugin_registry.py: Plugin discovery and registration - plugin_map.json: 116 plugin type mappings Runtime & Context: - runtime.py: Workflow runtime container - input_resolver.py: Binding and coercion resolution - value_helpers.py: Value normalization helpers - workflow_context_builder.py: Runtime context assembly - workflow_config_loader.py: Configuration loading - workflow_engine_builder.py: Engine assembly with dependencies Utilities: - tool_calls_handler.py: LLM tool call handling - tool_runner.py: Tool execution with logging - notification_helpers.py: Slack/Discord notifications - workflow_adapter.py: N8N format handling - workflow_graph.py: Node/edge graph for visualization Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
"""Build workflow engine with dependencies."""
|
||||
from .engine import WorkflowEngine
|
||||
from .input_resolver import InputResolver
|
||||
from .loop_executor import LoopExecutor
|
||||
from .node_executor import NodeExecutor
|
||||
from .plugin_registry import PluginRegistry, load_plugin_map
|
||||
from .runtime import WorkflowRuntime
|
||||
from .tool_runner import ToolRunner
|
||||
|
||||
|
||||
def build_workflow_engine(workflow_config: dict, context: dict, logger):
|
||||
"""Assemble workflow engine dependencies."""
|
||||
runtime = WorkflowRuntime(context=context, store={}, tool_runner=None, logger=logger)
|
||||
# Only create ToolRunner if tool_map and msgs are provided (needed for AI workflows)
|
||||
if "tool_map" in context and "msgs" in context:
|
||||
tool_runner = ToolRunner(context["tool_map"], context["msgs"], logger)
|
||||
runtime.tool_runner = tool_runner
|
||||
|
||||
plugin_registry = PluginRegistry(load_plugin_map())
|
||||
input_resolver = InputResolver(runtime.store)
|
||||
loop_executor = LoopExecutor(runtime, input_resolver)
|
||||
node_executor = NodeExecutor(runtime, plugin_registry, input_resolver, loop_executor)
|
||||
loop_executor.set_node_executor(node_executor)
|
||||
|
||||
return WorkflowEngine(workflow_config, node_executor, logger, runtime, plugin_registry)
|
||||
Reference in New Issue
Block a user