如何save/load Bot Framework 会话信息to/from 本地磁盘?
How do I save/load Bot Framework session information to/from the local disk?
我有一个关于 Microsoft Teams Python 机器人的问题。如果 bot 已添加到一些个人聊天和群聊中并且我重新启动了 bot,有时需要再次将 bot 添加到聊天中。所以我想制作 机器人会话 。
是否可以在 Microsoft Teams 中创建机器人会话?我想将会话信息存储在本地磁盘上,然后让机器人在启动时加载该数据。
我的机器人代码与 this sample 非常相似。
感谢您的帮助。
更新:
就像我说的,我的机器人代码与 this sample 非常相似,但有一点不同。因此,我为此问题创建了一个示例。首先,我在 Azure 中创建了一个机器人并进行了设置。
之后,在我的 bot 的 config.py
文件中设置端口和 Microsoft 应用程序 ID 和密码(通过单击“管理”按钮生成)。
import os
""" Bot Configuration """
class DefaultConfig:
""" Bot Configuration """
PORT = 3978
APP_ID = os.environ.get("MicrosoftAppId", "sadsadsadasd")
APP_PASSWORD = os.environ.get("MicrosoftAppPassword", "asdasdasdasdasd")
在此之后,我执行命令 ngrok http 3978
并将生成的端点放入 Azure 机器人配置中。要将机器人注册为应用程序,我使用 Teams 中的 App Studio。在我这样做之后,我只需要 运行 CMD 中的机器人所以我 运行 像 python run.py
这样的命令
在我 运行 机器人之后,我可以将它添加到我在代码中创建的频道和 运行 命令和函数中。
这只是我如何设置机器人的一个例子。主要机器人在 Linux 服务器上。
这就是为什么我想让机器人保留会话信息并在服务器或机器人重新启动后加载它。有时在我重新启动机器人或服务器后,它不再在聊天或团队中。将来我想制作某种命令并使用 cron 作业或类似的东西执行它们。
如果机器人从聊天中消失,那么我将无法在该聊天中使用机器人命令。例如,我在聊天中添加了两个机器人。在我重新启动其中一个后,我无法从它那里得到任何响应,如下图所示。
使用@我看不到机器人。
我有个主意。在聊天中添加机器人后,我在控制台中得到了这个:
Adding new conversation to the list: {'additional_properties': {}, 'activity_id': '123215513', 'user': <botbuilder.schema._models_py3.ChannelAccount object at 0x0000027C0ED60>, 'bot': <botbuilder.schema._models_py3.ChannelAccount object at 0x0000027Cs2FD0>, 'conversation': <botbuilder.schema._models_py3.ConversationAccount object at 0x0000027C0400>, 'channel_id': 'msteams', 'locale': 'en-US', 'service_url': 'https://smba.trafficmanager.net/emea/'}
格式化:
{
"additional_properties": {},
"activity_id": "123215513",
"user": <botbuilder.schema._models_py3.ChannelAccount object at 0x0000027C0ED60>,
"bot": <botbuilder.schema._models_py3.ChannelAccount object at 0x0000027Cs2FD0>,
"conversation": <botbuilder.schema._models_py3.ConversationAccount object at 0x0000027C0400>,
"channel_id": "msteams",
"locale": "en-US",
"service_url": "https://smba.trafficmanager.net/emea/"
}
因此,如果我存储此信息然后在启动机器人时加载它,也许它会起作用?
机器人内部有一个选项可以保存对话的抄本,但这有点无关。基本上,要知道的重要一点是您 不需要 存储您身边的任何东西 - 从用户的角度来看,整个对话历史记录都保存在 Teams 客户端中,从用户的角度来看对于您的 bot,存储整个对话历史并不能真正为您带来任何好处 - 用户 state 比 conversation history 更相关。这将在您选择的持久性中存储一个对象(例如数据库、nosql 存储、azure blob 等等),但它是您选择为用户存储的状态(基本上任何对您的应用程序有意义的属性存储在一种“用户”集合)。这绝对是一个可能且经常需要的概念,这个 link 将对您有用:https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-state?view=azure-bot-service-4.0
重要的是要知道,这是一个 独立的 想法,与按定义的时间表(例如 Cron)向用户发送消息不同。要使 this 正常工作,您需要阅读一个名为“主动消息传递”的概念。我在 Teams PnP 库中有一个专门处理它的示例(代码仅在 Node 和 Dotnet 中 - 恐怕没有 python,但希望它对你有用)。请参阅 here。请注意,在这个 link 的底部还有一个关于该主题的进一步阅读列表。
以上两个想法结合在一起的地方是您需要存储关于用户的某些 状态 才能 发送 主动稍后留言。在我 link 的示例中,我展示了如何获取发送主动消息所需的设置,但我没有包括将它们保存到数据存储的概念 - 这取决于你自己在你的内部实现机器人(例如 SQL Azure、MongoDb、blob 等等)。
同样重要的是要注意(我认为部分混淆,实际上也是我编写示例的部分原因)- 您的主动代码不需要与您的机器人位于同一组代码中!您的机器人可以是某处的 Web 服务 运行,而您的主动代码是 Azure Function/Lambda/similar。
正如 Hilton 所说,尝试将机器人状态保存到本地磁盘是个坏主意。而且,也没有这个必要。希尔顿和我都已链接到文档,这些文档应该可以帮助您了解如何保存机器人状态。
我无法重现您在机器人从 Teams 聊天中删除时遇到的问题。无论如何,根据 Teams 的工作方式和机器人的工作方式,这个问题听起来是不可能的。团队应该无法知道您的机器人是启动还是停止。您的服务器可能设置为根据机器人启动和停止的时间从 Teams 对话中手动卸载机器人,但这仍然很奇怪。我愿意继续与你一起解决这个问题,但我想我现在 post 一个答案,以防你想在赏金到期前将赏金奖励给某人。
我有一个关于 Microsoft Teams Python 机器人的问题。如果 bot 已添加到一些个人聊天和群聊中并且我重新启动了 bot,有时需要再次将 bot 添加到聊天中。所以我想制作 机器人会话 。
是否可以在 Microsoft Teams 中创建机器人会话?我想将会话信息存储在本地磁盘上,然后让机器人在启动时加载该数据。
我的机器人代码与 this sample 非常相似。
感谢您的帮助。
更新:
就像我说的,我的机器人代码与 this sample 非常相似,但有一点不同。因此,我为此问题创建了一个示例。首先,我在 Azure 中创建了一个机器人并进行了设置。
之后,在我的 bot 的 config.py
文件中设置端口和 Microsoft 应用程序 ID 和密码(通过单击“管理”按钮生成)。
import os
""" Bot Configuration """
class DefaultConfig:
""" Bot Configuration """
PORT = 3978
APP_ID = os.environ.get("MicrosoftAppId", "sadsadsadasd")
APP_PASSWORD = os.environ.get("MicrosoftAppPassword", "asdasdasdasdasd")
在此之后,我执行命令 ngrok http 3978
并将生成的端点放入 Azure 机器人配置中。要将机器人注册为应用程序,我使用 Teams 中的 App Studio。在我这样做之后,我只需要 运行 CMD 中的机器人所以我 运行 像 python run.py
在我 运行 机器人之后,我可以将它添加到我在代码中创建的频道和 运行 命令和函数中。
这只是我如何设置机器人的一个例子。主要机器人在 Linux 服务器上。
这就是为什么我想让机器人保留会话信息并在服务器或机器人重新启动后加载它。有时在我重新启动机器人或服务器后,它不再在聊天或团队中。将来我想制作某种命令并使用 cron 作业或类似的东西执行它们。
如果机器人从聊天中消失,那么我将无法在该聊天中使用机器人命令。例如,我在聊天中添加了两个机器人。在我重新启动其中一个后,我无法从它那里得到任何响应,如下图所示。
使用@我看不到机器人。
我有个主意。在聊天中添加机器人后,我在控制台中得到了这个:
Adding new conversation to the list: {'additional_properties': {}, 'activity_id': '123215513', 'user': <botbuilder.schema._models_py3.ChannelAccount object at 0x0000027C0ED60>, 'bot': <botbuilder.schema._models_py3.ChannelAccount object at 0x0000027Cs2FD0>, 'conversation': <botbuilder.schema._models_py3.ConversationAccount object at 0x0000027C0400>, 'channel_id': 'msteams', 'locale': 'en-US', 'service_url': 'https://smba.trafficmanager.net/emea/'}
格式化:
{
"additional_properties": {},
"activity_id": "123215513",
"user": <botbuilder.schema._models_py3.ChannelAccount object at 0x0000027C0ED60>,
"bot": <botbuilder.schema._models_py3.ChannelAccount object at 0x0000027Cs2FD0>,
"conversation": <botbuilder.schema._models_py3.ConversationAccount object at 0x0000027C0400>,
"channel_id": "msteams",
"locale": "en-US",
"service_url": "https://smba.trafficmanager.net/emea/"
}
因此,如果我存储此信息然后在启动机器人时加载它,也许它会起作用?
机器人内部有一个选项可以保存对话的抄本,但这有点无关。基本上,要知道的重要一点是您 不需要 存储您身边的任何东西 - 从用户的角度来看,整个对话历史记录都保存在 Teams 客户端中,从用户的角度来看对于您的 bot,存储整个对话历史并不能真正为您带来任何好处 - 用户 state 比 conversation history 更相关。这将在您选择的持久性中存储一个对象(例如数据库、nosql 存储、azure blob 等等),但它是您选择为用户存储的状态(基本上任何对您的应用程序有意义的属性存储在一种“用户”集合)。这绝对是一个可能且经常需要的概念,这个 link 将对您有用:https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-state?view=azure-bot-service-4.0
重要的是要知道,这是一个 独立的 想法,与按定义的时间表(例如 Cron)向用户发送消息不同。要使 this 正常工作,您需要阅读一个名为“主动消息传递”的概念。我在 Teams PnP 库中有一个专门处理它的示例(代码仅在 Node 和 Dotnet 中 - 恐怕没有 python,但希望它对你有用)。请参阅 here。请注意,在这个 link 的底部还有一个关于该主题的进一步阅读列表。
以上两个想法结合在一起的地方是您需要存储关于用户的某些 状态 才能 发送 主动稍后留言。在我 link 的示例中,我展示了如何获取发送主动消息所需的设置,但我没有包括将它们保存到数据存储的概念 - 这取决于你自己在你的内部实现机器人(例如 SQL Azure、MongoDb、blob 等等)。
同样重要的是要注意(我认为部分混淆,实际上也是我编写示例的部分原因)- 您的主动代码不需要与您的机器人位于同一组代码中!您的机器人可以是某处的 Web 服务 运行,而您的主动代码是 Azure Function/Lambda/similar。
正如 Hilton 所说,尝试将机器人状态保存到本地磁盘是个坏主意。而且,也没有这个必要。希尔顿和我都已链接到文档,这些文档应该可以帮助您了解如何保存机器人状态。
我无法重现您在机器人从 Teams 聊天中删除时遇到的问题。无论如何,根据 Teams 的工作方式和机器人的工作方式,这个问题听起来是不可能的。团队应该无法知道您的机器人是启动还是停止。您的服务器可能设置为根据机器人启动和停止的时间从 Teams 对话中手动卸载机器人,但这仍然很奇怪。我愿意继续与你一起解决这个问题,但我想我现在 post 一个答案,以防你想在赏金到期前将赏金奖励给某人。