import { useEffect, useRef, useState } from 'react' import { type FeedbackDimension, type FeedbackDimensionPrompt, loadFeedbackStructure, listFeedbackDimensionPrompts, updateFeedbackDimensionPrompt, } from '../db' import { AI_CONFIG } from '../config/constants' export default function AiPromptConfig() { const [dimensions, setDimensions] = useState([]) const [prompts, setPrompts] = useState([]) const [expanded, setExpanded] = useState>(new Set()) const [savedDimId, setSavedDimId] = useState(null) const saveTimer = useRef>>(new Map()) const load = async () => { const [structure, promptRows] = await Promise.all([ loadFeedbackStructure(), listFeedbackDimensionPrompts(), ]) setDimensions([...structure.dimensions].sort((a, b) => a.order - b.order)) setPrompts(promptRows) } useEffect(() => { load() }, []) const getPrompt = (dimId: number) => prompts.find(p => p.dimensionId === dimId) const saveTemplate = (dimId: number, value: string) => { setPrompts(prev => prev.map(p => p.dimensionId === dimId ? { ...p, promptTemplate: value } : p)) const prevTimer = saveTimer.current.get(dimId) if (prevTimer) clearTimeout(prevTimer) saveTimer.current.set(dimId, setTimeout(async () => { const existing = getPrompt(dimId) if (!existing?.id) return await updateFeedbackDimensionPrompt(existing.id, { promptTemplate: value }) setSavedDimId(dimId) setTimeout(() => setSavedDimId(null), 2000) }, 600)) } const resetToDefault = async (dimId: number) => { const existing = getPrompt(dimId) if (!existing?.id) return await updateFeedbackDimensionPrompt(existing.id, { promptTemplate: AI_CONFIG.defaultDimensionPromptTemplate }) setPrompts(prev => prev.map(p => p.dimensionId === dimId ? { ...p, promptTemplate: AI_CONFIG.defaultDimensionPromptTemplate } : p)) } return (

KI-Prompts je Dimension

Jede Dimension bekommt bei der KI-Feedback-Generierung einen eigenen, separaten Call. Der Prompt-Text ist frei editierbar und wird bei neuen Dimensionen automatisch mit einem Standard-Prompt vorbelegt.

{/* Platzhalter-Legende */}
Verfügbare Platzhalter
{AI_CONFIG.dimensionPromptPlaceholders.map(p => (
{p.token} {p.description}
))}
{/* Dimensionen */} {dimensions.map(dim => { const isOpen = expanded.has(dim.id!) const prompt = getPrompt(dim.id!) return (
{isOpen && (