diff --git a/ai_frame_image_server.py b/ai_frame_image_server.py index 7645adc..ddbf030 100644 --- a/ai_frame_image_server.py +++ b/ai_frame_image_server.py @@ -9,7 +9,7 @@ import os import time import threading from apscheduler.schedulers.background import BackgroundScheduler -from libs.generic import load_config, load_recent_prompts, get_details_from_png, get_current_version +from libs.generic import load_config, load_recent_prompts, get_details_from_png, get_current_version, load_models_from_config from libs.comfyui import cancel_current_job, create_image from libs.ollama import create_prompt_on_openwebui @@ -100,6 +100,8 @@ def create() -> str: str: Redirect to the main page or a JSON response. """ prompt = request.form.get("prompt") if request.method == "POST" else None + model = request.form.get("model") if request.method == "POST" else None + if prompt is None: prompt = create_prompt_on_openwebui(user_config["comfyui"]["prompt"]) @@ -122,8 +124,11 @@ def create_image_endpoint() -> str: Renders the create image template with image and prompt. """ + models = load_models_from_config() + models.insert(0, "Random") + return render_template( - "create_image.html" + "create_image.html", models=models ) diff --git a/libs/generic.py b/libs/generic.py index e51e411..1c6cd10 100644 --- a/libs/generic.py +++ b/libs/generic.py @@ -98,6 +98,12 @@ def get_current_version(): print("Error running bump-my-version:", e) return None +def load_models_from_config(): + flux_models = user_config["comfyui:flux"]["models"].split(",") + sdxl_models = user_config["comfyui"]["models"].split(",") + all_models = flux_models + sdxl_models + return all_models + user_config = load_config() output_folder = user_config["comfyui"]["output_dir"] \ No newline at end of file diff --git a/templates/create_image.html b/templates/create_image.html index cbac593..67bd6f1 100644 --- a/templates/create_image.html +++ b/templates/create_image.html @@ -1,15 +1,14 @@ <!DOCTYPE html> <html lang="en"> <head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Create An Image</title> <style> - * { - margin: 0; - padding: 0; - box-sizing: border-box; - } + /* ---------- reset ---------- */ + * { margin: 0; padding: 0; box-sizing: border-box; } + + /* ---------- layout ---------- */ body { display: flex; flex-direction: column; @@ -37,8 +36,9 @@ .button-group { display: flex; gap: 20px; + align-items: center; } - button { + button, select { background: #333; color: white; border: none; @@ -48,9 +48,8 @@ cursor: pointer; transition: background 0.3s; } - button:hover { - background: #555; - } + button:hover, + select:hover { background: #555; } /* ---------- spinner ---------- */ #spinner-overlay { @@ -60,7 +59,7 @@ align-items: center; justify-content: center; background: rgba(0, 0, 0, 0.6); - visibility: hidden; /* toggled in JS */ + visibility: hidden; z-index: 1000; } .spinner { @@ -76,11 +75,24 @@ </head> <body> <h1 style="margin-bottom: 20px;">Create An Image</h1> + <textarea id="prompt-box" placeholder="Enter your custom prompt here..."></textarea> + <div class="button-group"> <button onclick="showSpinner(); location.href='/'">Back</button> + <button onclick="sendPrompt()">Send Prompt</button> - <button onclick="showSpinner(); location.href='/create'">Random Prompt</button> + + <button onclick="randomPrompt()">Random Prompt</button> + + + <!-- new model selector --> + <select id="model-select"> + {% for m in models %} + <option value="{{ m }}">{{ m }}</option> + {% endfor %} + </select> + </div> <!-- waiting overlay --> @@ -90,15 +102,17 @@ <script> const overlay = document.getElementById('spinner-overlay'); - function showSpinner() { - overlay.style.visibility = 'visible'; - } + + function showSpinner() { overlay.style.visibility = 'visible'; } function sendPrompt() { showSpinner(); const prompt = document.getElementById('prompt-box').value; + const model = document.getElementById('model-select').value; + const formData = new URLSearchParams(); formData.append('prompt', prompt); + formData.append('model', model); fetch('/create', { method: 'POST', @@ -106,14 +120,35 @@ body: formData.toString() }) .then(response => { - // If server redirects, follow it; otherwise go to /create window.location.href = response.redirected ? response.url : '/create'; }) .catch(error => { - overlay.style.visibility = 'hidden'; // hide spinner on failure + overlay.style.visibility = 'hidden'; alert("Error sending prompt: " + error); }); } + + // wrapper for Random Prompt button so it also sends the model + function randomPrompt() { + showSpinner(); + const model = document.getElementById('model-select').value; + + const formData = new URLSearchParams(); + formData.append('model', model); + + fetch('/create', { + method: 'POST', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + body: formData.toString() + }) + .then(response => { + window.location.href = response.redirected ? response.url : '/create'; + }) + .catch(error => { + overlay.style.visibility = 'hidden'; + alert("Error requesting random prompt: " + error); + }); + } </script> </body> </html>