Share via


Képesség megvalósítása

A KÖVETKEZŐKRE VONATKOZIK: SDK v4

A képességek segítségével kiterjeszthet egy másik robotot. A képesség olyan robot, amely egy másik robot számára képes feladatokat végrehajtani.

  • A készség felületét egy jegyzék ismerteti. Azok a fejlesztők, akik nem férnek hozzá a képesség forráskódjába, használhatják a jegyzékben szereplő információkat a képességfelhasználó tervezéséhez.
  • A szakértelem jogcímérvényesítéssel kezelheti, hogy mely robotok vagy felhasználók férhetnek hozzá.

Ez a cikk bemutatja, hogyan valósíthat meg olyan készséget, amely tükrözi a felhasználó bemenetét.

Bizonyos típusú készségfelhasználók nem tudnak bizonyos típusú képességrobotokat használni. Az alábbi táblázat ismerteti, hogy mely kombinációk támogatottak.

  Több-bérlős képesség Egybérlős képesség Felhasználó által hozzárendelt felügyelt identitástudás
Több-bérlős fogyasztó Támogatott Nem támogatott Nem támogatott
Egybérlős fogyasztó Nem támogatott Támogatott, ha mindkét alkalmazás ugyanahhoz a bérlőhöz tartozik Támogatott, ha mindkét alkalmazás ugyanahhoz a bérlőhöz tartozik
Felhasználó által hozzárendelt felügyelt identitásfelhasználó Nem támogatott Támogatott, ha mindkét alkalmazás ugyanahhoz a bérlőhöz tartozik Támogatott, ha mindkét alkalmazás ugyanahhoz a bérlőhöz tartozik

Feljegyzés

A Bot Framework JavaScript, C# és Python SDK-k továbbra is támogatottak lesznek, a Java SDK-t azonban 2023 novemberében végső hosszú távú támogatással kivonják.

A Java SDK-val létrehozott meglévő robotok továbbra is működni fognak.

Új robotépítéshez fontolja meg a Power Virtual Agents használatát, és olvassa el a megfelelő csevegőrobot-megoldás kiválasztását.

További információ: A robotépítés jövője.

Előfeltételek

Feljegyzés

A 4.11-es verziótól kezdve nincs szükség alkalmazásazonosítóra és jelszóra egy képesség helyi teszteléséhez a Bot Framework Emulatorban. A képesség Azure-beli üzembe helyezéséhez továbbra is Azure-előfizetésre van szükség.

A minta ismertetése

Az egyszerű robot-robot minta két robothoz tartozó projekteket tartalmaz:

  • Az echo skill robot, amely megvalósítja a képességet.
  • Az egyszerű gyökérrobot, amely implementál egy gyökérrobotot, amely felhasználja a képességet.

Ez a cikk a képességre összpontosít, amely magában foglalja a támogatási logikát a robotban és az adapterben.

Az egyszerű gyökérrobottal kapcsolatos információkért tekintse meg, hogyan implementálhat készségfelhasználót.

Források

Az üzembe helyezett robotok esetében a robotok között történő hitelesítéshez minden résztvevő robotnak érvényes identitásadatokra van szüksége. A több-bérlős készségeket és készségeket azonban helyileg tesztelheti az Emulator használatával alkalmazásazonosító és jelszó nélkül.

Ha elérhetővé szeretné tenni a képességet a felhasználói robotok számára, regisztrálja a képességet az Azure-ban. További információ: robot regisztrálása az Azure AI Bot Service-ben.

Alkalmazáskonfiguráció

Szükség esetén adja hozzá a képesség identitásadatait a konfigurációs fájlhoz. Ha a képesség- vagy képességfelhasználó identitásadatokat ad meg, mindkettőnek meg kell lennie.

Az engedélyezett hívótömbök korlátozhatják , hogy mely képességfelhasználók férhetnek hozzá a képességhez. Adjon hozzá egy "*" elemet, amely bármely készségfelhasználó hívásait fogadja.

Feljegyzés

Ha helyileg, robotidentitás-adatok nélkül teszteli a készségeit, sem a készségfelhasználó nem futtatja a kódot a jogcímek érvényesítéséhez.

EchoSkillBot\appsettings.json

Igény szerint adja hozzá a képesség identitásadatait a appsettings.json fájlhoz.

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

Tevékenységkezelő logika

Bemeneti paraméterek elfogadása

A képességfelhasználó adatokat küldhet a képességnek. Az ilyen információk elfogadásának egyik módja az, ha a bejövő üzenetek értéktulajdonságán keresztül fogadják el őket. Egy másik módszer az események kezelése és a tevékenységek meghívása.

A példában szereplő képesség nem fogadja el a bemeneti paramétereket.

Beszélgetés folytatása vagy befejezése

Amikor a képesség egy tevékenységet küld, a képességfelhasználónak tovább kell küldenie a tevékenységet a felhasználónak.

A képesség befejeződésekor azonban el kell küldenie egy endOfConversation tevékenységet, ellenkező esetben a képességfelhasználó továbbra is továbbítja a felhasználói tevékenységeket a képességnek. Ha szeretné, a tevékenység értéktulajdonságával adjon meg egy visszatérési értéket, és a tevékenység kódtulajdonságávaljelezze, hogy miért fejeződik be a képesség.

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

A képesség megszakítása

Többfordulós készségek esetén a készségfelhasználó tevékenységeit is elfogadná endOfConversation , hogy a fogyasztó megszakíthassa az aktuális beszélgetést.

Ennek a képességnek a logikája nem változik átfordulásról fordulóra. Ha olyan készséget valósít meg, amely beszélgetési erőforrásokat foglal le, adjon hozzá erőforrás-törlési kódot a beszélgetés vége kezelőhöz.

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

Jogcím-érvényesítő

Ez a minta egy engedélyezett hívólistát használ a jogcímek érvényesítéséhez. A lista a képesség konfigurációs fájljában van definiálva, és a létrehozáskor beolvassa az érvényesítő objektumba.

A hitelesítési konfigurációhoz hozzá kell adnia egy jogcím-érvényesítőt . A jogcímek kiértékelése a hitelesítési fejléc után történik. Az érvényesítési kódnak hibát vagy kivételt kell küldenie a kérés elutasításához. Az egyébként hitelesített kérések elutasításának számos oka lehet. Példa:

  • A képesség egy fizetős szolgáltatás része. Az adatbázisban nem szereplő felhasználónak nem szabad hozzáféréssel rendelkeznie.
  • A képesség védett. Csak bizonyos készségfelhasználók hívhatják meg a képességet.

Fontos

Ha nem ad meg jogcím-érvényesítőt, a robot hibaüzenetet vagy kivételt fog generálni, amikor egy tevékenységet kap a készségfelhasználótól.

Az SDK egy olyan osztályt AllowedCallersClaimsValidator biztosít, amely alkalmazásszintű engedélyezést ad hozzá azoknak az alkalmazásoknak az egyszerű azonosítói alapján, amelyek meghívhatják a készséget. Ha a lista csillagot (*) tartalmaz, akkor minden hívó engedélyezett. A jogcím-érvényesítő Startup.cs van konfigurálva.

Képességadapter

Hiba esetén a képesség adapterének törölnie kell a készség beszélgetési állapotát, és egy tevékenységet is el kell küldenie endOfConversation a készségfelhasználónak. A tevékenység kódtulajdonságával jelezhet, hogy a képesség hiba miatt véget ért.

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

Szolgáltatásregisztráció

A Bot Framework-adapter egy hitelesítési konfigurációs objektummal (az adapter létrehozásakor van beállítva) ellenőrzi a hitelesítési fejlécet a bejövő kéréseken.

Ez a minta jogcímérvényesítést ad hozzá a hitelesítési konfigurációhoz, és az előző szakaszban ismertetett hibakezelővel rendelkező képességadaptert használja.

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

Készségjegyzék

A képességjegyzék egy JSON-fájl, amely leírja a képesség által elvégezhető tevékenységeket, azok bemeneti és kimeneti paramétereit, valamint a képesség végpontjait. A jegyzék tartalmazza azokat az információkat, amelyekre szüksége van a képesség eléréséhez egy másik robottól. A legújabb sémaverzió a 2.1-es verzió.

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

A képességjegyzék-séma egy JSON-fájl, amely leírja a képességjegyzék sémáját. Az aktuális sémaverzió a 2.1.0.

A képesség tesztelése

Ezen a ponton tesztelheti a képességet az Emulátorban, mintha normál robot lenne. Ahhoz azonban, hogy készségként tesztelje, egy készségfelhasználót kell implementálnia.

Töltse le és telepítse a legújabb Bot Framework Emulatort

  1. Futtassa helyileg az Echo skill robotot a gépen. Ha útmutatásra van szüksége, tekintse meg a README C#, JavaScript, Java vagy Python mintafájlt.
  2. Az Emulator használatával tesztelje a robotot az alább látható módon. Amikor "end" vagy "stop" üzenetet küld a képességnek, az a válaszüzenet mellett egy endOfConversation tevékenységet is küld. A képesség elküldi a tevékenységet, endOfConversation hogy jelezze, a képesség befejeződött.

Példaátirat a beszélgetés végi tevékenységről.

További információ a hibakeresésről

Mivel a készségek és a készségfelhasználók közötti forgalom hitelesítése megtörtént, az ilyen robotok hibakereséséhez további lépések is szükségesek.

Ellenkező esetben ugyanúgy hibakeresést végezhet egy képességfelhasználón vagy képességen, mint más robotok. További információ: Robot hibakeresése és hibakeresés a Bot Framework Emulator használatával.

Következő lépések