From cc68790a34f9df8b9c7ccc85dc7a849104cee0e5 Mon Sep 17 00:00:00 2001 From: Viduni Wickramarachchi Date: Wed, 21 Jan 2026 11:30:53 -0500 Subject: [PATCH] [Obs AI] Use the Observability Agent in AI Insights and flyout config (#249776) Closes https://github.com/elastic/obs-ai-team/issues/469 ## Summary This PR updates the agent used for Observability AI Insights and the active flyout config in Observability pages to use the Obs Agent. The reason for this change is because we want to benefit from all the tools and instructions in the Obs Agent which caters specifically for Observability signals. In addition to the above, this PR also removes the `platform.core.search` tool from the Obs Agent for the following reasons: - **High failure rate** - This tool fails on observability indices because they lack text or semantic_text field mappings, resulting in frequent "No text or semantic_text fields found" errors. - **Token/Cost wastage** - Failed tool calls consume tokens and increase latency without providing value, often triggering unnecessary retries - **Redundant** - The observability agent already has specialized tools (`get_correlated_logs`, `get_trace_metrics`, `get_services`, `get_index_info`, etc.) designed specifically for observability data. - Better tool selection by the LLM - Removing this tool allows the LLM to select more reliable specialized tools, improving the success rate and completion time. ### Log AI Insights https://github.com/user-attachments/assets/8c988b1c-4fb1-4317-bea7-23f4a83e5d0f ### Alert AI Insights https://github.com/user-attachments/assets/83fbcf35-6ca1-451a-9e48-1c35fe697058 ### Error AI Insights https://github.com/user-attachments/assets/e2937ab0-98ee-4212-91e0-fa69962e6754 ### Checklist - [x] The PR description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) - [x] Review the [backport guidelines](https://docs.google.com/document/d/1VyN5k91e5OVumlc0Gb9RPa3h1ewuPE705nRtioPiTvY/edit?usp=sharing) and apply applicable `backport:*` labels. (cherry picked from commit 09d2490b284b567cafccf1c03f3fdb975dd26ede) --- .../apm/public/components/app/error_group_details/index.tsx | 6 +++++- .../public/pages/alert_details/alert_details.tsx | 6 +++++- .../plugins/observability_agent_builder/common/constants.ts | 3 +++ .../plugins/observability_agent_builder/common/index.ts | 1 + .../public/components/ai_insight/ai_insight.tsx | 2 ++ .../plugins/observability_agent_builder/public/index.ts | 1 + .../server/agent/register_observability_agent.ts | 3 +-- .../server/tools/register_tools.ts | 1 - 8 files changed, 18 insertions(+), 5 deletions(-) diff --git a/x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/index.tsx b/x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/index.tsx index 7980820cb8e70..5b675be130078 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/index.tsx +++ b/x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/index.tsx @@ -11,7 +11,10 @@ import React, { useEffect } from 'react'; import { omit } from 'lodash'; import { useHistory } from 'react-router-dom'; import { usePerformanceContext } from '@kbn/ebt-tools'; -import { OBSERVABILITY_ERROR_ATTACHMENT_TYPE_ID } from '@kbn/observability-agent-builder-plugin/public'; +import { + OBSERVABILITY_AGENT_ID, + OBSERVABILITY_ERROR_ATTACHMENT_TYPE_ID, +} from '@kbn/observability-agent-builder-plugin/public'; import { isOpenTelemetryAgentName, isRumAgentName } from '../../../../common/agent_name'; import { NOT_AVAILABLE_LABEL } from '../../../../common/i18n'; import { useApmServiceContext } from '../../../context/apm_service/use_apm_service_context'; @@ -207,6 +210,7 @@ export function ErrorGroupDetails() { onechat.setConversationFlyoutActiveConfig({ newConversation: true, + agentId: OBSERVABILITY_AGENT_ID, attachments: [ { type: OBSERVABILITY_ERROR_ATTACHMENT_TYPE_ID, diff --git a/x-pack/solutions/observability/plugins/observability/public/pages/alert_details/alert_details.tsx b/x-pack/solutions/observability/plugins/observability/public/pages/alert_details/alert_details.tsx index 445f86760539a..7d9c50b0f9ac3 100644 --- a/x-pack/solutions/observability/plugins/observability/public/pages/alert_details/alert_details.tsx +++ b/x-pack/solutions/observability/plugins/observability/public/pages/alert_details/alert_details.tsx @@ -37,7 +37,10 @@ import { css } from '@emotion/react'; import { omit } from 'lodash'; import { usePageReady } from '@kbn/ebt-tools'; import moment from 'moment'; -import { OBSERVABILITY_ALERT_ATTACHMENT_TYPE_ID } from '@kbn/observability-agent-builder-plugin/public'; +import { + OBSERVABILITY_AGENT_ID, + OBSERVABILITY_ALERT_ATTACHMENT_TYPE_ID, +} from '@kbn/observability-agent-builder-plugin/public'; import { ObsCasesContext } from './components/obs_cases_context'; import { RelatedAlerts } from './components/related_alerts/related_alerts'; import type { AlertDetailsSource, TabId } from './types'; @@ -187,6 +190,7 @@ export function AlertDetails() { onechat.setConversationFlyoutActiveConfig({ newConversation: true, + agentId: OBSERVABILITY_AGENT_ID, attachments: [ { id: alertUuid, diff --git a/x-pack/solutions/observability/plugins/observability_agent_builder/common/constants.ts b/x-pack/solutions/observability/plugins/observability_agent_builder/common/constants.ts index 6d92bd96ee368..737de9d268d39 100644 --- a/x-pack/solutions/observability/plugins/observability_agent_builder/common/constants.ts +++ b/x-pack/solutions/observability/plugins/observability_agent_builder/common/constants.ts @@ -5,6 +5,9 @@ * 2.0. */ +// Agent ID +export const OBSERVABILITY_AGENT_ID = 'observability.agent'; + // Attachment type IDs export const OBSERVABILITY_AI_INSIGHT_ATTACHMENT_TYPE_ID = 'observability.ai_insight'; export const OBSERVABILITY_ERROR_ATTACHMENT_TYPE_ID = 'observability.error'; diff --git a/x-pack/solutions/observability/plugins/observability_agent_builder/common/index.ts b/x-pack/solutions/observability/plugins/observability_agent_builder/common/index.ts index b0dce528a818a..34f6df7ee33ec 100644 --- a/x-pack/solutions/observability/plugins/observability_agent_builder/common/index.ts +++ b/x-pack/solutions/observability/plugins/observability_agent_builder/common/index.ts @@ -6,6 +6,7 @@ */ export { + OBSERVABILITY_AGENT_ID, OBSERVABILITY_AI_INSIGHT_ATTACHMENT_TYPE_ID, OBSERVABILITY_ALERT_ATTACHMENT_TYPE_ID, OBSERVABILITY_ERROR_ATTACHMENT_TYPE_ID, diff --git a/x-pack/solutions/observability/plugins/observability_agent_builder/public/components/ai_insight/ai_insight.tsx b/x-pack/solutions/observability/plugins/observability_agent_builder/public/components/ai_insight/ai_insight.tsx index ee6c910d5fe54..1d4d7f70b5196 100644 --- a/x-pack/solutions/observability/plugins/observability_agent_builder/public/components/ai_insight/ai_insight.tsx +++ b/x-pack/solutions/observability/plugins/observability_agent_builder/public/components/ai_insight/ai_insight.tsx @@ -27,6 +27,7 @@ import { useLicense } from '../../hooks/use_license'; import { useGenAIConnectors } from '../../hooks/use_genai_connectors'; import { StartConversationButton } from './start_conversation_button'; import { AiInsightErrorBanner } from './ai_insight_error_banner'; +import { OBSERVABILITY_AGENT_ID } from '../../../common/constants'; export interface AiInsightResponse { summary: string; @@ -87,6 +88,7 @@ export function AiInsight({ title, fetchInsight, buildAttachments }: AiInsightPr onechat.openConversationFlyout({ newConversation: true, + agentId: OBSERVABILITY_AGENT_ID, attachments: buildAttachments(summary, context), }); }, [onechat, buildAttachments, summary, context]); diff --git a/x-pack/solutions/observability/plugins/observability_agent_builder/public/index.ts b/x-pack/solutions/observability/plugins/observability_agent_builder/public/index.ts index 28bc105d36062..183e00e389ae2 100644 --- a/x-pack/solutions/observability/plugins/observability_agent_builder/public/index.ts +++ b/x-pack/solutions/observability/plugins/observability_agent_builder/public/index.ts @@ -9,6 +9,7 @@ import type { PluginInitializerContext } from '@kbn/core/public'; import { ObservabilityAgentBuilderPlugin } from './plugin'; export { + OBSERVABILITY_AGENT_ID, OBSERVABILITY_AI_INSIGHT_ATTACHMENT_TYPE_ID, OBSERVABILITY_ALERT_ATTACHMENT_TYPE_ID, OBSERVABILITY_ERROR_ATTACHMENT_TYPE_ID, diff --git a/x-pack/solutions/observability/plugins/observability_agent_builder/server/agent/register_observability_agent.ts b/x-pack/solutions/observability/plugins/observability_agent_builder/server/agent/register_observability_agent.ts index 160b2ed69c533..c2c3f537daa8e 100644 --- a/x-pack/solutions/observability/plugins/observability_agent_builder/server/agent/register_observability_agent.ts +++ b/x-pack/solutions/observability/plugins/observability_agent_builder/server/agent/register_observability_agent.ts @@ -15,8 +15,7 @@ import type { import { OBSERVABILITY_AGENT_TOOL_IDS } from '../tools/register_tools'; import { OBSERVABILITY_GET_INDEX_INFO_TOOL_ID } from '../tools'; import { getAgentBuilderResourceAvailability } from '../utils/get_agent_builder_resource_availability'; - -export const OBSERVABILITY_AGENT_ID = 'observability.agent'; +import { OBSERVABILITY_AGENT_ID } from '../../common/constants'; export async function registerObservabilityAgent({ core, diff --git a/x-pack/solutions/observability/plugins/observability_agent_builder/server/tools/register_tools.ts b/x-pack/solutions/observability/plugins/observability_agent_builder/server/tools/register_tools.ts index f44867acf9c76..e3ba9d602c621 100644 --- a/x-pack/solutions/observability/plugins/observability_agent_builder/server/tools/register_tools.ts +++ b/x-pack/solutions/observability/plugins/observability_agent_builder/server/tools/register_tools.ts @@ -52,7 +52,6 @@ import { import { OBSERVABILITY_GET_INDEX_INFO_TOOL_ID, createGetIndexInfoTool } from './get_index_info'; const PLATFORM_TOOL_IDS = [ - platformCoreTools.search, platformCoreTools.listIndices, platformCoreTools.getIndexMapping, platformCoreTools.getDocumentById,