@@ -365,6 +365,118 @@ def _display_file_list_expander(file_list_response: dict) -> None:
365365 st .info ("No files found in this vector store." )
366366
367367
368+ def _render_create_new_vs_input (embed_request : DatabaseVectorStorage ) -> None :
369+ """Render input for creating a new vector store"""
370+ embed_request .alias = st .text_input (
371+ "New Vector Store Alias:" ,
372+ max_chars = 20 ,
373+ help = help_text .help_dict ["embed_alias" ],
374+ key = "selected_embed_alias" ,
375+ placeholder = "Enter a name for the new vector store" ,
376+ )
377+
378+
379+ def _render_use_existing_vs_input (embed_request : DatabaseVectorStorage , existing_vs : list ) -> None :
380+ """Render dropdown for selecting an existing vector store"""
381+ # Filter by model to prevent mixing embeddings from different models
382+ vs_lookup = {
383+ vs .get ("alias" ): vs
384+ for vs in existing_vs
385+ if vs .get ("alias" ) and vs .get ("model" ) == embed_request .model
386+ }
387+ vs_options = list (vs_lookup .keys ())
388+
389+ if not vs_options :
390+ st .warning (
391+ f"No existing vector stores found for embedding model '{ embed_request .model } '. "
392+ f"Toggle 'Create New Vector Store' to create one." ,
393+ icon = "⚠️"
394+ )
395+
396+ selected_vs = st .selectbox (
397+ "Select Existing Vector Store:" ,
398+ options = vs_options if vs_options else ["" ],
399+ index = 0 if vs_options else None ,
400+ help = "Only showing vector stores created with the same embedding model to prevent mixing embeddings" ,
401+ key = "selected_vs_dropdown" ,
402+ disabled = not vs_options
403+ )
404+ embed_request .alias = selected_vs
405+
406+ # Get VS properties from selected existing VS and update embed_request
407+ if selected_vs and selected_vs in vs_lookup :
408+ selected_vs_props = vs_lookup [selected_vs ]
409+ embed_request .chunk_size = selected_vs_props .get ("chunk_size" , embed_request .chunk_size )
410+ embed_request .chunk_overlap = selected_vs_props .get ("chunk_overlap" , embed_request .chunk_overlap )
411+ embed_request .distance_metric = selected_vs_props .get ("distance_metric" , embed_request .distance_metric )
412+ embed_request .index_type = selected_vs_props .get ("index_type" , embed_request .index_type )
413+
414+ # Show disabled text input with alias
415+ st .text_input (
416+ "Vector Store Alias:" ,
417+ value = selected_vs if selected_vs else "" ,
418+ max_chars = 20 ,
419+ help = help_text .help_dict ["embed_alias" ],
420+ key = "selected_embed_alias_readonly" ,
421+ disabled = True ,
422+ )
423+
424+
425+ def _validate_vector_store_alias (embed_request : DatabaseVectorStorage , create_new_vs : bool ) -> bool :
426+ """Validate vector store alias and return True if invalid"""
427+ pattern = r"^[A-Za-z][A-Za-z0-9_]*$"
428+
429+ # Check if alias is empty when creating new vector store
430+ if create_new_vs and not embed_request .alias :
431+ st .warning ("Please enter a Vector Store Alias to continue." )
432+ return True
433+
434+ if embed_request .alias and not re .match (pattern , embed_request .alias ):
435+ st .error (
436+ "Invalid Alias! It must start with a letter and only contain alphanumeric characters and underscores."
437+ )
438+ return True
439+
440+ return False
441+
442+
443+ def _display_vector_store_info (
444+ embed_request : DatabaseVectorStorage ,
445+ create_new_vs : bool ,
446+ existing_vs : list
447+ ) -> None :
448+ """Display vector store information and file list"""
449+ embed_request .vector_store , _ = functions .get_vs_table (
450+ ** embed_request .model_dump (exclude = {"database" , "vector_store" })
451+ )
452+ vs_exists = any (d .get ("vector_store" ) == embed_request .vector_store for d in existing_vs )
453+
454+ # Show full vector store table name
455+ st .markdown (f"##### **Vector Store:** `{ embed_request .vector_store } `" )
456+
457+ # Different messages based on mode
458+ if create_new_vs :
459+ if vs_exists :
460+ st .caption ("Vector store already exists. New chunks will be added." )
461+ else :
462+ st .caption ("New vector store will be created." )
463+ else :
464+ st .caption ("Adding files to existing vector store." )
465+
466+ # Display files in existing vector store
467+ if vs_exists and embed_request .vector_store :
468+ try :
469+ file_list_response = api_call .get (
470+ endpoint = f"v1/embed/{ embed_request .vector_store } /files"
471+ )
472+ if file_list_response and "files" in file_list_response :
473+ _display_file_list_expander (file_list_response )
474+ except api_call .ApiError as e :
475+ logger .warning (
476+ "Could not retrieve file list for %s: %s" , embed_request .vector_store , e
477+ )
478+
479+
368480def _render_vector_store_section (embed_request : DatabaseVectorStorage , create_new_vs : bool ) -> tuple :
369481 """Render vector store configuration section and return validation status and rate limit
370482
@@ -381,109 +493,24 @@ def _render_vector_store_section(embed_request: DatabaseVectorStorage, create_ne
381493 "vector_stores" , []
382494 )
383495
496+ # Render vector store input based on mode
384497 embed_alias_size , _ = st .columns ([0.5 , 0.5 ])
385- embed_alias_invalid = False
386498 embed_request .vector_store = None
387499
388500 with embed_alias_size :
389501 if create_new_vs :
390- # Creating new vector store: just show text input for new VS name
391- embed_request .alias = st .text_input (
392- "New Vector Store Alias:" ,
393- max_chars = 20 ,
394- help = help_text .help_dict ["embed_alias" ],
395- key = "selected_embed_alias" ,
396- placeholder = "Enter a name for the new vector store" ,
397- )
502+ _render_create_new_vs_input (embed_request )
398503 else :
399- # Using existing mode: show only VS created with the same embedding model
400- # Filter by model to prevent mixing embeddings from different models
401- vs_lookup = {
402- vs .get ("alias" ): vs
403- for vs in existing_vs
404- if vs .get ("alias" ) and vs .get ("model" ) == embed_request .model
405- }
406- vs_options = list (vs_lookup .keys ())
407-
408- if not vs_options :
409- st .warning (
410- f"No existing vector stores found for embedding model '{ embed_request .model } '. "
411- f"Toggle 'Create New Vector Store' to create one." ,
412- icon = "⚠️"
413- )
414-
415- selected_vs = st .selectbox (
416- "Select Existing Vector Store:" ,
417- options = vs_options if vs_options else ["" ],
418- index = 0 if vs_options else None ,
419- help = "Only showing vector stores created with the same embedding model to prevent mixing embeddings" ,
420- key = "selected_vs_dropdown" ,
421- disabled = not vs_options
422- )
423- embed_request .alias = selected_vs
424-
425- # Get VS properties from selected existing VS and update embed_request
426- if selected_vs and selected_vs in vs_lookup :
427- selected_vs_props = vs_lookup [selected_vs ]
428- embed_request .chunk_size = selected_vs_props .get ("chunk_size" , embed_request .chunk_size )
429- embed_request .chunk_overlap = selected_vs_props .get ("chunk_overlap" , embed_request .chunk_overlap )
430- embed_request .distance_metric = selected_vs_props .get ("distance_metric" , embed_request .distance_metric )
431- embed_request .index_type = selected_vs_props .get ("index_type" , embed_request .index_type )
432-
433- # Show disabled text input with alias
434- st .text_input (
435- "Vector Store Alias:" ,
436- value = selected_vs if selected_vs else "" ,
437- max_chars = 20 ,
438- help = help_text .help_dict ["embed_alias" ],
439- key = "selected_embed_alias_readonly" ,
440- disabled = True ,
441- )
442-
443- pattern = r"^[A-Za-z][A-Za-z0-9_]*$"
504+ _render_use_existing_vs_input (embed_request , existing_vs )
444505
445- # Check if alias is empty when creating new vector store
446- if create_new_vs and not embed_request .alias :
447- st .warning ("Please enter a Vector Store Alias to continue." )
448- embed_alias_invalid = True
449- elif embed_request .alias and not re .match (pattern , embed_request .alias ):
450- st .error (
451- "Invalid Alias! It must start with a letter and only contain alphanumeric characters and underscores."
452- )
453- embed_alias_invalid = True
506+ # Validate alias
507+ embed_alias_invalid = _validate_vector_store_alias (embed_request , create_new_vs )
454508
509+ # Display vector store information and file list
455510 if not embed_alias_invalid and embed_request .alias :
456- embed_request .vector_store , _ = functions .get_vs_table (
457- ** embed_request .model_dump (exclude = {"database" , "vector_store" })
458- )
459- vs_exists = any (d .get ("vector_store" ) == embed_request .vector_store for d in existing_vs )
460-
461- # Show full vector store table name
462- st .markdown (f"##### **Vector Store:** `{ embed_request .vector_store } `" )
463-
464- # Different messages based on mode
465- if create_new_vs :
466- if vs_exists :
467- st .caption ("Vector store already exists. New chunks will be added." )
468- else :
469- st .caption ("New vector store will be created." )
470- else :
471- st .caption ("Adding files to existing vector store." )
472-
473- # Display files in existing vector store
474- if vs_exists and embed_request .vector_store :
475- try :
476- file_list_response = api_call .get (
477- endpoint = f"v1/embed/{ embed_request .vector_store } /files"
478- )
479- if file_list_response and "files" in file_list_response :
480- _display_file_list_expander (file_list_response )
481- except api_call .ApiError as e :
482- logger .warning (
483- "Could not retrieve file list for %s: %s" , embed_request .vector_store , e
484- )
511+ _display_vector_store_info (embed_request , create_new_vs , existing_vs )
485512
486- # Always render rate limit input to ensure session state is initialized
513+ # Render rate limit input
487514 rate_size , _ = st .columns ([0.28 , 0.72 ])
488515 rate_limit = rate_size .number_input (
489516 "Rate Limit (RPM):" ,
0 commit comments