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

如何捕获自适应卡片提交数据并在瀑布流对话框第二步生成响应?

解决Waterfall Dialog中捕获Adaptive Card提交数据且不显示为用户消息的问题

我明白你的需求:点击Adaptive Card的提交按钮后,不想让卡片的data以用户消息的形式出现在对话里,同时要捕获这个数据并在瀑布流的第二步使用它。咱们来一步步解决这个问题:

问题根源

你当前用stepContext.prompt()来等待用户选择,而Adaptive Card的Action.Submit默认会把data作为用户文本消息提交到对话中,这就是为什么你会看到它显示成用户消息的原因。要避免这个,我们需要替换prompt的等待逻辑,直接拦截卡片的提交事件。

解决方案步骤

1. 修改瀑布流第一步:移除prompt,等待用户交互

把Step1里的prompt去掉,发送卡片后返回Dialog.EndOfTurn,让对话停在当前步骤,等待用户的卡片操作:

async Step1(stepContext) {
    await stepContext.context.sendActivity({
        attachments: [
            this.createAdaptiveCard1(),
            this.createAdaptiveCard2(),
            this.createAdaptiveCard3()
        ],
        attachmentLayout: AttachmentLayoutTypes.Carousel
    });
    // 不使用prompt,返回EndOfTurn等待用户的卡片提交动作
    return Dialog.EndOfTurn;
}

2. 拦截卡片提交消息,阻止其显示为用户消息

在你的Dialog类中重写OnContinueDialogAsync方法,用来捕获卡片提交的value(也就是你的DATA),并且不让这条消息进入对话历史:

async OnContinueDialogAsync(innerDc, cancellationToken) {
    const activity = innerDc.context.activity;
    // 判断是否是Adaptive Card提交的消息
    if (activity.type === ActivityTypes.Message && activity.value) {
        // 直接推进瀑布流到下一步,把卡片data作为结果传递
        return await innerDc.next(activity.value);
    }
    // 其他情况走默认逻辑
    return await base.OnContinueDialogAsync(innerDc, cancellationToken);
}

3. 在第二步中使用捕获到的数据

现在Step2可以直接通过stepContext.result拿到卡片提交的DATA,然后执行你需要的sendActivity操作:

async Step2(stepContext) {
    // 获取卡片提交的数据
    const selectedData = stepContext.result;
    // 这里执行你的业务逻辑,比如发送自定义消息
    await stepContext.context.sendActivity(`基于你选择的数据,执行相关操作:${selectedData}`);
    // 结束对话框或者继续后续步骤
    return await stepContext.endDialog();
}

额外提示

如果你的卡片data是复杂对象(比如{"key": "value", "id": 123}),这个方案同样适用,stepContext.result会完整接收这个对象,你可以直接解构使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:08:12