diff --git a/webui/app.py b/webui/app.py index 907f052..6bd295f 100644 --- a/webui/app.py +++ b/webui/app.py @@ -10,7 +10,7 @@ from transformers import pipeline app = Flask(__name__) -TRAIN_OUTPUTS_DIR = "train_outputs" +TRAIN_OUTPUTS_DIR = "train_outputs/runs" chat_generator = None chat_model_name = None chat_history = None @@ -142,13 +142,41 @@ def visualize(run): if not os.path.isdir(logdir): abort(404, description=f"Run '{run}' not found.") - data = get_run_data(logdir) - if data is None: - abort(404, description=f"'all_results.json' not found in '{run}'.") + eval_folders = [ + d + for d in os.listdir(logdir) + if os.path.isdir(os.path.join(logdir, d)) and d.startswith("eval-results-") + ] + eval_folders.sort( + key=lambda d: os.path.getctime(os.path.join(logdir, d)), + reverse=True, + ) - generated_data = get_generated_text_data(logdir) + selected_eval_folder = request.args.get("eval_folder") - # Load config.yaml from the run directory + if eval_folders and selected_eval_folder: + # New structure with eval folders and a folder is selected + eval_path = os.path.join(logdir, selected_eval_folder) + data = get_run_data(eval_path) + if data is None: + abort( + 404, + description=f"'all_results.json' not found in '{selected_eval_folder}'.", + ) + generated_data = get_generated_text_data(eval_path) + elif not eval_folders: + # Old structure: eval results in the root folder + data = get_run_data(logdir) + if data is None: + abort(404, description=f"'all_results.json' not found in '{run}'.") + generated_data = get_generated_text_data(logdir) + selected_eval_folder = "root" # Indicate root folder for template + else: + # New structure, but no eval folder selected yet + data = None + generated_data = None + + # Load config.yaml from the run directory (root level) config_path = os.path.join(logdir, "config.yaml") try: with open(config_path) as f: @@ -160,6 +188,8 @@ def visualize(run): return render_template( "visualize.html", run=run, + eval_folders=eval_folders, + selected_eval_folder=selected_eval_folder, data=data, generated_data=generated_data, model_name=model_name, diff --git a/webui/templates/visualize.html b/webui/templates/visualize.html index 77dec63..bfac570 100644 --- a/webui/templates/visualize.html +++ b/webui/templates/visualize.html @@ -213,6 +213,23 @@ } /* Removed system-msg-container button styles */ + + #eval-folder-selection { + margin-bottom: 20px; + } + + #eval-folder-selection label { + display: block; + margin-bottom: 5px; + font-weight: bold; + } + + #eval-folder-selection select { + width: 300px; + padding: 8px; + border: 1px solid #ddd; + border-radius: 5px; + } {% endblock %} @@ -227,8 +244,23 @@
+ {% if eval_folders %} +
+ + +
+ {% endif %} + + {% if data %} {% for group, results in data.items() %} -

{{ group }}

+

{{ group }} ({% if selected_eval_folder and selected_eval_folder != "root" %}{{ selected_eval_folder }}{% + else %}root{% endif %})

@@ -267,6 +299,7 @@
{% endfor %} + {% endif %}
@@ -274,7 +307,8 @@ {% for split, data in generated_data.items() %} {% if data %}
-

Generated Text ({{ split }})

+

Generated Text ({{ split }} - {% if selected_eval_folder and selected_eval_folder != "root" %}{{ + selected_eval_folder }}{% else %}root{% endif %})

{% endif %} {% endfor %} - {% else %} -

No generated text data found.

+ {% elif selected_eval_folder %} +

No generated text data found in {% if selected_eval_folder and selected_eval_folder != "root" %}{{ + selected_eval_folder }}{% else %}root{% endif %}.

{% endif %}
@@ -358,15 +393,18 @@ updateText(split); } - // Initialize text for each split using JavaScript + // Initialize text for each split using JavaScript if generatedData is available window.addEventListener('DOMContentLoaded', (event) => { - for (const split in generatedData) { - if (generatedData[split].length > 0) { - updateText(split); + if (generatedData && Object.keys(generatedData).length > 0) { + for (const split in generatedData) { + if (generatedData[split].length > 0) { + updateText(split); + } } } }); + function goBack() { window.history.back(); } @@ -488,9 +526,15 @@ chatOutput.scrollTop = chatOutput.scrollHeight; } - // Removed the separate updateSystemMsg function + function loadEvalFolder() { + const selectedFolder = document.getElementById('eval_folder').value; + const runName = '{{ run }}'; + if (selectedFolder) { + window.location.href = `/visualize/${runName}?eval_folder=${selectedFolder}`; + } + } + - // Updated sendMessage function handles system msg update and chat message // Bind the sendMessage function to the Enter key document.getElementById('chat-input').addEventListener('keypress', function (e) { if (e.key === 'Enter') {