Dialogflow fulfillment异常:无建议且报item[1]非空错误
解决Dialogflow Fulfillment建议选项不显示及MalformedResponse错误
看起来你遇到的问题是因为混合使用了dialogflow-fulfillment和actions-on-google两个库的响应处理逻辑,导致生成的输出格式不符合Dialogflow的要求,进而触发了MalformedResponse错误,同时建议选项无法正常显示。下面给你具体的排查和修复方案:
问题根源分析
你当前的代码存在两个关键问题:
- 注释掉了
dialogflow-fulfillment自带的Suggestion类,转而使用actions-on-google的Suggestions(复数)类,但后者是专门针对Google Assistant平台的,在Dialogflow通用模拟器中可能无法正确解析。 - 同时使用
WebhookClient(来自dialogflow-fulfillment)和conv对象(来自actions-on-google)来构建响应,两者的格式逻辑冲突,导致生成的rich_initial_prompt出现空item的错误。
修复方案一:使用dialogflow-fulfillment原生组件(通用兼容)
这个方案适用于不需要针对Google Assistant做特殊适配的场景,能确保在Dialogflow模拟器中正常显示建议选项:
- 恢复
dialogflow-fulfillment的Suggestion类导入,去掉注释:
const {Card, Suggestion} = require('dialogflow-fulfillment');
- 修改
emojify函数,直接使用agent对象来构建响应,不再依赖conv:
function emojify(agent) { // 直接从agent获取参数,比读取request.body更简洁可靠 const sentence = agent.parameters.sentence; // 添加文本回复 agent.add(`Test response: ${sentence}`); // 添加单个建议选项 agent.add(new Suggestion('The cat likes fish')); // 如果需要多个建议选项,可以连续添加 // agent.add(new Suggestion('Another option')); }
- 保持其他代码不变,重新部署fulfillment即可。
修复方案二:统一使用actions-on-google库(针对Google Assistant)
如果你确实需要开发Google Assistant专属功能,可以完全切换到actions-on-google的客户端,避免混用库的问题:
替换整个代码为以下内容:
'use strict'; const functions = require('firebase-functions'); const { dialogflow, Suggestions, } = require('actions-on-google'); // 创建actions-on-google的dialogflow客户端 const app = dialogflow({debug: true}); // 绑定Emojify意图处理函数 app.intent('Emojify', (conv) => { const sentence = conv.parameters.sentence; conv.ask(`Test response: ${sentence}`); // 添加建议选项,这里的Suggestions支持传入多个参数 conv.ask(new Suggestions('The cat likes fish', 'Another suggestion')); }); // 导出云函数 exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
验证修复效果
部署完成后,回到Dialogflow模拟器:
- 触发
Emojify意图,应该能正常显示带参数的文本回复 - 建议选项会出现在输入框下方,点击可以直接触发对应意图
- 不再出现
MalformedResponse的错误提示
内容的提问来源于stack exchange,提问作者alvarlagerlof
相关产品推荐
相关产品推荐

