Describe clearly you don't need to download models on the server.

This commit is contained in:
Lucas Winther
2026-07-14 20:38:25 +02:00
parent 8464f0e492
commit dc4eec2e9e
4 changed files with 25 additions and 1 deletions
+4
View File
@@ -290,3 +290,7 @@ starts the weight download. Weights load exactly when they are needed or asked f
(`loadStarted`, progress); the next load starts from clean progress. The explicit (`loadStarted`, progress); the next load starts from clean progress. The explicit
download is a full pipeline load, so it also warms up inference and surfaces the download is a full pipeline load, so it also warms up inference and surfaces the
"Running on …" backend badge. "Running on …" backend badge.
**Amendment (2026-07-14):** while the engine toggle is on "server" (signed in,
available), `ModelPicker` states explicitly that nothing is downloaded to the
device; the Download button stays (with a matching tooltip) for on-device /
offline preparation.
+1
View File
@@ -644,6 +644,7 @@ export function App() {
disabled={busy || liveActive} disabled={busy || liveActive}
onDownloadSelected={handleDownloadModel} onDownloadSelected={handleDownloadModel}
downloading={loadStarted && !modelReady} downloading={loadStarted && !modelReady}
serverEngine={serverSelected}
/> />
{model?.multilingual && ( {model?.multilingual && (
+15 -1
View File
@@ -23,6 +23,8 @@ interface ModelPickerProps {
onDownloadSelected: () => void; onDownloadSelected: () => void;
/** True while a model load/download is in flight. */ /** True while a model load/download is in flight. */
downloading: boolean; downloading: boolean;
/** True when transcription will run on the server — no download needed (D-020). */
serverEngine: boolean;
} }
const DEVICE_OPTIONS: readonly { value: DevicePreference; label: string }[] = [ const DEVICE_OPTIONS: readonly { value: DevicePreference; label: string }[] = [
@@ -56,6 +58,7 @@ export function ModelPicker({
disabled = false, disabled = false,
onDownloadSelected, onDownloadSelected,
downloading, downloading,
serverEngine,
}: ModelPickerProps) { }: ModelPickerProps) {
// Size estimates depend on the dtype the worker will pick, which depends on // Size estimates depend on the dtype the worker will pick, which depends on
// the device. Until the worker has reported one, assume WASM unless the // the device. Until the worker has reported one, assume WASM unless the
@@ -116,6 +119,13 @@ export function ModelPicker({
Model switching is disabled while a transcription is running. Model switching is disabled while a transcription is running.
</p> </p>
)} )}
{serverEngine && (
<p className="model-picker-hint server-engine-hint" role="status">
Transcription is set to run on the server — the selected model runs
there, so nothing is downloaded to this device. Downloading is only
useful if you plan to transcribe on-device or offline.
</p>
)}
<p <p
className={`offline-status${offlineReady && downloaded.size > 0 ? " offline-status-ready" : ""}`} className={`offline-status${offlineReady && downloaded.size > 0 ? " offline-status-ready" : ""}`}
> >
@@ -164,7 +174,11 @@ export function ModelPicker({
type="button" type="button"
className="model-download-button" className="model-download-button"
disabled={disabled || downloading} disabled={disabled || downloading}
title="Download this model now so it is available offline. Otherwise it downloads automatically when an on-device transcription starts." title={
serverEngine
? "Not needed while transcribing on the server — download only to prepare on-device or offline use."
: "Download this model now so it is available offline. Otherwise it downloads automatically when an on-device transcription starts."
}
onClick={onDownloadSelected} onClick={onDownloadSelected}
> >
{downloading ? "Downloading…" : "Download"} {downloading ? "Downloading…" : "Download"}
+5
View File
@@ -207,6 +207,11 @@ body {
font-size: 0.85rem; font-size: 0.85rem;
} }
/* Server engine active — no model download needed on this device (D-020). */
.server-engine-hint {
color: #9ad6ae;
}
.device-select, .device-select,
.transcription-options label { .transcription-options label {
display: flex; display: flex;