Dialogflow API V2 Node.js SDK携带上下文检测Intent问题求助
解决Dialogflow V2 Node.js SDK携带上下文检测Intent的问题
嘿,我帮你找到问题所在啦!你在Dialogflow V2 SDK里的两种尝试都存在小细节错误,导致上下文没生效,所以才一直匹配到Fallback Intent。咱们来逐个修正:
第一种尝试的问题:上下文参数格式错误
Dialogflow V2的API和V1结构不同,queryParams里需要传的是contexts数组,而不是单个context对象。你之前写的context: {...}是V1的写法,V2必须用数组格式,而且每个上下文对象需要明确指定lifespanCount(哪怕设为1,否则上下文不会被识别)。
修正后的代码:
const request = { session: sessionPath, queryParams: { // 重点:这里是contexts数组,不是单个context contexts: [ { name: contextClient.contextPath(projectId, sessionId, 'activity'), lifespanCount: 1 // 必须设置生命周期,至少为1 } ] }, queryInput: { text: { text: 'Book this activity in my schedule', languageCode: languageCode, }, }, }; sessionClient.detectIntent(request) .then(responses => { const result = responses[0].queryResult; if (result.intent) { console.log('匹配到的意图:', result.intent.displayName); } else { console.log('没有匹配到意图。'); } }) .catch(err => console.error('检测意图出错:', err));
第二种尝试的问题:创建上下文时缺少必填参数
你调用createContext的时候,上下文对象里缺少lifespanCount参数,Dialogflow要求这个参数才能创建有效的上下文,所以你打印的上下文列表是空的,自然也无法匹配到需要Activity上下文的Book意图。
修正后的代码:
contextClient .createContext({ parent: sessionPath, context: { name: contextClient.contextPath(projectId, sessionId, 'activity'), lifespanCount: 1 // 必须添加这个参数,否则上下文创建无效 }, }) .then(() => contextClient.listContexts({ parent: sessionPath })) .then(contexts => { console.log('当前上下文列表:', contexts); // 现在能看到activity上下文了 const request = { session: sessionPath, queryInput: { text: { text: 'Book this activity in my schedule', languageCode: languageCode, }, }, }; return sessionClient.detectIntent(request); }) .then(responses => { const result = responses[0].queryResult; if (result.intent) { console.log('匹配到的意图:', result.intent.displayName); } else { console.log('没有匹配到意图。'); } }) .catch(err => console.error('操作出错:', err));
额外建议
如果你不想让Dialogflow管理上下文流转,第一种直接在detectIntent请求里传入上下文的方式更合适,不需要提前调用createContext,这样每次请求都能手动控制上下文的存在与否,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

