如何从我的 webhook 触发 `action.intent.INTENT_NAME` 意图?

How can I trigger a `action.intent.INTENT_NAME` intent from my webhook?

我想使用 Dialogflow 和 Google Assistant 以及 Google Transactions API 创建一个聊天机器人,以使用户能够订购巧克力盒。现在我的代理包含以下四个意图:

我正在使用 Dialogflow Json 而不是 Node.js 将我的代理连接到交易 API。我想通过使用 Google 操作的 actions.intent.TRANSACTION_REQUIREMENTS_CHECK 操作来测试用户是否满足交易要求(订购巧克力盒时)。出于这个原因,在 Google 文档之后,当 Int1 被触发时,我正在使用一个 webhook 将 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)

我上面 return 的 json 当 intent = 'Int1' 是 Google 文档中为 "Checking requirements with your own payment method" 指定的 json。 根据 Google 文档,接下来必须这样做:

Receiving the result of a requirements check

After the Assistant fulfills the intent, it sends your fulfillment a request with the actions.intent.TRANSACTION_REQUIREMENTS_CHECK intent with the result of the check.

To properly handle this request, declare a Dialogflow intent that's triggered by the actions_intent_TRANSACTION_REQUIREMENTS_CHECK event.

出于这个原因,我定义了 Int2 并将 actions_intent_TRANSACTION_REQUIREMENTS_CHECK 作为其事件。

但是,我的后端没有收到任何检查结果,因此我不知道是否真的触发了操作 actions.intent.TRANSACTION_REQUIREMENTS_CHECK。为什么会这样?

一般来说,如何从我的 webhook/back-end 中触发一个 actions.intent.INTENT_NAME 意图?

当我使用 v2 版本的 Dialogflow 时,当 Int1 被触发时,我得到以下关于 Dialogflow 上的 webhook 的 info/message:

  "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."
  }

在同样的情况下,当 Int1 被触发时,我在 Google Assistant 模拟器上得到以下关于 webhook 的 info/message:

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

最后,让我提一下,我正在本地计算机上使用 Pythonngrok 测试所有这些,所以这可能会带来问题,因为在 Google 文档的开头提到以下内容:

Warning: The Actions Web Simulator should not be used to test an app with transactions. Please use an Assistant-enabled Android or iOS device to accurately test your app during development.

我认为您的回复对象不正确。 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"
          }
        }
      }
    }
  }
}

我终于解决了这个问题

我不得不替换 json 中的键 "data",当 Int1 被键 "payload" 触发时我发回了它。换句话说,我不得不调整我对 Dialogflowv2 version 的响应响应。

因此,现在我的后端确实收到了第二个 post 请求,该请求是由于 actions.intent.TRANSACTION_REQUIREMENTS_CHECKInt2.

的触发而发送的

具体来说,我得到以下信息:

{
    "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": "*****************************"
}