Назначение значения по умолчанию для обязательного параметра в Dialogflow Fulfillment
TL; DR; (заголовок) Как назначить значение по умолчанию обязательному параметру через Dialoflow Fulfillment?
Длинный вопрос:
У меня есть 2 обязательных параметра. user_id и user_pin.
Я использовал вызов веб-перехватчика Fulfillment для заполнения слотов, и, похоже, все работает хорошо, кроме этого поведения:
После вызова API к базе данных, чтобы проверить, совпадают ли user_id и user_pin и не совпадают ли они, чат-бот Dialogflow отвечает: "Неверный PIN-код пользователя, укажите правильный PIN-код".
Затем пользователь предоставляет еще один user_pin, но Dialogflow запускает заполнение слота и снова запрашивает user_id. - "Укажите идентификатор пользователя".
Я не хочу, чтобы он снова запрашивал user_id. Поэтому, чтобы исправить это, после того, как указан неправильный user_pin, я создал контекст: "invalidPinContext" с параметрами {user_pin:user_pin}. Затем я установил значения по умолчанию:
user_id = # invalidPinContext.user_id
Это решает проблему, поскольку Dialogflow достаточно умен, чтобы знать, указан ли user_id уже или нет, и больше не запрашивает user_id снова. Но все присвоенные мной значения по умолчанию были выполнены только через консоль / UX Dialogflow, а не выполнялись. Я просмотрел документацию Google, но не могу сказать, как это сделать.
Итак, это подводит меня к вопросу: как присвоить значение по умолчанию обязательному параметру с помощью Dialoflow Fulfillment?
1 ответ
Короткий ответ, используйте структуру вроде
agent.setContext({
name: 'question2',
lifespan: 5,
parameters: {'name': name,'id': id},
});
const context = agent.getContext('question2');
const name = context.parameters.name
const id = context.parameters.id;
Длинный ответ, позвольте мне показать вам это на примере.
Предположим, у вас есть разговор, в котором вы пытаетесь извлечь имя и идентификатор. Это сделано для имитации двух необходимых параметров.
Тогда структура выполнения должна быть похожа на
function welcome(agent){
agent.add(`Can you tell me your name and id?`);
agent.setContext({
name: 'question',
lifespan: 3,
});
}
function answers(agent){
agent.getContext('question');
const name = agent.parameters['given-name'];
const id = agent.parameters.id;
if (name && id) {
agent.add(`So your name is ${name} and your id ${id}`);
} else if (name) {
agent.add(`Hello ${name}, what was your id?`);
} else if (id) {
agent.add(`So your id is ${id} but what is your name?`);
} else {
agent.add(`Can you tell me your name and id?`);
}
agent.setContext({
name: 'question2',
lifespan: 5,
parameters: {'name': name,'cid': id},
});
}
function answers2(agent){
const cont = agent.getContext('question2');
const cname = cont.parameters.name;
const cid = cont.parameters.cid;
const nname = agent.parameters['given-name'];
const nid = agent.parameters.id;
if (cname){
if (cid){
agent.add(`So your name is ${cname} and your id ${cid}`);
} else if (nid){
agent.add(`So your name is ${cname} and your id ${nid}`);
} else {
agent.add(`Sorry still I do not know what is your id`);
}
} else if (cid){
if (cname){
agent.add(`So your name is ${cname} and your id ${cid}`);
} else if (nname){
agent.add(`So your name is ${nname} and your id ${cid}`);
} else {
agent.add(`Sorry still I do not know what is your name`);
}
} else {
agent.add(`I still need both your name and your id`);
}
}
Затем вы можете провести следующий разговор:
- Привет!-> Можете назвать свое имя и идентификатор?
- Конечно, меня зовут Алан -> Привет, Алан, какой у тебя был идентификатор?
- 77678 -> Итак, вас зовут Алан и ваш идентификатор 77678
Вам нужно будет изменить функции и структуру, чтобы они соответствовали вашим потребностям, но я думаю, что этот пример иллюстрирует, как передавать значения с использованием контекста при выполнении.
Обратите внимание, что если вы используете одно и то же имя переменной в двух контекстах, например id, оно изменится на новое значение и, таким образом, не будет запомнено. Вот почему я использовал "cid".