KI-Integration – Übersicht

Multi-Provider-KI-System mit OpenAI, Anthropic, Google und xAI — Architektur, Feature-Flags und Verzeichnisstruktur

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',
}
ProviderStandardmodellKontextfensterOptimal für
Anthropicclaude-haiku-4-5200K Tokens (1M Beta)Primär — differenziertes Reasoning, langer Kontext
OpenAIgpt-5-nano400K TokensAllgemeiner Einsatz, RAG-Embeddings
Googlegemini-2.5-flash1M TokensGroße Dokumente, Kosteneffizienz
xAIgrok-4-1-fast-reasoning2M TokensEchtzeit-Daten, konversationell

Zwei Chat-Modi

Kit bietet zwei eigenständige Chat-Erfahrungen, jeweils mit eigener Route, API und UI:
AspektLLM-ChatRAG-Chat
Route/dashboard/chat-llm/dashboard/chat-rag
API/api/ai/stream, /api/ai/chat/api/ai/rag/ask
HookuseAIChat()Eigener RAG-Hook
KontextDirektes LLM-GesprächWissensdatenbank + LLM
Feature-FlagNEXT_PUBLIC_AI_LLM_CHAT_ENABLEDNEXT_PUBLIC_AI_RAG_CHAT_ENABLED
Token-NutzungVollständiger Gesprächsverlauf~3–5K Tokens (RAG-Kontext)
Optimal fürOffene Gespräche, Coding-HilfeProduktsupport, FAQ

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
VariableStandardSteuert
NEXT_PUBLIC_AI_RAG_CHAT_ENABLEDtrueRAG-Chat unter /dashboard/chat-rag
NEXT_PUBLIC_AI_LLM_CHAT_ENABLEDtrueLLM-Chat unter /dashboard/chat-llm
NEXT_PUBLIC_AI_VISION_ENABLEDtrueBildanalyse im LLM-Chat (erfordert aktivierten LLM-Chat)
NEXT_PUBLIC_AI_AUDIO_INPUT_ENABLEDtrueSpracheingabe via Speech-to-Text im LLM-Chat (erfordert aktivierten LLM-Chat)
NEXT_PUBLIC_AI_PDF_CHAT_ENABLEDtruePDF-Analyse im LLM-Chat (erfordert aktivierten LLM-Chat)
NEXT_PUBLIC_AI_IMAGE_GEN_ENABLEDtrueBildgenerierung unter /dashboard/image-gen
NEXT_PUBLIC_AI_CONTENT_GEN_ENABLEDtrueContent-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:
  1. Seitenebene — Guard-Funktionen shouldShowRAGChat() / shouldShowLLMChat() / shouldShowImageGen() / shouldShowContentGen() rufen notFound() auf, wenn das Feature deaktiviert ist
  2. API-EbeneguardRAGChat() / 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

VariableErforderlichZweck
AI_PROVIDERNeinBestimmten Provider erzwingen (openai, anthropic, google, xai)
AI_MODELNeinStandardmodell des aktiven Providers überschreiben
AI_API_KEYNeinProvider-neutraler API-Schlüssel — funktioniert mit jedem AI_PROVIDER (Provider-spezifische Schlüssel haben Vorrang)
OPENAI_API_KEYJa*OpenAI-API-Schlüssel (auch für RAG-Embeddings erforderlich)
ANTHROPIC_API_KEYJa*Anthropic-API-Schlüssel
GOOGLE_AI_API_KEYJa*Google-AI-API-Schlüssel
XAI_API_KEYJa*xAI-API-Schlüssel
AI_EMBEDDING_MODELNeinEmbedding-Modell für RAG (Standard: text-embedding-3-small)
NEXT_PUBLIC_AI_RAG_CHAT_ENABLEDNeinRAG-Chat aktivieren (Standard: true)
NEXT_PUBLIC_AI_LLM_CHAT_ENABLEDNeinLLM-Chat aktivieren (Standard: true)
NEXT_PUBLIC_AI_VISION_ENABLEDNeinBildanalyse im LLM-Chat aktivieren (Standard: true)
NEXT_PUBLIC_AI_AUDIO_INPUT_ENABLEDNeinSpracheingabe im LLM-Chat aktivieren (Standard: true)
NEXT_PUBLIC_AI_PDF_CHAT_ENABLEDNeinPDF-Analyse im LLM-Chat aktivieren (Standard: true)
NEXT_PUBLIC_AI_IMAGE_GEN_ENABLEDNeinBildgenerierung aktivieren (Standard: true)
NEXT_PUBLIC_AI_CONTENT_GEN_ENABLEDNeinContent-Generator aktivieren (Standard: true)
UPSTASH_REDIS_REST_URLNeinRedis-URL für Rate-Limiting
UPSTASH_REDIS_REST_TOKENNeinRedis-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.

Wichtige Dateien

DateiZweck
apps/boilerplate/src/lib/ai/config.tsZentrale Konfiguration — Modelle, Rate-Limits, Provider-Erkennung, Umgebungsvalidierung
apps/boilerplate/src/lib/ai/feature-flags.tsFeature-Flag-Definitionen und Guard-Funktionen
apps/boilerplate/src/lib/ai/ai-service.tsHigh-Level-KI-Service (kapselt Provider-Factory, berechnet Kosten)
apps/boilerplate/src/lib/ai/provider-factory.tsErstellt, cached und wählt Provider-Instanzen aus
apps/boilerplate/src/lib/ai/rag-service.tsRAG-Pipeline — Query-Rewriting, Suche, Kontext-Zusammenstellung, Antwortgenerierung
apps/boilerplate/src/lib/ai/rag-search.tspgvector-Ähnlichkeitssuche mit OpenAI-Embeddings
apps/boilerplate/src/lib/ai/rate-limiter.tsZweischichtiges Rate-Limiting (globaler Burst, tier-basiert)
apps/boilerplate/src/lib/credits/credit-costs.tsCredit-Kosten pro Vorgang (21 Vorgangstypen)
apps/boilerplate/src/hooks/use-ai.tsReact-Hooks — useAIChat, useAICompletion, useAIQuery, useAIStream
apps/boilerplate/src/app/api/ai/stream/route.tsSSE-Streaming-Endpunkt mit vollständiger Kostenmanagement-Pipeline