Skip to content

Commit 8509973

Browse files
committed
Merge remote-tracking branch 'refs/remotes/origin/enhancement/vector-store-oci-refresh' into enhancement/vector-store-oci-refresh
2 parents 7b8aa4a + 23cda57 commit 8509973

File tree

1 file changed

+120
-93
lines changed

1 file changed

+120
-93
lines changed

src/client/content/tools/tabs/split_embed.py

Lines changed: 120 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
368480
def _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

Comments
 (0)