대화를 사용하여 스킬 사용Use a dialog to consume a skill

적용 대상: SDK v4APPLIES TO: SDK v4

이 문서에서는 스킬 컨슈머 내에서 ‘스킬 대화’를 사용하는 방법을 보여 줍니다.This article demonstrates how to use a skill dialog within a skill consumer. 스킬 대화는 부모 봇에서 스킬 봇으로의 활동을 게시하고 사용자에게 스킬 응답을 반환합니다.The skill dialog posts activities from the parent bot to the skill bot and returns the skill responses to the user. 이 소비자가 액세스하는 스킬 봇은 메시지 및 이벤트 활동을 모두 처리할 수 있습니다.The skill bot accessed by this consumer can handle both message and event activities. 스킬 매니페스트 샘플 및 스킬 구현에 대한 내용은 스킬 내에서 대화를 사용하는 방법을 참조하세요.For a sample skill manifest and information about implementing the skill, see how to use dialogs within a skill.

대화 외부의 스킬 봇 사용에 대한 정보는 스킬 컨슈머 구현 방법을 참조하세요.For information about using a skill bot outside of dialogs, see how to implement a skill consumer.

사전 요구 사항Prerequisites

참고

버전 4.11부터 에뮬레이터에서 기술 소비자를 로컬로 테스트 하기 위해 앱 ID와 암호가 필요 하지 않습니다.Starting with version 4.11, you do not need an app ID and password to test a skill consumer locally in the Emulator. Azure에 소비자를 배포 하거나 배포 된 기술을 사용 하려면 Azure 구독이 필요 합니다.An Azure subscription is still required to deploy your consumer to Azure or to consume a deployed skill.

이 샘플 정보About this sample

skills skillDialog 샘플에는 두 개의 봇에 대한 프로젝트가 포함되어 있습니다.The skills skillDialog sample includes projects for two bots:

  • 대화 상자 루트 봇기술 대화 상자 클래스를 사용하여 기술을 사용합니다.The dialog root bot, which uses a skill dialog class to consume a skill.
  • 대화 스킬 봇은 대화를 사용하여 스킬 컨슈머로부터 들어오는 활동을 처리합니다.The dialog skill bot, which uses a dialog to handle activities coming from skill consumers.

이 문서에서는 루트 봇에서 ‘스킬 대화’ 클래스를 사용하여 스킬을 관리하고, 메시지 및 이벤트 활동을 보내고, 스킬을 취소하는 방법을 중점적으로 설명합니다.This article focuses on how to use a skill dialog class in a root bot to manage the skill, to send message and event activities and to cancel the skill.

스킬 컨슈머 만들기의 다른 측면에 대한 자세한 내용은 스킬 컨슈머 구현 방법을 참조하세요.For information about other aspects of creating a skill consumer, see how to implement a skill consumer.

대화 스킬 봇에 대한 자세한 내용은 스킬 내에서 대화를 사용하는 방법을 참조하세요.For information about the dialog skill bot, see how to use dialogs within a skill.

리소스Resources

배포 된 bot의 경우 bot 인증을 사용 하려면 각 참여 봇에 유효한 앱 ID와 암호가 있어야 합니다.For deployed bots, bot-to-bot authentication requires that each participating bot has a valid app ID and password. 그러나 앱 ID 및 암호 없이 에뮬레이터를 사용 하 여 기술과 기술 소비자를 로컬로 테스트할 수 있습니다.However, you can test skills and skill consumers locally with the Emulator without an app ID and password.

애플리케이션 구성Application configuration

  1. 필요에 따라 구성 파일에 루트 bot의 앱 ID와 암호를 추가 합니다.Optionally, add the root bot's app ID and password to the config file.
  2. 기술이 기술 소비자에 게 회신할 기술 호스트 끝점 (서비스 또는 콜백 URL)을 추가 합니다.Add the skill host endpoint (the service or callback URL) to which the skills should reply to the skill consumer.
  3. 기술 소비자에서 사용할 각 기술에 대한 항목을 추가합니다.Add an entry for each skill the skill consumer will use. 포함되는 각 항목은 다음과 같습니다.Each entry includes:
    • 기술 소비자에서 각 기술을 식별하는 데 사용하는 IDAn ID the skill consumer will use to identify each skill.
    • 필요에 따라 기술 앱 ID입니다.Optionally, the skill's app ID.
    • 기술의 메시징 엔드포인트The skill's messaging endpoint.

참고

기술 또는 기술 소비자가 앱 ID 및 암호를 사용 하는 경우 둘 다 여야 합니다.If either the skill or skill consumer uses an app ID and password, both must.

DialogRootBot\appsettings.jsonDialogRootBot\appsettings.json

필요에 따라 루트 봇의 앱 ID와 암호를 추가 하 고, 에코 기술 봇의 앱 ID를 배열에 추가 합니다 BotFrameworkSkills .Optionally, add the root bot's app ID and password and add the app ID for the echo skill bot to the BotFrameworkSkills array.

{
  "MicrosoftAppId": "TODO: Add here the App ID for the bot",
  "MicrosoftAppPassword": "TODO: Add here the password for the bot",

  "SkillHostEndpoint": "http://localhost:3978/api/skills/",
  "BotFrameworkSkills": [
    {
      "Id": "DialogSkillBot",
      "AppId": "TODO: Add here the App ID for the skill",
      "SkillEndpoint": "http://localhost:39783/api/messages"
    }
  ]
}

대화 논리Dialog logic

봇의 주 대화에는 이 봇에서 사용하는 각 스킬에 대한 ‘스킬 대화’가 포함되어 있습니다.The bot's main dialog includes a skill dialog for each skill this bot consumes. 스킬 대화는 ‘스킬 클라이언트’ 및 ‘스킬 대화 ID 팩터리’ 개체와 같은 다양한 스킬 관련 개체를 통해 스킬을 관리합니다. The skill dialog manages the skill through the various skill-related objects for you, such as the skill client and the skill conversation ID factory objects. 주 대화에서는 사용자 입력에 따라 스킬 대화를 통해 스킬을 취소하는 방법도 보여 줍니다.The main dialog also demonstrates how to cancel the skill (through the skill dialog) based on user input.

이 봇에서 사용하는 스킬은 몇 가지 다른 기능을 지원합니다.The skill this bot uses supports a couple different features. 도시에 대한 비행을 예약하거나 날씨를 받을 수 있습니다.It can book a flight or get the weather for a city. 또한 이러한 컨텍스트 외부에서 메시지를 수신하고 LUIS 인식기가 구성된 경우 사용자의 의도를 해석하려고 시도합니다.In addition, if it receives a message outside either of these contexts and a LUIS recognizer is configured, it attempts to interpret the user's intent.

스킬 매니페스트(C#, JavaScript, Python)는 스킬에서 수행할 수 있는 작업, 해당 입/출력 매개 변수 및 해당 스킬의 엔드포인트를 설명합니다.The skill manifest (C#, JavaScript, Python) describes the actions the skill can perform, its input and output parameters, and the skill's endpoints. 참고로, 이 스킬은 “BookFlight” 또는 “GetWeather” 이벤트를 처리할 수 있습니다.Of note, the skill can handle a "BookFlight" or "GetWeather" event. 메시지를 처리할 수도 있습니다.It can also handle messages.

주 대화에는 다음 코드가 포함됩니다.The main dialog includes code to:

주 대화는 ‘구성 요소 대화’ 클래스에서 상속됩니다.The main dialog inherits from the component dialog class. 구성 요소 대화에 대한 자세한 내용은 대화 복잡성 관리 방법을 참조하세요.For more about component dialogs, see how to manage dialog complexity.

주 대화 초기화Initialize the main dialog

주 대화에는 대화(스킬 외부에서 대화 흐름 관리용) 및 스킬 대화(스킬 관리용)가 포함됩니다.The main dialog includes dialogs (for managing conversation flow outside the skill) and a skill dialogs (for managing the skills). 폭포에는 다음 몇 섹션에서 자세히 설명된 다음 단계가 포함됩니다.The waterfall includes the following steps, described in more detail in the next few sections.

  1. 사용자에게 사용할 스킬을 선택하라는 메시지를 표시합니다.Prompt the user to select the skill to use. (루트 봇에는 1개의 스킬이 사용됨)(The root bot consumes 1 skill.)
  2. 사용자에게 해당 스킬에 사용할 작업을 선택하라는 메시지를 표시합니다.Prompt the user to select the action to use for that skill. (스킬 봇은 3개의 작업을 정의함)(The skill bot defines 3 actions.)
  3. 선택한 작업을 기반으로 하는 초기 작업을 사용하여 선택한 스킬을 시작합니다.Start the chosen skill with an initial activity based on the chosen action.
  4. 스킬이 완료되면 결과(있는 경우)를 표시합니다.Once the skill completes, display the results, if any. 그런 다음 폭포를 다시 시작합니다.Then, restart the waterfall.

DialogRootBot\Dialogs\MainDialog.csDialogRootBot\Dialogs\MainDialog.cs

MainDialog 클래스는 ComponentDialog에서 파생됩니다.The MainDialog class derives from ComponentDialog. 대화 상태 외에도 대화에는 루트 봇의 앱 ID가 필요하며 스킬 대화 ID 팩터리, 스킬 HTTP 클라이언트 및 스킬 구성 개체를 참조합니다.In addition to conversation state, the dialog needs the root bot's app ID and references to the skill conversation ID factory, the skill HTTP client, and the skills configuration objects.

대화 생성자는 입력 매개 변수를 확인하고, 스킬 대화를 추가하고, 스킬 외의 대화 흐름을 관리하기 위한 프롬프트 및 폭포형 대화를 추가하고, 활성 스킬(있을 경우)을 추적하기 위한 속성 접근자를 만듭니다.The dialog constructor checks its input parameters, adds skills dialogs, adds prompt and a waterfall dialogs for managing conversation flow outside the skill, and creates a property accessor for tracking the active skill, if any.

생성자는 도우미 메서드인 AddSkillDialogs를 호출하여, 구성 파일에서 SkillsConfiguration 개체로 읽어오듯이 구성 파일에 포함된 각 스킬에 대한 SkillDialog를 만듭니다.The constructor calls AddSkillDialogs, a helper method, to create a SkillDialog for each skill that is included in the configuration file, as read from the configuration file into a SkillsConfiguration object.

// Helper method that creates and adds SkillDialog instances for the configured skills.
private void AddSkillDialogs(ConversationState conversationState, SkillConversationIdFactoryBase conversationIdFactory, SkillHttpClient skillClient, SkillsConfiguration skillsConfig, string botId)
{
    foreach (var skillInfo in _skillsConfig.Skills.Values)
    {
        // Create the dialog options.
        var skillDialogOptions = new SkillDialogOptions
        {
            BotId = botId,
            ConversationIdFactory = conversationIdFactory,
            SkillClient = skillClient,
            SkillHostEndpoint = skillsConfig.SkillHostEndpoint,
            ConversationState = conversationState,
            Skill = skillInfo
        };

        // Add a SkillDialog for the selected skill.
        AddDialog(new SkillDialog(skillDialogOptions, skillInfo.Id));
    }
}

스킬 선택Select a skill

첫 번째 단계에서 주 대화는 사용자에게 호출하려는 스킬을 묻는 메시지를 표시하고 “SkllPrompt” 선택 프롬프트를 사용하여 답변을 가져옵니다.In its first step, the main dialog prompts the user for which skill they'd like to call, and uses the "SkllPrompt" choice prompt to get the answer. (이 봇은 하나의 스킬만 정의함)(This bot defines only one skill.)

DialogRootBot\Dialogs\MainDialog.csDialogRootBot\Dialogs\MainDialog.cs

// Render a prompt to select the skill to call.
private async Task<DialogTurnResult> SelectSkillStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    // Create the PromptOptions from the skill configuration which contain the list of configured skills.
    var messageText = stepContext.Options?.ToString() ?? "What skill would you like to call?";
    var repromptMessageText = "That was not a valid choice, please select a valid skill.";
    var options = new PromptOptions
    {
        Prompt = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput),
        RetryPrompt = MessageFactory.Text(repromptMessageText, repromptMessageText, InputHints.ExpectingInput),
        Choices = _skillsConfig.Skills.Select(skill => new Choice(skill.Value.Id)).ToList()
    };

    // Prompt the user to select a skill.
    return await stepContext.PromptAsync("SkillPrompt", options, cancellationToken);
}

스킬 작업 선택Select a skill action

다음 단계에서 주 대화는 다음과 같습니다.In the next step, the main dialog:

  1. 사용자가 선택한 스킬에 대한 정보를 저장합니다.Saves information about the skill the user selected.
  2. 사용자에게 사용할 스킬 작업을 묻는 메시지를 표시하고 “SkillActionPrompt” 선택 프롬프트를 사용하여 답변을 가져옵니다.Prompts the user for which skill action they'd like to use, and uses the "SkillActionPrompt" choice prompt to get the answer.
    • 도우미 메서드를 사용하여 선택할 동작 목록을 가져옵니다.It uses a helper method to get a list of actions to choose from.
    • 사용자의 입력이 선택 항목 중 하나와 일치하지 않는 경우 이 프롬프트와 연결된 프롬프트 유효성 검사기에서 기본적으로 스킬에 메시지를 보냅니다.The prompt validator associated with this prompt will default to sending the skill a message if the user's input doesn't match one of the choices.

이 봇에 포함된 선택 항목은 이 스킬에 대해 정의된 작업을 테스트하도록 지원합니다.The choices included in this bot help test the actions defined for this skill. 더 일반적으로는 스킬의 매니페스트에서 옵션을 읽고 해당 목록을 기반으로 하는 사용자에게 옵션을 제시합니다.More typically, you would read the options from the skill's manifest, and present options to the user based on that list.

DialogRootBot\Dialogs\MainDialog.csDialogRootBot\Dialogs\MainDialog.cs

// Render a prompt to select the action for the skill.
private async Task<DialogTurnResult> SelectSkillActionStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    // Get the skill info based on the selected skill.
    var selectedSkillId = ((FoundChoice)stepContext.Result).Value;
    var selectedSkill = _skillsConfig.Skills.FirstOrDefault(s => s.Value.Id == selectedSkillId).Value;

    // Remember the skill selected by the user.
    stepContext.Values[_selectedSkillKey] = selectedSkill;

    // Create the PromptOptions with the actions supported by the selected skill.
    var messageText = $"Select an action # to send to **{selectedSkill.Id}** or just type in a message and it will be forwarded to the skill";
    var options = new PromptOptions
    {
        Prompt = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput),
        Choices = GetSkillActions(selectedSkill)
    };

    // Prompt the user to select a skill action.
    return await stepContext.PromptAsync("SkillActionPrompt", options, cancellationToken);
}
// Helper method to create Choice elements for the actions supported by the skill.
private IList<Choice> GetSkillActions(BotFrameworkSkill skill)
{
    // Note: the bot would probably render this by reading the skill manifest.
    // We are just using hardcoded skill actions here for simplicity.

    var choices = new List<Choice>();
    switch (skill.Id)
    {
        case "DialogSkillBot":
            choices.Add(new Choice(SkillActionBookFlight));
            choices.Add(new Choice(SkillActionBookFlightWithInputParameters));
            choices.Add(new Choice(SkillActionGetWeather));
            break;
    }

    return choices;
}
// This validator defaults to Message if the user doesn't select an existing option.
private Task<bool> SkillActionPromptValidator(PromptValidatorContext<FoundChoice> promptContext, CancellationToken cancellationToken)
{
    if (!promptContext.Recognized.Succeeded)
    {
        // Assume the user wants to send a message if an item in the list is not selected.
        promptContext.Recognized.Value = new FoundChoice { Value = SkillActionMessage };
    }

    return Task.FromResult(true);
}

스킬 시작Start a skill

다음 단계에서 주 대화는 다음과 같습니다.In the next step, the main dialog:

  1. 사용자가 선택한 스킬 및 스킬 활동에 대한 정보를 검색합니다.Retrieves information about the skill and skill activity the user selected.
  2. 도우미 메서드를 사용하여 초기에 스킬로 보내는 작업을 만듭니다.Uses a helper method to create the activity to initially send to the skill.
  3. 무엇으로 스킬 대화를 시작할지가 포함된 대화 옵션을 만듭니다.Creates the dialog options with which to start the skill dialog. 여기에는 전송할 초기 작업이 포함됩니다.This includes the initial activity to send.
  4. 스킬을 호출하기 전에 상태를 저장합니다.Saves state before calling the skill. (스킬 응답 스킬 컨슈머의 다른 인스턴스에서 올 수 있으므로 이 작업이 필요함)(This is necessary, as the skill response might come to a different instance of the skill consumer.)
  5. 스킬 대화를 시작하고 호출할 스킬 ID 및 이를 무엇으로 호출할지의 옵션을 전달합니다.Begins the skill dialog, passing in the skill ID to call and the options with which to call it.

DialogRootBot\Dialogs\MainDialog.csDialogRootBot\Dialogs\MainDialog.cs

// Starts the SkillDialog based on the user's selections.
private async Task<DialogTurnResult> CallSkillActionStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    var selectedSkill = (BotFrameworkSkill)stepContext.Values[_selectedSkillKey];

    Activity skillActivity;
    switch (selectedSkill.Id)
    {
        case "DialogSkillBot":
            skillActivity = CreateDialogSkillBotActivity(((FoundChoice)stepContext.Result).Value, stepContext.Context);
            break;

        // We can add other case statements here if we support more than one skill.
        default:
            throw new Exception($"Unknown target skill id: {selectedSkill.Id}.");
    }

    // Create the BeginSkillDialogOptions and assign the activity to send.
    var skillDialogArgs = new BeginSkillDialogOptions { Activity = skillActivity };

    // Save active skill in state.
    await _activeSkillProperty.SetAsync(stepContext.Context, selectedSkill, cancellationToken);

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

스킬 결과 요약Summarize the skill result

마지막 단계에서 주 대화는 다음과 같습니다.In the last step, the main dialog:

  1. 스킬에서 값을 반환하는 경우 결과를 사용자에게 표시합니다.If the skill returned a value, display the result to the user.
  2. 대화 상태에서 활성 스킬을 지웁니다.Clears the active skill from dialog state.
  3. 대화 상태에서 활성 스킬 속성을 제거합니다.Removes the active skill property from conversation state.
  4. 자동으로 다시 시작합니다(주 대화).Restarts itself (the main dialog).

DialogRootBot\Dialogs\MainDialog.csDialogRootBot\Dialogs\MainDialog.cs

// The SkillDialog has ended, render the results (if any) and restart MainDialog.
private async Task<DialogTurnResult> FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    var activeSkill = await _activeSkillProperty.GetAsync(stepContext.Context, () => null, cancellationToken);

    // Check if the skill returned any results and display them.
    if (stepContext.Result != null)
    {
        var message = $"Skill \"{activeSkill.Id}\" invocation complete.";
        message += $" Result: {JsonConvert.SerializeObject(stepContext.Result)}";
        await stepContext.Context.SendActivityAsync(MessageFactory.Text(message, message, inputHint: InputHints.IgnoringInput), cancellationToken: cancellationToken);
    }

    // Clear the skill selected by the user.
    stepContext.Values[_selectedSkillKey] = null;

    // Clear active skill in state.
    await _activeSkillProperty.DeleteAsync(stepContext.Context, cancellationToken);

    // Restart the main dialog with a different message the second time around.
    return await stepContext.ReplaceDialogAsync(InitialDialogId, $"Done with \"{activeSkill.Id}\". \n\n What skill would you like to call?", cancellationToken);
}

사용자가 스킬을 취소할 수 있도록 허용Allow the user to cancel the skill

주 대화는 ‘계속 대화 메서드’의 기본 동작을 재정의하여 사용자가 현재 스킬(있는 경우)을 취소할 수 있습니다.The main dialog overrides the default behavior of the on continue dialog method to allow the user to cancel the current skill, if any. 메서드:The method:

  • 활성 스킬이 있고 사용자가 “중단” 메시지를 전송하는 경우 모든 대화를 취소하고 주 대화를 큐에 대기시켜서 처음부터 다시 시작합니다.If there is an active skill and the user sends an "abort" message, cancel all dialogs and queue the main dialog to restart from the beginning.
  • 그런 다음 ‘계속 대화’ 메서드의 기본 구현을 호출하여 현재 턴을 계속 처리합니다.Then, call the base implementation of the on continue dialog method to continue processing the current turn.

DialogRootBot\Dialogs\MainDialog.csDialogRootBot\Dialogs\MainDialog.cs

protected override async Task<DialogTurnResult> OnContinueDialogAsync(DialogContext innerDc, CancellationToken cancellationToken = default)
{
    // This is an example on how to cancel a SkillDialog that is currently in progress from the parent bot.
    var activeSkill = await _activeSkillProperty.GetAsync(innerDc.Context, () => null, cancellationToken);
    var activity = innerDc.Context.Activity;
    if (activeSkill != null && activity.Type == ActivityTypes.Message && activity.Text.Equals("abort", StringComparison.CurrentCultureIgnoreCase))
    {
        // Cancel all dialogs when the user says abort.
        // The SkillDialog automatically sends an EndOfConversation message to the skill to let the
        // skill know that it needs to end its current dialogs, too.
        await innerDc.CancelAllDialogsAsync(cancellationToken);
        return await innerDc.ReplaceDialogAsync(InitialDialogId, "Canceled! \n\n What skill would you like to call?", cancellationToken);
    }

    return await base.OnContinueDialogAsync(innerDc, cancellationToken);
}

활동 처리기 논리Activity handler logic

각 턴의 스킬 논리는 주 대화에 의해 처리되므로 작업 처리기는 다른 대화 샘플의 경우와 매우 유사하게 보입니다.Since skill logic for each turn is handled by a main dialog, the activity handler looks much like it would for other dialog samples.

DialogRootBot\Bots\RootBot.csDialogRootBot\Bots\RootBot.cs

public class RootBot<T> : ActivityHandler
    where T : Dialog
private readonly ConversationState _conversationState;
private readonly Dialog _mainDialog;

public RootBot(ConversationState conversationState, T mainDialog)
{
    _conversationState = conversationState;
    _mainDialog = mainDialog;
}
public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default)
{
    if (turnContext.Activity.Type != ActivityTypes.ConversationUpdate)
    {
        // Run the Dialog with the Activity.
        await _mainDialog.RunAsync(turnContext, _conversationState.CreateProperty<DialogState>("DialogState"), cancellationToken);
    }
    else
    {
        // Let the base class handle the activity.
        await base.OnTurnAsync(turnContext, cancellationToken);
    }

    // Save any state changes that might have occurred during the turn.
    await _conversationState.SaveChangesAsync(turnContext, false, cancellationToken);
}

서비스 등록Service registration

스킬 대화를 사용하는 데 필요한 서비스는 일반적으로 스킬 컨슈머에게 필요한 서비스와 동일합니다.The services needed to use a skill dialog are the same as those needed for a skill consumer in general. 필요한 서비스의 논의에 대한 스킬 컨슈머를 구현하는 방법을 참조하세요.See how to implement a skill consumer for a discussion of the required services.

루트 봇 테스트Test the root bot

Emulator에서 기술 소비자를 표준 봇처럼 테스트할 수 있습니다. 그러나 기술과 기술 소비자를 동시에 실행해야 합니다.You can test the skill consumer in the Emulator as if it were a normal bot; however, you need to run both the skill and skill consumer bots at the same time. 스킬을 구성하는 방법에 대한 자세한 내용은 스킬 내에서 대화 사용 방법을 참조하세요.See how to use dialogs within a skill for information on how to configure the skill.

최신 Bot Framework Emulator를 다운로드하여 설치합니다.Download and install the latest Bot Framework Emulator.

  1. 머신에서 대화 상자 기술 봇과 대화 상자 루트 봇을 로컬로 실행합니다.Run the dialog skill bot and dialog root bot locally on your machine. 지침이 필요한 경우 C#, JavaScript 또는 Python 샘플에 대한 추가 정보 파일을 참조하세요.If you need instructions, refer to the README file for the C#, JavaScript or Python sample.
  2. 에뮬레이터를 사용하여 봇을 테스트합니다.Use the Emulator to test the bot.
    • 처음으로 대화에 참여하는 경우 봇은 환영 메시지를 표시하고 호출하려는 기술이 무엇인지 묻습니다.When you first join the conversation, the bot displays a welcome message and asks you what skill you would like to call. 이 샘플의 기술 봇은 하나의 기술만 가지고 있습니다.The skill bot for this sample has just one skill.
    • DialogSkillBot 을 선택합니다.Select DialogSkillBot.
  3. 그 다음에 봇은 기술에 대한 작업을 선택하도록 요청합니다.The bot next asks you to choose an action for the skill. “BookFlight”를 선택합니다.Choose "BookFlight".
    1. 프롬프트에 답변합니다.Answer the prompts.
    2. 스킬이 완료되고, 루트 봇은 호출하려는 스킬이 무엇인지 묻는 메시지를 다시 표시하기 전에 예약 세부 정보를 표시합니다.The skill completes, and the root bot displays the booking details before prompting again for the skill you'd like to call.
  4. DialogSkillBot 을 다시 선택하고 “BookFlight”를 선택합니다.Select DialogSkillBot again and "BookFlight".
    1. 첫 번째 프롬프트에 답변한 다음 “중단”을 입력하여 스킬을 중단합니다.Answer the first prompt, then enter "abort" to interrupt the skill.
    2. 루트 봇은 스킬을 취소하고 호출하려는 스킬이 무엇인지 묻는 메시지를 표시합니다.The root bot cancels the skill and prompts for the skill you'd like to call.

추가 정보Additional information

일반적으로 스킬 컨슈머를 구현하는 방법에 대해 스킬 컨슈머 구현 방법을 참조하세요.See how to implement a skill consumer for how to implement a skill consumer in general.