From 10d24bbef70b60ccaec4c1ca5cf2d1d8d96c2ed9 Mon Sep 17 00:00:00 2001 From: Lars Date: Sat, 11 Apr 2026 14:46:13 +0200 Subject: [PATCH] fix(workflow): Duplicate - JSON-encode JSONB fields **Error:** ``` psycopg2.ProgrammingError: can't adapt type 'dict' ``` **Root Cause:** - duplicate_prompt passed Python dicts directly to SQL INSERT - JSONB fields from r2d() are already deserialized by psycopg2 - PostgreSQL expects JSON strings for JSONB columns **Fix:** - Added json.dumps() for all JSONB fields before INSERT: - stages, output_schema, question_augmentations, graph_data - Same pattern as import function Files changed: - backend/routers/prompts.py: JSON-encode JSONB in duplicate_prompt Co-Authored-By: Claude Opus 4.6 --- backend/routers/prompts.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/backend/routers/prompts.py b/backend/routers/prompts.py index 94d4c27..8112ece 100644 --- a/backend/routers/prompts.py +++ b/backend/routers/prompts.py @@ -364,6 +364,12 @@ def duplicate_prompt(prompt_id: str, session: dict=Depends(require_admin)): new_display_name = f"{original.get('display_name') or original['name']} (Kopie)" + # Prepare JSONB fields (convert dict/list to JSON string if needed) + stages_json = json.dumps(original['stages']) if original.get('stages') else None + output_schema_json = json.dumps(original['output_schema']) if original.get('output_schema') else None + question_aug_json = json.dumps(original['question_augmentations']) if original.get('question_augmentations') else None + graph_data_json = json.dumps(original['graph_data']) if original.get('graph_data') else None + cur.execute( """INSERT INTO ai_prompts ( id, name, slug, display_name, description, template, category, @@ -379,9 +385,9 @@ def duplicate_prompt(prompt_id: str, session: dict=Depends(require_admin)): (new_id, new_name, new_slug, new_display_name, original.get('description'), original.get('template'), original.get('category', 'ganzheitlich'), - original.get('type', 'pipeline'), original.get('stages'), - original.get('output_format', 'text'), original.get('output_schema'), - original.get('question_augmentations'), original.get('graph_data'), + original.get('type', 'pipeline'), stages_json, + original.get('output_format', 'text'), output_schema_json, + question_aug_json, graph_data_json, original.get('active', True), original.get('sort_order', 0)) )