You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Waterfall对话框中访问TurnContext里的aad_object_id值

解决Waterfall对话框中访问TurnContext里aad_object_id的问题

有两种常用方法可以实现将TurnContext中的aad_object_id传入Waterfall对话框:

方法一:通过用户/对话状态传递值

这种方式适合需要在多轮对话中持久化该值的场景。

1. 在DialogBot中获取并存储值

修改bots/dialog_bot.py,从TurnContext提取aad_object_id后存入用户状态:

# bots/dialog_bot.py
from botbuilder.core import ActivityHandler, TurnContext, UserState, ConversationState
from botbuilder.dialogs import Dialog, DialogSet, DialogTurnStatus

class DialogBot(ActivityHandler):
    def __init__(self, conversation_state: ConversationState, user_state: UserState, dialog: Dialog):
        self.conversation_state = conversation_state
        self.user_state = user_state
        self.dialog = dialog
        self.dialog_state_accessor = self.conversation_state.create_property("DialogState")

    async def on_message_activity(self, turn_context: TurnContext):
        # 从TurnContext获取aad_object_id
        aad_object_id = turn_context.activity.from_property.aad_object_id
        
        # 将值存入用户状态
        user_profile = await self.user_state.create_property("UserProfile").get(turn_context, {})
        user_profile["aad_object_id"] = aad_object_id
        await self.user_state.save_changes(turn_context)

        # 处理对话框逻辑
        dialog_set = DialogSet(self.dialog_state_accessor)
        dialog_set.add(self.dialog)
        dialog_context = await dialog_set.create_context(turn_context)
        results = await dialog_context.continue_dialog()
        
        if results.status == DialogTurnStatus.Empty:
            await dialog_context.begin_dialog(self.dialog.id)

        await self.conversation_state.save_changes(turn_context)

2. 在Waterfall对话框中读取值

修改dialog/Waterfall_dialog.py,从用户状态中取出存储的aad_object_id:

# dialog/Waterfall_dialog.py
from botbuilder.dialogs import WaterfallDialog, WaterfallStepContext, DialogTurnResult
from botbuilder.core import UserState, MessageFactory

class MyWaterfallDialog(WaterfallDialog):
    def __init__(self, dialog_id: str = None, user_state: UserState = None):
        super().__init__(dialog_id or MyWaterfallDialog.__name__)
        self.user_state = user_state
        self.add_step(self._retrieve_aad_id_step)

    async def _retrieve_aad_id_step(self, step_context: WaterfallStepContext) -> DialogTurnResult:
        # 从用户状态获取aad_object_id
        user_profile = await self.user_state.create_property("UserProfile").get(step_context.context, {})
        aad_object_id = user_profile.get("aad_object_id")
        
        # 使用获取到的ID进行后续逻辑
        await step_context.context.send_activity(f"获取到你的AAD Object ID:{aad_object_id}")
        return await step_context.end_dialog()

方法二:通过DialogOptions直接传递值

如果只需要在当前对话框会话中使用该值,可直接通过启动对话框时的options参数传递:

1. 在DialogBot中传递参数

修改bots/dialog_bot.py的on_message_activity方法:

async def on_message_activity(self, turn_context: TurnContext):
        aad_object_id = turn_context.activity.from_property.aad_object_id
        
        dialog_set = DialogSet(self.dialog_state_accessor)
        dialog_set.add(self.dialog)
        dialog_context = await dialog_set.create_context(turn_context)
        results = await dialog_context.continue_dialog()
        
        if results.status == DialogTurnStatus.Empty:
            # 将aad_object_id作为options参数传入对话框
            await dialog_context.begin_dialog(self.dialog.id, options={"aad_object_id": aad_object_id})

        await self.conversation_state.save_changes(turn_context)

2. 在Waterfall对话框中读取参数

修改dialog/Waterfall_dialog.py的步骤方法:

async def _retrieve_aad_id_step(self, step_context: WaterfallStepContext) -> DialogTurnResult:
        # 从options中直接获取传递的aad_object_id
        aad_object_id = step_context.options.get("aad_object_id")
        
        await step_context.context.send_activity(f"获取到你的AAD Object ID:{aad_object_id}")
        return await step_context.end_dialog()

内容的提问来源于stack exchange,提问作者user3447228

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:05:46