Kit enthält ein produktionsreifes KI-System, das vier LLM-Provider (Anthropic, OpenAI, Google, xAI) über ein einheitliches Strategy-Pattern-Interface unterstützt. Das System umfasst zwei Chat-Modi, Streaming-SSE-Antworten, pgvector-basiertes RAG und ein dreischichtiges Kostenmanagement-System.
Diese Seite behandelt die Architektur und Kernkonzepte. Für die Provider-Einrichtung siehe KI-Provider. Für das Chat-System siehe Chat-System. Für die Wissensdatenbank-Suche siehe RAG-System. Für Rate-Limiting und Credits siehe Kostenmanagement.
So funktioniert es
Jede KI-Anfrage in Kit durchläuft dieselbe Pipeline — vom React-Hook über den Provider bis zurück:
Benutzer tippt Nachricht
|
v
React Hook (useAIChat / useAICompletion)
|--- Verwaltet Nachrichtenverlauf
|--- Verwaltet Streaming-Zustand
|--- Löst Credit-Animation aus
|
v
API Route (/api/ai/stream or /api/ai/chat)
|--- 1. Feature guard (is chat mode enabled?)
|--- 2. Authentication (Clerk → DB user)
|--- 3. Rate limit check (global burst + credit balance)
|--- 4. Credit deduction (BEFORE processing)
|--- 5. Zod request validation
|
v
AI Service (ai-service.ts)
|--- Resolves model aliases
|--- Creates provider instance (cached)
|--- Routes to correct provider
|
v
Provider (OpenAI / Anthropic / Google / xAI)
|--- Sends request to provider API
|--- Handles retries with exponential backoff
|--- Streams response chunks via SSE
|
v
Response flows back
|--- Usage tracked to database (non-blocking)
|--- Credit balance invalidated in TanStack Query cache
|--- Message displayed in chat UI
Provider-Architektur
Kit verwendet das Strategy Pattern für KI-Provider. Jeder Provider implementiert dieselbe abstrakte
BaseProvider-Klasse — ein Wechsel des Providers erfordert keinerlei Code-Änderungen, sondern nur eine Aktualisierung der Umgebungsvariable.Das System erkennt automatisch, welcher Provider verwendet werden soll, basierend auf den verfügbaren API-Schlüsseln:
src/lib/ai/config.ts — Auto-Detection
export function getActiveProvider(): AIProvider | null {
// If provider is explicitly set, use it (AI_API_KEY can serve as its key)
if (aiConfig.AI_PROVIDER) {
return aiConfig.AI_PROVIDER
}
// Auto-detect based on available API keys (Anthropic preferred)
if (aiConfig.ANTHROPIC_API_KEY) return 'anthropic'
if (aiConfig.OPENAI_API_KEY) return 'openai'
if (aiConfig.GOOGLE_AI_API_KEY) return 'google'
if (aiConfig.XAI_API_KEY) return 'xai'
return null
}
Jeder Provider hat ein vorkonfiguriertes Standardmodell, das auf Kosteneffizienz optimiert ist:
src/lib/ai/config.ts — Default Models
export const DEFAULT_MODELS: Record<AIProvider, string> = {
openai: 'gpt-5-nano',
anthropic: 'claude-haiku-4-5-20251001',
google: 'gemini-2.5-flash',
xai: 'grok-4-1-fast-reasoning',
}
| Provider | Standardmodell | Kontextfenster | Optimal für |
|---|---|---|---|
| Anthropic | claude-haiku-4-5 | 200K Tokens (1M Beta) | Primär — differenziertes Reasoning, langer Kontext |
| OpenAI | gpt-5-nano | 400K Tokens | Allgemeiner Einsatz, RAG-Embeddings |
gemini-2.5-flash | 1M Tokens | Große Dokumente, Kosteneffizienz | |
| xAI | grok-4-1-fast-reasoning | 2M Tokens | Echtzeit-Daten, konversationell |
Kit verwendet das Vercel AI SDK (
ai v4.3.x) für Embeddings und den useCompletion-Hook. Das Streaming-Chat (useAIChat) nutzt einen eigenen SSE-Parser, der fünf Response-Formate über alle Provider unterstützt — das bietet robustere Multi-Provider-Unterstützung als das SDK allein.Zwei Chat-Modi
Kit bietet zwei eigenständige Chat-Erfahrungen, jeweils mit eigener Route, API und UI:
| Aspekt | LLM-Chat | RAG-Chat |
|---|---|---|
| Route | /dashboard/chat-llm | /dashboard/chat-rag |
| API | /api/ai/stream, /api/ai/chat | /api/ai/rag/ask |
| Hook | useAIChat() | Eigener RAG-Hook |
| Kontext | Direktes LLM-Gespräch | Wissensdatenbank + LLM |
| Feature-Flag | NEXT_PUBLIC_AI_LLM_CHAT_ENABLED | NEXT_PUBLIC_AI_RAG_CHAT_ENABLED |
| Token-Nutzung | Vollständiger Gesprächsverlauf | ~3–5K Tokens (RAG-Kontext) |
| Optimal für | Offene Gespräche, Coding-Hilfe | Produktsupport, FAQ |
Beide Chat-Modi sind standardmäßig aktiviert. Setze die entsprechende Umgebungsvariable auf
false, um einen Modus zu deaktivieren. Die Navigation blendet deaktivierte Chat-Modi automatisch aus.Feature-Flags
Sieben Umgebungsvariablen steuern, welche KI-Funktionen verfügbar sind. Alle sind standardmäßig auf
true (aktiviert) gesetzt:src/lib/ai/feature-flags.ts — Feature Configuration
export const AI_CHAT_FEATURES = {
/**
* RAG Chat (Modern UI)
* Routes: /dashboard/chat-rag, /api/ai/rag/*
* Features: Modern chat UI, Knowledge Base integration, Source Attribution
*/
ragChat: process.env.NEXT_PUBLIC_AI_RAG_CHAT_ENABLED !== 'false',
/**
* LLM Chat (Direct Chat)
* Routes: /dashboard/chat-llm, /api/ai/chat, /api/ai/stream
* Features: Modern chat UI, Direct LLM conversation, Streaming
*/
llmChat: process.env.NEXT_PUBLIC_AI_LLM_CHAT_ENABLED !== 'false',
/**
* Vision Chat (Image Analysis in LLM Chat)
* Extends LLM Chat with image upload and analysis capabilities.
* Requires LLM Chat to be enabled. Only active when BOTH flags are true.
* Features: Drag & Drop, Paste, File picker, Base64 image transport
*/
visionChat:
process.env.NEXT_PUBLIC_AI_LLM_CHAT_ENABLED !== 'false' &&
process.env.NEXT_PUBLIC_AI_VISION_ENABLED !== 'false',
/**
* PDF Chat (Document Analysis in LLM Chat)
* Extends LLM Chat with PDF upload and text extraction capabilities.
* Requires LLM Chat to be enabled. Only active when BOTH flags are true.
* Features: Drag & Drop, File picker, server-side text extraction, all providers
*/
pdfChat:
process.env.NEXT_PUBLIC_AI_LLM_CHAT_ENABLED !== 'false' &&
process.env.NEXT_PUBLIC_AI_PDF_CHAT_ENABLED !== 'false',
/**
* Audio Input (Speech-to-Text for all AI Chats)
* Adds microphone recording and Whisper transcription to any AI input field.
* Standalone feature — works with LLM Chat, RAG Chat, and Image Gen.
* Features: MediaRecorder, Whisper STT, editable transcript in input field
*/
audioInput: process.env.NEXT_PUBLIC_AI_AUDIO_INPUT_ENABLED !== 'false',
/**
* Image Generation (Text-to-Image)
* Routes: /dashboard/image-gen, /api/ai/image-gen
* Features: GPT Image models, multiple sizes/qualities/formats, transparent backgrounds
* Standalone feature — does NOT require LLM Chat to be enabled.
*/
imageGen: process.env.NEXT_PUBLIC_AI_IMAGE_GEN_ENABLED !== 'false',
/**
* Content Generator (Template-based Text Generation)
* Routes: /dashboard/content, /api/ai/generate-content
* Features: 5 templates (Email, Product, Blog, Social, Marketing), tone/language/length controls, streaming output
* Standalone feature — does NOT require LLM Chat to be enabled.
*/
contentGen: process.env.NEXT_PUBLIC_AI_CONTENT_GEN_ENABLED !== 'false',
} as const
| Variable | Standard | Steuert |
|---|---|---|
NEXT_PUBLIC_AI_RAG_CHAT_ENABLED | true | RAG-Chat unter /dashboard/chat-rag |
NEXT_PUBLIC_AI_LLM_CHAT_ENABLED | true | LLM-Chat unter /dashboard/chat-llm |
NEXT_PUBLIC_AI_VISION_ENABLED | true | Bildanalyse im LLM-Chat (erfordert aktivierten LLM-Chat) |
NEXT_PUBLIC_AI_AUDIO_INPUT_ENABLED | true | Spracheingabe via Speech-to-Text im LLM-Chat (erfordert aktivierten LLM-Chat) |
NEXT_PUBLIC_AI_PDF_CHAT_ENABLED | true | PDF-Analyse im LLM-Chat (erfordert aktivierten LLM-Chat) |
NEXT_PUBLIC_AI_IMAGE_GEN_ENABLED | true | Bildgenerierung unter /dashboard/image-gen |
NEXT_PUBLIC_AI_CONTENT_GEN_ENABLED | true | Content-Generator unter /dashboard/content |
Wenn Vision-Chat aktiviert ist, können Benutzer Bilder per Drag & Drop, Zwischenablage oder Dateiauswahl an LLM-Chat-Nachrichten anhängen. Bilder werden als
ContentPart[] (Base64-Data-URIs) an /api/ai/stream gesendet, das automatisch den image_analysis-Credit-Vorgang (30 Credits) auswählt. Weitere Details im Chat-System.Wenn Audio-Eingabe aktiviert ist, erscheint eine Mikrofon-Schaltfläche im LLM-Chat-Eingabebereich. Benutzer können Sprachnachrichten aufnehmen (bis zu 120 Sekunden), die über die Whisper-API unter
/api/ai/speech-to-text transkribiert werden (20 Credits pro Transkription). Der transkribierte Text wird in das Chat-Eingabefeld eingefügt. Weitere Details im Chat-System.Wenn Bildgenerierung aktiviert ist, bietet die Route
/dashboard/image-gen eine Text-zu-Bild-Oberfläche mit OpenAIs GPT-Image-Modellen (gpt-image-1, gpt-image-1.5, gpt-image-1-mini). Benutzer können Größe, Qualität, Format und Hintergrundtransparenz konfigurieren. Generierte Bilder werden im Sitzungsverlauf gespeichert (bis zu 10 Einträge). Im Gegensatz zu Chat-Funktionen ist die Bildgenerierung ein eigenständiges Feature — sie erfordert keinen aktivierten LLM-Chat.Wenn der Content-Generator aktiviert ist, bietet die Route
/dashboard/content eine vorlagenbasierte Textgenerierungs-Oberfläche mit fünf Vorlagen (E-Mail, Produktbeschreibung, Blog-Gliederung, Social Media, Marketing-Text). Benutzer können Ton, Sprache und Länge konfigurieren. Der Generator nutzt SSE-Streaming zur progressiven Ausgabe. Wie die Bildgenerierung ist auch der Content-Generator ein eigenständiges Feature — er erfordert keinen aktivierten LLM-Chat.Feature-Flags werden auf zwei Ebenen geprüft:
- Seitenebene — Guard-Funktionen
shouldShowRAGChat()/shouldShowLLMChat()/shouldShowImageGen()/shouldShowContentGen()rufennotFound()auf, wenn das Feature deaktiviert ist - API-Ebene —
guardRAGChat()/guardLLMChat()/guardAudioInput()/guardImageGen()/guardContentGen()geben 404-Antworten für deaktivierte Features zurück
Verzeichnisstruktur
Der gesamte KI-bezogene Code befindet sich in
apps/boilerplate/src/lib/ai/, mit API-Routen in apps/boilerplate/src/app/api/ai/:apps/boilerplate/src/
├── lib/
│ └── ai/
│ ├── config.ts # Central config, models, rate limits, env validation
│ ├── types.ts # Shared TypeScript types (Message, Provider, etc.)
│ ├── feature-flags.ts # AI_CHAT_FEATURES, guard functions
│ ├── route-guards.ts # API + page guards for feature flags
│ ├── ai-service.ts # High-level service (wraps provider factory)
│ ├── provider-factory.ts # Creates/caches provider instances
│ ├── providers/
│ │ ├── base-provider.ts # Abstract class with retry logic
│ │ ├── openai.ts # OpenAI implementation
│ │ ├── anthropic.ts # Anthropic implementation
│ │ ├── google.ts # Google AI implementation
│ │ └── xai.ts # xAI implementation
│ ├── rag-service.ts # RAG pipeline (search → context → answer)
│ ├── rag-search.ts # pgvector similarity search
│ ├── rate-limiter.ts # Global burst + tier-based limiting
│ ├── usage-tracker.ts # Token/cost tracking to database
│ ├── image-gen/
│ │ ├── config.ts # Model configs, sizes, quality options
│ │ ├── service.ts # OpenAI image generation service
│ │ └── types.ts # Image generation TypeScript types
│ ├── content-gen/
│ │ ├── config.ts # Template definitions, prompt builder, UI labels
│ │ ├── service.ts # Content generation AI service wrapper
│ │ └── types.ts # Content generator TypeScript types
│ ├── sse-parser.ts # Shared SSE stream parser with error handling
│ ├── quick-prompts.ts # Configurable suggestion buttons
│ └── errors.ts # Error class hierarchy
├── hooks/
│ ├── use-ai.ts # React hooks (useAIChat, useAICompletion, etc.)
│ ├── use-image-gen.ts # Image generation hook with history
│ ├── use-content-generator.ts # Content generator hook with SSE streaming
│ └── use-audio-recorder.ts # Audio recording hook (MediaRecorder API)
├── app/
│ └── api/
│ └── ai/
│ ├── stream/route.ts # POST — SSE streaming endpoint
│ ├── chat/route.ts # POST — Synchronous chat endpoint
│ ├── speech-to-text/route.ts # POST — Audio transcription (Whisper)
│ ├── image-gen/route.ts # POST — Image generation endpoint
│ ├── generate-content/route.ts # POST — Content generation endpoint
│ ├── usage/route.ts # GET — Usage statistics endpoint
│ └── rag/
│ ├── ask/route.ts # POST — RAG question answering
│ └── conversations/ # CRUD for conversation history
└── components/
└── ai/
├── chat/ # Chat UI components (12 components)
├── image-gen/ # Image generation UI (4 components)
└── content-gen/ # Content generator UI (5 components)
Umgebungsvariablen
| Variable | Erforderlich | Zweck |
|---|---|---|
AI_PROVIDER | Nein | Bestimmten Provider erzwingen (openai, anthropic, google, xai) |
AI_MODEL | Nein | Standardmodell des aktiven Providers überschreiben |
AI_API_KEY | Nein | Provider-neutraler API-Schlüssel — funktioniert mit jedem AI_PROVIDER (Provider-spezifische Schlüssel haben Vorrang) |
OPENAI_API_KEY | Ja* | OpenAI-API-Schlüssel (auch für RAG-Embeddings erforderlich) |
ANTHROPIC_API_KEY | Ja* | Anthropic-API-Schlüssel |
GOOGLE_AI_API_KEY | Ja* | Google-AI-API-Schlüssel |
XAI_API_KEY | Ja* | xAI-API-Schlüssel |
AI_EMBEDDING_MODEL | Nein | Embedding-Modell für RAG (Standard: text-embedding-3-small) |
NEXT_PUBLIC_AI_RAG_CHAT_ENABLED | Nein | RAG-Chat aktivieren (Standard: true) |
NEXT_PUBLIC_AI_LLM_CHAT_ENABLED | Nein | LLM-Chat aktivieren (Standard: true) |
NEXT_PUBLIC_AI_VISION_ENABLED | Nein | Bildanalyse im LLM-Chat aktivieren (Standard: true) |
NEXT_PUBLIC_AI_AUDIO_INPUT_ENABLED | Nein | Spracheingabe im LLM-Chat aktivieren (Standard: true) |
NEXT_PUBLIC_AI_PDF_CHAT_ENABLED | Nein | PDF-Analyse im LLM-Chat aktivieren (Standard: true) |
NEXT_PUBLIC_AI_IMAGE_GEN_ENABLED | Nein | Bildgenerierung aktivieren (Standard: true) |
NEXT_PUBLIC_AI_CONTENT_GEN_ENABLED | Nein | Content-Generator aktivieren (Standard: true) |
UPSTASH_REDIS_REST_URL | Nein | Redis-URL für Rate-Limiting |
UPSTASH_REDIS_REST_TOKEN | Nein | Redis-Token für Rate-Limiting |
*Mindestens ein Provider-API-Schlüssel ist erforderlich. Das System erkennt den Provider automatisch anhand der verfügbaren Schlüssel.
Für eine funktionierende KI-Integration reicht ein API-Schlüssel. Die einfachste Einrichtung:
AI_PROVIDER und AI_API_KEY setzen — ein Schlüssel für alles. Alternativ Provider-spezifische Schlüssel wie ANTHROPIC_API_KEY für Claude verwenden. Für den RAG-Chat zusätzlich OPENAI_API_KEY angeben — OpenAI ist für Embeddings erforderlich (text-embedding-3-small). Weitere Provider-Schlüssel können später für Fallback und Provider-Auswahl hinzugefügt werden.Wichtige Dateien
| Datei | Zweck |
|---|---|
apps/boilerplate/src/lib/ai/config.ts | Zentrale Konfiguration — Modelle, Rate-Limits, Provider-Erkennung, Umgebungsvalidierung |
apps/boilerplate/src/lib/ai/feature-flags.ts | Feature-Flag-Definitionen und Guard-Funktionen |
apps/boilerplate/src/lib/ai/ai-service.ts | High-Level-KI-Service (kapselt Provider-Factory, berechnet Kosten) |
apps/boilerplate/src/lib/ai/provider-factory.ts | Erstellt, cached und wählt Provider-Instanzen aus |
apps/boilerplate/src/lib/ai/rag-service.ts | RAG-Pipeline — Query-Rewriting, Suche, Kontext-Zusammenstellung, Antwortgenerierung |
apps/boilerplate/src/lib/ai/rag-search.ts | pgvector-Ähnlichkeitssuche mit OpenAI-Embeddings |
apps/boilerplate/src/lib/ai/rate-limiter.ts | Zweischichtiges Rate-Limiting (globaler Burst, tier-basiert) |
apps/boilerplate/src/lib/credits/credit-costs.ts | Credit-Kosten pro Vorgang (21 Vorgangstypen) |
apps/boilerplate/src/hooks/use-ai.ts | React-Hooks — useAIChat, useAICompletion, useAIQuery, useAIStream |
apps/boilerplate/src/app/api/ai/stream/route.ts | SSE-Streaming-Endpunkt mit vollständiger Kostenmanagement-Pipeline |