From dee48679b4e1c14cc35a1a750cb179c8e3044ee4 Mon Sep 17 00:00:00 2001 From: nold Date: Thu, 1 Jan 2026 19:33:55 +0000 Subject: [PATCH 1/4] Fix(gallery): Updated checksums for qwen3-vl-30b instruct & thinking (#7819) * Fix(gallery): SHA256 hashes for qwen3-vl-30b-instruct Signed-off-by: nold * Fix(gallery): SHA256 checksums for qwen3-vl-30b-thinking Signed-off-by: nold --------- Signed-off-by: nold --- gallery/index.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gallery/index.yaml b/gallery/index.yaml index eaf8a77f77fa..64f6bb87d5fd 100644 --- a/gallery/index.yaml +++ b/gallery/index.yaml @@ -315,9 +315,9 @@ files: - filename: Qwen3-VL-30B-A3B-Instruct-Q4_K_M.gguf uri: huggingface://unsloth/Qwen3-VL-30B-A3B-Instruct-GGUF/Qwen3-VL-30B-A3B-Instruct-Q4_K_M.gguf - sha256: dfee58d4227981d04dd8558b7d8d50073b4d69a6d017a67ed42795d303b6f9ef + sha256: 7ea0a652b4bda1c1911a93a79a7cd98b92011dfea078e87328285294b2b4ab44 - filename: mmproj/mmproj-F16.gguf - sha256: 7e7cec67a3a887bddbf38099738d08570e85f08dd126578fa00a7acf4dacef01 + sha256: 9f248089357599a08a23af40cb5ce0030de14a2e119b7ef57f66cb339bd20819 uri: huggingface://unsloth/Qwen3-VL-30B-A3B-Instruct-GGUF/mmproj-F16.gguf - !!merge <<: *qwen3vl name: "qwen3-vl-30b-a3b-thinking" @@ -332,10 +332,10 @@ files: - filename: Qwen3-VL-30B-A3B-Thinking-Q4_K_M.gguf uri: huggingface://unsloth/Qwen3-VL-30B-A3B-Thinking-GGUF/Qwen3-VL-30B-A3B-Thinking-Q4_K_M.gguf - sha256: 68aacddb0c5598150fcbdb38916606e070101439714726352b808e1efa075e53 + sha256: b5622d28d2deb398558841fb29060f0ad241bd30f6afe79ed3fcf78d5fbf887b - filename: mmproj/mmproj-F16.gguf uri: huggingface://unsloth/Qwen3-VL-30B-A3B-Thinking-GGUF/mmproj-F16.gguf - sha256: 752f8f67171e1d3c752b638b1b210a4c75dd0731200595f496ef8b26040ce35d + sha256: 7c5d39a9dc4645fc49a39a1c5a96157825af4d1c6e0961bed5d667a65b4b9572 - !!merge <<: *qwen3vl name: "qwen3-vl-4b-instruct" urls: From 7db79aadfaf43279a32a410f40d09b57906f0d89 Mon Sep 17 00:00:00 2001 From: "LocalAI [bot]" <139863280+localai-bot@users.noreply.github.com> Date: Thu, 1 Jan 2026 21:16:11 +0100 Subject: [PATCH 2/4] chore(model-gallery): :arrow_up: update checksum (#7821) :arrow_up: Checksum updates in gallery/index.yaml Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: mudler <2420543+mudler@users.noreply.github.com> --- gallery/index.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gallery/index.yaml b/gallery/index.yaml index 64f6bb87d5fd..384fa21dda07 100644 --- a/gallery/index.yaml +++ b/gallery/index.yaml @@ -365,11 +365,11 @@ model: Qwen3-VL-32B-Instruct-Q4_K_M.gguf files: - filename: Qwen3-VL-32B-Instruct-Q4_K_M.gguf - sha256: 17885d28e964b22b2faa981a7eaeeeb78da0972ee5f826ad5965f7583a610d9f uri: huggingface://unsloth/Qwen3-VL-32B-Instruct-GGUF/Qwen3-VL-32B-Instruct-Q4_K_M.gguf + sha256: 92d605566f8661b296251c535ed028ecf81c32e14e06948a3d8bef829e96a804 - filename: mmproj/mmproj-Qwen3-VL-32B-Instruct-F16.gguf - sha256: 14b1d68befa75a5e646dd990c5bb429c912b7aa9b49b9ab18231ca5f750421c9 uri: huggingface://unsloth/Qwen3-VL-32B-Instruct-GGUF/mmproj-F16.gguf + sha256: dde7e407cf72e601455976c2d0daa960d16ee34ba3f0c78718c881d8cd8c1052 - !!merge <<: *qwen3vl name: "qwen3-vl-4b-thinking" urls: From 5ee6c1810b717806324a86cb2c3a37059a042d14 Mon Sep 17 00:00:00 2001 From: "LocalAI [bot]" <139863280+localai-bot@users.noreply.github.com> Date: Thu, 1 Jan 2026 21:16:38 +0100 Subject: [PATCH 3/4] feat(swagger): update swagger (#7820) Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: mudler <2420543+mudler@users.noreply.github.com> Co-authored-by: Ettore Di Giacinto --- swagger/docs.go | 5 +---- swagger/swagger.json | 5 +---- swagger/swagger.yaml | 4 +--- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/swagger/docs.go b/swagger/docs.go index a7d53c10c74a..60b4da99323a 100644 --- a/swagger/docs.go +++ b/swagger/docs.go @@ -2446,10 +2446,6 @@ const docTemplate = `{ "type": "string" } }, - "mode": { - "description": "Image (not supported by OpenAI)", - "type": "integer" - }, "model": { "type": "string" }, @@ -2476,6 +2472,7 @@ const docTemplate = `{ "description": "Prompt is read only by completion/image API calls" }, "quality": { + "description": "Image (not supported by OpenAI)", "type": "string" }, "reasoning_effort": { diff --git a/swagger/swagger.json b/swagger/swagger.json index 43b0cac9a139..781b617585b8 100644 --- a/swagger/swagger.json +++ b/swagger/swagger.json @@ -2439,10 +2439,6 @@ "type": "string" } }, - "mode": { - "description": "Image (not supported by OpenAI)", - "type": "integer" - }, "model": { "type": "string" }, @@ -2469,6 +2465,7 @@ "description": "Prompt is read only by completion/image API calls" }, "quality": { + "description": "Image (not supported by OpenAI)", "type": "string" }, "reasoning_effort": { diff --git a/swagger/swagger.yaml b/swagger/swagger.yaml index c94906321d44..a18b69f890b8 100644 --- a/swagger/swagger.yaml +++ b/swagger/swagger.yaml @@ -705,9 +705,6 @@ definitions: additionalProperties: type: string type: object - mode: - description: Image (not supported by OpenAI) - type: integer model: type: string model_base_name: @@ -727,6 +724,7 @@ definitions: prompt: description: Prompt is read only by completion/image API calls quality: + description: Image (not supported by OpenAI) type: string reasoning_effort: type: string From 76cfe1f367b4a204b278670e455562aaf5097d54 Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Thu, 1 Jan 2026 22:07:42 +0100 Subject: [PATCH 4/4] feat(image-gen/UI): move controls to the left, make the page more compact (#7823) Signed-off-by: Ettore Di Giacinto --- core/http/static/image.js | 62 +++-- core/http/views/text2image.html | 432 ++++++++++++++++---------------- 2 files changed, 257 insertions(+), 237 deletions(-) diff --git a/core/http/static/image.js b/core/http/static/image.js index 16b18735fd57..9533a14b8665 100644 --- a/core/http/static/image.js +++ b/core/http/static/image.js @@ -32,9 +32,13 @@ async function promptDallE() { const input = document.getElementById("input"); const generateBtn = document.getElementById("generate-btn"); const resultDiv = document.getElementById("result"); + const resultPlaceholder = document.getElementById("result-placeholder"); // Show loader and disable form - loader.style.display = "block"; + loader.classList.remove("hidden"); + if (resultPlaceholder) { + resultPlaceholder.style.display = "none"; + } input.disabled = true; generateBtn.disabled = true; @@ -42,7 +46,10 @@ async function promptDallE() { const prompt = input.value.trim(); if (!prompt) { alert("Please enter a prompt"); - loader.style.display = "none"; + loader.classList.add("hidden"); + if (resultPlaceholder) { + resultPlaceholder.style.display = "flex"; + } input.disabled = false; generateBtn.disabled = false; return; @@ -103,8 +110,11 @@ async function promptDallE() { } } catch (error) { console.error("Error processing image files:", error); - resultDiv.innerHTML = '

Error processing image files: ' + error.message + '

'; - loader.style.display = "none"; + resultDiv.innerHTML = '

Error processing image files: ' + error.message + '

'; + loader.classList.add("hidden"); + if (resultPlaceholder) { + resultPlaceholder.style.display = "none"; + } input.disabled = false; generateBtn.disabled = false; return; @@ -124,21 +134,27 @@ async function promptDallE() { if (json.error) { // Display error - resultDiv.innerHTML = '

Error: ' + json.error.message + '

'; - loader.style.display = "none"; + resultDiv.innerHTML = '

Error: ' + json.error.message + '

'; + loader.classList.add("hidden"); + if (resultPlaceholder) { + resultPlaceholder.style.display = "none"; + } input.disabled = false; generateBtn.disabled = false; return; } - // Clear result div + // Clear result div and hide placeholder resultDiv.innerHTML = ''; + if (resultPlaceholder) { + resultPlaceholder.style.display = "none"; + } // Display all generated images if (json.data && json.data.length > 0) { json.data.forEach((item, index) => { const imageContainer = document.createElement("div"); - imageContainer.className = "mb-6 bg-[var(--color-bg-primary)]/50 border border-[#1E293B] rounded-xl p-4"; + imageContainer.className = "mb-4 bg-[var(--color-bg-primary)]/50 border border-[#1E293B] rounded-lg p-2"; // Create image element const img = document.createElement("img"); @@ -150,30 +166,30 @@ async function promptDallE() { return; // Skip invalid items } img.alt = prompt; - img.className = "w-full h-auto rounded-lg mb-3"; + img.className = "w-full h-auto rounded-lg mb-2"; imageContainer.appendChild(img); // Create caption container const captionDiv = document.createElement("div"); - captionDiv.className = "mt-3 p-3 bg-[var(--color-bg-secondary)] rounded-lg"; + captionDiv.className = "mt-2 p-2 bg-[var(--color-bg-secondary)] rounded-lg"; // Prompt caption const promptCaption = document.createElement("p"); - promptCaption.className = "text-sm text-[var(--color-text-primary)] mb-2"; + promptCaption.className = "text-xs text-[var(--color-text-primary)] mb-1.5"; promptCaption.innerHTML = 'Prompt: ' + escapeHtml(prompt); captionDiv.appendChild(promptCaption); // Negative prompt if provided if (negativePrompt) { const negativeCaption = document.createElement("p"); - negativeCaption.className = "text-sm text-[var(--color-text-secondary)] mb-2"; + negativeCaption.className = "text-xs text-[var(--color-text-secondary)] mb-1.5"; negativeCaption.innerHTML = 'Negative Prompt: ' + escapeHtml(negativePrompt); captionDiv.appendChild(negativeCaption); } // Generation details const detailsDiv = document.createElement("div"); - detailsDiv.className = "flex flex-wrap gap-4 text-xs text-[var(--color-text-secondary)] mt-2"; + detailsDiv.className = "flex flex-wrap gap-3 text-[10px] text-[var(--color-text-secondary)] mt-1.5"; detailsDiv.innerHTML = ` Size: ${size} ${step !== undefined ? `Steps: ${step}` : ''} @@ -183,7 +199,7 @@ async function promptDallE() { // Copy prompt button const copyBtn = document.createElement("button"); - copyBtn.className = "mt-2 px-3 py-1 text-xs bg-[var(--color-primary)] text-white rounded hover:opacity-80"; + copyBtn.className = "mt-1.5 px-2 py-0.5 text-[10px] bg-[var(--color-primary)] text-white rounded hover:opacity-80"; copyBtn.innerHTML = 'Copy Prompt'; copyBtn.onclick = () => { navigator.clipboard.writeText(prompt).then(() => { @@ -198,8 +214,15 @@ async function promptDallE() { imageContainer.appendChild(captionDiv); resultDiv.appendChild(imageContainer); }); + // Hide placeholder when images are displayed + if (resultPlaceholder) { + resultPlaceholder.style.display = "none"; + } } else { - resultDiv.innerHTML = '

No images were generated.

'; + resultDiv.innerHTML = '

No images were generated.

'; + if (resultPlaceholder) { + resultPlaceholder.style.display = "none"; + } } // Preserve prompt in input field (don't clear it) @@ -207,10 +230,13 @@ async function promptDallE() { } catch (error) { console.error("Error generating image:", error); - resultDiv.innerHTML = '

Error: ' + error.message + '

'; + resultDiv.innerHTML = '

Error: ' + error.message + '

'; + if (resultPlaceholder) { + resultPlaceholder.style.display = "none"; + } } finally { // Hide loader and re-enable form - loader.style.display = "none"; + loader.classList.add("hidden"); input.disabled = false; generateBtn.disabled = false; input.focus(); @@ -250,6 +276,6 @@ document.addEventListener("DOMContentLoaded", function() { // Hide loader initially const loader = document.getElementById("loader"); if (loader) { - loader.style.display = "none"; + loader.classList.add("hidden"); } }); diff --git a/core/http/views/text2image.html b/core/http/views/text2image.html index 2955a6b400f6..c8d7298c9256 100644 --- a/core/http/views/text2image.html +++ b/core/http/views/text2image.html @@ -3,249 +3,243 @@ {{template "views/partials/head" .}} - -
+ +
{{template "views/partials/navbar" .}} -
- - -
-
-

- Image Generation {{ if .Model }} with {{.Model}} {{ end }} -

-

Create stunning images from text descriptions

-
-
- - -
-
-
- Select Model: -
-
- -
-
-
- - -
-

Generate an Image

- -
- -
- -
- -
- -
- - -
-
- - -
- - +
+ +
+ +
+
+ +
+
+
+ +
+ +
+ + + +
+ +
+ + +
- -
- -
- - - - -
- -
+ +
+ + +
- -
- - -
-
+ +
+ +
+ + + + +
+ +
- -
- - -
+ +
+ +