如何在机器人之间共享上下文?
How to share a context between bots?
我正在使用 Microsoft 机器人框架来实现一个简单的机器人到机器人通信场景。就我而言,我有一个 master-bot 和一个 skill-bot。我已经完成了他们的整合,以便大师点可以将对话传递给技能,技能可以继续。
我需要在机器人之间共享一些状态。所以,我创建了一个状态 属性 访问器:
public static readonly string UserContextPropertyName = $"{typeof(RootBot<T>).FullName}.UserContextProperty";
private readonly IStatePropertyAccessor<PatientResponce> _userContext;
并在OnTurnAsync
方法中使用它
await _userContext.SetAsync(turnContext, patientResponce);
很好,除了这个新的 属性 在技能的 OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
turnContext 中不可用
为什么不 persist/pass-through?
P.S。在通过调用将对话传递给技能之前,我确实保存了状态:
await _conversationState.SaveChangesAsync(turnContext, force: true, cancellationToken: cancellationToken);
P.S.S我也用
var userState = new UserState(new BlobsStorage("..."))
services.AddSingleton(userState);
在Startup.cs
中作为存储模型
好的,有一个解决方法,但对我来说没问题 - 也许有人觉得它有用:有一个 属性
turnContext.Activity.Value
好像是为附件设计的;它没有定义的类型 - 它只是一个对象。
所以我所做的只是将我的上下文作为序列化的 json 字符串存储在那里,并在另一端捕获它。我认为这是一个次优的解决方案——所以如果你这样做的话要小心装箱-取消开销
我正在使用 Microsoft 机器人框架来实现一个简单的机器人到机器人通信场景。就我而言,我有一个 master-bot 和一个 skill-bot。我已经完成了他们的整合,以便大师点可以将对话传递给技能,技能可以继续。 我需要在机器人之间共享一些状态。所以,我创建了一个状态 属性 访问器:
public static readonly string UserContextPropertyName = $"{typeof(RootBot<T>).FullName}.UserContextProperty";
private readonly IStatePropertyAccessor<PatientResponce> _userContext;
并在OnTurnAsync
方法中使用它
await _userContext.SetAsync(turnContext, patientResponce);
很好,除了这个新的 属性 在技能的 OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
turnContext 中不可用
为什么不 persist/pass-through?
P.S。在通过调用将对话传递给技能之前,我确实保存了状态:
await _conversationState.SaveChangesAsync(turnContext, force: true, cancellationToken: cancellationToken);
P.S.S我也用
var userState = new UserState(new BlobsStorage("..."))
services.AddSingleton(userState);
在Startup.cs
中作为存储模型
好的,有一个解决方法,但对我来说没问题 - 也许有人觉得它有用:有一个 属性
turnContext.Activity.Value
好像是为附件设计的;它没有定义的类型 - 它只是一个对象。
所以我所做的只是将我的上下文作为序列化的 json 字符串存储在那里,并在另一端捕获它。我认为这是一个次优的解决方案——所以如果你这样做的话要小心装箱-取消开销