diff --git a/src/app/page.tsx b/src/app/page.tsx index 2ce8d00..cf74aa8 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -455,19 +455,46 @@ export default function Home() { const fetchModelInfo = useCallback(async () => { try { const response = await fetch('/api/model/info'); - if (!response.ok) { - setIsModelOnline(false); - throw new Error('Model info unavailable'); + let data: any = null; + try { + data = await response.json(); + } catch { + data = null; } - const data: ModelInfoResponse = await response.json(); + + if (!response.ok) { + const message = data?.error || data?.detail || 'Model info unavailable'; + + // Treat "no model" as online-but-unloaded so the selector still works. + if (response.status === 503 && /no model/i.test(message)) { + setIsModelOnline(true); + setPredictionState((prev) => ({ + ...prev, + modelInfo: null, + selectedLabels: new Set(), + error: null, + })); + return null; + } + + setIsModelOnline(false); + setPredictionState((prev) => ({ + ...prev, + modelInfo: null, + error: message, + })); + return null; + } + + const modelInfo: ModelInfoResponse = data; setIsModelOnline(true); setPredictionState((prev) => ({ ...prev, - modelInfo: data, - selectedLabels: new Set(data.labels), + modelInfo, + selectedLabels: new Set(modelInfo.labels), error: null, })); - return data; + return modelInfo; } catch (error) { console.error('Failed to fetch model info:', error); setIsModelOnline(false); diff --git a/src/components/PredictionPanel.tsx b/src/components/PredictionPanel.tsx index 4af04ef..9dc33c3 100644 --- a/src/components/PredictionPanel.tsx +++ b/src/components/PredictionPanel.tsx @@ -116,6 +116,11 @@ export default function PredictionPanel({ )} )} + {!modelInfo && ( +

+ No model loaded. Select a model to enable predictions. +

+ )} {/* Action Buttons */}