如何在DialogFlow中实现永久会话?
DialogFlow永久会话实现错误排查方案
核心错误原因
你提供的代码不符合DialogFlow官方的detectIntent接口参数规范,是参数结构错误导致的请求失败。
具体问题修正点
- 上下文不能直接放在request根节点的
context字段,必须放在queryParams.contexts下,且该字段接收的是上下文对象数组,不是字符串类型。 queryInput下的input需要指定输入类型(文本/音频/事件等),不能直接写input变量。- 响应中的上下文不在根节点的
context字段,需要从queryResult.outputContexts中获取。 - 存入DB的上下文需要完整序列化JSON,不能直接存对象或者字符串片段。
修正后参考代码
// 读取DB中存储的对应用户上下文,无历史数据则默认为空数组 const historyContexts = db.get('当前用户唯一标识') ? JSON.parse(db.get('当前用户唯一标识')) : []; const request = { session: 'projects/<你的DialogFlow项目ID>/agent/sessions/<当前用户会话ID>', // 必须为完整会话路径格式 queryInput: { // 以文本输入为例,其他输入类型替换对应结构即可 text: { text: '用户当前输入内容', languageCode: 'zh-CN' } }, queryParams: { contexts: historyContexts } }; detectIntent(request).then(response => { // 提取响应返回的最新上下文 const latestContexts = response.queryResult.outputContexts; // 序列化后存入DB,关联当前用户唯一标识 db.save('当前用户唯一标识', JSON.stringify(latestContexts)); return response; });
其他常见问题排查
- 检查
lifespanCount配置:如果需要上下文长期生效,每次返回时要将需要持久化的上下文的lifespanCount设置为较大值,默认值为5,5轮交互后会自动过期。 - 检查上下文name路径:跨请求传递上下文时,上下文
name字段的会话路径前缀需要和当前请求的session字段一致,否则会触发参数不匹配错误。 - 打印完整错误日志:如果请求仍然报错,优先打印接口返回的完整错误信息,
error.details字段会明确提示参数错误的具体位置。
内容的提问来源于stack exchange,提问作者Luiz Gustavo
相关产品推荐
相关产品推荐

