From 72b9df3a268d1422284a3cb416d4643837982548 Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Fri, 9 Jan 2026 14:41:16 +0000 Subject: [PATCH] Enhance Workflow Builder with Metadata Integration: Add step definitions, improve field handling, and introduce suggestions for input fields. --- src/autometabuilder/metadata.json | 106 ++++++++++++++++++- src/autometabuilder/web/server.py | 2 + src/autometabuilder/web/templates/index.html | 54 ++++++---- 3 files changed, 139 insertions(+), 23 deletions(-) diff --git a/src/autometabuilder/metadata.json b/src/autometabuilder/metadata.json index c1f4741..1f96bca 100644 --- a/src/autometabuilder/metadata.json +++ b/src/autometabuilder/metadata.json @@ -9,5 +9,109 @@ "pirate": "messages_pirate.json" }, "project_name": "AutoMetabuilder", - "version": "1.0.0" + "version": "1.0.0", + "step_definitions": { + "load_context": { + "label": "Load Project Context", + "fields": { + "output_key": { + "label": "Save Context As", + "type": "text", + "default": "sdlc_context", + "suggestions": [ + "sdlc_context" + ] + } + } + }, + "prepare_messages": { + "label": "Prepare LLM Prompt", + "fields": { + "input_context": { + "label": "Input Context Key", + "type": "text", + "default": "sdlc_context", + "suggestions": [ + "sdlc_context" + ] + }, + "output_key": { + "label": "Save Messages As", + "type": "text", + "default": "messages", + "suggestions": [ + "messages" + ] + } + } + }, + "llm_gen": { + "label": "Generate AI Response", + "fields": { + "input_messages": { + "label": "Input Messages Key", + "type": "text", + "default": "messages", + "suggestions": [ + "messages" + ] + }, + "output_key": { + "label": "Save Response As", + "type": "text", + "default": "llm_response", + "suggestions": [ + "llm_response" + ] + } + } + }, + "process_response": { + "label": "Execute Tools / Process Response", + "fields": { + "input_response": { + "label": "Input Response Key", + "type": "text", + "default": "llm_response", + "suggestions": [ + "llm_response" + ] + }, + "output_key": { + "label": "Save Tool Results As", + "type": "text", + "default": "tool_results", + "suggestions": [ + "tool_results" + ] + }, + "stop_if_no_tools": { + "label": "Stop if no tool calls", + "type": "checkbox", + "default": false + } + } + }, + "update_messages": { + "label": "Update Message History", + "fields": { + "input_results": { + "label": "Input Tool Results Key", + "type": "text", + "default": "tool_results", + "suggestions": [ + "tool_results" + ] + }, + "target_messages": { + "label": "Target Messages Key", + "type": "text", + "default": "messages", + "suggestions": [ + "messages" + ] + } + } + } + } } diff --git a/src/autometabuilder/web/server.py b/src/autometabuilder/web/server.py index 22dcce8..3370cff 100644 --- a/src/autometabuilder/web/server.py +++ b/src/autometabuilder/web/server.py @@ -115,6 +115,7 @@ async def read_item(request: Request, username: str = Depends(get_current_user)) logs = get_recent_logs() env_vars = get_env_vars() translations = get_translations() + metadata = get_metadata() prompt_content = get_prompt_content() workflow_content = get_workflow_content() is_running = bot_process is not None @@ -124,6 +125,7 @@ async def read_item(request: Request, username: str = Depends(get_current_user)) "logs": logs, "env_vars": env_vars, "translations": translations, + "metadata": metadata, "prompt_content": prompt_content, "workflow_content": workflow_content, "is_running": is_running, diff --git a/src/autometabuilder/web/templates/index.html b/src/autometabuilder/web/templates/index.html index 9f257f5..fa8bfae 100644 --- a/src/autometabuilder/web/templates/index.html +++ b/src/autometabuilder/web/templates/index.html @@ -114,18 +114,29 @@ console.error("Failed to parse workflow JSON", e); } - const stepDefinitions = { - 'load_context': ['output_key'], - 'prepare_messages': ['input_context', 'output_key'], - 'llm_gen': ['input_messages', 'output_key'], - 'process_response': ['input_response', 'output_key', 'stop_if_no_tools'], - 'update_messages': ['input_results', 'target_messages'] - }; + const stepDefinitions = JSON.parse('{{ metadata.step_definitions | tojson | safe }}'); + + const allSuggestions = new Set(); + Object.values(stepDefinitions).forEach(def => { + Object.values(def.fields).forEach(f => { + if (f.suggestions) f.suggestions.forEach(s => allSuggestions.add(s)); + }); + }); function renderWorkflow() { const container = document.getElementById('workflow-builder'); container.innerHTML = ''; + // Create datalist for suggestions + const datalist = document.createElement('datalist'); + datalist.id = 'workflow-suggestions'; + allSuggestions.forEach(s => { + const opt = document.createElement('option'); + opt.value = s; + datalist.appendChild(opt); + }); + container.appendChild(datalist); + workflow.forEach((task, taskIdx) => { const taskCard = document.createElement('div'); taskCard.className = 'card mb-4 border-primary'; @@ -134,8 +145,8 @@
${task.type === 'loop' ? `` : ''}
@@ -159,23 +170,24 @@ let fieldsHtml = ` `; if (step.type && stepDefinitions[step.type]) { fieldsHtml += '
'; - stepDefinitions[step.type].forEach(field => { + const def = stepDefinitions[step.type]; + Object.entries(def.fields).forEach(([field, fieldDef]) => { const val = step[field] !== undefined ? step[field] : ''; - const inputType = typeof val === 'boolean' || field === 'stop_if_no_tools' ? 'checkbox' : 'text'; + const isCheckbox = fieldDef.type === 'checkbox'; fieldsHtml += ` -
- - ${inputType === 'checkbox' - ? `
` - : `` +
+ + ${isCheckbox + ? `
` + : `` }
`; @@ -257,12 +269,10 @@ } function updateStepType(taskIdx, stepIdx, type) { - const oldStep = workflow[taskIdx].steps[stepIdx]; const newStep = { type: type }; if (stepDefinitions[type]) { - stepDefinitions[type].forEach(field => { - if (field === 'stop_if_no_tools') newStep[field] = false; - else newStep[field] = ''; + Object.entries(stepDefinitions[type].fields).forEach(([field, fieldDef]) => { + newStep[field] = fieldDef.default; }); } workflow[taskIdx].steps[stepIdx] = newStep;