同一intent能否返回不同响应?附Greeting意图现有实现代码示例
实现同意图返回不同响应的修改方案
核心逻辑是在用户持久化状态中新增标记位,记录是否已经触发过首次问候,每次触发Greeting意图时先判断标记状态,返回对应响应即可,修改后的代码如下:
new OnIntent("Greeting") { Actions = new List<Dialog>() { new CodeAction(async (dialogContext, options) => { var now = DateTime.Now.TimeOfDay; var time = now < new TimeSpan(12, 0, 0) ? "morning" : now > new TimeSpan(19, 0, 0) ? "evening" : "afternoon"; // 读取用户是否已完成首次问候的标记,默认值为false var hasGreeted = dialogContext.State.GetValue<bool>("user.hasGreeted", false); string finalGreeting; if (!hasGreeted) { finalGreeting = $"Good {time}, {CustmerName}, hello and welcome"; // 首次问候后更新标记为true,状态会持久化存储对应用户的属性 dialogContext.State.SetValue("user.hasGreeted", true); } else { finalGreeting = $"Good {time}, {CustmerName}, hello and welcome again"; } dialogContext.State.SetValue("dialog.greetingTime", time); dialogContext.State.SetValue("user.name", CustmerName); // 将生成的问候语存入会话状态供后续发送调用 dialogContext.State.SetValue("dialog.finalGreeting", finalGreeting); return await dialogContext.EndDialogAsync(options); }), // 直接读取会话状态中生成好的问候语发送 new SendActivity("${dialog.finalGreeting}") } },
补充说明
user.hasGreeted属于用户级别的持久化状态,只要是同一个用户发起的会话,该标记会一直保留,不会随单轮会话结束清空- 如果你需要实现更丰富的多轮问候差异,可把标记位改成数字类型,记录问候次数,根据不同次数返回不同的响应内容
内容的提问来源于stack exchange,提问作者Sunny Bhardwaj
相关产品推荐
相关产品推荐

