From 4fa02a625b31a542cca33964facf65d429a522e1 Mon Sep 17 00:00:00 2001 From: Rodrigo Rodriguez Date: Fri, 22 Mar 2024 22:51:36 -0300 Subject: [PATCH] new(gpt.gblib): PDF opener. --- .../services/GBConversationalService.ts | 3 ++- packages/core.gbapp/services/GBDeployer.ts | 4 ++++ packages/core.gbapp/services/GBMinService.ts | 4 ++-- packages/gpt.gblib/services/ChatServices.ts | 19 +++++++++------ packages/kb.gbapp/dialogs/AskDialog.ts | 23 ++++++++++++++----- packages/kb.gbapp/services/KBService.ts | 2 +- 6 files changed, 38 insertions(+), 17 deletions(-) diff --git a/packages/core.gbapp/services/GBConversationalService.ts b/packages/core.gbapp/services/GBConversationalService.ts index f3804409..84d52839 100644 --- a/packages/core.gbapp/services/GBConversationalService.ts +++ b/packages/core.gbapp/services/GBConversationalService.ts @@ -339,7 +339,8 @@ export class GBConversationalService { } public async sendEvent(min: GBMinInstance, step: GBDialogStep, name: string, value: Object): Promise { - if (!this.userMobile(step) && step.context.activity.channelId !== 'msteams') { + if ( step.context.activity.channelId !== 'msteams' && + step.context.activity.channelId !== 'omnichannel') { GBLog.info( `Sending event ${name}:${typeof value === 'object' ? JSON.stringify(value) : value ? value : ''} to client...` ); diff --git a/packages/core.gbapp/services/GBDeployer.ts b/packages/core.gbapp/services/GBDeployer.ts index 641e4de3..b3610384 100644 --- a/packages/core.gbapp/services/GBDeployer.ts +++ b/packages/core.gbapp/services/GBDeployer.ts @@ -891,6 +891,10 @@ export class GBDeployer implements IGBDeployer { `/kb/${gbaiName}/${packageName}/images`, express.static(urlJoin('work', gbaiName, filename, 'images')) ); + GBServer.globals.server.use( + `/kb/${gbaiName}/${packageName}/docs`, + express.static(urlJoin('work', gbaiName, filename, 'docs')) + ); GBServer.globals.server.use( `/kb/${gbaiName}/${packageName}/audios`, express.static(urlJoin('work', gbaiName, filename, 'audios')) diff --git a/packages/core.gbapp/services/GBMinService.ts b/packages/core.gbapp/services/GBMinService.ts index 567d2b47..1b72f08a 100644 --- a/packages/core.gbapp/services/GBMinService.ts +++ b/packages/core.gbapp/services/GBMinService.ts @@ -717,9 +717,9 @@ export class GBMinService { 'Ocp-Apim-Subscription-Key': instance.speechKey } }; - + const url = urlJoin(instance.speechEndpoint, '/sts/v1.0/issueToken'); try { - const res = await fetch(instance.speechEndpoint, options); + const res = await fetch(url, options); return res.text(); } catch (error) { const msg = `Error calling Speech to Text client. Error is: ${error}.`; diff --git a/packages/gpt.gblib/services/ChatServices.ts b/packages/gpt.gblib/services/ChatServices.ts index 1dc2402d..bee436ba 100644 --- a/packages/gpt.gblib/services/ChatServices.ts +++ b/packages/gpt.gblib/services/ChatServices.ts @@ -64,7 +64,7 @@ import { GBLogEx } from '../../core.gbapp/services/GBLogEx.js'; export interface CustomOutputParserFields { } -export type ExpectedOutput = string; +export type ExpectedOutput = any; function isChatGeneration( llmOutput: ChatGeneration | Generation @@ -94,7 +94,8 @@ class CustomHandler extends BaseCallbackHandler { const logHandler = new CustomHandler(); -export class GBLLMOutputParser extends BaseLLMOutputParser { +export class GBLLMOutputParser extends + BaseLLMOutputParser { lc_namespace = ["langchain", "output_parsers"]; private toolChain: RunnableSequence @@ -148,7 +149,9 @@ export class GBLLMOutputParser extends BaseLLMOutputParser { const {url} = await ChatServices.pdfPageAsImage(this.min, metadata.file, metadata.page); result = `![alt text](${url}) - ${result}`; + ${text}`; + + return [ result, metadata.file, metadata.page]; } } @@ -403,6 +406,7 @@ export class ChatServices { ]); let result; + let text, file, page; // Choose the operation mode of answer generation, based on @@ -418,7 +422,8 @@ export class ChatServices { } else if (LLMMode === "document") { - result = await combineDocumentsChain.invoke(question); + [text, file, page] = await combineDocumentsChain.invoke(question); + result = text; } else if (LLMMode === "function") { @@ -435,18 +440,18 @@ export class ChatServices { GBLog.info(`Invalid Answer Mode in Config.xlsx: ${LLMMode}.`); } - const resultToPersist = result.replace(/\!\[.*\)/gi, ''); // Removes .MD url. + await memory.saveContext( { input: question, }, { - output: resultToPersist + output: result.replace(/\!\[.*\)/gi, '') // Removes .MD url beforing adding to history. } ); GBLog.info(`GPT Result: ${result.toString()}`); - return { answer: result.toString(), questionId: 0 }; + return { answer: result.toString(), file, questionId: 0, page }; } diff --git a/packages/kb.gbapp/dialogs/AskDialog.ts b/packages/kb.gbapp/dialogs/AskDialog.ts index d3c0ef85..f88fe217 100644 --- a/packages/kb.gbapp/dialogs/AskDialog.ts +++ b/packages/kb.gbapp/dialogs/AskDialog.ts @@ -37,20 +37,18 @@ import { GBServer } from '../../../src/app.js'; import { BotAdapter } from 'botbuilder'; import { WaterfallDialog } from 'botbuilder-dialogs'; -import { ChatGPTAPIBrowser } from 'chatgpt'; import { GBLog, GBMinInstance, IGBDialog, IGBPackage } from 'botlib'; import { Messages } from '../strings.js'; import { KBService } from './../services/KBService.js'; import { GuaribasAnswer } from '../models/index.js'; import { SecService } from '../../security.gbapp/services/SecService.js'; -import { CollectionUtil, AzureText } from 'pragmatismo-io-framework'; +import { CollectionUtil } from 'pragmatismo-io-framework'; import { GBVMService } from '../../basic.gblib/services/GBVMService.js'; import { GBImporter } from '../../core.gbapp/services/GBImporterService.js'; import { GBDeployer } from '../../core.gbapp/services/GBDeployer.js'; -import { GBConfigService } from '../../core.gbapp/services/GBConfigService.js'; -import Fs from 'fs'; import urlJoin from 'url-join'; import { SystemKeywords } from '../../basic.gblib/services/SystemKeywords.js'; +import { DialogKeywords } from '../../basic.gblib/services/DialogKeywords.js'; /** * Dialog arguments. @@ -235,19 +233,32 @@ export class AskDialog extends IGBDialog { return; } - const results = await service.ask(min, user, step, step.context.activity['pid'], text, searchScore, null /* user.subjects */); + const results:any = await service.ask(min, user, step, step.context.activity['pid'], text, searchScore, null /* user.subjects */); // If there is some result, answer immediately. if (results !== undefined && results.answer !== undefined) { + if (results.file){ + const path = DialogKeywords.getGBAIPath(min.botId, `gbkb`); + const url = urlJoin('kb', path, 'docs', results.file); + + await min.conversationalService.sendEvent( + min, step, 'play', { + playerType: 'url', + data: `${url}#page=${results.page}&toolbar=0&messages=0&statusbar=0&navpanes=0` + }); + } + // Sends the answer to all outputs, including projector. - answer = results.answer; + answer = results.answer.trim(); return await AskDialog.handleAnswer(service, min, step, user, answer); } + + GBLog.info(`SEARCH called but NO answer could be found (zero results).`); // Not found. diff --git a/packages/kb.gbapp/services/KBService.ts b/packages/kb.gbapp/services/KBService.ts index 000890e3..bc5e58f9 100644 --- a/packages/kb.gbapp/services/KBService.ts +++ b/packages/kb.gbapp/services/KBService.ts @@ -653,7 +653,7 @@ export class KBService implements IGBKBService { } else { await min.conversationalService.sendText(min, step, answer); - await min.conversationalService.sendEvent(min, step, 'stop', undefined); + } }