Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
AgentApplication Agents SDK ile oluşturulmuş bir ajanın merkezi yapı taşıdır.
AgentApplication kullanıcılardan gelen iletiler, konuşma yaşam döngüsü olayları, uyarlamalı kart etkileşimleri, OAuth geri çağırmaları dahil olmak üzere tüm gelen etkinliklerin giriş noktasıdır.
Bir aracı özünde AgentApplication'dır. Aracınızın ne yaptığını açıklayan işleyicilerle yapılandırabilirsiniz. SDK yönlendirme, durum yönetimi ve bunu çalıştırmak için gereken altyapıyla ilgilenir.
AgentApplication nasıl çalışır?
Her aracının yaşam döngüsü, bir kanal (Microsoft Teams, bir bot hizmeti veya özel bir istemci) bir etkinliği aracın uç noktasına teslim ettiğinde başlar.
AgentApplication o yaşam döngüsünün merkezinde yer alır.
Channel → Hosting layer → AgentApplication → Your handlers
Aracılar SDK'sı ile oluşturulan bir aracıda işleme katmanları aşağıdaki gibi çalışır:
- Barındırma katmanı HTTP isteğini alır ve kimliğini doğrular.
-
AgentApplication, gelen etkinliği işlem hattı aracılığıyla işler. - İşleyicileriniz yolların eşleşmesine bağlı olarak çağrılır.
İşleyicileriniz çalışmadan önce aracınız işlem durumunu yükler. Daha sonra aracı tur durumunu kaydeder.
Temel kavramlar
Faaliyetler
Aracılar SDK'sı içindeki her şey bir etkinlik olarak akar. Etkinlik, gerçekleşen bir şeyi temsil eden yapılandırılmış bir iletidir. Etkinliğin ileti, olay, çağırma, konuşmaGüncelleştirme vb. gibi bir türü vardır. Bu türe uygun bir yük taşır.
AgentApplication etkinlikleri alır ve doğru işleyiciye yönlendirir.
Routes
Bir yol, bir seçici ile bir işleyiciyi eşleştirir. Seçici, bir yolun geçerli etkinlikle eşleşip eşleşmediğini belirler. İşleyici, yol eşleştiğinde mantığınızı çalıştırır.
Temsilcinizi konfigüre ettiğinizde yönlendirmeleri kaydedin. Bunlar eşleşebilir:
- Belirli bir metin içeren veya normal ifadeyle eşleşen bir ileti
- Belirli bir türe ait herhangi bir etkinlik
- Konuşma yaşam döngüsü olayları (üye eklendi, üye kaldırıldı)
- Uyarlamalı kart eylemleri
- Özel koşullar
Bir etkinlik geldiğinde, sistem bir eşleşme bulana kadar yolları sırayla değerlendirir. Varsayılan olarak, yalnızca bir yol çalışır.
Dönüş durumu
AgentApplication _turn durumunu yönetir; yapılandırılmış depolama kapsamlara ayrılmıştır:
| Kapsam türü | Açıklama |
|---|---|
| Konuşma | Konuşmadaki tüm kullanıcılar arasında paylaşılır ve diyalog adımları arasında kalıcılığını sürdürür |
| Kullanıcı | Tüm konuşmalar için bir kullanıcıya sınırlandırılmıştır |
| Şablon | Yalnızca geçerli tur - hiçbir zaman kalıcı değil |
Sistem, işleyicileriniz çalışmadan önce durumu otomatik olarak yükler ve daha sonra otomatik olarak kaydeder.
Bağlamı değiştir
İşleyici çalıştığında bir dönüş bağlamı alır. Tur bağlamı, geçerli etkinlik, bağdaştırıcı bağlantısı ve yanıt gönderme araçlarının anlık görüntüsüdür. Tur bağlamı, geçerli etkileşime olan arabiriminizdir.
Middleware
AgentApplication bir ara yazılım hattını destekler. Ara yazılım, işleyicileriniz çalışmadan önce ve çalıştıktan sonra her işlem aşamasını işleyen bir bileşen zinciridir. Ara yazılım etkinlik akışını inceleyebilir, dönüştürebilir veya kısa devre yapabilir. Yaygın olarak kullanılan örnekler arasında log kaydı, kimlik doğrulama denetimleri ve istek normalleştirmesi bulunmaktadır.
Bir ajan oluştur
Alt sınıf AgentApplication oluşturun ve oluşturucuda işleyicilerinizi kaydedin. Barındırma çerçevesi otomatik olarak ekler 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);
}
}
Ajanınızı Program.cs içinde kaydedin:
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();
Etkinlik işleyicilerini kaydetme
İletileri işleme
İletileri tam metne göre eşleştir (büyük/küçük harfe duyarsız):
OnMessage("help", async (context, state, ct) =>
{
await context.SendActivityAsync("Here's what I can do...", cancellationToken: ct);
});
Normal ifade kullanarak iletileri eşleştirme:
OnMessage(new Regex(@"^order\s+\d+$", RegexOptions.IgnoreCase), async (context, state, ct) =>
{
await context.SendActivityAsync("Looking up your order...", cancellationToken: ct);
});
Konuşma güncellemelerini yönetme
Üyelerin katılması veya ayrılması gibi konuşma yaşam döngüsü olayları için işleyicileri kaydedin.
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
});
Herhangi bir etkinlik türünü işleme
Yönlendirme üzerinde tam denetim için herhangi bir etkinliği tür dizesine göre eşleştirin.
OnActivity(ActivityTypes.Message, async (context, state, ct) =>
{
// Handles all message activities
});
OnActivity(ActivityTypes.Event, async (context, state, ct) =>
{
// Handles event activities
});
Sabit kodlanmış dizeler yerine sabitleri kullanın ActivityTypes .
Rota değerlendirme sırasını denetleme
Sistem, yolları çalışma zamanında değil, kayıt sırasında belirli bir değerlendirme sırasına göre sıralar. Sıralamada iki düzey kullanılır:
Yol türü: Sistem yolları türe göre gruplandırır ve derecesine bakılmaksızın her zaman düşük öncelikli türlerden önce yüksek öncelikli türleri değerlendirir:
Öncelik Yol türü 1 (en yüksek) Ajan tabanlı çağırma yolları 2 Rotaları çağırma (uyarlamalı kart eylemleri, OAuth geri çağırmaları ve zamana duyarlı diğer çağrılar) 3 Aracı tabanlı rotalar 4 (en düşük) Diğer tüm yollar Derece: Her yol türü grubunda sistem, rotaları sıralama değerlerine göre sıralar. Önce daha düşük sayısal değerler değerlendirilir.
İşleyici kaydederken dereceyi ayarlamak için sabitleri kullanın RouteRank :
| Sabit | Değer | Anlamı |
|---|---|---|
RouteRank.First |
0 |
Grubundaki diğer tüm yollardan önce değerlendirildi |
RouteRank.Unspecified |
32767 |
Derece belirtilmediğinde varsayılan değer |
RouteRank.Last |
65535 |
Grubundaki diğer tüm yollardan sonra değerlendirildi |
Varsayılan olarak, değerlendirme ilk eşleşen yolda durur. Daha belirli bir rotayla eşleşmeyen her şeyi işleyen genel bir geri dönüş için RouteRank.Last kullanın.
// 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);
Tur yaşam döngüsü kancaları
Yol eşleştirmeden önce veya sonra her dönüşte çalışan mantığı kaydedin. Bu bağlantılar günlük kaydı, çapraz ilgilendiren sorunlar ve hata işleme için kullanışlıdır.
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);
});
OnBeforeTurn, false döndürdüğünde, tur iptal edilir ve hiçbir rota çalıştırılmaz.
OnAfterTurn döndüğünde, false dönüş durumu kaydedilmez.
Dönüş durumunu kullan
Aracı, işleyicileriniz çalışmadan önce tur durumunu otomatik olarak yükler ve daha sonra kaydeder. İşleyicilerinize geçirilen tur durumu nesnesi, farklı kapsamlara erişmenizi sağlar; böylece sırayla kalıcı olan veya geçerli tur için kısa ömürlü olan verileri okuyup yazabilirsiniz:
- Konuşma kapsamı: Bir konuşmadaki tüm turlarda paylaşılan veriler için
- Kullanıcı kapsamı: Kullanıcı başına veriler için
- Geçici kapsam: Yalnızca geçerli tur sırasında mevcut olması gereken veriler için
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);
});
Uyarı
Yerel geliştirme ve test için kullanın MemoryStorage . Üretim dağıtımları, özellikle birden çok örnekte çalışan dağıtımlar için Azure Cosmos DB veya Azure Blob Depolama gibi kalıcı bir depolama sağlayıcısı kullanın. Bkz Aracınızda depolama sağlayıcılarını kullanma.