這篇文章我們來說一下Activity和Turn這兩個bot framework中最重要的兩個概念,同時也介紹一下TurnContext和BotAdapter
Activity
一個activity是聊天雙方的一個信息載體,它可以是一條消息,也可以是一個動作。比如用戶給bot發送一條文字消息,這就是一個activity,bot給用戶回復一張圖片,那這是另一個activity。
Activity是bot framework里最重要的概念,讓我們來一起看一下c# sdk里對activity的定義。真實感受一下
public class Activity{public string Type { get; set; }public string Id { get; set; }public DateTimeOffset? Timestamp { get; set; }public DateTimeOffset? LocalTimestamp { get; set; }public string LocalTimezone { get; set; }public string ServiceUrl { get; set; }public string ChannelId { get; set; }public ChannelAccount From { get; set; }public ConversationAccount Conversation { get; set; }public ChannelAccount Recipient { get; set; }public string TextFormat { get; set; }public string AttachmentLayout { get; set; }public IList<ChannelAccount> MembersAdded { get; set; }public IList<ChannelAccount> MembersRemoved { get; set; }public IList<MessageReaction> ReactionsAdded { get; set; }public IList<MessageReaction> ReactionsRemoved { get; set; }public string TopicName { get; set; }public bool? HistoryDisclosed { get; set; }public string Locale { get; set; }public string Text { get; set; }public string Speak { get; set; }public string InputHint { get; set; }public string Summary { get; set; }public SuggestedActions SuggestedActions { get; set; }public IList<Attachment> Attachments { get; set; }public IList<Entity> Entities { get; set; }public object ChannelData { get; set; }public string Action { get; set; }public string ReplyToId { get; set; }public string Label { get; set; }public string ValueType { get; set; }public object Value { get; set; }public string Name { get; set; }public ConversationReference RelatesTo { get; set; }public string Code { get; set; }public DateTimeOffset? Expiration { get; set; }public string Importance { get; set; }public string DeliveryMode { get; set; }public IList<string> ListenFor { get; set; }public IList<TextHighlight> TextHighlights { get; set; }public SemanticAction SemanticAction { get; set; }public string CallerId { get; set; }}
除了上面這么多的屬性,還有很多方法和擴展方法,是一個非常大的類,我們以后詳細一一說明。
Turn
下面是對于turn的官方說明:
In a conversation, people often speak one-at-a-time, taking turns speaking. With a bot, it generally reacts to user input. Within the Bot Framework SDK, a turn consists of the user’s incoming activity to the bot and any activity the bot sends back to the user as an immediate response. You can think of a turn as the processing associated with the arrival of a given activity.
一個turn就是對一個activity的相關處理。比如說,對于用戶發給我們bot一條消息,我們把這條消息轉發給另一個用戶,同時對消息本身點贊,那這兩個操作一起是一個turn,是針對用戶發來的消息的處理的turn。
Turn上下文(Turn Context)
我認為TurnContext是僅次于Activity的概念,turn context對象跟隨著整個消息的處理過程。地位非常類似以前asp.net的HttpContext概念。
public interface ITurnContext{BotAdapter Adapter { get; }TurnContextStateCollection TurnState { get; }Activity Activity { get; }bool Responded { get; }Task<ResourceResponse> SendActivityAsync(...);Task<ResourceResponse> UpdateActivityAsync(...);Task DeleteActivityAsync(...);ITurnContext OnSendActivities(...);ITurnContext OnUpdateActivity(...);ITurnContext OnDeleteActivity(...);}
可以看到TurnContext不算龐大,其他的屬性和方法看名字比較容易理解。其中一個主要概念是BotAdapter
BotAdapter
從官方說明,我們可以看到這個是鏈接你bot endpoint和bot處理邏輯的一個橋梁,它封裝了對于安全驗證和對middleware的處理。當你的bot endpoint收到一個請求時,BotAdapter會驗證這個請求是不是從正式渠道發送來的請求,如果是,它會創建Turn Context,然后開始各個middleware的處理。
要注意的一點是:Activity是貫穿于Azure bot service和bot framework sdk整條pipeline的,但是turn,turn context和BotAdapter,目前版本(v4)只是存在于bot framework sdk,是幫助開發人員處理bot的一個東西,如果你不想用turn,想自己處理整個bot的聊天,你可以只使用?
Microsoft.Bot.Schema
(包含Activity定義),不添加Microsoft.Bot.Builder
庫(含有turncontext和BotAdapter定義)。