הערה
הגישה לדף זה מחייבת הרשאה. באפשרותך לנסות להיכנס או לשנות מדריכי כתובות.
הגישה לדף זה מחייבת הרשאה. באפשרותך לנסות לשנות מדריכי כתובות.
AgentApplication הוא אבן הבניין המרכזית של סוכן שנבנה עם ערכת הפיתוח של הסוכנים (Agents SDK).
AgentApplication היא נקודת הכניסה עבור כל הפעילות הנכנסת, כולל הודעות ממשתמשים, אירועי מחזור חיי שיחה, אינטראקציות כרטיס מסתגלות, התקשרויות חזרה של OAuth.
סוכן הוא, בליבתו, AgentApplication. קבע את תצורתו עם מטפלים שמתארים מה הסוכן שלך עושה. ה- SDK דואג לניתוב, לניהול מצבים ולתשתית הנדרשת להפעלתו.
כיצד פועל AgentApplication
לכל סוכן יש מחזור חיים המתחילה כאשר ערוץ (Microsoft Teams, שירות Bot או לקוח מותאם אישית) מספק פעילות לנקודות הקצה של הסוכן שלך.
AgentApplication נמצא במרכז מחזור חיים זה:
Channel → Hosting layer → AgentApplication → Your handlers
שכבות העיבוד בסוכן שנבנה באמצעות ה- SDK Agents פועלות באופן הבא:
- שכבת האירוח מקבלת את בקשת ה- HTTP ו מאמתת אותה.
-
AgentApplicationמעבד את הפעילות הנכנסת דרך הצינור שלו. - המטפלים שלכם נקראים על סמך נתיבים תואמים.
הסוכן שלך טוען מצב הפעלה לפני שהמטפלים שלך פועלים. לאחר מכן, הסוכן שומר את מצב ההפעלה.
מושגים עיקריים
פעילויות
הכול בערכת ה-SDK של סוכנים זורם כפעילות. פעילות היא הודעה מובנית המייצגת משהו שקרה. לפעילות יש סוג, כגון הודעה, אירוע, הפעלה, conversationUpdate וכן הלאה. היא נושאת מטען הרלוונטי לסוג זה.
AgentApplication מקבל פעילויות ומנתב אותן למטפל הנכון.
נתיבי
נתיב מצמיד בורר למטפל. בורר קובע אם נתיב תואם לפעילות הנוכחית. המטפל מפעיל את הלוגיקה שלך כאשר הנתיב תואם.
רשום נתיבים בעת קביעת התצורה של הסוכן שלך. הם יכולים לבצע התאמה
- הודעה המכילה טקסט ספציפי או תואמת לביטוי רגיל
- כל פעילות מסוג נתון
- אירועי מחזור חיי שיחה (חבר נוסף, חבר הוסר)
- פעולות כרטיס מסתגל
- תנאים מותאמים אישית
כאשר מגיעה פעילות, המערכת מעריכה מסלולים לפי הסדר עד שהיא מוצאת התאמה. כברירת מחדל, רק נתיב אחד פועל.
מצב סיבוב
AgentApplication מנהלת את מצב _turn - אחסון מובנה המחולק לטווחים:
| סוג היקף | תיאור |
|---|---|
| שיחה | משותף לכל המשתמשים בשיחה, נשמר בין פניות |
| משתמש | מותאם למשתמש יחיד בכל השיחות |
| Temp | הפנייה הנוכחית בלבד - לא נשמרת לעולם |
המערכת טוענת באופן אוטומטי את המצב לפני שההידרים שלך פועלים ושומרת אותו באופן אוטומטי לאחר מכן.
הקשר פנייה
כאשר מטפל פועל, הוא מקבל הקשר פנייה. הקשר פנייה הוא תמונת מצב של הפעילות הנוכחית, חיבור המתאם וכלי שירות לשליחת תגובות. הקשר הפנייה הוא הממשק שלכם לאינטראקציה הנוכחית.
תוכנת ביניים
AgentApplication תומך בצינור middleware. תוכנת ביניים היא שרשרת של רכיבים שמעבדים כל סיבוב לפני ואחרי שהמטפלים שלך פועלים. תוכנת ביניים יכולה לבדוק, להמיר או לקצר את זרימת הפעילות. שימושים נפוצים כוללים רישום, בדיקת אימות ורגילת בקשות.
יצירת סוכן
תת-מחלקה AgentApplication ורשום את המטפלים שלך בקונסטרקטור. מסגרת האירוח מזריקה באופן אוטומטי 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);
}
}
רשום את הסוכן שלך ב: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();
רשום מטפלים בפעילות
טיפול בהודעות
התאם הודעות לפי טקסט מדויק (לא תלוי רישיות):
OnMessage("help", async (context, state, ct) =>
{
await context.SendActivityAsync("Here's what I can do...", cancellationToken: ct);
});
התאם הודעות באמצעות ביטוי רגיל:
OnMessage(new Regex(@"^order\s+\d+$", RegexOptions.IgnoreCase), async (context, state, ct) =>
{
await context.SendActivityAsync("Looking up your order...", cancellationToken: ct);
});
טיפול בעדכונים בשיחות
רשום מטפלים עבור אירועי מחזור חיים של שיחות כגון חברים מצטרפים או עוזבים.
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
});
טיפול בכל סוג פעילות
התאם פעילות כלשהי לפי מחרוזת הסוג שלה כדי לשלוט באופן מלא בניתוב.
OnActivity(ActivityTypes.Message, async (context, state, ct) =>
{
// Handles all message activities
});
OnActivity(ActivityTypes.Event, async (context, state, ct) =>
{
// Handles event activities
});
השתמש ActivityTypes בקבועים במקום במחרוזות מקודדות.
שליטה בסדר הערכת נתיב
המערכת ממיין נתיבים לתוך סדר הערכה קבועה בעת רישום שלהם, לא בזמן ריצה. המיון משתמש בשתי רמות:
סוג ניתוב: המערכת מנתבת לפי סוג, והיא תמיד מעריכה סוגי עדיפות גבוהה יותר לפני סוגי עדיפות נמוכה יותר, ללא קשר לדרגות:
עדיפות סוג נתיב 1 (הגבוה ביותר) נתיבי קריאה של סוכן 2 נתיבי קריאה (פעולות כרטיסים מסתגלים, קריאות חוזרות של OAuth וקריאות קריאה רגישות זמן אחרות) 3 נתיבי סוכן 4 (הנמוך ביותר) כל הנתיבים האחרים דירוג: בתוך כל קבוצת סוגי ניתוב, הזמנות המערכת מנותב לפי ערך הדירוג שלהן. ערכים מספריים נמוכים נבדקים תחילה.
השתמש RouteRank בקבועים כדי להגדיר דירוג בעת רישום מטפל:
| קבוע | ערך: | משמעות |
|---|---|---|
RouteRank.First |
0 |
הערכה לפני כל הנתיבים האחרים בקבוצה |
RouteRank.Unspecified |
32767 |
ברירת מחדל כאשר לא צוין דירוג |
RouteRank.Last |
65535 |
מוערכים לאחר כל הנתיבים האחרים בקבוצה שלהם |
כברירת מחדל, ההערכה נעצרת בנתיב הראשון שמתאים. השתמש RouteRank.Last לחזרה כוללת שמטפלת בכל הפריטים שאינם תואמים לתוואי ספציפי יותר.
// 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);
נקודות חיבור של מחזור חיי פנייה
רשום לוגיקה הפועלת בכל סיבוב, לפני או אחרי התאמת נתיב. נקודות חיבור אלה שימושיות לרישום ביומן, לטיפול בהיבטים רוחביים ולטיפול בשגיאות.
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, הפנייה מבוטלת ולא מופעלים נתיבים. כאשר OnAfterTurn מחזירה false, מצב turn אינו נשמר.
השתמש במצב 'סיבוב'
הסוכן טוען אוטומטית מצב הפעלה לפני שהמטפלים שלך פועלים ושומר אותו לאחר מכן. אובייקט מצב התור שהועבר למטפלים מעניק לך גישה לטווחים השונים כדי שתוכל לקרוא ולכתוב נתונים המתמשכים לאורך תורים או זמניים עבור התור הנוכחי:
- טווח שיחה: עבור נתונים שמועברים בכל הפעמים בשיחה
- טווח משתמש: עבור נתונים לפי משתמש
- טווח זמני: עבור נתונים קיימים רק במהלך הפעולה הנוכחית
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);
});
הערה
השתמש MemoryStorage לפיתוח ולבדיקות מקומיות. עבור פריסות ייצור, במיוחד פריסות הפועלות במופעים מרובים, השתמש ספק אחסון מתמיד כגון Azure Cosmos DB או Azure Blob Storage. ראה שימוש בספקי אחסון בסוכן שלך.