Integraties

E-mail versturen vanuit Vercel AI SDK

Voeg e-mail toe als tool in een generateText- of streamText-flow met de Vercel AI SDK.

Multi-provider Webhooks

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.

Volgende stappen