E-mail versturen vanuit Vercel AI SDK
Voeg e-mail toe als tool in een generateText- of streamText-flow met de Vercel AI SDK.
Vereisten
- Wesender-account met geverifieerd verzenddomein
- API-sleutel (WESENDER_API_KEY)
- Node.js 18 of nieuwer
- Vercel AI SDK 4 of nieuwer (npm: ai, @ai-sdk/openai)
Stap 1: Installeer de packages
Installeer de Vercel AI SDK, een modelprovider en de Wesender SDK.
npm install ai @ai-sdk/openai @wesender/node zod Stap 2: Definieer de send_email tool
Gebruik de tool()-functie uit de ai-package. Het Zod-schema valideert de parameters die het model aanlevert en TypeScript weet automatisch wat de typen zijn in de execute-functie.
import { tool } from "ai"
import { z } from "zod"
import { Wesender } from "@wesender/node"
const emailClient = new Wesender(process.env.WESENDER_API_KEY!)
export const sendEmailTool = tool({
description: "Verstuur een transactionele e-mail via Wesender",
parameters: z.object({
to: z.string().describe("Ontvanger-e-mailadres"),
subject: z.string().describe("Onderwerpregel"),
html: z.string().describe("HTML-inhoud van het bericht"),
}),
execute: async ({ to, subject, html }) => {
await emailClient.emails.send({
from: "agent@jouwdomein.nl",
to,
subject,
html,
})
return { verstuurd: true, naar: to }
},
}) Stap 3: Gebruik de tool in generateText
Geef de tool mee aan generateText. Zet maxSteps hoger dan 1 zodat het model meerdere tool-aanroepen mag doen voordat het antwoordt.
import { generateText } from "ai"
import { openai } from "@ai-sdk/openai"
import { sendEmailTool } from "./tools"
const { text, steps } = await generateText({
model: openai("gpt-4o"),
system: "Je bent een assistent die taken uitvoert. Gebruik send_email om e-mails te versturen.",
prompt: "Stuur een samenvatting van de dagelijkse updates naar jan@jouwdomein.nl",
tools: { send_email: sendEmailTool },
maxSteps: 5,
})
console.log(text)
// Bekijk welke tools zijn aangeroepen
for (const step of steps) {
console.log(step.toolCalls)
} Volledig voorbeeld
Hier is de volledige implementatie in agent.ts:
import { generateText, tool } from "ai"
import { openai } from "@ai-sdk/openai"
import { z } from "zod"
import { Wesender } from "@wesender/node"
const emailClient = new Wesender(process.env.WESENDER_API_KEY!)
// Tool-definitie
const sendEmailTool = tool({
description: "Verstuur een transactionele e-mail via Wesender",
parameters: z.object({
to: z.string().describe("Ontvanger-e-mailadres"),
subject: z.string().describe("Onderwerpregel"),
html: z.string().describe("HTML-inhoud van het bericht"),
}),
execute: async ({ to, subject, html }) => {
try {
const result = await emailClient.emails.send({
from: "agent@jouwdomein.nl",
to,
subject,
html,
})
return { verstuurd: true, id: result.id }
} catch (err) {
return { verstuurd: false, fout: String(err) }
}
},
})
// Agent-run
const { text, steps } = await generateText({
model: openai("gpt-4o"),
system: "Je bent een behulpzame assistent. Gebruik send_email om e-mails te versturen.",
prompt: process.argv[2] ?? "Stuur een testmail naar test@jouwdomein.nl",
tools: { send_email: sendEmailTool },
maxSteps: 5,
})
console.log(text)
for (const step of steps) {
if (step.toolCalls.length > 0) {
console.log("Tool-aanroepen:", step.toolCalls)
}
} Bezorgstatussen via webhooks
Vercel AI SDK kan bezorg-, bounce- en klachtsignalen ontvangen via webhooks. Configureer een webhook-endpoint in je Vercel AI SDK-workflow dat POST-verzoeken van Wesender accepteert. Zie Webhooks instellen voor de volledige configuratiestappen en het payload-formaat.
Veelgestelde vragen
Werkt dit ook met streamText voor streaming-responses?
Ja. Vervang generateText door streamText en gebruik dezelfde tools-parameter. Tool-aanroepen worden ook gestreamd zodra het model ze aanroept. Het execute-resultaat is beschikbaar via de toolResults-stream.
Kan ik andere modelproviders gebruiken, zoals Anthropic of Google?
Ja. De Vercel AI SDK is modelprovider-onafhankelijk. Vervang openai('gpt-4o') door anthropic('claude-sonnet-4-5') of google('gemini-2.0-flash'). De tool-definitie en Wesender-aanroep blijven ongewijzigd.
Hoe koppel ik bezorgingsevents terug naar mijn flow?
Stel een webhook-endpoint in via het Wesender-dashboard. Wesender stuurt een POST naar dat endpoint bij elk bezorgingsevent (bezorgd, bounced, klacht). Je kunt de bezorgstatus opslaan en later ophalen als input voor een volgende stap in de flow.