142 lines
4.9 KiB
MySQL
142 lines
4.9 KiB
MySQL
|
|
-- 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');
|