如何保存MS bot状态数据和对话?

时间:2018-03-25 02:15:17

标签: node.js botframework bots azure-cosmosdb cortana

我正在使用节点js和Microsoft Bot builder sdk来编写BOT。目前,我正在保存数据包(conversationData,userData等)中的所有内容,并使用CosmosDb来存储状态。我按照这篇文章来配置CosmosDB&根据nodejs进行了更改。 https://azure.microsoft.com/en-in/blog/bot-conversation-history-with-azure-cosmos-db/

这种方法很少受到关注,

    当我们在对话框中调用endConversation()时,
  1. conversationData包被清除。这是由sdk设计所预期的,但我们希望将这些数据保存为具有相同用户(相同会话ID)的多个会话流。现在,当用户启动新意图时,db中的json cosmosDb将被conversationData上的新键替换。 例如:在{place}安排{day}的{name}会议。 我们保存conversationData.name,conversationData.day和conversationData。地点。 相同的用户在{place2}开始为{day2}的{name2}会议安排。 documentDb条目被conversationData.name1,conversationData.day2和conversationData替换。 place2
  2. 理想情况下,我们希望保留所有内容。

    是否有更好的方法来保存聊天记录和conversationData,userData MS BOT中的数据库?

1 个答案:

答案 0 :(得分:1)

所有存储实现只是编写getData和saveData,它们内部有一个键:值存储,其中key通常是userId + conversationId,但只要你可以从传递给{的参数中可靠地获取它,你就可以随意使用它。 {1}}和getData

查看redis https://github.com/suttna/botbuilder-redis-storage - https://github.com/suttna/botbuilder-redis-storage/blob/master/src/storage.ts中的示例,了解一个非常容易理解的示例存储实现。

您可以使用像这样的自定义实现

setData

// Create new storage with redis client var storage = new YourStorage() // this is just here for the sake of initializing a `bot` var connector = new builder.ChatConnector() var bot = new builder.UniversalBot(connector) // Configure bot to use YourStorage bot.set('storage', storage) bot.set('persistConversationData', true); 只是一个实现

的对象
storage

我完全从链接的redis模块中复制了这些签名,但它们在默认存储的BotBuilder源中是相同的 - https://github.com/Microsoft/BotBuilder/blob/5cf71c742f27d89e9dbc4076f850122bd6edac11/Node/calling/src/storage/BotStorage.ts

样本是打字稿。如果您不熟悉,请在public saveData(context: IBotStorageContext, data: IBotStorageData, callback?: (err: Error) => void) public getData(context: IBotStorageContext, callback: (err: Error, data: IBotStorageData) => void) 之后立即忽略指示事物类型的位。