技能概觀

適用于: SDK v4

您可以使用技能 Bot 擴充 Bot 。 其他 Bot 可以取用技能、促進重複使用,如此一來,您就可以建立使用者面向的 Bot,並藉由取用您自己的或協力廠商技能來擴充。

  • 技能 是一個 Bot,可以針對另一個 Bot 執行一組工作—Bot 可以是技能與使用者面向的 Bot。
  • 技能取用者 是可呼叫一或多個技能的 Bot。 使用者面向技能取用者也稱為 根 Bot
  • 技能資訊清單 是 JSON 檔案,描述技能可執行檔動作、其輸入和輸出參數,以及技能的端點。

換句話說,使用者會直接與根 Bot 互動,而根 Bot 會將一些交談邏輯委派給技能。

技能功能的設計目的是:

  • 技能與取用者會使用 Bot Framework 通訊協定透過 HTTP 進行通訊。
  • 技能取用者可以取用多個技能。
  • 不論用來實作技能的語言為何,技能取用者都可以取用技能。 例如,C# Bot 可以使用使用 JavaScript 實作的技能。
  • 技能也可以是技能取用者,並呼叫其他技能。
  • 技能支援使用者驗證;不過,使用者驗證是技能的本機驗證,無法傳輸至另一個 Bot。
  • 技能可以搭配 Bot Framework 配接器和自訂配接器使用。

此圖顯示一些可能的排列。

Illustration of permutations between skill consumers and skills.

概念架構

技能與技能取用者是個別的 Bot,您可以獨立發佈它們。

  • 技能取用者需要新增管理技能的邏輯,例如呼叫或取消技能的時機等等。 除了一般 Bot 和配接器物件之外,取用者還包含一些技能相關物件,用來與技能交換活動。 技能取用者會實作至少兩個 HTTP 端點:
    • 訊端點 會從使用者或通道接收活動。 這是所有 Bot 實作的一般傳訊端點。
    • 從技能接收活動的技能主機端點 。 這可作為回呼 URL,即技能所回復的服務 URL。 (技能取用者需要配對程式碼,以使用技能處理常式從技能接收 HTTP 方法要求。
  • 技能需要新增邏輯,才能在活動完成時傳送 endOfConversation 活動,讓技能取用者知道何時停止將活動轉送至技能。

此圖表概述從使用者到根 Bot 到技能的活動流程,並再次返回。

Illustration of how activities flow from the user to the skill and back again.

  1. 根 Bot 的配接器會從使用者接收活動,並將其轉送至根 Bot 的活動處理常式。 (來自使用者的活動會在根 Bot 的傳訊端點收到。
  2. 根 Bot 會使用技能 HTTP 用戶端將活動傳送至技能。 用戶端會從技能定義和技能交談識別碼處理站取得取用者技能交談資訊。 這包括技能將用來回復活動的服務 URL。
  3. 技能的配接器會從技能取用者接收活動,並將其轉送至技能的活動處理常式。 (來自取用者的活動會在技能 Bot 的傳訊端點收到。
  4. 當技能回應時,根 Bot 的技能處理常式會收到活動。 它會從技能交談識別碼處理站取得根使用者交談資訊。 然後,它會將活動轉送至根 Bot 的配接器。 (來自技能的活動會在根 Bot 的技能主機端點收到。
  5. 根 Bot 的配接器會在內部產生主動式訊息,以繼續與使用者交談。
  6. 根 Bot 的配接器會將技能的任何訊息傳送給使用者。

這些物件可協助管理技能和路由技能流量:

  • Bot Framework 技能 描述技能的路由資訊,而且可以從技能取用者的組態檔讀取。
  • 技能 HTTP 用戶端 會將活動傳送至技能。
  • 技能處理常式 會從技能接收活動。
  • 技能對話識別碼處理站 會轉譯使用者根對話參考與根技能交談參考。
  • Bot 連線or 服務同時提供通道和 Bot 對 Bot 驗證。 使用驗證組態 物件,您可以將宣告驗證新增至技能或技能取用者,以限制哪些應用程式或使用者可以存取。

技能用戶端和技能處理常式物件都使用 交談識別碼處理站 來轉譯根 Bot 用來與使用者互動的交談,而根 Bot 用來與技能互動的交談。

技能資訊清單

技能資訊清單 是 JSON 檔案,描述技能可執行檔動作、其輸入和輸出參數、技能的端點,以及分派技能的模型。

如需技能資訊清單架構的相關資訊,請參閱如何 撰寫技能資訊清單

Bot 對 Bot 通訊

請務必瞭解此設計的某些層面,與您要設計的 Bot 無關。

技能動作

某些技能可以執行多個工作或 動作 。 例如,待辦事項技能可能會允許建立、更新、檢視及刪除可做為離散交談存取的活動。

交談參考

使用者根對話與根技能交談不同。

交談識別碼 處理站 可協助管理技能取用者與技能之間的流量。 處理站會轉譯根使用者與使用者交談的識別碼,以及其具有技能的交談識別碼。 換句話說,它會產生交談識別碼,以在根目錄與技能之間使用,並從根技能交談識別碼中復原原始使用者根對話識別碼。

跨伺服器協調

根和技能 Bot 會透過 HTTP 進行通訊。 因此,從技能接收活動的根 Bot 實例可能不是傳送起始活動的相同實例;換句話說,不同的伺服器可能會處理這兩個要求。

  • 在將活動轉送給技能之前,請務必先將狀態儲存在技能取用者中。 這可確保從技能接收流量的實例可以在呼叫技能之前,先從先前的實例離開的地方進行挑選。
  • 當技能處理常式從技能接收活動時,它會將其轉譯為適合技能取用者的表單,並將它轉送至取用者的配接器。

技能取用者和技能狀態

技能取用者和技能分別管理自己的狀態。 不過,取用者會建立用來與技能通訊的交談識別碼。 這可能會對技能中的交談狀態產生影響。

重要

如先前所述,當技能取用者將使用者活動委派給技能時,不同的取用者實例可能會收到技能回應。 取用者應該一律先儲存交談狀態,再將活動轉送至技能。

Bot 對 Bot 驗證

您不需要應用程式識別碼和密碼,即可在 Bot Framework 模擬器本機測試技能和技能取用者。 仍然需要 Azure 訂用帳戶,才能將技能部署至 Azure。

服務層級驗證是由 Bot 連線or 服務所管理。 架構會使用持有人權杖和 Bot 應用程式識別碼來驗證每個 Bot 的身分識別。 (Bot Framework 會使用 驗證組態 物件來驗證傳入要求的驗證標頭。

重要

這需要所有已部署的 Bot(技能取用者及其取用的任何技能)都具備有效的應用程式認證。

宣告驗證

您必須將宣告驗證程式 新增 至驗證組態。 宣告會在驗證標頭之後進行評估。 在您的驗證程式代碼中擲回錯誤或例外狀況,以拒絕要求。

注意

如果 Bot 具有應用程式識別碼和密碼,則執行宣告驗證;否則,不會執行宣告驗證。

您可能會因為拒絕其他已驗證的要求而有各種原因:

  • 當技能取用者只接受來自可能已起始交談之技能的流量時。
  • 當技能是付費服務的一部分,且不在資料庫中的使用者不應該有存取權時。
  • 當您想要將技能的存取限制為特定技能取用者時。

重要

如果您未提供宣告驗證程式,則不論您的 Bot 是技能或技能取用者,都會收到來自另一個 Bot 的活動時,Bot 會產生錯誤或例外狀況。

偵錯技能交談

由於技能與技能取用者之間的流量已經過驗證,因此偵錯這類 Bot 時會有額外的步驟。

  • 技能取用者及其直接或間接取用的所有技能都必須執行。
  • 如果 Bot 在本機執行,且任何 Bot 都有應用程式識別碼和密碼,則所有 Bot 都必須具有有效的識別碼和密碼。
  • 如果 Bot 全部部署,請參閱如何使用 ngrok 從任何通道對 Bot 進行偵錯。
  • 如果某些 Bot 在本機執行,且有些 Bot 已部署,請參閱如何偵錯技能或技能取用

否則,您可以偵錯技能取用者或技能,就像偵錯其他 Bot 一樣。 如需詳細資訊,請參閱 使用 Bot Framework 模擬器 進行 Bot 偵錯和 偵錯。

其他資訊

從使用者的觀點來看,他們正在與根 Bot 互動。 從技能的觀點來看,技能取用者是與使用者通訊的通道。