oex2003/evolution-api
0
1/* eslint-disable @typescript-eslint/no-unused-vars */2import { PrismaRepository } from '@api/repository/repository.service';3import { WAMonitoringService } from '@api/services/monitor.service';4import { Integration } from '@api/types/wa.types';5import { ConfigService, HttpServer } from '@config/env.config';6import { Flowise as FlowiseModel, IntegrationSession } from '@prisma/client';7import axios from 'axios';8 9import { BaseChatbotService } from '../../base-chatbot.service';10import { OpenaiService } from '../../openai/services/openai.service';11 12export class FlowiseService extends BaseChatbotService<FlowiseModel> {13 private openaiService: OpenaiService;14 15 constructor(16 waMonitor: WAMonitoringService,17 prismaRepository: PrismaRepository,18 configService: ConfigService,19 openaiService: OpenaiService,20 ) {21 super(waMonitor, prismaRepository, 'FlowiseService', configService);22 this.openaiService = openaiService;23 }24 25 // Return the bot type for Flowise26 protected getBotType(): string {27 return 'flowise';28 }29 30 // Process Flowise-specific bot logic31 public async processBot(32 instance: any,33 remoteJid: string,34 bot: FlowiseModel,35 session: IntegrationSession,36 settings: any,37 content: string,38 pushName?: string,39 msg?: any,40 ) {41 await this.process(instance, remoteJid, bot, session, settings, content, pushName, msg);42 }43 44 // Implement the abstract method to send message to Flowise API45 protected async sendMessageToBot(46 instance: any,47 session: IntegrationSession,48 settings: any,49 bot: FlowiseModel,50 remoteJid: string,51 pushName: string,52 content: string,53 msg?: any,54 ): Promise<void> {55 const payload: any = {56 question: content,57 overrideConfig: {58 sessionId: remoteJid,59 vars: {60 remoteJid: remoteJid,61 pushName: pushName,62 instanceName: instance.instanceName,63 serverUrl: this.configService.get<HttpServer>('SERVER').URL,64 apiKey: instance.token,65 },66 },67 };68 69 // Handle audio messages70 if (this.isAudioMessage(content) && msg) {71 try {72 this.logger.debug(`[Flowise] Downloading audio for Whisper transcription`);73 const transcription = await this.openaiService.speechToText(msg, instance);74 if (transcription) {75 payload.question = `[audio] ${transcription}`;76 }77 } catch (err) {78 this.logger.error(`[Flowise] Failed to transcribe audio: ${err}`);79 }80 }81 82 if (this.isImageMessage(content)) {83 const contentSplit = content.split('|');84 85 payload.uploads = [86 {87 data: contentSplit[1].split('?')[0],88 type: 'url',89 name: 'Flowise.png',90 mime: 'image/png',91 },92 ];93 payload.question = contentSplit[2] || content;94 }95 96 if (instance.integration === Integration.WHATSAPP_BAILEYS) {97 await instance.client.presenceSubscribe(remoteJid);98 await instance.client.sendPresenceUpdate('composing', remoteJid);99 }100 101 let headers: any = {102 'Content-Type': 'application/json',103 };104 105 if (bot.apiKey) {106 headers = {107 ...headers,108 Authorization: `Bearer ${bot.apiKey}`,109 };110 }111 112 const endpoint = bot.apiUrl;113 114 if (!endpoint) {115 this.logger.error('No Flowise endpoint defined');116 return;117 }118 119 const response = await axios.post(endpoint, payload, {120 headers,121 });122 123 if (instance.integration === Integration.WHATSAPP_BAILEYS) {124 await instance.client.sendPresenceUpdate('paused', remoteJid);125 }126 127 const message = response?.data?.text;128 129 if (message) {130 // Use the base class method to send the message to WhatsApp131 await this.sendMessageWhatsApp(instance, remoteJid, message, settings);132 }133 }134 135 // The service is now complete with just the abstract method implementations136}137 