An onlyIf clause is used for fine customization of activation rules. An onlyIf clause attached to an activation rule works like post-match condition that will either confirm activation by this rule, or reject it based on user-defined predicate.
An onlyIf function expects a predicate lambda-function as an argument bringing context, request and activator in a lambda context.
For example, this intent rule will be activated only if an entry with key name is in a client context:
activators {
intent("MakeOrder").onlyIf { context.client.containsKey("name") }
}
Chaining
Multiple onlyIf conditions can be attached to a single activation rule by chaining working as a logical and:
activators {
intent("MakeOrder")
.onlyIf { context.client.containsKey("name") }
.onlyIf { activator.intent!!.confidence >= 0.7 }
}
Built-in predicates
JAICF provides several handy onlyIf predicates out of the box:
disableIf
Opposite to an onlyIf
activators {
intent("TextMeBack").disableIf { request is TelephonyBotRequest }
}
onlyIfInClient, onlyIfInSession
The rule will be activated only if an entry with a given key is in client/session context, and value has a given type (optional), and a given predicate is true (optional)
activators {
intent("MakeOrder").onlyIfInClient<Int>("age") { it >= 18 }
intent("MakeOrder").onlyIfInSession<Int>("age") { it >= 18 }
}
onlyIfNotInClient, onlyIfNotInSession
The rule will be activated only if an entry with a given key is not in client/session context
activators {
intent("Name").onlyIfInNotInClient("name")
intent("Name").onlyIfInNotInSession("name")
}
onlyFrom
The rule will be activated only if the current request is received from a given channel, or the rule was activated by a given Activator, or both
activators {
intent("MakeOrder").onlyFrom(telegram)
intent("MakeOrder").onlyFrom(dialogflow)
intent("MakeOrder").onlyFrom(facebook and caila)
}
onlyIfBargeIn, disableIfBargeIn
The rule will be activated (rejected) only if the current request is a telephony barge-in request
activators {
intent("WhatsYourName").disableIfBargeIn()
intent("Details").onlyIfBargeIn()
}