Persist Bot Conversation States in Azure Cosmos DB with Bot Framework Composer V2.1.2

Posted by

This post has been republished via RSS; it originally appeared at: New blog articles in Microsoft Community Hub.

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:





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



  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":, "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:




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:




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


Happy Bot Framework Development!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.