'use client' /** * LLM Mode Switcher Component * * UI-Komponente zum Umschalten zwischen LLM-Modi: * - Hybrid: Lokal zuerst, Cloud als Fallback * - Nur Lokal: Maximaler Datenschutz (nur Ollama) * - Nur Cloud: Beste Qualitaet (Claude/OpenAI) * - Auto: Automatische Auswahl nach Komplexitaet * * Kann als standalone oder in andere Komponenten integriert verwendet werden. */ import { useLLMMode, LLMMode, LLM_MODE_CONFIGS } from '@/lib/llm-mode-context' interface LLMModeSwitcherProps { // Kompakte Ansicht (nur Icons) oder volle Ansicht (mit Beschreibungen) compact?: boolean // Callback wenn Modus geaendert wird onModeChange?: (mode: LLMMode) => void // Zeigt Provider-Details an showProviderDetails?: boolean // Custom className fuer den Container className?: string } // Icons als SVG (Tailwind-freundlich) const ModeIcon = ({ mode, className = 'w-5 h-5' }: { mode: LLMMode; className?: string }) => { switch (mode) { case 'hybrid': return ( ) case 'local-only': return ( ) case 'cloud-only': return ( ) case 'auto': return ( ) default: return null } } // Mode colors for styling const modeColors: Record = { hybrid: { bg: 'bg-blue-50', border: 'border-blue-300', text: 'text-blue-700', activeBg: 'bg-blue-100', }, 'local-only': { bg: 'bg-green-50', border: 'border-green-300', text: 'text-green-700', activeBg: 'bg-green-100', }, 'cloud-only': { bg: 'bg-purple-50', border: 'border-purple-300', text: 'text-purple-700', activeBg: 'bg-purple-100', }, auto: { bg: 'bg-amber-50', border: 'border-amber-300', text: 'text-amber-700', activeBg: 'bg-amber-100', }, } export default function LLMModeSwitcher({ compact = false, onModeChange, showProviderDetails = false, className = '', }: LLMModeSwitcherProps) { const { mode, setMode, config, enableOllama, enableClaude, enableOpenAI } = useLLMMode() const handleModeChange = (newMode: LLMMode) => { setMode(newMode) onModeChange?.(newMode) } const modes = Object.keys(LLM_MODE_CONFIGS) as LLMMode[] if (compact) { // Compact view: horizontal button group return (
{modes.map((m) => { const isActive = m === mode const colors = modeColors[m] return ( ) })}
) } // Full view: cards with descriptions return (

LLM-Modus

{config.label}
{modes.map((m) => { const modeConfig = LLM_MODE_CONFIGS[m] const isActive = m === mode const colors = modeColors[m] return ( ) })}
{/* Provider Details */} {showProviderDetails && (

Aktive Provider:

{enableOllama && ( Ollama (Lokal) )} {enableClaude && ( Claude )} {enableOpenAI && ( OpenAI )} {!enableOllama && !enableClaude && !enableOpenAI && ( Keine Provider aktiv )}
)}
) } // Export compact variant for use in headers/toolbars export function LLMModeSwitcherCompact(props: Omit) { return } // Export a dropdown variant for tight spaces export function LLMModeSwitcherDropdown({ className = '', onModeChange, }: Pick) { const { mode, setMode, config } = useLLMMode() const colors = modeColors[mode] const handleChange = (e: React.ChangeEvent) => { const newMode = e.target.value as LLMMode setMode(newMode) onModeChange?.(newMode) } return (
) }