我正在使用云功能来响应documentation中所述的webhook。在DialogFlow上,我将所有参数设置为可选,而我想控制动态需要哪些参数。是否可以动态设置allRequiredParamsPresent?其次,如何使下一个输入/响应偏向于填充某个参数?
用户可以输入日期或日期范围,两者都是不同的参数。一个或另一个是必需的,但不是两个都需要。
不幸的是,在控制台中,如果我都按要求设置,则对话不会结束(这就是为什么我想在结束时进行覆盖),并且如果我不要求它们,则对话会在没有所有必需参数的情况下结束在场。
此外,根据代理程序要从Web挂钩询问的后续问题,我想使用户的下一个答案偏向于填充特定的@sys.any
参数,因为它一直在填充错误的参数。
答案 0 :(得分:3)
我建议您对每个参数使用意图,而不要使用实体。这样可以解决两个问题:
假设您需要3个参数来购买手表:颜色,日期/日期时间,费用
您的代理将具有以下意图:
对于每种意图,您将拥有全部3个可选参数。
另外,您将需要将参数的默认值设置为$entity
以实现自己的意图,将#context.entity
设置为其他参数。
例如,在意图get_color
中,您将具有以下参数和默认值:
color = $color
date = #buy_watch.date
cost = #buy_watch.cost
最后,您必须为上述所有意图调用webhook。
在webhook中,您将必须检查传入意图的参数,并根据缺少的参数设置 output_context + response_message 。
params = intent_request["query_result"]["parameters"]
case 1 --> if not params["color"]: set output_context = color and response = what color do you want
case 2 --> if not params["date"]: set output_context = date and response = when do you want to buy
case 3 --> if not params["cost"]: set output_context = cost and response = what is your budget
case 4 --> if you get all params: call event e_got_all_details
获取所有参数时,无论通过什么顺序获取它们,都将通过事件调用意图got_all_details
。
根据您在意图中配置的响应的 output_context 和 input_context ,将触发正确的意图,您将能够获得正确的值。
我遇到了类似的问题,在我看来,这是处理参数的最有效方法,用于验证参数并在您获得意外值时进行处理(使用特定于意图的后续回退意图)。
编辑1:还有一种额外的逻辑,可以根据您从日期或日期范围实体中获取的值来为日期分配值。
if params["date"] or params["date-range"]:
date = params["date"] if params["date"] else params["date-range"]
所有意图都有训练短语,这些短语将尝试捕获参数而没有任何顺序,但不会将其标记为必需。
因此,如果用户说我明天要购买手表,则buy_watch
的意图将随着参数日期被触发。该代码将检查颜色和成本是否丢失,并在设置适当的output_context
后提示输入。
希望有帮助。