← back to Exo
Use icon for image editing models (#1252)
cd125b3b8cc56f8b155ebc954aa4d2c759a55685 · 2026-01-22 22:37:34 +0000 · ciaranbor
## Motivation
Visual indicator for image editing models
## Changes
Add pencil icon to edit models in model list
Files touched
M dashboard/src/routes/+page.svelteM src/exo/shared/models/model_cards.py
Diff
commit cd125b3b8cc56f8b155ebc954aa4d2c759a55685
Author: ciaranbor <81697641+ciaranbor@users.noreply.github.com>
Date: Thu Jan 22 22:37:34 2026 +0000
Use icon for image editing models (#1252)
## Motivation
Visual indicator for image editing models
## Changes
Add pencil icon to edit models in model list
---
dashboard/src/routes/+page.svelte | 48 ++++++++++++++++++++++++++++++++++++
src/exo/shared/models/model_cards.py | 4 +--
2 files changed, 50 insertions(+), 2 deletions(-)
diff --git a/dashboard/src/routes/+page.svelte b/dashboard/src/routes/+page.svelte
index 9edadb62..183b6547 100644
--- a/dashboard/src/routes/+page.svelte
+++ b/dashboard/src/routes/+page.svelte
@@ -130,6 +130,15 @@
model.tasks.includes("ImageToImage")
);
}
+
+ // Helper to check if a model supports image editing
+ function modelSupportsImageEditing(modelId: string): boolean {
+ const model = models.find(
+ (m) => m.id === modelId || m.hugging_face_id === modelId,
+ );
+ if (!model?.tasks) return false;
+ return model.tasks.includes("ImageToImage");
+ }
let selectedSharding = $state<"Pipeline" | "Tensor">("Pipeline");
type InstanceMeta = "MlxRing" | "MlxIbv" | "MlxJaccl";
@@ -2369,6 +2378,9 @@
{@const isImageModel = modelSupportsImageGeneration(
foundModel.id,
)}
+ {@const isImageEditModel = modelSupportsImageEditing(
+ foundModel.id,
+ )}
<span
class="flex items-center justify-between gap-2 w-full pr-4"
>
@@ -2395,6 +2407,22 @@
<polyline points="21 15 16 10 5 21" />
</svg>
{/if}
+ {#if isImageEditModel}
+ <svg
+ class="w-4 h-4 flex-shrink-0 text-exo-yellow"
+ fill="none"
+ viewBox="0 0 24 24"
+ stroke="currentColor"
+ stroke-width="2"
+ >
+ <path
+ d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"
+ />
+ <path
+ d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"
+ />
+ </svg>
+ {/if}
<span class="truncate"
>{foundModel.name || foundModel.id}</span
>
@@ -2467,6 +2495,9 @@
{@const isImageModel = modelSupportsImageGeneration(
model.id,
)}
+ {@const isImageEditModel = modelSupportsImageEditing(
+ model.id,
+ )}
<button
type="button"
onclick={() => {
@@ -2507,6 +2538,23 @@
<polyline points="21 15 16 10 5 21" />
</svg>
{/if}
+ {#if isImageEditModel}
+ <svg
+ class="w-4 h-4 flex-shrink-0 text-exo-yellow"
+ fill="none"
+ viewBox="0 0 24 24"
+ stroke="currentColor"
+ stroke-width="2"
+ aria-label="Image editing model"
+ >
+ <path
+ d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"
+ />
+ <path
+ d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"
+ />
+ </svg>
+ {/if}
<span class="truncate">{model.name || model.id}</span>
</span>
<span
diff --git a/src/exo/shared/models/model_cards.py b/src/exo/shared/models/model_cards.py
index aa5d857a..eaad0154 100644
--- a/src/exo/shared/models/model_cards.py
+++ b/src/exo/shared/models/model_cards.py
@@ -462,7 +462,7 @@ _IMAGE_MODEL_CARDS: dict[str, ModelCard] = {
n_layers=57,
hidden_size=1,
supports_tensor=False,
- tasks=[ModelTask.TextToImage, ModelTask.ImageToImage],
+ tasks=[ModelTask.TextToImage],
components=[
ComponentInfo(
component_name="text_encoder",
@@ -504,7 +504,7 @@ _IMAGE_MODEL_CARDS: dict[str, ModelCard] = {
n_layers=60, # Qwen has 60 transformer blocks (all joint-style)
hidden_size=1,
supports_tensor=False,
- tasks=[ModelTask.TextToImage, ModelTask.ImageToImage],
+ tasks=[ModelTask.TextToImage],
components=[
ComponentInfo(
component_name="text_encoder",
← b783a213 dashboard: add placement filter by clicking topology nodes (
·
back to Exo
·
Fix GLM and Kimi tool calling crashes (#1255) df240f83 →