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

使用context.Forward转发后,如何在CheckListDialog中获取result.Entities?

问题:使用context.Forward转发对话框时,如何获取传入的LUIS实体参数?

我有一个主LUIS对话框,需要通过context.Forward转发至CheckListDialog,并传入luisresult.entity,代码如下:

context.Forward(new CheckListDialog(), this.DialogResumeAfter, result.Entities, CancellationToken.None);

问题:在CheckListDialog中,如何获取传入的result.Entities?

补充说明:另有一个可行方案是使用context.Call,代码如下:

context.Call(new CheckListDialog(result.Entities), this.DialogResumeAfter);

该方案可正常运行,但我想了解使用context.Forward时获取该参数的方法。


回答

你提到的context.Forward和context.Call核心区别在于:Call是直接通过构造函数给子对话框传参,而Forward是基于消息转发的机制传递数据。要在CheckListDialog中拿到通过Forward传入的实体,需要调整参数传递方式,具体步骤如下:

1. 修正context.Forward的调用逻辑

context.Forward的第三个参数要求是IMessageActivity类型的消息对象,不能直接传实体。你需要把result.Entities附加到消息的Value属性中再转发:

// 创建一个空消息实例,将LUIS实体存入Value属性
var forwardMsg = context.MakeMessage();
forwardMsg.Value = result.Entities;

// 执行转发操作
await context.Forward(new CheckListDialog(), this.DialogResumeAfter, forwardMsg, CancellationToken.None);

2. 在CheckListDialog中读取实体

在CheckListDialog的StartAsync方法里,你可以通过context.Activity.Value获取传入的实体,记得做对应的类型转换:

public class CheckListDialog : IDialog<object>
{
    public async Task StartAsync(IDialogContext context)
    {
        // 替换成你的LUIS实体实际类型
        var receivedEntities = context.Activity.Value as YourLuisEntityType;
        
        if (receivedEntities != null)
        {
            // 这里就可以使用传入的实体数据了
            await context.PostAsync($"成功获取到LUIS实体:{JsonConvert.SerializeObject(receivedEntities)}");
        }
        
        // 继续对话流程
        context.Wait(MessageReceivedAsync);
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        // 后续对话逻辑处理
        var inputMsg = await result;
        await context.PostAsync("CheckListDialog已收到你的消息");
        context.Done(true);
    }
}

为什么最初的直接传参不行?

你最初的代码直接把result.Entities作为第三个参数传入Forward,这不符合方法的签名要求(第三个参数必须是IMessageActivity类型),所以无法正确传递数据。通过将实体存入消息的Value属性,我们利用了Forward转发消息的特性,让子对话框能从对话上下文的活动数据中拿到目标参数。

如果你的Bot Framework版本是v4,核心思路类似:通过消息的Value或对话状态存储数据,再在子对话框中读取对应内容即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:15:43