如何基于BotBuilder反向通道数据初始化对话并全程复用信息?
利用BotBuilder反向通道初始化并复用对话数据
嘿,我来帮你搞定这个问题!要实现通过反向通道的conversationStarted事件初始化对话,并且全程复用这些数据,核心思路就是把反向通道传来的数据存入Bot的状态管理系统,之后在整个对话流程里随时调取就行。下面分步骤给你拆解:
1. 接收反向通道事件并存储初始化数据
首先得在Bot的适配器里监听反向通道发来的conversationStarted事件,拿到数据后把它存到合适的状态容器里——如果数据是属于当前对话的,用ConversationState;如果是用户级别的长期数据,就用UserState。
举个Node.js的代码示例:
// 假设已经配置好了storage和adapter const { ConversationState, MemoryStorage } = require('botbuilder'); const storage = new MemoryStorage(); // 开发环境用,生产换Azure Blob等持久化存储 const conversationState = new ConversationState(storage); // 监听反向通道事件 adapter.onTurn(async (context) => { // 判断是否是目标事件 if (context.activity.type === 'event' && context.activity.name === 'conversationStarted') { // 取出反向通道传来的初始化数据 const initData = context.activity.value; // 把数据存入对话状态的自定义属性里 const conversationData = await conversationState.createProperty('conversationInitData').get(context, {}); conversationData.initParams = initData; await conversationState.saveChanges(context); // 启动预设的对话框 await context.beginDialog('mainDialog'); } });
2. 在对话全程复用初始化数据
不管是主对话框还是后续的子对话框,只要从状态容器里取出之前存储的数据,就能在任意对话步骤里复用。
比如在Waterfall对话框里的用法:
const { ComponentDialog, WaterfallDialog, TextPrompt } = require('botbuilder-dialogs'); class MainDialog extends ComponentDialog { constructor(id) { super(id); this.addDialog(new TextPrompt('textPrompt')); this.addDialog(new WaterfallDialog('mainFlow', [ this.greetWithInitData.bind(this), this.processUserInput.bind(this) ])); this.initialDialogId = 'mainFlow'; } async greetWithInitData(stepContext) { // 从对话状态里取出初始化数据 const conversationData = await stepContext.context.conversationState.createProperty('conversationInitData').get(stepContext.context, {}); const initParams = conversationData.initParams; // 用初始化数据生成个性化欢迎语 await stepContext.context.sendActivity(`嗨!根据你的初始化设置,我们会帮你处理${initParams.taskType}相关的需求~`); // 进入下一步对话 return await stepContext.prompt('textPrompt', '现在可以告诉我具体需求啦:'); } async processUserInput(stepContext) { // 这里依然能随时调取初始化数据 const conversationData = await stepContext.context.conversationState.createProperty('conversationInitData').get(stepContext.context, {}); const initParams = conversationData.initParams; // 结合初始化数据和用户输入处理逻辑 await stepContext.context.sendActivity(`收到你的需求:${stepContext.result},我会按照${initParams.processRule}的规则来处理哦!`); return await stepContext.endDialog(); } }
3. 关键注意点
- 状态存储的选择:开发环境用
MemoryStorage足够,但生产环境必须用持久化存储(比如Azure Blob Storage、Cosmos DB),不然重启Bot后数据会丢失。 - 事件名称一致性:前端发送的事件名称要和Bot监听的完全一致(这里是
conversationStarted),不然会错过事件。 - 数据范围控制:如果数据是跨对话的用户专属信息,记得用
UserState而不是ConversationState,避免不同对话间数据混淆。
内容的提问来源于stack exchange,提问作者Ben Swinburne
相关产品推荐
相关产品推荐

