You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:30:04