E-mail versturen vanuit Google Gemini
Gemini Function Calling in TypeScript — laat je Gemini-model e-mail versturen via Wesender.
Vereisten
- Node.js 20+ en TypeScript
- Wesender-account met API-sleutel
- npm install @google/generative-ai @wesender/node
- Omgevingsvariabelen: WESENDER_API_KEY en GEMINI_API_KEY
Stap 1: Installeer de Google Generative AI SDK en Wesender
Voeg de officiële Google SDK en de Wesender Node SDK toe aan je project.
npm install @google/generative-ai @wesender/node Stap 2: Definieer send_email als Gemini-functie
Gemini Function Calling gebruikt een JSON-schema om beschikbare functies te beschrijven. Definieer de parameters zodat Gemini weet hoe de functie aan te roepen.
import { GoogleGenerativeAI } from "@google/generative-ai"
const sendEmailDeclaration = {
name: "send_email",
description: "Verstuur een e-mail via Wesender",
parameters: {
type: "OBJECT",
properties: {
to: { type: "STRING", description: "E-mailadres van de ontvanger" },
subject: { type: "STRING", description: "Onderwerpregel van de e-mail" },
html: { type: "STRING", description: "HTML-inhoud van de e-mail" },
},
required: ["to", "subject", "html"],
},
} Stap 3: Voer de function call uit via Wesender
Wanneer Gemini een functionCall teruggeeft, voer je de logica uit met de Wesender Node SDK en stuur je het resultaat terug in de conversatie.
import { Wesender } from "@wesender/node"
const emailClient = new Wesender(process.env.WESENDER_API_KEY!)
async function handleFunctionCall(name: string, args: Record<string, string>) {
if (name === "send_email") {
const result = await emailClient.emails.send({
from: "noreply@jouwdomein.nl",
to: args.to,
subject: args.subject,
html: args.html,
})
return { success: true, id: result.id }
}
throw new Error(`Onbekende functie: ${name}`)
} Stap 4: Bouw de conversatielus
Stuur berichten naar Gemini, verwerk function calls en herhaal totdat het model een definitief tekstantwoord geeft.
const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY!)
const model = genAI.getGenerativeModel({
model: "gemini-1.5-pro",
tools: [{ functionDeclarations: [sendEmailDeclaration] }],
})
const chat = model.startChat()
let result = await chat.sendMessage(
"Stuur een welkomstmail naar jan@voorbeeld.nl."
)
while (result.response.functionCalls()?.length) {
const call = result.response.functionCalls()![0]
const output = await handleFunctionCall(
call.name,
call.args as Record<string, string>
)
result = await chat.sendMessage([{
functionResponse: { name: call.name, response: output },
}])
}
console.log(result.response.text()) Volledig voorbeeld
Hier is de volledige implementatie in gemini-email-agent.ts:
import { GoogleGenerativeAI } from "@google/generative-ai"
import { Wesender } from "@wesender/node"
const emailClient = new Wesender(process.env.WESENDER_API_KEY!)
const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY!)
const model = genAI.getGenerativeModel({
model: "gemini-1.5-pro",
tools: [{
functionDeclarations: [{
name: "send_email",
description: "Verstuur een e-mail via Wesender",
parameters: {
type: "OBJECT",
properties: {
to: { type: "STRING" },
subject: { type: "STRING" },
html: { type: "STRING" },
},
required: ["to", "subject", "html"],
},
}],
}],
})
async function runAgent(prompt: string) {
const chat = model.startChat()
let result = await chat.sendMessage(prompt)
while (result.response.functionCalls()?.length) {
const call = result.response.functionCalls()![0]
const args = call.args as { to: string; subject: string; html: string }
const emailResult = await emailClient.emails.send({
from: "noreply@jouwdomein.nl",
to: args.to,
subject: args.subject,
html: args.html,
})
result = await chat.sendMessage([{
functionResponse: {
name: call.name,
response: { success: true, id: emailResult.id },
},
}])
}
return result.response.text()
}
console.log(await runAgent(
"Stuur een welkomstmail naar jan@voorbeeld.nl met een vriendelijke begroeting."
)) Bezorgstatussen via webhooks
Google Gemini kan bezorg-, bounce- en klachtsignalen ontvangen via webhooks. Configureer een webhook-endpoint in je Google Gemini-workflow dat POST-verzoeken van Wesender accepteert. Zie Webhooks instellen voor de volledige configuratiestappen en het payload-formaat.
Veelgestelde vragen
Welke Gemini-modellen ondersteunen Function Calling?
Gemini 1.5 Pro en Gemini 1.5 Flash ondersteunen beiden Function Calling. Flash is goedkoper en sneller; Pro is beter in complexe redeneringen. Beide werken identiek met de bovenstaande code.
Kan Gemini meerdere functies tegelijk aanroepen?
Ja, Gemini kan parallelle function calls teruggeven. Itereer dan over result.response.functionCalls() volledig en verwerk alle resultaten gelijktijdig met Promise.all voor betere prestaties.
Hoe beperk ik welke functies Gemini mag aanroepen?
Gebruik toolConfig in de modelconfiguratie met mode: 'ANY' en een allowedFunctionNames-lijst. Zo beperk je Gemini tot uitsluitend send_email, ook als je meer functies definieert.