edges. After each customer message, the framework picks the next node by checking deterministic edges first (instant, free), then handing off to the routing LLM if nothing deterministic matches.
Edge fields
Edge types
Expression and unconditional edges are checked together (in
priority order, ascending) before any LLM call is made.
To put routing in its own node instead of on a conversational node’s edges — a silent classifier or a pre-conversation dispatcher — use a router node.
Expression edges
"logic": "and" when all conditions must be true. Use "logic": "or" when any one is enough.
Operators
Equality
eq, neqNumbers
gt, gte, lt, lteText
containsLists
in, not_inExistence
exists, not_existsPriority
Lower priority fires first. Defaults if not set: deterministic edges (expression, unconditional, event) get priority0; LLM edges get priority 100. Within the deterministic bucket, the first matching edge wins. For mutually-exclusive rules (e.g. working-hours vs after-hours), set distinct priorities to make ordering explicit.
Built-in variables
These variables are populated automatically and can be referenced in any expression.Typed variables
Values used in expressions often arrive as strings (event properties, extractedparameters, dynamic context_data). So "18" would not match 18, and "false" would not be treated as a boolean. Declare the variable’s type and both sides of the comparison are converted before matching.
Add a variable_types map at the top level of the graph config. Each key is the variable path, written exactly as it appears in the condition (including dot-notation):
Common patterns
Working hours (10 AM to 6 PM)Inline data extraction
Edges can capture typed values from the user’s reply during routing. The routing LLM treats them as required parameters; on a successful transition the values are merged intocontext_data and become available everywhere.
context_data["order_id"] is set and you can:
- Reference it in node prompts via
{order_id}. - Use it in downstream expression edges:
{ "variable": "order_id", "operator": "exists" }. - Pass it to API tools as
%(order_id)s.
Routing instructions
Therouting_instructions field is prepended to every routing request. Keep it short and directive:
{variable} placeholders. They are substituted from context_data (and the flattened recipient_data) at runtime. Missing keys render as NULL.
