如何在Dialogflow&Google Actions中设置final_response?解决MediaObject报错
解决Dialogflow中"final_response must be set"错误的正确姿势
看起来你踩了Actions on Google客户端库的一个常见坑——同时混用了conv.ask()和conv.close(),这俩方法是互斥的,直接导致系统搞不清你到底要结束对话还是继续等用户回复,所以才抛出这个错误。下面给你拆解正确的处理方式:
核心错误原因
你代码里同时写了conv.ask(new Suggestions(...))和conv.close(new Medi...),这就矛盾了:
conv.ask()是告诉系统「我要继续对话,等用户回复」conv.close()是告诉系统「这是最后一条响应,对话结束」
同时调用这俩,系统就懵了,自然会报错说"final_response must be set"。
正确的MediaObject使用代码
首先要明确你的需求:是播放音频后结束对话,还是播放后继续和用户交互?
场景1:播放音频后结束对话
这时候要完全移除conv.ask()的调用,用conv.close()发送包装好的MediaResponse(注意MediaObject不能直接发,必须包在MediaResponse里):
// 先确保导入了必要的类 const { MediaObject, MediaResponse } = require('actions-on-google'); function yourFunctionHandler(agent) { // 获取conv对象 let conv = agent.conv(); // 构造你的MediaObject const audioFile = new MediaObject({ name: '我的音频', url: 'https://your-domain.com/your-audio.mp3', // 必须是HTTPS可访问的链接 description: '一段测试音频', // 可选:添加音频图标 icon: { url: 'https://your-domain.com/audio-icon.png', alt: '音频图标' } }); // 把MediaObject包装成MediaResponse const mediaResponse = new MediaResponse({ mediaObjects: [audioFile], type: 'AUDIO' }); // 用conv.close发送最终响应 conv.close(mediaResponse); // 别忘了把conv添加到agent的响应里 agent.add(conv); }
场景2:播放音频后继续对话
如果播放音频后还要让用户继续操作(比如点击建议芯片),那应该用conv.ask()替代conv.close(),并且确保后续对话有对应的处理逻辑:
const { MediaObject, MediaResponse, Suggestions } = require('actions-on-google'); function yourFunctionHandler(agent) { let conv = agent.conv(); const audioFile = new MediaObject({ name: '我的音频', url: 'https://your-domain.com/your-audio.mp3', description: '一段测试音频' }); const mediaResponse = new MediaResponse({ mediaObjects: [audioFile], type: 'AUDIO' }); // 用conv.ask发送响应,同时附加建议芯片 conv.ask(mediaResponse); conv.ask(new Suggestions('再来一段', '返回主页')); agent.add(conv); }
额外注意点
- 音频URL必须是公开可访问的HTTPS链接,Actions on Google不支持HTTP或者需要权限的资源
- 如果你用的是Dialogflow ES,要确保已经在控制台启用了Actions on Google集成
- 代码里的类导入不能漏,否则会出现未定义的错误
内容的提问来源于stack exchange,提问作者digi
相关产品推荐
相关产品推荐

