You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Google Actions Node.js SDK中使用conv.ask指定响应目标Intent

解决Google Actions中conv.ask后用户回复路由错误的问题

我明白你遇到的困扰了——用conv.ask发起追问后,用户的回复没匹配到期望的com.example.test.DO Intent,反而跑到了默认的actions.intent.TEXT里,而且用全局变量处理还会出现跨设备冲突的问题。下面给你几个实用的解决方案:

方案1:用上下文(Context)引导Intent匹配

这是最直接的方式,通过设置会话专属的上下文,让Google Assistant明确下一轮对话要优先匹配的目标Intent。

步骤1:修改Intent代码,添加输出上下文

在com.example.test.WHAT的处理函数中,设置一个有效期为1轮对话的上下文(足够接收用户的下一次回复):

app.intent('com.example.test.WHAT', (conv, input, arg) => {
  // 设置上下文,标识当前处于等待用户DO请求的状态
  conv.contexts.set('awaiting_do_request', 1);
  conv.ask('Sure! What do you want me to help with');
})

步骤2:在Action Package中配置Intent的上下文触发条件

更新com.example.test.DO的配置,添加上下文触发条件,只有当awaiting_do_request上下文存在时,才会触发该Intent:

{
  "name": "DO",
  "intent": {
    "name": "com.example.test.DO",
    "trigger": {
      "queryPatterns": [ "play with me", "stop streaming" ],
      "contexts": [
        {
          "name": "awaiting_do_request"
        }
      ]
    }
  },
  "fulfillment": {
    "conversationName": "example-test"
  }
}

这样用户回复追问内容时,就会优先匹配com.example.test.DO,而不是跳到默认的actions.intent.TEXT。

方案2:用会话状态conv.data替代全局变量,解决多设备冲突

如果你倾向于在actions.intent.TEXT统一处理多轮逻辑,绝对不能用全局变量——它是进程级的,会被所有用户/会话共享,必然导致跨设备冲突。换成conv.data就没问题了,它是每个会话独有的存储区域。

修改后的代码示例:

app.intent('actions.intent.TEXT', (conv, input) => {
  if (input === 'bye' || input === 'goodbye' || input === 'stop') {
    return conv.close('See you later!')
  }

  // 读取当前会话专属的状态
  switch (conv.data.convState){
    case 'WAITING_WHAT_RESPONSE':
      // 处理用户在WHAT之后的回复
      return conv.close(`Got it! I'll help you ${input}`);
    case 'WAITING_HOW_RESPONSE':
      // 处理用户在HOW之后的回复
      return conv.close(`Got it! I'll use ${input} to help you`);
    default:
      conv.ask(`I didn't understand. Can you tell me something else?`)
  }
})

app.intent('com.example.test.WHAT', (conv, input, arg) => {
  // 将状态存入会话专属的conv.data
  conv.data.convState = 'WAITING_WHAT_RESPONSE';
  conv.ask('Sure! What do you want me to help with');
})

app.intent('com.example.test.HOW', (conv, input, arg) => {
  conv.data.convState = 'WAITING_HOW_RESPONSE';
  conv.ask('Sure! How do you want me to help with');
})

每个用户的会话状态完全独立,彻底解决了跨设备冲突的问题。

方案3:使用后续Intent(Follow-up Intents)

如果你通过Action Console配置Intent,可以直接给com.example.test.WHAT添加后续Intentcom.example.test.DO:找到WHAT Intent,点击「Add follow-up intent」,选择自定义Intent并关联到DO。这样Google Assistant会自动在WHAT之后优先匹配这个后续Intent,无需手动处理上下文。

总结

  • 想让用户回复直接匹配目标Intent?推荐用方案1(上下文)或方案3(后续Intent),逻辑更清晰。
  • 需要统一入口处理多轮逻辑?选方案2(conv.data),完美解决全局变量的冲突问题。

内容的提问来源于stack exchange,提问作者holopekochan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:09:41