действия на Google не работают, но они делают в диалоговом потоке - PullRequest
0 голосов
/ 20 ноября 2018

У меня проблема с тестированием моего навыка на действиях в Google и на моем мобильном телефоне.Он отлично работает с диалоговым потоком, но когда я прихожу к намерению, определенному функцией questions_ready на помощнике google или на веб-странице действий google, чтобы проверить его, у меня появляется ошибка "'final_response' должен быть установлен".Но это работает на Dialogflow, поэтому я не знаю, где это ошибка.Я оставляю здесь свой кодекс, надеясь, что некоторые из вас могут мне помочь!Спасибо!

'use strict';

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const {WebhookClient} = require('dialogflow-fulfillment');

process.env.DEBUG = 'dialogflow:*'; // enables lib debugging statements
admin.initializeApp(functions.config().firebase);
const db = admin.firestore();

// Variables
var procedure;
var procedure;
var finish = "Ok, thank you. We have finished the questions";
var status_questions = [
    {question: 'Ok, here is your first question. Please, could you tell me how do you feel on a scale from 1 to 10 ? Where 1 is very bad and 10 is very good'},
    {question: 'Your workload is very high, high, normal, low or very low?'},
    {question: 'Tell me what is your level of monotony on a scale from 1 to 10. Where 1 is very bad and 10 is very good'}];

var currentIndex = 0;
var currentQuestion = "";
var flag = 0;

var list_answers = [];
var list_index = [];
var list_timestamps = [];
var list_questions = [];
const dialogflowAgentRef = db.collection('dialogflow').doc();
//

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });

  function welcome(agent) {
    agent.add(`Welcome to my agent!`);
  }

  function fallback(agent) {
    agent.add(`I didn't understand`);
    agent.add(`I'm sorry, can you try again?`);
}

  function manual(agent) {
    const problem = agent.parameters.manual_problems;
    if (problem == "DDoS problem"){
        procedure = `Ok! Let's see how to solve your `+ problem + `. Specify here the procedure to resolve DDoS problem`;     
    }
    else {
        procedure = `Sorry, we don't have a manual to resolve that problem`;
    }

    agent.add((procedure));
  }

  function user_name(agent){
      const user = agent.parameters.names;
        return db.runTransaction(t => {
        t.set(dialogflowAgentRef, {name: user});
        return Promise.resolve('Write complete');
    }).then(doc => {
      agent.add(`Ok ${user}, are you ready?`);
    }).catch(err => {
      console.log(`Error writing to Firestore: ${err}`);
      agent.add(`Failed to write "${user}" to the Firestore database.`);
    });
  }

//WHEN IT IS CALLING THIS FUNCTION I GOT THE ERROR

  function questions_ready(agent) {
    if(currentIndex === 0){
        list_index=[];
        list_answers=[];
        list_questions=[];
        list_timestamps=[];
        list_index.push(currentIndex);
        currentQuestion = status_questions[currentIndex++].question;
    }
    else if(currentIndex >=1 && currentIndex <= 10){
        list_index.push(currentIndex);
        currentQuestion = status_questions[currentIndex++].question;
        flag = 1;
        const answParam = agent.parameters.answers;
        const ans = answParam;
        list_answers.push(ans);

    }
    else {
        currentIndex = 0;
        currentQuestion = finish;
        flag=0;
        const answParam = agent.parameters.answers;
        const ans = answParam;
        list_answers.push(ans);

        agent.add(currentQuestion);

        return db.runTransaction(t => {
        t.update(dialogflowAgentRef, {time: list_timestamps});
        t.update(dialogflowAgentRef, {index: list_index});
        t.update(dialogflowAgentRef, {question: list_questions});
        t.update(dialogflowAgentRef, {answer: list_answers});
        return Promise.resolve('Write complete');
    });
    }

    const ques = currentQuestion;
    list_questions.push(ques);

    var timestamp = Date.now();
    list_timestamps.push(timestamp);

    let ctx = {'name': 'projects/prueba-firebase-v1/agent/sessions/545ec712-8f69-6999-a50b-4127d38bce82/contexts/questions_ready', 'lifespan': 14, 
    'parameters': {'timestamp': list_timestamps, 'list_index': list_index, 'list_questions': list_questions, 'list_answers': list_answers}}; //, 'list_index': list_index
    agent.setContext(ctx);

    agent.add(currentQuestion);

  }

  // Run the proper function handler based on the matched Dialogflow intent name
  let intentMap = new Map();
  intentMap.set('Default Welcome Intent', welcome);
  intentMap.set('Default Fallback Intent', fallback);
  intentMap.set(enter code here'Manual', manual);
  intentMap.set('User_Name', user_name);
  intentMap.set('Questions_Ready', questions_ready);

  agent.handleRequest(intentMap);
}); 

Я получаю сообщения о действиях в Google:

- на дисплее симулятора: приложение Prueba не отвечает прямо сейчас.Попробуй еще раз скоро.

-Ошибки: MalformedResponse 'final_response' должен быть установлен.

-Отладка:

{
  "response": "Prueba application isn't responding right now. Try again soon.",
  "expectUserResponse": false,
  "conversationToken": "GidzaW11bG...",
  "audioResponse": "//NExAASWK...",
  "debugInfo": {
    "assistantToAgentDebug": {
      "curlCommand": "curl -v 'https://api.api.ai/api/integrations/google?token=6094e3dbd9e242679d0dcc603568b120&versionId=3' -H 'Content-Type: application/json;charset=UTF-8' -H 'Google-Actions-API-Version: 2' -H 'Authorization: eyJhbGciOiJSUzI1NiIsImtpZCI6ImQxZTg2OWU3YmY0MGRkYzNkM2RlMDgwNDI1OThiYTgzNTA5NzBmMGEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJhdWQiOiJjeWJlcm9wcy1maXJlYmFzZS12MSIsIm5iZiI6MTU0MjcxMTY5MCwiaWF0IjoxNTQyNzExOTkwLCJleHAiOjE1NDI3MTIxMTAsImp0aSI6Ijc5NWYyZTViZGRjNzk5ZDAxMTY2MDZhZmEyZjJiMDRlYjU3MDk4ZGQifQ.XNBl3DcL2Zhw9bXHvPG52U21ATIb52snsQ5YF9T57cf9HrEeau6XTPfbtALdkiTEqhRfcihQTwLu7wAMdvmqTeeDaRW3F8C2xDCitT2bjPryeDJ3eyoJvI2cTy5Vhf1oN3WwsHdlM0D59JYyNtTH1NE-B60bnLCPQNe7Mv23aUnipdo-LsAytF_d9Bpz93SR_WZITqP6-FpqHSSuUHL3qi8idqGNQrtFF6RQ5-AGKkLkqE-V_Sa2iLmpqDsi4fP3RYW0bajuSFrn74JvrziQKQR4ZaFc4ITjPtJlhboCTgJusOqpFvOYV_-LF5FqgswaiMqUtaX8YBW_EKLLMLoS2A'  -A 'Mozilla/5.0 (compatible; Google-Cloud-Functions/2.1; +http://www.google.com/bot.html)' -X POST -d '{\"user\":{\"userId\":\"ABwppHFD2VxLtzrmnMXp4XsxyE13Xc7mxOhaf7cbxMUQg7OEe_I1qRVlcDck8Rl-bESCZBPi3cHvESEbHYfvecHr59o\",\"locale\":\"en-US\",\"lastSeen\":\"2018-11-20T10:51:47Z\"},\"conversation\":{\"conversationId\":\"ABwppHH7q6m-4okbTf3aKCU-dgpEAoOmeCLle2AZjocfLI6i8BS1Lhqcx4InD3QBKboVr4yyTPcaOhAOMgQsaHIgHRU\",\"type\":\"ACTIVE\",\"conversationToken\":\"[]\"},\"inputs\":[{\"intent\":\"actions.intent.TEXT\",\"rawInputs\":[{\"inputType\":\"KEYBOARD\",\"query\":\"yes\"}],\"arguments\":[{\"name\":\"text\",\"rawText\":\"yes\",\"textValue\":\"yes\"}]}],\"surface\":{\"capabilities\":[{\"name\":\"actions.capability.AUDIO_OUTPUT\"},{\"name\":\"actions.capability.MEDIA_RESPONSE_AUDIO\"},{\"name\":\"actions.capability.WEB_BROWSER\"},{\"name\":\"actions.capability.SCREEN_OUTPUT\"}]},\"isInSandbox\":true,\"availableSurfaces\":[{\"capabilities\":[{\"name\":\"actions.capability.AUDIO_OUTPUT\"},{\"name\":\"actions.capability.WEB_BROWSER\"},{\"name\":\"actions.capability.SCREEN_OUTPUT\"}]}],\"requestType\":\"SIMULATOR\"}'",
      "assistantToAgentJson": "{\"user\":{\"userId\":\"ABwppHFD2VxLtzrmnMXp4XsxyE13Xc7mxOhaf7cbxMUQg7OEe_I1qRVlcDck8Rl-bESCZBPi3cHvESEbHYfvecHr59o\",\"locale\":\"en-US\",\"lastSeen\":\"2018-11-20T10:51:47Z\"},\"conversation\":{\"conversationId\":\"ABwppHH7q6m-4okbTf3aKCU-dgpEAoOmeCLle2AZjocfLI6i8BS1Lhqcx4InD3QBKboVr4yyTPcaOhAOMgQsaHIgHRU\",\"type\":\"ACTIVE\",\"conversationToken\":\"[]\"},\"inputs\":[{\"intent\":\"actions.intent.TEXT\",\"rawInputs\":[{\"inputType\":\"KEYBOARD\",\"query\":\"yes\"}],\"arguments\":[{\"name\":\"text\",\"rawText\":\"yes\",\"textValue\":\"yes\"}]}],\"surface\":{\"capabilities\":[{\"name\":\"actions.capability.AUDIO_OUTPUT\"},{\"name\":\"actions.capability.MEDIA_RESPONSE_AUDIO\"},{\"name\":\"actions.capability.WEB_BROWSER\"},{\"name\":\"actions.capability.SCREEN_OUTPUT\"}]},\"isInSandbox\":true,\"availableSurfaces\":[{\"capabilities\":[{\"name\":\"actions.capability.AUDIO_OUTPUT\"},{\"name\":\"actions.capability.WEB_BROWSER\"},{\"name\":\"actions.capability.SCREEN_OUTPUT\"}]}],\"requestType\":\"SIMULATOR\"}"
    },
    "agentToAssistantDebug": {
      "agentToAssistantJson": "{\n  \"responseMetadata\": {\n    \"status\": {\n      \"code\": 10,\n      \"message\": \"Failed to parse Dialogflow response into AppResponse because of empty speech response\",\n      \"details\": [{\n        \"@type\": \"type.googleapis.com/google.protobuf.Value\",\n        \"value\": \"{\\\"id\\\":\\\"95a80a4d-4a98-461f-b183-88a358d87ebc\\\",\\\"timestamp\\\":\\\"2018-11-20T11:06:30.765Z\\\",\\\"lang\\\":\\\"en-us\\\",\\\"result\\\":{},\\\"alternateResult\\\":{},\\\"status\\\":{\\\"code\\\":206,\\\"errorType\\\":\\\"partial_content\\\",\\\"errorDetails\\\":\\\"Webhook call failed. Error: Webhook response was empty.\\\"},\\\"sessionId\\\":\\\"ABwppHH7q6m-4okbTf3aKCU-dgpEAoOmeCLle2AZjocfLI6i8BS1Lhqcx4InD3QBKboVr4yyTPcaOhAOMgQsaHIgHRU\\\"}\"\n      }]\n    }\n  }\n}"
    },
    "sharedDebugInfoList": [
      {
        "name": "ResponseValidation",
        "debugInfo": "",
        "subDebugEntryList": [
          {
            "name": "MalformedResponse",
            "debugInfo": "'final_response' must be set.",
            "subDebugEntryList": []
          }
        ]
      }
    ]
  },
  "visualResponse": {
    "visualElementsList": [
      {
        "displayText": {
          "content": "Prueba application isn't responding right now. Try again soon."
        }
      }
    ],
    "suggestionsList": [],
    "agentLogoUrl": ""
  },
  "clientError": 0,
  "is3pResponse": 1,
  "clientOperationList": []
}

Здесь есть изображения, которые я имею в моем Inses_Ready Intentи Dialogflow, установленный Dialogflow, где все работает отлично.Проблема заключается в том, что я пытаюсь проверить навык в Действиях в Google

Questions_Ready Intent (I)

Questions_Ready Intent (II)

Ответы Сущностей

Диалог диалога (I)

Диалог диалога (II)

Результат получен на Google в действиях

Ответы [ 2 ]

0 голосов
/ 08 августа 2019

Из предоставленного вами примера кода кажется, что вы используете библиотеку Fulfillment Dialogflow, а не клиентскую библиотеку Actions на Google, вы можете протестировать различные samples и взглянуть на зависимости вверх.на Github возьмите этот образец , например.При использовании библиотеки «Действия в Google Node.js» для файла index.js будет объявлен следующий импорт:

const {dialogflow} = require('actions-on-google');
0 голосов
/ 20 ноября 2018

Отладка json:

debugInfo.agentToAssistantDebug.agentToAssistantJson: «Не удалось проанализировать ответ Dialogflow в AppResponse из-за пустого речевого ответа»

Мы можем видеть, чтоDialogflow не возвращает ни одного ответа, который понимает Actions в Google. Пример ответа для AoG

Итак, я думаю, что webhook не возвращает правильный формат для действий в Google, который отличается от Dialogflow.

Здесь у вас естьрепозиторий с примерами ответов для действий в Google: https://github.com/dialogflow/fulfillment-webhook-json/tree/master/responses/v2/ActionsOnGoogle/RichResponses

Извините, я не могу помочь с кодом node.js, я реализовал webhooks на другом языке, но ответ jsonэто то же самое для всех из них.

...