Programmatic API
While FlowDrop is primarily a visual editor, you may need to create or modify workflows programmatically — for testing, migration, code generation, or batch operations.
WorkflowAdapter
Section titled “WorkflowAdapter”The WorkflowAdapter provides a high-level API for workflow manipulation using a StandardWorkflow format.
import { WorkflowAdapter } from '@flowdrop/flowdrop/core';
// Initialize with your node type definitionsconst adapter = new WorkflowAdapter(nodeTypes);Creating Workflows
Section titled “Creating Workflows”// Create a new workflowconst workflow = adapter.createWorkflow('My Pipeline', 'Processes user input');
// Add nodesconst inputNode = adapter.addNode( workflow, 'text_input', // node type ID { x: 100, y: 200 }, // position { placeholder: 'Enter text...' } // initial config);
const modelNode = adapter.addNode( workflow, 'chat_model', { x: 400, y: 200 }, { model: 'gpt-4', temperature: 0.7 });
const outputNode = adapter.addNode(workflow, 'text_output', { x: 700, y: 200 });
// Connect nodesadapter.addEdge(workflow, inputNode.id, modelNode.id, 'output', 'prompt');adapter.addEdge(workflow, modelNode.id, outputNode.id, 'response', 'input');Querying Workflows
Section titled “Querying Workflows”// Find nodes by typeconst models = adapter.getNodesByType(workflow, 'chat_model');
// Get edges connected to a nodeconst edges = adapter.getNodeEdges(workflow, inputNode.id);
// Get adjacent nodesconst connected = adapter.getConnectedNodes(workflow, modelNode.id);
// Get statisticsconst stats = adapter.getWorkflowStats(workflow);// { totalNodes: 3, totalEdges: 2, nodeTypeCounts: { text_input: 1, ... }, lastModified: '...' }Modifying Workflows
Section titled “Modifying Workflows”// Update node positionadapter.updateNodePosition(workflow, inputNode.id, { x: 150, y: 250 });
// Update node configurationadapter.updateNodeConfig(workflow, modelNode.id, { temperature: 0.9 });
// Remove a node (also removes connected edges)adapter.removeNode(workflow, outputNode.id);
// Remove an edgeadapter.removeEdge(workflow, 'edge-id');Import/Export
Section titled “Import/Export”// Export to JSON stringconst json = adapter.exportWorkflow(workflow);
// Import from JSONconst imported = adapter.importWorkflow(json);
// Clone with new IDsconst clone = adapter.cloneWorkflow(workflow, 'Copy of My Pipeline');Validation
Section titled “Validation”const result = adapter.validateWorkflow(workflow);// { valid: boolean, errors: string[], warnings: string[] }
if (!result.valid) { console.error('Validation errors:', result.errors);}Format Conversion
Section titled “Format Conversion”Convert between the adapter’s StandardWorkflow format and FlowDrop’s internal editor format:
// Editor format → Standard formatconst standard = adapter.fromSvelteFlow(editorWorkflow);
// Standard format → Editor formatconst editorFormat = adapter.toSvelteFlow(standard);Helper Classes
Section titled “Helper Classes”FlowDrop’s editor uses helper classes internally. These are available for advanced integrations.
EdgeStylingHelper
Section titled “EdgeStylingHelper”Determines edge visual styles based on port data types:
import { EdgeStylingHelper } from '@flowdrop/flowdrop/editor';
// Get edge category from source port typeconst category = EdgeStylingHelper.getEdgeCategory('trigger'); // 'trigger'const category = EdgeStylingHelper.getEdgeCategory('string'); // 'data'const category = EdgeStylingHelper.getEdgeCategory('tool'); // 'tool'
// Update all edge styles in a workflowconst styledEdges = EdgeStylingHelper.updateEdgeStyles(edges, nodes);Edge categories and their visual styles:
| Category | Port type | Visual style |
|---|---|---|
trigger | trigger data type | Solid dark line |
tool | tool data type | Dashed amber line |
loopback | Targets loop_back port | Dashed gray line |
data | Everything else | Gray line |
NodeOperationsHelper
Section titled “NodeOperationsHelper”Creates nodes from drag-and-drop data and loads node metadata:
import { NodeOperationsHelper } from '@flowdrop/flowdrop/editor';
// Create a node from sidebar drop dataconst node = NodeOperationsHelper.createNodeFromDrop( dropDataString, // JSON string from drag event { x: 300, y: 200 }, // canvas position existingNodes // for generating unique IDs);
// Load node definitions from APIconst nodes = await NodeOperationsHelper.loadNodesFromApi();WorkflowOperationsHelper
Section titled “WorkflowOperationsHelper”Workflow-level operations including save, export, and validation:
import { WorkflowOperationsHelper } from '@flowdrop/flowdrop/editor';
// Save to backendconst saved = await WorkflowOperationsHelper.saveWorkflow(workflow);
// Export as JSON downloadWorkflowOperationsHelper.exportWorkflow(workflow);
// Export as Agent Spec formatconst result = WorkflowOperationsHelper.exportAsAgentSpec(workflow);// { valid: boolean, errors: string[], warnings: string[] }
// Import from Agent Spec fileconst imported = await WorkflowOperationsHelper.importFromAgentSpec(file);
// Check for cyclesconst hasCycles = WorkflowOperationsHelper.checkWorkflowCycles(nodes, edges);Use Cases
Section titled “Use Cases”Generate Workflows from Templates
Section titled “Generate Workflows from Templates”function createFromTemplate(template: string, params: Record<string, string>) { const adapter = new WorkflowAdapter(nodeTypes); const workflow = adapter.createWorkflow(`${template} Pipeline`);
if (template === 'chat') { const input = adapter.addNode(workflow, 'text_input', { x: 100, y: 200 }); const model = adapter.addNode( workflow, 'chat_model', { x: 400, y: 200 }, { model: params.model || 'gpt-4' } ); const output = adapter.addNode(workflow, 'text_output', { x: 700, y: 200 }); adapter.addEdge(workflow, input.id, model.id, 'output', 'prompt'); adapter.addEdge(workflow, model.id, output.id, 'response', 'input'); }
return adapter.toSvelteFlow(workflow);}Batch Configuration Updates
Section titled “Batch Configuration Updates”function updateAllModels(workflow: StandardWorkflow, newModel: string) { const adapter = new WorkflowAdapter(nodeTypes); const models = adapter.getNodesByType(workflow, 'chat_model');
for (const node of models) { adapter.updateNodeConfig(workflow, node.id, { model: newModel }); }
return workflow;}