如何借助ConversationState获取Teams机器人的聊天历史?
获取Teams机器人聊天历史记录实现方案
核心问题定位
你遇到的问题大概率是会话存储键格式错误或未正确处理空历史初始化,以下是基于MemoryStorage的标准实现步骤:
实现步骤与代码示例
1. 初始化MemoryStorage(确保全局唯一)
在bot的启动文件中初始化存储实例,避免重复创建:
const { MemoryStorage } = require('botbuilder'); // 全局存储实例 const memoryStorage = new MemoryStorage();
2. 加载并更新聊天历史
在处理用户消息的逻辑中,按以下流程操作:
async function handleUserMessage(context) { // 1. 获取唯一会话ID(Teams会话的核心标识) const conversationId = context.activity.conversation.id; const storageKey = `conversation-${conversationId}`; // 固定格式的存储键 try { // 2. 读取会话存储中的历史记录(MemoryStorage的read方法接受键数组) const storedData = await memoryStorage.read([storageKey]); // 3. 初始化历史:如果无数据则设为空数组 let chatHistory = storedData[storageKey]?.history || []; // 4. 加入当前用户提问 chatHistory.push({ role: 'user', content: context.activity.text.trim() }); // 5. 将历史传入LLM提示生成器,获取回复 const llmReply = await generateLLMPrompt(chatHistory); // 你的LLM调用逻辑 // 6. 加入机器人回复到历史 chatHistory.push({ role: 'assistant', content: llmReply }); // 7. 保存更新后的历史回存储 await memoryStorage.write({ [storageKey]: { history: chatHistory } }); // 8. 发送回复给用户 await context.sendActivity(llmReply); } catch (err) { console.error('聊天历史处理失败:', err); await context.sendActivity('抱歉,当前无法处理你的请求'); } }
关键注意事项
- 存储键格式:必须用
conversation-${conversationId}作为键名,这是Bot Framework会话存储的约定格式,确保每个会话的历史独立存储。 - read方法的正确使用:
memoryStorage.read()接收键的数组,返回的是包含键值对的对象,需通过指定键名提取对应数据,不能直接使用返回结果。 - 空历史处理:首次会话时存储中无数据,必须判断并初始化为空数组,否则会因
undefined导致后续操作报错。 - MemoryStorage的局限性:该存储是内存级的,重启bot后历史会丢失,生产环境建议替换为BlobStorage或CosmosDB。
内容的提问来源于stack exchange,提问作者Satashree Roy
相关产品推荐
相关产品推荐

