Bagikan melalui


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.

  • Manifes menjelaskan antarmuka keterampilan. 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 fitur yang memantulkan input pengguna.

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

  Keterampilan pengelolaan multi-penyewa Keterampilan penyewa tunggal Kemampuan identitas terkelola yang ditetapkan oleh pengguna
Pengguna 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 terakhir hingga November 2023.

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

Untuk pembuatan bot baru, pertimbangkan untuk menggunakan Microsoft Copilot Studio dan baca tentang memilih solusi copilot yang tepat.

Untuk informasi selengkapnya, lihat Masa depan pembuatan bot.

Prasyarat

  • Pengetahuan tentang dasar-dasar dan keterampilan bot.
  • Langganan Azure (untuk menyebarkan keterampilan Anda). Jika Anda tidak memilikinya, buat akun gratis sebelum memulai.
  • Sebuah salinan dari sampel keterampilan bot-ke-bot sederhana dalam C#, JavaScript, Java, atau Python.

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 keterampilan bot-ke-bot sederhana mencakup proyek untuk dua bot:

  • Bot keterampilan gema, yang melaksanakan kemampuan.
  • 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 Mengimplementasikan sebuah 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 multipenyewa dan pengguna keterampilan secara lokal menggunakan Emulator tanpa memerlukan ID aplikasi dan kata sandi.

Untuk membuat kemampuan tersedia untuk bot yang berinteraksi dengan pengguna, daftarkan kemampuan 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 baik keterampilan maupun konsumen keterampilan memberikan informasi identitas, maka keduanya harus melakukannya.

Array penelepon yang diizinkan dapat membatasi keterampilan apa saja yang dapat diakses pengguna keterampilan. Untuk menerima panggilan dari konsumen keterampilan apa pun, tambahkan elemen "*".

Catatan

Jika Anda menguji skill Anda secara lokal tanpa informasi identitas bot, baik skill maupun pengguna skill tidak menjalankan kode untuk 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 penanganan aktivitas

Untuk menerima parameter input

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

Keterampilan dalam contoh ini tidak menerima parameter masukan.

Untuk melanjutkan atau menyelesaikan percakapan

Ketika fitur mengirim aktivitas, pengguna fitur harus meneruskan aktivitas ke pengguna.

Namun, Anda perlu mengirim endOfConversation aktivitas ketika keterampilan selesai; jika tidak, konsumen keterampilan 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 fungsi

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

Pemvalidasi klaim

Sampel ini menggunakan daftar penelepon yang diizinkan untuk validasi klaim. File konfigurasi skill mendefinisikan daftar. Objek validator kemudian membaca daftar.

Anda harus menambahkan validator klaim ke konfigurasi autentikasi. Klaim dievaluasi setelah pengantar autentikasi. Kode validasi Anda harus melemparkan kesalahan atau pengecualian untuk menolak permintaan. Ada banyak alasan Anda mungkin ingin menolak permintaan yang sudah terautentikasi dengan benar. Contohnya:

  • Keterampilan ini adalah bagian dari layanan berbayar. Pengguna tidak berada dalam database seharusnya tidak memiliki akses.
  • Keterampilan ini bersifat eksklusif. 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.

Penyesuai keterampilan

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

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

Manifest 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 Echo secara lokal di mesin Anda. Jika Anda memerlukan instruksi, lihat README file untuk sampel C#, JavaScript, Java, atau Python .
  2. Gunakan Emulator untuk menguji bot. Saat Anda mengirim pesan "akhir" atau "hentikan" ke kemampuan, pesan tersebut akan mengirimkan aktivitas endOfConversation selain pesan balasan. Keterampilan mengirimkan aktivitas endOfConversation untuk menandakan keterampilan telah selesai.

Contoh transkrip memperlihatkan aktivitas akhir percakapan.

Selengkapnya tentang debugging

Karena lalu lintas antara keterampilan dan pengguna keterampilan diautentikasi, ada langkah tambahan saat melakukan debugging bot tersebut.

Jika tidak, Anda dapat mendebug pengguna keahlian atau keahlian seperti Anda mendebug bot lain. Untuk informasi selengkapnya, lihat Melakukan Debug pada Bot dan Debug dengan Emulator Bot Framework.

Langkah berikutnya