PII aus Vercel AI SDK-Aufrufen schwaerzen

Senden Sie keine Namen, E-Mails und Geheimnisse mehr ueber das Vercel AI SDK. Erfahren Sie, wie Sie PII aus jedem LLM-Aufruf schwaerzen — mit einer Sicherheitsschicht auf Proxy-Ebene, ganz ohne Code-Aenderungen.

Das Problem: PII gelangt ueber Vercel AI SDK-Aufrufe nach aussen

Das Vercel AI SDK (ai) macht es einfach, KI-Funktionen mit generateText, streamText und generateObject zu bauen. Aber jeder Aufruf sendet Ihren Prompt an einen LLM-Anbieter. Wenn dieser Prompt Benutzerdaten enthaelt — Formulareingaben, Chat-Nachrichten, Datenbankeintraege — traegt er PII zu den Servern des Anbieters.

import { generateText } from "ai";
import { openai } from "@ai-sdk/openai";

const result = await generateText({
  model: openai("gpt-4o"),
  prompt: `Draft a response to this customer complaint:

    From: Amanda Foster
    Email: a.foster@megacorp.com
    Phone: (212) 555-0176
    Account: 4539-1488-0343-6467
    SSN: 613-44-2289
    Address: 350 5th Ave, New York, NY 10118
    Issue: My API key ghp_xK4mSecret123 was exposed in your logs.`,
});

Dieser einzelne Aufruf hat gerade einen Namen, eine E-Mail-Adresse, eine Telefonnummer, eine Kreditkartennummer, eine SSN, eine Adresse und einen GitHub-Token an OpenAI gesendet. Das Vercel AI SDK ist anbieterunabhaengig — dasselbe Risiko besteht, egal ob Sie OpenAI, Anthropic, Google oder einen anderen Anbieter verwenden.

Warum die Flexibilitaet des AI SDK das Risiko erhoeht

Das Vercel AI SDK ist fuer schnelle Iteration konzipiert. Diese Geschwindigkeit bringt PII-Risiken mit sich:

  • generateText und streamText senden Freitext-Prompts direkt an Anbieter — alle Benutzerdaten im Prompt gehen mit
  • generateObject erzwingt Output-Schemas, kontrolliert aber nicht, was in der Eingabe steht
  • Tool Calling kann Daten aus APIs, Datenbanken und Benutzersitzungen ziehen — und PII aus mehreren Quellen zusammenfuehren
  • Mehrstufige Agents (maxSteps) akkumulieren Kontext ueber Schritte hinweg und erhoehen die PII-Exposition mit jeder Iteration
  • Streaming zum Client ueber useChat oder useCompletion bedeutet, dass PII in Antworten den Browser erreicht

Das SDK macht es trivial einfach, Features zu bauen, die Benutzerdaten verarbeiten. Das ist seine Staerke — aber es bedeutet, dass jeder Aufruf ein potenzieller PII-Vektor ist.

Die Loesung: Proxy-basierte Schwaerzung mit Grepture

Grepture ist ein Open-Source-Sicherheitsproxy, der zwischen Ihren AI SDK-Aufrufen und jedem LLM-Anbieter sitzt. Jede Anfrage wird auf PII, Geheimnisse und sensible Muster gescannt, bevor sie Ihre Infrastruktur verlaesst. Sensible Daten werden mit umkehrbaren Token maskiert — und in der Antwort wiederhergestellt, sodass Ihre Anwendung normal funktioniert.

Ein Proxy schuetzt jeden Anbieter in Ihrem Stack. Ihr Code aendert sich kaum.

Einrichtung in 3 Minuten

1. SDK installieren

npm install @grepture/sdk

2. API Key erhalten

Registrieren Sie sich unter grepture.com/en/pricing — der kostenlose Plan umfasst 1.000 Anfragen/Monat. Kopieren Sie Ihren API Key aus dem Dashboard.

3. AI SDK-Provider einbinden

Die Vercel AI SDK-Provider akzeptieren eigene baseURL-, headers- und fetch-Optionen. Verwenden Sie clientOptions(), um den Traffic ueber Grepture zu leiten:

import { generateText } from "ai";
import { createOpenAI } from "@ai-sdk/openai";
import { Grepture } from "@grepture/sdk";

const grepture = new Grepture({
  apiKey: process.env.GREPTURE_API_KEY!,
  proxyUrl: "https://proxy.grepture.com",
});

const opts = grepture.clientOptions({
  apiKey: process.env.OPENAI_API_KEY!,
  baseURL: "https://api.openai.com/v1",
});

const openai = createOpenAI({
  baseURL: opts.baseURL,
  fetch: opts.fetch,
});

// Every generateText, streamText, and generateObject call is protected
const result = await generateText({
  model: openai("gpt-4o"),
  prompt: userInput,
});

Funktioniert mit jedem AI SDK-Provider

Das gleiche Muster funktioniert mit Anthropic, Google und jedem OpenAI-kompatiblen Anbieter:

import { createAnthropic } from "@ai-sdk/anthropic";

const opts = grepture.clientOptions({
  apiKey: process.env.ANTHROPIC_API_KEY!,
  baseURL: "https://api.anthropic.com",
});

const anthropic = createAnthropic({
  baseURL: opts.baseURL,
  fetch: opts.fetch,
});

const result = await generateText({
  model: anthropic("claude-sonnet-4-5-20250929"),
  prompt: userInput,
});

Was erkannt wird

Grepture wird im Free-Tier mit ueber 50 Erkennungsmustern und im Pro-Tier mit ueber 80 ausgeliefert:

KategorieBeispieleTier
Persoenliche IdentifikatorenNamen, E-Mails, Telefonnummern, SSNs, GeburtsdatenFree (Regex), Pro (AI)
FinanzdatenKreditkartennummern, IBANs, BankleitzahlenFree
ZugangsdatenAPI Keys, Bearer Tokens, Passwoerter, Connection StringsFree
Netzwerk-IdentifikatorenIP-Adressen, MAC-AdressenFree
Freitext-PIINamen, Organisationen und Adressen in unstrukturiertem TextPro (lokale AI-Modelle)
Adversarial InputsPrompt-Injection-VersucheBusiness

Die gesamte Erkennung laeuft auf der Grepture-Infrastruktur — es werden keine Daten an weitere Drittanbieter weitergeleitet.

Maskieren und Wiederherstellen: umkehrbare Schwaerzung

Grepture entfernt PII nicht einfach nur — es ersetzt sensible Werte durch Token, sendet den bereinigten Prompt an den Anbieter und stellt die Originalwerte in der Antwort wieder her.

Was das LLM sieht:

Draft a response to this customer complaint:
From: [PERSON_1]
Email: [EMAIL_1]
Phone: [PHONE_1]
Account: [CREDIT_CARD_1]
Issue: My API key [SECRET_1] was exposed in your logs.

Was Ihre App zurueckbekommt:

Dear Amanda Foster, thank you for reporting that your
GitHub token (ghp_xK4mSecret123) was exposed. We've
rotated the credentials and can confirm no unauthorized
access occurred on your account ending in 6467.

Das Modell verarbeitet saubere Daten. Ihre Anwendung erhaelt die vollstaendige, personalisierte Antwort. Keine PII erreicht jemals den LLM-Anbieter.

Streaming-Unterstuetzung

Grepture verarbeitet das Streaming des AI SDK nativ. streamText und useChat funktionieren ohne Aenderung — der Proxy detokenisiert Chunks in Echtzeit.

import { streamText } from "ai";

const result = streamText({
  model: openai("gpt-4o"),
  prompt: userInput,
});

for await (const chunk of result.textStream) {
  // Tokens are restored in real time
  process.stdout.write(chunk);
}

Dies funktioniert auch nahtlos mit Next.js API-Routen und dem useChat-Hook auf dem Client — die gestreamte Antwort wird detokenisiert, bevor sie den Browser erreicht.

Naechste Schritte