مساعد افتراضي.
سي #
BotBuilder.Community.Adapters.Alexa لا يبدو أنها تعمل مع VA.
اتبع التعليمات هنا: - https://github.com/BotBuilderCommunity/botbuilder-community-dotnet/tree/develop/libraries/Bot.Builder.Community.Adapters.Alexa
1) في Startup.cs أضفت حزم NuGet التالية:
Bot.Builder.Community.Adapters.Alexa ؛
Bot.Builder.Community.Adapters.Alexa.Integration.AspNet.Core؛
Bot.Builder.Community.Adapters.Alexa.Middleware؛
قبل هذا الرمز
// Configure bot
services.AddTransient<IBot, DialogBot<MainDialog>>();
أضفت:
// Registering the AlexaHttpAdapter
services.AddSingleton<IAlexaHttpAdapter>((sp) =>
{
var alexaHttpAdapter = new AlexaHttpAdapter(validateRequests: true)
{
OnTurnError = async (context, exception) =>
{
await context.SendActivityAsync("Sorry, something went wrong. Please try again later." + context + " Exception:" + exception);
},
ShouldEndSessionByDefault = true,
ConvertBotBuilderCardsToAlexaCards = false,
};
alexaHttpAdapter.Use(new AlexaIntentRequestToMessageActivityMiddleware());
return alexaHttpAdapter;
});
services.AddSingleton<AlexaIntentRequestToMessageActivityMiddleware>();
2) إنشاء وحدة تحكم Alexa:
using Bot.Builder.Community.Adapters.Alexa.Integration.AspNet.Core;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Bot.Builder;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace GuideDogs_VA.Controllers
{
[Route("api/skillrequests")]
[ApiController]
public class AlexaBotController : ControllerBase
{
private readonly IAlexaHttpAdapter _adapter;
private readonly IBot _bot;
public AlexaBotController(IAlexaHttpAdapter adapter, IBot bot)
{
_adapter = adapter;
_bot = bot;
}
[HttpPost]
public async Task PostAsync()
{
await _adapter.ProcessAsync(Request, Response, _bot);
}
}
}
3) إنشاء Alexa Skill باستخدام JSON التالي:
{
"interactionModel": {
"languageModel": {
"invocationName": "guide dogs",
"intents": [
{
"name": "GetUserIntent",
"slots": [
{
"name": "phrase",
"type": "phrase"
}
],
"samples": [
"{phrase}"
]
},
{
"name": "AMAZON.FallbackIntent",
"samples": []
},
{
"name": "AMAZON.NavigateHomeIntent",
"samples": []
},
{
"name": "AMAZON.CancelIntent",
"samples": []
},
{
"name": "AMAZON.HelpIntent",
"samples": []
},
{
"name": "AMAZON.StopIntent",
"samples": []
}
],
"types": [
{
"name": "phrase",
"values": [
{
"name": {
"value": "hi there Alexa"
}
},
{
"name": {
"value": "you are just going to repeat what I said aren't you"
}
},
{
"name": {
"value": "what colour is the sky?"
}
}
]
}
]
}
}
}
عند اختبار Alexa Skill من خلال وحدة تحكم مطور Alexa أو عبر جهاز Alexa ، حتى تستجيب ، ولكن للأسف ينتهي الأمر بالاتصال بـ OnEventSync () على الرغم من أن نوع النشاط من نوع الرسالة.
System.NullReferenceException تم طرحه من ملف MainDialog.cs:
استجابة من VA إلى Alexa (استجابة تم إنشاؤها من سياق Startup.cs.SendActi vityAsync: - في انتظار السياق.
{
"body": {
"version": "1.0",
"response": {
"outputSpeech": {
"type": "PlainText",
"text": "Sorry, something went wrong. Please try again later.Microsoft.Bot.Builder.TurnContext Exception:System.NullReferenceException: Object reference not set to an instance of an object.\r\n at GuideDogs_VA.Dialogs.MainDialog.OnEventAsync(DialogContext dc, CancellationToken cancellationToken) in C:\\Users\\hussel\\source\\repos\\GuideDogs-VA\\GuideDogs_VA\\Dialogs\\MainDialog.cs:line 204\r\n at Microsoft.Bot.Builder.Solutions.Dialogs.RouterDialog.OnContinueDialogAsync(DialogContext innerDc, CancellationToken cancellationToken)\r\n at Microsoft.Bot.Builder.Dialogs.ComponentDialog.BeginDialogAsync(DialogContext outerDc, Object options, CancellationToken cancellationToken)\r\n at Microsoft.Bot.Builder.Dialogs.DialogContext.BeginDialogAsync(String dialogId, Object options, CancellationToken cancellationToken)\r\n at Microsoft.Bot.Builder.Dialogs.DialogExtensions.RunAsync(Dialog dialog, ITurnContext turnContext, IStatePropertyAccessor`1 accessor, CancellationToken cancellationToken)\r\n at GuideDogs_VA.Bots.DialogBot`1.OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken) in C:\\Users\\hussel\\source\\repos\\GuideDogs-VA\\GuideDogs_VA\\Bots\\DialogBot.cs:line 39\r\n at Bot.Builder.Community.Adapters.Alexa.Middleware.AlexaIntentRequestToMessageActivityMiddleware.OnTurnAsync(ITurnContext context, NextDelegate next, CancellationToken cancellationToken)\r\n at Microsoft.Bot.Builder.MiddlewareSet.ReceiveActivityWithStatusAsync(ITurnContext turnContext, BotCallbackHandler callback, CancellationToken cancellationToken)\r\n at Microsoft.Bot.Builder.BotAdapter.RunPipelineAsync(ITurnContext turnContext, BotCallbackHandler callback, CancellationToken cancellationToken)"
},
"directives": [],
"shouldEndSession": true,
"type": "_DEFAULT_RESPONSE"
},
"sessionAttributes": {}
}
}
من المحتمل أن يكون هذا بسبب تطبيق RouterDialog الافتراضي. أحد الخيارات التي يجب تجربتها هو تجاوز طريقة ContinueDialogAsync في MainDialog بالسلوك الذي تريده.
samaea لقد
يمكنك إضافة التخطي التالي إلى MainDialog كحل بديل. مع التغيير الوحيد هو أننا نتحقق مما إذا كان معرف القناة هو Alexa.
بعد إضافة هذا التغيير ، يمكنني الحصول بنجاح على رد من VA عبر Alexa. نأمل أن يحل هذا مشكلتك.
protected override async Task<DialogTurnResult> OnContinueDialogAsync(DialogContext innerDc, CancellationToken cancellationToken = default)
{
var activity = innerDc.Context.Activity;
if (activity.IsStartActivity())
{
await OnStartAsync(innerDc);
}
switch (activity.Type)
{
case ActivityTypes.Message:
{
if (activity.Value != null && activity.ChannelId != "alexa")
{
await OnEventAsync(innerDc);
}
else if (!string.IsNullOrEmpty(activity.Text))
{
var result = await innerDc.ContinueDialogAsync();
switch (result.Status)
{
case DialogTurnStatus.Empty:
{
await RouteAsync(innerDc);
break;
}
case DialogTurnStatus.Complete:
{
await CompleteAsync(innerDc);
// End active dialog
await innerDc.EndDialogAsync();
break;
}
default:
{
break;
}
}
}
break;
}
case ActivityTypes.Event:
{
await OnEventAsync(innerDc);
break;
}
default:
{
await OnSystemMessageAsync(innerDc);
break;
}
}
return EndOfTurn;
}
شكرا غاريبريتي! لدي عنصر عمل مفتوح للإصدار التالي لإعادة تشكيل RouterDialog لمحاذاة أكثر مع SDK ، لذلك يمكنني أخذ هذه التعليقات في هذا العمل أيضًا.
التعليق الأكثر فائدة
samaea لقد
يمكنك إضافة التخطي التالي إلى MainDialog كحل بديل. مع التغيير الوحيد هو أننا نتحقق مما إذا كان معرف القناة هو Alexa.
بعد إضافة هذا التغيير ، يمكنني الحصول بنجاح على رد من VA عبر Alexa. نأمل أن يحل هذا مشكلتك.