Skip to main content
Every node has a list of 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

Use "logic": "and" when all conditions must be true. Use "logic": "or" when any one is enough.

Operators

Equality

eq, neq

Numbers

gt, gte, lt, lte

Text

contains

Lists

in, not_in

Existence

exists, not_exists

Priority

Lower priority fires first. Defaults if not set: deterministic edges (expression, unconditional, event) get priority 0; 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.
Time variables (current_hour, current_weekday, etc.) are populated only when recipient_data.timezone is set on the call. Without a timezone, time-based expressions silently never match. Always set timezone when creating a call that uses time-based routing.

Typed variables

Values used in expressions often arrive as strings (event properties, extracted parameters, 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):
Declare a type whenever a value can arrive as a string. If you leave a variable out, the framework guesses based on the values, which is fine for plain numbers but unreliable for booleans.

Common patterns

Working hours (10 AM to 6 PM)
Auto-escalate after too many retries

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 into context_data and become available everywhere.
After the transition, 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.
Prefer parameters over a separate “extract” node. One LLM call routes and captures data.

Define what each value means

Give a parameter a description and, for string values, allowed_values. The routing model sees the description on that key, and it can only answer with one of the allowed values, so expression edges can match one exact value.
  • Without a description, the model is only told “The <name> provided by the user”, so put the rules for each value in its own description rather than in function_description.
  • allowed_values works on string parameters only.
  • Both forms can be mixed on one edge.

Naming rules

  • reasoning, confidence, recipient_data, detected_language and names starting with _ are reserved, and an agent using them is rejected when saved.
  • A value with the same name as an earlier one, on this edge or another, replaces it. A retry edge that asks again overwrites the first attempt’s answer.

Getting the values after the call

The values a call collected are returned on the execution as node_extracted_data, the latest value per key, in Get execution and the webhook payload.

Routing instructions

The routing_instructions field is prepended to every routing request. Keep it short and directive:
You can include {{variable}} placeholders. They are substituted from context_data (and the flattened recipient_data) at runtime. Missing keys render as NULL.

Next steps

Router nodes

Graph agents overview