updating proactive agent to support both copilot and messenger front-ends
This commit is contained in:
@@ -0,0 +1,175 @@
|
||||
console.log('>>> messenger >>>') ;
|
||||
console.log( { query: req.query, params: req.params, body: req.body }) ;
|
||||
console.log('>>> messenger >>>') ;
|
||||
const external = req.body.event?.external;
|
||||
const sessionId = req.body.event?.conversationId;
|
||||
const input = req.body.event?.input;
|
||||
const params = req.body.event?.params || {};
|
||||
const modelName = params?.modelName || settings_667ef98d3ee8930a5debcbdb.nlu.modelName;
|
||||
const env = params?.env;
|
||||
const postBack = req.body.event?.postBack;
|
||||
const metadata = {
|
||||
...req.body.event?.metadata,
|
||||
userId: req.body.event?.sentBy?.userId
|
||||
};
|
||||
const configuration = req.body.event?.configuration;
|
||||
(async () => {
|
||||
try {
|
||||
const smStr = `session-map-${sessionId}`;
|
||||
if (external) {} else {
|
||||
await axios.post(`${settings_667ef98d3ee8930a5debcbdb.messenger.apiBaseURL}Conversation/join`, {
|
||||
_id: sessionId,
|
||||
participant: {
|
||||
userId: settings_667ef98d3ee8930a5debcbdb.messenger.participantId,
|
||||
type: 'bot',
|
||||
name: settings_667ef98d3ee8930a5debcbdb.messenger.name,
|
||||
avatar: settings_667ef98d3ee8930a5debcbdb.messenger.avatar
|
||||
}
|
||||
}, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${settings_667ef98d3ee8930a5debcbdb.messenger.token}`
|
||||
}
|
||||
}).then(response => {
|
||||
if (response?.data?._id) {} else throw new Error();
|
||||
});
|
||||
axios.post(`${settings_667ef98d3ee8930a5debcbdb.messenger.apiBaseURL}Event/isTyping`, {
|
||||
workspaceId: req.params.workspaceId,
|
||||
conversationId: sessionId,
|
||||
userId: settings_667ef98d3ee8930a5debcbdb.messenger.participantId,
|
||||
typing: true
|
||||
}, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${settings_667ef98d3ee8930a5debcbdb.messenger.token}`
|
||||
}
|
||||
});
|
||||
}
|
||||
const sessionMap = await redis.hGetAll(smStr);
|
||||
console.log(smStr);
|
||||
console.log(sessionMap);
|
||||
const recognizedData = await axios.post(`${settings_667ef98d3ee8930a5debcbdb.nlu.apiBaseURL}Model/run/${req.params.workspaceId}/${req.params.branch}/${modelName}`, {
|
||||
input: input,
|
||||
conversationId: sessionMap.conversationId,
|
||||
settings: settings_667ef98d3ee8930a5debcbdb.nlu.settings,
|
||||
metadata: metadata,
|
||||
postBack: postBack,
|
||||
configuration: configuration
|
||||
}).then(response => {
|
||||
return response.data;
|
||||
}).catch(error => {
|
||||
//If we have error handling turned off, don't record the error
|
||||
if (settings_667ef98d3ee8930a5debcbdb.errorHandling === false) {
|
||||
throw error;
|
||||
} else {
|
||||
// Conversation ID is generated by the NLU
|
||||
// Must make sure Conversation ID is created properly for an error transaction
|
||||
// Get it from session map if it exists, or generate it if we got the error at the very first transaction.
|
||||
const conversationId = sessionMap.conversationId || uuidv4();
|
||||
let errorPayload = {
|
||||
id: uuidv4(),
|
||||
workspaceId: req.params.workspaceId,
|
||||
errorInfo: {
|
||||
name: error.name,
|
||||
message: error.message,
|
||||
stack: error.stack
|
||||
},
|
||||
conversationId,
|
||||
input,
|
||||
answers: [settings_667ef98d3ee8930a5debcbdb.responses.modelError],
|
||||
req: {
|
||||
params: req.params,
|
||||
query: req.query,
|
||||
body: req.body,
|
||||
headers: req.headers
|
||||
},
|
||||
metadata,
|
||||
classificationResults: [{
|
||||
label: "Model Error",
|
||||
value: 0.0
|
||||
}],
|
||||
nerResults: {
|
||||
entities: [],
|
||||
sourceEntities: []
|
||||
},
|
||||
// Reporting tags to match GlobalSupport function reporting
|
||||
tag: "ERROR",
|
||||
reporting: {
|
||||
tag: "ERROR",
|
||||
modelResponse: "ERROR"
|
||||
}
|
||||
};
|
||||
|
||||
// Add model name
|
||||
errorPayload.req.params.route = modelName;
|
||||
|
||||
//add any other details you wish to see in transaction data
|
||||
|
||||
return errorPayload;
|
||||
}
|
||||
});
|
||||
// console.log(recognizedData);
|
||||
if (recognizedData.conversationId) {
|
||||
await redis.hSet(smStr, 'conversationId', recognizedData.conversationId);
|
||||
await redis.expire(smStr, 3600);
|
||||
if (sessionMap.conversationId) {} else {
|
||||
db.analytics.addConversation({
|
||||
id: recognizedData.conversationId
|
||||
});
|
||||
}
|
||||
}
|
||||
// NOTE: Additonal logic could be used to provide answer from alternative sources
|
||||
// recognizedData.answers = API_RESPONSE || ['Example'];
|
||||
if (recognizedData.tag === "ERROR") {} else if (recognizedData.classificationResults.length === 0 && recognizedData.answers.length === 0) {
|
||||
recognizedData.answers = [settings_667ef98d3ee8930a5debcbdb.responses.unrecognized];
|
||||
} else if (recognizedData.answers.length === 0) {
|
||||
recognizedData.answers = [settings_667ef98d3ee8930a5debcbdb.responses.unanswered];
|
||||
}
|
||||
recognizedData._id = (await db.analytics.addTransaction(recognizedData)).insertedId;
|
||||
if (external) {} else {
|
||||
new Promise(async resolve => {
|
||||
for (const [index, answer] of recognizedData.answers.entries()) {
|
||||
try {
|
||||
await axios.post(`${settings_667ef98d3ee8930a5debcbdb.messenger.apiBaseURL}Event/create`, {
|
||||
conversationId: sessionId,
|
||||
input: answer,
|
||||
sentBy: {
|
||||
userId: settings_667ef98d3ee8930a5debcbdb.messenger.participantId,
|
||||
name: settings_667ef98d3ee8930a5debcbdb.messenger.name,
|
||||
avatar: settings_667ef98d3ee8930a5debcbdb.messenger.avatar
|
||||
},
|
||||
ping: nanoid(),
|
||||
sentAt: Date.now(),
|
||||
options: recognizedData?.options,
|
||||
metadata: {
|
||||
outputs: recognizedData.answers.length == index + 1 ? recognizedData?.outputs : {},
|
||||
transactionId: recognizedData._id,
|
||||
feedbackable: false
|
||||
}
|
||||
}, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${settings_667ef98d3ee8930a5debcbdb.messenger.token}`
|
||||
}
|
||||
});
|
||||
} catch (e) {}
|
||||
}
|
||||
resolve(true);
|
||||
});
|
||||
axios.post(`${settings_667ef98d3ee8930a5debcbdb.messenger.apiBaseURL}Event/isTyping`, {
|
||||
workspaceId: req.params.workspaceId,
|
||||
conversationId: sessionId,
|
||||
userId: settings_667ef98d3ee8930a5debcbdb.messenger.participantId,
|
||||
typing: false
|
||||
}, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${settings_667ef98d3ee8930a5debcbdb.messenger.token}`
|
||||
}
|
||||
});
|
||||
}
|
||||
res.send(recognizedData);
|
||||
} catch (error) {
|
||||
console.log(error.message);
|
||||
res.send({
|
||||
answers: ['Something went wrong. Please try again.'],
|
||||
outputs: {}
|
||||
});
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user