Persist Bot Conversation States in Azure Cosmos DB with Bot Framework Composer V2.1.2
Published Nov 02 2022 04:01 AM 1,277 Views
Microsoft


Large business scale often requires scaling Bot Framework App Instance from one to many. To make this work, the bot application needs to serialize memory info to storage, otherwise users may hit conversation state lost issues intermittently, for example, the next request doesn’t affinity on the same instance and then user feels bot doesn’t smartly follow previous conversation, or Skills Bot calling back with the same conversation ID but different instance, and root bot returns 404, etc. A typical root + skills bot infrastructure is like this:

 

freistli_0-1667386433374.png

 

 

To solve this problem in Bot Framework Composer, developers can configure Bot Framework Composer project setting. However after several updates in Bot Framework Composer, this part configuration guide becomes unclear and not up to date. Therefore, based on practical experience and code understanding on Bot Framework Composer microsoft/BotFramework-Composer, I have compiled the configuration considerations for this part, hoping to help developers and projects that encounter similar situations.

 

  1. Create Cosmos DB Azure Resource firstly.
  1. Open Bot Composer. Click Configuration, and choose the default bot, please choose the root bot if there are skills bots in the same project
  1. Choose Advanced Settings View

freistli_0-1667387925215.png

 

  1. Inside the runtimeSettings section, add this "storage" setting, please use the same key word CosmosDbPartitionedStorage:

 

 

 

"runtimeSettings": {

……………….

    "storage": "CosmosDbPartitionedStorage",

    "telemetry": {

      "logActivities": true,

      "logPersonalInformation": false,

      "options": {

        "connectionString": ""

      }

    }

  },

 

 

 

  1. At the same level of runtimSettings (not the child node of runtimeSettings), add details for CosmosDbPartitionedStorage:

 

 

 


"runtimeSettings": {

…….

},

  "CosmosDbPartitionedStorage": {

    "authKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXX",

    "cosmosDBEndpoint": https://XXXXXXXXXXXXXXX.documents.azure.com:443/,

    "databaseId": "botstate-db",

    "containerId": "botstate-container"

  },

  "skillConfiguration": {},

 

 

 

  1. Publish the bot project to Azure.

If everything works well, after several round chats with the root bot, you will find the Cosmos DB has similar data like this:

 

freistli_1-1667386433400.png

 

This means main/root bot persists the conversation data successfully on Cosmos DB, and correct information can be retrieved for multiple instances, or after instances reboot.

 

If you don’t want the conversation states store there long time, can choose the container Scale & Settings, to change its TTL:

 

freistli_2-1667386433403.png

 

Regarding the usage of CosmosDbPartitionedStorage, can be found from the previous discussion thread in Bot Composer issues:

 

https://github.com/microsoft/BotFramework-Composer/issues/8864#issuecomment-998963464

https://github.com/microsoft/BotFramework-Composer/issues/8864#issuecomment-1002832254

 

Happy Bot Framework Development!

Co-Authors
Version history
Last update:
‎Nov 02 2022 04:36 AM
Updated by: