הערה
הגישה לדף זה מחייבת הרשאה. באפשרותך לנסות להיכנס או לשנות מדריכי כתובות.
הגישה לדף זה מחייבת הרשאה. באפשרותך לנסות לשנות מדריכי כתובות.
מאמר זה מתאר את השינויים הדרושים להעברה מ- Bot Framework SDK עבור Node.js.
דרישות מוקדמות
- Node.jsגירסה 20 ואילך
- פרוייקט SDK קיים של Bot Framework
- Azure Bot Service (נותר ללא שינוי במהלך ההעברה)
שינויים בקוד SDK של NodeJS
השינויים בסעיף זה נובעים מהבדלים בין Azure Bot Framework SDK לבין Microsoft 365 Agents SDK JavaScript .
משאבים של Azure
המשאבים Azure נותרים ללא שינוי. עליך להפנות אל המאפיינים שלך ב-appsettings עבור MicrosoftAppType, MicrosoftAppId, MicrosoftAppPasswordו- MicrosoftAppTenantId. עם זאת, לא נעשה עוד שימוש בשמות הגדרות אלה ובאפשרותך למחוק אותם במועד מאוחר יותר.
קבל מידע נוסף אודות תצורת סביבה
השלבים הראשונים
החל תחילה את השינויים הבאים כדי לטפל ברוב ההבדלים. עדיין תצטרך לאתר באגים ולבדוק אם יש הבדלים אחרים לאחר החלת שינויים אלה.
עדכון יחסי תלות של חבילה
שינוי זה אינו מיישב את כל מרחבי השמות הדרושים, אך הוא מכסה את כל מרחבי השמות.
| תרחיש | Bot Framework SDK | Agents SDK |
|---|---|---|
| אירוח ליבה | botbuilder |
@microsoft/agents-hosting |
| סכימת פעילות | botframework-schema |
@microsoft/agents-activity |
| תיבות דו-שיח | botbuilder-dialogs |
@microsoft/agents-hosting-dialogs |
| Azure Cosmos DB | botbuilder-azure |
@microsoft/agents-hosting-storage-cosmos |
| אחסון Blob של Azure | botbuilder-azure-blobs |
@microsoft/agents-hosting-storage-blob |
| כלי שירות של שרת Express | הגדרה ידנית | @microsoft/agents-hosting-express |
תוכניות Bot המשתמשות ב- Teams
אם הבוט שלך משתמש ב- Teams, הוסף תלות בחבילה עבור @microsoft/agents-hosting-extensions-teams
עדכון ייבוא/דרישה
השתמש בחיפוש והחלפה כדי לבצע את השינויים הבאים:
| Bot Framework | Agents SDK |
|---|---|
require('botframework-schema'); |
require('@microsoft/agents-activity') |
require('botbuilder'); |
require('@microsoft/agents-hosting') |
require('botbuilder-dialogs'); |
require('@microsoft/agents-hosting-dialogs') |
מחלקת Activity של Agents SDK
@microsoft/agents-activity החבילה כוללת את מחלקת הפעילות לביצוע ניתוח בהתבסס על zod. באפשרותך לנתח ולאמת את הפעילויות המותאמות אישית שלך מ- JSON עם Activity.fromJson() או מתוך אובייקטי JavaScript ליטרליים עם Activity.fromObject().
בנוסף, המחלקה Activity מרכזת את כל הפעולות הקשורות למנה של פעילות, כגון getConversationReference. השיטות בטבלה הבאה הועברו ממופע TurnContext הפעילות הנוכחי ופועלים כעת:
הפעלה ותצורה
מערכת התצורה של Agents SDK מחליפה את ConfigurationBotFrameworkAuthentication המחלקה בממשק AuthConfiguration .
כדי לטעון את התצורה מקובץ ברירת .env המחדל, נעשה שימוש ב- loadAuthConfigFromEnv.
חשוב
משתני התצורה מתוארים במאמר קביעת תצורה של אימות ב- JavaScript.
תצורת סביבה
צור קובץ .env עם המשתנים הבאים:
# Required for Azure Bot Service
clientId=your-app-id
clientSecret=your-app-secret
tenantId=your-tenant-id
# Optional - for local debugging
PORT=3978
DEBUG=true
הערת העברה: עדכן את שמות משתני הסביבה שלך כפי שמוצג בטבלה הבאה:
| Bot Framework SDK | Agents SDK |
|---|---|
MicrosoftAppId |
clientId |
MicrosoftAppPassword |
clientSecret |
MicrosoftAppTenantId |
tenantId |
אימות ואבטחה
כאשר Bot Framework SDK מאשר בקשות נכנסות, הוא כולל אסימוני הרשאה של אסימון אינטרנט JSON (JWT) בערימה. הסוכנים SDK לא. בעת שימוש בזמן ריצה של שרת אינטרנט, כגון express, עליך לקבוע את התצורה של תוכנת ביניים של JWT כדי לאשר בקשות נכנסות בהתבסס על אסימון של נושא JWT, ערכת ה- SDK של Agents מספקת את authorizeJWT(AuthConfiguration) השיטה.
תוכנת ביניים של JWT (נדרשת לייצור):
import { authorizeJWT, loadAuthConfigFromEnv } from '@microsoft/agents-hosting'
const authConfig = loadAuthConfigFromEnv()
server.use(authorizeJWT(authConfig))
פיתוח מקומי:
לאיתור באגים מקומי, ניתן להפוך אימות JWT ללא זמין:
// Only for local development - NEVER in production
if (process.env.NODE_ENV === 'development') {
// JWT validation disabled for local testing
} else {
server.use(authorizeJWT(authConfig))
}
אפשרויות הגדרת שרת
ה- SDK של הסוכנים מספק שתי גישות להגדרת השרת שלך:
השתמש בפעולת השירות startServer
השתמש בגישה פשוטה זו עבור פרוייקטים חדשים כאשר אתה מעוניין בהגדרה מינימלית ואינך זקוק לתוכה אמצעית מותאמת אישית.
עדכן את קוד האתחול שלך מ:botbuilder
const { EchoBot } = require('./bot');
const {
CloudAdapter,
ConfigurationBotFrameworkAuthentication
} = require('botbuilder');
const botFrameworkAuthentication = new ConfigurationBotFrameworkAuthentication(process.env);
const adapter = new CloudAdapter(botFrameworkAuthentication);
const myBot = new EchoBot();
const server = express();
server.use(express.json());
server.post('/api/messages', async (req, res) =>
await adapter.process(req, res, (context) =>
myBot.run(context));
);
לסוכנים מארחים באמצעות startServer():
const { EchoBot } = require('./bot');
const { startServer } = require('@microsoft/agents-hosting-express')
startServer(new EchoBot());
הגדרה ידנית מהירה
השתמש בגישה זו בעת העברת בוטים קיימים, נדרשת תוכנת ביניים מותאמת אישית, רוצה שליטה מלאה על תצורת Express
const { EchoBot } = require('./bot');
const {
CloudAdapter,
loadAuthConfigFromEnv, // Update
authorizeJWT // Update
} = require('@microsoft/agents-hosting'); // Update
const authConfig = loadAuthConfigFromEnv(); // Update
const adapter = new CloudAdapter(authConfig); // Update
const myBot = new EchoBot();
const server = express();
server.use(express.json());
server.use(authorizeJWT(authConfig)); // Update
server.post('/api/messages', async (req, res) =>
await adapter.process(req, res, (context) =>
myBot.run(context));
);
const port = process.env.PORT || 3978;
server.listen(port, () => {
console.log(`Server listening on port ${port}`);
}).on('error', (err) => {
console.error('Server failed to start:', err);
process.exit(1);
});
תמיכה עבור ActivityHandler
רוב בוטים שנוצרו באמצעות ה- SDK של Bot Framework מבוססים על מחלקת botbuilder-core.ActivityHandler הבסיס.
ה- SDK של Agents מספק תואם agents-hosting.ActivityHandler ששומרת על אותו משטח API להעברה קלה יותר.
הבדלים עיקריים
להלן כמה הבדלים עיקריים בין ה- SDK של Bot Framework לבין ה- SDK Agents:
פרמטרים של מטפל:
| SDK | סוג מטפל |
|---|---|
| Bot Framework SDK | BotHandler |
| Agents SDK | AgentHandler |
שיטות נוספות ב- Agents SDK:
| שיטה | תיאור |
|---|---|
onMessageDelete |
טיפול בפעילויות מחיקת הודעות |
onMessageUpdate |
מטפל בפעילויות עדכון הודעות |
onSignInInvoke |
מטפל בפעילויות קריאה של כניסה |
מתודות חסרות ב-SDK של סוכנים:
| שיטה | סיבה |
|---|---|
onCommand |
פעילויות פקודה אינן נתמכות |
onCommandResult |
אין תמיכה בפעילויות תוצאת פקודה |
onEvent |
טיפול כללי באירועים (סוגי אירועים ספציפיים, כגון onTokenResponseEvent עדיין נתמכים) |
onTokenResponseEvent |
אירועי תגובה של אסימון OAuth |
שינויים בחתימת שיטה:
כל פעולות השירות של המטפל מחזירות ActivityHandler במקום this עבור שרשרת פעולות שירות. פונקציות המטפל משתמשות בסוג AgentHandler , בעל אותה חתימה כמו BotHandler
דוגמה להעברה:
Bot Framework SDK:
const { ActivityHandler } = require('botbuilder');
class MyBot extends ActivityHandler {
constructor() {
super();
this.onMessage(async (context, next) => {
await context.sendActivity('Hello!');
await next();
});
}
}
ההעברה פשוטה בעיקר, כאשר השינוי הראשי הוא משפט הייבוא וסוג המטפל. רוב תוכניות ה- ActivityHandlerBot הקיימות המבוססות על צריכות לפעול עם שינויים מינימליים.
חשוב
ה ActivityHandler - אינו נמצא עוד בשימוש לטובת הכיתה AgentApplication החדשה
מיגרציה מActivityHandler לAgentApplication
למרות ActivityHandler שהגישה המומלצת נתמכת לצורך תאימות לאחור, היא להשתמש ב- AgentApplication:
באמצעות ActivityHandler:
import { ActivityHandler } from '@microsoft/agents-hosting'
class MyBot extends ActivityHandler {
constructor() {
super()
this.onMessage(async (context, next) => {
await context.sendActivity('Hello!')
await next()
})
this.onMembersAdded(async (context, next) => {
await context.sendActivity('Welcome!')
await next()
})
}
}
הבדלים עיקריים
הטבלה הבאה מתארת הבדלי תכונות עיקריים בין ActivityHandler :AgentApplication
| תכונה | ActivityHandler |
AgentApplication |
|---|---|---|
| ניהול מדינה | נדרש ניהול מצב ידני | המערכת כוללת ניהול מצבים מובנה |
| טיפול באירועים | מטפלים כלליים באירועים (לדוגמה, onMembersAdded) |
מטפלים באירועים ספציפיים יותר (לדוגמה, membersAdded) |
| הפונקציה הבאה | מטפלים דורשים שיחות next() |
מטפלים אינם דורשים שיחות next() |
| אחסון | תצורת אחסון ידני | תמיכה מוכללת באחסון עם עקביות מצב אוטומטית |
תבניות העברה נפוצות
להלן כמה תבניות העברה נפוצות:
Simple Echo Bot
Bot Framework
const { ActivityHandler } = require('botbuilder')
class EchoBot extends ActivityHandler {
constructor() {
super()
this.onMessage(async (context, next) => {
await context.sendActivity(`You said: ${context.activity.text}`)
await next()
})
}
}
ניהול מצבים
באמצעות AgentApplication:
import { AgentApplication, MemoryStorage } from '@microsoft/agents-hosting'
const agent = new AgentApplication({
storage: new MemoryStorage()
})
agent.onMessage('/count', async (context, state) => {
const count = state.conversation.count ?? 0
state.conversation.count = count + 1
await context.sendActivity(`Count: ${state.conversation.count}`)
})
ירושה מ-AgentApplication
עבור תרחישים מורכבים יותר, באפשרותך ליצור מחלקה היורשת מ:AgentApplication
import { AgentApplication, MemoryStorage, MessageFactory } from '@microsoft/agents-hosting'
class MyAgent extends AgentApplication {
constructor() {
super({
storage: new MemoryStorage()
})
this.setupRoutes()
}
setupRoutes() {
this.onMessage('/help', this.handleHelp)
this.onMessage('/status', this.handleStatus)
this.onMessage('/reset', this.handleReset)
this.onActivity('message', this.handleDefault)
this.onConversationUpdate('membersAdded', this.handleWelcome)
}
handleHelp = async (context, state) => {
const helpText = `
Available commands:
- /help - Show this help message
- /status - Show current status
- /reset - Reset conversation state
`
await context.sendActivity(MessageFactory.text(helpText))
}
handleStatus = async (context, state) => {
const messageCount = state.conversation.messageCount ?? 0
await context.sendActivity(`Messages processed: ${messageCount}`)
}
handleReset = async (context, state) => {
state.deleteConversationState()
await context.sendActivity('Conversation state has been reset.')
}
handleWelcome = async (context, state) => {
const welcomeText = 'Welcome! Type /help to see available commands.'
await context.sendActivity(MessageFactory.text(welcomeText))
}
handleDefault = async (context, state) => {
// Increment message counter
const messageCount = (state.conversation.messageCount ?? 0) + 1
state.conversation.messageCount = messageCount
const replyText = `Echo: ${context.activity.text} (Message #${messageCount})`
await context.sendActivity(MessageFactory.text(replyText))
}
}
export default new MyAgent()
היתרונות של תבנית זו
| יתרונות | תיאור |
|---|---|
| ארגון טוב יותר | הפרד שיטות למטפלים שונים |
| שימוש חוזר | ניתן להרחיב או לקבל בירושה בקלות |
| יכולת בדיקה | ניתן לבדוק שיטות בודדות ליחידות |
| יכולת שמירה | מבנה קוד נקי יותר עבור בוטים מורכבים |
| פונקציות חץ | קשור את this באופן אוטומטי ללא צורך ב.bind() |