mirror of
https://gitlab.rlp.net/proj-wise2526-video2document/video2document.git
synced 2026-06-15 18:01:52 +02:00
6b3724b765
Since API keys are now loaded from the auth server, this means that there is a delay between starting the software, loading the keys, and loading all the module files. Due to nodejs running Async, the modules are being loaded BEFORE the api keys have been returned from the auth server. So now the api keys are being set inside the module every time the module is being called. This has absolutely no impact on performance, or security, plus, this was the easiest solution, especially as it required no big changes to the rest of the code
135 lines
5.7 KiB
JavaScript
135 lines
5.7 KiB
JavaScript
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
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
|
|
}
|
|
|
|
// Ensure Google API key is set in environment variables: export GOOGLE_API_KEY="your_api_key_here"
|
|
let GEMINI_API_KEY; // Ensure Google API key is set in environment variables: export GOOGLE_API_KEY="your_api_key_here"
|
|
const GEMINI_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent"; // URL for the REST call, used model and action
|
|
|
|
const module_exports = {
|
|
name: "llm-gemini",
|
|
type: "llm",
|
|
displayname: "Gemini LLM",
|
|
description: "Generates documents using Google Gemini LLM",
|
|
|
|
async function(parameter) {
|
|
GEMINI_API_KEY = process.env.GOOGLE_API_KEY;
|
|
return new Promise(async (resolve, reject) => {
|
|
try {
|
|
// console.log("Gemini LLM module invoked with parameters:", parameter);
|
|
|
|
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 Gemini LLM module:", error);
|
|
reject(error)
|
|
}
|
|
})
|
|
|
|
},
|
|
|
|
createDocumentFromTranscript: async function(transcriptPath, documentTypePath, language = "en") { // default language is English
|
|
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(`${GEMINI_URL}?key=${GEMINI_API_KEY}`, { //safe model response in variable
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json"
|
|
},
|
|
body: JSON.stringify({
|
|
contents: [
|
|
{
|
|
parts: [
|
|
{ text: promptText } // Input prompt for content generation
|
|
]
|
|
}
|
|
]
|
|
})
|
|
});
|
|
|
|
if (!response.ok) { //ok is true when a responce was successfull
|
|
const text = await response.text();
|
|
throw new Error(`Gemini API error (${response.status}): ${text}`);
|
|
}
|
|
|
|
const data = await response.json();
|
|
|
|
// Get generated text from response or default to empty string (if null)
|
|
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}.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 Gemini content:", error);
|
|
reject(error)
|
|
}
|
|
})
|
|
}
|
|
};
|
|
|
|
module.exports = module_exports;
|
|
|
|
// CLI Mode: Allow direct execution
|
|
if (require.main === module) {
|
|
(async () => {
|
|
const args = process.argv.slice(2);
|
|
|
|
if (args.length < 2) {
|
|
console.error("Usage: node llm-gemini.js <transcriptPath> <documentTypePath> [language]");
|
|
console.error("Example: node llm-gemini.js ./transcript.json ./docType.txt de");
|
|
process.exit(1);
|
|
}
|
|
|
|
const [transcriptPath, documentTypePath, language] = args;
|
|
|
|
// Check if API key is set
|
|
if (!GEMINI_API_KEY) {
|
|
console.error("ERROR: GOOGLE_API_KEY environment variable is not set!");
|
|
console.error("Please set it with: export GOOGLE_API_KEY='your_api_key_here'");
|
|
process.exit(1);
|
|
}
|
|
|
|
// Check if files exist
|
|
if (!fs.existsSync(transcriptPath)) {
|
|
console.error(`ERROR: Transcript file not found: ${transcriptPath}`);
|
|
process.exit(1);
|
|
}
|
|
|
|
if (!fs.existsSync(documentTypePath)) {
|
|
console.error(`ERROR: Document type file not found: ${documentTypePath}`);
|
|
process.exit(1);
|
|
}
|
|
|
|
console.log("Starting document generation...");
|
|
console.log(`Transcript: ${transcriptPath}`);
|
|
console.log(`Document Type: ${documentTypePath}`);
|
|
console.log(`Language: ${language || 'en (default)'}`);
|
|
|
|
await module_exports.createDocumentFromTranscript(
|
|
transcriptPath,
|
|
documentTypePath,
|
|
language || 'en'
|
|
);
|
|
|
|
console.log("Done!");
|
|
})();
|
|
} |