Integraties

E-mail versturen vanuit LangChain

Voeg Wesender toe als LangChain-tool zodat je agent e-mails kan versturen als onderdeel van een keten of graph.

Agent-framework Webhooks

Vereisten

  • Wesender-account met geverifieerd verzenddomein
  • API-sleutel (WESENDER_API_KEY)
  • Node.js 18 of nieuwer
  • LangChain 0.3 of nieuwer (npm: @langchain/core, @langchain/openai)

Stap 1: Installeer de benodigde packages

Installeer LangChain, de Wesender SDK en Zod voor schema-validatie.

npm install @langchain/core @langchain/openai @wesender/node zod

Stap 2: Definieer de Wesender-tool

Gebruik de tool()-functie uit @langchain/core/tools om een gestructureerde tool te maken. Het Zod-schema beschrijft de parameters die de LLM kan invullen.

import { tool } from "@langchain/core/tools"
import { z } from "zod"
import { Wesender } from "@wesender/node"

const emailClient = new Wesender(process.env.WESENDER_API_KEY!)

export const sendEmailTool = tool(
  async ({ from, to, subject, html }) => {
    await emailClient.emails.send({ from, to, subject, html })
    return "E-mail verstuurd naar " + to
  },
  {
    name: "send_email",
    description: "Verstuur een e-mail via Wesender",
    schema: z.object({
      from:    z.string().describe("Afzenderadres op je geverifieerde domein"),
      to:      z.string().describe("Ontvanger-e-mailadres"),
      subject: z.string().describe("Onderwerpregel"),
      html:    z.string().describe("HTML-inhoud van het bericht"),
    }),
  }
)

Stap 3: Koppel de tool aan een agent

Geef de tool mee aan een LangChain-agent. De agent beslist zelf wanneer hij de tool aanroept op basis van de conversatie.

import { createOpenAIFunctionsAgent, AgentExecutor } from "langchain/agents"
import { ChatOpenAI } from "@langchain/openai"
import { ChatPromptTemplate } from "@langchain/core/prompts"
import { sendEmailTool } from "./tools"

const llm = new ChatOpenAI({ model: "gpt-4o", temperature: 0 })
const prompt = ChatPromptTemplate.fromMessages([
  ["system", "Je bent een behulpzame assistent die taken uitvoert."],
  ["human", "{input}"],
  ["placeholder", "{agent_scratchpad}"],
])

const agent = await createOpenAIFunctionsAgent({ llm, tools: [sendEmailTool], prompt })
const executor = new AgentExecutor({ agent, tools: [sendEmailTool] })

const result = await executor.invoke({
  input: "Stuur een samenvatting van de dagelijkse updates naar jan@jouwdomein.nl",
})
console.log(result.output)

Volledig voorbeeld

Hier is de volledige implementatie in agent.ts:

import { tool } from "@langchain/core/tools"
import { createOpenAIFunctionsAgent, AgentExecutor } from "langchain/agents"
import { ChatOpenAI } from "@langchain/openai"
import { ChatPromptTemplate } from "@langchain/core/prompts"
import { z } from "zod"
import { Wesender } from "@wesender/node"

const emailClient = new Wesender(process.env.WESENDER_API_KEY!)

// Wesender als gestructureerde LangChain-tool
const sendEmailTool = tool(
  async ({ from, to, subject, html }) => {
    try {
      await emailClient.emails.send({ from, to, subject, html })
      return "E-mail verstuurd naar " + to
    } catch (err) {
      return "Verzending mislukt: " + String(err)
    }
  },
  {
    name: "send_email",
    description: "Verstuur een transactionele e-mail via Wesender",
    schema: z.object({
      from:    z.string().describe("Afzenderadres op je geverifieerde domein"),
      to:      z.string().describe("Ontvanger-e-mailadres"),
      subject: z.string().describe("Onderwerpregel"),
      html:    z.string().describe("HTML-inhoud van het bericht"),
    }),
  }
)

// Agent met de tool
const llm = new ChatOpenAI({ model: "gpt-4o", temperature: 0 })
const prompt = ChatPromptTemplate.fromMessages([
  ["system", "Je bent een behulpzame assistent. Gebruik send_email om e-mails te versturen."],
  ["human", "{input}"],
  ["placeholder", "{agent_scratchpad}"],
])

const agent = await createOpenAIFunctionsAgent({ llm, tools: [sendEmailTool], prompt })
const executor = new AgentExecutor({ agent, tools: [sendEmailTool], verbose: false })

const result = await executor.invoke({ input: process.argv[2] ?? "Stuur een testmail naar test@jouwdomein.nl" })
console.log(result.output)

Bezorgstatussen via webhooks

LangChain kan bezorg-, bounce- en klachtsignalen ontvangen via webhooks. Configureer een webhook-endpoint in je LangChain-workflow dat POST-verzoeken van Wesender accepteert. Zie Webhooks instellen voor de volledige configuratiestappen en het payload-formaat.

Veelgestelde vragen

Werkt dit ook met LangGraph?

Ja. Je kunt sendEmailTool direct doorgeven als tool in een LangGraph-graph. Voeg hem toe aan de tools-lijst van een ToolNode en bind hem aan je LLM via llm.bindTools([sendEmailTool]).

Kan ik ook een Python-versie gebruiken?

Ja. Installeer langchain en wesender via pip. Maak een StructuredTool met from_function() en een Pydantic-model als args_schema. De Wesender Python SDK gebruikt wesender.Client(api_key=...).emails.send(...).

Hoe voorkom ik dat de agent twee keer dezelfde mail verstuurt?

LangChain biedt geen ingebouwde idempotentie. Voeg een controle toe in de tool-handler: sla een hash van (to, subject, tijdstip) op in een database en sla de verzending over als de hash al bestaat.

Volgende stappen