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" const GEMINI_API_KEY = process.env.GOOGLE_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 module.exports = { name: "llm-gemini", type: "llm", displayname: "Gemini LLM", description: "Generates documents using Google Gemini LLM", async function(parameter) { try { console.log("Gemini LLM 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 ); } catch (error) { console.error("Error in Gemini LLM 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 // --- 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}.md`); // 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 Gemini content:", error); } } };