Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
AgentApplication är det centrala byggblocket för en agent som skapats med Agents SDK.
AgentApplication är startpunkten för all inkommande aktivitet, inklusive meddelanden från användare, konversationslivscykelhändelser, adaptiva kortinteraktioner, OAuth-återanrop.
En agent är i grunden en AgentApplication. Du konfigurerar den med hanterare som beskriver vad din agent gör. SDK:et tar hand om routning, tillståndshantering och den infrastruktur som krävs för att köra den.
Så här fungerar AgentApplication
Varje agent har en livscykel som startar när en kanal (Microsoft Teams, en robottjänst eller en anpassad klient) levererar en aktivitet till agentens slutpunkt.
AgentApplication sitter i mitten av livscykeln:
Channel → Hosting layer → AgentApplication → Your handlers
Skikten för bearbetning i en agent som skapats med Agents SDK fungerar på följande sätt:
- Värdlagret tar emot HTTP-begäran och autentiserar den.
-
AgentApplicationbearbetar den inkommande aktiviteten via sin pipelina. - Dina hanterare anropas baserat på matchande rutter.
Din agent läser in utförelsetillstånd innan dina hanterare körs. Därefter sparar agenten turtillståndet.
Grundläggande begrepp
Aktiviteter
Allt i Agents SDK flödar som en aktivitet. En aktivitet är ett strukturerat meddelande som representerar något som har hänt. En aktivitet har en typ, till exempel meddelande, händelse, invoke, conversationUpdate och så vidare. Den har en nyttolast som är relevant för denna typ.
AgentApplication tar emot aktiviteter och dirigerar dem till rätt hanterare.
Routes
En rutt parkopplar en väljare med en hanterare. Väljaren avgör om en väg matchar den aktuella aktiviteten. Hanteraren kör din logik vid matchning av rutten.
Registrera vägar när du konfigurerar din agent. De kan matcha:
- Ett meddelande som innehåller specifik text eller matchar ett reguljärt uttryck
- Alla aktiviteter av en viss typ
- Konversationslivscykelhändelser (medlem tillagd, medlem borttagen)
- Anpassningsbara kortåtgärder
- Anpassade villkor
När en aktivitet anländer utvärderar systemet rutter i ordning tills det hittar en matchning. Standardmässigt körs bara en rutt.
Svängtillstånd
AgentApplication hanterar _turn state—strukturerad lagring som är uppdelad i områden:
| Omfattningstyp | beskrivning |
|---|---|
| Konversation | Delas mellan alla användare i en konversation, lagras mellan omgångar |
| Användare | Begränsad till en enskild användare i alla konversationer |
| Temp | Endast aktuell omgång – sparas inte |
Systemet läser automatiskt in tillstånd innan dina hanterare körs och sparar det automatiskt efteråt.
Slå på kontext
När en hanterare körs får den en turkontext. Turn-kontext är en ögonblicksbild över den pågående aktiviteten, adapteranslutningen och verktyg för att skicka svar. Turkontexten är ditt gränssnitt till den aktuella interaktionen.
Middleware
AgentApplication stöder en pipeline för mellanprogram. Mellanprogram är en kedja av komponenter som bearbetar varje tur före och efter att dina hanterare har körts. Mellanprogram kan inspektera, transformera eller kortsluta aktivitetsflödet. Vanliga användningsområden är loggning, autentiseringskontroller och normalisering av begäranden.
Skapa en handläggare
Skapa en underklass och registrera dina hanterare i konstruktorn. Värdramverket infogar automatiskt 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);
}
}
Registrera 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();
Registrera aktivitetshanterare
Hantera meddelanden
Matcha meddelanden med exakt text (skiftlägesokänsligt):
OnMessage("help", async (context, state, ct) =>
{
await context.SendActivityAsync("Here's what I can do...", cancellationToken: ct);
});
Matcha meddelanden med ett reguljärt uttryck:
OnMessage(new Regex(@"^order\s+\d+$", RegexOptions.IgnoreCase), async (context, state, ct) =>
{
await context.SendActivityAsync("Looking up your order...", cancellationToken: ct);
});
Hantera konversationsuppdateringar
Registrera hanterare för konversationslivscykelhändelser, till exempel medlemmar som ansluter till eller lämnar.
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
});
Hantera alla aktivitetstyper
Matcha alla aktiviteter med dess typsträng för fullständig kontroll över routning.
OnActivity(ActivityTypes.Message, async (context, state, ct) =>
{
// Handles all message activities
});
OnActivity(ActivityTypes.Event, async (context, state, ct) =>
{
// Handles event activities
});
Använd ActivityTypes konstanter i stället för hårdkodade strängar.
Kontrollera utvärderingsordningen för rutter
Systemet sorterar vägar i en fast utvärderingsordning när du registrerar dem, inte vid körning. Sorteringen använder två nivåer:
Vägtyp: Systemet grupperar vägar efter typ och utvärderar alltid typer med högre prioritet före typer med lägre prioritet, oavsett rangordning:
Prioritet Routningstyp 1 (högsta) Agentiska anropar vägar 2 Anropa rutter (anpassningsbara kortåtgärder, OAuth-återanrop och andra tidskänsliga anrop) 3 Agentiska vägar 4 (lägst) Alla andra vägar Rangordning: Inom varje vägtypsgrupp beställer systemet vägar efter deras rankningsvärde. Lägre numeriska värden utvärderas först.
Använd RouteRank konstanter för att ange rangordning när du registrerar en hanterare:
| Konstant | Value | Betydelse |
|---|---|---|
RouteRank.First |
0 |
Utvärderas före alla andra vägar i gruppen |
RouteRank.Unspecified |
32767 |
Standard när ingen rangordning har angetts |
RouteRank.Last |
65535 |
Utvärderas efter alla andra rutter i gruppen |
Som standardläge avbryts utvärderingen vid den första matchande rutan. Använd RouteRank.Last som en "catch-all"-reserv som hanterar allt som inte matchas av en mer specifik rutt.
// 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);
Aktivera livscykelkrokar
Registrera logik som körs på varje tur, före eller efter vägmatchning. Dessa krokar är användbara för loggning, övergripande problem och felhantering.
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 returnerar false, avbryts svängen och inga rutter körs. När OnAfterTurn returnerar false, sparas inte svängtillståndet.
Använda rotationstillstånd
Agenten läser automatiskt in växlingsstatus före dina hanterare körs och sparar det efteråt. Turtillståndsobjektet som skickas till dina hanterare ger dig åtkomst till de olika omfången så att du kan läsa och skriva data som bevaras över svängar eller är tillfälliga för den aktuella svängen:
- Konversationsomfång: För data som delas över alla rundor i en konversation
- Användaromfång: För data per användare
- Temp-omfång: För data som bara behöver finnas under den aktuella svängen
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);
});
Anmärkning
Använd MemoryStorage för lokal utveckling och testning. För produktionsdistributioner, särskilt distributioner som körs på flera instanser, använder du en beständig lagringsprovider, till exempel Azure Cosmos DB eller Azure Blob Storage. Se Använd lagringsproviders i din agent.
Nästa steg
- Hantera tillstånd i Agents SDK
- Använd lagringsproviders i din agent