shinkan-jinkendo/docs/architecture/PLANNING_CATALOG_PROMPT_SNIPPETS.md
Lars 53f2b027cc
Some checks failed
Deploy Development / deploy (push) Successful in 43s
Test Suite / pytest-backend (push) Failing after 2s
Test Suite / lint-backend (push) Successful in 0s
Test Suite / build-frontend (push) Successful in 13s
Test Suite / k6 /health Baseline (push) Successful in 34s
Test Suite / playwright-tests (push) Successful in 1m20s
Enhance Planning Catalog Context and Prompt Slot Management
- Introduced new catalog context handling in planning prompt functions, allowing for improved integration of planning variables.
- Added optional catalog context parameters in various functions to streamline the merging of planning prompt variables.
- Updated frontend components to include CatalogPromptSlotsEditor for managing prompt slots across different catalog types.
- Enhanced API utilities to support fetching and updating catalog prompt slots, improving backend functionality for catalog management.
- Incremented version numbers and updated changelog to reflect the new features and improvements.
2026-06-15 12:13:15 +02:00

8.4 KiB
Raw Blame History

Planungs-KI — Katalog-Prompt-Slots (Snippets)

Stand: 2026-05-22
Status: H2 umgesetzt (0.8.235) · H2.1 Admin-UI + granulare Prompts (0.8.236)
Bezüge: PLANNING_PROGRESSION_GRAPH_KI.md §4.4 · AI_PROMPT_TARGET_ARCHITECTURE.md §2.4 · planning_catalog_context.py · catalog_prompt_slots.py


1. Problem

Seit F13 (0.8.233) fließen Primärfokus, Trainingsstil, Zielgruppe und Stilrichtung als planning_catalog_context in Retrieval und Scoring.

Die LLM-Prompts brauchen zusätzlich fachliche Textbausteine pro gewähltem Katalog-Eintrag — editierbar, ohne Code-Deploy, unabhängig von fest codierten Katalog-Namen.

Ziel: Prompts in ai_prompts referenzieren Slot-Typen (Vokabular). Inhalte hängen an Katalog-Zeilen (Stammdaten). Der Resolver füllt Platzhalter zur Laufzeit.


2. Zwei Ebenen (Kern des Modells)

Ebene Was Wer pflegt Beispiel
Slot-Typ Art des Textes (festes, erweiterbares Vokabular) Produkt / Architektur hints_on_progression, hints_on_path_qa
Slot-Wert Konkreter Text pro Katalog-Eintrag Admin / Redakteur Gewaltschutz → hints_on_path_qa: „Lücken = fehlende Deeskalation …“

Nicht: feste Attribute pro Eintrag im Code (planning_lens, qa_criteria …).
Sondern: beliebig viele Katalog-Einträge × definierte Slot-Typen.


3. Dimensionen & Priorität

Rang Dimension catalog_kind DB-Tabelle
1 Primärfokus focus_area focus_areas
2 Trainingsstil training_type training_types
3 Zielgruppe target_group target_groups
4 Stilrichtung style_direction style_directions

Kaskade: Bei widersprüchlichen Hinweisen gilt Fokus → Trainingsstil → Zielgruppe → Stilrichtung.

Pro Dimension im Request: ein aktiver Eintrag (is_primary, sonst höchstes weight).


4. Slot-Typ-Register (Vokabular)

Definiert in catalog_prompt_slot_types (DB) + Spiegel in catalog_prompt_slots.py.

slot_key Anzeige (DE) LLM-Prompt Code-only
description Allgemeine Beschreibung Roadmap, Goal-Analyse, Start/Ziel
hints_on_progression Hinweise Progressionsgraph / Stufen Roadmap, Stage-Spec
hints_on_path_qa Bewertungsmaßstäbe Pfad-QS Path-QA
hints_on_exercise Hinweise Übungsanlage / Gap-Fill Exercise-AI, Suggest (später)
anti_patterns Explizit vermeiden (Fehlbewertung) Path-QA, Stage-Spec
rematch_guard Kein Auto-Rematch erzwingen Rematch-Loop (H1.5)

Erweiterung: neuer Slot-Typ = eine Zeile in catalog_prompt_slot_types + Resolver/Admin-Katalog — kein neues Python-Feld pro Eintrag.

Fallback description: Wenn kein Slot-Wert gesetzt → focus_areas.description (bzw. description-Spalte der jeweiligen Katalog-Tabelle).


5. Platzhalter in ai_prompts

Mustache-Keys: {catalog_kind}_{slot_key} (nur [a-z0-9_]).

Platzhalter Bedeutung
{{focus_area_description}} Aktiver Primärfokus — Beschreibung
{{focus_area_hints_on_progression}} … — Progressions-Hinweise
{{focus_area_hints_on_path_qa}} … — QS-Hinweise
{{focus_area_hints_on_exercise}} … — Übungsanlage
{{focus_area_anti_patterns}} … — Anti-Patterns
{{training_type_description}} Aktiver Trainingsstil — …
{{training_type_hints_on_progression}}
{{target_group_hints_on_path_qa}} Aktive Zielgruppe — …
{{style_direction_hints_on_progression}} Aktive Stilrichtung — …
(analog für alle Slot-Typen × Dimension)
{{catalog_guidance_block}} Aggregat (Abwärtskompatibel): kaskadierter Markdown-Block aus aktiven Slots
{{catalog_context_json}} Audit: IDs, Namen, gesetzte Slot-Keys
{{has_catalog_guidance}} "true" oder leer

Hinweis: prompt_resolver unterstützt keine {{#if}}-Blöcke — leere Slots = leerer String.

5.1 Prompt-Profile (welche Slots im Aggregat)

Prompt-Slug Aggregat enthält primär
planning_exercise_path_qa *_hints_on_path_qa, *_anti_patterns, *_description
planning_progression_roadmap *_description, *_hints_on_progression, *_anti_patterns
planning_progression_stage_spec *_hints_on_progression, *_anti_patterns
planning_progression_goal_analysis *_description

Feinsteuerung: im Admin-Template granulare Platzhalter nutzen; Aggregat optional.


6. Speicherung (DB)

6.1 catalog_prompt_slot_types

Metadaten je Slot-Typ (slot_key, display_name, description, applicable_kinds[], sort_order, for_llm, for_code).

6.2 catalog_prompt_slots

catalog_kind   — focus_area | training_type | target_group | style_direction
catalog_id     — FK auf jeweilige Stammtabelle (logisch, kein polymorpher FK)
slot_key       — FK → catalog_prompt_slot_types
content        — TEXT (Markdown/Plain für LLM)
UNIQUE (catalog_kind, catalog_id, slot_key)

Neuer Katalog-Eintrag im Admin → keine Code-Änderung; Slots optional befüllen.


7. Laufzeit-Architektur

planning_catalog_context (Request / Graph-Artefakt)
        ↓
catalog_prompt_slots.resolve_catalog_prompt_variables(cur, catalog, slug?)
        ↓
planning_prompt_variables.merge_planning_prompt_variables(...)
        ↓
load_and_render_ai_prompt (ai_prompts Template)

Module:

Modul Rolle
catalog_prompt_slots.py Slot-Typen, DB-Lese/Schreib, Resolver, Aggregat-Block
planning_prompt_variables.py Zentrale Provider-Liste (erweiterbar)
planning_catalog_prompt_snippets.py Deprecated Re-Exports (Tests/Kompatibilität)

8. Admin-API

Methode Pfad Beschreibung
GET /api/catalog-prompt-slot-types Slot-Typ-Register
GET /api/catalog-prompt-slots/{kind}/{catalog_id} Alle Slots eines Eintrags
PUT /api/catalog-prompt-slots/{kind}/{catalog_id} Slots upserten (Admin)

kind: focus_area · training_type · target_group · style_direction

Später: UI-Tabs am Katalog-Editor; Versionierung/Audit wie ai_prompts.


9. Rollout-Phasen

H1 — Bootstrap (0.8.234) ✓

Hardcodierte SNIPPET_REGISTRY — Proof of Concept für catalog_guidance_block.

H2 — Slot-Modell (0.8.235) ✓

  • Tabellen catalog_prompt_slot_types, catalog_prompt_slots
  • Seed aus H1-Texten (Name-Match auf Stammdaten)
  • Resolver mit granularen Platzhaltern + Aggregat
  • Admin-API GET/PUT
  • SNIPPET_REGISTRY aus Laufzeit-Pfad entfernt

H2.1 — Admin-UI

  • Slot-Editor an Fokusbereich / Trainingsstil / Zielgruppe / Stilrichtung (CatalogPromptSlotsEditor, Stammdaten-Katalog)
  • Prompt-Templates mit granularen Platzhaltern (Migration 093)
  • Platzhalter-Hilfe im KI-Prompt-Editor (erweitert)

H1.5

  • rematch_guard im Rematch-Loop
  • Intent-Prompts + Gap-Fill: hints_on_exercise

H3 — Trainingsplanung (Phase G)

  • Gleicher Resolver, andere Orchestratoren

10. Tests & Akzeptanz

Test Erwartung
Slot aus DB Gewaltschutz + hints_on_path_qa → Platzhalter enthält Deeskalation
Ohne Katalog Alle {{focus_area_*}} leer; has_catalog_guidance leer
Neuer Eintrag Leere Slots, kein Crash; description-Fallback aus Stammdaten
Priorität Aggregat: Primärfokus vor Trainingsstil

11. Abgrenzung

Thema Hinweis
Retrieval-Gewichte merge_catalog_context_into_target — unverändert
Technik-Gates planning_exercise_semantics — unverändert
Prompt-Text ai_prompts — editierbar, referenziert Slot-Platzhalter

12. Changelog

Datum Änderung
2026-05-22 H2.1 (0.8.236): Admin-UI CatalogPromptSlotsEditor; Migration 093 granulare Prompt-Templates
2026-05-22 H2 (0.8.235): Slot-Typ-Register + catalog_prompt_slots DB, granulare Platzhalter, Admin-API
2026-05-22 Konzept §4§8: zwei Ebenen Slot-Typ vs. Slot-Wert; Platzhalter {kind}_{slot_key}
2026-05-22 H1 (0.8.234): Bootstrap-Registry — durch H2 ersetzt
2026-05-22 Erstfassung