当前位置: 首页 > 知识库问答 >
问题:

BotBuilder将事件数据反向传输到会话

幸越泽
2023-03-14

TLDR:我如何使用从后台发送的数据初始化我的对话,并在与用户的整个对话中使用这些信息?

使用Microsoft botbuilder,提供了一种“反向通道”机制,我可以通过它向bot发送数据,也可以从bot发送数据。

与此答案类似,我正在使用backchannel方法向bot发送conversationStarted事件,以便按照您的预期启动对话。

收到事件后,我启动一个对话框,向用户发送主动消息。

bot.on('event', event => {
  if (event.name === 'conversationStarted') {
    bot.beginDialog(event.address, determineWhichDialogToStart(event))
  }
})

然后,我可以使用中间件或事件侦听器来截取此事件并查看其内容。果然我可以看到事件

{ type: 'event',
  name: 'conversationStarted',
  text: '',
  myMetaProperty: 'foobar',
  attachments: [],
  entities: [],
  address:
   { id: '8f5d3952-df3b-4340-89b4-97360f8d4965',
     channelId: 'emulator',
     user: { id: '33abc508-86d7-49c1-aa68-00a3491fda12' },
     conversation: { id: '4e8a943d-6a45-41f2-aa11-6671cc1ca4f3' },
     bot: { id: 'bot' },
     serviceUrl: 'http://localhost:3010/' },
  source: 'emulator',
  agent: 'botbuilder',
  user: { id: '33abc508-86d7-49c1-aa68-00a3491fda12' } }

但是我可以监听以查看此事件的事件无法访问会话,因为消息似乎尚未发送到一个。

如果我使用botBuilder中间件,或者路由事件,我就会看到它变成了消息而不是事件,并且丢失了传递给事件的元数据。

{ type: 'message',
  agent: 'botbuilder',
  source: 'emulator',
  sourceEvent: {},
  address:
   { id: '8f5d3952-df3b-4340-89b4-97360f8d4965',
     channelId: 'emulator',
     user: { id: '33abc508-86d7-49c1-aa68-00a3491fda12' },
     conversation: { id: '4e8a943d-6a45-41f2-aa11-6671cc1ca4f3' },
     bot: { id: 'bot' },
     serviceUrl: 'http://localhost:3010/' },
  text: '',
  user: { id: '33abc508-86d7-49c1-aa68-00a3491fda12' } }

我试图通过Github上的注释在我的receiveevent/middleware中访问会话,但虽然我访问了会话,但它不是会话。

bot.on('receive', event => {
  bot.loadSessionWithoutDispatching(event.address, (error, session) => {
    session.conversationData.myMetaProperty = event.myMetaProperty
  })
})

这实际上最终启动了一个新的会话-已经研究了load会话/loadSessionWithouse tDispatting,它们都导致了start会话,因此当我试图在对话框中使用它时,我将数据添加到会话中丢失了

bot.dialog('example', [
  (session, args, next) => {
    console.log(session.conversationData.myMetaProperty) // nope
    console.log(session.cantUseThisEither) // nope
    session.send('foo')
    next()
  }
])

现在我要重申一个问题,因为已经有了一些背景知识,我如何使用从后台发送的数据初始化我的对话,并在与用户的整个对话中使用这些信息?

共有2个答案

邹麻雀
2023-03-14

您可以通过beginDialog传递数据(地址:IAddress,dialogId:string,dialogArgs?:any,done?:(错误:Error)=

您可以在以下位置参考源代码:https://github.com/Microsoft/BotBuilder/blob/master/Node/core/src/bots/UniversalBot.ts#L243更多细节。

张逸清
2023-03-14

最后,我启动了一个通用对话框,它设置了我的会话,然后转到根对话框。

bot.on('event', event => {
  if (event.name === 'conversationStarted') {
    bot.beginDialog(event.address, 'initialise-conversation', {
      myMetaProperty: event.myMetaProperty
    });
  }
});

bot.dialog('initialise-conversation', (session, args, next) => {
  session.conversationData.myMetaProperty = args.myMetaProperty

  session.beginDialog('/');
});

然后,每当我在整个对话中需要myMetaProperty时,我可以从session.conversationData获取它

--

作为对下面评论的回应,这里有一些额外的信息可能会对某人有所帮助。

您在bot上接收的事件的形状必须包含地址。例如,这里有一个我发送给我的机器人。

{ myMetaProperty: 'foo',
  name: 'conversationStarted',
  type: 'event',
  address:
   { id: '4q5aaBw77aNGGvrpkeji8A',
     channelId: 'custom-directline',
     user: { id: 'c214imy6PCJZY4G1x2AXSD' },
     conversation: { id: 'bGvMBjEmFTg3DMxsbvJGjH' },
     bot: { id: 'bot' },
     serviceUrl: 'https://localhost:3010/' },
  source: 'custom-directline',
  agent: 'botbuilder',
  user: { id: 'c214imy6PCJZY4G1x2AXSD' } }

首先确保你正在发送地址。将消息路由回个人的关键信息位是用户和会话对象。

例如,如果您正在使用botframework webchat的反向通道发送信息,您将按照以下方式进行操作。

var user = { id: uuidv4() };
var botConnection = new BotChat.DirectLine({...});

botConnection.postActivity({
    type: 'event',
    from: user,
    name: 'conversationStarted',
    myMetaProperty: 'foo',
}).subscribe();

BotChat.App({
    user: user,
    botConnection: botConnection,
}, document.getElementById("bot"));

这将由上述事件侦听器拾取。

另一件需要注意的事情是,emulator(可能还有其他客户端/通道)发送一个conversationUpdate事件,我在使用它时刚刚将它传递到我的conversationStarted事件上。下面是侦听器,以供参考,以防有用。

  bot.on('conversationUpdate', message => {
    message.membersAdded &&
      message.membersAdded
        .filter(identity => identity.id === message.address.bot.id)
        .forEach(identity => bot.emit('conversationStarted', message));
  });
 类似资料:
  • 问题内容: 在React中,我有类似的文件 parent.js 包含文本框和按钮 child.js 包含P标签 App.js 包含父组件和子组件 问题 将“父级”上的“文本框”值传递给子级,并将其显示在子级标记中。 完整代码 堆叠 问题答案: 更新了示例以将数据传递给子组件。 https://stackblitz.com/edit/react- trmj9i?file=child.js 在下面添加

  • -bash-4.1$ 任何帮助都将不胜感激。

  • 本文向大家介绍数据传输的事务有几种?相关面试题,主要包含被问及数据传输的事务有几种?时的应答技巧和注意事项,需要的朋友参考一下 数据传输的事务定义通常有以下三种级别: 最多一次: 消息不会被重复发送,最多被传输一次,但也有可能一次不传输 最少一次: 消息不会被漏发送,最少被传输一次,但也有可能被重复传输. 精确的一次(Exactly once): 不会漏传输也不会重复传输,每个消息都传输被

  • 我有一个组件A,它触发一个对话框 此组件触发PicuploadComponent,我在此上传图像并接收带有一些数据响应

  • 我正试图传送一封电子邮件到控制器,但由于某些原因它不工作,我收到404错误。 当我将email变量更改为没有“.”的字符串时。它起作用了。 这就是它在客户端的样子- 在控制器里- 感谢任何帮助!!谢谢

  • 当使用链式法则计算成本函数相对于层权重的斜率时,公式变为: 与: 作为感应局部场: 输出端: 作为输入 请注意,在层上方的代码中,层是最后一层或输出层。和sigmoid\u导数(自输出)这是当前层的激活作为用作激活函数的sigmoid函数导数的输入。 问题是: 我们不应该使用这个sigmoid\u导数(np.dot(self.layer1,self.weights2))而不是这个sigmoid\u