Implementowanie umiejętności

DOTYCZY: ZESTAW SDK w wersji 4

Możesz użyć umiejętności, aby rozszerzyć innego bota. Umiejętność to bot, który może wykonywać zestaw zadań dla innego bota.

  • Interfejs umiejętności jest opisywany przez manifest. Deweloperzy, którzy nie mają dostępu do kodu źródłowego umiejętności, mogą używać informacji w manifeście, aby zaprojektować swojego konsumenta umiejętności.
  • Umiejętność może używać weryfikacji oświadczeń do zarządzania, które boty lub użytkownicy mogą uzyskać do niego dostęp.

W tym artykule pokazano, jak zaimplementować umiejętność, która odzwierciedla dane wejściowe użytkownika.

Niektóre typy konsumentów umiejętności nie mogą używać niektórych typów botów umiejętności. W poniższej tabeli opisano, które kombinacje są obsługiwane.

  Umiejętność obsługi wielu dzierżaw Umiejętność z jedną dzierżawą Umiejętność tożsamości zarządzanej przypisanej przez użytkownika
Użytkownik z wieloma dzierżawami Obsługiwane Nieobsługiwane Nieobsługiwane
Użytkownik z jedną dzierżawą Nieobsługiwane Obsługiwane, jeśli obie aplikacje należą do tej samej dzierżawy Obsługiwane, jeśli obie aplikacje należą do tej samej dzierżawy
Odbiorca tożsamości zarządzanej przypisanej przez użytkownika Nieobsługiwane Obsługiwane, jeśli obie aplikacje należą do tej samej dzierżawy Obsługiwane, jeśli obie aplikacje należą do tej samej dzierżawy

Uwaga

Zestawy SDK języka JavaScript, C# i Python platformy Bot Framework będą nadal obsługiwane, jednak zestaw SDK języka Java jest wycofywany z ostatecznym długoterminowym wsparciem kończącym się w listopadzie 2023 r.

Istniejące boty utworzone za pomocą zestawu JAVA SDK będą nadal działać.

W przypadku tworzenia nowego bota rozważ użycie agentów usługi Power Virtual Agents i przeczytaj o wyborze odpowiedniego rozwiązania czatbota.

Aby uzyskać więcej informacji, zobacz Przyszłość tworzenia botów.

Wymagania wstępne

Uwaga

Począwszy od wersji 4.11, nie potrzebujesz identyfikatora aplikacji i hasła, aby przetestować umiejętności lokalnie w emulatorze bot framework. Subskrypcja platformy Azure jest nadal wymagana do wdrożenia umiejętności na platformie Azure.

Informacje o tym przykładzie

Przykładowe umiejętności prostego bota do bota obejmują projekty dla dwóch botów:

  • Bot umiejętności echo, który implementuje umiejętności.
  • Prosty bot główny, który implementuje bota głównego, który korzysta z umiejętności.

Ten artykuł koncentruje się na umiejętnościach, które obejmują logikę obsługi w bota i adapterze.

Aby uzyskać informacje na temat prostego bota głównego, zobacz implementowanie konsumenta umiejętności.

Zasoby

W przypadku wdrożonych botów uwierzytelnianie bot-to-bot wymaga, aby każdy uczestniczący bot miał prawidłowe informacje o tożsamości. Można jednak testować umiejętności i umiejętności użytkowników z wieloma dzierżawami lokalnie za pomocą emulatora bez identyfikatora aplikacji i hasła.

Aby udostępnić umiejętności botom dostępnym dla użytkowników, zarejestruj umiejętności na platformie Azure. Aby uzyskać więcej informacji, zobacz jak zarejestrować bota w usłudze Azure AI Bot Service.

Konfiguracja aplikacji

Opcjonalnie dodaj informacje o tożsamości umiejętności do pliku konfiguracji. Jeśli użytkownik umiejętności lub umiejętności dostarcza informacje o tożsamości, oba muszą.

Dozwolona tablica rozmówców może ograniczyć, którzy użytkownicy umiejętności mogą uzyskiwać dostęp do umiejętności. Dodaj element "*", aby akceptować wywołania od dowolnego konsumenta umiejętności.

Uwaga

Jeśli testujesz umiejętności lokalnie bez informacji o tożsamości bota, ani umiejętności, ani użytkownik umiejętności nie uruchamia kodu w celu przeprowadzenia weryfikacji oświadczeń.

EchoSkillBot\appsettings.json

Opcjonalnie dodaj informacje o tożsamości umiejętności do pliku appsettings.json.

{
  "MicrosoftAppType": "",
  "MicrosoftAppId": "",
  "MicrosoftAppPassword": "",
  "MicrosoftAppTenantId": "",

  // This is a comma separate list with the App IDs that will have access to the skill.
  // This setting is used in AllowedCallersClaimsValidator.
  // Examples: 
  //    [ "*" ] allows all callers.
  //    [ "AppId1", "AppId2" ] only allows access to parent bots with "AppId1" and "AppId2".
  "AllowedCallers": [ "*" ]
}

Logika obsługi działań

Aby zaakceptować parametry wejściowe

Użytkownik umiejętności może wysyłać informacje do umiejętności. Jednym ze sposobów akceptowania takich informacji jest akceptowanie ich za pośrednictwem właściwości value w komunikatach przychodzących. Innym sposobem jest obsługa zdarzeń i wywoływanie działań.

Umiejętność w tym przykładzie nie akceptuje parametrów wejściowych.

Aby kontynuować lub ukończyć konwersację

Gdy umiejętności wysyłają działanie, użytkownik umiejętności powinien przekazać działanie użytkownikowi.

Musisz jednak wysłać endOfConversation działanie po zakończeniu umiejętności. W przeciwnym razie użytkownik umiejętności będzie nadal przekazywać działania użytkownika do umiejętności. Opcjonalnie użyj właściwości value działania, aby uwzględnić wartość zwracaną, i użyj właściwości kodu działania, aby wskazać, dlaczego umiejętności kończą się.

EchoSkillBot\Bots\EchoBot.cs

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    if (turnContext.Activity.Text.Contains("end") || turnContext.Activity.Text.Contains("stop"))
    {
        // Send End of conversation at the end.
        var messageText = $"ending conversation from the skill...";
        await turnContext.SendActivityAsync(MessageFactory.Text(messageText, messageText, InputHints.IgnoringInput), cancellationToken);
        var endOfConversation = Activity.CreateEndOfConversationActivity();
        endOfConversation.Code = EndOfConversationCodes.CompletedSuccessfully;
        await turnContext.SendActivityAsync(endOfConversation, cancellationToken);
    }
    else
    {
        var messageText = $"Echo: {turnContext.Activity.Text}";
        await turnContext.SendActivityAsync(MessageFactory.Text(messageText, messageText, InputHints.IgnoringInput), cancellationToken);
        messageText = "Say \"end\" or \"stop\" and I'll end the conversation and back to the parent.";
        await turnContext.SendActivityAsync(MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput), cancellationToken);
    }
}

Aby anulować umiejętności

W przypadku umiejętności obejmujących wiele kolei możesz również zaakceptować endOfConversation działania od konsumenta umiejętności, aby umożliwić konsumentowi anulowanie bieżącej konwersacji.

Logika tej umiejętności nie zmienia się z kolei na kolei. Jeśli zaimplementujesz umiejętności przydzielające zasoby konwersacji, dodaj kod oczyszczania zasobów do procedury obsługi końcowej konwersacji.

EchoSkillBot\Bots\EchoBot.cs

protected override Task OnEndOfConversationActivityAsync(ITurnContext<IEndOfConversationActivity> turnContext, CancellationToken cancellationToken)
{
    // This will be called if the root bot is ending the conversation.  Sending additional messages should be
    // avoided as the conversation may have been deleted.
    // Perform cleanup of resources if needed.
    return Task.CompletedTask;
}

Moduł sprawdzania poprawności oświadczeń

W tym przykładzie użyto listy dozwolonych wywołań na potrzeby weryfikacji oświadczeń. Lista jest zdefiniowana w pliku konfiguracji umiejętności i jest odczytywana do obiektu modułu sprawdzania poprawności podczas jego tworzenia.

Do konfiguracji uwierzytelniania należy dodać moduł sprawdzania poprawności oświadczeń. Oświadczenia są oceniane po nagłówku uwierzytelniania. Kod weryfikacji powinien zgłosić błąd lub wyjątek, aby odrzucić żądanie. Istnieje wiele powodów, dla których możesz odrzucić w inny sposób uwierzytelnione żądanie. Na przykład:

  • Umiejętność jest częścią płatnej usługi. Użytkownik, który nie znajduje się w bazie danych, nie powinien mieć dostępu.
  • Umiejętność jest własnością. Tylko niektórzy konsumenci umiejętności mogą nazwać umiejętności.

Ważne

Jeśli nie podasz modułu sprawdzania poprawności oświadczeń, bot wygeneruje błąd lub wyjątek po otrzymaniu działania od konsumenta umiejętności.

Zestaw SDK udostępnia klasę AllowedCallersClaimsValidator , która dodaje autoryzację na poziomie aplikacji na podstawie prostej listy identyfikatorów aplikacji, które mogą wywoływać umiejętności. Jeśli lista zawiera gwiazdkę (*), wszystkie osoby wywołujące są dozwolone. Moduł sprawdzania poprawności oświadczeń jest skonfigurowany w Startup.cs.

Karta umiejętności

W przypadku wystąpienia błędu adapter umiejętności powinien wyczyścić stan konwersacji dla umiejętności i powinien również wysłać endOfConversation działanie do konsumenta umiejętności. Użyj właściwości kodu działania, aby zasygnalizować, że umiejętności zakończyły się z powodu błędu.

EchoSkillBot\SkillAdapterWithErrorHandler.cs

private async Task HandleTurnError(ITurnContext turnContext, Exception exception)
{
    // Log any leaked exception from the application.
    _logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}");

    await SendErrorMessageAsync(turnContext, exception);
    await SendEoCToParentAsync(turnContext, exception);
}

private async Task SendErrorMessageAsync(ITurnContext turnContext, Exception exception)
{
    try
    {
        // Send a message to the user.
        var errorMessageText = "The skill encountered an error or bug.";
        var errorMessage = MessageFactory.Text(errorMessageText, errorMessageText, InputHints.IgnoringInput);
        await turnContext.SendActivityAsync(errorMessage);

        errorMessageText = "To continue to run this bot, please fix the bot source code.";
        errorMessage = MessageFactory.Text(errorMessageText, errorMessageText, InputHints.ExpectingInput);
        await turnContext.SendActivityAsync(errorMessage);

        // Send a trace activity, which will be displayed in the Bot Framework Emulator.
        // Note: we return the entire exception in the value property to help the developer;
        // this should not be done in production.
        await turnContext.TraceActivityAsync("OnTurnError Trace", exception.ToString(), "https://www.botframework.com/schemas/error", "TurnError");
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, $"Exception caught in SendErrorMessageAsync : {ex}");
    }
}

private async Task SendEoCToParentAsync(ITurnContext turnContext, Exception exception)
{
    try
    {
        // Send an EndOfConversation activity to the skill caller with the error to end the conversation,
        // and let the caller decide what to do.
        var endOfConversation = Activity.CreateEndOfConversationActivity();
        endOfConversation.Code = "SkillError";
        endOfConversation.Text = exception.Message;
        await turnContext.SendActivityAsync(endOfConversation);
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, $"Exception caught in SendEoCToParentAsync : {ex}");
    }
}

Rejestracja usługi

Karta Bot Framework używa obiektu konfiguracji uwierzytelniania (ustawionego podczas tworzenia karty) w celu zweryfikowania nagłówka uwierzytelniania na żądaniach przychodzących.

Ten przykład dodaje weryfikację oświadczeń do konfiguracji uwierzytelniania i używa karty umiejętności z procedurą obsługi błędów opisaną w poprzedniej sekcji.

EchoSkillBot\Startup.cs

    options.SerializerSettings.MaxDepth = HttpHelper.BotMessageSerializerSettings.MaxDepth;
});

// Register AuthConfiguration to enable custom claim validation.
services.AddSingleton(sp =>
{
    var allowedCallers = new List<string>(sp.GetService<IConfiguration>().GetSection("AllowedCallers").Get<string[]>());

    var claimsValidator = new AllowedCallersClaimsValidator(allowedCallers);

    // If TenantId is specified in config, add the tenant as a valid JWT token issuer for Bot to Skill conversation.
    // The token issuer for MSI and single tenant scenarios will be the tenant where the bot is registered.
    var validTokenIssuers = new List<string>();
    var tenantId = sp.GetService<IConfiguration>().GetSection(MicrosoftAppCredentials.MicrosoftAppTenantIdKey)?.Value;

    if (!string.IsNullOrWhiteSpace(tenantId))
    {
        // For SingleTenant/MSI auth, the JWT tokens will be issued from the bot's home tenant.
        // Therefore, these issuers need to be added to the list of valid token issuers for authenticating activity requests.
        validTokenIssuers.Add(string.Format(CultureInfo.InvariantCulture, AuthenticationConstants.ValidTokenIssuerUrlTemplateV1, tenantId));
        validTokenIssuers.Add(string.Format(CultureInfo.InvariantCulture, AuthenticationConstants.ValidTokenIssuerUrlTemplateV2, tenantId));
        validTokenIssuers.Add(string.Format(CultureInfo.InvariantCulture, AuthenticationConstants.ValidGovernmentTokenIssuerUrlTemplateV1, tenantId));
        validTokenIssuers.Add(string.Format(CultureInfo.InvariantCulture, AuthenticationConstants.ValidGovernmentTokenIssuerUrlTemplateV2, tenantId));
    }

    return new AuthenticationConfiguration
    {
        ClaimsValidator = claimsValidator,
        ValidTokenIssuers = validTokenIssuers
    };
});

// Create the Bot Framework Authentication to be used with the Bot Adapter.
services.AddSingleton<BotFrameworkAuthentication, ConfigurationBotFrameworkAuthentication>();

Manifest umiejętności

Manifest umiejętności to plik JSON opisujący działania, które mogą wykonywać umiejętności, jego parametry wejściowe i wyjściowe oraz punkty końcowe umiejętności. Manifest zawiera informacje potrzebne do uzyskania dostępu do umiejętności innego bota. Najnowsza wersja schematu to wersja 2.1.

EchoSkillBot\wwwroot\manifest\echoskillbot-manifest-1.0.json

{
  "$schema": "https://schemas.botframework.com/schemas/skills/skill-manifest-2.0.0.json",
  "$id": "EchoSkillBot",
  "name": "Echo Skill bot",
  "version": "1.0",
  "description": "This is a sample echo skill",
  "publisherName": "Microsoft",
  "privacyUrl": "https://echoskillbot.contoso.com/privacy.html",
  "copyright": "Copyright (c) Microsoft Corporation. All rights reserved.",
  "license": "",
  "iconUrl": "https://echoskillbot.contoso.com/icon.png",
  "tags": [
    "sample",
    "echo"
  ],
  "endpoints": [
    {
      "name": "default",
      "protocol": "BotFrameworkV3",
      "description": "Default endpoint for the skill",
      "endpointUrl": "http://echoskillbot.contoso.com/api/messages",
      "msAppId": "00000000-0000-0000-0000-000000000000"
    }
  ]
}

Schemat manifestu umiejętności to plik JSON opisujący schemat manifestu umiejętności. Bieżąca wersja schematu to 2.1.0.

Testowanie umiejętności

W tym momencie możesz przetestować umiejętności w emulatorze tak, jakby był to normalny bot. Jednak aby przetestować go jako umiejętności, musisz zaimplementować konsumenta umiejętności.

Pobierz i zainstaluj najnowszą wersję emulatora platformy Bot Framework

  1. Uruchom bota umiejętności echa lokalnie na maszynie. Jeśli potrzebujesz instrukcji, zapoznaj się z plikiem README przykładowym języka C#, JavaScript, Java lub Python .
  2. Użyj emulatora, aby przetestować bota, jak pokazano poniżej. Po wysłaniu komunikatu "end" lub "stop" do umiejętności wysyła endOfConversation działanie oprócz wiadomości odpowiedzi. Umiejętność wysyła endOfConversation działanie, aby wskazać, że umiejętności zostały zakończone.

Przykładowa transkrypcja przedstawiająca działanie końca konwersacji.

Więcej informacji o debugowaniu

Ponieważ ruch między umiejętnościami i użytkownikami umiejętności jest uwierzytelniany, podczas debugowania takich botów są wykonywane dodatkowe kroki.

  • Użytkownik umiejętności i wszystkie umiejętności, których używa, bezpośrednio lub pośrednio, muszą być uruchomione.
  • Jeśli boty działają lokalnie i jeśli którykolwiek z botów ma identyfikator aplikacji i hasło, wszystkie boty muszą mieć prawidłowe identyfikatory i hasła.
  • Jeśli wszystkie boty są wdrożone, zobacz, jak debugować bota z dowolnego kanału przy użyciu narzędzia ngrok.
  • Jeśli niektóre boty działają lokalnie, a niektóre są wdrażane, zobacz, jak debugować umiejętności lub umiejętności użytkownika.

W przeciwnym razie możesz debugować użytkownika umiejętności lub umiejętności podobne do debugowania innych botów. Aby uzyskać więcej informacji, zobacz Debugowanie bota i Debugowanie za pomocą emulatora platformy Bot Framework.

Następne kroki