Как я могу вызвать намерение `action.intent.INTENT_NAME` из моего веб-крючка? - PullRequest
0 голосов
/ 15 мая 2018

Я хочу создать чат-бота с Dialogflow и Google Assistant вместе с API транзакций Google, чтобы пользователь мог заказать шоколадную коробку.На данный момент мой агент содержит следующие четыре намерения:

  • Default Welcome Intent (текстовый ответ: Здравствуйте, вы хотите купить шоколадную коробку?)
  • Default Fallback Intent
  • Int1 (обучающая фраза: да, я хочу, выполнение: включен вызов веб-крюка)
  • Int2 (событие: actions_intent_TRANSACTION_REQUIREMENTS_CHECK)

Вместо этого я использую Dialogflow JsonNode.js, чтобы связать моего агента с API транзакций.Я хочу проверить, соответствует ли пользователь требованиям транзакции (при заказе шоколадной коробки) с помощью действия actions.intent.TRANSACTION_REQUIREMENTS_CHECK действий Google.По этой причине, следуя документам Google, при запуске Int1 я использую веб-крючок, который подключает Google Assistant к следующему скрипту на Python (бэкэнд):

from flask import Flask, render_template, request, jsonify
from flask_cors import CORS
import  requests

app = Flask(__name__)
CORS(app)

@app.route("/",  methods=['POST'])

def index():

    data = request.get_json()    
    intent = data["queryResult"]["intent"]["displayName"]

    if (intent == 'Int1'):

        return jsonify({ "data": {
                "google": {
                "expectUserResponse": True,
                "isSsml": False,
                "noInputPrompts": [],
                "systemIntent": {
                  "data": {
                    "@type": "type.googleapis.com/google.actions.v2.TransactionRequirementsCheckSpec",
                    "paymentOptions": {
                      "actionProvidedOptions": {
                        "displayName": "VISA-1234",
                        "paymentType": "PAYMENT_CARD"
                      }
                    }
                  },
                  "intent": "actions.intent.TRANSACTION_REQUIREMENTS_CHECK"
                                }
                        }
                                        }
                })
    else:
        return jsonify({'message': 'HERE'})

if __name__== "__main__":
    app.run(debug=True)

json, который я возвращаю выше, когдаintent = 'Int1' - это значение, указанное в документации Google для «Проверка требований с помощью собственного метода оплаты».Согласно Google Docs, это должно быть сделано следующим образом:

Получение результата проверки требований

После того, как помощник выполнит намерение, он отправит ваше выполнение запрос с действиями.намерение intent.TRANSACTION_REQUIREMENTS_CHECK с результатом проверки.

Чтобы правильно обработать этот запрос, объявите намерение Dialogflow, которое вызывается событием actions_intent_TRANSACTION_REQUIREMENTS_CHECK.

По этой причине я определил Int2 и как его событие actions_intent_TRANSACTION_REQUIREMENTS_CHECK.

Тем не менее, я не получаю ничего на моем бэк-энде, как результат проверки, и поэтому я не знаю, является ли действие actions.intent.TRANSACTION_REQUIREMENTS_CHECKдействительно срабатывает.Почему это происходит?

В общем, как я могу вызвать одно actions.intent.INTENT_NAME намерение из моего webhook / back-end?

Когда я используюверсия Dialogflow v2, я получаю следующую информацию / сообщение о веб-крюке в Dialogflow при запуске Int1:

  "webhookStatus": {
    "code": 3,
    "message": "Webhook call failed. Error: Failed to parse webhook JSON response: Cannot find field: data in message google.cloud.dialogflow.v2.WebhookResponse."
  }

В этом же случае я получаю следующую информацию / сообщение оwebhook в симуляторе Google Assistant при срабатывании Int1:

  "responseMetadata": {
    "status": {
      "code": 14,
      "message": "Webhook error (206)"
    }

Наконец, позвольте мне упомянуть, что я тестирую все это с Python и ngrok на моем локальном компьютере, поэтому, возможно, это создает проблемупотому что в начале Google Docs упоминается следующее:

Предупреждение. Веб-симулятор Actions не следует использовать для тестирования приложения с транзакциями.Пожалуйста, используйте устройство Android или iOS с поддержкой Assistant для точного тестирования вашего приложения во время разработки.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Я наконец решил эту проблему.

Мне пришлось заменить ключ "data" в json, который я отправлял обратно, когда Int1 был вызван клавишей "payload". Другими словами, я должен был скорректировать свой ответ на выполнение с v2 version из Dialogflow.

Таким образом, теперь я получаю второй почтовый запрос на своем сервере, который отправляется из-за триггера actions.intent.TRANSACTION_REQUIREMENTS_CHECK и Int2.

В частности, я получаю следующее:

{
    "responseId": "*****************************",
    "queryResult": {
        "queryText": "actions_intent_TRANSACTION_REQUIREMENTS_CHECK",
        "parameters": {},
        "allRequiredParamsPresent": true,
        "fulfillmentText": "HERE",
        "fulfillmentMessages": [
            {
                "text": {
                    "text": [
                        "HERE"
                    ]
                }
            }
        ],
        "outputContexts": [
            {
                "name": "*****************************"
            },
            {
                "name": "*****************************"
            },
            {
                "name": "*****************************"
            },
            {
                "name": "*****************************"
            },
            {
                "name": "*****************************"
            },
            {
                "name": "*****************************",
                "parameters": {
                    "TRANSACTION_REQUIREMENTS_CHECK_RESULT": {
                        "@type": "type.googleapis.com/google.actions.v2.TransactionRequirementsCheckResult",
                        "resultType": "OK"
                    }
                }
            }
        ],
        "intent": {
            "name": "*****************************",
            "displayName": "Int2"
        },
        "intentDetectionConfidence": 1,
        "diagnosticInfo": {},
        "languageCode": "en-us"
    },
    "originalDetectIntentRequest": {
        "source": "google",
        "version": "2",
        "payload": {
            "isInSandbox": true,
            "surface": {
                "capabilities": [
                    {
                        "name": "actions.capability.WEB_BROWSER"
                    },
                    {
                        "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
                    },
                    {
                        "name": "actions.capability.SCREEN_OUTPUT"
                    },
                    {
                        "name": "actions.capability.AUDIO_OUTPUT"
                    }
                ]
            },
            "inputs": [
                {
                    "rawInputs": [
                        {
                            "inputType": "KEYBOARD"
                        }
                    ],
                    "arguments": [
                        {
                            "extension": {
                                "@type": "type.googleapis.com/google.actions.v2.TransactionRequirementsCheckResult",
                                "resultType": "OK"
                            },
                            "name": "TRANSACTION_REQUIREMENTS_CHECK_RESULT"
                        }
                    ],
                    "intent": "actions.intent.TRANSACTION_REQUIREMENTS_CHECK"
                }
            ],
            "user": {
                "lastSeen": "2018-05-16T11:15:14Z",
                "locale": "en-US",
                "userId": "*****************************"
            },
            "conversation": {
                "conversationId": "1526470000479",
                "type": "ACTIVE",
                "conversationToken": "[]"
            },
            "availableSurfaces": [
                {
                    "capabilities": [
                        {
                            "name": "actions.capability.SCREEN_OUTPUT"
                        },
                        {
                            "name": "actions.capability.AUDIO_OUTPUT"
                        }
                    ]
                }
            ]
        }
    },
    "session": "*****************************"
}
0 голосов
/ 16 мая 2018

Я думаю, что ваш объект ответа неверен. атрибут intent должен находиться внутри systemIntent object

"data": {
  "google": {
    "expectUserResponse": true,
    "isSsml": false,
    "noInputPrompts": [],
    "systemIntent": {
      "intent": "actions.intent.TRANSACTION_REQUIREMENTS_CHECK",
      "data": {
        "@type": "type.googleapis.com/google.actions.v2.TransactionRequirementsCheckSpec",
        "paymentOptions": {
          "actionProvidedOptions": {
            "displayName": "VISA-1234",
            "paymentType": "PAYMENT_CARD"
          }
        }
      }
    }
  }
}
...