Script setup
This article is part of a tutorial about creating an outbound call campaign using NLU.
- Telephony setup
- Script setup (you are here)
- Campaign launch
- Analytics
- Additional features
- Testing
During this stage we will set up the bot script. We will utilize various $dialer methods in the bot script extensions for telephony management, and we will be using the NLU core for natural language understanding.
Configuration file
Go to the Editor and create a standard chatbot.yaml configuration file for NLU projects:
name: call-campaign
entryPoint: main.sc
botEngine: v2
language: en
nlp:
intentNoMatchThresholds:
phrases: 0.2
patterns: 0.2
The main script
Create the src/main.sc file and put the main script mechanics into the theme tag:
theme: /
state: Start
q!: $regex</start>
script:
$jsapi.startSession();
$session.userName = $dialer.getPayload().name || "stranger";
$dialer.setCallResult("Greeting");
a: Hello, {{$session.userName}}!
a: Due to the COVID-19 pandemic, the world government is concerned for your safety.
go!: /Symptoms
state: Symptoms
a: Have you recently found yourself with a fever, a dry cough, or a rapid tiredness?
state: Positive
intent: /Agree
intent: /Sick
a: Then do not put yourself in danger! Seek medical attention immediately!
script:
$dialer.reportData("Case", "Positive");
$dialer.setCallResult("Known case");
go!: /Goodbye
state: Negative
intent: /Disagree
intent: /Healthy
a: Good to hear everything is fine! Still, do not forget to wash your hands and wear face masks.
script:
$dialer.reportData("Case", "Negative");
$dialer.setCallResult("Known case");
go!: /Goodbye
state: Unrecognized
event!: noMatch
a: So you say: {{$parseTree.text}}. Remember about proper hygiene and wearing face masks.
script:
$dialer.reportData("Case", $parseTree.text);
$dialer.setCallResult("Known case");
go!: /Goodbye
state: Goodbye
event!: hangup
a: Goodbye and stay safe!
script:
$dialer.hangUp();
state: NoInput || noContext = true
event!: speechNotRecognized
script:
$session.noInputCounter = $session.noInputCounter || 0;
$session.noInputCounter++;
if: $session.noInputCounter >= 3
a: I’m sorry, there’s something wrong with the connection.
script:
$dialer.setCallResult("Bad connection");
go!: /Goodbye
else:
a: I didn’t catch that. Could you repeat, please?
Also create the test/test.xml file, but leave it empty for now:
<test>
<test-case/>
</test>
Dialog start
When the bot reaches out to the client, it receives a /start command, which can be processed with a pattern for regular expressions. The handler for this activator does the following:
- Marks the session as new and cleans previously stored session data.
- Extracts the client name from the phone number list and stores it in the session data.
- Sets the appropriate call result.
If no client name is provided, a neutral form of address is used instead.
state: Start
q!: $regex</start>
script:
$jsapi.startSession();
$session.userName = $dialer.getPayload().name || "stranger";
$dialer.setCallResult("Greeting");
a: Hello, {{$session.userName}}!
a: Due to the COVID-19 pandemic, the world government is concerned for your safety.
go!: /Symptoms
Reporting the client response
The states nested into the Symptoms parent state handle different replies to the question about the client’s well-being, whether it be positive, negative, or unrecognized. In each case, the bot records the reply to the campaign report under the Case column. Unrecognized responses are recorded as is.
state: Symptoms
a: Have you recently found yourself with a fever, a dry cough, or a rapid tiredness?
state: Positive
intent: /Agree
intent: /Sick
a: Then do not put yourself in danger! Seek medical attention immediately!
script:
$dialer.reportData("Case", "Positive");
$dialer.setCallResult("Known case");
go!: /Goodbye
state: Negative
intent: /Disagree
intent: /Healthy
a: Good to hear everything is fine! Still, do not forget to wash your hands and wear face masks.
script:
$dialer.reportData("Case", "Negative");
$dialer.setCallResult("Known case");
go!: /Goodbye
state: Unrecognized
event!: noMatch
a: So you say: {{$parseTree.text}}. Remember about proper hygiene and wearing face masks.
script:
$dialer.reportData("Case", $parseTree.text);
$dialer.setCallResult("Known case");
go!: /Goodbye
$dialer.reportDataDialog end
During the last step, the bot says goodbye and ends the call.
state: Goodbye
event!: hangup
a: Goodbye and stay safe!
script:
$dialer.hangUp();
Unrecognized speech handling
The NoInput technical state handles situations when no response from the client can be recognized. If the number of transitions to this state becomes greater than the threshold, the bot ends the call.
state: NoInput || noContext = true
event!: speechNotRecognized
script:
$session.noInputCounter = $session.noInputCounter || 0;
$session.noInputCounter++;
if: $session.noInputCounter >= 3
a: I’m sorry, there’s something wrong with the connection.
script:
$dialer.setCallResult("Bad connection");
go!: /Goodbye
else:
a: I didn’t catch that. Could you repeat, please?
speechNotRecognized event handler and impose a limit on unrecognized requests per session, so that ineffective calls finish quickly without spending excessive call minutes.Intent setup
Go to NLU > Intents and create the intents used in the script: /Agree, /Disagree, /Healthy, and /Sick. Fill them with training phrases conveying the appropriate meanings:
| Agree | yes | yeah | I have | yep |
| Disagree | no | I don’t | no need | I don’t have anything |
| Healthy | everything is fine | we are all okay | I’m fit as a fiddle | there is no problem |
| Sick | I’m sick | quite feverish, yes | I have COVID | I really am tired |

After filling up the intents, press the Test button in order to train the classifier.
Now everything is ready for you to create and launch your first campaign.