Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
DOTYCZY: 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.
- Manifest opisuje interfejs umiejętności. 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 dostępem botów lub użytkowników do niej.
W tym artykule pokazano, jak zaimplementować umiejętność, która odzwierciedla dane wejściowe użytkownika.
Niektóre typy użytkownikó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.
Obsługa wielu najemców | Umiejętność dedykowana jednemu najemcy | Umiejętność związana z tożsamością zarządzaną nadaną przez użytkownika | |
---|---|---|---|
Użytkownik w środowisku wielodostępnym | Obsługiwane | Niewspierane | Niewspierane |
Jednodzierżawowy użytkownik | Niewspierane | Obsługiwane, jeśli obie aplikacje należą do tego samego dzierżawcy | Obsługiwane, jeśli obie aplikacje należą do tego samego dzierżawcy |
Odbiorca zarządzanej tożsamości przypisanej przez użytkownika | Niewspierane | Obsługiwane, jeśli obie aplikacje należą do tego samego dzierżawcy | Obsługiwane, jeśli obie aplikacje należą do tego samego dzierżawcy |
Uwaga
Aby tworzyć agentów z wybranymi usługami sztucznej inteligencji, orkiestracją i wiedzą, rozważ użycie zestawu SDK agentów platformy Microsoft 365. Zestaw SDK agentów obsługuje języki C#, JavaScript lub Python. Więcej informacji na temat zestawu SDK agentów można uzyskać na stronie aka.ms/agents. Jeśli szukasz platformy agenta opartej na modelu SaaS, rozważ microsoft Copilot Studio. Jeśli masz istniejącego bota utworzonego przy użyciu zestawu Bot Framework SDK, możesz zaktualizować bota do zestawu SDK agentów. Wskazówki dotyczące migracji z Bot Framework SDK do Agents SDK znajdziesz pod Bot Framework SDK to Agents SDK migration guidance, które omawiają podstawowe zmiany i aktualizacje. Zgłoszenia do pomocy technicznej dla zestawu Bot Framework SDK nie będą już obsługiwane od 31 grudnia 2025 r.
Wymagania wstępne
- Znajomość podstaw bota i umiejętności.
- Subskrypcja platformy Azure (w celu wdrożenia umiejętności). Jeśli nie masz subskrypcji, przed rozpoczęciem utwórz bezpłatne konto.
- Kopia prostego przykładu współpracy botów w języku C#, JavaScript, Java lub Python.
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ład prostych umiejętności do komunikacji między botami obejmuje projekty dla dwóch botów:
- Bot echo skill, który implementuje tę umiejętność.
- Prosty root bot, który implementuje bota głównego wykorzystującego umiejętności.
Ten artykuł koncentruje się na umiejętności, która obejmuje logikę obsługi w jego bocie i adapterze.
Aby uzyskać informacje na temat prostego bota podstawowego, zobacz, jak zaimplementować 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żesz jednak przetestować wielodostępne umiejętności i umiejętności konsumentów 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 albo umiejętność, albo jej użytkownik dostarcza informacje o tożsamości, oboje muszą to zrobić.
Tablica dozwolonych rozmówców może ograniczyć, którzy konsumenci umiejętności mogą uzyskiwać do niej dostęp. Aby zaakceptować wywołania od dowolnego użytkownika zasobu, dodaj element "*".
Uwaga
Jeśli testujesz funkcję lokalnie bez informacji o tożsamości bota, ani funkcja, ani użytkownik funkcji nie uruchamia kodu w celu przeprowadzenia walidacji roszczeń.
EchoSkillBot\appsettings.jswłączony
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ść wysyła działanie, odbiorca umiejętności powinien przekazać działanie użytkownikowi.
Jednak musisz wysłać endOfConversation
aktywność po zakończeniu umiejętności. W przeciwnym razie odbiorca umiejętności nadal przekazuje 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 code działania, aby wskazać, dlaczego umiejętność się kończy.
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ść
W przypadku umiejętności obejmujących wiele interakcji możesz również przyjmować endOfConversation
działania od użytkownika, aby umożliwić mu anulowanie bieżącej konwersacji.
Logika tej umiejętności nie zmienia się z tury na turę. Jeśli zaimplementujesz umiejętność przydzielającą zasoby konwersacji, dodaj kod oczyszczania zasobów do procedury obsługi zakończenia 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 dzwoniących na potrzeby weryfikacji roszczeń. Plik konfiguracji umiejętności definiuje listę. Następnie obiekt modułu sprawdzania poprawności odczytuje listę.
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żna 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 użytkownicy umiejętności mogą korzystać z umiejętności.
Ważne
Jeśli nie podasz walidatora roszczeń, twój bot wygeneruje błąd lub wyjątek po otrzymaniu aktywności 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.
Adapter 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
aktywność do konsumenta umiejętności. Aby zasygnalizować, że umiejętności zakończyły się z powodu błędu, użyj właściwości kodu działania.
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
Adapter Bot Framework używa obiektu konfiguracji uwierzytelniania (ustawionego podczas tworzenia adaptera) do weryfikacji nagłówka uwierzytelniania w przychodzących żądaniach.
Ten przykład dodaje weryfikację roszczeń do konfiguracji uwierzytelniania i używa adaptera umiejętności z obsługą błędów opisanego 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.jswłączony
{
"$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ść, musisz zaimplementować konsumenta umiejętności.
Pobierz i zainstaluj najnowszą wersję emulatora platformy Bot Framework
- Uruchom lokalnie na swoim komputerze bota umiejętności "echo". Jeśli potrzebujesz instrukcji, zapoznaj się z plikiem
README
przykładowym języka C#, JavaScript, Java lub Python . - Użyj emulatora, aby przetestować bota. Po wysłaniu komunikatu "end" lub "stop" do funkcji, wysyłana jest aktywność
endOfConversation
oraz wiadomość odpowiedzi. Umiejętność wysyła działanieendOfConversation
, aby wskazać, że umiejętność jest zakończona.
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.
- Konsument umiejętności i wszystkie umiejętności, które wykorzystuje, bezpośrednio lub pośrednio, muszą działać.
- 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 metodyki devtunnel.
- 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ć konsumenta umiejętności lub umiejętność w znany sposób, jak w przypadku debugowania innych botów. Aby uzyskać więcej informacji, zobacz Debugowanie bota i Debugowanie za pomocą emulatora platformy Bot Framework.