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:
generateTextundstreamTextsenden Freitext-Prompts direkt an Anbieter — alle Benutzerdaten im Prompt gehen mitgenerateObjecterzwingt 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
useChatoderuseCompletionbedeutet, 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:
| Kategorie | Beispiele | Tier |
|---|---|---|
| Persoenliche Identifikatoren | Namen, E-Mails, Telefonnummern, SSNs, Geburtsdaten | Free (Regex), Pro (AI) |
| Finanzdaten | Kreditkartennummern, IBANs, Bankleitzahlen | Free |
| Zugangsdaten | API Keys, Bearer Tokens, Passwoerter, Connection Strings | Free |
| Netzwerk-Identifikatoren | IP-Adressen, MAC-Adressen | Free |
| Freitext-PII | Namen, Organisationen und Adressen in unstrukturiertem Text | Pro (lokale AI-Modelle) |
| Adversarial Inputs | Prompt-Injection-Versuche | Business |
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
- Preise ansehen — kostenlos fuer bis zu 1.000 Anfragen/Monat
- Dokumentation lesen — SDK-Referenz, Konfiguration und Dashboard-Anleitung
- So funktioniert es — Architektur, Erkennungsregeln und Zero-Data-Modus