asksuite-core
Version:
144 lines (126 loc) • 4.16 kB
JavaScript
const request = require('request');
class RasaAccessor {
constructor(RASA_URL, RASA_CONFIDENCE_THRESHOLD) {
this.RASA_URL = RASA_URL;
this.RASA_CONFIDENCE_THRESHOLD = RASA_CONFIDENCE_THRESHOLD;
}
resolveText(data, needsEntityConfident = true) {
return new Promise(resolve => {
const executor = async () => {
const { text } = data;
let { companyId } = data;
companyId = this.parseCompanyId(companyId);
const url = this.RASA_URL + '/parse';
try {
const result = await this.requestData(url, { q: text, project: companyId });
const response = JSON.parse(result.body);
const passConfidence = needsEntityConfident
? response.intent.confidence >= this.RASA_CONFIDENCE_THRESHOLD &&
this.hasEntityConfident(response.entities, this.RASA_CONFIDENCE_THRESHOLD)
: response.intent.confidence >= this.RASA_CONFIDENCE_THRESHOLD ||
this.hasEntityConfident(response.entities, this.RASA_CONFIDENCE_THRESHOLD);
if (passConfidence) {
const intentBot = data.intents.find(item => {
return item.intent == response.intent.name;
});
if (intentBot) {
resolve(intentBot);
} else if (!needsEntityConfident) {
const entity = this.getEntityConfident(
response.entities,
this.RASA_CONFIDENCE_THRESHOLD,
);
const resolvedEntityText = await this.resolveText(
Object.assign(data, { text: entity.value }),
true,
);
resolve(resolvedEntityText);
}
}
} catch (e) {
// console.log('Erro no Rasa ', e);
}
// this.removeLoadedModels(companyId).catch(()=>{});
resolve(data.findIntent);
};
executor();
});
}
parseCompanyId(name) {
let companyId = name;
if (companyId.indexOf('.') > -1) {
const splited = companyId.split('.');
companyId = splited[splited.length - 1];
}
return companyId;
}
requestData(url, qs) {
return new Promise((resolve, reject) => {
request.get(url, { qs }, (err, res) => {
if (err) {
reject(err);
}
resolve(res);
});
});
}
hasEntityConfident(entities, threshold) {
for (const entity of entities) {
if (
entity.value === entity.entity ||
(entity.confidence &&
entity.confidence >= threshold &&
entity.processors &&
entity.processors.indexOf('ner_synonyms') > -1)
) {
// entry is entity or synonym
return true;
}
}
return false;
}
getEntityConfident(entities, threshold) {
for (const entity of entities) {
if (entity.value === entity.entity || (entity.confidence && entity.confidence >= threshold)) {
// entry is entity or synonym
return entity;
}
}
}
removeLoadedModels(companyId) {
const statusUrl = `${this.RASA_URL}/status`;
return new Promise((resolve, reject) => {
request.get(statusUrl, (err, res) => {
if (!err) {
try {
const status = JSON.parse(res.body);
const availableProjects = status.available_projects;
const project = availableProjects[companyId];
const loadedModels = project.loaded_models;
if (loadedModels.length) {
for (const model of loadedModels) {
this.deleteModel(companyId, model).catch(() => {}); // Waiting is not necessary
}
}
resolve();
return;
} catch (e) {}
}
reject(err);
});
});
}
deleteModel(companyId, model) {
const deleteUrl = `${this.RASA_URL}/models`;
return new Promise((resolve, reject) => {
request.delete(deleteUrl, { qs: { project: companyId, model: model } }, (err, res) => {
if (!err) {
resolve(res);
return;
}
reject(err);
});
});
}
}
module.exports = RasaAccessor;