簡體   English   中英

無法讓 imBack 在設置為與團隊合作的自適應卡上工作

[英]Can't get imBack to work on Adaptive Cards that are set up to work with teams

我的機器人有一張菜單卡,我最近發現它不適用於團隊。 我想使用 imBack 方法在聊天中顯示消息。 就他們自己而言,我可以通過以下方式完成此操作:

// For directline/webchat
"type": "Action.Submit",
"title": "Get Order Status",
"data": "Get Order Status"
},

// For MS Teams
"type": "Action.Submit",
"title": "Get Order Status",
"data": {
    "msteams": {
        "type": "imBack",
        "value": "Get Order Status"
    },
},

但是,如果我使用直線/網絡聊天版本,我會在 Teams 中收到一般機器人錯誤(我相信該錯誤是因為按鈕沒有創建 imBack 消息,因此 LUIS 查詢為空並且我的所有代碼都引用了 topIntent 等 LUIS 屬性並且得分失敗。由於機器人設計,每回合都需要調用 LUIS。)同樣,如果我使用 Teams 版本,出於同樣的原因,我會在直線/網絡聊天中收到一般機器人錯誤。 起初,我嘗試添加其他對象,例如我為其他頻道 ID 為 msteams 創建的對象,但這並沒有改變行為。 根據此處的信息,我能夠添加文本屬性並將其從 context.activity.value 復制到 context.activity.text,方法如下:

// In my card definition
"type": "Action.Submit",
"title": "Get Order Status",
"data": {
    "msteams": {
        "type": "imBack",
        "value": "Get Order Status"
    },
    "text": "Get Order Status"
},

// In my onMessage handler
if (context.activity.channelData.postBack) {
    context.activity.text = context.activity.value.text;
}

當我以這種方式實施時,它在技術上確實適用於兩個渠道。 但是,菜單選擇(在本例中為Get Order Status )不會作為來自用戶的消息出現在聊天 window 中(並且不會顯示在聊天記錄中)用於直達/網絡聊天頻道(它適用於 Teams渠道)。 我真的希望它的行為方式與如果我在我的直達/網絡聊天實現中只有數據屬性中的文本一樣。 有什么方法可以設置卡片(例如,通過不同格式的數據 object 根據頻道發送不同的數據)和/或 onMessage 處理程序,以便在單擊按鈕時,無論頻道如何,文本都會顯示在聊天 window 中,並且通過擴展該文本將通過 LUIS go,這樣我就不會因為 null LUIS 屬性而收到機器人錯誤?

我的想法是為 Teams 創建一個單獨的卡片助手,並根據 channelId 從我的菜單意圖中調用它,但如果可能的話,我想要一個比這更優雅的解決方案,特別是因為我有幾張不同的卡片提交像這樣的按鈕。

如果您的卡不包含任何輸入,那么我懷疑您想要一張英雄卡而不是自適應卡。 英雄卡中的 imBack 將在 Web Chat 和 Teams 中自動按照您想要的方式工作。 雖然 Adaptive Cards 旨在適應其主機的 styles,但 Adaptive Cards 沒有內置的“imBack”功能。 字符串提交操作是 Web Chat 的一項功能,而 Adaptive Cards 中的 Bot Framework 操作是 Teams 的一項功能。 您正在嘗試讓 Adaptive Cards 做一些他們自己無法做的事情,因此如果您想要這樣做,您需要考慮您的特定渠道。

從這個答案: How to rewrite a Adaptive Card Submit Action for MSTeams also working in Web Chat?

我的博文解釋說,如果您想使用字符串提交操作,您需要在 Web Chat and Teams 中以不同的方式執行此操作: https://blog.botframework.com/2019/07/02/using-adaptive-cards-with -微軟機器人框架/

如果您希望相同的提交操作在兩個通道中以相同的方式工作,則需要是 object 提交操作。 如果您希望字符串提交操作在兩個通道上都起作用,那么您的機器人將需要檢查活動來自哪個通道並做出相應的反應。

盡管根據您的用例,Kyle 的答案是正確的,但對我而言,正確的解決方案最終是在調用助手時根據通道在卡片助手功能之間切換。 所以就像我原來的問題一樣,我仍然在使用

// For directline/webchat
"type": "Action.Submit",
"title": "Get Order Status",
"data": "Get Order Status"
},

// For MS Teams
"type": "Action.Submit",
"title": "Get Order Status",
"data": {
    "msteams": {
        "type": "imBack",
        "value": "Get Order Status"
    },
},

但我在兩個完全獨立的助手中構建卡片,對我來說稱為GetMenuCardGetMenuCardTeams 然后,在我需要顯示菜單卡的任何地方,我都會先進行以下檢查:

if (context.activity.channelId == 'meteams') {
    var menuCard = CardHelper.GetMenuCardTeams(cardOptions);
} else {
    var menuCard = CardHelper.GetMenuCard(cardOptions);
}

請注意,您需要根據進行檢查的位置調整變量。 context.activity.channelId適用於大多數地方。 如果您在瀑布中,則需要step.context.activity.channelId (或者您命名步驟上下文變量的任何名稱,step 和 stepContext 似乎是人們最常使用的)。 在我的 QnA 對話框中,我沒有傳遞上下文,只是傳遞活動,但它仍然可以通過activity.channelId起作用(該助手只是傳回一個答案,而不是發送活動,這就是我不需要上下文的原因)。 因此,您不需要上下文來設置助手 function,但您至少需要活動或獲取頻道 ID 的方法。

我已經實現了它並發現它是我預期用例的最佳解決方案。 但是,如果您不想弄亂所有 if 語句,只想讓一張卡片在兩個通道中按預期工作,Kyle 的答案是使用 Hero Cards 是更好的方法。

“imBack”屬性在 MS Teams 中運行良好。 最好讓 webcat 和 msteams 的屬性“數據”不同。 對於 MS Teams,使用結構:

 "msteams": {
    "type": "imBack",
     "value": <value>
             }
       }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM