From 04b2457ca37bf21cc1c348869a7f8d9168e48b92 Mon Sep 17 00:00:00 2001 From: MikeHughes-BIN Date: Mon, 15 Dec 2025 17:58:03 +0100 Subject: [PATCH] Changes to the LLMs to return a Promise (outp path) and main now calls the export process --- main.js | 11 ++- services/modules/llm-chat_gpt/chatgpt.js | 115 ++++++++++++----------- services/modules/llm-gemini/gemini.js | 2 +- services/modules/quen3/quen3.js | 110 ++++++++++++---------- 4 files changed, 127 insertions(+), 111 deletions(-) diff --git a/main.js b/main.js index 6b9fe1c..1bc0bc7 100644 --- a/main.js +++ b/main.js @@ -124,10 +124,12 @@ electron.ipcMain.handle('get-module-names', async () => { // mainWindow.webContents.send("modules", module_array) // }) - +var globalArgs = {} +var globalFinalHtmlPath = "" electron.ipcMain.on("file_submit", async (event, args) => { try { + globalArgs = args let curstep = 0 let totalsteps = 3 + args.document.styles.length @@ -187,7 +189,7 @@ electron.ipcMain.on("file_submit", async (event, args) => { await mapFunctions.get("module-handler").function(args.document.module, {inputTranscriptPath: transcriptpath, documentTypePath: "./storage/documentType/standard_meeting_report.txt", language: "en"}).then(resp => { console.log(resp); - transcriptpath = resp + globalFinalHtmlPath = resp curstep++ mainWindow.webContents.send("progress", {curstep:curstep, totalsteps:totalsteps}) }).catch(err => { @@ -195,7 +197,7 @@ electron.ipcMain.on("file_submit", async (event, args) => { return }) } - + // TODO actually implement this functionality // Module to get the first few lines for each speaker to send to the frontend // await mapFunctions.get("speaker-getter-idfk").function(transcriptpath).then(resp => { @@ -220,6 +222,9 @@ electron.ipcMain.on("file_submit", async (event, args) => { } }) +electron.ipcMain.on("file_download", async() => { + await mapFunctions.get("htmlDocumentConverter").convert({inputPath:globalFinalHtmlPath, format: globalArgs.document.outputType, showDialog: true}); +}) let q = diff --git a/services/modules/llm-chat_gpt/chatgpt.js b/services/modules/llm-chat_gpt/chatgpt.js index d07a422..4b7c89b 100644 --- a/services/modules/llm-chat_gpt/chatgpt.js +++ b/services/modules/llm-chat_gpt/chatgpt.js @@ -1,7 +1,7 @@ const fs = require('fs'); const path = require('path'); -const outputDir = path.join(__dirname, "../../../storage/documents"); // path for output directory +const outputDir = path.join(__dirname, "../../../storage/documents"); // path for output directory if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, { recursive: true }); // Create output directory if it doesn't exist @@ -9,8 +9,7 @@ if (!fs.existsSync(outputDir)) { // Ensure SAIA API key is set in environment variables: export SAIA_API_KEY="your_api_key_here" const SAIA_API_KEY = process.env.SAIA_API_KEY; // Ensure SAIA API key is set in environment variables - -const SAIA_URL = "https://chat-ai.academiccloud.de/v1/chat/completions"; //URL for the REST call, used model and action +const SAIA_URL = "https://chat-ai.academiccloud.de/v1/chat/completions"; // URL for the REST call, used model and action const module_exports = { name: "llm-saia_openai_gpt", @@ -19,66 +18,72 @@ const module_exports = { description: "Generates documents using OpenAI GPT OSS 120B via SAIA platform", async function(parameter) { - try { - console.log("SAIA OpenAI GPT module invoked with parameters:", parameter); + return new Promise(async (resolve, reject) => { + try { + // console.log("SAIA OpenAI GPT module invoked with parameters:", parameter); - await this.createDocumentFromTranscript( //Call the function to create document with transcript, document type and language - parameter.inputTranscriptPath, // Path to input transcript file - parameter.documentTypePath, // Path to document type file which is chosen in the front end by the user - parameter.language // Language for the document which is chosen in the front end by the user - ); + resolve(await this.createDocumentFromTranscript( //Call the function to create document with transcript, document type and language + parameter.inputTranscriptPath, // Path to input transcript file + parameter.documentTypePath, // Path to document type file which is chosen in the front end by the user + parameter.language // Language for the document which is chosen in the front end by the user + )); + + } catch (error) { + // console.error("Error in SAIA OpenAI GPT module:", error); + reject(error) + } + }) - } catch (error) { - console.error("Error in SAIA OpenAI GPT module:", error); - } }, createDocumentFromTranscript: async function(transcriptPath, documentTypePath, language = "en") { // default language is English - try { - const transcript = await fs.promises.readFile(transcriptPath, "utf-8"); //read transcript file from Path - const documentType = await fs.promises.readFile(documentTypePath, "utf-8"); //read document type from Path - const promptText = `${documentType}, in language ${language}, transcript:\n\n${transcript}`; //combine doc type, language and transcript - Change prompt here if needed + return new Promise(async(resolve, reject) => { + try { + const transcript = await fs.promises.readFile(transcriptPath, "utf-8"); //read transcript file from Path + const documentType = await fs.promises.readFile(documentTypePath, "utf-8"); //read document type from Path + const promptText = `${documentType}, in language ${language}, transcript:\n\n${transcript}`; //combine doc type, language and transcript - Change prompt here if needed - // --- REST CALL --- - const response = await fetch(SAIA_URL, { - method: "POST", - headers: { - "Authorization": `Bearer ${SAIA_API_KEY}`, - "Accept": "application/json", - "Content-Type": "application/json" - }, - body: JSON.stringify({ - model: "openai-gpt-oss-120b", - messages: [ - { role: "system", content: "You are a helpful assistant that generates HTML documents from transcripts. Output only valid HTML content without any preamble, explanations, or markdown formatting." }, - { role: "user", content: promptText } - ], - temperature: 0 - }) - }); + // --- REST CALL --- + const response = await fetch(SAIA_URL, { //safe model response in variable + method: "POST", + headers: { + "Authorization": `Bearer ${SAIA_API_KEY}`, + "Accept": "application/json", + "Content-Type": "application/json" + }, + body: JSON.stringify({ + model: "openai-gpt-oss-120b", + messages: [ + { role: "system", content: "You are a helpful assistant that generates HTML documents from transcripts. Output only valid HTML content without any preamble, explanations, or markdown formatting." }, + { role: "user", content: promptText } + ], + temperature: 0 + }) + }); - if (!response.ok) { //ok is true when a response was successful - const text = await response.text(); - throw new Error(`SAIA API error (${response.status}): ${text}`); + if (!response.ok) { //ok is true when a responce was successfull + const text = await response.text(); + throw new Error(`SAIA API error (${response.status}): ${text}`); + } + + const data = await response.json(); + + // Get generated text from response or default to empty string (if null) + // SAIA uses OpenAI-compatible structure: data.choices[x].message.content + const output = data.choices?.[0]?.message?.content || ""; + let inputTranscriptName = path.basename(transcriptPath, path.extname(transcriptPath)); // Name for the output file + // console.log(inputTranscriptName); + const outPath = path.join(outputDir, `${inputTranscriptName}.html`); // Output file path & name to make naming dynamic. Pulled from input transcript name + fs.writeFileSync(outPath, output, "utf8"); // Write output to file + + // console.log("Generated document written to:", outPath); + resolve(outPath) + + } catch (error) { + // console.error("Error generating SAIA content:", error); + reject(error) } - - const data = await response.json(); - - // Get generated text from response or default to empty string (if null) - // SAIA uses OpenAI-compatible structure: data.choices[x].message.content - const output = data.choices?.[0]?.message?.content || ""; - - let inputTranscriptName = path.basename(transcriptPath, path.extname(transcriptPath)); // Name for the output file - console.log(inputTranscriptName); - - const outPath = path.join(outputDir, `${inputTranscriptName}.html`); // Output file path & name to make naming dynamic. Pulled from input transcript name - fs.writeFileSync(outPath, output, "utf8"); // Write output to file - - console.log("Generated document written to:", outPath); - - } catch (error) { - console.error("Error generating SAIA content:", error); - } + }) } }; diff --git a/services/modules/llm-gemini/gemini.js b/services/modules/llm-gemini/gemini.js index cff1026..beff750 100644 --- a/services/modules/llm-gemini/gemini.js +++ b/services/modules/llm-gemini/gemini.js @@ -71,7 +71,7 @@ const module_exports = { const output = data?.candidates?.[0]?.content?.parts?.[0]?.text || ""; let inputTranscriptName = path.basename(transcriptPath, path.extname(transcriptPath)); // Name for the output file // console.log(inputTranscriptName); - const outPath = path.join(outputDir, `${inputTranscriptName}.md`); // Output file path & name to make naming dynamic. Pulled from input transcript name + const outPath = path.join(outputDir, `${inputTranscriptName}.html`); // Output file path & name to make naming dynamic. Pulled from input transcript name fs.writeFileSync(outPath, output, "utf8"); // Write output to file // console.log("Generated document written to:", outPath); diff --git a/services/modules/quen3/quen3.js b/services/modules/quen3/quen3.js index fd93737..0bc913a 100644 --- a/services/modules/quen3/quen3.js +++ b/services/modules/quen3/quen3.js @@ -18,66 +18,72 @@ const module_exports = { description: "Generates documents using QWEN 3 235B via SAIA platform", async function(parameter) { - try { - console.log("SAIA QWEN 3 235B module invoked with parameters:", parameter); + return new Promise(async (resolve, reject) => { + try { + // console.log("SAIA QWEN 3 235B module invoked with parameters:", parameter); - await this.createDocumentFromTranscript( // Call the function to create document with transcript, document type and language - parameter.inputTranscriptPath, // Path to input transcript file - parameter.documentTypePath, // Path to document type file which is chosen in the front end by the user - parameter.language // Language for the document which is chosen in the front end by the user - ); + resolve(await this.createDocumentFromTranscript( //Call the function to create document with transcript, document type and language + parameter.inputTranscriptPath, // Path to input transcript file + parameter.documentTypePath, // Path to document type file which is chosen in the front end by the user + parameter.language // Language for the document which is chosen in the front end by the user + )); + + } catch (error) { + // console.error("Error in SAIA QWEN 3 235B module:", error); + reject(error) + } + }) - } catch (error) { - console.error("Error in SAIA QWEN 3 235B module:", error); - } }, createDocumentFromTranscript: async function(transcriptPath, documentTypePath, language = "en") { // default language is English - try { - const transcript = await fs.promises.readFile(transcriptPath, "utf-8"); // read transcript file from Path - const documentType = await fs.promises.readFile(documentTypePath, "utf-8"); // read document type from Path - const promptText = `${documentType}, in language ${language}, transcript:\n\n${transcript}`; // combine doc type, language and transcript - Change prompt here if needed + return new Promise(async(resolve, reject) => { + try { + const transcript = await fs.promises.readFile(transcriptPath, "utf-8"); //read transcript file from Path + const documentType = await fs.promises.readFile(documentTypePath, "utf-8"); //read document type from Path + const promptText = `${documentType}, in language ${language}, transcript:\n\n${transcript}`; //combine doc type, language and transcript - Change prompt here if needed - // --- REST CALL --- - const response = await fetch(SAIA_URL, { - method: "POST", - headers: { - "Authorization": `Bearer ${SAIA_API_KEY}`, - "Accept": "application/json", - "Content-Type": "application/json" - }, - body: JSON.stringify({ - model: "qwen3-235b-a22b", - messages: [ - { role: "system", content: "You are a helpful assistant that generates HTML documents from transcripts. Output only valid HTML content without any preamble, explanations, or markdown formatting." }, - { role: "user", content: promptText } - ], - temperature: 0 - }) - }); + // --- REST CALL --- + const response = await fetch(SAIA_URL, { //safe model response in variable + method: "POST", + headers: { + "Authorization": `Bearer ${SAIA_API_KEY}`, + "Accept": "application/json", + "Content-Type": "application/json" + }, + body: JSON.stringify({ + model: "qwen3-235b-a22b", + messages: [ + { role: "system", content: "You are a helpful assistant that generates HTML documents from transcripts. Output only valid HTML content without any preamble, explanations, or markdown formatting." }, + { role: "user", content: promptText } + ], + temperature: 0 + }) + }); - if (!response.ok) { // ok is true when a response was successful - const text = await response.text(); - throw new Error(`SAIA API error (${response.status}): ${text}`); + if (!response.ok) { //ok is true when a responce was successfull + const text = await response.text(); + throw new Error(`SAIA API error (${response.status}): ${text}`); + } + + const data = await response.json(); + + // Get generated text from response or default to empty string (if null) + // SAIA uses OpenAI-compatible structure: data.choices[x].message.content + const output = data.choices?.[0]?.message?.content || ""; + let inputTranscriptName = path.basename(transcriptPath, path.extname(transcriptPath)); // Name for the output file + // console.log(inputTranscriptName); + const outPath = path.join(outputDir, `${inputTranscriptName}.html`); // Output file path & name to make naming dynamic. Pulled from input transcript name + fs.writeFileSync(outPath, output, "utf8"); // Write output to file + + // console.log("Generated document written to:", outPath); + resolve(outPath) + + } catch (error) { + // console.error("Error generating SAIA content:", error); + reject(error) } - - const data = await response.json(); - - // Get generated text from response or default to empty string (if null) - // SAIA uses OpenAI-compatible structure: data.choices[x].message.content - const output = data.choices?.[0]?.message?.content || ""; - - let inputTranscriptName = path.basename(transcriptPath, path.extname(transcriptPath)); // Name for the output file - console.log(inputTranscriptName); - - const outPath = path.join(outputDir, `${inputTranscriptName}.html`); // Output file path & name to make naming dynamic. Pulled from input transcript name - fs.writeFileSync(outPath, output, "utf8"); // Write output to file - - console.log("Generated document written to:", outPath); - - } catch (error) { - console.error("Error generating SAIA content:", error); - } + }) } };