Menerapkan keterampilan

BERLAKU UNTUK: SDK v4

Anda dapat menggunakan keterampilan untuk memperluas bot lain. Keterampilan adalah bot yang dapat melakukan serangkaian tugas untuk bot lain.

  • Antarmuka keterampilan dijelaskan oleh manifes. Pengembang yang tidak memiliki akses ke kode sumber keterampilan dapat menggunakan informasi dalam manifes untuk merancang konsumen keterampilan mereka.
  • Keterampilan dapat menggunakan validasi klaim untuk mengelola bot atau pengguna mana yang dapat mengaksesnya.

Artikel ini menunjukkan cara menerapkan keterampilan yang menggemakan input pengguna.

Beberapa jenis konsumen keterampilan tidak dapat menggunakan beberapa jenis bot keterampilan. Tabel berikut ini menjelaskan kombinasi mana yang didukung.

  Keterampilan multi-penyewa Keterampilan penyewa tunggal Keterampilan identitas terkelola yang ditetapkan pengguna
Konsumen multi-penyewa Didukung Tidak didukung Tidak didukung
Konsumen penyewa tunggal Tidak didukung Didukung jika kedua aplikasi milik penyewa yang sama Didukung jika kedua aplikasi milik penyewa yang sama
Konsumen identitas terkelola yang ditetapkan pengguna Tidak didukung Didukung jika kedua aplikasi milik penyewa yang sama Didukung jika kedua aplikasi milik penyewa yang sama

Catatan

Bot Framework JavaScript, C#, dan Python SDK akan terus didukung, namun, Java SDK dihentikan dengan dukungan jangka panjang akhir yang berakhir pada November 2023.

Bot yang ada yang dibangun dengan Java SDK akan terus berfungsi.

Untuk pembuatan bot baru, pertimbangkan untuk menggunakan Power Virtual Agents dan baca tentang memilih solusi chatbot yang tepat.

Untuk informasi selengkapnya, lihat Masa depan pembuatan bot.

Prasyarat

Catatan

Dimulai dengan versi 4.11, Anda tidak memerlukan ID dan kata sandi aplikasi untuk menguji keterampilan secara lokal di Bot Framework Emulator. Langganan Azure masih diperlukan untuk menyebarkan keterampilan Anda ke Azure.

Tentang sampel ini

Sampel bot-ke-bot sederhana keterampilan mencakup proyek untuk dua bot:

  • Bot keterampilan gema, yang mengimplementasikan keterampilan.
  • Bot akar sederhana, yang mengimplementasikan bot akar yang mengonsumsi keterampilan.

Artikel ini berfokus pada keterampilan, yang mencakup logika dukungan dalam bot dan adaptornya.

Untuk informasi tentang bot root sederhana, lihat cara Menerapkan konsumen keterampilan.

Sumber

Untuk bot yang disebarkan, autentikasi bot-ke-bot mengharuskan setiap bot yang berpartisipasi memiliki informasi identitas yang valid. Namun, Anda dapat menguji keterampilan multi-penyewa dan konsumen keterampilan secara lokal dengan Emulator tanpa ID aplikasi dan kata sandi.

Untuk membuat keterampilan tersedia untuk bot yang menghadap pengguna, daftarkan keterampilan dengan Azure. Untuk informasi selengkapnya, lihat cara mendaftarkan bot dengan Azure AI Bot Service.

Konfigurasi aplikasi

Secara opsional, tambahkan informasi identitas keterampilan ke file konfigurasinya. Jika konsumen keterampilan atau keterampilan memberikan informasi identitas, keduanya harus.

Array penelepon yang diizinkan dapat membatasi keterampilan mana yang dapat diakses konsumen keterampilan. Tambahkan elemen "*", untuk menerima panggilan dari konsumen keterampilan apa pun.

Catatan

Jika Anda menguji keterampilan Anda secara lokal tanpa informasi identitas bot, baik keterampilan maupun konsumen keterampilan menjalankan kode untuk melakukan validasi klaim.

EchoSkillBot\appsettings.json

Secara opsional, tambahkan informasi identitas keterampilan ke file 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 penangan aktivitas

Untuk menerima parameter input

Konsumen keterampilan dapat mengirim informasi ke keterampilan. Salah satu cara untuk menerima informasi tersebut adalah dengan menerimanya melalui properti nilai pada pesan masuk. Cara lain adalah dengan menangani aktivitas dan memanggil aktivitas.

Keterampilan dalam contoh ini tidak menerima parameter input.

Untuk melanjutkan atau menyelesaikan percakapan

Ketika keterampilan mengirim aktivitas, konsumen keterampilan harus meneruskan aktivitas ke pengguna.

Namun, Anda perlu mengirim endOfConversation aktivitas ketika keterampilan selesai; jika tidak, konsumen keterampilan akan terus meneruskan aktivitas pengguna ke keterampilan. Secara opsional, gunakan properti nilai aktivitas untuk menyertakan nilai pengembalian, dan gunakan properti kode aktivitas untuk menunjukkan mengapa keterampilan berakhir.

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

Untuk membatalkan keterampilan

Untuk keterampilan multi-giliran, Anda juga akan menerima endOfConversation aktivitas dari konsumen keterampilan, untuk memungkinkan konsumen membatalkan percakapan saat ini.

Logika untuk keterampilan ini tidak berubah dari giliran ke giliran. Jika Anda menerapkan keterampilan yang mengalokasikan sumber daya percakapan, tambahkan kode pembersihan sumber daya ke handler akhir percakapan.

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

Validator klaim

Sampel ini menggunakan daftar penelepon yang diizinkan untuk validasi klaim. Daftar didefinisikan dalam file konfigurasi keterampilan dan dibaca ke dalam objek validator saat dibuat.

Anda harus menambahkan validator klaim ke konfigurasi autentikasi. Klaim dievaluasi setelah header autentikasi. Kode validasi Anda harus melemparkan kesalahan atau pengecualian untuk menolak permintaan. Ada banyak alasan Anda mungkin ingin menolak permintaan yang diautentikasi sebaliknya. Contohnya:

  • Keterampilan ini adalah bagian dari layanan berbayar. Pengguna tidak berada dalam database seharusnya tidak memiliki akses.
  • Keterampilannya adalah kepemilikan. Hanya konsumen keterampilan tertentu yang dapat memanggil keterampilan.

Penting

Jika Anda tidak memberikan validator klaim, bot Anda akan menghasilkan kesalahan atau pengecualian saat menerima aktivitas dari konsumen keterampilan.

SDK menyediakan AllowedCallersClaimsValidator kelas yang menambahkan otorisasi tingkat aplikasi berdasarkan daftar ID sederhana aplikasi yang diizinkan untuk memanggil keterampilan. Jika daftar berisi tanda bintang (*), maka semua penelepon diizinkan. Validator klaim dikonfigurasi dalam Startup.cs.

Adaptor keterampilan

Ketika kesalahan terjadi, adaptor keterampilan harus menghapus status percakapan untuk keterampilan, dan itu juga harus mengirim endOfConversation aktivitas ke konsumen keterampilan. Gunakan properti kode aktivitas untuk memberi sinyal bahwa keterampilan berakhir karena kesalahan.

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

Registrasi layanan

Adaptor Bot Framework menggunakan objek konfigurasi autentikasi (diatur saat adaptor dibuat) untuk memvalidasi header autentikasi pada permintaan masuk.

Sampel ini menambahkan validasi klaim ke konfigurasi autentikasi dan menggunakan adaptor keterampilan dengan penanganan kesalahan yang dijelaskan di bagian sebelumnya.

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

Manifes keterampilan

Manifes keterampilan adalah file JSON yang menjelaskan aktivitas yang dapat dilakukan keterampilan, parameter input dan outputnya, dan titik akhir keterampilan. Manifes berisi informasi yang Anda butuhkan untuk mengakses keterampilan dari bot lain. Versi skema terbaru adalah v2.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"
    }
  ]
}

Skema manifes keterampilan adalah file JSON yang menjelaskan skema manifes keterampilan. Versi skema saat ini adalah 2.1.0.

Menguji keterampilan

Pada titik ini, Anda dapat menguji keterampilan di Emulator seolah-olah itu adalah bot normal. Namun, untuk mengujinya sebagai keterampilan, Anda harus menerapkan konsumen keterampilan.

Unduh dan instal Emulator Kerangka Kerja Bot terbaru

  1. Jalankan bot keterampilan gema secara lokal di komputer Anda. Jika Anda memerlukan instruksi, lihat README file untuk sampel C#, JavaScript, Java, atau Python .
  2. Gunakan Emulator untuk menguji bot seperti yang ditunjukkan di bawah ini. Saat Anda mengirim pesan "akhir" atau "hentikan" ke keterampilan, pesan tersebut mengirimkan endOfConversation aktivitas selain pesan balasan. Keterampilan mengirimkan endOfConversation aktivitas untuk menunjukkan keterampilan telah selesai.

Contoh transkrip memperlihatkan aktivitas akhir percakapan.

Selengkapnya tentang penelusuran kesalahan

Karena lalu lintas antara keterampilan dan konsumen keterampilan diautentikasi, ada langkah tambahan saat men-debug bot tersebut.

  • Konsumen keterampilan dan semua keterampilan yang dikonsumsinya, secara langsung atau tidak langsung, harus berjalan.
  • Jika bot berjalan secara lokal dan jika salah satu bot memiliki ID aplikasi dan kata sandi, semua bot harus memiliki ID dan kata sandi yang valid.
  • Jika semua bot disebarkan, lihat cara Men-debug bot dari saluran apa pun menggunakan ngrok.
  • Jika beberapa bot berjalan secara lokal dan beberapa disebarkan, lihat cara Men-debug keterampilan atau konsumen keterampilan.

Jika tidak, Anda dapat men-debug konsumen keterampilan atau keterampilan seperti Anda men-debug bot lain. Untuk informasi selengkapnya, lihat Men-debug bot dan Debug dengan Emulator Kerangka Kerja Bot.

Langkah berikutnya