@@ -43,6 +43,7 @@ interface ModelsContextState {
43
43
// Add flashbar items to the context
44
44
modelFlashbarItems : FlashbarProps . MessageDefinition [ ] ;
45
45
clearModelFlashbar : ( ) => void ;
46
+ checkModelLoadStatus : ( ) => Promise < boolean > ;
46
47
}
47
48
48
49
export const ModelsContext = createContext < ModelsContextState | null > ( null ) ;
@@ -82,43 +83,46 @@ export const useModelsProvider = () => {
82
83
} , [ ] ) ;
83
84
84
85
// Function to fetch available models
85
- const fetchModels = useCallback ( async ( ) => {
86
- // Don't fetch if not authenticated
87
- if ( ! isAuthenticated ) {
88
- return [ ] ;
89
- }
86
+ const fetchModels = useCallback (
87
+ async ( isModelLoaded : boolean ) => {
88
+ // Don't fetch if not authenticated
89
+ if ( ! isAuthenticated ) {
90
+ return [ ] ;
91
+ }
90
92
91
- try {
92
- const response = await ApiHelper . get < ModelsResponse > ( "models" ) ;
93
- if ( response ) {
94
- const options = response . models . map ( ( model ) => ( {
95
- label : model . model_folder_name ,
96
- value : model . model_folder_name ,
97
- description : model . model_sensors . join ( ", " ) ,
98
- disabled : model . is_select_disabled ,
99
- } ) ) ;
100
- setModelOptions ( options ) ;
101
-
102
- // Restore previously selected model if it exists in the new list
103
- const selectedModelName = localStorage . getItem ( "selectedModelName" ) ;
104
- if ( selectedModelName ) {
105
- const previousModel = options . find ( ( model ) => model . value === selectedModelName ) ;
106
- if ( previousModel && isModelLoaded ) {
107
- setSelectedModel ( previousModel ) ;
108
- } else {
109
- // If the previous model is not found, clear the selection
110
- setSelectedModel ( null ) ;
93
+ try {
94
+ const response = await ApiHelper . get < ModelsResponse > ( "models" ) ;
95
+ if ( response ) {
96
+ const options = response . models . map ( ( model ) => ( {
97
+ label : model . model_folder_name ,
98
+ value : model . model_folder_name ,
99
+ description : model . model_sensors . join ( ", " ) ,
100
+ disabled : model . is_select_disabled ,
101
+ } ) ) ;
102
+ setModelOptions ( options ) ;
103
+
104
+ // Restore previously selected model if it exists in the new list
105
+ const selectedModelName = sessionStorage . getItem ( "selectedModelName" ) ;
106
+ if ( selectedModelName ) {
107
+ const previousModel = options . find ( ( model ) => model . value === selectedModelName ) ;
108
+ if ( previousModel && isModelLoaded ) {
109
+ setSelectedModel ( previousModel ) ;
110
+ } else {
111
+ // If the previous model is not found, clear the selection
112
+ setSelectedModel ( null ) ;
113
+ }
111
114
}
112
- }
113
115
114
- return options ;
116
+ return options ;
117
+ }
118
+ return [ ] ;
119
+ } catch ( error ) {
120
+ console . error ( "Error fetching models:" , error ) ;
121
+ return [ ] ;
115
122
}
116
- return [ ] ;
117
- } catch ( error ) {
118
- console . error ( "Error fetching models:" , error ) ;
119
- return [ ] ;
120
- }
121
- } , [ isAuthenticated , isModelLoaded ] ) ;
123
+ } ,
124
+ [ isAuthenticated ]
125
+ ) ;
122
126
123
127
// Function to check if a model is currently loaded
124
128
const checkModelLoadStatus = useCallback ( async ( ) => {
@@ -140,103 +144,92 @@ export const useModelsProvider = () => {
140
144
} else {
141
145
setIsModelLoaded ( false ) ;
142
146
setIsModelLoading ( false ) ;
147
+ setSelectedModel ( null ) ; // Clear selected model if loading failed
143
148
return false ;
144
149
}
145
150
} catch ( error ) {
146
151
console . error ( "Error checking model status:" , error ) ;
147
152
setIsModelLoaded ( false ) ;
148
153
setIsModelLoading ( false ) ;
154
+ setSelectedModel ( null ) ; // Clear selected model if loading failed
149
155
return false ;
150
156
}
151
157
} , [ isAuthenticated ] ) ;
152
158
153
159
// Function to poll for model loading status with retry limit
154
- const pollModelLoadingStatus = useCallback (
155
- ( retryCount = 0 ) => {
156
- // Don't poll if not authenticated
157
- if ( ! isAuthenticated ) {
158
- return ;
159
- }
160
-
161
- // Maximum number of retries (30 seconds with 1-second interval)
162
- const MAX_RETRIES = 30 ;
160
+ const pollModelLoadingStatus = useCallback ( ( retryCount = 0 ) => {
161
+ // Maximum number of retries (30 seconds with 1-second interval)
162
+ const MAX_RETRIES = 30 ;
163
163
164
- if ( retryCount >= MAX_RETRIES ) {
165
- // Too many retries, stop polling
166
- setLoadStatus ( {
167
- loading : false ,
168
- success : false ,
169
- error : "Model loading timed out" ,
170
- } ) ;
171
- return ;
172
- }
164
+ if ( retryCount >= MAX_RETRIES ) {
165
+ // Too many retries, stop polling
166
+ setLoadStatus ( {
167
+ loading : false ,
168
+ success : false ,
169
+ error : "Model loading timed out" ,
170
+ } ) ;
171
+ return ;
172
+ }
173
173
174
- // Check model status
175
- ApiHelper . get < ModelLoadingResponse > ( "isModelLoading" )
176
- . then ( ( response ) => {
177
- if ( response ?. success ) {
178
- if ( response . isModelLoading === "loaded" ) {
179
- // Model loaded successfully
180
- setIsModelLoaded ( true ) ;
181
- setIsModelLoading ( false ) ;
182
- setLoadStatus ( {
183
- loading : false ,
184
- success : true ,
185
- error : null ,
186
- } ) ;
187
- } else if ( response . isModelLoading === "loading" ) {
188
- // Still loading, continue polling
189
- setIsModelLoaded ( false ) ;
190
- setIsModelLoading ( true ) ;
191
- setTimeout ( ( ) => pollModelLoadingStatus ( retryCount + 1 ) , 1000 ) ;
192
- } else if ( response . isModelLoading === "failed" ) {
193
- // Loading failed
194
- setIsModelLoaded ( false ) ;
195
- setIsModelLoading ( false ) ;
196
- setLoadStatus ( {
197
- loading : false ,
198
- success : false ,
199
- error : "Model loading failed" ,
200
- } ) ;
201
- } else {
202
- // Unknown state, try again
203
- setIsModelLoaded ( false ) ;
204
- setIsModelLoading ( false ) ;
205
- setTimeout ( ( ) => pollModelLoadingStatus ( retryCount + 1 ) , 1000 ) ;
206
- }
207
- } else {
208
- // API call failed
174
+ // Check model status
175
+ ApiHelper . get < ModelLoadingResponse > ( "isModelLoading" )
176
+ . then ( ( response ) => {
177
+ if ( response ?. success ) {
178
+ if ( response . isModelLoading === "loaded" ) {
179
+ // Model loaded successfully
180
+ setIsModelLoaded ( true ) ;
181
+ setIsModelLoading ( false ) ;
182
+ setLoadStatus ( {
183
+ loading : false ,
184
+ success : true ,
185
+ error : null ,
186
+ } ) ;
187
+ } else if ( response . isModelLoading === "loading" ) {
188
+ // Still loading, continue polling
189
+ setIsModelLoaded ( false ) ;
190
+ setIsModelLoading ( true ) ;
191
+ setTimeout ( ( ) => pollModelLoadingStatus ( retryCount + 1 ) , 1000 ) ;
192
+ } else if ( response . isModelLoading === "failed" || response . isModelLoading === "error" ) {
193
+ // Loading failed
209
194
setIsModelLoaded ( false ) ;
210
195
setIsModelLoading ( false ) ;
211
196
setLoadStatus ( {
212
197
loading : false ,
213
198
success : false ,
214
- error : "Error checking model loading status " ,
199
+ error : "Model loading failed " ,
215
200
} ) ;
201
+ } else {
202
+ // Unknown state, try again
203
+ setIsModelLoaded ( false ) ;
204
+ setIsModelLoading ( false ) ;
205
+ setTimeout ( ( ) => pollModelLoadingStatus ( retryCount + 1 ) , 1000 ) ;
216
206
}
217
- } )
218
- . catch ( ( error ) => {
219
- console . error ( "Error polling model status:" , error ) ;
207
+ } else {
208
+ // API call failed
220
209
setIsModelLoaded ( false ) ;
221
210
setIsModelLoading ( false ) ;
222
211
setLoadStatus ( {
223
212
loading : false ,
224
213
success : false ,
225
- error : error instanceof Error ? error . message : "Error checking model status" ,
214
+ error : "Error checking model loading status" ,
226
215
} ) ;
216
+ }
217
+ } )
218
+ . catch ( ( error ) => {
219
+ console . error ( "Error polling model status:" , error ) ;
220
+ setIsModelLoaded ( false ) ;
221
+ setIsModelLoading ( false ) ;
222
+ setLoadStatus ( {
223
+ loading : false ,
224
+ success : false ,
225
+ error : error instanceof Error ? error . message : "Error checking model status" ,
227
226
} ) ;
228
- } ,
229
- [ isAuthenticated ]
230
- ) ;
227
+ } ) ;
228
+ } , [ ] ) ;
231
229
232
230
// Function to load a model
233
231
const loadModel = useCallback (
234
232
async ( modelName : string ) => {
235
- // Don't load if not authenticated
236
- if ( ! isAuthenticated ) {
237
- return false ;
238
- }
239
-
240
233
try {
241
234
// Reset states
242
235
setLoadStatus ( {
@@ -253,7 +246,7 @@ export const useModelsProvider = () => {
253
246
) ;
254
247
255
248
if ( modelResponse ?. success ) {
256
- localStorage . setItem ( "selectedModelName" , modelName ) ;
249
+ sessionStorage . setItem ( "selectedModelName" , modelName ) ;
257
250
258
251
// Start polling with initial retry count of 0
259
252
pollModelLoadingStatus ( 0 ) ;
@@ -278,19 +271,14 @@ export const useModelsProvider = () => {
278
271
return false ;
279
272
}
280
273
} ,
281
- [ pollModelLoadingStatus , isAuthenticated ]
274
+ [ pollModelLoadingStatus ]
282
275
) ;
283
276
284
277
// Function to reload models list
285
278
const reloadModels = useCallback ( async ( ) => {
286
- // Don't reload if not authenticated
287
- if ( ! isAuthenticated ) {
288
- return ;
289
- }
290
-
291
- await fetchModels ( ) ;
292
- await checkModelLoadStatus ( ) ;
293
- } , [ fetchModels , checkModelLoadStatus , isAuthenticated ] ) ;
279
+ const isModelLoaded = await checkModelLoadStatus ( ) ;
280
+ await fetchModels ( isModelLoaded ) ;
281
+ } , [ fetchModels , checkModelLoadStatus ] ) ;
294
282
295
283
// Initialize models and check status on mount
296
284
useEffect ( ( ) => {
@@ -311,11 +299,12 @@ export const useModelsProvider = () => {
311
299
}
312
300
313
301
const initialize = async ( ) => {
314
- const options = await fetchModels ( ) ;
315
- await checkModelLoadStatus ( ) ;
302
+ console . debug ( "Initializing models..." ) ;
303
+ const isModelLoaded = await checkModelLoadStatus ( ) ;
304
+ const options = await fetchModels ( isModelLoaded ) ;
316
305
317
306
// Restore previously selected model
318
- const selectedModelName = localStorage . getItem ( "selectedModelName" ) ;
307
+ const selectedModelName = sessionStorage . getItem ( "selectedModelName" ) ;
319
308
if ( selectedModelName && options . length > 0 ) {
320
309
const previousModel = options . find ( ( model ) => model . value === selectedModelName ) ;
321
310
if ( previousModel ) {
@@ -381,6 +370,7 @@ export const useModelsProvider = () => {
381
370
loadStatus,
382
371
modelFlashbarItems,
383
372
clearModelFlashbar,
373
+ checkModelLoadStatus,
384
374
} ;
385
375
386
376
return contextValue ;
0 commit comments