如何在Google Actions Node.js SDK中使用conv.ask指定响应目标Intent
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

