From 1ff24290f0fb482493fd8106247443233f117b87 Mon Sep 17 00:00:00 2001 From: Rodrigo Rodriguez Date: Sun, 6 Dec 2020 16:22:34 -0300 Subject: [PATCH] fix(core.gbapp): Start dialog done and log improvements. --- .../services/GBConversationalService.ts | 11 ++-- packages/core.gbapp/services/GBCoreService.ts | 2 +- packages/core.gbapp/services/GBMinService.ts | 16 ++++- packages/core.gbapp/services/GBVMService.ts | 17 +++-- packages/kb.gbapp/dialogs/AskDialog.ts | 9 +-- packages/kb.gbapp/services/KBService.ts | 63 ++++++++++++++++--- 6 files changed, 94 insertions(+), 24 deletions(-) diff --git a/packages/core.gbapp/services/GBConversationalService.ts b/packages/core.gbapp/services/GBConversationalService.ts index b18d7174..523d03bf 100644 --- a/packages/core.gbapp/services/GBConversationalService.ts +++ b/packages/core.gbapp/services/GBConversationalService.ts @@ -481,7 +481,7 @@ export class GBConversationalService { try { const saved = step.context.activity.text; step.context.activity.text = text; - nlp = await model.recognize(step.context); + nlp = await model.recognize(step.context,{},{},{IncludeAllIntents:false, IncludeInstanceData: false, includeAPIResults: true}); step.context.activity.text = saved; } catch (error) { // tslint:disable:no-unsafe-any @@ -498,12 +498,15 @@ export class GBConversationalService { // tslint:enable:no-unsafe-any } + const minBoot = GBServer.globals.minBoot as any; let nlpActive = false; let score = 0; + const instanceScore = min.core.getParam(min.instance, 'NLP Score', + min.instance.nlpScore ? min.instance.nlpScore : minBoot.instance.nlpScore); Object.keys(nlp.intents).forEach(name => { score = nlp.intents[name].score; - if (score > min.instance.nlpScore) { + if (score > instanceScore) { nlpActive = true; } }); @@ -518,7 +521,7 @@ export class GBConversationalService { } GBLog.info( - `NLP called: ${intent}, entities: ${nlp.entities.length}, score: ${score} > required (nlpScore): ${min.instance.nlpScore}` + `NLP called: ${intent}, entities: ${nlp.entities.length}, score: ${score} > required (nlpScore): ${instanceScore}` ); try { @@ -548,7 +551,7 @@ export class GBConversationalService { } GBLog.info( - `NLP NOT called: score: ${score} > required (nlpScore): ${min.instance.nlpScore}` + `NLP NOT called: score: ${score} > required (nlpScore): ${instanceScore}` ); return false; diff --git a/packages/core.gbapp/services/GBCoreService.ts b/packages/core.gbapp/services/GBCoreService.ts index 8866e940..0abeb8f0 100644 --- a/packages/core.gbapp/services/GBCoreService.ts +++ b/packages/core.gbapp/services/GBCoreService.ts @@ -587,7 +587,7 @@ STORAGE_SYNC=true return value ? value : defaultValue; } if (typeof defaultValue === 'number') { - return new Number(value ? defaultValue : defaultValue ? defaultValue : 0); + return new Number(value ? value : defaultValue ? defaultValue : 0); } if (instance['dataValues'] && !value) { diff --git a/packages/core.gbapp/services/GBMinService.ts b/packages/core.gbapp/services/GBMinService.ts index 49ee9e67..afb48e67 100644 --- a/packages/core.gbapp/services/GBMinService.ts +++ b/packages/core.gbapp/services/GBMinService.ts @@ -614,6 +614,7 @@ export class GBMinService { // Get loaded user state const step = await min.dialogs.createContext(context); step.context.activity.locale = 'pt-BR'; + let firstTime = false; try { const user = await min.userProfile.get(context, {}); @@ -622,6 +623,7 @@ export class GBMinService { const sec = new SecService(); if (!user.loaded) { + firstTime = true; await min.conversationalService.sendEvent(min, step, 'loadInstance', { instanceId: instance.instanceId, botId: instance.botId, @@ -668,7 +670,19 @@ export class GBMinService { await CollectionUtil.asyncForEach(appPackages, async e => { await e.onNewSession(min, step); }); - await step.beginDialog('/'); + + const startDialog = min.core.getParam(min.instance, 'Start Dialog', null); + if (startDialog) + { + GBLog.info(`Auto start dialog is now being called: ${startDialog}...`); + await GBVMService.callVM(context.activity.text, min, step, this.deployer); + } + else + { + await step.beginDialog('/'); + + } + } else { GBLog.info(`Member added to conversation: ${member.name}`); } diff --git a/packages/core.gbapp/services/GBVMService.ts b/packages/core.gbapp/services/GBVMService.ts index 20acdf12..1b5fe7f1 100644 --- a/packages/core.gbapp/services/GBVMService.ts +++ b/packages/core.gbapp/services/GBVMService.ts @@ -423,7 +423,7 @@ export class GBVMService extends GBService { const isIntentYes = (locale, utterance) => { return utterance.toLowerCase().match(Messages[locale].affirmative_sentences); } - + let result = step.result; if (step.activeDialog.state.options['boolean']) { @@ -436,7 +436,7 @@ export class GBVMService extends GBService { } else if (step.activeDialog.state.options['email']) { - // e@e.com + // e@e.com } else if (step.activeDialog.state.options['number']) { // MAX and MIN. @@ -456,7 +456,7 @@ export class GBVMService extends GBService { else if (step.activeDialog.state.options['zipcode']) { // 12333-222 } - else if (step.activeDialog.state.options['menu']){ + else if (step.activeDialog.state.options['menu']) { // ['drums', 'guitar', 'bass']; kpmSearch } @@ -487,6 +487,15 @@ export class GBVMService extends GBService { const mainMethod = text.toLowerCase(); sandbox[mainMethod].bind(sandbox); - return await sandbox[mainMethod](step); + + let ret = null; + try { + ret = await sandbox[mainMethod](step); + + } catch (error) { + GBLog.error(`BASIC ERROR: ${error.message} ${error.stack}`); + } + + return ret; } } diff --git a/packages/kb.gbapp/dialogs/AskDialog.ts b/packages/kb.gbapp/dialogs/AskDialog.ts index acc6d51a..3275894e 100644 --- a/packages/kb.gbapp/dialogs/AskDialog.ts +++ b/packages/kb.gbapp/dialogs/AskDialog.ts @@ -172,7 +172,9 @@ export class AskDialog extends IGBDialog { // Searches KB for the first time. - const searchScore = min.instance.searchScore ? min.instance.searchScore : minBoot.instance.searchScore; + const searchScore = min.core.getParam(min.instance, 'Search Score', + min.instance.searchScore ? min.instance.searchScore : minBoot.instance.searchScore); + user.lastQuestion = text; await min.userProfile.set(step.context, user); @@ -192,15 +194,14 @@ export class AskDialog extends IGBDialog { answer = resultsA.answer; // If this search was restricted to some subjects... - } else if (user.subjects) { + } else if (user.subjects && user.subjects.length > 0) { // ...second time running Search, now with no filter. const resultsB = await service.ask(min.instance, text, searchScore, undefined); // If there is some result, answer immediately. - if (resultsB !== undefined && resultsB.answer !== undefined) - { + if (resultsB !== undefined && resultsB.answer !== undefined) { // Saves some context info. const user2 = await min.userProfile.get(step.context, {}); diff --git a/packages/kb.gbapp/services/KBService.ts b/packages/kb.gbapp/services/KBService.ts index de12005c..47cb8569 100644 --- a/packages/kb.gbapp/services/KBService.ts +++ b/packages/kb.gbapp/services/KBService.ts @@ -177,6 +177,8 @@ export class KBService implements IGBKBService { ): Promise { // Builds search query. + + query = query.toLowerCase(); query = query.replace('?', ' '); query = query.replace('!', ' '); @@ -192,6 +194,8 @@ export class KBService implements IGBKBService { } } + let notSearched = true; + // tslint:disable:no-unsafe-any if (instance.searchKey !== null && GBConfigService.get('STORAGE_DIALECT') === 'mssql') { const client = new SearchService(instance.searchHost.split('.')[0], instance.searchKey); @@ -205,22 +209,61 @@ export class KBService implements IGBKBService { const values = results.result.value; - if (values && values.length > 0 && values[0]['@search.score'] >= searchScore) { - const value = await this.getAnswerById(instance.instanceId, values[0].answerId); - if (value !== null) { - return { answer: value, questionId: values[0].questionId }; + let returnedScore = 0; + + // Searches via Search (Azure Search). + + if (values && values.length > 0) { + returnedScore = values[0]['@search.score']; + if (returnedScore >= searchScore) { + const value = await this.getAnswerById(instance.instanceId, values[0].answerId); + if (value !== null) { + GBLog.info( + `SEARCH WILL BE USED with score: ${returnedScore} > required (searchScore): ${searchScore}` + ); + notSearched = false; + return { answer: value, questionId: values[0].questionId }; + } else { + GBLog.info( + `SEARCH WILL NOT be used as answerId ${values[0].answerId} was not found in database, + returnedScore: ${returnedScore} < required (searchScore): ${searchScore}` + ); + + return { answer: undefined, questionId: 0 }; + } } else { + GBLog.info( + `SEARCH called but returned LOW level score, + returnedScore: ${returnedScore} < required (searchScore): ${searchScore}` + ); + return { answer: undefined, questionId: 0 }; } - } - } else { - const data = await this.getAnswerByText(instance.instanceId, query); - if (data) { - return { answer: data.answer, questionId: data.question.questionId }; } else { + GBLog.info( + `SEARCH called but NO answer could be found (zero results).` + ); return { answer: undefined, questionId: 0 }; } - } + } + + // DISABLED: Searches via Database "WHERE" command. + + // if (notSearched) { + // const data = await this.getAnswerByText(instance.instanceId, query); + // if (data) { + // GBLog.info( + // `SEARCH called.` + // ); + // return { answer: data.answer, questionId: data.question.questionId }; + // } else { + // GBLog.info(`SEARCH NOT called getAnswerByText not found answers in database.`); + // return { answer: undefined, questionId: 0 }; + // } + // } + + // TODO: Add more sources.... + } public async getSubjectItems(instanceId: number, parentId: number): Promise {