wit.ai + бот на основе слота + сохранение значений сущностей в клиенте

Я пробую образец в wit.ai, вот ссылка: https://wit.ai/Nayana-Manchi/CreditCardApp/stories

Первая история «BalanceEnquiry» — это история, основанная на игровых автоматах. Счастливый сценарий работает нормально. Чтобы проверить ветку «cardnumbermissing», я набираю «Я хочу, чтобы баланс моей кредитной карты был на карте, и меня зовут Наяна». Здесь номер карты последние 4 цифры отсутствуют.Он запрашивает последние 4 цифры карты и тогда я бы ввел последние 4 цифры карты.Но здесь он не получает имя сущности,которое было отправлено в предыдущем сообщении.

Как сохранить значение объекта «имя», которое было отправлено на предыдущем шаге? Он должен сохранить имя значения объекта и получить введенные последние 4 цифры из текущего разговора, а затем отобразить баланс, который жестко запрограммирован.

Код и изображения прилагаются.

Будет полезно, если вы поделитесь клиентским кодом (javascript) для рецепта. Создайте бота на основе слотов.

демонстрационное изображение

'use strict';

let Wit = null;
let interactive = null;
try {
    // if running from repo
    Wit = require('../').Wit;
    interactive = require('../').interactive;
} catch (e) {
    Wit = require('node-wit').Wit;
    interactive = require('node-wit').interactive;
}

const accessToken = (() => {
    if (process.argv.length !== 3) {
        console.log('usage: node examples/creditcardbalance.js <wit-access-token>');
        process.exit(1);
    }
    return process.argv[2];
})();

// Quickstart example
// See https://wit.ai/ar7hur/quickstart

const firstEntityValue = (entities, entity) => {
    const val = entities && entities[entity] &&
      Array.isArray(entities[entity]) &&
      entities[entity].length > 0 &&
      entities[entity][0].value
    ;
    if (!val) {
        return null;
    }
    return typeof val === 'object' ? val.value : val;
};

const actions = {
    send(request, response) {
        const {sessionId, context, entities} = request;
        const {text, quickreplies} = response;
        return new Promise(function(resolve, reject) {
            console.log('sending...', JSON.stringify(response));
            return resolve();
        });
    },
    getBalance({context, entities}) {
    return new Promise(function(resolve, reject) {
        var name = firstEntityValue(entities, "name");
        var last4digit = firstEntityValue(entities, "Last4digits");
        
        if (name && last4digit) {
            context.name = name;
            context.last4digit = last4digit;
            context.balance = 'Rs.10000' + name + last4digit; // we should call a credit card API here
            delete context.cardnumbermissing;
        }
        else {
            context.cardnumbermissing = true;
            context.name = name;
            delete context.balance;
        }
        return resolve(context);
    });
},
};

const client = new Wit({accessToken, actions});
interactive(client);
// JavaScript source code


person Nayana M    schedule 12.09.2016    source источник


Ответы (1)


У меня была аналогичная проблема, и то, что происходило, было firstEntityValue только из первоначального разговора, поэтому я фактически стирал предыдущие переменные каждый раз, когда вызывал его для установки переменной. Я должен был сделать функцию осведомленной о контексте и не устанавливать эти переменные с помощью firstEntityValue, если контекст уже был.

person Melissa    schedule 21.09.2016
comment
Спасибо Мелисса. Я понимаю что ты имеешь в виду. Но не удалось найти ни одного примера для извлечения переменных из контекста. не могли бы вы поделиться 2 строками кода о том, как этого добиться. - person Nayana M; 23.09.2016
comment
else if(context.cuisine) { console.log('Кухня уже получена в предыдущем сеансе'); var окрестности = firstEntityValue (сущности, 'окрестности'); context.neighborhood = окрестности; var kitchen = context.cuisine; } - person Melissa; 23.09.2016
comment
Большое спасибо. Мне это помогло. - person Nayana M; 27.09.2016