Google Action会话场景中如何清除已填充的插槽参数以支持用户重新选择值
解决Google Action中重置场景插槽以重新收集参数的问题
你遇到的核心问题我很清楚:当从MEDIA_STATUS_FINISHED事件跳转回同一场景时,已填充的插槽值会让流程直接进入FINAL状态,没法重新让用户选择参数。而且Conversation对象是不可变的,其实不用手动克隆整个对象,Google Actions平台本身就提供了官方的解决方案,下面给你详细说明:
1. 重置整个场景的插槽和状态(最推荐)
你可以通过设置conv.scene.next来指定下一个要进入的场景(哪怕是当前场景),在配置里清空所有插槽、强制回到场景的START状态。这样场景会从头启动,重新请求用户填充参数,不会复用之前的插槽值。
示例代码:
if (conv.event.type === "MEDIA_STATUS_FINISHED") { // 配置下一个场景为当前场景,清空插槽并设置为START状态 conv.scene.next = { name: conv.scene.name, // 保持当前场景名称不变 slots: {}, // 清空所有已填充的插槽 status: "START" // 强制场景从头开始执行 }; // 提示用户重新选择参数 conv.add("要不要换一个内容?请告诉我你的选择哦~"); }
2. 只重置特定插槽(按需使用)
如果不需要清空所有插槽,只想重置目标parameterName插槽,可以先复制现有插槽对象,删除目标插槽后再配置conv.scene.next:
示例代码:
if (conv.event.type === "MEDIA_STATUS_FINISHED") { // 复制当前插槽(避免直接修改不可变对象) const updatedSlots = {...conv.scene.slots}; // 删除需要重新收集的目标插槽 delete updatedSlots["parameterName"]; conv.scene.next = { name: conv.scene.name, slots: updatedSlots, status: "IN_PROGRESS" // 保留其他插槽的进度,仅重新收集目标参数 }; conv.add("要不要换一个选项?请重新告诉我你的选择。"); }
为什么不用克隆整个Conversation对象?
Google Actions的conv对象设计为不可变,但平台提供的conv.scene.next是官方认可的场景状态修改方式,这种方式更贴合平台的运行逻辑,能避免手动克隆对象可能带来的状态不一致问题,是更稳妥的方案。
这个方案的效果和你提到的视频里的"Again"功能完全一致,通过重置场景插槽让用户可以重新选择参数,完美适配你用后端服务构建对话流程的需求。
内容的提问来源于stack exchange,提问作者przemlat
相关产品推荐
相关产品推荐

