Skip to main content
For some workflows, you might want to refine the automation graph or input variables the builder agent has generated. For that we offer a UI.

Edit Graph

The main steps of your business process are captured in the automation graph. A graph consists of nodes and edges. Nodes are predefined actions that you instruct our agent to take such as clicking, typing or making a decision. You can add nodes by right-clicking on the canvas and connect them with each other by drawing an edge between them.

Node Types

The workflow editor provides various node types to automate business processes through a graph-based interface. Action Nodes handle direct interactions like Navigate, Click or ExtractDatamodel (structured data extraction). Control Flow Nodes include BoolCondition for branching logic and Loop for repeated operations over arrays or ranges. Specialized Nodes cover advanced scenarios like Tfa (two-factor authentication), FileUpload/FileDownload (file management) or UserInteraction (human-in-the-loop).

Execution Types

Nodes can use different execution strategies:
  • STATIC (UI: “Static”): Uses explicit XPATH selectors for deterministic targeting
  • LLM_VISION (UI: “AI (Screenshot)”): Uses AI to do an action or make a decision based off a screenshot. If the target element is not visible, the model may return a scroll action—this is retried up to 6 times before failing
  • LLM_DOM (UI: “AI (HTML)”): Leverages AI to extract elements in the DOM structure (for ExtractDatamodel only)
  • COORDINATES (UI: “Coordinates”): Uses specific x,y screen coordinates to perform an action (for Click and InputText)
  • PROMPT (UI: “AI (Context)”): Uses AI and the worklow run context to make a decision or extract data (for ExtractDatamodel and BoolCondition)

Tips and Tricks

  • Use descriptive names for each node action. These are important context for the maintenance agent during recovery.
  • Leverage LLM execution types when static selectors get too complex
  • Use STATIC execution when possible for speed and reliability

Keyboard Shortcuts

The workflow editor supports the following keyboard shortcuts for efficient editing:
ShortcutAction
⌘/Ctrl + KSearch for nodes
⌘/Ctrl + ZUndo
⌘/Ctrl + Shift + ZRedo
⌘/Ctrl + YRedo (alternative)
⌘/Ctrl + CCopy selected nodes
⌘/Ctrl + VPaste nodes

Variables

Variables allow you to use dynamic data throughout your workflow. They are referenced using double curly braces: {{variable_path}}.

Variable Sources

SourcePathDescription
Input variablescontext.inputs.*Data passed when starting the workflow run (e.g., {{context.inputs.order_id}})
Extracted datacontext.*Data extracted during workflow execution using ExtractDatamodel or ExtractNetwork nodes (e.g., {{context.customer_name}})
Runtime variablescontext.runtime.*Loop iteration values—current item and index (e.g., {{context.runtime.current_order}})

Where Variables Can Be Used

Variables can be used in most node parameters:
  • Text input: Type dynamic values (e.g., {{context.inputs.username}})
  • XPath selectors: Build dynamic selectors (e.g., //tr[@data-id='{{context.order_id}}'])
  • URLs: Navigate to dynamic pages (e.g., https://app.example.com/orders/{{context.inputs.order_id}})
  • Prompts: Include context in AI prompts (e.g., "Find the row for customer {{context.customer_name}}")
  • Data model field names: Use dynamic keys in extraction schemas

Data Transformation

Variables can be transformed using JSONata expressions. For example, to convert a date from YYYY-MM-DD to MM/DD/YYYY:
{{$fromMillis($toMillis(context.inputs.date, "[Y0001]-[M01]-[D01]"), "[M01]/[D01]/[Y0001]")}}

Edit Inputs & Outputs

All workflows are parameterized with inputs. You can access these variables with {{context.inputs.my_variable}}. All the data that is extracted during runtime is returned in the execution.success webhook payload. If you only want a subset of this returned, you can specify an optional output schema.

Example: Date Transformation

Here’s how to use a transformed date variable in an Input Text node:
{
  "id": "ae4a223f-645e-4dae-b09c-40168b3629e3",
  "name": "Type Date",
  "description": "\n",
  "parameters": {
    "selector": "//input[@id='date']",
    "execution": "STATIC",
    "text": "{{$fromMillis($toMillis(context.inputs.date, "[Y0001]-[M01]-[D01]"), "[M01]/[D01]/[Y0001]")}}",
    "wait_time": 25000
  },
  "action": "INPUT_TEXT"
}