11import { DatabaseStore } from '$lib/stores/database' ;
22import { chatService , slotsService } from '$lib/services' ;
33import { config } from '$lib/stores/settings.svelte' ;
4+ import { serverStore } from '$lib/stores/server.svelte' ;
45import { normalizeModelName } from '$lib/utils/model-names' ;
56import { filterByLeafNodeId , findLeafNode , findDescendantMessages } from '$lib/utils/branching' ;
67import { browser } from '$app/environment' ;
@@ -362,8 +363,75 @@ class ChatStore {
362363
363364 let resolvedModel : string | null = null ;
364365 let modelPersisted = false ;
366+ const PROPS_REFRESH_RETRY_DELAY_MS = 1_000 ;
367+ let serverPropsRefreshRequested = false ;
368+ let lastPropsRefreshAttempt = 0 ;
369+
370+ const resetPropsRefreshGate = ( options ?: { immediate ?: boolean } ) => {
371+ serverPropsRefreshRequested = false ;
372+ if ( options ?. immediate ) {
373+ lastPropsRefreshAttempt = Date . now ( ) - PROPS_REFRESH_RETRY_DELAY_MS ;
374+ } else {
375+ lastPropsRefreshAttempt = Date . now ( ) ;
376+ }
377+ } ;
378+
379+ const ensureServerPropsRefresh = ( ) => {
380+ const now = Date . now ( ) ;
381+
382+ if ( serverPropsRefreshRequested ) {
383+ if ( resolvedModel ) {
384+ const currentModel = serverStore . modelName ;
385+ const normalizedStoreModel = currentModel ? normalizeModelName ( currentModel ) : null ;
386+
387+ if ( ! normalizedStoreModel || normalizedStoreModel !== resolvedModel ) {
388+ resetPropsRefreshGate ( { immediate : true } ) ;
389+ } else {
390+ return ;
391+ }
392+ } else {
393+ return ;
394+ }
395+ }
396+
397+ if ( now - lastPropsRefreshAttempt < PROPS_REFRESH_RETRY_DELAY_MS ) {
398+ return ;
399+ }
400+
401+ serverPropsRefreshRequested = true ;
402+ lastPropsRefreshAttempt = now ;
403+
404+ const hasExistingProps = serverStore . serverProps !== null ;
405+
406+ serverStore
407+ . fetchServerProps ( { silent : hasExistingProps } )
408+ . then ( ( ) => {
409+ if ( ! resolvedModel ) {
410+ return ;
411+ }
412+
413+ const currentModel = serverStore . modelName ;
414+
415+ if ( ! currentModel ) {
416+ resetPropsRefreshGate ( { immediate : true } ) ;
417+ return ;
418+ }
419+
420+ const normalizedStoreModel = normalizeModelName ( currentModel ) ;
421+
422+ if ( ! normalizedStoreModel || normalizedStoreModel !== resolvedModel ) {
423+ resetPropsRefreshGate ( { immediate : true } ) ;
424+ }
425+ } )
426+ . catch ( ( error ) => {
427+ console . error ( 'Failed to refresh server props during streaming:' , error ) ;
428+ resetPropsRefreshGate ( ) ;
429+ } ) ;
430+ } ;
365431
366432 const recordModel = ( modelName : string , persistImmediately = true ) : void => {
433+ ensureServerPropsRefresh ( ) ;
434+
367435 const normalizedModel = normalizeModelName ( modelName ) ;
368436
369437 if ( ! normalizedModel || normalizedModel === resolvedModel ) {
@@ -397,6 +465,8 @@ class ChatStore {
397465 ...this . getApiOptions ( ) ,
398466
399467 onChunk : ( chunk : string ) => {
468+ ensureServerPropsRefresh ( ) ;
469+
400470 streamedContent += chunk ;
401471 this . setConversationStreaming (
402472 assistantMessage . convId ,
@@ -411,6 +481,8 @@ class ChatStore {
411481 } ,
412482
413483 onReasoningChunk : ( reasoningChunk : string ) => {
484+ ensureServerPropsRefresh ( ) ;
485+
414486 streamedReasoningContent += reasoningChunk ;
415487
416488 const messageIndex = this . findMessageIndex ( assistantMessage . id ) ;
@@ -427,6 +499,8 @@ class ChatStore {
427499 reasoningContent ?: string ,
428500 timings ?: ChatMessageTimings
429501 ) => {
502+ ensureServerPropsRefresh ( ) ;
503+
430504 slotsService . stopStreaming ( ) ;
431505
432506 const updateData : {
0 commit comments