diff --git a/backend/routers/prompts.py b/backend/routers/prompts.py index 44c7ee2..257914c 100644 --- a/backend/routers/prompts.py +++ b/backend/routers/prompts.py @@ -814,7 +814,7 @@ async def execute_unified_prompt( content = json.dumps(content, ensure_ascii=False) # Prepare metadata with resolved placeholders and descriptions - from placeholder_resolver import get_placeholder_catalog + from placeholder_resolver import get_placeholder_catalog, get_placeholder_example_values metadata = { 'prompt_type': result['type'], @@ -825,10 +825,21 @@ async def execute_unified_prompt( if result.get('debug'): catalog = get_placeholder_catalog(profile_id) + # Get full untruncated values from placeholder resolver + full_values = get_placeholder_example_values(profile_id) + # Remove {{ }} wrappers + cleaned_values = { + key.replace('{{', '').replace('}}', ''): value + for key, value in full_values.items() + } + if result['type'] == 'base': # Base prompt: single set of placeholders - resolved = result['debug'].get('resolved_placeholders', {}) - for key, value in resolved.items(): + resolved_keys = result['debug'].get('resolved_placeholders', {}).keys() + for key in resolved_keys: + # Get full untruncated value + value = cleaned_values.get(key, result['debug']['resolved_placeholders'].get(key, '')) + # Find description in catalog desc = None for cat_items in catalog.values(): @@ -847,15 +858,18 @@ async def execute_unified_prompt( stages_debug = result['debug'].get('stages', []) for stage_debug in stages_debug: for prompt_debug in stage_debug.get('prompts', []): - resolved = {} + resolved_keys = [] # Check both direct and ref_debug if 'resolved_placeholders' in prompt_debug: - resolved = prompt_debug['resolved_placeholders'] + resolved_keys = prompt_debug['resolved_placeholders'].keys() elif 'ref_debug' in prompt_debug and 'resolved_placeholders' in prompt_debug['ref_debug']: - resolved = prompt_debug['ref_debug']['resolved_placeholders'] + resolved_keys = prompt_debug['ref_debug']['resolved_placeholders'].keys() - for key, value in resolved.items(): + for key in resolved_keys: if key not in metadata['placeholders']: # Avoid duplicates + # Get full untruncated value + value = cleaned_values.get(key, '') + # Find description in catalog desc = None for cat_items in catalog.values(): diff --git a/frontend/src/pages/Analysis.jsx b/frontend/src/pages/Analysis.jsx index 38e3896..3021c2c 100644 --- a/frontend/src/pages/Analysis.jsx +++ b/frontend/src/pages/Analysis.jsx @@ -15,15 +15,23 @@ const SLUG_LABELS = { function InsightCard({ ins, onDelete, defaultOpen=false, prompts=[] }) { const [open, setOpen] = useState(defaultOpen) - const [showValues, setShowValues] = useState(false) + + // Parse metadata early to determine showOnlyValues + const metadataRaw = ins.metadata ? (typeof ins.metadata === 'string' ? JSON.parse(ins.metadata) : ins.metadata) : null + const isBasePrompt = metadataRaw?.prompt_type === 'base' + const isJsonOutput = ins.content && (ins.content.trim().startsWith('{') || ins.content.trim().startsWith('[')) + const placeholdersRaw = metadataRaw?.placeholders || {} + const showOnlyValues = isBasePrompt && isJsonOutput && Object.keys(placeholdersRaw).length > 0 + + const [showValues, setShowValues] = useState(showOnlyValues) // Auto-expand for base prompts with JSON // Find matching prompt to get display_name const prompt = prompts.find(p => p.slug === ins.scope) const displayName = prompt?.display_name || SLUG_LABELS[ins.scope] || ins.scope - // Parse metadata if available - const metadata = ins.metadata ? (typeof ins.metadata === 'string' ? JSON.parse(ins.metadata) : ins.metadata) : null - const placeholders = metadata?.placeholders || {} + // Use already-parsed metadata + const metadata = metadataRaw + const placeholders = placeholdersRaw const placeholderCount = Object.keys(placeholders).length return ( @@ -46,7 +54,31 @@ function InsightCard({ ins, onDelete, defaultOpen=false, prompts=[] }) { {open && ( <> - + {/* For base prompts with JSON: Only show value table */} + {showOnlyValues && ( +
+
+ ℹ️ Basis-Prompt Rohdaten (JSON-Struktur für technische Nutzung) +
+
+ Technische Daten anzeigen +
+                  {ins.content}
+                
+
+
+ )} + + {/* For other prompts: Show full content */} + {!showOnlyValues && } {/* Value Table */} {placeholderCount > 0 && ( @@ -80,13 +112,30 @@ function InsightCard({ ins, onDelete, defaultOpen=false, prompts=[] }) { {Object.entries(placeholders).map(([key, data]) => ( - + {key} - + {data.value} - + {data.description || '—'}