Beceri uygulama

ŞUNLAR IÇIN GEÇERLIDIR: SDK v4

Becerileri kullanarak başka bir botu genişletebilirsiniz. Beceri, başka bir bot için bir dizi görev gerçekleştirebilen bir botdur.

  • Becerinin arabirimi bir bildirim tarafından tanımlanır. Becerinin kaynak koduna erişimi olmayan geliştiriciler, beceri tüketicilerini tasarlamak için bildirimdeki bilgileri kullanabilir.
  • Bir beceri, hangi botların veya kullanıcıların erişebileceğini yönetmek için talep doğrulamasını kullanabilir.

Bu makale, kullanıcının girişini yankılayan bir becerinin nasıl uygulandığını gösterir.

Bazı beceri tüketicileri, bazı beceri botu türlerini kullanamaz. Aşağıdaki tabloda hangi birleşimlerin desteklendiği açıklanmaktadır.

  Çok kiracılı beceri Tek kiracılı beceri Kullanıcı tarafından atanan yönetilen kimlik becerisi
Çok kiracılı tüketici Desteklenir Desteklenmez Desteklenmez
Tek kiracılı tüketici Desteklenmez Her iki uygulama da aynı kiracıya aitse desteklenir Her iki uygulama da aynı kiracıya aitse desteklenir
Kullanıcı tarafından atanan yönetilen kimlik tüketicisi Desteklenmez Her iki uygulama da aynı kiracıya aitse desteklenir Her iki uygulama da aynı kiracıya aitse desteklenir

Not

Bot Framework JavaScript, C# ve Python SDK'ları desteklenmeye devam edecektir, ancak Java SDK'sı son uzun vadeli destek Kasım 2023'te sona erecek şekilde kullanımdan kaldırılacaktır.

Java SDK ile oluşturulan mevcut botlar çalışmaya devam edecektir.

Yeni bot derlemesi için Power Virtual Agents'ı kullanmayı göz önünde bulundurun ve doğru sohbet botu çözümünü seçme hakkında bilgi edinin.

Daha fazla bilgi için bkz . Bot oluşturmanın geleceği.

Önkoşullar

Not

Sürüm 4.11'den başlayarak, Bot Framework Öykünücüsü'nde bir beceriyi yerel olarak test etmek için bir uygulama kimliğine ve parolaya ihtiyacınız yoktur. Becerinizi Azure'a dağıtmak için yine de bir Azure aboneliği gereklidir.

Bu örnek hakkında

Basit bot-bot becerileri örneği iki bota yönelik projeleri içerir:

  • Beceriyi uygulayan yankı beceri botu.
  • Beceriyi kullanan bir kök botu uygulayan basit kök bot.

Bu makale, botundaki ve bağdaştırıcısındaki destek mantığını içeren beceriye odaklanır.

Basit kök bot hakkında bilgi için bkz. Beceri tüketicisi uygulama.

Kaynaklar

Dağıtılan botlar için bot-bot kimlik doğrulaması, katılan her bot için geçerli kimlik bilgilerine sahip olmasını gerektirir. Ancak, çok kiracılı becerileri ve beceri tüketicilerini uygulama kimliği ve parolası olmadan Öykünücü ile yerel olarak test edebilirsiniz.

Beceriyi kullanıcıya yönelik botların kullanımına açmak için beceriyi Azure'a kaydedin. Daha fazla bilgi için bkz. Azure AI Bot Hizmeti ile bot kaydetme.

Uygulama yapılandırması

İsteğe bağlı olarak, becerinin kimlik bilgilerini yapılandırma dosyasına ekleyin. Beceri veya beceri tüketicisi kimlik bilgileri sağlıyorsa, her ikisi de sağlamalıdır.

İzin verilen arayanlar dizisi, hangi beceri tüketicilerinin beceriye erişebileceğini kısıtlayabilir. Herhangi bir beceri tüketicisinden gelen çağrıları kabul etmek için bir "*" öğesi ekleyin.

Not

Becerinizi bot kimlik bilgileri olmadan yerel olarak test ediyorsanız, ne beceri ne de beceri tüketicisi talep doğrulama gerçekleştirmek için kodu çalıştırır.

EchoSkillBot\appsettings.json

İsteğe bağlı olarak, becerinin kimlik bilgilerini appsettings.json dosyasına ekleyin.

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

Etkinlik işleyici mantığı

Giriş parametrelerini kabul etmek için

Beceri tüketicisi beceriye bilgi gönderebilir. Bu tür bilgileri kabul etmenin bir yolu, gelen iletilerde value özelliği aracılığıyla bunları kabul etmektir. Başka bir yol da olayı işlemek ve etkinlikleri çağırmaktır.

Bu örnekteki beceri giriş parametrelerini kabul etmiyor.

Konuşmaya devam etmek veya tamamlamak için

Beceri bir etkinlik gönderdiğinde, beceri tüketicisi etkinliği kullanıcıya iletmelidir.

Ancak beceri tamamlandığında bir endOfConversation etkinlik göndermeniz gerekir; aksi takdirde, beceri tüketicisi kullanıcı etkinliklerini beceriye iletmeye devam eder. İsteğe bağlı olarak, bir dönüş değeri eklemek için etkinliğin value özelliğini kullanın ve becerinin neden sona erdiğini belirtmek için etkinliğin kod özelliğini kullanın.

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

Beceriyi iptal etmek için

Çok aşamalı beceriler için, bir beceri tüketicisinden gelen etkinlikleri de kabul endOfConversation eder ve tüketicinin geçerli konuşmayı iptal etmesine izin verirsiniz.

Bu becerinin mantığı sırayla değişmez. Konuşma kaynaklarını ayıran bir beceri uygularsanız, konuşma sonu işleyicisine kaynak temizleme kodu ekleyin.

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

Talep doğrulayıcı

Bu örnek, talep doğrulaması için izin verilen arayanlar listesini kullanır. Liste, becerinin yapılandırma dosyasında tanımlanır ve oluşturulduğunda doğrulayıcı nesnesine okunur.

Kimlik doğrulama yapılandırmasına bir talep doğrulayıcı eklemeniz gerekir. Talepler kimlik doğrulama üst bilgisinde değerlendirilir. Doğrulama kodunuz isteği reddetmek için bir hata veya özel durum oluşturmalıdır. Aksi takdirde kimliği doğrulanmış bir isteği reddetmek istemeniz için birçok neden vardır. Örneğin:

  • Beceri, ücretli hizmetin bir parçasıdır. Kullanıcının veritabanında olmaması gerekir.
  • Beceri özeldir. Beceriyi yalnızca belirli beceri tüketicileri adlandırabilir.

Önemli

Talep doğrulayıcı sağlamazsanız botunuz beceri tüketicisinden etkinlik aldıktan sonra bir hata veya özel durum oluşturur.

SDK, beceriyi çağırmasına AllowedCallersClaimsValidator izin verilen uygulamaların basit bir kimlik listesine dayalı olarak uygulama düzeyinde yetkilendirme ekleyen bir sınıf sağlar. Listede yıldız işareti (*) varsa, tüm arayanlara izin verilir. Talep doğrulayıcı Startup.cs yapılandırılır.

Beceri bağdaştırıcısı

Bir hata oluştuğunda, becerinin bağdaştırıcısı becerinin konuşma durumunu temizlemeli ve ayrıca beceri tüketicisine bir endOfConversation etkinlik göndermelidir. Becerinin bir hata nedeniyle sona erdiğinin sinyalini vermek için etkinliğin kod özelliğini kullanın.

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

Hizmet kaydı

Bot Framework bağdaştırıcısı, gelen isteklerde kimlik doğrulama üst bilgisini doğrulamak için bir kimlik doğrulama yapılandırma nesnesi (bağdaştırıcı oluşturulduğunda ayarlanır) kullanır.

Bu örnek, kimlik doğrulama yapılandırmasına talep doğrulaması ekler ve beceri bağdaştırıcısını önceki bölümde açıklanan hata işleyicisi ile kullanır.

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>();

Beceri bildirimi

Beceri bildirimi, becerinin gerçekleştirebileceği etkinlikleri, giriş ve çıkış parametrelerini ve becerinin uç noktalarını açıklayan bir JSON dosyasıdır. Bildirim, beceriye başka bir bottan erişmek için ihtiyacınız olan bilgileri içerir. En son şema sürümü v2.1'dir.

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"
    }
  ]
}

Beceri bildirimi şeması , beceri bildiriminin şemasını açıklayan bir JSON dosyasıdır. Geçerli şema sürümü 2.1.0'dır.

Beceriyi test edin

Bu noktada Emulator'daki beceriyi normal bir bot gibi test edebilirsiniz. Ancak, beceri olarak test etmek için bir beceri tüketicisi uygulamanız gerekir.

En son Bot Framework Öykünücüsü'ni indirme ve yükleme

  1. Yankı beceri botunu makinenizde yerel olarak çalıştırın. Yönergelere ihtiyacınız varsa C#, JavaScript, Java veya Python örneği için dosyaya bakınREADME.
  2. Aşağıda gösterildiği gibi botu test etmek için Öykünücü'yü kullanın. Beceriye bir "son" veya "durdur" iletisi gönderdiğinizde, yanıt iletisine ek olarak bir endOfConversation etkinlik gönderir. Beceri, becerinin endOfConversation tamamlandığını belirtmek için etkinliği gönderir.

Konuşma sonu etkinliğini gösteren örnek transkript.

Hata ayıklama hakkında daha fazla bilgi

Beceri ve beceri tüketicileri arasındaki trafiğin kimliği doğrulandığından, bu tür botlarda hata ayıklama sırasında ek adımlar vardır.

  • Beceri tüketicisi ve doğrudan veya dolaylı olarak tükettiği tüm beceriler çalışıyor olmalıdır.
  • Botlar yerel olarak çalışıyorsa ve botlardan herhangi birinin uygulama kimliği ve parolası varsa, tüm botların geçerli kimlikleri ve parolaları olmalıdır.
  • Botların tümü dağıtıldıysa ngrok kullanarak herhangi bir kanaldan bir botta hata ayıklamayı öğrenin.
  • Botlardan bazıları yerel olarak çalışıyorsa ve bazıları dağıtıldıysa, beceri veya beceri tüketicisinde hata ayıklamayı öğrenin.

Aksi takdirde, bir beceri tüketicisinde veya beceride, diğer botlarda hata ayıkladığınız gibi hata ayıklayabilirsiniz. Daha fazla bilgi için bkz. Botta hata ayıklama ve Bot Framework Öykünücüsü ile Hata Ayıklama.

Sonraki adımlar