gpt4 book ai didi

c# - 从主动消息开始对话

转载 作者:行者123 更新时间:2023-12-02 03:15:03 24 4
gpt4 key购买 nike

我是 Bot 框架的新手,所以如果这是基本的,我很抱歉,但我正在尝试向用户发送主动消息以开始对话。我正在使用以下示例:

https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/16.proactive-messages

这工作得很好,但我想做的是从此时开始一个对话框,而不是仅仅向用户发回一些文本。这可能吗?这是示例中的代码

[Route("api/notify")]
[ApiController]
public class NotifyController : ControllerBase
{
private readonly IBotFrameworkHttpAdapter _adapter;
private readonly string _appId;
private readonly ConcurrentDictionary<string, ConversationReference> _conversationReferences;

private readonly BotState _userState;
private readonly BotState _conversationState;

public NotifyController(IBotFrameworkHttpAdapter adapter,
ICredentialProvider credentials,
ConcurrentDictionary<string, ConversationReference> conversationReferences,
ConversationState conversationState,
UserState userState
)
{
_adapter = adapter;
_conversationReferences = conversationReferences;
_appId = ((SimpleCredentialProvider)credentials).AppId;

// If the channel is the Emulator, and authentication is not in use,
// the AppId will be null. We generate a random AppId for this case only.
// This is not required for production, since the AppId will have a value.
if (string.IsNullOrEmpty(_appId))
{
_appId = Guid.NewGuid().ToString(); //if no AppId, use a random Guid
}


_conversationState = conversationState;
_userState = userState;
}

[HttpGet("{number}")]
public async Task<IActionResult> Get(string number)
{
foreach (var conversationReference in _conversationReferences.Values)
{
await ((BotAdapter)_adapter).ContinueConversationAsync(_appId, conversationReference, BotCallback, default(CancellationToken));
}

// Let the caller know proactive messages have been sent
return new ContentResult()
{
Content = "<html><body><h1>Proactive messages have been sent.</h1></body></html>",
ContentType = "text/html",
StatusCode = (int)HttpStatusCode.OK,
};
}

private async Task BotCallback(ITurnContext turnContext, CancellationToken cancellationToken)
{
//This works from the sample:
await turnContext.SendActivityAsync("Starting proactive message bot call back");

//However I would like to do something like this (pseudo code):
//var MyDialog = new ConfirmAppointmentDialog();
//await turnContext.StartDialog(MyDialog);
}
}

最佳答案

我最终弄清楚了这一点 - 这就是我所做的:

在我的 NotifyController 中,我像这样开始对话

  [HttpGet("{number}")]
public async Task<IActionResult> Get(string number)
{

//For Twillio Channel
MicrosoftAppCredentials.TrustServiceUrl("https://sms.botframework.com/");

var NewConversation = new ConversationReference
{
User = new ChannelAccount { Id = $"+1{number}" },
Bot = new ChannelAccount { Id = "+1YOURPHONENUMBERHERE" },
Conversation = new ConversationAccount { Id = $"+1{number}" },
ChannelId = "sms",
ServiceUrl = "https://sms.botframework.com/"
};

try
{
BotAdapter ba = (BotAdapter)_HttpAdapter;
await ((BotAdapter)_HttpAdapter).ContinueConversationAsync(_AppId, NewConversation, BotCallback, default(CancellationToken));
}
catch (Exception ex)
{
this._Logger.LogError(ex.Message);
}


// Let the caller know proactive messages have been sent
return new ContentResult()
{
Content = "<html><body><h1>Proactive messages have been sent.</h1></body></html>",
ContentType = "text/html",
StatusCode = (int)HttpStatusCode.OK,
};
}

然后在 BotCallback 中启动对话框:

private async Task BotCallback(ITurnContext turnContext, CancellationToken cancellationToken)
{
try
{
var conversationStateAccessors = _ConversationState.CreateProperty<DialogState>(nameof(DialogState));

var dialogSet = new DialogSet(conversationStateAccessors);
dialogSet.Add(this._Dialog);

var dialogContext = await dialogSet.CreateContextAsync(turnContext, cancellationToken);
var results = await dialogContext.ContinueDialogAsync(cancellationToken);
if (results.Status == DialogTurnStatus.Empty)
{
await dialogContext.BeginDialogAsync(_Dialog.Id, null, cancellationToken);
await _ConversationState.SaveChangesAsync(dialogContext.Context, false, cancellationToken);
}
else
await turnContext.SendActivityAsync("Starting proactive message bot call back");
}
catch (Exception ex)
{
this._Logger.LogError(ex.Message);
}
}

关于c# - 从主动消息开始对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56371053/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com