我想要什么?
将对话流实现中的数据直接插入到Firebase数据库中(需要userId)
我只想知道:在触发的意图中使用参数(例如,用户名)。示例:用户在应用程序中写“ Hello”,而聊天机器人则像在Googles description
我到目前为止:
我有一种聊天应用程序,用户可以在其中与其他用户和/或聊天机器人(使用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);
});
});
答案 0 :(得分:0)
花了几个小时解决这个问题后,我仍然发现,错误出在我触发触发对话框流的Firebase云函数的有效负载(带有参数)上。感谢@matthewayne的答案here,我不得不使用jsonToStructProto
(file)将参数转换为另一种格式(原型结构)。
新请求看起来像
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