Agenttisovellus Microsoft 365 -agenttien SDK:ssa

AgentApplication on Agents SDK:n avulla rakennetun agentin keskeinen rakennuspalikka. AgentApplication on aloituskohta kaielle saapuvalle toiminnalle, mukaan lukien käyttäjien viestit, keskustelun elinkaaritapahtumat, mukautuvien korttien vuorovaikutukset ja OAuth-vastakutsut.

Agentti on ytimessään AgentApplication. Määrität sen käsittelijöillä, jotka kuvaavat agenttisi toiminta. SDK huolehtii reitityksestä, tilan hallinnasta ja sen suorittamiseen tarvittavasta infrastruktuurista.

Miten AgentApplication toimii

Jokaisella agentilla on elinkaari, joka käynnistyy, kun kanava (Microsoft Teams, bottipalvelu tai mukautettu asiakas) toimittaa aktiviteetin agenttisi päätepisteeseen. AgentApplication sijaitsee tämän elinkaaren keskellä:

Channel → Hosting layer → AgentApplication → Your handlers

Agentin SDK:n avulla luodun agentin käsittelykerrokset toimivat seuraavasti:

  1. Isännöintitaso vastaanottaa HTTP-pyynnön ja todentaa sen.
  2. AgentApplication käsittelee tulevat toiminnot putkistonsa kautta.
  3. Käsittelijöitä kutsutaan vastaavien reittien perusteella.

Agentti lataa tilan ennen käsittelijöiden suoritusta. Sen jälkeen agentti tallentaa kääntymistilan.

Keskeiset käsitteet

Tehtävät

Kaikki Agenttien SDK:ssa virtaa aktiviteettina. Aktiviteetti on jäsennetty viesti, joka edustaa jotakin tapahtunutta. Aktiviteetilla on tyyppi, kuten viesti, tapahtuma, kutsu, keskusteluUpdate ja niin edelleen. Se sisältää kyseiselle tyypille olennaiset tiedot. AgentApplication vastaanottaa toimintoja ja reitittää ne oikean käsittelijän luo.

Reitit

Reitti yhdistää valitsimenja käsittelijän. Valitsin määrittää, vastaako reititys nykyistä aktiviteettia. Käsittelijä suorittaa logiikan, kun reitti täsmää.

Rekisteröi reitit, kun määrität agentin. Ne voivat täsmätä:

  • Sanoma, joka sisältää tietyn tekstin tai vastaa säännönmukaista lauseketta
  • Mikä tahansa tietyn tyypin aktiviteetti
  • Keskustelun elinkaaritapahtumat (jäsen lisätty, jäsen poistettu)
  • Mukautuvien korttien toiminnot
  • Mukautetut ehdot

Kun aktiviteetti saapuu, järjestelmä arvioi reitit järjestyksessä, kunnes se löytää vastaavuuden. Oletuksena vain yksi reitti suoritetaan.

Tilatilan muuttaminen

AgentApplication hallitsee _turn -tilaa – rakenteista tallennustilaa, joka on ositettu vaikutusalueisiin:

Vaikutusalueen tyyppi Kuvaus
Keskustelu Jaettu kaikille käyttäjille keskustelussa, jatkuva vuorotellen
Käyttäjä Suodatettu yksittäiselle käyttäjälle kaikissa keskusteluissa
Temp Vain nykyinen vuoro – ei koskaan jatkuva

Järjestelmä lataa tilan automaattisesti ennen käsittelijöiden suorittamista ja tallentaa sen automaattisesti jälkeenpäin.

Kontekstin muuttaminen

Kun käsittelijä suoritetaan, se saa vuoron kontekstin. Käännöskonteksti on tilannevedos nykyisestä aktiviteetista, sovitinyhteydestä ja apuohjelmista vastausten lähettämistä varten. Nykyisen vuorovaikutuksen käsittelyyn liittyvä rajapinta on vuorokontekstisi.

Väliohjelmisto

AgentApplication tukee väliohjelmistoputkea. Middleware on osien ketju, joka käsittelee jokaisen vuoron ennen ja jälkeen käsittelijöiden suorittamista. Väliohjelmisto voi tarkastaa, muuntaa tai oikosulkea toiminnan kulun. Yleisiä käyttötarkoituksia ovat kirjaaminen, todentamistarkistukset ja normalisoinnin pyytäminen.

Agentin luominen

Aliluokka AgentApplication ja rekisteröi käsittelijät konstruktorissa. Isännöintikehys lisätään AgentApplicationOptionsautomaattisesti .

public class MyAgent : AgentApplication
{
    public MyAgent(AgentApplicationOptions options) : base(options)
    {
        OnConversationUpdate(ConversationUpdateEvents.MembersAdded, WelcomeAsync);
        OnActivity(ActivityTypes.Message, OnMessageAsync, rank: RouteRank.Last);
    }

    private async Task WelcomeAsync(ITurnContext context, ITurnState state, CancellationToken ct)
    {
        foreach (var member in context.Activity.MembersAdded)
        {
            if (member.Id != context.Activity.Recipient.Id)
            {
                await context.SendActivityAsync("Hello! How can I help you?", cancellationToken: ct);
            }
        }
    }

    private async Task OnMessageAsync(ITurnContext context, ITurnState state, CancellationToken ct)
    {
        await context.SendActivityAsync($"You said: {context.Activity.Text}", cancellationToken: ct);
    }
}

Rekisteröi agenttisi kohteessa Program.cs:

WebApplicationBuilder builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpClient();
builder.Services.AddSingleton<IStorage, MemoryStorage>();
builder.Services.AddAgent<MyAgent>();
builder.Services.AddAgentAspNetAuthentication(builder.Configuration);

WebApplication app = builder.Build();

app.UseAuthentication();
app.UseAuthorization();
app.MapAgentApplicationEndpoints(requireAuth: !app.Environment.IsDevelopment());

app.Run();

Toimintojen käsittelijöiden rekisteröiminen

Viestien käsitteleminen

Vastaa sanomia tarkan tekstin mukaan (kirjainkoko ei ole merkitsevä):

OnMessage("help", async (context, state, ct) =>
{
    await context.SendActivityAsync("Here's what I can do...", cancellationToken: ct);
});

Vastaa sanomia säännöllisellä lausekkeella:

OnMessage(new Regex(@"^order\s+\d+$", RegexOptions.IgnoreCase), async (context, state, ct) =>
{
    await context.SendActivityAsync("Looking up your order...", cancellationToken: ct);
});

Keskustelupäivitysten käsitteleminen

Rekisteröi käsittelijät keskustelun elinkaaritapahtumiin, kuten jäseniin liittymiseen tai poistumiseen.

OnConversationUpdate(ConversationUpdateEvents.MembersAdded, async (context, state, ct) =>
{
    foreach (var member in context.Activity.MembersAdded)
    {
        if (member.Id != context.Activity.Recipient.Id)
        {
            await context.SendActivityAsync("Welcome!", cancellationToken: ct);
        }
    }
});

OnConversationUpdate(ConversationUpdateEvents.MembersRemoved, async (context, state, ct) =>
{
    // Called when participants leave the conversation
});

Minkä tahansa toimintotyypin käsitteleminen

Vertaa mitä tahansa toimintoa sen tyyppimerkkijonon mukaan reitityksen täydellistä hallintaa varten.

OnActivity(ActivityTypes.Message, async (context, state, ct) =>
{
    // Handles all message activities
});

OnActivity(ActivityTypes.Event, async (context, state, ct) =>
{
    // Handles event activities
});

Käytä ActivityTypes vakioita pysyväiskoodattujen merkkijonojen sijaan.

Hallitse reititysarviointijärjestystä

Järjestelmä lajittelee reitit kiinteään arviointijärjestykseen, kun rekisteröit ne, ei suorituksen aikana. Lajittelussa käytetään kahta tasoa:

  1. Reittityyppi: Järjestelmäryhmät reitittää tyypin mukaan, ja se arvioi aina korkeamman prioriteetin tyypit ennen alemman prioriteetin tyyppejä tyypistä riippumatta:

    Prioriteetti Reititystyyppi
    1 (suurin) Agentin käynnistämät reitit
    2 Kutsureittejä (mukautuvien korttien toiminnot, OAuth-takaisinkutsut ja muut aikasietoiset kutsut)
    3 Agenttiset reitit
    4 (pienin) Kaikki muut reitit
  2. Sija: Järjestelmä tilaa kunkin reittityyppiryhmän reitit sijoitusarvon mukaan. Pienemmät numeeriset arvot arvioidaan ensin.

Vakioiden avulla voit RouteRank asettaa sijan käsittelijää rekisteröitäessä:

Vakio Arvo Merkitys
RouteRank.First 0 Arvioitu ennen ryhmän kaikkia muita reittejä
RouteRank.Unspecified 32767 Oletusarvo, kun sijoitusta ei ole määritetty
RouteRank.Last 65535 Arvioitu kaikkien muiden ryhmänsä reittien jälkeen

Oletusarvoisesti arviointi pysähtyy ensimmäiselle vastaavalle reitille. Käytä RouteRank.Last yleiskattavana varavaihtoehtona, joka käsittelee kaiken, mitä tietty reitti ei kata.

// Specific handlers use the default rank
OnMessage("status", HandleStatusAsync);
OnMessage("help", HandleHelpAsync);

// Catch-all — handles anything not matched above
OnActivity(ActivityTypes.Message, HandleUnknownMessageAsync, rank: RouteRank.Last);

Elinkaarikoukkujen käynnistäminen

Rekisteröi logiikka, joka suoritetaan joka käänteessä, ennen reititysvastaavuutta tai sen jälkeen. Näistä koukuista on hyötyä lokiinkirjaamisessa sekä ongelmien ja virheiden käsittelyssä.

OnBeforeTurn(async (context, state, ct) =>
{
    logger.LogInformation("Turn started: {Type}", context.Activity.Type);
    return true; // Return false to abort the turn
});

OnAfterTurn(async (context, state, ct) =>
{
    logger.LogInformation("Turn completed");
    return true; // Return false to skip state saving
});

OnTurnError(async (context, state, exception, ct) =>
{
    logger.LogError(exception, "Turn error");
    await context.SendActivityAsync("Something went wrong. Please try again.", cancellationToken: ct);
});

Kun OnBeforeTurn palauttaa arvon false, kääntyminen keskeytetään, eikä reittejä suoriteta. Kun OnAfterTurn palauttaa arvon false, tila ei tallennu.

Käytä kääntämisen tilaa

Agentti lataa automaattisesti vuorotilan ennen käsittelijöiden suorittamista ja tallentaa sen sen jälkeen. Käsittelijöille välitetty tilan kääntämisen objekti antaa sinulle käyttöoikeuden eri vaikutusalueisiin, jotta voit lukea ja kirjoittaa tietoja, jotka pysyvät vuorotellen tai jotka ovat lyhytaikaisia nykyiselle käänteelle:

  • Keskustelun laajuus: Kaikissa käännöksissä jaetuille tiedoille keskustelun aikana
  • Käyttäjän vaikutusalue: Käyttäjäkohtaisille tiedoille
  • Temp-laajuus: Tiedoille, joiden tarvitsee olla olemassa vain nykyisen käänteen aikana
OnActivity(ActivityTypes.Message, async (context, state, ct) =>
{
    // Conversation scope — persisted per conversation
    var count = state.Conversation.GetValue<int>("messageCount", () => 0);
    state.Conversation.SetValue("messageCount", count + 1);

    // User scope — persisted per user
    var name = state.User.GetValue<string>("displayName");

    // Temp scope — current turn only
    state.Temp.SetValue("parsedInput", context.Activity.Text?.Trim());

    await context.SendActivityAsync($"Message #{count + 1}: {context.Activity.Text}", cancellationToken: ct);
});

Huomautus

Käytä MemoryStorage paikalliseen kehitykseen ja testaukseen. Tuotantokäyttöönotoissa, erityisesti käyttöönotoissa, jotka suoritetaan useissa esiintymissä, käytetään pysyvää tallennuspalvelua, kuten Azure Cosmos DB tai Azure Blob Storage. Katso Tallennuspalvelujen käyttö agentissasi.

Seuraavat vaiheet