UNPKG

asksuite-core

Version:
144 lines (126 loc) 4.16 kB
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;