python - 从 Python 中的后续意图获取 Dialogflow 上下文参数
问题描述
我在 python 中创建了一个烧瓶应用程序来向 Dialogflow 发送文本,以检测意图并返回实现文本作为响应。
然后我将其扩展为还沿着履行文本返回查询结果中的某个参数,该参数也有效,我得到它是这样的:
orderid = (response.query_result.parameters.fields["ordernumber"])
orderid_json = json.loads(MessageToJson(orderid))
现在,当我添加后续意图时,我的问题就开始了,因为那时我无法读出参数,因为它是上下文的一部分。
我的意图order.status的 RAW API 响应如下所示:
{
"responseId": "7ae77c38-501a-4079-b0e0-24807669c826-83ffff32",
"queryResult": {
"queryText": "check my order 456789",
"action": "order.status",
"parameters": {
"ordernumber": "456789"
},
"allRequiredParamsPresent": true,
"fulfillmentText": "Uh-oh, your order seems to be delayed and the exptected delivery date is: 29.06.2020Would you like to talk with an agent about this delay?",
"fulfillmentMessages": [
{
"text": {
"text": [
"Uh-oh, your order seems to be delayed and the exptected delivery date is: 29.06.2020Would you like to talk with an agent about this delay?"
]
}
}
],
"outputContexts": [
{
"name": "projects/voicebotdemo-hdnmue/agent/sessions/5ea2f271-1e00-5041-5f23-f05c73bd1a95/contexts/orderstatus-followup",
"lifespanCount": 2,
"parameters": {
"ordernumber.original": "456789",
"ordernumber": "456789"
}
},
{
"name": "projects/voicebotdemo-hdnmue/agent/sessions/5ea2f271-1e00-5041-5f23-f05c73bd1a95/contexts/ordernumber",
"lifespanCount": 5,
"parameters": {
"ordernumber": "456789",
"ordernumber.original": "456789"
}
}
],
"intent": {
"name": "projects/voicebotdemo-hdnmue/agent/intents/fcb8a584-5ca1-41c7-b67e-34a35dd53602",
"displayName": "order.status"
},
"intentDetectionConfidence": 0.8599001,
"diagnosticInfo": {
"webhook_latency_ms": 156
},
"languageCode": "en",
"sentimentAnalysisResult": {
"queryTextSentiment": {
"score": -0.3,
"magnitude": 0.3
}
}
},
"webhookStatus": {
"message": "Webhook execution successful"
}
}
以及后续意图order.status-yes的响应如下:
{
"responseId": "8c63e43d-ff01-430b-becf-be8f8fa40839-83ffff32",
"queryResult": {
"queryText": "why not",
"action": "orderstatus.orderstatus-yes",
"parameters": {},
"allRequiredParamsPresent": true,
"fulfillmentText": "Routing you to an agent now!",
"fulfillmentMessages": [
{
"text": {
"text": [
"Routing you to an agent now!"
]
}
}
],
"outputContexts": [
{
"name": "projects/voicebotdemo-hdnmue/agent/sessions/5ea2f271-1e00-5041-5f23-f05c73bd1a95/contexts/ordernumber",
"lifespanCount": 5,
"parameters": {
"ordernumber": "456789",
"ordernumber.original": "456789"
}
},
{
"name": "projects/voicebotdemo-hdnmue/agent/sessions/5ea2f271-1e00-5041-5f23-f05c73bd1a95/contexts/orderstatus-followup",
"lifespanCount": 1,
"parameters": {
"ordernumber": "456789",
"ordernumber.original": "456789"
}
}
],
"intent": {
"name": "projects/voicebotdemo-hdnmue/agent/intents/1a3a01da-cdf4-4dc6-b0d6-4c28c9a0bca7",
"displayName": "order.status - yes"
},
"intentDetectionConfidence": 1,
"languageCode": "en",
"sentimentAnalysisResult": {
"queryTextSentiment": {
"score": 0.3,
"magnitude": 0.3
}
}
}
}
后续意图的响应不包含任何参数。所以,我的问题是如何从"outputContexts"而不是"queryResult"中读出ordernumber参数?
这是我的完整脚本:
import json
import os
import dialogflow_v2
from flask import Flask
from flask import request
from google.api_core.exceptions import InvalidArgument
from google.protobuf.json_format import MessageToJson
proxy = 'http://10.7.111.18:8080'
os.environ['http_proxy'] = proxy
os.environ['HTTP_PROXY'] = proxy
os.environ['https_proxy'] = proxy
os.environ['HTTPS_PROXY'] = proxy
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = 'private_key_easteregg.json'
DIALOGFLOW_PROJECT_ID = 'voicebotdemo-hdnmue'
DIALOGFLOW_LANGUAGE_CODE = 'en'
SESSION_ID = 'me'
app = Flask(__name__)
@app.route('/call/user_input_flask', methods=['GET', 'POST', 'PUT', 'DELETE'])
def user_input_flask():
#req_data = request.get_json(dict)
input_text_from_web = request.form.get('input', '')
session_client = dialogflow_v2.SessionsClient()
session = session_client.session_path(DIALOGFLOW_PROJECT_ID, SESSION_ID)
text_input = dialogflow_v2.types.TextInput(text=input_text_from_web, language_code=DIALOGFLOW_LANGUAGE_CODE)
query_input = dialogflow_v2.types.QueryInput(text=text_input)
query_parameter = dialogflow_v2.types.QueryParameters()
try:
response = session_client.detect_intent(session=session, query_input=query_input)
orderid = (response.query_result.parameters.fields["ordernumber"])
orderid_json = json.loads(MessageToJson(orderid))
except InvalidArgument:
raise
return {
"response": response.query_result.fulfillment_text,
"ordernumber": orderid_json
}
app.run(host='0.0.0.0', port=5002, debug=True)
谢谢!
解决方案
我觉得你可以ordernumber
用get()
函数读取参数,如下所示:
outCnt = query_result.get('outputContexts')
outCnt = outCnt[2]
# Second element of 'OutputContexts' in query_result (a Multidict) contains parameter 'ordernumber'
ordernumber = outCnt.get('parameters').get('ordernumber')
推荐阅读
- python - 获取嵌套字段 BigQuery 的列名
- swift - 快速推迟手势识别器(UISwipeGestureRecognizer)
- c# - 如何在 ASP.NET 框架中设置客户端证书身份验证
- java - 使用 Scanner nextInt 制作 if == 语句
- python - Pandas 用第二列分组逗号分隔的单词,然后是 groupby 和 sum
- visual-studio - asp.net core web api在iis express上工作,但在windows上的iis中不工作
- c++ - 如何将 unique_ptr.get() 的引用传递给函数
- python-3.x - 如果类实例总是通过引用传递?
- typescript - 在打字稿项目中导入纽曼(邮递员)?
- python - 循环遍历二维数组的快速方法