node-red-contrib-gemini 1.0.3
Node-RED nodes for Google Gemini AI integration including text generation, chat, vision, image generation, speech generation, and audio understanding capabilities
node-red-contrib-gemini
A comprehensive Node-RED package providing nodes for Google's Gemini AI models, covering text generation, chat, vision, image generation, audio understanding, and speech synthesis.
Included Nodes
- gemini-generate-content: Text generation, multi-turn chat, and vision analysis.
- gemini-image-generate: Create and edit images (Imagen 3 / Gemini).
- gemini-speech-generate: High-quality text-to-speech synthesis.
- gemini-audio-understand: Transcription and analysis of audio files.
- gemini-api-key: Secure API credential management.
Quick Start
- Install: Search for
node-red-contrib-geminiin the Node-RED Palette Manager. - Get Key: Obtain a an API key from Google AI Studio.
- Configure: Check the API Key configuration node and paste your key.
- Select Model: In any node, click the Fetch Models (refresh) button to load the latest available models directly from Google.
Key Features
- Dynamic Model Fetching: Automatically access new models as they are released without package updates.
- Multimodal Support: Seamlessly handle text, images, video, and audio.
- Mustache Templating: Use
{{msg.payload}}or{{msg.topic}}in prompts and text fields. - Advanced Options: Support for Google Search Grounding, Streaming responses, and JSON/Enum output.
- Output Control: Send results to
msg.payload, files, or custom properties.
Examples
Text Generation with Grounding & Structured Output
[
{
"id": "e8a423a769b8dec0",
"type": "gemini-generate-content",
"z": "a6c480dcb27b87bd",
"g": "7c41675671016995",
"name": "",
"apiKey": "fe0d58f14ac27f69",
"modelSelection": "gemini-3-flash-preview",
"customModel": "",
"customModelType": "str",
"mode": "single",
"prompt": "Does the movie {{msg.payload.movie}} have an after credits scene? Answer as briefly as possible. ",
"promptType": "str",
"multimodalInputsData": "[]",
"grounding": true,
"temperature": "1",
"temperatureType": "num",
"topP": "0.95",
"topPType": "num",
"topK": "64",
"topKType": "num",
"maxOutputTokens": "8192",
"maxOutputTokensType": "num",
"safetyHarassment": "BLOCK_MEDIUM_AND_ABOVE",
"safetyHateSpeech": "BLOCK_MEDIUM_AND_ABOVE",
"safetySexuallyExplicit": "BLOCK_MEDIUM_AND_ABOVE",
"safetyDangerousContent": "BLOCK_MEDIUM_AND_ABOVE",
"thinkingBudget": "-1",
"thinkingBudgetType": "num",
"thinkingLevel": "",
"thinkingLevelType": "str",
"includeThoughts": false,
"systemInstruction": "",
"systemInstructionType": "str",
"outputProperty": "msg.payload.details",
"passthroughProperties": false,
"responseFormat": "json",
"schemaPropertiesData": "[{\"name\":\"afterCredits\",\"type\":\"BOOLEAN\",\"required\":true},{\"name\":\"details\",\"type\":\"STRING\",\"required\":true},{\"name\":\"sourceURL1\",\"type\":\"STRING\",\"required\":true},{\"name\":\"sourceURL2\",\"type\":\"STRING\",\"required\":false}]",
"enumValues": "",
"x": 650,
"y": 500,
"wires": [
[
"14a2617d6e1c1a49"
],
[
"14a2617d6e1c1a49"
]
]
},
{
"id": "0553c65f94a35371",
"type": "inject",
"z": "a6c480dcb27b87bd",
"g": "7c41675671016995",
"name": "Send movie example (structured output + grounding)",
"props": [
{
"p": "payload.movie",
"v": "The Long Walk",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 310,
"y": 500,
"wires": [
[
"e8a423a769b8dec0"
]
]
},
{
"id": "14a2617d6e1c1a49",
"type": "debug",
"z": "a6c480dcb27b87bd",
"g": "7c41675671016995",
"name": "Text generate (grounding + search) debug",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 1020,
"y": 500,
"wires": []
},
{
"id": "fe0d58f14ac27f69",
"type": "gemini-api-key",
"name": "node-red-free"
},
{
"id": "90b01cfcf7ce8cba",
"type": "global-config",
"env": [],
"modules": {
"node-red-contrib-gemini": "1.0.2"
}
}
]
Image Generation & Editing
[{"id":"be4d6ff6a36494ee","type":"group","z":"a6c480dcb27b87bd","style":{"stroke":"#999999","stroke-opacity":"1","fill":"none","fill-opacity":"1","label":true,"label-position":"nw","color":"#a4a4a4"},"nodes":["6fc837881ae39da0","c48c713b1208e241","a7f861aa9e06a8bb","a773e54e40b4e08b","f877c30efdbbeeeb","18ea36bf88be42b6","ea909ae5b69bfe15"],"x":64,"y":739,"w":1562,"h":262},{"id":"6fc837881ae39da0","type":"gemini-image-generate","z":"a6c480dcb27b87bd","g":"be4d6ff6a36494ee","name":"Generate Image","apiKey":"86f1d6e41a7140a9","modelSelection":"gemini-2.5-flash-image","customModel":"","customModelType":"str","prompt":"Generate an image of Scooby Doo having fun with his best friend, a green banana. They should be in a jurassic era volcanic setting with dinosaurs lurking","promptType":"str","numberOfImages":"1","numberOfImagesType":"num","aspectRatio":"1:1","outputFormat":"base64","saveDirectory":"","saveDirType":"str","mode":"generate","inputFile":"","inputFileType":"str","outputProperty":"msg.inputImages","systemInstruction":"","systemInstructionType":"str","responseModalities":"image","safetyHarassment":"BLOCK_MEDIUM_AND_ABOVE","safetyHateSpeech":"BLOCK_MEDIUM_AND_ABOVE","safetySexuallyExplicit":"BLOCK_MEDIUM_AND_ABOVE","safetyDangerousContent":"BLOCK_MEDIUM_AND_ABOVE","x":440,"y":800,"wires":[[["c48c713b1208e241","ea909ae5b69bfe15","a773e54e40b4e08b"],["ea909ae5b69bfe15"]]]},{"id":"c48c713b1208e241","type":"image viewer","z":"a6c480dcb27b87bd","g":"be4d6ff6a36494ee","name":"","width":"580","data":"inputImages","dataType":"msg","active":true,"x":930,"y":780,"wires":[[]]},{"id":"a7f861aa9e06a8bb","type":"inject","z":"a6c480dcb27b87bd","g":"be4d6ff6a36494ee","name":"Test image gen and edit","props":[],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":210,"y":800,"wires":[["6fc837881ae39da0"]]},{"id":"a773e54e40b4e08b","type":"gemini-image-generate","z":"a6c480dcb27b87bd","g":"be4d6ff6a36494ee","name":"Modify Image","apiKey":"86f1d6e41a7140a9","modelSelection":"gemini-2.5-flash-image","customModel":"","customModelType":"str","prompt":"Add a spooky jack o' lantern on top of scooby's head","promptType":"str","numberOfImages":"1","numberOfImagesType":"num","aspectRatio":"1:1","outputFormat":"base64","saveDirectory":"","saveDirType":"str","mode":"edit","inputFile":"","inputFileType":"str","outputProperty":"payload","systemInstruction":"","systemInstructionType":"str","responseModalities":"image","safetyHarassment":"BLOCK_MEDIUM_AND_ABOVE","safetyHateSpeech":"BLOCK_MEDIUM_AND_ABOVE","safetySexuallyExplicit":"BLOCK_MEDIUM_AND_ABOVE","safetyDangerousContent":"BLOCK_MEDIUM_AND_ABOVE","x":500,"y":960,"wires":[[["f877c30efdbbeeeb","18ea36bf88be42b6"],["f877c30efdbbeeeb"]]]},{"id":"f877c30efdbbeeeb","type":"debug","z":"a6c480dcb27b87bd","g":"be4d6ff6a36494ee","name":"image 2 debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":760,"y":860,"wires":[]},{"id":"18ea36bf88be42b6","type":"image viewer","z":"a6c480dcb27b87bd","g":"be4d6ff6a36494ee","name":"","width":"580","data":"payload","dataType":"msg","active":true,"x":1530,"y":780,"wires":[[]]},{"id":"ea909ae5b69bfe15","type":"debug","z":"a6c480dcb27b87bd","g":"be4d6ff6a36494ee","name":"image 1 debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":760,"y":820,"wires":[]},{"id":"86f1d6e41a7140a9","type":"gemini-api-key","name":"node-red-paid"}]
Audio Generation & Understanding
[
{
"id": "eba78a6484fd41a0",
"type": "gemini-speech-generate",
"z": "a6c480dcb27b87bd",
"g": "e853ab82cdb9436c",
"name": "",
"apiKey": "fe0d58f14ac27f69",
"model": "gemini-2.5-flash-preview-tts",
"text": "james: Hello! I have no idea what I'm doing. blueman: This is a test of the multi-speaker generation with gemini in node-red",
"textType": "str",
"speakerMode": "multi",
"voiceName": "",
"speaker1Name": "james",
"speaker1Voice": "Achernar",
"speaker2Name": "blueman",
"speaker2Voice": "Iapetus",
"outputFormat": "buffer",
"saveDirectory": "",
"saveDirType": "str",
"filename": "itsatest2",
"filenameType": "str",
"systemInstruction": "",
"systemInstructionType": "str",
"maxOutputTokens": "",
"maxOutputTokensType": "num",
"outputProperty": "msg.audioData",
"passthroughProperties": false,
"x": 590,
"y": 660,
"wires": [
[
"f06072a81460fba7",
"7e5e2bc15661e2c7"
],
[
"f06072a81460fba7"
]
]
},
{
"id": "ec11788db1f8ad68",
"type": "inject",
"z": "a6c480dcb27b87bd",
"g": "e853ab82cdb9436c",
"name": "Geenrate audio and then understand it example",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 280,
"y": 660,
"wires": [
[
"eba78a6484fd41a0"
]
]
},
{
"id": "f06072a81460fba7",
"type": "debug",
"z": "a6c480dcb27b87bd",
"g": "e853ab82cdb9436c",
"name": "Speech generate debug",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 970,
"y": 660,
"wires": []
},
{
"id": "7e5e2bc15661e2c7",
"type": "gemini-audio-understand",
"z": "a6c480dcb27b87bd",
"g": "e853ab82cdb9436c",
"name": "",
"apiKey": "fe0d58f14ac27f69",
"model": "gemini-2.5-flash",
"prompt": "Transcribe this for me, identifying individual speakers",
"promptType": "str",
"audioFile": "",
"audioFileType": "str",
"systemInstruction": "",
"systemInstructionType": "str",
"temperature": "",
"temperatureType": "num",
"topP": "",
"topPType": "num",
"topK": "",
"topKType": "num",
"maxOutputTokens": "",
"maxOutputTokensType": "num",
"safetyHarassment": "BLOCK_MEDIUM_AND_ABOVE",
"safetyHateSpeech": "BLOCK_MEDIUM_AND_ABOVE",
"safetySexuallyExplicit": "BLOCK_MEDIUM_AND_ABOVE",
"safetyDangerousContent": "BLOCK_MEDIUM_AND_ABOVE",
"outputFormat": "text",
"saveDirectory": "",
"saveDirType": "str",
"outputProperty": "payload",
"passthroughProperties": false,
"x": 890,
"y": 600,
"wires": [
[
"887cf6ec214ba54b"
],
[
"887cf6ec214ba54b"
]
]
},
{
"id": "887cf6ec214ba54b",
"type": "debug",
"z": "a6c480dcb27b87bd",
"g": "e853ab82cdb9436c",
"name": "Audio understand debug",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 1210,
"y": 600,
"wires": []
},
{
"id": "fe0d58f14ac27f69",
"type": "gemini-api-key",
"name": "node-red-free"
},
{
"id": "5033da0e83edc623",
"type": "global-config",
"env": [],
"modules": {
"node-red-contrib-gemini": "1.0.2"
}
}
]
Disclaimer
This package was written with Claude Code. I'm not a developer by trade and am new to Git as a whole. This is also my first node-red package. I had a use for interfacing with Gemini in my node-red setup and wanted a better way of doing it. I tried to add features that I thought may be useful to a broader audience. I'll do my best to support this and keep it functional. I hope it's able to make your flows a little bit more robust :)
Instructions were given to stay within the confines of the Gemini API documentation https://ai.google.dev/gemini-api/docs as well as the Node.js SDK written by Google https://github.com/googleapis/js-genai. It was built against SDK version 1.27.0.
License
MIT License. Copyright (c) 2025.