From 0d0c4e5231419fe6867a221cece8cc0d5d7e8ebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Dettner=20K=C3=A4llander?= Date: Mon, 16 Feb 2026 13:25:43 +0100 Subject: [PATCH 01/13] Make cellpose UI template-safe for static rendering --- bioengine_apps/cellpose_finetuning/index.html | 110 +++++++++--------- 1 file changed, 56 insertions(+), 54 deletions(-) diff --git a/bioengine_apps/cellpose_finetuning/index.html b/bioengine_apps/cellpose_finetuning/index.html index 40dd8202..648cb345 100644 --- a/bioengine_apps/cellpose_finetuning/index.html +++ b/bioengine_apps/cellpose_finetuning/index.html @@ -53,7 +53,7 @@

Cellpose Fine-Tuning<
Connected Disconnected - • {{ workspace }} + • [[ workspace ]]
@@ -86,7 +86,7 @@

Cellpose Fine-Tuning< @@ -128,7 +128,7 @@

Cellpose Fine-Tuning< @click="currentTab = tab.id" :class="currentTab === tab.id ? 'bg-blue-600 text-white shadow-lg shadow-blue-900/50' : 'hover:bg-slate-800 hover:text-white'" class="w-full text-left px-4 py-3 rounded-lg flex items-center gap-3 transition-all duration-200 font-medium"> - {{ tab.name }} + [[ tab.name ]] @@ -141,7 +141,7 @@

Cellpose Fine-Tuning<

- {{ monitoredSession.status_type === 'running' ? 'Active Training' : 'Training Status' }} + [[ monitoredSession.status_type === 'running' ? 'Active Training' : 'Training Status' ]]

- {{ monitoringSessionId.slice(0, 8) }}... + [[ monitoringSessionId.slice(0, 8) ]]... 'bg-red-900 text-red-300': monitoredSession.status_type === 'failed', 'bg-gray-700 text-gray-300': monitoredSession.status_type === 'stopped' || monitoredSession.status_type === 'waiting' }"> - {{ monitoredSession.status_type || 'Run' }} + [[ monitoredSession.status_type || 'Run' ]]
@@ -171,12 +171,12 @@

:style="{ width: ((monitoredSession.current_epoch || 0) / (monitoredSession.total_epochs || 1) * 100) + '%' }">

- Epoch {{ monitoredSession.current_epoch || 0 }} - {{ monitoredSession.total_epochs || '?' }} Total + Epoch [[ monitoredSession.current_epoch || 0 ]] + [[ monitoredSession.total_epochs || '?' ]] Total
- {{ monitoredSession.message }} + [[ monitoredSession.message ]]
@@ -195,12 +195,12 @@

Welcome to Cellpose Fine-Tunin

Select a Cellpose Fine-Tuning Service to continue.

- No services found in workspace "{{ workspace }}". + No services found in workspace "[[ workspace ]]".
Make sure the Worker is running and you are logged into the correct workspace.
- {{ autoConnectError }} + [[ autoConnectError ]]
@@ -375,13 +375,13 @@

Cancel
- {{ trainingError }} + [[ trainingError ]]
@@ -396,7 +396,7 @@

Session Analysis - {{ selectedSessionId }} + [[ selectedSessionId ]]

@@ -420,32 +420,32 @@

Status
-
{{ currentSession?.status_type }}
+
[[ currentSession?.status_type ]]
Progress
-
{{ currentSession?.current_epoch || 0 }} / {{ currentSession?.total_epochs }} Epochs
+
[[ currentSession?.current_epoch || 0 ]] / [[ currentSession?.total_epochs ]] Epochs
Samples
-
{{ currentSession?.n_train || '-' }} Train
+
[[ currentSession?.n_train || '-' ]] Train
Duration
-
{{ formatDuration(currentSession?.elapsed_seconds) }}
+
[[ formatDuration(currentSession?.elapsed_seconds) ]]

Training Hyperparameters

-
Model
{{ currentSession?.model || '-' }}
-
Epochs
{{ currentSession?.n_epochs ?? currentSession?.total_epochs ?? '-' }}
-
Samples
{{ currentSession?.n_samples ?? 'all' }}
-
Learning Rate
{{ currentSession?.learning_rate ?? '-' }}
-
Weight Decay
{{ currentSession?.weight_decay ?? '-' }}
-
Min Train Masks
{{ currentSession?.min_train_masks ?? '-' }}
-
Validation Interval
{{ currentSession?.validation_interval ?? 'default (10)' }}
+
Model
[[ currentSession?.model || '-' ]]
+
Epochs
[[ currentSession?.n_epochs ?? currentSession?.total_epochs ?? '-' ]]
+
Samples
[[ currentSession?.n_samples ?? 'all' ]]
+
Learning Rate
[[ currentSession?.learning_rate ?? '-' ]]
+
Weight Decay
[[ currentSession?.weight_decay ?? '-' ]]
+
Min Train Masks
[[ currentSession?.min_train_masks ?? '-' ]]
+
Validation Interval
[[ currentSession?.validation_interval ?? 'default (10)' ]]
@@ -470,11 +470,11 @@

Validation Metrics

SYSTEM LOG - {{ currentSession?.status_type === 'running' ? 'LIVE' : 'OFFLINE' }} + [[ currentSession?.status_type === 'running' ? 'LIVE' : 'OFFLINE' ]]
-

Session ID: {{ selectedSessionId }}

-

> {{ currentSession?.message }}

+

Session ID: [[ selectedSessionId ]]

+

> [[ currentSession?.message ]]

Error: Process terminated unexpectedly.

@@ -490,13 +490,13 @@

Ready for Export

@@ -518,11 +518,11 @@

Configuration

@@ -538,7 +538,7 @@

Configuration

- {{ runningTrainingSessionsCount }} training session(s) are running. Inference may fail with GPU memory errors while training is active. + [[ runningTrainingSessionsCount ]] training session(s) are running. Inference may fail with GPU memory errors while training is active.
@@ -550,7 +550,7 @@

Configuration

Click or Drag Image Here

- {{ inferenceFile.name }} + [[ inferenceFile.name ]]
@@ -559,7 +559,7 @@

Configuration

@@ -579,7 +579,7 @@

Configuration

- Found {{ inferenceObjectCount }} objects + Found [[ inferenceObjectCount ]] objects
@@ -596,7 +596,7 @@

Configuration

Artifact Explorer

-

{{ trainingParams.artifact || 'No artifact selected' }}

+

[[ trainingParams.artifact || 'No artifact selected' ]]

@@ -604,7 +604,7 @@

Artifact Explorer

/ - {{ browserPath }} + [[ browserPath ]]
@@ -612,7 +612,7 @@

Artifact Explorer


Loading files...
-
{{ browserError }} +
[[ browserError ]]
  • @@ -624,7 +624,7 @@

    Artifact Explorer

    - {{ item.name }} + [[ item.name ]]
    @@ -640,10 +640,10 @@

    Artifact Explorer

    - Current: /{{ browserPath }} + Current: /[[ browserPath ]] - {{ browserFeedback }} + [[ browserFeedback ]]
    @@ -675,12 +675,12 @@

    Upload Dataset

    Uploading... - {{ uploadProgress }}% + [[ uploadProgress ]]%
    -
    {{ uploadStatus }}
    +
    [[ uploadStatus ]]
    @@ -696,7 +696,7 @@

    Upload Dataset

    \ No newline at end of file From 7d9ae4d5ab681ad90d6f43bb53b216a28f751b40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Dettner=20K=C3=A4llander?= Date: Mon, 16 Feb 2026 13:25:43 +0100 Subject: [PATCH 02/13] Make cellpose UI template-safe for static rendering --- bioengine_apps/cellpose_finetuning/index.html | 110 +++++++++--------- 1 file changed, 56 insertions(+), 54 deletions(-) diff --git a/bioengine_apps/cellpose_finetuning/index.html b/bioengine_apps/cellpose_finetuning/index.html index 40dd8202..648cb345 100644 --- a/bioengine_apps/cellpose_finetuning/index.html +++ b/bioengine_apps/cellpose_finetuning/index.html @@ -53,7 +53,7 @@

    Cellpose Fine-Tuning<
    Connected Disconnected - • {{ workspace }} + • [[ workspace ]]

    @@ -86,7 +86,7 @@

    Cellpose Fine-Tuning<

    - {{ selectedServiceId }} + [[ selectedServiceId ]]
    @@ -128,7 +128,7 @@

    Cellpose Fine-Tuning< @click="currentTab = tab.id" :class="currentTab === tab.id ? 'bg-blue-600 text-white shadow-lg shadow-blue-900/50' : 'hover:bg-slate-800 hover:text-white'" class="w-full text-left px-4 py-3 rounded-lg flex items-center gap-3 transition-all duration-200 font-medium"> - {{ tab.name }} + [[ tab.name ]] @@ -141,7 +141,7 @@

    Cellpose Fine-Tuning<

    - {{ monitoredSession.status_type === 'running' ? 'Active Training' : 'Training Status' }} + [[ monitoredSession.status_type === 'running' ? 'Active Training' : 'Training Status' ]]

    - {{ monitoringSessionId.slice(0, 8) }}... + [[ monitoringSessionId.slice(0, 8) ]]... 'bg-red-900 text-red-300': monitoredSession.status_type === 'failed', 'bg-gray-700 text-gray-300': monitoredSession.status_type === 'stopped' || monitoredSession.status_type === 'waiting' }"> - {{ monitoredSession.status_type || 'Run' }} + [[ monitoredSession.status_type || 'Run' ]]
    @@ -171,12 +171,12 @@

    :style="{ width: ((monitoredSession.current_epoch || 0) / (monitoredSession.total_epochs || 1) * 100) + '%' }">

    - Epoch {{ monitoredSession.current_epoch || 0 }} - {{ monitoredSession.total_epochs || '?' }} Total + Epoch [[ monitoredSession.current_epoch || 0 ]] + [[ monitoredSession.total_epochs || '?' ]] Total
    - {{ monitoredSession.message }} + [[ monitoredSession.message ]]
    @@ -195,12 +195,12 @@

    Welcome to Cellpose Fine-Tunin

    Select a Cellpose Fine-Tuning Service to continue.

    - No services found in workspace "{{ workspace }}". + No services found in workspace "[[ workspace ]]".
    Make sure the Worker is running and you are logged into the correct workspace.
    - {{ autoConnectError }} + [[ autoConnectError ]]
    @@ -375,13 +375,13 @@

    Cancel
    - {{ trainingError }} + [[ trainingError ]]
    @@ -396,7 +396,7 @@

    Session Analysis - {{ selectedSessionId }} + [[ selectedSessionId ]]

    @@ -420,32 +420,32 @@

    Status
    -
    {{ currentSession?.status_type }}
    +
    [[ currentSession?.status_type ]]
    Progress
    -
    {{ currentSession?.current_epoch || 0 }} / {{ currentSession?.total_epochs }} Epochs
    +
    [[ currentSession?.current_epoch || 0 ]] / [[ currentSession?.total_epochs ]] Epochs
    Samples
    -
    {{ currentSession?.n_train || '-' }} Train
    +
    [[ currentSession?.n_train || '-' ]] Train
    Duration
    -
    {{ formatDuration(currentSession?.elapsed_seconds) }}
    +
    [[ formatDuration(currentSession?.elapsed_seconds) ]]

    Training Hyperparameters

    -
    Model
    {{ currentSession?.model || '-' }}
    -
    Epochs
    {{ currentSession?.n_epochs ?? currentSession?.total_epochs ?? '-' }}
    -
    Samples
    {{ currentSession?.n_samples ?? 'all' }}
    -
    Learning Rate
    {{ currentSession?.learning_rate ?? '-' }}
    -
    Weight Decay
    {{ currentSession?.weight_decay ?? '-' }}
    -
    Min Train Masks
    {{ currentSession?.min_train_masks ?? '-' }}
    -
    Validation Interval
    {{ currentSession?.validation_interval ?? 'default (10)' }}
    +
    Model
    [[ currentSession?.model || '-' ]]
    +
    Epochs
    [[ currentSession?.n_epochs ?? currentSession?.total_epochs ?? '-' ]]
    +
    Samples
    [[ currentSession?.n_samples ?? 'all' ]]
    +
    Learning Rate
    [[ currentSession?.learning_rate ?? '-' ]]
    +
    Weight Decay
    [[ currentSession?.weight_decay ?? '-' ]]
    +
    Min Train Masks
    [[ currentSession?.min_train_masks ?? '-' ]]
    +
    Validation Interval
    [[ currentSession?.validation_interval ?? 'default (10)' ]]
    @@ -470,11 +470,11 @@

    Validation Metrics

    SYSTEM LOG - {{ currentSession?.status_type === 'running' ? 'LIVE' : 'OFFLINE' }} + [[ currentSession?.status_type === 'running' ? 'LIVE' : 'OFFLINE' ]]
    -

    Session ID: {{ selectedSessionId }}

    -

    > {{ currentSession?.message }}

    +

    Session ID: [[ selectedSessionId ]]

    +

    > [[ currentSession?.message ]]

    Error: Process terminated unexpectedly.

    @@ -490,13 +490,13 @@

    Ready for Export

    @@ -518,11 +518,11 @@

    Configuration

    @@ -538,7 +538,7 @@

    Configuration

    - {{ runningTrainingSessionsCount }} training session(s) are running. Inference may fail with GPU memory errors while training is active. + [[ runningTrainingSessionsCount ]] training session(s) are running. Inference may fail with GPU memory errors while training is active.
    @@ -550,7 +550,7 @@

    Configuration

    Click or Drag Image Here

    - {{ inferenceFile.name }} + [[ inferenceFile.name ]]
    @@ -559,7 +559,7 @@

    Configuration

    @@ -579,7 +579,7 @@

    Configuration

    - Found {{ inferenceObjectCount }} objects + Found [[ inferenceObjectCount ]] objects
    @@ -596,7 +596,7 @@

    Configuration

    Artifact Explorer

    -

    {{ trainingParams.artifact || 'No artifact selected' }}

    +

    [[ trainingParams.artifact || 'No artifact selected' ]]

    @@ -604,7 +604,7 @@

    Artifact Explorer

    / - {{ browserPath }} + [[ browserPath ]]
    @@ -612,7 +612,7 @@

    Artifact Explorer


    Loading files...
    -
    {{ browserError }} +
    [[ browserError ]]
    • @@ -624,7 +624,7 @@

      Artifact Explorer

      - {{ item.name }} + [[ item.name ]]
      @@ -640,10 +640,10 @@

      Artifact Explorer

      - Current: /{{ browserPath }} + Current: /[[ browserPath ]] - {{ browserFeedback }} + [[ browserFeedback ]]
      @@ -675,12 +675,12 @@

      Upload Dataset

      Uploading... - {{ uploadProgress }}% + [[ uploadProgress ]]%
      -
      {{ uploadStatus }}
      +
      [[ uploadStatus ]]
      @@ -696,7 +696,7 @@

      Upload Dataset

      \ No newline at end of file From 016a1ac25dd92606f1fb1b88dc5f5a93c92485a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Dettner=20K=C3=A4llander?= Date: Thu, 19 Feb 2026 22:56:15 +0100 Subject: [PATCH 03/13] Fix inference render and add workspace-aware artifact autocomplete error state --- bioengine_apps/cellpose_finetuning/index.html | 621 ++++++++++++++++-- tests/cellpose/test_ui_e2e.py | 255 ++++++- 2 files changed, 801 insertions(+), 75 deletions(-) diff --git a/bioengine_apps/cellpose_finetuning/index.html b/bioengine_apps/cellpose_finetuning/index.html index 648cb345..48c58658 100644 --- a/bioengine_apps/cellpose_finetuning/index.html +++ b/bioengine_apps/cellpose_finetuning/index.html @@ -295,21 +295,84 @@

      New Training Session

      Dataset & Model

      -
      -
      +
      + +
      + + + +
      +
      + +
      +
      +
      + + + + +
      +
      + [[ suggestion ]] + Tab +
      +
      +
      +

      [[ artifactInputError ]]

      +
      +
      + +
      +
      - -
      + +
      + + +
      + +
      @@ -351,6 +414,7 @@

      +
      @@ -502,11 +566,11 @@

      Ready for Export

      - -
      + +

      Live Inference

      - -
      + +
      @@ -584,6 +648,19 @@

      Configuration

      +
      +
      + +
      +

      Initializing inference service

      +

      + The worker connection is active, but the inference backend is not ready yet. +

      + +
      @@ -694,7 +771,7 @@

      Upload Dataset