Conditions in Flows | Rasa Documentation

Conditions

Conditions are used in flows in three different places:

Syntax

Conditions in flows are written using natural language that can include logical operators, conditional operators and other constructs. They are evaluated with the pypred library.

These conditions support the following operators,

Parentheses

Use parentheses to group expressions and control the order of evaluation. For example:

- collect: age
  next:
    - if: slots.age < 18
      then: under_18_step
    - if: (slots.age > 18 and (consent = "yes" or consent = "y"))
      then: consent_accept
    - else: consent_decline

Subset Operator

Subset operator contains can be used in the format SET contains VALUE where SET is the set of possible values and VALUE being the name of slot. For example:

- collect: emergency
  next:
    - if: "{'WARN' 'ERR' 'CRIT'} contains slots.error_level"
      then: handoff
    - else: everything_okay

contains operator can also be used to identify substrings when used as slots.product contains "Rasa" however this check is case-sensitive.

Constants

Regular Expressions

When using the matches operator, you can include regular expression modifiers. The regex modifier should be enclosed in quotes. For example, this flow step checks if the zipcode slot contains a United States zip code:

- collect: zipcode
  description: ask zipcode and check if its a zip code
  next:
    - if: slots.zipcode matches "\d{5}(-\d{4})?"
      then: ask_payment
    - else: wrong_zipcode

A case-insensitive substring comparison can be made with the condition product matches "(?i).*rasa.*" which checks for the substring rasa within the variable product.

Empty Values

If you want to check if a boolean slot is not set, you need to use the syntax <boolean-slot> is null. To check if a text slot is not set or empty, use the syntax not <text-slot>.

Examples

Here are some examples of conditions that demonstrate the use of different constructs.

# Simple conditions
age > 18
name is "Alice"
name is empty
status = "active"
status is not null

# Combining Conditions
age > 21 and gender = "female"
category = "electronics" or category = "computers"
status = "active" and (priority = 1 or priority = 2)
status = empty or status is null
description matches "/error \d{3}/i" and (severity = "high" or source contains "server")

Namespaces

Namespaces are used to access different types of data in predicates used in branching conditions, slot validation, and flow guards. There are two available namespaces: slots and context. The slots namespace is used to access slot values, while the context namespace is used to access the current dialogue frame properties.

Slots

The slots namespace is used to access slot values. The slot name must be prefixed with slots. to be accessible in the condition. For example:

- id: some_question
  collect: age
  next:
    - if: slots.age < 18
      then: under_18_step
    - else: over_18_step

Make sure to have the slot defined in the domain. If the slot is not defined in the domain or the slot is not prefixed with slots. namespace, the validation that runs during training will fail with an appropriate error.

Context

The context namespace is used to access the properties of the current dialogue frame. The property must be prefixed with context. to be accessible in the predicate. For example:

  pattern_completed:
    description:  a flow has been completed and there is nothing else to be done
    steps:
      - noop: true
        next:
          - if: context.previous_flow_name != "greeting"
            then:
              - action: utter_what_can_help_with
                next: END
          - else: stop
      - id: stop
        action: action_stop

You can also use jinja templating to access the context namespace. For example:

  pattern_completed:
    description:  a flow has been completed and there is nothing else to be done
    steps:
      - noop: true
        next:
          - if: "{{context.previous_flow_name}}" != "greeting"
            then:
              - action: utter_what_can_help_with
                next: END
          - else: stop
      - id: stop
        action: action_stop

Dialogue Frames

The dialogue manager organizes the advancement of flows (both user-defined and built-in) in a dialogue frame stack. The dialogue frame stack represents a LIFO (Last-In-First-Out) stack of dialogue frames. Different types of dialogue frames are mapped to built-in conversational patterns that enable conversation repair.

Each dialogue frame has a flow_id and step_id property. The flow_id is the id of the current flow and the step_id is the id of the current step in the flow.

The following dialogue frames types are available:

  1. cancel: handles flow cancellation
  2. chitchat: handles chitchat
  3. clarify: handles clarification
  4. collect information: handles information collection
  5. completion: handles flow completion
  6. continue interrupted: handles continuation of interrupted flows
  7. correction: handles correction
  8. internal error: handles internal errors
  9. search: handles knowledge search
  10. skip question: handles skipping of information collection
  11. code change: cleans the stack after an assistant update
  12. can not handle: handles situations where the assistant cannot handle
  13. human handoff: handles handoff to human
  14. validate slot: handles real-time slot validations that are strictly independent of business logic
  15. customer satisfaction: handles customer satisfaction feedback collection at the end of a conversation