नोट
इस पेज तक पहुँच के लिए प्रमाणन की आवश्यकता होती है. आप साइन इन करने या निर्देशिकाओं को बदलने का प्रयास कर सकते हैं.
इस पेज तक पहुँच के लिए प्रमाणन की आवश्यकता होती है. आप निर्देशिकाओं को बदलने का प्रयास कर सकते हैं.
यह आलेख वर्णन करता है कि Node.jsके लिए Bot Framework SDK से माइग्रेट करने के लिए आवश्यक परिवर्तन .
पूर्वावश्यकताएँ
- Node.js संस्करण 20 या उच्चतर
- मौजूदा बॉट फ्रेमवर्क एसडीके परियोजना
- Azure Bot Service संसाधन (माइग्रेशन के दौरान अपरिवर्तित रहता है)
NodeJS SDK कोड परिवर्तन
इस खंड में परिवर्तन
Azure संसाधन
आपके Azure संसाधन अपरिवर्तित रहते हैं. आपको अपनी appsettings गुणों को MicrosoftAppType, MicrosoftAppId, MicrosoftAppPassword, और MicrosoftAppTenantId के लिए संदर्भित करने की आवश्यकता है। हालाँकि, उन सेटिंग नामों का अब उपयोग नहीं किया जाता है और बाद में हटाया जा सकता है।
परिवेश कॉन्फ़िगरेशन के बारे में अधिक जानें
प्रथम चरण
अधिकांश अंतरों को संबोधित करने के लिए पहले निम्नलिखित परिवर्तन लागू करें। इन परिवर्तनों को लागू करने के बाद भी आपको डीबग करना होगा और अन्य अंतरों की जांच करनी होगी।
पैकेज निर्भरताएँ अद्यतन करें
यह परिवर्तन सभी आवश्यक नामस्थानों को व्यवस्थित नहीं करता है, लेकिन यह उनमें से अधिकांश को कवर करता है।
| परिदृश्य | बॉट फ्रेमवर्क 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 |
| Azure Blob Storage | botbuilder-azure-blobs |
@microsoft/agents-hosting-storage-blob |
| एक्सप्रेस सर्वर उपयोगिताओं | म्यानुअल सेटअप | @microsoft/agents-hosting-express |
टीमों का उपयोग करने वाले बॉट
यदि आपका बॉट टीमों का उपयोग करता है, तो इसके लिए पैकेज निर्भरता जोड़ें @microsoft/agents-hosting-extensions-teams
इम्पोर्ट्स/रिक्वायर अद्यतन करें
निम्न परिवर्तन करने के लिए ढूँढें और बदलें का उपयोग करें:
| बॉट फ्रेमवर्क | एजेंट एसडीके |
|---|---|
require('botframework-schema'); |
require('@microsoft/agents-activity') |
require('botbuilder'); |
require('@microsoft/agents-hosting') |
require('botbuilder-dialogs'); |
require('@microsoft/agents-hosting-dialogs') |
एजेंट SDK गतिविधि वर्ग
पैकेज में @microsoft/agents-activityzod के आधार पर पार्सिंग करने के लिए Activity class शामिल है। आप JSON से Activity.fromJson() या शाब्दिक JavaScript ऑब्जेक्ट से अपनी कस्टम गतिविधियों को पार्स और मान्य कर सकते हैं Activity.fromObject()।
इसके अतिरिक्त, Activity वर्ग गतिविधि पेलोड से संबंधित सभी कार्यों को केंद्रीकृत करता है, जैसे getConversationReference। निम्न तालिका में वर्णित विधियाँ TurnContext से स्थानांतरित की गई हैं और अब वर्तमान गतिविधि उदाहरण पर कार्य करती हैं:
स्टार्टअप और कॉन्फ़िगरेशन
एजेंट SDK कॉन्फ़िगरेशन सिस्टम ConfigurationBotFrameworkAuthentication वर्ग को AuthConfiguration इंटरफ़ेस से बदल देता है।
डिफ़ॉल्ट .env फ़ाइल से कॉन्फ़िगरेशन लोड करने के लिए loadAuthConfigFromEnv का उपयोग करें।
महत्वपूर्ण
कॉन्फ़िगरेशन चर जावास्क्रिप्ट में प्रमाणीकरण कॉन्फ़िगर करें में वर्णित हैं।
पर्यावरण विन्यास
निम्न चर के साथ एक .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
माइग्रेशन नोट: अपने परिवेश चर नामों का अद्यतन करें जैसा कि निम्न तालिका में दिखाया गया है:
| बॉट फ्रेमवर्क SDK | एजेंट एसडीके |
|---|---|
MicrosoftAppId |
clientId |
MicrosoftAppPassword |
clientSecret |
MicrosoftAppTenantId |
tenantId |
प्रमाणीकरण और सुरक्षा
जब Bot Framework SDK आने वाले अनुरोधों को अधिकृत करता है, तो इसमें स्टैक में JSON वेब टोकन (JWT) प्राधिकरण टोकन शामिल होते हैं। एजेंट एसडीके कार्य नहीं करता है। एक्सप्रेस जैसे वेब सर्वर रनटाइम का उपयोग करते समय आपको JWT बियरर टोकन के आधार पर आने वाले अनुरोधों को अधिकृत करने के लिए JWT मिडलवेयर को कॉन्फ़िगर करना होगा, एजेंट SDK विधि प्रदान करता है 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 आपके सर्वर को सेट करने के लिए दो तरीके प्रदान करता है:
स्टार्टसर्वर विधि का उपयोग करें
नई परियोजनाओं के लिए इस सरलीकृत दृष्टिकोण का उपयोग करें जब आप न्यूनतम सेटअप चाहते हैं और कस्टम मिडलवेयर की आवश्यकता नहीं है।
अपना आरंभीकरण कोड यहां से 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());
मैनुअल एक्सप्रेस सेटअप
मौजूदा बॉट्स माइग्रेट करते समय इस दृष्टिकोण का उपयोग करें, कस्टम मिडलवेयर की आवश्यकता है, एक्सप्रेस कॉन्फ़िगरेशन पर पूर्ण नियंत्रण चाहते हैं
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 समर्थन
बॉट फ्रेमवर्क एसडीके के साथ बनाए गए अधिकांश बॉट बेस क्लास पर botbuilder-core.ActivityHandler आधारित होते हैं।
एजेंट एसडीके एक संगत agents-hosting.ActivityHandler प्रदान करता है जो आसान माइग्रेशन के लिए समान एपीआई सतह को बनाए रखता है।
मुख्य अंतर
बॉट फ्रेमवर्क एसडीके और एजेंट एसडीके के बीच कुछ प्रमुख अंतरों में शामिल हैं:
हैंडलर पैरामीटर:
| SDK | हैंडलर प्रकार |
|---|---|
| बॉट फ्रेमवर्क SDK | BotHandler |
| एजेंट एसडीके | AgentHandler |
एजेंट एसडीके में अतिरिक्त तरीके:
| विधि | विवरण |
|---|---|
onMessageDelete |
संदेश हटाने की गतिविधियों को संभालता है |
onMessageUpdate |
संदेश अद्यतन गतिविधियों को संभालता है |
onSignInInvoke |
साइन-इन आह्वान गतिविधियों को संभालता है |
एजेंट SDK में अनुपलब्ध विधियाँ:
| विधि | कारण |
|---|---|
onCommand |
आदेश गतिविधियाँ समर्थित नहीं हैं |
onCommandResult |
आदेश परिणाम गतिविधियाँ समर्थित नहीं हैं |
onEvent |
जेनेरिक ईवेंट हैंडलिंग (विशिष्ट ईवेंट प्रकार जैसे onTokenResponseEvent अभी भी समर्थित हैं) |
onTokenResponseEvent |
OAuth टोकन प्रतिसाद इवेंट |
विधि हस्ताक्षर परिवर्तन:
सभी हैंडलर विधियां ActivityHandler के बजाय this लौटाती हैं ताकि विधि चेनिंग की जा सके। हैंडलर फ़ंक्शन्स AgentHandler प्रकार का उपयोग करते हैं, जिसमें BotHandler के समान हस्ताक्षर होते हैं।
माइग्रेशन उदाहरण:
बॉट फ्रेमवर्क SDK:
const { ActivityHandler } = require('botbuilder');
class MyBot extends ActivityHandler {
constructor() {
super();
this.onMessage(async (context, next) => {
await context.sendActivity('Hello!');
await next();
});
}
}
माइग्रेशन ज्यादातर सीधा है, जिसमें मुख्य परिवर्तन आयात विवरण और हैंडलर प्रकार है। अधिकांश मौजूदा-आधारित ActivityHandlerबॉट्स को न्यूनतम संशोधनों के साथ काम करना चाहिए।
महत्वपूर्ण
नई 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() |
| भंडारण | मैनुअल भंडारण कॉन्फ़िगरेशन | स्वचालित स्थिति दृढ़ता के साथ अंतर्निहित भंडारण समर्थन |
सामान्य प्रवासन पैटर्न
कुछ सामान्य माइग्रेशन पैटर्न हैं:
सरल इको बॉट
बॉट फ्रेमवर्क
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() |