Aracılığıyla paylaş


Beceri tüketicisi uygulama

ŞUNLAR IÇIN GEÇERLIDIR: SDK v4

Becerileri kullanarak başka bir botu genişletebilirsiniz. Beceri, başka bir bot için bir dizi görev gerçekleştirebilen ve arabirimini tanımlamak için bir bildirim kullanan bir botdur. Kök bot, bir veya daha fazla beceri çağırabilen, kullanıcıya yönelik bir botdur. Kök bot, beceri tüketicisi türüdür.

  • Beceri tüketicisi, hangi becerilerin erişebileceğini yönetmek için talep doğrulamasını kullanmalıdır.
  • Beceri tüketicisi birden çok beceri kullanabilir.
  • Becerinin kaynak koduna erişimi olmayan geliştiriciler, beceri tüketicilerini tasarlamak için beceri bildirimindeki bilgileri kullanabilir.

Bu makalede, kullanıcının girişini yankılandırmak için yankı becerisini kullanan bir beceri tüketicisinin nasıl uygulanacakları gösterilmektedir. Örnek beceri bildirimi ve yankı becerisini uygulama hakkında bilgi için bkz. Beceriyi uygulama.

Beceriyi kullanmak için beceri iletişim kutusu kullanma hakkında bilgi için bkz. Beceriyi kullanmak için iletişim kutusunu kullanma.

Bazı beceri tüketicileri, bazı beceri botu türlerini kullanamaz. Aşağıdaki tabloda hangi birleşimlerin desteklendiği açıklanmaktadır.

  Çok kiracılı beceri Tek kiracılı beceri Kullanıcı tarafından atanan yönetilen kimlik becerisi
Çok kiracılı tüketici Desteklenir Desteklenmez Desteklenmez
Tek kiracılı tüketici Desteklenmez Her iki uygulama da aynı kiracıya aitse desteklenir Her iki uygulama da aynı kiracıya aitse desteklenir
Kullanıcı tarafından atanan yönetilen kimlik tüketicisi Desteklenmez Her iki uygulama da aynı kiracıya aitse desteklenir Her iki uygulama da aynı kiracıya aitse desteklenir

Not

Bot Framework JavaScript, C# ve Python SDK'ları desteklenmeye devam edecektir, ancak Java SDK'sı son uzun vadeli destek Kasım 2023'te sona erecek şekilde kullanımdan kaldırılacaktır.

Java SDK ile oluşturulan mevcut botlar çalışmaya devam edecektir.

Yeni bot derlemesi için Power Virtual Agents'ı kullanmayı göz önünde bulundurun ve doğru sohbet botu çözümünü seçme hakkında bilgi edinin.

Daha fazla bilgi için bkz . Bot oluşturmanın geleceği.

Önkoşullar

Not

Sürüm 4.11'den başlayarak, beceri tüketicisini Bot Framework Öykünücüsü'nde yerel olarak test etmek için bir uygulama kimliğine ve parolaya ihtiyacınız yoktur. Tüketicinizi Azure'a dağıtmak veya dağıtılan bir beceriyi kullanmak için yine de bir Azure aboneliği gereklidir.

Bu örnek hakkında

Basit bot-bot becerileri örneği iki bota yönelik projeleri içerir:

  • Beceriyi uygulayan yankı beceri botu.
  • Beceriyi kullanan bir kök botu uygulayan basit kök bot.

Bu makale, bot ve bağdaştırıcı nesnelerindeki destek mantığını içeren ve etkinlikleri bir beceriyle değiştirmek için kullanılan nesneleri içeren kök bota odaklanır. Bu modüller şunlardır:

  • Bir beceriye etkinlik göndermek için kullanılan bir beceri istemcisi.
  • Bir beceriden etkinlik almak için kullanılan beceri işleyicisi.
  • Beceri istemcisi ve işleyicisi tarafından kullanıcı kök konuşma başvurusu ile kök beceri konuşma başvurusu arasında çeviri yapmak için kullanılan beceri konuşma kimliği fabrikası.

Yankı beceri botu hakkında bilgi için bkz. Beceri uygulama.

Kaynaklar

Dağıtılan botlar için bot-bot kimlik doğrulaması, katılan her bot için geçerli kimlik bilgilerine sahip olmasını gerektirir. Ancak, çok kiracılı becerileri ve beceri tüketicilerini uygulama kimliği ve parolası olmadan Öykünücü ile yerel olarak test edebilirsiniz.

Uygulama yapılandırması

  1. İsteğe bağlı olarak, kök botunun kimlik bilgilerini yapılandırma dosyasına ekleyin. Beceri veya beceri tüketicisi kimlik bilgileri sağlıyorsa, her ikisi de sağlamalıdır.
  2. Becerilerin beceri tüketicisine yanıt vermesi gereken beceri ana bilgisayar uç noktasını (hizmet veya geri çağırma URL'si) ekleyin.
  3. Beceri tüketicisinin kullanacağı her beceri için bir giriş ekleyin. Her girdi şunları içerir:
    • Tüketicinin her beceriyi tanımlamak için kullanacağı bir kimlik.
    • İsteğe bağlı olarak, becerinin uygulaması veya istemci kimliği.
    • Becerinin mesajlaşma uç noktası.

Not

Beceri veya beceri tüketicisi kimlik bilgileri sağlıyorsa, her ikisi de sağlamalıdır.

SimpleRootBot\appsettings.json

İsteğe bağlı olarak, kök botunun kimlik bilgilerini ekleyin ve yankı beceri botu için uygulama veya istemci kimliğini ekleyin.

{
  "MicrosoftAppType": "",
  "MicrosoftAppId": "",
  "MicrosoftAppPassword": "",
  "MicrosoftAppTenantId": "",
  "SkillHostEndpoint": "http://localhost:3978/api/skills/",
  "BotFrameworkSkills": [
    {
      "Id": "EchoSkillBot",
      "AppId": "",
      "SkillEndpoint": "http://localhost:39783/api/messages"
    }
  ]
}

Beceri yapılandırması

Bu örnek, yapılandırma dosyasındaki her becerinin bilgilerini bir beceri nesneleri koleksiyonuna okur.

SimpleRootBot\SkillsConfiguration.cs

public class SkillsConfiguration
{
    public SkillsConfiguration(IConfiguration configuration)
    {
        var section = configuration?.GetSection("BotFrameworkSkills");
        var skills = section?.Get<BotFrameworkSkill[]>();
        if (skills != null)
        {
            foreach (var skill in skills)
            {
                Skills.Add(skill.Id, skill);
            }
        }

        var skillHostEndpoint = configuration?.GetValue<string>(nameof(SkillHostEndpoint));
        if (!string.IsNullOrWhiteSpace(skillHostEndpoint))
        {
            SkillHostEndpoint = new Uri(skillHostEndpoint);
        }
    }

    public Uri SkillHostEndpoint { get; }

    public Dictionary<string, BotFrameworkSkill> Skills { get; } = new Dictionary<string, BotFrameworkSkill>();
}

Konuşma Kimliği fabrikası

Bu, beceriyle kullanmak üzere konuşma kimliğini oluşturur ve beceri konuşma kimliğinden özgün kullanıcı konuşma kimliğini kurtarabilir.

Bu örneğe yönelik konuşma kimliği fabrikası, şu basit senaryoyu destekler:

  • Kök bot belirli bir beceriyi kullanacak şekilde tasarlanmıştır.
  • Kök botta aynı anda beceriye sahip yalnızca bir etkin konuşma vardır.

SDK, kaynak kodun çoğaltılması gerekmeden herhangi bir beceride kullanılabilecek bir SkillConversationIdFactory sınıf sağlar. Konuşma kimliği fabrikası Startup.cs yapılandırılır.

Daha karmaşık senaryoları desteklemek için konuşma kimliği fabrikanızı şu şekilde tasarlar:

  • Beceri konuşma kimliği oluşturma yöntemi uygun beceri konuşma kimliğini alır veya oluşturur.
  • Konuşma alma başvuru yöntemi doğru kullanıcı konuşmasını alır.

Beceri istemcisi ve beceri işleyicisi

Beceri tüketicisi, etkinlikleri beceriye iletmek için bir beceri istemcisi kullanır. İstemci bunu yapmak için beceri yapılandırma bilgilerini ve konuşma kimliği fabrikasını kullanır.

Beceri tüketicisi, beceriden etkinlik almak için bir beceri işleyici kullanır. İşleyici bunu yapmak için konuşma kimliği fabrikasını, kimlik doğrulama yapılandırmasını ve kimlik bilgisi sağlayıcısını kullanır ve ayrıca kök bot bağdaştırıcı ve etkinlik işleyicisine bağımlılıkları vardır

SimpleRootBot\Startup.cs

services.AddSingleton<IBotFrameworkHttpAdapter>(sp => sp.GetService<CloudAdapter>());
services.AddSingleton<BotAdapter>(sp => sp.GetService<CloudAdapter>());

Beceriden http trafiği, beceri tüketicisinin beceriye tanıtacağı hizmet URL'si uç noktasına gelir. Trafiği beceri işleyicisine iletmek için dile özgü uç nokta işleyicisi kullanın.

Varsayılan beceri işleyicisi:

  • Bir uygulama kimliği ve parola varsa, hem botdan bota kimlik doğrulamasını hem de talep doğrulamasını gerçekleştirmek için bir kimlik doğrulama yapılandırma nesnesi kullanır.
  • Tüketici becerisi konuşmasından kök kullanıcı konuşmasına çevirmek için konuşma kimliği fabrikasını kullanır.
  • Beceri tüketicisinin kök kullanıcı dönüş bağlamını yeniden kurabilmesi ve kullanıcıya etkinlikleri iletebilmesi için proaktif bir ileti oluşturur.

Etkinlik işleyici mantığı

Beceri tüketici mantığı şunları yapmalıdır:

  • Herhangi bir etkin beceri olup olmadığını unutmayın ve etkinlikleri uygun şekilde onlara iletin.
  • Kullanıcının bir beceriye iletilmesi gereken bir istekte bulunup beceriyi başlattığına dikkat edin.
  • Tamamlandığında fark etmek için herhangi bir etkin beceriden bir endOfConversation etkinlik arayın.
  • Uygunsa, kullanıcının veya beceri tüketicisinin henüz tamamlanmamış bir beceriyi iptal etmesine izin vermek için mantık ekleyin.
  • Herhangi bir yanıt, beceri tüketicisinin farklı bir örneğine geri dönebileceği için, bir beceri çağrısı yapmadan önce durumu kaydedin.

SimpleRootBot\Bots\RootBot.cs

Kök bot konuşma durumu, beceri bilgileri, beceri istemcisi ve genel yapılandırmaya bağımlılıkları vardır. ASP.NET bağımlılık ekleme yoluyla bu nesneleri sağlar. Kök bot ayrıca hangi becerinin etkin olduğunu izlemek için bir konuşma durumu özellik erişimcisi tanımlar.

public static readonly string ActiveSkillPropertyName = $"{typeof(RootBot).FullName}.ActiveSkillProperty";
private readonly IStatePropertyAccessor<BotFrameworkSkill> _activeSkillProperty;
private readonly string _botId;
private readonly ConversationState _conversationState;
private readonly BotFrameworkAuthentication _auth;
private readonly SkillConversationIdFactoryBase _conversationIdFactory;
private readonly SkillsConfiguration _skillsConfig;
private readonly BotFrameworkSkill _targetSkill;

public RootBot(BotFrameworkAuthentication auth, ConversationState conversationState, SkillsConfiguration skillsConfig, SkillConversationIdFactoryBase conversationIdFactory, IConfiguration configuration)
{
    _auth = auth ?? throw new ArgumentNullException(nameof(auth));
    _conversationState = conversationState ?? throw new ArgumentNullException(nameof(conversationState));
    _skillsConfig = skillsConfig ?? throw new ArgumentNullException(nameof(skillsConfig));
    _conversationIdFactory = conversationIdFactory ?? throw new ArgumentNullException(nameof(conversationIdFactory));

    if (configuration == null)
    {
        throw new ArgumentNullException(nameof(configuration));
    }

    _botId = configuration.GetSection(MicrosoftAppCredentials.MicrosoftAppIdKey)?.Value;

    // We use a single skill in this example.
    var targetSkillId = "EchoSkillBot";
    _skillsConfig.Skills.TryGetValue(targetSkillId, out _targetSkill);

    // Create state property to track the active skill
    _activeSkillProperty = conversationState.CreateProperty<BotFrameworkSkill>(ActiveSkillPropertyName);
}

Bu örnek, etkinlikleri bir beceriye iletmek için yardımcı bir yönteme sahiptir. Beceriyi çağırmadan önce konuşma durumunu kaydeder ve HTTP isteğinin başarılı olup olmadığını denetler.

private async Task SendToSkill(ITurnContext turnContext, BotFrameworkSkill targetSkill, CancellationToken cancellationToken)
{
    // NOTE: Always SaveChanges() before calling a skill so that any activity generated by the skill
    // will have access to current accurate state.
    await _conversationState.SaveChangesAsync(turnContext, force: true, cancellationToken: cancellationToken);

    // Create a conversationId to interact with the skill and send the activity
    var options = new SkillConversationIdFactoryOptions
    {
        FromBotOAuthScope = turnContext.TurnState.Get<string>(BotAdapter.OAuthScopeKey),
        FromBotId = _botId,
        Activity = turnContext.Activity,
        BotFrameworkSkill = targetSkill
    };
    var skillConversationId = await _conversationIdFactory.CreateSkillConversationIdAsync(options, cancellationToken);

    using var client = _auth.CreateBotFrameworkClient();

    // route the activity to the skill
    var response = await client.PostActivityAsync(_botId, targetSkill.AppId, targetSkill.SkillEndpoint, _skillsConfig.SkillHostEndpoint, skillConversationId, turnContext.Activity, cancellationToken);

    // Check response status
    if (!(response.Status >= 200 && response.Status <= 299))
    {
        throw new HttpRequestException($"Error invoking the skill id: \"{targetSkill.Id}\" at \"{targetSkill.SkillEndpoint}\" (status is {response.Status}). \r\n {response.Body}");
    }
}

Kök bot, etkinlikleri beceriye iletmek, kullanıcının isteğiyle beceriyi başlatmak ve beceri tamamlandığında beceriyi durdurmak için mantık içerir.

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    if (turnContext.Activity.Text.Contains("skill"))
    {
        await turnContext.SendActivityAsync(MessageFactory.Text("Got it, connecting you to the skill..."), cancellationToken);

        // Save active skill in state
        await _activeSkillProperty.SetAsync(turnContext, _targetSkill, cancellationToken);

        // Send the activity to the skill
        await SendToSkill(turnContext, _targetSkill, cancellationToken);
        return;
    }

    // just respond
    await turnContext.SendActivityAsync(MessageFactory.Text("Me no nothin'. Say \"skill\" and I'll patch you through"), cancellationToken);

    // Save conversation state
    await _conversationState.SaveChangesAsync(turnContext, force: true, cancellationToken: cancellationToken);
}

protected override async Task OnEndOfConversationActivityAsync(ITurnContext<IEndOfConversationActivity> turnContext, CancellationToken cancellationToken)
{
    // forget skill invocation
    await _activeSkillProperty.DeleteAsync(turnContext, cancellationToken);

    // Show status message, text and value returned by the skill
    var eocActivityMessage = $"Received {ActivityTypes.EndOfConversation}.\n\nCode: {turnContext.Activity.Code}";
    if (!string.IsNullOrWhiteSpace(turnContext.Activity.Text))
    {
        eocActivityMessage += $"\n\nText: {turnContext.Activity.Text}";
    }

    if ((turnContext.Activity as Activity)?.Value != null)
    {
        eocActivityMessage += $"\n\nValue: {JsonConvert.SerializeObject((turnContext.Activity as Activity)?.Value)}";
    }

    await turnContext.SendActivityAsync(MessageFactory.Text(eocActivityMessage), cancellationToken);

    // We are back at the root
    await turnContext.SendActivityAsync(MessageFactory.Text("Back in the root bot. Say \"skill\" and I'll patch you through"), cancellationToken);

    // Save conversation state
    await _conversationState.SaveChangesAsync(turnContext, cancellationToken: cancellationToken);
}

Açık hata işleyicisi

Bir hata oluştuğunda, bağdaştırıcı kullanıcıyla konuşmayı sıfırlamak ve hata durumunu kalıcı hale getirmekten kaçınmak için konuşma durumunu temizler.

Beceri tüketicisinde konuşma durumunu temizlemeden önce etkin bir beceriye konuşma sonu etkinliği göndermek iyi bir uygulamadır. Bu, beceri tüketicisi konuşmayı yayınlamadan önce becerinin tüketici becerisi konuşması ile ilişkili tüm kaynakları serbest bırakmasına olanak tanır.

SimpleRootBot\AdapterWithErrorHandler.cs

Bu örnekte, dönüş hatası mantığı birkaç yardımcı yöntem arasında ayrılmıştır.

private async Task HandleTurnError(ITurnContext turnContext, Exception exception)
{
    // Log any leaked exception from the application.
    // NOTE: In production environment, you should consider logging this to
    // Azure Application Insights. Visit https://aka.ms/bottelemetry to see how
    // to add telemetry capture to your bot.
    _logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}");

    await SendErrorMessageAsync(turnContext, exception);
    await EndSkillConversationAsync(turnContext);
    await ClearConversationStateAsync(turnContext);
}

private async Task SendErrorMessageAsync(ITurnContext turnContext, Exception exception)
{
    try
    {
        // Send a message to the user
        var errorMessageText = "The bot 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
        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 EndSkillConversationAsync(ITurnContext turnContext)
{
    if (_skillsConfig == null)
    {
        return;
    }

    try
    {
        // Inform the active skill that the conversation is ended so that it has
        // a chance to clean up.
        // Note: ActiveSkillPropertyName is set by the RooBot while messages are being
        // forwarded to a Skill.
        var activeSkill = await _conversationState.CreateProperty<BotFrameworkSkill>(RootBot.ActiveSkillPropertyName).GetAsync(turnContext, () => null);
        if (activeSkill != null)
        {
            var botId = _configuration.GetSection(MicrosoftAppCredentials.MicrosoftAppIdKey)?.Value;

            var endOfConversation = Activity.CreateEndOfConversationActivity();
            endOfConversation.Code = "RootSkillError";
            endOfConversation.ApplyConversationReference(turnContext.Activity.GetConversationReference(), true);

            await _conversationState.SaveChangesAsync(turnContext, true);

            using var client = _auth.CreateBotFrameworkClient();

            await client.PostActivityAsync(botId, activeSkill.AppId, activeSkill.SkillEndpoint, _skillsConfig.SkillHostEndpoint, endOfConversation.Conversation.Id, (Activity)endOfConversation, CancellationToken.None);
        }
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, $"Exception caught on attempting to send EndOfConversation : {ex}");
    }
}

private async Task ClearConversationStateAsync(ITurnContext turnContext)
{
    try
    {
        // Delete the conversationState for the current conversation to prevent the
        // bot from getting stuck in a error-loop caused by being in a bad state.
        // ConversationState should be thought of as similar to "cookie-state" in a Web pages.
        await _conversationState.DeleteAsync(turnContext);
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, $"Exception caught on attempting to Delete ConversationState : {ex}");
    }
}

Beceri uç noktası

Bot, gelen beceri etkinliklerini kök botunun beceri işleyicisine ileden bir uç nokta tanımlar.

SimpleRootBot\Controllers\SkillController.cs

[ApiController]
[Route("api/skills")]
public class SkillController : ChannelServiceController
{
    public SkillController(ChannelServiceHandlerBase handler)
        : base(handler)
    {
    }
}

Hizmet kaydı

Herhangi bir talep doğrulamasına ve tüm ek nesnelere sahip bir kimlik doğrulama yapılandırma nesnesi ekleyin. Bu örnek, hem kullanıcılardan hem de becerilerden etkinlikleri doğrulamak için aynı kimlik doğrulama yapılandırma mantığını kullanır.

SimpleRootBot\Startup.cs

// Register the skills configuration class
services.AddSingleton<SkillsConfiguration>();

// Register AuthConfiguration to enable custom claim validation.
services.AddSingleton(sp =>
{
    var allowedSkills = sp.GetService<SkillsConfiguration>().Skills.Values.Select(s => s.AppId).ToList();

    var claimsValidator = new AllowedSkillsClaimsValidator(allowedSkills);

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

Kök botu test edin

Emulator'da beceri tüketicisini normal bir bot gibi test edebilirsiniz; ancak hem beceri hem de beceri tüketici botlarını aynı anda çalıştırmanız gerekir. Beceriyi yapılandırma hakkında bilgi için bkz. beceriyi uygulama.

En son Bot Framework Öykünücüsü'ni indirme ve yükleme

  1. Yankı beceri botunu ve basit kök botu makinenizde yerel olarak çalıştırın. Yönergelere ihtiyacınız varsa C#, JavaScript, Java veya Python örneği için dosyaya bakınREADME.
  2. Aşağıda gösterildiği gibi botu test etmek için Öykünücü'yü kullanın. Beceriye bir end veya stop iletisi gönderdiğinizde, beceri kök bota yanıt iletisine ek olarak bir endOfConversation etkinlik gönderir. Etkinliğin endOfConversation kod özelliği, becerinin başarıyla tamamlandığını gösterir.

Beceri tüketicisi ile etkileşimin örnek dökümü.

Hata ayıklama hakkında daha fazla bilgi

Beceri ve beceri tüketicileri arasındaki trafiğin kimliği doğrulandığından, bu tür botlarda hata ayıklama sırasında ek adımlar vardır.

  • Beceri tüketicisi ve doğrudan veya dolaylı olarak tükettiği tüm beceriler çalışıyor olmalıdır.
  • Botlar yerel olarak çalışıyorsa ve botlardan herhangi birinin uygulama kimliği ve parolası varsa, tüm botların geçerli kimlikleri ve parolaları olmalıdır.
  • Botların tümü dağıtıldıysa ngrok kullanarak herhangi bir kanaldan bir botta hata ayıklamayı öğrenin.
  • Botlardan bazıları yerel olarak çalışıyorsa ve bazıları dağıtıldıysa, beceri veya beceri tüketicisinde hata ayıklamayı öğrenin.

Aksi takdirde, bir beceri tüketicisinde veya beceride, diğer botlarda hata ayıkladığınız gibi hata ayıklayabilirsiniz. Daha fazla bilgi için bkz. Botta hata ayıklama ve Bot Framework Öykünücüsü ile Hata Ayıklama.

Ek bilgi

Daha karmaşık bir kök bot uygularken göz önünde bulundurmanız gereken bazı şeyler aşağıdadır.

Kullanıcının çok adımlı beceriyi iptal etmesine izin vermek için

Kök bot, etkin beceriye iletmeden önce kullanıcının iletisini denetlemelidir. Kullanıcı geçerli işlemi iptal etmek isterse, kök bot iletiyi iletmek yerine beceriye bir endOfConversation etkinlik gönderebilir.

Kök ve beceri botları arasında veri alışverişi yapmak için

Beceriye parametre göndermek için, beceri tüketicisi beceriye gönderdiği iletilerde değer özelliğini ayarlayabilir. Beceriden dönüş değerleri almak için beceri tüketicisinin beceri bir endOfConversation etkinlik gönderdiğinde değer özelliğini denetlemesi gerekir.

Birden çok beceriyi kullanmak için

  • Bir beceri etkinse, kök bot hangi becerinin etkin olduğunu belirlemeli ve kullanıcının iletisini doğru beceriye iletmeli.
  • Etkin beceri yoksa, kök bot, bot durumuna ve kullanıcının girişine bağlı olarak hangi beceriyi başlatacaklarını (varsa) belirlemesi gerekir.
  • Kullanıcının birden çok eşzamanlı beceri arasında geçiş yapmalarına izin vermek istiyorsanız, kök botun kullanıcının iletisini iletmeden önce kullanıcının etkileşime geçmek istediği etkin becerilerden hangisini belirlemesi gerekir.

Beklenen yanıtların teslim modunu kullanmak için

Beklenen yanıtlar teslim modunu kullanmak için:

  • Etkinliği dönüş bağlamından kopyalama.
  • Etkinliği kök bottan beceriye göndermeden önce yeni etkinliğin teslim modu özelliğini "ExpectReplies" olarak ayarlayın.
  • İstek yanıtından döndürülen çağrı yanıt gövdesinden beklenen yanıtları okuyun.
  • Kök bot içinde veya özgün isteği başlatan kanala göndererek her etkinliği işleyin.

Bekleme yanıtları, bir etkinliği yanıtlayan botun, etkinliği alan botun aynı örneği olması gereken durumlarda yararlı olabilir.