A node-based AI workflow builder built using React, ReactFlow, Zustand, TailwindCSS, and FastAPI.
This project focuses on building a scalable and reusable node abstraction system while supporting dynamic workflow interactions, validation, automatic edge generation, and DAG validation.
Created a reusable BaseNode abstraction to avoid duplicated logic across nodes.
Each node is configuration-driven through:
- fields
- handles
- colors
- icons
- validation rules
This makes adding new nodes fast, scalable, and maintainable.
The TextNode supports dynamic variable extraction using:
{{variable}}Features:
- Regex-based variable extraction
- Dynamic target handle generation
- Real-time validation
- Automatic edge generation
- Automatic input node creation
- Variable badges with validation states
Example:
Hello {{input_1}}Automatically creates:
InputNode(input_1) → TextNodeImplemented reusable validation support inside BaseNode.
Supports:
- Required field validation
- Regex/pattern validation
- Real-time UI feedback
- Submission blocking for invalid nodes
Represents workflow input variables.
Outputs:
- Value
Dynamic text template node supporting:
- Variable parsing
- Dynamic handles
- Automatic edge creation
Represents external API execution.
Inputs:
- Body
- Headers
Outputs:
- Response
- Error
Branching logic node.
Supported operators:
- Contains
- Equals
- Starts With
- Ends With
- Greater Than
- Less Than
Outputs:
- True
- False
Data transformation middleware.
Operations:
- Parse JSON
- Stringify JSON
- Uppercase
- Lowercase
- Trim
- Extract Field
Represents semantic retrieval / RAG workflows.
Inputs:
- Query
- Filter
Outputs:
- Results
- Similarity Scores
Workflow documentation/comment node.
Integrated backend pipeline validation.
The backend:
- parses node/edge structure
- counts nodes and edges
- validates whether the graph is a valid DAG
Example response:
{
"num_nodes": 5,
"num_edges": 4,
"is_dag": true
}- React
- ReactFlow
- Zustand
- TailwindCSS
- Lucide React
- FastAPI
src/
├── components/
├── constants/
├── nodes/
│ ├── BaseNode.js
│ ├── inputNode.js
│ ├── outputNode.js
│ ├── llmNode.js
│ ├── textNode.js
│ └── NewNode.js
│
├── store.js
├── toolbar.js
├── ui.js
└── submit.jsInstall dependencies:
npm installStart frontend:
npm startFrontend runs on:
http://localhost:3000Install dependencies:
pip install -r requirements.txtRun backend:
uvicorn main:app --reloadBackend runs on:
http://localhost:8000Example workflow:
Input → Text → Transform → Condition → OutputExample variable binding:
{{input_1}}Automatically creates:
InputNode(input_1) → TextNodeThe primary goal of this assessment was to build:
- reusable node abstractions
- scalable architecture
- clean workflow composition
- extensible node systems
- dynamic graph interactions
- maintainable frontend architecture
The current system models workflow execution semantics cleanly, allowing future runtime execution layers to be added later.
Ram Kumar Muthuraj