Botframework-solutions: Bot.Builder.Community.Adapters.Alexa VA рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 19 рд╕рд┐рддре░ 2019  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: microsoft/botframework-solutions

рдХреМрди рд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реИ?

рдЖрднрд╛рд╕реА рд╕рд╣рд╛рдпрдХред

рдпрд╣ рдХрд┐рд╕ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реИ?

рд╕реА#

рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?

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) рдПрд▓реЗрдХреНрд╕рд╛ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдпрд╛ рдЧрдпрд╛:

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) рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд 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?"
                            }
                        }
                    ]
                }
            ]
        }
    }
}

рдЖрдк рдХреНрдпрд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реЗ рдереЗ?

рдПрд▓реЗрдХреНрд╕рд╛ рдХреЗ рдбреЗрд╡рд▓рдкрд░ рдХрдВрд╕реЛрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ рдПрд▓реЗрдХреНрд╕рд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрд▓реЗрдХреНрд╕рд╛ рдХреМрд╢рд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп, рдЗрд╕рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ OnEventSync() рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдХрд╛рд░ рд╕рдВрджреЗрд╢ рдХрд╛ рд╣реЛред

рдХреНрдпрд╛ рдЖрдк рдХреЛрдИ рд▓реЙрдЧ, рддреНрд░реБрдЯрд┐ рдЖрдЙрдЯрдкреБрдЯ рдЗрддреНрдпрд╛рджрд┐ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

System.NullReferenceException MainDialog.cs рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдлреЗрдВрдХрд╛ рдЧрдпрд╛:

image

рдХреЛрдИ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн?

image

рд╡реАрдП рд╕реЗ рдПрд▓реЗрдХреНрд╕рд╛ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ (Startup.cs рд╕рдВрджрд░реНрдн рд╕реЗ рдЙрддреНрдкрдиреНрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ред SendActi vitAsync:- рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рдВрджрд░реНрднред

{
    "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": {}
    }
}

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@samaea рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд┐рдпрд╛ рд╣реИред @ рд▓реЙрд░реЗрди-рдорд┐рд▓реНрд╕ рд╕рд╣реА рдереЗ, рдпрд╣ рд░рд╛рдЙрдЯрд░рдбрд┐рдЕрд▓реЙрдЧ рдХреЗ рдХрд╛рд░рдг рдЧрддрд┐рд╡рд┐рдзрд┐ рдкрд░ рдПрдХ рдореВрд▓реНрдп рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрджреЗрд╢ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдШрдЯрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реИред

рдЖрдк рдирд┐рдореНрди рдУрд╡рд░рд░рд╛рдЗрдб рдХреЛ рдЕрдкрдиреЗ MainDialog рдореЗрдВ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХрдорд╛рддреНрд░ рдмрджрд▓рд╛рд╡ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЪреИрдирд▓ рдЖрдИрдбреА рдПрд▓реЗрдХреНрд╕рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рдПрд▓реЗрдХреНрд╕рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реАрдП рд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИред

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;
        }

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рд╢рд╛рдпрдж рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░рд╛рдЙрдЯрд░рдбрд┐рдЕрд▓реЙрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк MainDialog рдореЗрдВ ContinueDialogAsync рд╡рд┐рдзрд┐ рдХреЛ рдЕрдкрдиреЗ рдЗрдЪреНрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реИред

@samaea рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд┐рдпрд╛ рд╣реИред @ рд▓реЙрд░реЗрди-рдорд┐рд▓реНрд╕ рд╕рд╣реА рдереЗ, рдпрд╣ рд░рд╛рдЙрдЯрд░рдбрд┐рдЕрд▓реЙрдЧ рдХреЗ рдХрд╛рд░рдг рдЧрддрд┐рд╡рд┐рдзрд┐ рдкрд░ рдПрдХ рдореВрд▓реНрдп рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрджреЗрд╢ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдШрдЯрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реИред

рдЖрдк рдирд┐рдореНрди рдУрд╡рд░рд░рд╛рдЗрдб рдХреЛ рдЕрдкрдиреЗ MainDialog рдореЗрдВ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХрдорд╛рддреНрд░ рдмрджрд▓рд╛рд╡ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЪреИрдирд▓ рдЖрдИрдбреА рдПрд▓реЗрдХреНрд╕рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рдПрд▓реЗрдХреНрд╕рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реАрдП рд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИред

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;
        }

рдзрдиреНрдпрд╡рд╛рдж @garypretty! рдПрд╕рдбреАрдХреЗ рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдЙрдЯрд░рдбрд┐рдЕрд▓реЙрдЧ рдХреЛ рджреЛрдмрд╛рд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреБрд▓рд╛ рдХрд╛рд░реНрдп рдЖрдЗрдЯрдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдлреАрдбрдмреИрдХ рдХреЛ рдЙрд╕ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рднреА рд▓реЗ рд╕рдХрддрд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jbonet07 picture jbonet07  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ericmaino picture ericmaino  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

BillStrait picture BillStrait  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lauren-mills picture lauren-mills  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

manish-95 picture manish-95  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ