如何实现DA功能暂不支持提示屏及解决无限循环问题
功能暂不支持提示屏(Offramp Screen)实现问题解答
问题概述
尝试实现「功能暂不支持」提示屏(这类Offramp Screen在应用中很常见),但未在文档Recipe板块找到对应方案。理想流程:用户可从提示屏返回触发跳转的问题页(需重置对应变量以重新触发提问),或退出访谈。编写的示例代码出现DA持续尝试定义event_not_supported的无限循环问题,需解决两个问题:
- 是否有实现这类Offramp的标准方案?
- 示例代码触发无限循环的原因是什么?
示例代码:
--- id: problematic_question # sets the value of var --- mandatory: True code: | if var == "x": undefine("var") # not sure if undefine() or forget_result_of('problematic_question') would be better here, or if they're perhaps equivalent for this use case [or if I'm completely off] force_ask("event_not_supported") --- event: event_not_supported question: (!!!) This option not supported buttons: - Go back: refresh # if I understand correctly, undefining var, in conjunction with refresh, should take the user back to problematic_question - Exit: leave ---
解答
1. Offramp提示屏的标准实现方案
这类提示屏的核心是临时中断流程、提供明确的退出/返回路径,标准实现思路有两种:
- 独立节点+明确跳转:将提示屏设为独立对话节点,原问题节点通过条件判断跳转至该节点;提示屏的返回按钮直接指向原问题节点,同时在按钮动作中重置变量,逻辑清晰可控。
- 事件驱动+动作绑定:定义专用提示事件,触发后展示提示页,按钮动作直接绑定变量重置和节点跳转,避免依赖
refresh这类副作用较强的动作。
推荐的简洁实现代码:
--- id: problematic_question # 保留原有的var设置逻辑 --- mandatory: True code: | if var == "x": # 跳转前不重置变量,留到返回时处理 force_ask("unsupported_feature_screen") --- id: unsupported_feature_screen question: (!!!) 该功能暂不支持 buttons: - 返回问题页: action: run_code code: | undefine("var") # 回到原问题前重置变量 go_to("problematic_question") # 直接跳转回原问题节点 - 退出访谈: leave ---
这种方式通过go_to明确指定返回节点,配合代码块精准重置变量,完全避免了refresh带来的流程不确定性。
2. 无限循环的原因分析
你的代码触发无限循环的核心问题有两点:
- 变量重置时机错误:在触发提示屏前就执行了
undefine("var"),当用户点击“Go back”执行refresh后,原问题节点problematic_question的mandatory: True会强制重新加载,如果该节点的逻辑会默认将var设置为"x"(比如原问题的初始化逻辑),就会再次满足var == "x"的条件,重新触发提示屏跳转,形成闭环。 refresh动作的不确定性:refresh会重新启动整个对话流程的检查逻辑,而非精准返回原问题节点,加上你提前重置了变量,导致流程反复触发跳转条件,最终陷入无限循环。
简单来说:跳转前重置变量+依赖refresh返回,导致原问题的条件判断被反复触发,形成无限循环。正确的做法是在返回原问题时再重置变量,并使用go_to直接指定跳转节点。
内容的提问来源于stack exchange,提问作者NotAnAmbiTurner
相关产品推荐
相关产品推荐

