diff --git a/ApiClientOpenAI.js b/ApiClientOpenAI.js index aa57ab9..8891cd6 100644 --- a/ApiClientOpenAI.js +++ b/ApiClientOpenAI.js @@ -2,16 +2,15 @@ const ApiClient = require('./ApiClient'); const OpenAI = require('openai'); class ApiClientOpenAI extends ApiClient { - constructor(apiKey, messageLog, baseURL='https://api.openai.com/v1/') { + constructor(apiKey, messageLog) { super(apiKey, messageLog); - this.baseURL = baseURL; - this.openai = new OpenAI({ baseURL: this.baseURL, apiKey: this.apiKey }); + this.openai = new OpenAI({ apiKey: this.apiKey }); } async sendMessage(model) { const rawMessageLog = this.messageLog.getRawMessageLog(); const formattedMessageLog = this.transformMessageLog(rawMessageLog); - //console.log(JSON.stringify(formattedMessageLog, null, 2)); + console.log(JSON.stringify(formattedMessageLog, null, 2)); // Import the ora module const ora = (await import('ora')).default; diff --git a/ApiClientPerplexity.js b/ApiClientPerplexity.js new file mode 100644 index 0000000..389ce3e --- /dev/null +++ b/ApiClientPerplexity.js @@ -0,0 +1,92 @@ +const ApiClient = require('./ApiClient'); +const OpenAI = require('openai'); + +class ApiClientPerplexity extends ApiClient { + constructor(apiKey, messageLog) { + super(apiKey, messageLog); + this.baseURL = "https://api.perplexity.ai"; + this.openai = new OpenAI({ baseURL: this.baseURL, apiKey: this.apiKey }); + } + + async sendMessage(model) { + const rawMessageLog = this.messageLog.getRawMessageLog(); + const formattedMessageLog = this.transformMessageLog(rawMessageLog); + //console.log(JSON.stringify(formattedMessageLog, null, 2)); + + // Import the ora module + const ora = (await import('ora')).default; + + // Create a new ora instance + const spinner = ora().start(); + + const response = await this.openai.chat.completions.create({ + model: model, + max_tokens: 4096, + temperature: 0, + messages: formattedMessageLog, + }); + + // Log the entire response + console.log('\n\nAPI Response:', response); + + // Stop the spinner + spinner.stop(); + + // Return the response + return response.choices[0].message.content; + } + + transformMessageLog(rawMessageLog) { + let transformedMessageLog = []; + let userContent = ''; + + for (let i = 0; i < rawMessageLog.length; i++) { + let message = rawMessageLog[i]; + + if (message.role === 'user') { + userContent += message.content; + } + else { + if (userContent) { + transformedMessageLog.push({ + role: 'user', + content: [{ + type: 'text', + text: userContent + }] + }); + userContent = ''; + } + transformedMessageLog.push({ + role: 'assistant', + content: [{ + type: message.type, + text: message.content + }] + }); + } + } + + // if the last message was a user message, add it to the transformed message log + if (userContent) { + transformedMessageLog.push({ + role: 'user', + content: userContent + }); + } + + // Add a continue message + //transformedMessageLog.push({ + // role: 'assistant', + // content: [{ + // type: 'text', + // text: 'continue' + // }] + //}); + + console.log(JSON.stringify(transformedMessageLog, null, 2)); + return transformedMessageLog; + } +} + +module.exports = ApiClientPerplexity; \ No newline at end of file diff --git a/Main.js b/Main.js index cb3d1cb..07dcadf 100644 --- a/Main.js +++ b/Main.js @@ -4,6 +4,7 @@ const ChatSession = require('./ChatSession'); const ApiClientOpenAi = require('./ApiClientOpenAI'); const ApiClientGoogle = require('./ApiClientGoogle'); const ApiClientAnthropic = require('./ApiClientAnthropic'); +const ApiClientPerplexity = require('./ApiClientPerplexity'); const ApiClientMistral = require('./ApiClientMistral'); const MessageLog = require('./MessageLog'); const DataProcessor = require('./ProcessorData'); @@ -29,7 +30,7 @@ class Main { this.model = "claude-3-5-sonnet-20240620"; break; case '4': - this.apiClient = new ApiClientOpenAi(process.env.PERPLEXITY_API_KEY, this.messageLog, "https://api.perplexity.ai"); + this.apiClient = new ApiClientPerplexity(process.env.PERPLEXITY_API_KEY, this.messageLog); this.model = "llama-3.1-sonar-large-128k-chat"; break; case '5':