Dialogflow-脱离上下文获取参数

时间:2019-02-06 17:01:00

标签: google-cloud-functions dialogflow

我想要什么?

  • 将对话流实现中的数据直接插入到Firebase数据库中(需要userId)

  • 我只想知道:在触发的意图中使用参数(例如,用户名)。示例:用户在应用程序中写“ Hello”,而聊天机器人则像在Googles description

  • 中回答“ Hello John”

我到目前为止:

我有一种聊天应用程序,用户可以在其中与其他用户和/或聊天机器人(使用dialogflow)聊天。

在firebase云功能中,该应用将请求发送到dialogflow incl。带有参数的上下文:

function sendToDialogflow(uid) {
    const sessionId = '<SESSION_ID>';
    const sessionClient = new dialogflow.SessionsClient();
    const projectId = '<PROJECT_ID>';
    const sessionPath = sessionClient.sessionPath(projectId, sessionId);

    const request = {
        session: sessionPath,
        queryParams: {
            contexts: [{
                name: `projects/${projectId}/agent/sessions/${sessionId}/contexts/userId`,
                lifespanCount: 2,
                parameters: {
                    uid: uid,
                }
            }]
        },
        queryInput: {
            text: {
                text: text,
                languageCode: 'en-US',
            },
        },
    };
    sessionClient.detectIntent(request).then((response) => {
        const result = response[0].queryResult.fulfillmentText;
    });
}

给定的上下文确实有效。

我当前的通过使用promise(在firebase云功能中)将数据插入firebase的解决方案,但它似乎非常慢(等待响应最多20秒):

sessionClient.detectIntent(request).then((response) => {
    const result = response[0].queryResult.fulfillmentText;
    return admin.database().ref('message').push({
        fromUid: '<bots id>',
        toUid: uid,
        text: result
    }).catch((error) => {
        console.log(error);
    });
});

1 个答案:

答案 0 :(得分:0)

花了几个小时解决这个问题后,我仍然发现,错误出在我触发触发对话框流的Firebase云函数的有效负载(带有参数)上。感谢@matthewayne的答案here,我不得不使用jsonToStructProtofile)将参数转换为另一种格式(原型结构)。

新请求看起来像

const request = {
    session: sessionPath,
    queryParams: {
        contexts: [{
                name: `projects/${projectId}/agent/sessions/${sessionId}/contexts/testId`,
                lifespanCount: 2,
                parameters: structjson.jsonToStructProto({foo: 'bar'}),
            }
        ]
    },
    queryInput: {
        text: {
            text: text,
            // The language used by the client (en-US)
            languageCode: 'de-DE',
        },
    },
};

现在可以在dialogflow控制台上获取参数了:

#testId.foo

或实现时:

agent.contexts['testId'].parameters