diff --git a/backend/result_container_parser.py b/backend/result_container_parser.py index 638e050..594e152 100644 --- a/backend/result_container_parser.py +++ b/backend/result_container_parser.py @@ -158,7 +158,8 @@ def parse_decision_questions(section_text: str) -> Dict[str, str]: for pattern in patterns: matches = re.finditer(pattern, section_text, re.MULTILINE | re.IGNORECASE) for match in matches: - question_type = match.group(1).strip().lower() + # Preserve original case for question IDs (e.g., "qAnalyst" not "qanalyst") + question_type = match.group(1).strip() answer = match.group(2).strip() # Entferne Klammern und Whitespace diff --git a/backend/routers/prompts.py b/backend/routers/prompts.py index 1f32011..cc438db 100644 --- a/backend/routers/prompts.py +++ b/backend/routers/prompts.py @@ -1488,6 +1488,14 @@ async def execute_unified_prompt( 'vitalwerte': 7 } + # Wrapper function to match workflow_executor's expected signature: (prompt, model) -> str + # workflow_executor calls: openrouter_call_func(prompt, "anthropic/claude-sonnet-4") + # but call_openrouter expects: call_openrouter(prompt, max_tokens=4096) + async def workflow_llm_call(prompt: str, model: str = None) -> str: + # Ignore model parameter (already set in OPENROUTER_MODEL env var) + # Use default max_tokens=4096 from call_openrouter + return await call_openrouter(prompt) + # Execute with prompt_executor # Always enable debug when saving to collect metadata for value table result = await execute_prompt_with_data( @@ -1495,7 +1503,7 @@ async def execute_unified_prompt( profile_id=profile_id, modules=modules, timeframes=timeframes, - openrouter_call_func=call_openrouter, + openrouter_call_func=workflow_llm_call, # Use wrapper with correct signature enable_debug=debug or save # Enable debug if saving for metadata collection ) diff --git a/backend/routers/workflows.py b/backend/routers/workflows.py index d37f5b2..b13d52e 100644 --- a/backend/routers/workflows.py +++ b/backend/routers/workflows.py @@ -86,11 +86,19 @@ async def execute_workflow_endpoint( "type": "workflow" } + # Wrapper function to match workflow_executor's expected signature: (prompt, model) -> str + # workflow_executor calls: openrouter_call_func(prompt, "anthropic/claude-sonnet-4") + # but call_openrouter expects: call_openrouter(prompt, max_tokens=4096) + async def workflow_llm_call(prompt: str, model: str) -> str: + # Ignore model parameter (already set in OPENROUTER_MODEL env var) + # Use default max_tokens=4096 from call_openrouter + return await call_openrouter(prompt) + try: result = await execute_workflow_prompt( prompt=workflow_prompt, variables=variables, - openrouter_call_func=call_openrouter, + openrouter_call_func=workflow_llm_call, # Use wrapper with correct signature enable_debug=request.enable_debug ) return result diff --git a/frontend/src/components/workflow/panels/QuestionAugmentationPanel.jsx b/frontend/src/components/workflow/panels/QuestionAugmentationPanel.jsx index 2def832..a2f4d44 100644 --- a/frontend/src/components/workflow/panels/QuestionAugmentationPanel.jsx +++ b/frontend/src/components/workflow/panels/QuestionAugmentationPanel.jsx @@ -47,7 +47,7 @@ export function QuestionAugmentationPanel({ node, onChange }) { {questions.map((q, idx) => ( handleQuestionChange(idx, field, value)}