UNPKG

@microsoft/agents-hosting

Version:

Microsoft 365 Agents SDK for JavaScript

92 lines 5.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.configureResponseController = void 0; const agents_activity_1 = require("@microsoft/agents-activity"); const cloudAdapter_1 = require("../cloudAdapter"); const turnContext_1 = require("../turnContext"); const uuid_1 = require("uuid"); const activityWireCompat_1 = require("../activityWireCompat"); const logger_1 = require("@microsoft/agents-activity/logger"); const logger = (0, logger_1.debug)('agents:agent-client'); /** * To enable Agent to Agent communication, configures the agent response controller endpoint for handling incoming activities from external services. * * @remarks * This function sets up a POST endpoint that receives activities (messages, events, etc.) from external * services and processes them through the bot framework's activity handling pipeline. It's typically used * when the agent needs to receive and respond to activities from channels or services that send activities * to a specific webhook endpoint. * * The endpoint expects activities to be sent to: * `POST /api/agentresponse/v3/conversations/{conversationId}/activities/{activityId}` * * The function handles: * - Normalizing incoming activity data from the request body * - Retrieving conversation references from conversation state * - Continuing conversations using the stored conversation reference * - Processing EndOfConversation activities by cleaning up conversation state * - Sending activities through the turn context and returning responses * * @param app - The Express application instance to configure the route on * @param adapter - The CloudAdapter instance used for processing bot framework activities and managing conversations * @param agent - The ActivityHandler instance that contains the bot's logic for processing different types of activities * @param conversationState - The ConversationState instance used for managing conversation-specific state and conversation references * * @example * ```typescript * const app = express(); * const adapter = new CloudAdapter(); * const agent = new MyActivityHandler(); * const conversationState = new ConversationState(memoryStorage); * * configureResponseController(app, adapter, agent, conversationState); * ``` */ const configureResponseController = (app, adapter, agent, conversationState) => { app.post('/api/agentresponse/v3/conversations/:conversationId/activities/:activityId', handleResponse(adapter, agent, conversationState)); }; exports.configureResponseController = configureResponseController; const handleResponse = (adapter, handler, conversationState) => async (req, res) => { var _a, _b; const incoming = (0, activityWireCompat_1.normalizeIncomingActivity)(req.body); const activity = agents_activity_1.Activity.fromObject(incoming); logger.debug('received response: ', activity); const connection = adapter.connectionManager.getDefaultConnection(); const appId = (_b = (_a = connection === null || connection === void 0 ? void 0 : connection.connectionSettings) === null || _a === void 0 ? void 0 : _a.clientId) !== null && _b !== void 0 ? _b : ''; const myTurnContext = new turnContext_1.TurnContext(adapter, activity, cloudAdapter_1.CloudAdapter.createIdentity(appId)); const conversationDataAccessor = conversationState.createProperty(req.params.conversationId); const conversationRefState = await conversationDataAccessor.get(myTurnContext, undefined, { channelId: activity.channelId, conversationId: req.params.conversationId }); const conversationRef = JSON.stringify(conversationRefState.conversationReference); console.log('conversationRef', conversationRef); const callback = async (turnContext) => { activity.applyConversationReference(conversationRefState.conversationReference); turnContext.activity.id = req.params.activityId; let response; if (activity.type === agents_activity_1.ActivityTypes.EndOfConversation) { await conversationDataAccessor.delete(turnContext, { channelId: activity.channelId, conversationId: activity.conversation.id }); applyActivityToTurnContext(turnContext, activity); await handler.run(turnContext); response = (0, uuid_1.v4)().replace(/-/g, ''); } else { response = await turnContext.sendActivity(activity); } res.status(200).send(response); }; await adapter.continueConversation(myTurnContext.identity, conversationRefState.conversationReference, callback); }; const applyActivityToTurnContext = (turnContext, activity) => { turnContext.activity.channelData = activity.channelData; turnContext.activity.code = activity.code; turnContext.activity.entities = activity.entities; turnContext.activity.locale = activity.locale; turnContext.activity.localTimestamp = activity.localTimestamp; turnContext.activity.name = activity.name; turnContext.activity.relatesTo = activity.relatesTo; turnContext.activity.replyToId = activity.replyToId; turnContext.activity.timestamp = activity.timestamp; turnContext.activity.text = activity.text; turnContext.activity.type = activity.type; turnContext.activity.value = activity.value; }; //# sourceMappingURL=agentResponseHandler.js.map