From 3b7d4bd7c10750dfaac98278e06e3b3246402f85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arturo=20Lidue=C3=B1a?= Date: Tue, 8 Jul 2025 08:54:48 +0200 Subject: [PATCH 1/4] fix: product docs installation status --- .../routes/components/settings_tab/product_doc_entry.tsx | 5 ++--- .../public/routes/components/settings_tab/settings_tab.tsx | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/product_doc_entry.tsx b/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/product_doc_entry.tsx index 434a1609fef40..08bec6e000c92 100644 --- a/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/product_doc_entry.tsx +++ b/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/product_doc_entry.tsx @@ -19,16 +19,15 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useKnowledgeBase } from '@kbn/ai-assistant'; +import { UseKnowledgeBaseResult } from '@kbn/ai-assistant/src/hooks'; import { useKibana } from '../../../hooks/use_kibana'; import { useGetProductDocStatus } from '../../../hooks/use_get_product_doc_status'; import { useInstallProductDoc } from '../../../hooks/use_install_product_doc'; import { useUninstallProductDoc } from '../../../hooks/use_uninstall_product_doc'; -export function ProductDocEntry() { +export function ProductDocEntry({ knowledgeBase }: { knowledgeBase: UseKnowledgeBaseResult }) { const { overlays } = useKibana().services; - const knowledgeBase = useKnowledgeBase(); const selectedInferenceId: string | undefined = knowledgeBase.status.value?.currentInferenceId; const canInstallProductDoc = selectedInferenceId !== undefined; diff --git a/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.tsx b/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.tsx index f38fa1dbbafc6..0aa34a1a8e273 100644 --- a/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.tsx +++ b/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.tsx @@ -178,7 +178,7 @@ export function SettingsTab() { - {productDocBase ? : undefined} + {productDocBase ? : undefined} {knowledgeBase.status.value?.enabled && connectors.connectors?.length ? ( From e49a6d4004d3216f9bb3c28eba4f6cca3465be8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arturo=20Lidue=C3=B1a?= Date: Thu, 10 Jul 2025 08:03:07 +0200 Subject: [PATCH 2/4] fix: enhance product document installation status handling --- .../components/settings_tab/change_kb_model.tsx | 10 +++++++++- .../components/settings_tab/product_doc_entry.tsx | 15 ++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/change_kb_model.tsx b/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/change_kb_model.tsx index 11b9d7b828719..d44eab7ccc7dc 100644 --- a/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/change_kb_model.tsx +++ b/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/change_kb_model.tsx @@ -27,6 +27,7 @@ import { import { useInferenceEndpoints, UseKnowledgeBaseResult } from '@kbn/ai-assistant/src/hooks'; import { KnowledgeBaseState, useKibana } from '@kbn/observability-ai-assistant-plugin/public'; import { useInstallProductDoc } from '../../../hooks/use_install_product_doc'; +import { useGetProductDocStatus } from '../../../hooks/use_get_product_doc_status'; export function ChangeKbModel({ knowledgeBase }: { knowledgeBase: UseKnowledgeBaseResult }) { const { overlays } = useKibana().services; @@ -40,6 +41,7 @@ export function ChangeKbModel({ knowledgeBase }: { knowledgeBase: UseKnowledgeBa const [hasLoadedCurrentModel, setHasLoadedCurrentModel] = useState(false); const [isUpdatingModel, setIsUpdatingModel] = useState(false); const { mutateAsync: installProductDoc } = useInstallProductDoc(); + const { refetch: refetchProductDocStatus } = useGetProductDocStatus(selectedInferenceId); const { inferenceEndpoints, isLoading: isLoadingEndpoints, error } = useInferenceEndpoints(); @@ -144,6 +146,9 @@ export function ChangeKbModel({ knowledgeBase }: { knowledgeBase: UseKnowledgeBa knowledgeBase.warmupModel(selectedInferenceId); } else { knowledgeBase.install(selectedInferenceId); + installProductDoc(selectedInferenceId).then(() => { + refetchProductDocStatus(); + }); } } else { overlays @@ -156,7 +161,9 @@ export function ChangeKbModel({ knowledgeBase }: { knowledgeBase: UseKnowledgeBa if (isConfirmed) { setIsUpdatingModel(true); knowledgeBase.install(selectedInferenceId); - installProductDoc(selectedInferenceId); + installProductDoc(selectedInferenceId).then(() => { + refetchProductDocStatus(); + }); } }); } @@ -169,6 +176,7 @@ export function ChangeKbModel({ knowledgeBase }: { knowledgeBase: UseKnowledgeBa overlays, confirmationMessages, installProductDoc, + refetchProductDocStatus, ]); const superSelectOptions = modelOptions.map((option: ModelOptionsData) => ({ diff --git a/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/product_doc_entry.tsx b/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/product_doc_entry.tsx index 08bec6e000c92..6f5c69ed24802 100644 --- a/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/product_doc_entry.tsx +++ b/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/product_doc_entry.tsx @@ -41,10 +41,19 @@ export function ProductDocEntry({ knowledgeBase }: { knowledgeBase: UseKnowledge useEffect(() => { if (isStatusLoading) return; - if (status) { - setInstalled(status.overall === 'installed' && status.inferenceId === selectedInferenceId); + if (status && status.inferenceId === selectedInferenceId) { + if (status.overall === 'installing') { + setInstalling(true); + setInstalled(false); + } else if (status.overall === 'installed') { + setInstalling(false); + setInstalled(true); + } else if (status.overall === 'uninstalled') { + setInstalling(false); + setInstalled(false); + } } - }, [selectedInferenceId, status, isStatusLoading]); + }, [selectedInferenceId, status, isStatusLoading, setInstalling, setInstalled]); const onClickInstall = useCallback(() => { if (!selectedInferenceId) { From 71dccba3dcea49b9debec0c6f6af2366af9ad0b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arturo=20Lidue=C3=B1a?= Date: Fri, 11 Jul 2025 15:02:39 +0200 Subject: [PATCH 3/4] remove product document automatically installation when KB is being installed for the first time --- .../public/routes/components/settings_tab/change_kb_model.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/change_kb_model.tsx b/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/change_kb_model.tsx index d44eab7ccc7dc..3aca13334620b 100644 --- a/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/change_kb_model.tsx +++ b/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/change_kb_model.tsx @@ -146,9 +146,6 @@ export function ChangeKbModel({ knowledgeBase }: { knowledgeBase: UseKnowledgeBa knowledgeBase.warmupModel(selectedInferenceId); } else { knowledgeBase.install(selectedInferenceId); - installProductDoc(selectedInferenceId).then(() => { - refetchProductDocStatus(); - }); } } else { overlays From 4051d13f6cd78ebfe4dcc489131b37ba3c52399e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arturo=20Lidue=C3=B1a?= Date: Sat, 12 Jul 2025 18:20:51 +0200 Subject: [PATCH 4/4] update product docs status hook --- ...t_doc_status.ts => use_get_product_doc.ts} | 22 +++++-- .../settings_tab/change_kb_model.tsx | 11 +--- .../settings_tab/product_doc_entry.tsx | 64 ++++--------------- 3 files changed, 32 insertions(+), 65 deletions(-) rename x-pack/platform/plugins/private/observability_ai_assistant_management/public/hooks/{use_get_product_doc_status.ts => use_get_product_doc.ts} (51%) diff --git a/x-pack/platform/plugins/private/observability_ai_assistant_management/public/hooks/use_get_product_doc_status.ts b/x-pack/platform/plugins/private/observability_ai_assistant_management/public/hooks/use_get_product_doc.ts similarity index 51% rename from x-pack/platform/plugins/private/observability_ai_assistant_management/public/hooks/use_get_product_doc_status.ts rename to x-pack/platform/plugins/private/observability_ai_assistant_management/public/hooks/use_get_product_doc.ts index a14bd22befe58..743375ffa1487 100644 --- a/x-pack/platform/plugins/private/observability_ai_assistant_management/public/hooks/use_get_product_doc_status.ts +++ b/x-pack/platform/plugins/private/observability_ai_assistant_management/public/hooks/use_get_product_doc.ts @@ -5,14 +5,21 @@ * 2.0. */ +import { useEffect } from 'react'; import { useQuery } from '@tanstack/react-query'; import { REACT_QUERY_KEYS } from '../constants'; import { useKibana } from './use_kibana'; +import { useUninstallProductDoc } from './use_uninstall_product_doc'; +import { useInstallProductDoc } from './use_install_product_doc'; -export function useGetProductDocStatus(inferenceId: string | undefined) { +export function useGetProductDoc(inferenceId: string | undefined) { const { productDocBase } = useKibana().services; - const { isLoading, isError, isSuccess, isRefetching, data, refetch } = useQuery({ + const { mutateAsync: installProductDoc, isLoading: isInstalling } = useInstallProductDoc(); + + const { mutateAsync: uninstallProductDoc, isLoading: isUninstalling } = useUninstallProductDoc(); + + const { isLoading, data, refetch } = useQuery({ queryKey: [REACT_QUERY_KEYS.GET_PRODUCT_DOC_STATUS, inferenceId], queryFn: async () => { return productDocBase!.installation.getStatus({ inferenceId }); @@ -21,12 +28,15 @@ export function useGetProductDocStatus(inferenceId: string | undefined) { refetchOnWindowFocus: false, }); + useEffect(() => { + refetch(); + }, [inferenceId, isInstalling, isUninstalling, refetch]); + return { - status: data, + status: data?.inferenceId === inferenceId ? data?.overall : undefined, refetch, isLoading, - isRefetching, - isSuccess, - isError, + installProductDoc, + uninstallProductDoc, }; } diff --git a/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/change_kb_model.tsx b/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/change_kb_model.tsx index 3aca13334620b..a993fcf3a981b 100644 --- a/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/change_kb_model.tsx +++ b/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/change_kb_model.tsx @@ -26,8 +26,7 @@ import { } from '@kbn/ai-assistant/src/utils/get_model_options_for_inference_endpoints'; import { useInferenceEndpoints, UseKnowledgeBaseResult } from '@kbn/ai-assistant/src/hooks'; import { KnowledgeBaseState, useKibana } from '@kbn/observability-ai-assistant-plugin/public'; -import { useInstallProductDoc } from '../../../hooks/use_install_product_doc'; -import { useGetProductDocStatus } from '../../../hooks/use_get_product_doc_status'; +import { useGetProductDoc } from '../../../hooks/use_get_product_doc'; export function ChangeKbModel({ knowledgeBase }: { knowledgeBase: UseKnowledgeBaseResult }) { const { overlays } = useKibana().services; @@ -40,8 +39,7 @@ export function ChangeKbModel({ knowledgeBase }: { knowledgeBase: UseKnowledgeBa const [hasLoadedCurrentModel, setHasLoadedCurrentModel] = useState(false); const [isUpdatingModel, setIsUpdatingModel] = useState(false); - const { mutateAsync: installProductDoc } = useInstallProductDoc(); - const { refetch: refetchProductDocStatus } = useGetProductDocStatus(selectedInferenceId); + const { installProductDoc } = useGetProductDoc(currentlyDeployedInferenceId); const { inferenceEndpoints, isLoading: isLoadingEndpoints, error } = useInferenceEndpoints(); @@ -158,9 +156,7 @@ export function ChangeKbModel({ knowledgeBase }: { knowledgeBase: UseKnowledgeBa if (isConfirmed) { setIsUpdatingModel(true); knowledgeBase.install(selectedInferenceId); - installProductDoc(selectedInferenceId).then(() => { - refetchProductDocStatus(); - }); + installProductDoc(selectedInferenceId); } }); } @@ -173,7 +169,6 @@ export function ChangeKbModel({ knowledgeBase }: { knowledgeBase: UseKnowledgeBa overlays, confirmationMessages, installProductDoc, - refetchProductDocStatus, ]); const superSelectOptions = modelOptions.map((option: ModelOptionsData) => ({ diff --git a/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/product_doc_entry.tsx b/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/product_doc_entry.tsx index 6f5c69ed24802..6195a248672f2 100644 --- a/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/product_doc_entry.tsx +++ b/x-pack/platform/plugins/private/observability_ai_assistant_management/public/routes/components/settings_tab/product_doc_entry.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useEffect, useState, useCallback, useMemo } from 'react'; +import React, { useCallback, useMemo } from 'react'; import { EuiButton, EuiDescribedFormGroup, @@ -21,9 +21,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { UseKnowledgeBaseResult } from '@kbn/ai-assistant/src/hooks'; import { useKibana } from '../../../hooks/use_kibana'; -import { useGetProductDocStatus } from '../../../hooks/use_get_product_doc_status'; -import { useInstallProductDoc } from '../../../hooks/use_install_product_doc'; -import { useUninstallProductDoc } from '../../../hooks/use_uninstall_product_doc'; +import { useGetProductDoc } from '../../../hooks/use_get_product_doc'; export function ProductDocEntry({ knowledgeBase }: { knowledgeBase: UseKnowledgeBaseResult }) { const { overlays } = useKibana().services; @@ -32,44 +30,18 @@ export function ProductDocEntry({ knowledgeBase }: { knowledgeBase: UseKnowledge const canInstallProductDoc = selectedInferenceId !== undefined; - const [isInstalled, setInstalled] = useState(false); - const [isInstalling, setInstalling] = useState(false); - - const { mutateAsync: installProductDoc } = useInstallProductDoc(); - const { mutateAsync: uninstallProductDoc } = useUninstallProductDoc(); - const { status, isLoading: isStatusLoading } = useGetProductDocStatus(selectedInferenceId); - - useEffect(() => { - if (isStatusLoading) return; - if (status && status.inferenceId === selectedInferenceId) { - if (status.overall === 'installing') { - setInstalling(true); - setInstalled(false); - } else if (status.overall === 'installed') { - setInstalling(false); - setInstalled(true); - } else if (status.overall === 'uninstalled') { - setInstalling(false); - setInstalled(false); - } - } - }, [selectedInferenceId, status, isStatusLoading, setInstalling, setInstalled]); + const { + status, + isLoading: isStatusLoading, + installProductDoc, + uninstallProductDoc, + } = useGetProductDoc(selectedInferenceId); const onClickInstall = useCallback(() => { if (!selectedInferenceId) { throw new Error('Inference ID is required to install product documentation'); } - setInstalling(true); - installProductDoc(selectedInferenceId).then( - () => { - setInstalling(false); - setInstalled(true); - }, - () => { - setInstalling(false); - setInstalled(false); - } - ); + installProductDoc(selectedInferenceId); }, [installProductDoc, selectedInferenceId]); const onClickUninstall = useCallback(() => { @@ -92,10 +64,7 @@ export function ProductDocEntry({ knowledgeBase }: { knowledgeBase: UseKnowledge ) .then((confirmed) => { if (confirmed && selectedInferenceId) { - uninstallProductDoc(selectedInferenceId).then(() => { - setInstalling(false); - setInstalled(false); - }); + uninstallProductDoc(selectedInferenceId); } }); }, [overlays, uninstallProductDoc, selectedInferenceId]); @@ -104,7 +73,7 @@ export function ProductDocEntry({ knowledgeBase }: { knowledgeBase: UseKnowledge if (isStatusLoading) { return ; } - if (isInstalling) { + if (status === 'installing') { return ( @@ -117,7 +86,7 @@ export function ProductDocEntry({ knowledgeBase }: { knowledgeBase: UseKnowledge ); } - if (isInstalled) { + if (status === 'installed') { return ( @@ -178,14 +147,7 @@ export function ProductDocEntry({ knowledgeBase }: { knowledgeBase: UseKnowledge ); - }, [ - canInstallProductDoc, - isInstalled, - isInstalling, - isStatusLoading, - onClickInstall, - onClickUninstall, - ]); + }, [canInstallProductDoc, isStatusLoading, onClickInstall, onClickUninstall, status]); return (