Azure Bot Framework SDK Microsoft 365 Agents SDK הדרכה להעברה עבור nodejs

מאמר זה מתאר את השינויים הדרושים להעברה מ- 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 הפעילות הנוכחי ופועלים כעת:

שיטה סטטית של Bot Framework שיטת מופע של הוראות SDK עבור סוכנים
TurnContext.applyConversationReference activity.applyConversationReference
TurnContext.getConversationReference activity.getConversationReference
TurnContext.getReplyConversationReference activity.getReplyConversationReference
TurnContext.removeRecipientMention activity.removeRecipientMention
TurnContext.getMentions activity.getMentions
TurnContext.removeMentionText activity.removeMentionText

הפעלה ותצורה

מערכת התצורה של 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()