假设您正在动态获取可以登机的乘客列表.用户需要能够从列表中选择任意数量的乘客来登记.我可以制作动态列表,但我无法弄清楚如何允许它选择多个选项.我在动态字段上使用了.SetAllowsMultiple(true),但它不起作用.我在这里查看了文档中的formflow示例,但该示例仅允许单个选择.你会如何使它与多个选择一起工作?
这是我在CheckinDialog类中放置的属性:
public string Passenger { get; set; }
Run Code Online (Sandbox Code Playgroud)
这是我的动态领域:
.Field(new FieldReflector<CheckinDialog>(nameof(Passenger))
.SetAllowsMultiple(true)
.SetActive((state) =>
{
return CheckinDialog.Passengers != null && CheckinDialog.Passengers.Count > 0;
})
.SetPrompt(new PromptAttribute(Resources.Checkin.Passengers))
.SetType(null)
.SetDefine((state, field) =>
{
foreach (var pax in GetPassengers())
field
.AddDescription(pax, pax)
.AddTerms(pax, pax);
return TaskHelpers.FromResult(true);
}))
Run Code Online (Sandbox Code Playgroud) 我正在开发一个Microsoft Bot Framework项目,以便将聊天机器人添加到我的网站.我需要将数据从聊天UI连续传递到Bot以获取用户详细信息和当前页面详细信息.因此我无法使用Web Chat客户端.
除了创建自己的聊天界面外,我还可以使用哪些其他方法?
也许我很傻,但是我真的不明白如何阅读Microsoft bot框架sdk的node.js版本。我试图弄清楚如何在ConsoleConnector bot中使用beginDialogAction()或endConversationAction()。该文档说它在触发时会注册一个动作,但没有提及如何触发它。我想利用它可以在正常流程之外的调用堆栈中间添加对话框的想法。
抱歉,我无法提供代码,但是我可以提供此代码...
var connector = new builder.ConsoleConnector().listen();
var connector = new builder.ConsoleConnector().listen();
var bot = new builder.UniversalBot(connector);
bot.dialog('/', [
function( session ) {
builder.Prompts.text(session, "blah blah blah?");
},
function( session, results ) {
// ...
session.beginDialog('/foo');
session.endDialog();
}
]);
bot.dialog('/foo', [
function( session, args ) {
// ...
},
function( session, results ) {
// ...
session.endDialog();
}
]);
bot.use({ botbuilder: function( session, next ) {
// CALL …Run Code Online (Sandbox Code Playgroud) 我在Api.ai上制作了一个演示机器人(免费版),并将其与facebook集成,但问题是它除了我以外没有其他任何人回复?也许是因为我从我的帐户创建了facebook页面并生成了页面访问令牌......但是我如何让我的机器人与其他用户进行通信呢?
我已经实现了如下的无意图.
[LuisIntent("None")]
public async Task None(IDialogContext context, LuisResult result)
{
await context.PostAsync("I'm sorry. I didn't understand you.");
context.Wait(MessageReceived);
}
Run Code Online (Sandbox Code Playgroud)
但看起来我需要在路易斯那边训练一些话语,这是我不想要的.我正在寻找在路易斯找不到或识别的东西,应该解雇无意图处理程序.我该如何实现这一目标?
我正在实现一个反馈对话框,并希望使用IScorableand键将“ feedback”一词从任何地方插入该对话框并将其压入FeedbackDialog堆栈。
从用户收集反馈时,我不希望出现这种情况。有没有办法确定my FeedbackDialog是否已经在堆栈中?所以我不会不小心双按它吗?
如何捕获对话框中的所有异常?是否有类似ASP.NET异常过滤器的东西?我想根据异常类型向用户发送不同的消息.
谢谢
我使用bot框架创建了一个机器人,我只是在我的计算机上开发和测试它.
我现在需要注册机器人,以便我可以在线使用它并将其与Cortana等其他MS服务集成.
但我找不到办法做到这一点,一切都是如此令人困惑,所有教程似乎都已过时.例如,他们中的大多数告诉我去https://dev.botframework.com并点击"注册机器人",但该选项卡不再存在,当我点击"创建"时,我被重定向到Azure它似乎不是注册机器人而是创建一个新机器人.
有人可以提供一步一步的解决方案来注册Azure上的现有机器人(在我的计算机上)吗?
对不起,这不是针对本网站的问题,但我认为更多的人可能有同样的问题,这可以提供帮助.
我正在使用.NET Bot Builder v 3.15.2.2并在Bot Emulator v 3.5.36中测试它
我正在尝试应用一个计时器(非常类似于#837),在新的对话开始后,有一个10分钟的计时器来检查是否有任何不活动.一旦它已经失效,它将向对话发布消息,如果有人加入对话,它将停止计时器.我尝试了一种简单的方法,通过全局声明一个计时器并具有一个计时器回调.但是在我输入任何内容之前,我总是在模拟器中收到:"抱歉,我的机器人代码有问题".如果我将Timer作为全局变量删除,它运行正常.我知道对于我想要全局声明的类,它应该是可序列化的,但我不确定它如何适用于其他类似Timer.
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result) {
var message = await result;
await SaveConversation(context, message);
var timerCallBack = new TimerCallback(this.TimerEventCallback);
this.botTimer = new Timer(timerCallBack, context, new TimeSpan(0, 10, 0).Milliseconds, new TimeSpan(0, 10, 0).Milliseconds);
}
public void TimerEventCallback(object obj)
{
var context = (IDialogContext)obj;
Activity reply = (Activity)context.Activity;
ConnectorClient connector = new ConnectorClient(new System.Uri(reply.ServiceUrl));
connector.Conversations.ReplyToActivityAsync(reply.CreateReply($"Conversation has been closed due to Inactivity")).Wait();
this.botTimer.Dispose();
}`
Run Code Online (Sandbox Code Playgroud) 我正在尝试通过DirectLineClient库将活动发送到我的机器人:
var directLineClient = new DirectLineClient($"{secret}");
directLineClient.BaseUri = new Uri($"https://directline.botframework.com/");
var conversation = await directLineClient.Conversations.StartConversationAsync().ConfigureAwait(false);
var activity = new Microsoft.Bot.Connector.DirectLine.Activity();
activity.From = new Microsoft.Bot.Connector.DirectLine.ChannelAccount();
activity.From.Name = "Morgan";
activity.Text = message;
activity.Type = "message";
var resourceResponse = await directLineClient.Conversations.PostActivityAsync(conversation.ConversationId, activity).ConfigureAwait(false);
await ReadBotMessagesAsync(directLineClient, conversation.ConversationId);
Run Code Online (Sandbox Code Playgroud)
resourceResponse始终为null。
Nicolas R回答后编辑
我添加了一种方法来等待机器人的响应:
private static async Task ReadBotMessagesAsync(DirectLineClient client, string conversationId)
{
string watermark = null;
while (true)
{
var activitySet = await client.Conversations.GetActivitiesAsync(conversationId, watermark);
watermark = activitySet?.Watermark;
foreach (Microsoft.Bot.Connector.DirectLine.Activity activity in activitySet.Activities)
{
Console.WriteLine(activity.Text);
if (activity.Attachments …Run Code Online (Sandbox Code Playgroud) botframework ×10
c# ×6
.net ×1
asp.net-mvc ×1
azure ×1
azure-language-understanding ×1
bots ×1
chatbot ×1
facebook ×1
javascript ×1
node.js ×1
timer ×1
web-chat ×1