Bemærk
Adgang til denne side kræver godkendelse. Du kan prøve at logge på eller ændre mapper.
Adgang til denne side kræver godkendelse. Du kan prøve at ændre mapper.
AgentApplication er den centrale kernekomponent i en agent bygget med Agents SDK.
AgentApplication fungerer som indgangspunkt for al indkommende aktivitet, såsom beskeder fra brugere, begivenheder i samtalens livscyklus, interaktioner med adaptivt kort og OAuth-callbacks.
En agent er i sin kerne en AgentApplication. Du konfigurerer den med handlere, der beskriver, hvad din agent udfører. SDK'et sørger for routing, tilstandsstyring og den infrastruktur, der skal til for at agenten kan køre.
Sådan fungerer AgentApplication
Agentens livscyklus begynder, når en kanal (Microsoft Teams, en bot-tjeneste eller en brugerdefineret klient) leverer en aktivitet til agentens endpoint.
AgentApplication er kernen i denne livscyklus:
Channel → Hosting layer → AgentApplication → Your handlers
Behandlingslagene i en agent bygget med Agents SDK fungerer som følger:
- Hostinglaget modtager HTTP-forespørgslen og autentificerer den.
- Den
AgentApplicationbehandler den indkommende aktivitet gennem sin pipeline. - Dine handlere kaldes baseret på matchende ruter.
Din agent indlæser turntilstand, før dine handlere køres. Bagefter gemmer agenten turtilstanden.
Kernebegreber
Aktiviteter
Alt i Agents SDK håndteres som en aktivitet. En aktivitet er en struktureret besked, der repræsenterer noget, der er sket. En aktivitet har en type, såsom besked, begivenhed, invoke, samtaleopdatering og så videre. Den indeholder en nyttelast, der er relevant for den type.
AgentApplication modtager aktiviteter og ruterer dem til den rette handler.
Ruter
En rute parrer en selector med en handler. Selektoren afgør, om en rute matcher den aktuelle aktivitet. Handleren kører din logik, når ruten matcher.
Registrer ruter, når du konfigurerer din agent. De kan matche:
- En besked, der indeholder specifik tekst eller matcher et regulært udtryk
- Enhver aktivitet af en bestemt type
- Begivenheder i samtalens livscyklus (medlem tilføjet, medlem fjernet)
- Adaptive korthandlinger
- Brugerdefinerede betingelser
Når en aktivitet ankommer, evaluerer systemet ruter i rækkefølge, indtil det finder et match. Som standard kører kun én rute.
Turn tilstand
AgentApplication administrerer _turn tilstand – struktureret lager, der er partitioneret i områder:
| Områdetype | Beskrivelse |
|---|---|
| Samtale | Delt mellem alle brugere i en samtale, vedvarende mellem ture |
| Bruger | Afgrænset til en individuel bruger på tværs af alle samtaler |
| Temperatur | Kun aktuel tur – aldrig permanent |
Systemet indlæser automatisk tilstand, før dine håndteringsfunktioner kører, og gemmer den automatisk bagefter.
Aktivér kontekst
Når en handler kører, modtager den en tur-kontekst. Turn context er et øjebliksbillede af den aktuelle aktivitet, adapterforbindelsen og funktioner til at sende svar. Turn context er dit interface til den aktuelle interaktion.
Middleware
AgentApplication understøtter en middlewarepipeline. Middleware er en kæde af komponenter, der behandler hver tur før og efter dine handlers kører. Middleware kan inspicere, transformere eller kortslutte aktivitetsflowet. Typiske anvendelser omfatter logning, autentificeringstjek og normalisering af forespørgsler.
Oprette en agent
Subclass AgentApplication og registrer dine handlers i konstruktøren. Hosting-rammeværket injicerer automatisk AgentApplicationOptions.
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 din agent 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();
Registrer aktivitetshåndterere
Håndtering af beskeder
Matcher beskeder efter præcis tekst (ufølsom over for store og små bogstaver):
OnMessage("help", async (context, state, ct) =>
{
await context.SendActivityAsync("Here's what I can do...", cancellationToken: ct);
});
Matcher beskeder med et regulært udtryk:
OnMessage(new Regex(@"^order\s+\d+$", RegexOptions.IgnoreCase), async (context, state, ct) =>
{
await context.SendActivityAsync("Looking up your order...", cancellationToken: ct);
});
Håndter samtaleopdateringer
Registrer håndterere til samtalebegivenheder, såsom når medlemmer tilslutter sig eller forlader samtalen.
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åndter enhver aktivitetstype
Matche enhver aktivitet baseret på dens typebetegnelse for fuld kontrol over routing.
OnActivity(ActivityTypes.Message, async (context, state, ct) =>
{
// Handles all message activities
});
OnActivity(ActivityTypes.Event, async (context, state, ct) =>
{
// Handles event activities
});
Brug ActivityTypes konstanter i stedet for hardkodede strenge.
Kontrolruteevalueringsordre
Systemet sorterer ruter i en fast evalueringsrækkefølge, når du registrerer dem, ikke under kørsel. Sorteringen bruger to niveauer:
Rutetype: Systemet grupperer ruter efter type, og det evaluerer altid typer med højere prioritet før typer med lavere prioritet, uanset rang:
Prioritet Rutetype 1 (højeste) Agentbaseret aktiveringsruter 2 Invoke-ruter (adaptivt kort-handlinger, OAuth-callbacks og andre tidssensitive invokeringer) 3 Agentiske ruter 4 (laveste) Alle andre ruter Rang: Inden for hver rutetypegruppe sorterer systemet ruterne efter deres rangværdi. Lavere numeriske værdier evalueres først.
Brug RouteRank konstanter til at angive rang ved registrering af en handler:
| Konstant | Værdi | Betydning |
|---|---|---|
RouteRank.First |
0 |
Evalueres før alle andre ruter i sin gruppe |
RouteRank.Unspecified |
32767 |
Som standard, hvis der ikke er angivet nogen rang |
RouteRank.Last |
65535 |
Evalueret efter alle andre ruter i sin gruppe |
Som standard stopper evalueringen ved den første matchende rute. Brug RouteRank.Last som en catch-all fallback, der håndterer alt, der ikke matches af en mere specifik 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);
Aktivér livscykluskroge
Registrer logik, der kører på hver tur, før eller efter rutematchning. Disse kroge er nyttige til logføring, tværgående anliggender og fejlhå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 returnerer false, afbrydes turen, og ingen ruter køres. Når OnAfterTurn returnerer false, bliver turtilstanden ikke gemt.
Brug turtilstand
Agenten indlæser automatisk turtilstand, før dine behandlere kører, og gemmer den bagefter. Turn state-objektet, som videresendes til dine handlere, giver dig adgang til de forskellige scopes, så du kan læse og skrive data, der bevares på tværs af ture eller kun er midlertidige for den aktuelle tur.
- Samtalescope: For data delt på tværs af alle ture i en samtale
- Brugerscope: For data pr. bruger
- Temp-omfang: For data, der kun skal findes under den aktuelle omgang
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);
});
Bemærk!
Brug MemoryStorage til lokal udvikling og test. Til produktionsudrulninger, især udrulninger der kører på flere instanser, brug en lagringsudbyder med vedvarende lagring, såsom Azure Cosmos DB eller Azure Blob Storage. See Brug lagerudbydere i din agent.