Создание действий в Google с помощью Oracle ChatBot

Я работаю с чат-ботами Oracle и Google Home, и я создаю приложение в действиях в Google, данные которого обрабатываются ботом Oracle. Но я обнаружил проблему со связью между ними. Они общаются через веб-перехватчик, у меня есть приложение, которое принимает вводимые пользователем данные и отправляет их чат-боту, но чат-бот отправляет ответ асинхронным способом, и я не могу взять данные ответа в запросе POST и показать его. пользователю, поэтому я должен отправить медиа-ответ пользователю, чтобы дождаться ответа от бота, и после вызова другого действия, чтобы проверить, готов ли ответ.

Я хотел бы получать ответ синхронно или, по крайней мере, не отправлять медиа-ответ, чтобы ждать ответа бота. Является ли это возможным?

Мне нужно использовать чат-ботов Oracle и Google Home.

Этот вопрос содержит мой код: Как выполнять асинхронные вызовы внешних служб для действий в Google?

РЕДАКТИРОВАТЬ:

Конечная точка /text отправляет данные пользователя моему чат-боту

app.intent('actions.intent.MAIN', conv => {
  console.log('entra en main');
  conv.ask('Hi, how is it going?');
});

app.intent('actions.intent.TEXT', (conv, input) => {
  var userId = conv.body.user.userId;
  console.log(userId);

  if(userId && input){
    return textFound(conv, input, userId);
  }else{
    textnotFound(conv);
  }
});
express_app.post('/text', app);

Чат-бот отправляет ответ другой конечной точке:

express_app.post('/webhook', bodyParser.json(), (req, res)=>{
    message = req.body;
    const userId = req.body.userId;

    if (!userId) {
        return res.status(400).send('Missing User ID');
    }
    if (webhook.verifyMessageFromBot(req.get('X-Hub-Signature'), req.body, metadata.channelSecretKey)) {
        console.log("todo bien");
        res.sendStatus(200);
    } else {
        console.log("Todo mal");
        res.sendStatus(403);
    }
});

Отсюда я не могу отправить данные из ответа на действия в Google, мне нужно сохранить данные в очереди и после вызова действия ТЕКСТ еще раз, чтобы проверить очередь. Я хотел бы получить ответ в ответ на первоначальный запрос, если это возможно, или найти другой способ решения этой проблемы.


person Ignacio Dones Téllez    schedule 30.09.2018    source источник
comment
Можете ли вы обновить свой вопрос, включив в него код, иллюстрирующий, как вы передаете веб-перехватчики?   -  person Prisoner    schedule 30.09.2018
comment
Вы ответили мне на другой вопрос, но мне нужно решение от Oracle, если в действиях в Google у нас нет другого решения. Это был мой вопрос: stackoverflow.com/questions/52440050/   -  person Ignacio Dones Téllez    schedule 01.10.2018
comment
Тогда я не уверен, что понимаю, в чем ваш вопрос. Вы спрашиваете, как решить другой вопрос с помощью веб-перехватчика Oracle или со стороны Google? Опять же, можете ли вы обновить вопрос, чтобы показать текущий код и то, что, по вашему мнению, необходимо обновить?   -  person Prisoner    schedule 01.10.2018
comment
Я спрашиваю, есть ли на стороне Oracle обходной путь для отправки ответа в ответ на начальный запрос вместо отправки ответа асинхронно с вызовом другой конечной точки. Потому что, согласно тому, что вы мне сказали, на стороне Google нет другого решения, если бот работает таким образом. Извините, если я не ясно выражаюсь, английский - не мой язык.   -  person Ignacio Dones Téllez    schedule 01.10.2018
comment
Я предлагаю вам отредактировать вопрос, чтобы четко указать, что вы ищете. Похоже, вы хотите знать, как написать бота Oracle, который может обрабатывать получение информации при вызове веб-перехватчика, выполнение HTTP-запроса, игнорирование ответа, ожидание ответа на отдельный веб-перехватчик, а затем ответ как часть исходный звонок. Это правильно? Если да, задайте это в вопросе и проясните, что вы пытаетесь сделать и каковы ваши ограничения.   -  person Prisoner    schedule 01.10.2018


Ответы (2)


Если ваш веб-перехватчик отвечает в течение 5 секунд, вы можете выполнить всю настройку в оперативном режиме. Если ваше действие написано с использованием Node.js, вы можете использовать Promises для вставки асинхронного кода. Ниже приведен пример фрагмента.

function getBotResponse() {
    return new Promise((resolve, reject) => {
        // Call bot
        resolve(botResponse);
    })
}

app.intent('get oracle bot', conv => {
    return getBotResponse()
        .then((botResponse) => {
            conv.ask(botResponse)
        });
})
person Nick Felker    schedule 01.10.2018
comment
Есть 2 проблемы с этим обходным путем: во-первых, бот может занять более 5 секунд, чтобы ответить, вторая проблема заключается в том, что бот отправляет ответ на другую конечную точку, для этого я должен отправить ответ мультимедиа пользователю и после вызова действие для проверки воспроизведения. Я не могу получить доступ к ответу на свое действие, мне нужно сохранить ответ в очереди и проверить его в другом вызове действия. Я бы хотел это решить. - person Ignacio Dones Téllez; 01.10.2018
comment
Если это займет более 5 секунд, я не уверен, как добавление обработки ботов Oracle поможет вам. - person Prisoner; 01.10.2018
comment
Ответ бота МОЖЕТ занять более 5 секунд, но это необычно. Я должен использовать эти технологии, я не решаю, какую использовать. - person Ignacio Dones Téllez; 01.10.2018

Я решил эту проблему с помощью библиотеки pub-sub узла. Когда приложение получает сообщение от пользователя GH, подпишитесь со своим идентификатором на функцию, которая будет обрабатывать ответ бота var token = PubSub.subscribe(user_id, commandResponse);.

Когда приложение получает ответ от бота в другой другой конечной точке, приложение публикует сообщение в теме user_id PubSub.publish(userId, message);, это сообщение обрабатывается функцией commandResponse и отправляется в GH.

Эта функция реализована внутри обещания в конечной точке действия GH.

person Ignacio Dones Téllez    schedule 16.01.2019