AgentApplication i SDK for Microsoft 365-agenter

AgentApplication er den sentrale byggesteinen til en agent bygget med Agents SDK. AgentApplication er inngangspunktet for all innkommende aktivitet, inkludert meldinger fra brukere, samtalelivssyklushendelser, adaptive kortsamhandlinger, OAuth-tilbakeringinger.

En agent er, i kjernen, en AgentApplication. Du konfigurerer det med behandlere som beskriver hva agenten din gjør. SDK tar seg av ruting, statlig administrasjon og infrastrukturen som kreves for å kjøre den.

Slik fungerer AgentApplication

Hver agent har en livssyklus som starter når en kanal (Microsoft Teams, en bot-tjeneste eller en egendefinert klient) leverer en aktivitet til agentens endepunkt. AgentApplication sitter i midten av den livssyklusen:

Channel → Hosting layer → AgentApplication → Your handlers

Lagene av behandling i en agent bygget med Agents SDK fungerer som følger:

  1. Vertslaget mottar HTTP-forespørselen og godkjenner den.
  2. Prosessen AgentApplication behandler den innkommende aktiviteten gjennom prosesskjeden.
  3. Behandlingsprogrammene kalles opp basert på samsvarende ruter.

Agenten laster inn omgangsstatusen før behandlingsprogrammene kjøres. Etterpå lagrer agenten svingtilstanden.

Kjernekonsepter

Aktiviteter

Alt i Agents SDK flyter som en aktivitet. En aktivitet er en strukturert melding som representerer noe som skjedde. En aktivitet har en type, for eksempel melding, hendelse, aktivering, conversationUpdate og så videre. Den har en nyttelast som er relevant for den typen. AgentApplication mottar aktiviteter og ruter dem til riktig behandler.

Ruter

En rute parer en velger med en behandler. Velgeren bestemmer om en rute samsvarer med gjeldende aktivitet. Behandleren kjører logikken din når ruten samsvarer.

Registrer ruter når du konfigurerer agenten. De kan samsvare:

  • En melding som inneholder bestemt tekst eller samsvarer med et vanlig uttrykk
  • Enhver aktivitet av en gitt type
  • Samtalelivssyklushendelser (medlem lagt til, medlem fjernet)
  • Adaptive korthandlinger
  • Egendefinerte betingelser

Når en aktivitet ankommer, evaluerer systemet ruter i rekkefølge til den finner et treff. Som standard kjøres bare én rute.

Bytt tilstand

AgentApplication administrerer _turn-tilstand – strukturert lagring delt opp i omfang

Type omfang Description
Diskusjon Delt på tvers av alle brukere i en samtale, vedvart mellom utvekslinger
Bruker Omfattet av en enkeltbruker på tvers av alle samtaler
Temp Bare nåværende omgang – aldri oppretthold

Systemet laster automatisk inn tilstand før behandlerne kjører og lagrer det automatisk etterpå.

Omgangskontekst

Når en behandler kjører, får den en svingkontekst. Vendekontekst er et øyeblikksbilde av den gjeldende aktiviteten, adaptertilkoblingen og verktøyene for å sende svar. Turkonteksten er ditt grensesnitt til den nåværende samhandlingen.

Mellomvare

AgentApplication støtter et mellomvareforløp. Middleware er en kjede av komponenter som behandler hver omgang både før og etter at behandlerne kjører. Middleware kan undersøke, transformere eller kortslutte aktivitetsflyten. Vanlige bruksområder omfatter logging, godkjenningskontroller og forespørsel om normalisering.

Opprette en agent

Underklasse AgentApplication og registrer behandlerne i konstruktøren. Vertsrammeverket injiserer AgentApplicationOptionsautomatisk .

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

Registrer agenten din i 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();

Å registrere aktivitetsbehandlere

Håndtere meldinger

Sammenligne meldinger med nøyaktig tekst (skiller ikke mellom store og små bokstaver):

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

Sammenligne meldinger ved hjelp av et vanlig uttrykk:

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

Håndtere samtaleoppdateringer

Registrer behandlere for samtalelivssyklushendelser, for eksempel medlemmer som blir med eller forlater.

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

Håndtere en hvilken som helst aktivitetstype

Samsvar enhver aktivitet etter typestrengen for fullstendig kontroll over ruting.

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

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

Bruk ActivityTypes konstanter i stedet for hardkodede strenger.

Kontrollruteevalueringsrekkefølge

Systemet sorterer ruter i en fast evalueringsrekkefølge når du registrerer dem, ikke ved kjøring. Sorteringen bruker to nivåer:

  1. Rutetype: Systemet grupperer ruter etter type, og evaluerer alltid typer med høyere prioritet før typer med lavere prioritet, uavhengig av rangering:

    Prioritet Rutetype
    1 (høyeste) Agentiske aktiveringsruter
    2 Aktiver ruter (korttiltaks, OAuth-tilbakemeldinger og andre tidssensitive innkallinger)
    3 Agentiske ruter
    4 (laveste) Alle andre ruter
  2. Rangering: Innenfor hver rutetypegruppe ruter systemordrene etter rangeringsverdien. Lavere numeriske verdier evalueres først.

Bruk RouteRank konstanter til å angi rangering når du registrerer en behandler:

Konstant Verdi Betyr
RouteRank.First 0 Evaluert før alle andre ruter i gruppen
RouteRank.Unspecified 32767 Standard når ingen rangering er angitt
RouteRank.Last 65535 Evaluert etter alle andre ruter i gruppen

Evalueringen stopper som standard ved den første samsvarende ruten. Bruk RouteRank.Last for en catch-all fallback som håndterer alt som ikke samsvarer med en mer spesifikk rute.

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

Omgangslivssykluskroker

Registrer logikk som kjører hver sving, før eller etter rutesamsvar. Disse krokene er nyttige for logging, aspekter på tvers av systemet og feilhåndtering.

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

Når OnBeforeTurn gir false retur, avbrytes sekvensen, og ingen ruter utføres. Når OnAfterTurn returnerer false, lagres ikke statusen.

Bruk svingtilstand

Agenten laster automatisk inn tilstandssekvensen før prosessene kjører og lagrer den etterpå. Svingtilstandsobjektet som sendes til behandlerne, gir deg tilgang til de ulike omfangene, slik at du kan lese og skrive data som vedvarer på tvers av svinger eller er flyktig for den gjeldende svingen:

  • Samtaleomfang: For data som deles på tvers av alle svinger i en samtale
  • Brukeromfang: For brukerdata
  • Temp-omfang: For data som bare trenger å eksistere i løpet av gjeldende sving
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);
});

Bemerkning

Bruk MemoryStorage for lokal utvikling og testing. For produksjonsdistribusjoner, spesielt distribusjoner som kjører på flere forekomster, bruker du en fast lagringsleverandør, for eksempel Azure Cosmos DB eller Azure Blob Storage. Se Bruke lagringsleverandører i agenten din.

Neste trinn