Ключ контекста не инициализируется, если он не в ответе - wit.ai

Я создал новое приложение в wit.ai. В историях после «Пользователь говорит» я добавил функцию getReply(), используя «Бот выполняется», и добавил два контекстных ключа с веткой в ​​​​этом. Если оба ключа доступны, я отправляю ответ пользователю, используя «Бот говорит», и он переходит к следующему шагу, иначе он запросит у пользователя отсутствующий ключ.

Проблема в том, что в ответе я использую только один контекстный ключ. Поток работает, если этот ключ доступен. Он не думает о другом ключе. Он проверяет оба ключа, только если мы добавим оба ключа в ответ.

В коде я проверяю эти ключи в функции getReply(), а затем добавляю их в контекст.

const actions = {
send(request, response) {
  ...
  ...
  ...
  return new Promise(function(resolve, reject) {
    ...
    return resolve();
  })
    .then()) => null)
    .catch((err) => {
      'Error occurred',
      id,
      ':',
      err.stack || err
    );
  });
},
function getReply({context, entities}) {
  return new Promise(function(resolve, reject) {
    ...
    ...
    ...
    context.key1 = value1;
    context.key2 = value2;
    return resolve(context);
  }
}

Все правильно или я что-то упускаю? Почему ключ контекста не инициируется, если его нет в ответе.

Спасибо.


person Newbie7988    schedule 02.12.2016    source источник


Ответы (1)


Хм, в вашем примере я не вижу, чтобы вы добавляли или удаляли ключи в контексте, в зависимости от какой-то логики. Я сделал небольшой пример того, как я должен проверять адрес электронной почты, предоставленный пользователем в Python, и как обрабатывать контекстные ключи в случае, когда пользователь дает недействительный адрес электронной почты. Надеюсь, это даст вам некоторое представление о том, как использовать контекстные ключи.

def save_email(br, cc):
    """Save email on context.

        Arguments:
        - br (dict)         Bot Response
        - cc (dict)         Conversation Context

    Returns an updated context
    """
    context = br.get('context', {})
    entities = br['entities']
    email = first_entity_value(entities, 'email')  # Use wit/email builtin entity

    # First clean the context, its possible you saved one of those two keys in
    # previous iterations, so clean them all just to be safe. As we are going to
    # run email validation in the code below its safe to remove this keys/clean the
    # context at the top of this method.
    for key in ['email', 'bad-email']:
        if key in context:
            del context[key]

    # Now validate that email is valid. If its valid, we add an 'email' key
    # to the context. If email is not valid, we add a 'bad-email' key to the
    # context. In this way, we can handle then at Wit.ai, depending which key
    # is present, what the bot should do next.
    validator = EmailValidator()
    if validator(email).is_valid():
        context['email'] = email
    else:
        context['bad-email'] = 1   # 1, 0, any value. What Wit will pay attention is
                               # that the 'bad-key' exists in the context.

    # Finally, return the updated context
    return context

Как видите, нет смысла помещать в контекст как email, так и bad-email. Я не уверен, что Вит сделал бы в этом случае. Напоминаем, что с помощью контекстных ключей мы можем изменить то, как Wit предсказывает следующее действие.

Я надеюсь, что это прояснит и поможет вам решить вашу проблему,

Лучший,

Эмилиано.

person Emiliano Dalla Verde Marcozzi    schedule 02.12.2016