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 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:
- Isännöintitaso vastaanottaa HTTP-pyynnön ja todentaa sen.
-
AgentApplicationkäsittelee tulevat toiminnot putkistonsa kautta. - 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:
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 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.