Dialogflow Fulfillment调用意图异常:Google Action Simulator返回解析错误
我之前帮不少开发者处理过这个问题,你遇到的报错核心原因很明确:你的Fulfillment返回的JSON响应不符合Google Actions v2 API的格式要求,缺少了必填的@type字段,这直接导致Action Simulator无法解析响应内容,才会弹出那个“没响应”的提示,同时抛出"UnparseableJsonResponse"和"Missing @type for any field in google.actions.v2.AppResponse"这类错误。
下面给你几个针对性的解决步骤:
检查响应结构,确保
@type字段存在
如果是手动拼接JSON响应(没有用Dialogflow官方客户端库),一定要严格按照v2格式添加@type字段。比如构造文本响应时,正确的结构应该包含指定类型的@type:{ "payload": { "google": { "expectUserResponse": true, "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "这是符合规范的响应", "displayText": "这是符合规范的响应" } } ] }, "systemIntent": { "intent": "actions.intent.TEXT", "@type": "type.googleapis.com/google.actions.v2.Intent" } } } }要是你用的是
dialogflow-fulfillment这类官方客户端库,大概率是版本问题或者调用方式不对——建议升级到最新版,并且使用库提供的响应构造方法(比如SimpleResponse、RichResponse),它们会自动帮你添加@type字段:const { WebhookClient, SimpleResponse } = require('dialogflow-fulfillment'); exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => { const agent = new WebhookClient({ request, response }); function welcome(agent) { // 用库的方法构造响应,自动处理@type agent.add(new SimpleResponse({ speech: "欢迎使用我的测试应用", text: "欢迎使用我的测试应用" })); } let intentMap = new Map(); intentMap.set('Default Welcome Intent', welcome); agent.handleRequest(intentMap); });确认Dialogflow的API版本设置
登录Dialogflow控制台,进入Fulfillment页面,检查Webhook的API版本是否设置为V2。如果不小心选了V1,响应格式完全不兼容,也会触发这类解析错误。排查Firebase Functions的执行日志
打开Firebase控制台,找到你的Functions项目,查看具体的执行日志。有时候代码抛出异常(比如未捕获的错误、异步操作失败)会导致响应不完整,返回的JSON格式本身就有问题,这也会让模拟器报解析错误。验证响应格式合法性
可以用Google提供的响应验证工具检查你的JSON是否符合v2规范,确保所有必填字段都正确配置,避免因为拼写错误或者字段缺失导致的问题。
总的来说,这个问题就是响应格式不符合要求,重点盯紧@type字段的存在性和响应结构的完整性,用官方库的话尽量依赖库的方法来构造响应,减少手动拼接的出错概率。
内容的提问来源于stack exchange,提问作者ffritz

