использование стороннего API на помощнике Watson

Я использую открытый API карты погоды, чтобы получить информацию о текущей погоде, а затем интегрировать ее с watson помощник (я использовал это как ссылку для кода помощника Watson) перед развертыванием на терминале. вот мой код:

var city = "Seattle";
weather.setCity(city);
function processResponse(err, response){
        if(err){
            console.log(err);
            return;
        }
        var endConversation = false;
        if(response.intents[0]){
            if(response.intents[0].intent=="CurrentWeather"){
                 weather.getDescription(function(err, desc){
                     weather.getTemperature(function(err, temp){
                         console.log("It is " + desc + " today with a temperature of " + temp + " degrees Celsius.");
                     )};
                 )};
            }
            else if(response.intents[0].intent=="end_conversation"){
                console.log(response.output.text);
                endConversation = true;
            }
        }
        if(!endConversation){
            var newMessageFromUser = prompt(">> ");
            service.message({
                workspace_id: workspace_id,
                input: {
                    text: newMessageFromUser
                },
                context: response.context
            },processResponse);
        }
}

он работает, но тогда ответ выглядит так:

>> what is the weather today in seattle
>>
It is few clouds today with a temperature of 29 degrees Celsius.
>> bye
['See ya!']

всякий раз, когда я использую какой-либо сторонний API, вместо того, чтобы отвечать сразу после ввода ключевых слов триггера, терминал просит меня ввести еще одну запись (в приведенном выше сценарии я ничего не ввел) перед ответом. однако, когда я пытаюсь ввести ключевые слова, связанные с намерениями, ответы на которые сразу же извлекаются из помощника Watson (как и в случае с end_conversation), терминал отвечает сразу.

Есть ли способ заставить терминал запрашивать только один раз?


person xjm    schedule 25.10.2018    source источник


Ответы (2)


Есть разные способы обойти ввод чего-либо до фактического ответа.

Взгляните на клиентские диалоговые действия < / а>. Ключевым моментом является использование флага skip_user_input и проверка его в вашем приложении. По сути, это будет указывать вашему приложению, что вам нужно обработать некоторые данные. Приложение отправит обратно в Watson Assistant, чтобы тот ответил. Существует также диалоговое действие на сервере. В этом случае Watson Assistant вызывает действие IBM Cloud Functions. Учебное пособие, использующее этот подход, находится здесь, взаимодействуя с базой данных Db2 < / а>.

Другой метод - это то, что я называю замененными маркерами. У вас будет Watson Assistant, возвращающий ответ с заполнителями. Ваше приложение заменит эти маркеры.

В-третьих, вы используете JavaScript с асинхронной обработкой. Кажется, что ваше пустое приглашение обрабатывается, пока вы получаете данные о погоде. IF для погоды не зависит от пустого приглашения. Попробуй это исправить.

person data_henrik    schedule 25.10.2018
comment
у вас есть какие-нибудь предложения, как я могу исправить условие if для погоды? - person xjm; 25.10.2018
comment
Я не эксперт по JavaScript, но вы, вероятно, могли бы использовать Promises - person data_henrik; 25.10.2018
comment
Я бы добавил, что вы также можете использовать облачную функцию для вызова стороннего API и возврата ответа обратно в диалог. Мы использовали это в прошлом, чтобы сами создать погодное приложение. Работал нормально. - person Michal Bida; 26.10.2018
comment
включены действия сервера - person data_henrik; 26.10.2018
comment
@MichalBida, можно ли это сделать с помощью облегченной / бесплатной учетной записи? - person xjm; 29.10.2018
comment
@xjm Well из console.bluemix.net/openwhisk/learn/pricing (29.10. 2018), если ваша облачная функция выполняется за 500 мс, а ее предел памяти составляет 128 МБ, вы получаете 5 000 000 звонков в месяц бесплатно ... Но более подробную информацию можно найти в Интернете. - person Michal Bida; 29.10.2018
comment
@MichalBida, как говорится, я создал облачную фабрику, но я продолжаю получать без облачной литейной площадки, когда открываю console.bluemix.net/openwhisk/create, поэтому я подумал, что это могло быть из-за цены - person xjm; 29.10.2018
comment
@xjm Afaik, вам нужно выбрать правильный регион (я использую us-south), тогда вам нужна организация облачного литейного производства, а внутри этой организации вам нужно иметь пространство для облачного литейного производства. Вы можете установить это в облачном пользовательском интерфейсе, выбрав Функции - ›Действия, а затем в верхней левой части страницы. По какой-то причине для меня значения по умолчанию всегда пустые - так это может быть причиной? Если это не поможет, я попытаюсь связаться с облачной службой поддержки IBM (на форумах или напрямую ...) ... - person Michal Bida; 29.10.2018
comment
@MichalBida, спасибо, это помогло мне! я попробую реализовать это сейчас. - person xjm; 29.10.2018

следуя совету Михала Биды, я попытался реализовать сторонний API в облачной функции, и это сработало. просто создал функцию php с помощью реализации php api карты openweather и выполнил шаги о том, как создать действие в php с помощью этого руководства. для реализации я следовал этому руководству о том, как реализовать действия в Watson Assistant. теперь он работает даже при прямом вызове из чат-бота рядом с помощником Watson.

пример ответа, который он вернет, будет:

{"weather":"It is raining today in Seattle with a temperature of 15 degrees Celsius"}
person xjm    schedule 30.10.2018