[object Object]

← 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

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 →