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
- Jalankan bot keterampilan Echo secara lokal di mesin Anda. Jika Anda memerlukan instruksi, lihat
README
file untuk sampel C#, JavaScript, Java, atau Python . - 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 aktivitasendOfConversation
untuk menandakan keterampilan telah selesai.
Selengkapnya tentang debugging
Karena lalu lintas antara keterampilan dan pengguna keterampilan diautentikasi, ada langkah tambahan saat melakukan debugging 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 telah diaktifkan, pelajari cara melakukan debugging pada bot dari saluran mana pun menggunakan devtunnel.
- Jika beberapa bot berjalan secara lokal dan beberapa disebarkan, lihat cara Men-debug kemampuan atau konsumen kemampuan.
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.