Botframework-solutions: Разрешить передачу данных от навыка обратно в VA

Созданный на 30 сент. 2019  ·  25Комментарии  ·  Источник: microsoft/botframework-solutions

История пользователя

Как разработчик, я хотел бы иметь возможность передавать данные от навыка виртуальному помощнику.

Я хотел бы иметь возможность передавать данные обратно из навыка обратно в вызывающий VA, когда навык будет завершен, чтобы (например) продолжить разговор с другим ботом с информацией, сгенерированной первым ботом.

Мой вариант использования следующий:

У меня VA подключен к 2 ботам, первый бот используется для поиска людей, а второй бот используется для организации встреч с этими людьми. Одна из функций бота по поиску людей - дать пользователю возможность организовать встречу с разыскиваемым человеком. Это потребует от бота поиска людей вернуть ссылку на человека, с которым будет создана встреча, обратно в VA. Насколько я могу судить , в настоящее время

Было бы здорово, если бы что-то вроде механизма manifest / SkillContext / slots было доступно из навыка -> VA, а не только для VA -> навык.

Bot Services customer-replied-to customer-reported

Самый полезный комментарий

Привет,

Нам нужен учебник по этому поводу :-) Я добавлю это как часть нашей работы с GA (в конце месяца) и, в идеале, на сайте документации в ближайшие несколько дней. А пока, надеюсь, вам поможет приведенная ниже информация.

В рамках Skills GA мы упростили совместное использование данных и переместили метод передачи из SemanticAction (который было сложно использовать из-за старой схемы) в сторону более простого свойства Value для действия.

Я тоже получу образец кода и обновлю эту проблему.

Чтобы передать данные навыку

Чтобы вызвать Навык, в Навык отправляется Действие типа Event таким образом, вызывая вызов стиля Действие, а не обычное высказывание.

Вот пример помещения данных в действие, которое вы собираетесь отправить.

public class BookingDetails
{
        public string Destination { get; set; }
        public string Origin { get; set; }
        public string TravelDate { get; set; }
}

activity.Value = new BookingDetails { Destination = "New York" };

Получение данных в рамках навыка

Здесь и ниже приведен пример информации о навыке, передаваемой от родителя (например, Virtual Assistant или Power Virtual Agents). В этой ситуации «данные» передаются свойству Value входящего Activity. В этой ситуации «данные» передаются в навык (через действие при событии), а затем десериализуются и переводятся в состояние - то есть, когда диалог выполняется, в нем есть все необходимые данные.

case Events.CreateEvent:
{
    state.IsAction = true;
    EventInfo actionData = null;
    if (ev.Value is JObject info)
    {
        actionData = info.ToObject<EventInfo>();
        // Process data here
    }

    return await stepContext.BeginDialogAsync(_createEventDialog.Id, options);

Передача данных обратно

В диалоговом окне (внутри вашего навыка), когда вы завершаете обработку и хотите вернуть информацию, вы можете сделать это с помощью перегрузки EndDialogAsync. Затем эти данные упорядочиваются обратно вызывающему абоненту как часть сообщения EndOfConversation, которое отправляет инфраструктура Skill.

    return await sc.EndDialogAsync(new TodoListInfo { ActionSuccess = true, ToDoList = todoList });

Получение данных на стороне вызывающего абонента

На стороне вызывающей стороны, чтобы лучше поддерживать этот сценарий, нам пришлось превратить MainDialog в Waterfall, а не в ComponentDialog. Компонентные диалоги не позволяли «получить» результат диалога.

Как вы видите здесь, вы можете дотянуться и получить результат от навыка и, соответственно, обработки.

if (stepContext.Result != null)
{
  var message = $"Skill \"{activeSkill.Id}\" invocation complete.";
  message += $" Result: {JsonConvert.SerializeObject(stepContext.Result)}";
}

Все 25 Комментарий

Привет,

Мы работали над поддержкой «вызова действия» для навыков и в рамках этого формализации того, как данные могут быть возвращены обратно вызывающему боту. У Activity есть свойство SemanticAction, которое позволяет реализовать этот сценарий.

У нас есть концепция, чтобы доказать это в PR. Вот пример установки этого свойства SemanticAction, которое затем можно вытащить на стороне клиента.

Дайте мне знать, если это поможет, мы будем рады помочь вам в дальнейшем и помочь вам двигаться дальше по этому сценарию, для чего мы добавим дополнительную документацию / поддержку в следующем выпуске, согласованном с конференцией Ignite.

Привет, Даррен

Спасибо вам за быстрый ответ. Да, ответ SemanticAction был бы отличным решением для моего варианта использования. Однако извлечение семантического действия со стороны клиента (VA) потребует некоторых изменений и в базе кода, насколько я могу судить, верно? Потому что в настоящее время, даже если вы вызываете sc.EndDialogAsync(semanticAction) на стороне навыка, результат этого вызова переводится skillTransport на стороне VA в просто логическое значение true , указывающее, что навык выполнен и ничего больше.

Справедливый вопрос - в вашем сценарии есть ли у вас желание «вызвать» навык напрямую, как удаленный вызов метода, или вместо этого передать высказывание, позволить навыку сделать это, но также иметь возможность возвращать данные обратно вместе с любым действием это (в настоящее время) пересылается пользователю, и вы не можете его перехватить.

Подход с вызовом действия, для которого у нас есть шаблон, почти готов к использованию, а другой кажется чем-то, что мы исследуем, как вы предлагаете, если это сценарий, на который вы смотрите.

Есть мысли @marawanshalaby ?

Привет, Даррен

Извините за запоздалый ответ, последнее время похоронен работой :). Итак, в моем случае я бы сказал, что второй вариант был бы более привлекательным, потому что он более слабосвязанный, идеальный сценарий для меня был бы следующим:

  • Пользователь отправляет высказывание, диспетчер ВА отправляет его на Навык А.
  • Навык A обрабатывает действия пользователя до тех пор, пока намерение «Создать встречу» не будет определено навыком A.
  • Как только намерение «Создать встречу» идентифицировано навыком A, он завершает диалог и отправляет свое локальное состояние (имя и идентификатор человека), возможно, посредством семантического действия, обратно в VA вместе с высказыванием.
  • VA разрешает высказывание до навыка B, затем передает семантическое действие первоначально от навыка A к навыку B, используя его слоты.

Таким образом, навык A ничего не знает о навыке B, и единственная связь между ними происходит через высказывание, обрабатываемое диспетчером, вместо жесткого кодирования вызова удаленного метода в VA / навыке A, поэтому его также легко распространить на другие навыки. Как вы думаете, в этом есть смысл?

Да, полностью, и SemanticAction как у нас сегодня, позволит это сделать. Фактически, в этом примере показано использование трех навыков для агрегирования данных в одну ежедневную сводную карточку. Он не показывает передаваемые данные обратно, чтобы затем передать данные другому навыку, но мы продемонстрировали, что в нескольких сценариях, в первую очередь, опыт извлечения ваших задач, сортировки типов, а затем предложения перенаправить вас через магазин в решить (например, продуктовый магазин, аптека).

SemanticAction предоставляет механизм для выполнения этого обмена, в ближайшие несколько недель мы добавим дополнительную документацию, чтобы более подробно описать этот шаблон.

Привет, Даррен

Выглядит отлично, два вопроса с моей стороны:

  • у вас есть приблизительная дата, когда функция SemanticAction будет выпущена?
  • будет ли добавлена ​​поддержка машинописного текста одновременно с поддержкой C #?

Привет, Даррен,

мы просто просматриваем образец для вызова навыков для агрегирования данных, но не видели, чтобы данные передавались от навыка к VA, я знаю, что вы упомянули об этом в своем комментарии. но не могли бы вы сообщить нам, есть ли какой-либо механизм для передачи данных от навыка к vA. Спасибо вам

@darrenj не могли бы вы предоставить обновленную информацию по вышеуказанному вопросу?

Привет

Вот пример установки семантического действия в навыке, который возвращает информацию обратно вызывающему боту.

мы пробовали это в навыке, но как нам снова получить данные в виртуальном помощнике. не удалось получить ни одного образца. признателен, если вы можете поделиться инструментом кода vA

@darrenj , пожалуйста, дайте нам знать и код VA

@darrenj , сейчас я пытаюсь реализовать это, я вижу, что это было исправлено на стороне VA в версии C # https://github.com/microsoft/botframework-solutions/blob/4619333ec086ca7c42a697022c9e01dfcafab824/lib/csharp/microsoft. bot.builder.skills / Microsoft.Bot.Builder.Skills / SkillDialog.cs # L326, поэтому https://github.com/microsoft/botframework- решения / blob / 4619333ec086ca7c42a697022c9e01dfcafab824 / lib / typescript / botbuilder-skills / src / skillDialog.ts # L244 . У вас есть оценка, когда это тоже будет добавлено в машинописный текст?

Это блокирует нас, потому что в текущем потоке, который мы реализуем, нам нужно убедиться, что диалог успешно завершился на стороне навыков (например, не отмена), чтобы вызвать диалог обратной связи на стороне VA. Есть предложения, как реализовать этот сценарий, пока мы ждем поддержки TS?

@darrenj какие-либо обновления о том, когда это будет исправлено в машинописном тексте https://github.com/microsoft/botframework-solutions/blob/master/sdk/typescript/libraries/botbuilder-skills/src/skillDialog.ts#L382 ? Связано ли это с этой проблемой: https://github.com/microsoft/botframework-solutions/issues/2489 ?

Привет, @darrenj

Не могли бы вы рассказать, как снова обрабатывать данные в VA? Вы поделились образцом в CalendarSummaryDialog, но это всего лишь часть навыков. Как справиться с этим в VA после отправки навыка в EndDialogAsync?

Спасибо за это

Проблема была закрыта, поэтому мы не получали уведомлений, повторное открытие. Извините за задержку, могу я просто уточнить сценарий здесь?

  • VA и SKill написаны на Javascript / Typescript, а не на C #?
  • Вы хотите вернуть «данные» родительскому VA из дочернего навыка в рамках шаблона «Завершить диалог»?

Спасибо за это.

У меня все еще вопрос, как отправить контекст навыков обратно в VA (как на C #). Я хотел сделать что-то похожее на то, о чем раньше говорил

Как лучше всего это сделать? Глядя на то, что здесь обсуждалось, я все еще не знаю, как обрабатывать семантическое действие на стороне VA.

Привет,

Нам нужен учебник по этому поводу :-) Я добавлю это как часть нашей работы с GA (в конце месяца) и, в идеале, на сайте документации в ближайшие несколько дней. А пока, надеюсь, вам поможет приведенная ниже информация.

В рамках Skills GA мы упростили совместное использование данных и переместили метод передачи из SemanticAction (который было сложно использовать из-за старой схемы) в сторону более простого свойства Value для действия.

Я тоже получу образец кода и обновлю эту проблему.

Чтобы передать данные навыку

Чтобы вызвать Навык, в Навык отправляется Действие типа Event таким образом, вызывая вызов стиля Действие, а не обычное высказывание.

Вот пример помещения данных в действие, которое вы собираетесь отправить.

public class BookingDetails
{
        public string Destination { get; set; }
        public string Origin { get; set; }
        public string TravelDate { get; set; }
}

activity.Value = new BookingDetails { Destination = "New York" };

Получение данных в рамках навыка

Здесь и ниже приведен пример информации о навыке, передаваемой от родителя (например, Virtual Assistant или Power Virtual Agents). В этой ситуации «данные» передаются свойству Value входящего Activity. В этой ситуации «данные» передаются в навык (через действие при событии), а затем десериализуются и переводятся в состояние - то есть, когда диалог выполняется, в нем есть все необходимые данные.

case Events.CreateEvent:
{
    state.IsAction = true;
    EventInfo actionData = null;
    if (ev.Value is JObject info)
    {
        actionData = info.ToObject<EventInfo>();
        // Process data here
    }

    return await stepContext.BeginDialogAsync(_createEventDialog.Id, options);

Передача данных обратно

В диалоговом окне (внутри вашего навыка), когда вы завершаете обработку и хотите вернуть информацию, вы можете сделать это с помощью перегрузки EndDialogAsync. Затем эти данные упорядочиваются обратно вызывающему абоненту как часть сообщения EndOfConversation, которое отправляет инфраструктура Skill.

    return await sc.EndDialogAsync(new TodoListInfo { ActionSuccess = true, ToDoList = todoList });

Получение данных на стороне вызывающего абонента

На стороне вызывающей стороны, чтобы лучше поддерживать этот сценарий, нам пришлось превратить MainDialog в Waterfall, а не в ComponentDialog. Компонентные диалоги не позволяли «получить» результат диалога.

Как вы видите здесь, вы можете дотянуться и получить результат от навыка и, соответственно, обработки.

if (stepContext.Result != null)
{
  var message = $"Skill \"{activeSkill.Id}\" invocation complete.";
  message += $" Result: {JsonConvert.SerializeObject(stepContext.Result)}";
}

Я проверил подход - чтобы моя команда проверила его, прежде чем приступить к работе над документами, но я довольно легко добился этого, используя в качестве примера Навык погоды .

Предполагается, что у вас есть зарегистрированный навык под названием WeatherSkill - он будет работать с любым другим навыком, но необходимо убедиться, что он настроен.

  var skillSteps = new WaterfallStep[]
            {
                PreSkillStepAsync,
                PostSkillStepAsync,
            };

  AddDialog(new WaterfallDialog("WeatherActionInvoke", skillSteps));

Начать вызов действия

 return await innerDc.BeginDialogAsync("WeatherActionInvoke");

Вызов действия навыка

stepContext.Result в PostSkillStepAsync будет иметь возвращаемое значение из Skill

        private async Task<DialogTurnResult> PreSkillStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            var evt = stepContext.Context.Activity.AsEventActivity();
            if (evt != null)
            {
                LocationInfo location = new LocationInfo();
                location.Location = "51.4644018,-2.1177246,14";

                var activity = (Activity)Activity.CreateEventActivity();
                activity.Name = "WeatherForcast";
                activity.Value = location;

                // Create the BeginSkillDialogOptions
                var skillDialogArgs = new BeginSkillDialogOptions { Activity = activity };

                // Start the skillDialog instance with the arguments. 
                return await stepContext.BeginDialogAsync("WeatherSkill", skillDialogArgs, cancellationToken);
            }

            return await stepContext.NextAsync();
        }

        private async Task<DialogTurnResult> PostSkillStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            return await stepContext.NextAsync();
        }

Что касается вопроса

Однако существуют сценарии передачи навыков, которые, вероятно, выиграют от наличия дополнительных элементов управления. Value - это очень общий контейнер, который разработчики VA могут использовать для реализации любого сценария, который они считают подходящим, но не навязывают какое-либо конкретное поведение. В сценарии, в котором разработчики подключают свои реализации VA к навыкам как первой стороны (разработанные собственными силами), так и навыкам сторонней стороны (навыки сообщества), часто невозможно гарантировать, что Value будет универсальным механизмом для передачи навыков.

Под передачей навыков я подразумеваю, когда навык разработан таким образом, что его диалог (ы) заканчивается таким образом, что было бы естественно продолжить разговор с другим навыком. Возьмем, к примеру, сценарий бронирования поездки и после бронирования предложить передать его специалисту, который также бронирует автомобили напрокат или местные туры для этого конкретного пункта назначения. Я даже мог бы предположить, что передача навыков - не единственное возможное, что умение может захотеть сообщить в качестве результата. Передача помощника (Google / Alexa / ...) может быть другим.

Один из возможных способов справиться с этим - для навыка, передающего работу, опубликовать целевое намерение и его известные сущности / слоты как часть события EndOfConversation ( SemanticAction , хотя и странно назван, будет способ выразить это, если семантические действия известны заранее). Учитывая несвязный характер навыков, это означает, что навык, передающий намерение, должен быть обновлен, если целевой навык изменил свою логику обработки намерения / сущности / слота, но это более чистая архитектура. Что вы думаете? Был бы способ лучше?

@darrenj - не могли бы вы предоставить образец для этого, который должен иметь VA и Skill

@darrenj - не могли бы вы сообщить нам, когда будут обновлены документы.
ценю вашу помощь.

@darrenj не могли бы вы предоставить обновленную информацию о документах / образце обновления

Связал PR с проблемой с описанием шагов, необходимых для обмена данными с Skills.

@darrenj Возможна ли это передача данных от навыка родительскому

Я использую приведенный ниже фрагмент для вызова навыка от корневого бота
var response = await _skillClient.PostActivityAsync (_botId, targetSkill, _skillsConfig.SkillHostEndpoint, turnContext.Activity, cancellationToken);

Я использую приведенный ниже фрагмент, чтобы завершить беседу в скилботе.

var endOfConversation = Activity.CreateEndOfConversationActivity ();endOfConversation.Code = EndOfConversationCodes.CompletedSuccessfully;

Была ли эта страница полезной?
0 / 5 - 0 рейтинги