diff --git a/public/pages/workflow_detail/components/header.tsx b/public/pages/workflow_detail/components/header.tsx index 387298af..ecf47200 100644 --- a/public/pages/workflow_detail/components/header.tsx +++ b/public/pages/workflow_detail/components/header.tsx @@ -297,7 +297,7 @@ export function WorkflowDetailHeader(props: WorkflowDetailHeaderProps) { } as TopNavMenuIconData, { iconType: 'exit', - tooltip: 'Return to projects', + tooltip: 'Return to workflows', ariaLabel: 'Exit', href: constructHrefWithDataSourceId( APP_PATH.WORKFLOWS, @@ -312,6 +312,13 @@ export function WorkflowDetailHeader(props: WorkflowDetailHeaderProps) { run: () => setIntroFlyoutOpened(true), controlType: 'icon', } as TopNavMenuIconData, + { + iconType: 'gear', + tooltip: 'Edit workflow settings', + ariaLabel: 'Edit workflow settings', + run: () => setIsEditWorkflowModalOpen(true), + controlType: 'icon', + } as TopNavMenuIconData, ]} screenTitle={workflowName} showDataSourceMenu={dataSourceEnabled} diff --git a/public/pages/workflows/new_workflow/quick_configure_modal.tsx b/public/pages/workflows/new_workflow/quick_configure_modal.tsx index 9515f415..06d5228a 100644 --- a/public/pages/workflows/new_workflow/quick_configure_modal.tsx +++ b/public/pages/workflows/new_workflow/quick_configure_modal.tsx @@ -223,13 +223,11 @@ export function QuickConfigureModal(props: QuickConfigureModalProps) { const connector = connectors[selectedModel.connectorId]; if (connector !== undefined) { const dimensions = getEmbeddingModelDimensions(connector); - if (dimensions === undefined) { - setUnknownEmbeddingLength(true); - } + // dimensions may be undefined. set state vars accordingly setUnknownEmbeddingLength(dimensions === undefined); setQuickConfigureFields({ ...quickConfigureFields, - embeddingLength: getEmbeddingModelDimensions(connector), + embeddingLength: dimensions, }); } } diff --git a/public/pages/workflows/new_workflow/quick_configure_optional_fields.tsx b/public/pages/workflows/new_workflow/quick_configure_optional_fields.tsx index 54e641c2..8f8c28e3 100644 --- a/public/pages/workflows/new_workflow/quick_configure_optional_fields.tsx +++ b/public/pages/workflows/new_workflow/quick_configure_optional_fields.tsx @@ -28,7 +28,7 @@ import { WORKFLOW_TYPE, } from '../../../../common'; import { AppState } from '../../../store'; -import { parseModelInputs } from '../../../utils'; +import { getEmbeddingModelDimensions, parseModelInputs } from '../../../utils'; interface QuickConfigureOptionalFieldsProps { workflowType?: WORKFLOW_TYPE; @@ -127,6 +127,24 @@ export function QuickConfigureOptionalFields( props.setFields({ ...props.fields, ...optionalFieldValues }); }, [optionalFieldValues]); + // Keep track of if an embedding model is selected with an unknown embedding length. + // Only expose the form field if it is unknown, else hide from the user. + const [unknownEmbeddingLength, setUnknownEmbeddingLength] = useState( + false + ); + useEffect(() => { + const selectedModel = deployedModels.find( + (model) => model.id === props.fields?.embeddingModelId + ); + if (selectedModel?.connectorId !== undefined) { + const connector = connectors[selectedModel.connectorId]; + if (connector !== undefined) { + const dimensions = getEmbeddingModelDimensions(connector); + setUnknownEmbeddingLength(dimensions === undefined); + } + } + }, [props.fields?.embeddingModelId, deployedModels, connectors]); + return ( - - - { - setOptionalFieldValues({ - ...optionalFieldValues, - embeddingLength: Number(e.target.value), - }); - }} - /> - + {unknownEmbeddingLength && ( + <> + + + { + setOptionalFieldValues({ + ...optionalFieldValues, + embeddingLength: Number(e.target.value), + }); + }} + /> + + + )} )} {(props.workflowType === WORKFLOW_TYPE.RAG || diff --git a/public/pages/workflows/new_workflow/utils.ts b/public/pages/workflows/new_workflow/utils.ts index 067170d6..aeed4124 100644 --- a/public/pages/workflows/new_workflow/utils.ts +++ b/public/pages/workflows/new_workflow/utils.ts @@ -28,7 +28,7 @@ import { SEMANTIC_SEARCH_QUERY_NEURAL, MULTIMODAL_SEARCH_QUERY_NEURAL, HYBRID_SEARCH_QUERY_MATCH_NEURAL, - TERM_QUERY_TEXT, + MATCH_QUERY_TEXT, } from '../../../../common'; import { generateId } from '../../../utils'; import semver from 'semver'; @@ -164,7 +164,7 @@ export function fetchSemanticSearchMetadata(version: string): UIState { }); baseState.config.search.request.value = customStringify( - isPreV219 ? SEMANTIC_SEARCH_QUERY_NEURAL : TERM_QUERY_TEXT + isPreV219 ? SEMANTIC_SEARCH_QUERY_NEURAL : MATCH_QUERY_TEXT ); baseState.config.search.enrichRequest.processors = isPreV219 @@ -224,7 +224,7 @@ export function fetchHybridSearchMetadata(version: string): UIState { }); baseState.config.search.request.value = customStringify( - isPreV219 ? HYBRID_SEARCH_QUERY_MATCH_NEURAL : TERM_QUERY_TEXT + isPreV219 ? HYBRID_SEARCH_QUERY_MATCH_NEURAL : MATCH_QUERY_TEXT ); baseState.config.search.enrichResponse.processors = [ @@ -263,9 +263,9 @@ export function fetchVectorSearchWithRAGMetadata(version: string): UIState { baseState.config.ingest.index.settings.value = customStringify({ [`index.knn`]: true, }); - // Search config: term query => ML inference processor for generating embeddings => + // Search config: match query => ML inference processor for generating embeddings => // ML inference processor for returning LLM-generated response of results - baseState.config.search.request.value = customStringify(TERM_QUERY_TEXT); + baseState.config.search.request.value = customStringify(MATCH_QUERY_TEXT); baseState.config.search.enrichRequest.processors = [ injectQueryTemplateInProcessor( new MLSearchRequestProcessor().toObj(),