【问题标题】:Can't get imBack to work on Adaptive Cards that are set up to work with teams无法让 imBack 使用设置为与团队合作的自适应卡片
【发布时间】:2020-12-09 08:21:06
【问题描述】:

我的机器人有一张菜单卡,我最近发现它不适用于团队。我想使用 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 查询为空,并且我的所有代码都引用了 LUIS topIntent 和 score 等属性失败。由于机器人设计,LUIS 需要每回合调用一次。)同样,如果我使用 Teams 版本,出于同样的原因,我会在直线/网络聊天中遇到一般机器人错误。起初,我尝试添加其他对象,例如我为 msteams 为其他频道 ID 创建的对象,但这并没有改变行为。根据here 的信息,我能够添加 text 属性并将其从 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)不会作为来自用户的消息(并且通过扩展,不会显示在聊天记录中)出现在聊天窗口中,用于 directline/网络聊天频道(它适用于团队频道)。我真的希望它的行为方式与我的直接/网络聊天唯一实现中的数据属性中的文本相同。有什么方法可以设置卡片(例如,通过不同格式的数据对象来根据频道发送不同的数据)和/或 onMessage 处理程序,以便在单击按钮时,无论频道如何,文本都会显示在聊天窗口中,并且通过扩展该文本将通过 LUIS,这样我就不会因为 LUIS 属性为空而收到机器人错误?

我的想法是为团队创建一个单独的卡片助手,并根据 channelId 从我的菜单意图中调用它,但如果可能的话,我想要一个更优雅的解决方案,特别是因为我有几个不同的带有类似提交按钮的卡片。

【问题讨论】:

  • 这个问题很难理解,我怀疑至少有一条信息你忘了包括。您首先说您有一个可行的解决方案,然后没有解释就说您尝试了不同的方法。目前尚不清楚您要解决什么问题,目前似乎有几种可能性。您是否可能说问题在于 imBack 操作在 Teams 中没有显示文本?您是不是说您不希望两个频道使用两种不同的格式?无论哪种方式,都不清楚您的两个代码块之间的行为有何不同。
  • imBack 没有直接显示文本。如果我采用直接显示它的格式,它在团队中不起作用。如果我有一种在团队中显示它的格式,它就不能直接使用。但如果它不显示在团队中,整个事情就会出错。
  • 很抱歉,但这仍然不能解释问题。我想明确一点,当我说“显示文本”时,我的意思是消息在脚本窗口中呈现,我不一定指的是卡片操作的 displayText 属性。当您说 imBack 时,您是在谈论字符串提交操作还是实际的 imBack 卡操作(仅在 Bot Framework 卡中而不是自适应卡中)?你读过这篇博文吗? blog.botframework.com/2019/07/02/…
  • 如果您的格式适用于每个频道,为什么不让您的机器人根据频道 ID 发送不同的卡片?你所说的“如果它没有在团队中显示,整个事情就会出错”是什么意思?您是在谈论显示卡片还是呈现操作消息?什么是“整件事”,它出错意味着什么?我认为您应该认真考虑重写您的问题,以解释您实际尝试做什么以及为什么。
  • 我会尝试您的第一个建议,并稍后尝试编辑问题。我希望我可以拥有一种可以跨多个渠道工作的单一格式,而不是使用单独的卡片格式。这就是自适应卡片的用途,对吧?

标签: node.js botframework microsoft-teams adaptive-cards web-chat


【解决方案1】:

如果你的卡没有输入,那么我怀疑你想要一张英雄卡而不是自适应卡。英雄卡中的 imBack 将自动按照您在网络聊天和团队中所需的方式工作。虽然自适应卡片旨在适应宿主的风格,但自适应卡片没有内置的“imBack”功能。字符串提交操作是 Web Chat 的一项功能,自适应卡片中的 Bot Framework 操作是 Teams 的一项功能。您正在尝试让 Adaptive Cards 做一些他们自己无法做的事情,因此如果您想这样做,您需要考虑您的特定渠道。

来自这个答案:How to rewrite a Adaptive Card Submit Action for MSTeams also working in Web Chat?

我的博客文章解释说,如果您想使用字符串提交操作,您需要在 Web Chat 和 Teams 中以不同的方式执行:https://blog.botframework.com/2019/07/02/using-adaptive-cards-with-the-microsoft-bot-framework/

如果您想让相同的提交操作在两个渠道中以相同的方式工作,则需要一个对象提交操作。如果您希望字符串提交操作在两个渠道上都起作用,那么您的机器人将需要检查活动来自哪个渠道并做出相应的反应。

【讨论】:

  • 我之前其实是用英雄卡的,但是像我这样6-8个动作,格式化不好。但我在这里得到了外卖。根据我的需求,我要么需要团队使用英雄卡,其他频道使用自适应卡,要么根据频道使用两种不同的自适应卡模式。无论哪种方式,我都需要设置特定于频道的行为。感谢您对此进行研究。
  • 在此类问题中提及您之前尝试过的东西总是很好
  • 当然,我应该提到这一点,因为从技术上讲,英雄卡在两个渠道都可以正常工作。他们只是没有必要的两列格式,而且我觉得他们在有 6 个以上按钮的团队中看起来不太合适。
【解决方案2】:

虽然根据您的用例,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 工作(该助手只是传递回答案,而不是发送活动,这就是我不需要上下文的原因)。因此,您不需要上下文来设置帮助函数,但您至少需要活动或获取通道 ID 的方法。

我已经实现了这一点,并发现它是我预期用例的最佳解决方案。但是,如果您不想弄乱所有 if 语句,而只想让一张卡在两个通道中都按预期工作,那么 Kyle 使用英雄卡的答案是更好的方法。

【讨论】:

    【解决方案3】:

    “imBack”属性在 MS Teams 中运行良好。最好让 webcat 和 msteams 的属性“数据”不同。对于 MS Teams,请使用以下结构:

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

    【讨论】:

    • 有没有办法使用这种格式,但在数据下为 msteams 和其他渠道有单独的对象?我尝试使用“模拟器”作为数据下的另一个对象键,但它不起作用。如果我可以为每个通道定义多个对象而不是需要两个完全独立的卡片助手,那就更好了。 @Kyle-Delaney?
    • 不,msteams 很特别
    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2020-04-11
    • 2020-09-12
    • 2021-10-19
    • 2020-08-13
    • 2020-04-28
    相关资源
    最近更新 更多