Назначение значения по умолчанию для обязательного параметра в 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".

Другие вопросы по тегам