如何从我的 webhook 触发 `action.intent.INTENT_NAME` 意图?
How can I trigger a `action.intent.INTENT_NAME` intent from my webhook?
我想使用 Dialogflow 和 Google Assistant 以及 Google Transactions API 创建一个聊天机器人,以使用户能够订购巧克力盒。现在我的代理包含以下四个意图:
Default Welcome Intent
(文字回复:您好,请问您要买巧克力盒吗?)
Default Fallback Intent
Int1
(训练短语:Yes, I want, fulfilment: enabled webhook call)
Int2
(事件:actions_intent_TRANSACTION_REQUIREMENTS_CHECK)
我正在使用 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)"
}
最后,让我提一下,我正在本地计算机上使用 Python
和 ngrok
测试所有这些,所以这可能会带来问题,因为在 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"
触发时我发回了它。换句话说,我不得不调整我对 Dialogflow
的 v2 version
的响应响应。
因此,现在我的后端确实收到了第二个 post 请求,该请求是由于 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": "*****************************"
}
我想使用 Dialogflow 和 Google Assistant 以及 Google Transactions API 创建一个聊天机器人,以使用户能够订购巧克力盒。现在我的代理包含以下四个意图:
Default Welcome Intent
(文字回复:您好,请问您要买巧克力盒吗?)Default Fallback Intent
Int1
(训练短语:Yes, I want, fulfilment: enabled webhook call)Int2
(事件:actions_intent_TRANSACTION_REQUIREMENTS_CHECK)
我正在使用 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)"
}
最后,让我提一下,我正在本地计算机上使用 Python
和 ngrok
测试所有这些,所以这可能会带来问题,因为在 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"
触发时我发回了它。换句话说,我不得不调整我对 Dialogflow
的 v2 version
的响应响应。
因此,现在我的后端确实收到了第二个 post 请求,该请求是由于 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": "*****************************"
}