使用活动处理程序的事件驱动聊天

适用于:SDK v4

活动处理程序是组织机器人聊天逻辑的一种事件驱动的方式。 每种不同类型或子类型的活动代表不同类型的对话事件。 在幕后,对于收到的任何类型的活动,机器人的轮次处理程序会调用单个活动处理程序。

例如,如果机器人收到了某个消息活动,轮次处理程序将会看到该传入的活动,并将其发送到 on message activity 活动处理程序。 生成机器人时,用于处理和响应消息的机器人逻辑将进入此 on message activity 处理程序。 同样,用于处理正在添加到聊天中的成员的逻辑将进入 on members added 处理程序,每次将成员添加到聊天时,都会调用该处理程序。

有关组织机器人逻辑的其他方法,请参阅“机器人的工作原理”中的机器人逻辑部分。

注意

Bot Framework JavaScript、C# 和 Python SDK 将继续受支持,但 Java SDK 即将停用,最终长期支持将于 2023 年 11 月结束。

使用 Java SDK 构建的现有机器人将继续正常运行。

要生成新的机器人,请考虑使用 Microsoft Copilot Studio 并阅读选择正确的助理解决方案

有关详细信息,请参阅机器人构建的未来

若要实现这些处理程序的逻辑,需要在机器人中重写这些方法,如以下示例活动处理程序部分中所示。 其中的每个处理程序没有基实现,因此,只需在重写中添加所需的逻辑。

在某些情况下,需要在轮次结束时重写基轮次处理程序,例如保存状态。 执行此操作时,请务必先调用 await base.OnTurnAsync(turnContext, cancellationToken);,以确保 OnTurnAsync 的基实现在其他代码之前运行。 除此之外,该基实现还负责调用剩余的活动处理程序,例如 OnMessageActivityAsync

活动处理

机器人逻辑处理来自一个或多个通道的传入活动,并在响应中生成传出活动。

主要机器人逻辑在机器人代码中定义。 若要将机器人实现为活动处理程序,请从实现 IBot 接口的 ActivityHandler 派生 bot 类。 ActivityHandler 为不同类型的活动定义各种处理程序,例如 OnMessageActivityAsyncOnMembersAddedAsync。 这些方法受保护,但可将其重写,因为我们将从 ActivityHandler 派生。

ActivityHandler 中定义的处理程序为:

事件 Handler 说明
已收到任一活动类型 OnTurnAsync 根据收到的活动类型调用其他处理程序之一。
已收到消息活动 OnMessageActivityAsync 重写此方法可以处理 message 活动。
已收到聊天更新活动 OnConversationUpdateActivityAsync 收到 conversationUpdate 活动时,如果除机器人以外的成员加入或退出聊天,则调用某个处理程序。
非机器人成员加入了聊天 OnMembersAddedAsync 重写此方法可以处理加入聊天的成员。
非机器人成员退出了聊天 OnMembersRemovedAsync 重写此方法可以处理退出聊天的成员。
已收到事件活动 OnEventActivityAsync 收到 event 活动时,调用特定于事件类型的处理程序。
已收到令牌响应事件活动 OnTokenResponseEventAsync 重写此方法可以处理令牌响应事件。
已收到非令牌响应事件活动 OnEventAsync 重写此方法可以处理其他类型的事件。
已收到消息回应活动 OnMessageReactionActivityAsync 收到 messageReaction 活动时,如果已在消息中添加或删除了一个或多个回应,则调用处理程序。
消息回应已添加到消息 OnReactionsAddedAsync 重写此方法可处理添加到消息的回应。
从消息中删除了消息回应 OnReactionsRemovedAsync 重写此方法可处理从消息中删除的回应。
已收到安装更新活动 OnInstallationUpdateActivityAsync 对于 installationUpdate 活动,根据机器人是已安装还是已卸载来调用处理程序。
安装了机器人 OnInstallationUpdateAddAsync 重写此方法可以添加逻辑来确定何时在组织单位中安装了机器人。
已卸载机器人 OnInstallationUpdateRemoveAsync 重写此方法可以添加逻辑来确定何时在组织单位中卸载了机器人。
已收到其他活动类型 OnUnrecognizedActivityTypeAsync 重写此方法可以处理未经处理的任何活动类型。

这些不同的处理程序具有一个 turnContext,用于提供有关对应于入站 HTTP 请求的传入活动的信息。 活动可以是各种类型,因此,每个处理程序在其轮次上下文参数中提供一个强类型化的活动,在大多数情况下,始终会处理 OnMessageActivityAsync

与在此框架的 4.x 旧版中一样,还有一个选项可以实现公共方法 OnTurnAsync。 目前,此方法的基实现会处理错误检查,然后根据传入活动的类型调用每个特定的处理程序(例如本示例中定义的两个处理程序)。 在大多数情况下,可以不用理会该方法并使用单个处理程序,但如果你的情况要求使用 OnTurnAsync 的自定义实现,则仍可以考虑该方法。

重要

如果重写 OnTurnAsync 方法,则需要调用 base.OnTurnAsync 以获取用于调用其他所有 On<activity>Async 处理程序的基实现,或自行调用这些处理程序。 否则不会调用这些处理程序,并且不会运行该代码。

示例活动处理程序

例如,可以处理 on members added 来欢迎用户参与聊天,并处理 on message 来复述他们发送给机器人的消息。

public class EchoBot : ActivityHandler
{
    protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
    {
        var replyText = $"Echo: {turnContext.Activity.Text}";
        await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);
    }

    protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
    {
        var welcomeText = "Hello and welcome!";
        foreach (var member in membersAdded)
        {
            if (member.Id != turnContext.Activity.Recipient.Id)
            {
                await turnContext.SendActivityAsync(MessageFactory.Text(welcomeText, welcomeText), cancellationToken);
            }
        }
    }
}

后续步骤

  • Microsoft Teams 通道引入了一些特定于 Teams 的活动,机器人需要支持这些活动才能正常与 Teams 配合工作。 若要了解有关开发 Microsoft Teams 机器人的重要概念,请参阅 Microsoft Teams 机器人的工作原理
  • 活动处理程序是设计不需要跟踪轮次之间对话状态的机器人的很好方式。 对话库提供用于管理与用户进行的长时间聊天的方式。