-- Migration 067: Konfigurierbare KI-Prompts + Tracking-Feld fuer Uebungs-Zusammenfassung -- Datum: 2026-05-22 -- Spec: technical/KI_FEATURES_SPEC.md, AI_PROMPT_SYSTEM_SPEC.md -- ============================================================================ -- AI PROMPTS -- ============================================================================ CREATE TABLE IF NOT EXISTS ai_prompts ( id SERIAL PRIMARY KEY, slug VARCHAR(100) NOT NULL UNIQUE, display_name VARCHAR(200) NOT NULL, description TEXT, template TEXT NOT NULL, category VARCHAR(50) DEFAULT 'exercise' CHECK (category IN ('exercise', 'training', 'matrix', 'import', 'admin')), output_format VARCHAR(10) DEFAULT 'text' CHECK (output_format IN ('text', 'json')), output_schema JSONB, is_system_default BOOLEAN DEFAULT false, default_template TEXT, active BOOLEAN DEFAULT true, sort_order INT DEFAULT 0, created_by INT REFERENCES profiles(id) ON DELETE SET NULL, created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_ai_prompts_slug ON ai_prompts(slug); CREATE INDEX IF NOT EXISTS idx_ai_prompts_category ON ai_prompts(category); CREATE INDEX IF NOT EXISTS idx_ai_prompts_active ON ai_prompts(active, sort_order); DROP TRIGGER IF EXISTS ai_prompts_update ON ai_prompts; CREATE TRIGGER ai_prompts_update BEFORE UPDATE ON ai_prompts FOR EACH ROW EXECUTE FUNCTION update_timestamp(); -- ============================================================================ -- TRACKING SUMMARY (KI) -- ============================================================================ ALTER TABLE exercises ADD COLUMN IF NOT EXISTS summary_ai_generated BOOLEAN DEFAULT false; COMMENT ON COLUMN exercises.summary_ai_generated IS 'TRUE wenn Kurzbeschreibung zuletzt von KI vorgeschlagen und uebernommen (UI setzt bei manueller Aenderung false)'; -- ============================================================================ -- SEED PROMPTS (idempotent) -- ============================================================================ INSERT INTO ai_prompts ( slug, display_name, description, template, category, output_format, is_system_default, default_template, active, sort_order ) SELECT 'pipeline', 'Mehrstufige Gesamtanalyse', 'Master-Schalter fuer die Pipeline-Anzeige.', 'PIPELINE_MASTER', 'admin', 'text', false, 'PIPELINE_MASTER', true, -10 WHERE NOT EXISTS (SELECT 1 FROM ai_prompts WHERE slug = 'pipeline'); INSERT INTO ai_prompts ( slug, display_name, description, template, category, output_format, is_system_default, default_template, active, sort_order ) SELECT 'exercise_summary', 'Uebungs-Zusammenfassung', 'Erzeugt eine kurze Kurzbeschreibung fuer Listen/Galerie.', $s$Du bist Assistent fuer Kampfsport-Trainer. Erstelle eine kurze Kurzbeschreibung fuer Listen und Trainingsplaene. Anforderungen: - Hochstens etwa 200 Zeichen (bei Bedarf gekuerzt fuer Mobile) - Kern: Welche Trainingsqualitaeten? Wie fuehrt man die Uebung kurz aus? - Sachlich, auf Deutsch Uebung: {{exercise_title}} Fokuskontext: {{exercise_focus_area}} Ziel (Fliesstext, kann HTML sein): {{exercise_goal}} Durchfuehrung (Fliesstext, kann HTML sein): {{exercise_execution}} Antworte NUR mit der Kurzbeschreibung als einfachen Text (keine Markdown-Codeblocks, keine Anfuehrungszeichen um den ganzen Text).$s$, 'exercise', 'text', true, NULL, true, 1 WHERE NOT EXISTS (SELECT 1 FROM ai_prompts WHERE slug = 'exercise_summary'); INSERT INTO ai_prompts ( slug, display_name, description, template, category, output_format, is_system_default, default_template, active, sort_order ) SELECT 'exercise_skill_suggestions', 'Faehigkeiten-Empfehlungen', 'Schlaegt passende Skills mit Stufen/Intensitaet vor (JSON-Ausgabe-Prompt).', $j$Du bist Assistent fuer Kampfsport-Trainer. Ordne diese Uebung dem globalen Skill-Katalog zu. Daten zur Uebung: Titel: {{exercise_title}} Fokuskontext (optional): {{exercise_focus_area}} Ziel (gekuerzt_plain): {{exercise_goal}} Durchfuehrung (gekuerzt_plain): {{exercise_execution}} Verfuegbare Faehigkeiten (Auswahl NUR ueber diese IDs — keine anderen IDs verwenden): {{skills_catalog}} Waehle hoechstens 5 passende Skills. Für jede Faehigkeit: - skill_id: ganze Zahl aus der Liste - required_level: eines von basis, grundlagen, aufbau, fortgeschritten, optimierung - target_level: derselbe Wertvorrat - intensity: eines von niedrig, mittel, hoch - is_primary (optional): true fuer die Hauptfaehigkeit der Uebung, sondern false/weglassen Antworte NUR mit einem JSON-Array ohne Erklaertext, keine Markdown-Fences. Beispielformat: [{"skill_id": 1, "required_level": "grundlagen", "target_level": "aufbau", "intensity": "hoch", "is_primary": true}] Wenn nichts gut passt, antworte mit [].$j$, 'exercise', 'json', true, NULL, true, 2 WHERE NOT EXISTS (SELECT 1 FROM ai_prompts WHERE slug = 'exercise_skill_suggestions');