Flask开发Dialogflow ES webhook对接Uneeq数字人响应与参数提取问题
解决方案
1. 继续使用dialogflow_fulfillment库的适配方法
问题原因
dialogflow_fulfillment库默认通过agent.add()生成的响应包含fulfillmentMessages等多字段结构,而Uneeq数字人仅识别响应体顶层的fulfillmentText字段,因此无法正常解析。
适配方法
无需改动原有参数提取逻辑,直接覆盖agent.response属性为Uneeq要求的格式即可,修改后代码示例:
from dialogflow_fulfillment import WebhookClient from flask import Flask, request import json app = Flask(__name__) def handler(agent: WebhookClient) : """Handle the webhook request.""" req = request.get_json(force=True) if req.get('queryResult').get('action') == 'appointment': # 原有参数提取逻辑完全保留 name = agent.context.get('session-vars').get('parameters').get('name')['name'] email = agent.context.get('session-vars').get('parameters').get('email') phone = agent.context.get('session-vars').get('parameters').get('phone') print("intent triggered") # 替换agent.add,直接赋值符合Uneeq要求的响应结构 agent.response = {"fulfillmentText": "BUDDY!"} @app.route('/webhook', methods=['GET', 'POST']) def webhook(): req = request.get_json(force=True) agent = WebhookClient(req) agent.handle_request(handler) return agent.response if __name__ == '__main__': app.run(debug=True)
2. 无依赖开发时提取session-vars上下文参数的方法
提取逻辑
遍历Dialogflow返回的所有输出上下文,匹配session-vars上下文后提取对应参数,避免按索引取值导致的上下文顺序变动报错,修改后代码示例:
import json from flask import Flask from flask import request from flask import make_response app = Flask(__name__) @app.route('/webhook', methods=['POST']) def webhook(): req = request.get_json(silent=True, force=True) res = makeWebhookResult(req) res = json.dumps(res, indent=4) r = make_response(res) r.headers['Content-Type'] = 'application/json' return r def makeWebhookResult(req): query_result = req.get('queryResult', {}) intent_name = query_result.get('intent', {}).get('displayName') action_name = query_result.get('action') print(intent_name) # 通用提取session-vars上下文参数逻辑 session_vars_params = {} output_contexts = query_result.get('outputContexts', []) for context in output_contexts: # 匹配session-vars上下文 if context.get('name', '').endswith('/contexts/session-vars'): session_vars_params = context.get('parameters', {}) break # 提取目标参数 name = session_vars_params.get('name', {}).get('name') email = session_vars_params.get('email') phone = session_vars_params.get('phone') case = session_vars_params.get('case') # 所需的case参数 if action_name == 'input.welcome': print("intent trigered") return {"fulfillmentText": 'Hi there'} if action_name == 'test': print("test intent trigered, 提取到的姓名:", name) return {"fulfillmentText": 'Bye there'} if __name__ == '__main__': app.run(debug=True)
内容的提问来源于stack exchange,提问作者Samiya Jabbar
相关产品推荐
相关产品推荐

