Muistiinpano
Tämän sivun käyttö edellyttää valtuutusta. Voit yrittää kirjautua sisään tai vaihtaa hakemistoa.
Tämän sivun käyttö edellyttää valtuutusta. Voit yrittää vaihtaa hakemistoa.
AgentApplication on agentin keskeinen rakenneosa, joka on luotu agenttien SDK:lla.
AgentApplication toimii kaikkien saapuvien toimintojen aloituskohtana, mukaan lukien viestit käyttäjiltä, keskustelun elinkaaren tapahtumat, mukautuvan kortin vuorovaikutukset ja OAuth-takaisinsoitot.
Agentti on pohjimmiltaan AgentApplication. Se määritetään käsittelijöillä, jotka kuvailevat agentin toiminnan. SDK huolehtii reitityksestä, tilanhallinnasta ja suorituksessa tarvittavasta infrastruktuurista.
AgentApplicationin toiminta
Jokaisella agentilla on elinkaari, joka alkaa, kun kanava (Microsoft Teams, bottipalvelu tai mukautettu asiakasohjelma) toimittaa aktiviteetin agentin päätepisteelle.
AgentApplication sijaitsee tämän elinkaaren ytimessä:
Channel → Hosting layer → AgentApplication → Your handlers
Agenttien SDK:lla luodun agentin käsittelykerrokset toimivat seuraavasti:
- Isännöintikerros vastaanottaa HTTP-pyynnön ja todentaa sen.
-
AgentApplicationkäsittelee saapuvan aktiviteetin putkensa kautta. - Käsittelijät kutsutaan reittien perusteella.
Agentti lataa tilan ennen käsittelijöiden suoritusta. Tämän jälkeen agentti tallentaa vuorotilan.
Keskeiset konseptit
Toiminnat
Agenttien SDK:ssa kaikki tapahtuu aktiviteettina. Aktiviteetti on jäsennelty viesti, joka edustaa jotain tapahtunutta. Aktiviteetilla on tyyppi, kuten viesti, tapahtuma, kutsu tai conversationUpdate. Se sisältää kyseiselle tyypille olennaiset tiedot.
AgentApplication vastaanottaa aktiviteetteja ja ohjaa ne oikealle käsittelijälle.
Reititykset
Reitti yhdistää valitsimen ja käsittelijän. Valitsija määrittää, vastaako reitti nykyistä aktiviteettia. Käsittelijä suorittaa logiikan, kun vastaava reitti löytyy.
Rekisteröi reitit, kun määrität agentin. Ne voivat vastata
- viestiä, joka sisältää tietyn tekstin tai säännöllistä lauseketta
- mitä tahansa tietyn tyyppistä aktiviteettia
- keskustelun elinkaaritapahtumia (jäsen lisätty, jäsen poistettu)
- mukautuvan kortin toimintoja
- Mukautetut ehdot
Kun aktiviteetti saapuu, järjestelmä arvioi reitit järjestyksessä, kunnes se löytää sopivan reitin. Oletuksena suoritetaan vain yksi reitti.
Vuorotila
AgentApplication hallitsee vuorotilaa, joka on rakenteellinen tallennus, joka on jaettu laajuuksiin seuraavasti:
| Laajuustyypit | Description |
|---|---|
| Keskustelu | Jaettu kaikille käyttäjille keskustelussa, tallennetaan vuorojen välillä |
| User | Rajattu yksittäiselle käyttäjälle kaikissa keskusteluissa |
| Lämpötila | Vain nykyinen vuoro – ei koskaan jatkuva |
Järjestelmä lataa tilan automaattisesti ennen kuin käsittelijät suoritetaan ja tallentaa sen automaattisesti niiden jälkeen.
Vuorokonteksti
Kun käsittelijä suoritetaan, se saa vuoron kontekstin. Vuorokonteksti on nykyisen aktiviteetin, sovitinyhteyden ja vastausten lähettämiseen käytettävien työkalujen tilannekuva. Vuorokonteksti on liittymä nykyiseen vuorovaikutukseen.
Väliohjelmistot
AgentApplication tukee väliohjelmiston putkea. Väliohjelmisto on komponenttiketju, joka käsittelee jokaisen vuoron ennen ja jälkeen käsittelijöiden suorittamista. Väliohjelmisto voi tarkastaa, muuntaa tai katkaista aktiviteettityönkulun. Yleisiä käyttötarkoituksia ovat lokiinkirjaus, todennustarkistukset ja pyyntöjen normalisointi.
Agentin luominen
Periytä AgentApplication ja rekisteröi käsittelijät konstruktorissa. Isännöintikehys lisää kohteen AgentApplicationOptions automaattisesti.
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 agentti 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();
Aktiviteetin käsittelijöiden rekisteröiminen
Viestien käsitteleminen
Määritä viestien vastaavuus tarkalla tekstillä (kirjainkoolla ei ole merkitystä):
OnMessage("help", async (context, state, ct) =>
{
await context.SendActivityAsync("Here's what I can do...", cancellationToken: ct);
});
Määritä viestien vastaavuus 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 elinkaaren tapahtumiin, kuten jäsenten liittyminen tai poistuminen.
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 aktiviteettityypin käsitteleminen
Voit määrittää minkä tahansa aktiviteetin vastaavuuden sen tyypin merkkijonon perusteella saadaksesi täydellisen hallinnan reitityksestä.
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.
Reittien arviointijärjestyksen hallinta
Järjestelmä järjestää reitit kiinteään arviointijärjestykseen rekisteröinnin yhteydessä, ei suorituspalvelun aikana. Lajittelussa käytetään kahta seuraavaa tasoa:
Reittityyppi: Järjestelmä ryhmittelee reitit tyypin mukaan ja arvioi aina korkeamman prioriteetin tyypit ennen matalamman prioriteetin tyyppejä seuraavasti arvosta riippumatta:
Prioriteetti Reittityyppi 1 (korkein) Agentin käynnistämät reitit 2 Käynnistä reitit (mukautuvan kortin toiminnot, OAuthin takaisinkutsut ja muut aikakriittiset kutsut) 3 Agenttien reitit 4 (pienin) Kaikki muut reitit Luokitus: Kussakin reittityyppiryhmässä järjestelmä järjestää reitit niiden luokitusarvon perusteella. Alemmat numeeriset arvot arvioidaan ensin.
Käytä RouteRank-vakioita määrittääksesi luokittelun käsittelijän rekisteröimisen yhteydessä seuraavasti:
| Vakio | Arvo | Merkitys |
|---|---|---|
RouteRank.First |
0 |
Arvioitu ennen kaikkia muita ryhmän reittejä |
RouteRank.Unspecified |
32767 |
Oletusarvo, kun luokitusta ei ole määritelty |
RouteRank.Last |
65535 |
Arvioitu kaikkien muiden ryhmän reittien jälkeen |
Oletusarvoisesti arviointi pysähtyy ensimmäiselle yhteensopivalle reitille. Käytä kohdetta RouteRank.Last kaikkien varatoimintona, joka käsittelee kaikki tapaukset, jotka eivät vastanneet tarkempaa reittiä.
// 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);
Vuoron elinkaaren koukut
Rekisteröi logiikka, joka suoritetaan jokaisella vuorolla ennen tai jälkeen reittien täsmäytyksen. 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, vuoro keskeytetään eikä reittejä käsitellä. Kun OnAfterTurn palauttaa arvon false, vuorotilaa ei tallenneta.
Vuorotilan käyttäminen
Agentti lataa vuorotilan automaattisesti. ennen kuin käsittelijät suoritetaan ja tallentaa sen niiden jälkeen. Vuorotila-objekti, joka välitetään käsittelijöille, mahdollistaa eri laajuuksien käyttöoikeuden. Voit lukea ja kirjoittaa tietoja, jotka säilyvät vuorojen välillä tai ovat tilapäisiä vain kyseisen vuoron ajan.
- Keskustelun laajuus: Tiedot, joka jaetaan kaikissa keskustelun vuoroissa
- Käyttäjän laajuus: Käyttäjäkohtaiset tiedot
- Väliaikainen laajuus: Tiedot, jotka tarvitaan vain nykyisen vuoron 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);
});
Muistiinpano
Käytä kohdetta MemoryStorage paikalliseen kehitykseen ja testaukseen. Tuotantoympäristöissä, erityisesti käyttöönotoissa, jotka suoritetaan useassa esiintymässä, käytetään pysyvää tallennuspalvelua, kuten Azure Cosmos DB tai Azure Blob -säilö. Katso Tallennuspalveluiden käyttö agentissa.