diff --git a/x-pack/platform/packages/shared/onechat/onechat-common/tools/constants.ts b/x-pack/platform/packages/shared/onechat/onechat-common/tools/constants.ts index 74e14cd181865..66586566b7e52 100644 --- a/x-pack/platform/packages/shared/onechat/onechat-common/tools/constants.ts +++ b/x-pack/platform/packages/shared/onechat/onechat-common/tools/constants.ts @@ -25,6 +25,7 @@ export const platformCoreTools = { executeEsql: platformCoreTool('execute_esql'), createVisualization: platformCoreTool('create_visualization'), getWorkflowExecutionStatus: platformCoreTool('get_workflow_execution_status'), + productDocumentation: platformCoreTool('product_documentation'), } as const; /** diff --git a/x-pack/platform/plugins/shared/agent_builder_platform/kibana.jsonc b/x-pack/platform/plugins/shared/agent_builder_platform/kibana.jsonc index cffd4b7cbe9fb..1ca73f757e22c 100644 --- a/x-pack/platform/plugins/shared/agent_builder_platform/kibana.jsonc +++ b/x-pack/platform/plugins/shared/agent_builder_platform/kibana.jsonc @@ -11,7 +11,7 @@ "configPath": ["xpack", "agentBuilderPlatform"], "requiredPlugins": ["onechat"], "requiredBundles": [], - "optionalPlugins": ["workflowsManagement"], + "optionalPlugins": ["llmTasks", "workflowsManagement"], "extraPublicDirs": [] } } diff --git a/x-pack/platform/plugins/shared/agent_builder_platform/moon.yml b/x-pack/platform/plugins/shared/agent_builder_platform/moon.yml index 731b41a04d6fd..9bc2e432df025 100644 --- a/x-pack/platform/plugins/shared/agent_builder_platform/moon.yml +++ b/x-pack/platform/plugins/shared/agent_builder_platform/moon.yml @@ -32,6 +32,8 @@ dependsOn: - '@kbn/onechat-plugin' - '@kbn/core-lifecycle-server' - '@kbn/esql-validation-autocomplete' + - '@kbn/inference-common' + - '@kbn/llm-tasks-plugin' tags: - plugin - prod diff --git a/x-pack/platform/plugins/shared/agent_builder_platform/server/tools/index.ts b/x-pack/platform/plugins/shared/agent_builder_platform/server/tools/index.ts index 547f625abc1e8..4cb7b04e82a3d 100644 --- a/x-pack/platform/plugins/shared/agent_builder_platform/server/tools/index.ts +++ b/x-pack/platform/plugins/shared/agent_builder_platform/server/tools/index.ts @@ -7,6 +7,7 @@ import type { CoreSetup } from '@kbn/core-lifecycle-server'; import type { BuiltinToolDefinition } from '@kbn/onechat-server'; +import { productDocumentationTool } from './product_documentation'; import type { AgentBuilderPlatformPluginStart, PluginSetupDependencies, @@ -40,6 +41,7 @@ export const registerTools = ({ listIndicesTool(), indexExplorerTool(), createVisualizationTool(), + productDocumentationTool(coreSetup), ]; if (setupDeps.workflowsManagement) { diff --git a/x-pack/platform/plugins/shared/agent_builder_platform/server/tools/product_documentation.ts b/x-pack/platform/plugins/shared/agent_builder_platform/server/tools/product_documentation.ts new file mode 100644 index 0000000000000..56172b33ddd3f --- /dev/null +++ b/x-pack/platform/plugins/shared/agent_builder_platform/server/tools/product_documentation.ts @@ -0,0 +1,148 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { z } from '@kbn/zod'; +import { platformCoreTools, ToolType } from '@kbn/onechat-common'; +import { defaultInferenceEndpoints } from '@kbn/inference-common'; +import type { BuiltinToolDefinition } from '@kbn/onechat-server'; +import { createErrorResult } from '@kbn/onechat-server'; +import { ToolResultType } from '@kbn/onechat-common/tools/tool_result'; +import type { CoreSetup } from '@kbn/core/server'; +import type { RetrieveDocumentationResultDoc } from '@kbn/llm-tasks-plugin/server'; +import type { AgentBuilderPlatformPluginStart, PluginStartDependencies } from '../types'; + +const productDocumentationSchema = z.object({ + query: z.string().describe('Search query to retrieve documentation about Elastic products'), + product: z + .enum(['kibana', 'elasticsearch', 'observability', 'security']) + .optional() + .describe('Product to filter by: "kibana", "elasticsearch", "observability", or "security"'), + max: z + .number() + .optional() + .default(3) + .describe('Maximum number of documents to return. Defaults to 3.'), +}); + +// TODO make this configurable, we need a platform level setting for the embedding model +const inferenceId = defaultInferenceEndpoints.ELSER; + +export const productDocumentationTool = ( + coreSetup: CoreSetup +): BuiltinToolDefinition => { + // Create a closure that will resolve llmTasks when the handler is called + const getLlmTasks = async () => { + const [, plugins] = await coreSetup.getStartServices(); + return plugins.llmTasks; + }; + + const baseTool: BuiltinToolDefinition = { + id: platformCoreTools.productDocumentation, + type: ToolType.builtin, + description: `Search and retrieve documentation about Elastic products (Kibana, Elasticsearch, Elastic Security, Elastic Observability).`, + schema: productDocumentationSchema, + handler: async ({ query, product, max = 3 }, { modelProvider, logger, request }) => { + const llmTasks = await getLlmTasks(); + if (!llmTasks) { + return { + results: [ + createErrorResult({ + message: + 'Product documentation tool is not available. LlmTasks plugin is not available.', + }), + ], + }; + } + + try { + // Get the default model to extract the connector + const model = await modelProvider.getDefaultModel(); + const connector = model.connector; + + // Retrieve documentation + const result = await llmTasks.retrieveDocumentation({ + searchTerm: query, + products: product ? [product as any] : undefined, + max, + connectorId: connector.connectorId, + request, + inferenceId, + }); + + if (!result.success || result.documents.length === 0) { + return { + results: [ + createErrorResult({ + message: 'No documentation found for the given query.', + metadata: { + query, + product: product || 'all', + }, + }), + ], + }; + } + + // Return documentation results + return { + results: result.documents.map((doc: RetrieveDocumentationResultDoc) => ({ + type: ToolResultType.resource, + data: { + reference: { + url: doc.url, + title: doc.title, + }, + partial: doc.summarized, + content: { + title: doc.title, + url: doc.url, + content: doc.content, + summarized: doc.summarized, + }, + }, + })), + }; + } catch (error) { + logger.error(`Error retrieving product documentation: ${error.message}`); + return { + results: [ + createErrorResult({ + message: `Failed to retrieve product documentation: ${error.message}`, + }), + ], + }; + } + }, + tags: [], + availability: { + cacheMode: 'space', + handler: async () => { + try { + const [, plugins] = await coreSetup.getStartServices(); + const llmTasks = plugins.llmTasks; + + if (!llmTasks) { + return { status: 'unavailable' }; + } + + const isAvailable = + (await llmTasks.retrieveDocumentationAvailable({ + inferenceId, + })) ?? false; + + return { + status: isAvailable ? 'available' : 'unavailable', + }; + } catch (error) { + return { status: 'unavailable' }; + } + }, + }, + }; + + return baseTool; +}; diff --git a/x-pack/platform/plugins/shared/agent_builder_platform/server/types.ts b/x-pack/platform/plugins/shared/agent_builder_platform/server/types.ts index 21c5b93d7d870..f5a74c90aa52e 100644 --- a/x-pack/platform/plugins/shared/agent_builder_platform/server/types.ts +++ b/x-pack/platform/plugins/shared/agent_builder_platform/server/types.ts @@ -7,6 +7,7 @@ import type { WorkflowsServerPluginSetup } from '@kbn/workflows-management-plugin/server'; import type { OnechatPluginSetup, OnechatPluginStart } from '@kbn/onechat-plugin/server'; +import type { LlmTasksPluginStart } from '@kbn/llm-tasks-plugin/server'; export interface PluginSetupDependencies { workflowsManagement?: WorkflowsServerPluginSetup; @@ -15,6 +16,7 @@ export interface PluginSetupDependencies { export interface PluginStartDependencies { onechat: OnechatPluginStart; + llmTasks?: LlmTasksPluginStart; } // eslint-disable-next-line @typescript-eslint/no-empty-interface diff --git a/x-pack/platform/plugins/shared/agent_builder_platform/tsconfig.json b/x-pack/platform/plugins/shared/agent_builder_platform/tsconfig.json index af879f0528182..ac2cdf9e5e627 100644 --- a/x-pack/platform/plugins/shared/agent_builder_platform/tsconfig.json +++ b/x-pack/platform/plugins/shared/agent_builder_platform/tsconfig.json @@ -28,5 +28,7 @@ "@kbn/onechat-plugin", "@kbn/core-lifecycle-server", "@kbn/esql-validation-autocomplete", + "@kbn/inference-common", + "@kbn/llm-tasks-plugin", ] } diff --git a/x-pack/platform/plugins/shared/onechat/tsconfig.json b/x-pack/platform/plugins/shared/onechat/tsconfig.json index 7c35ffc3b07bb..05d5596182069 100644 --- a/x-pack/platform/plugins/shared/onechat/tsconfig.json +++ b/x-pack/platform/plugins/shared/onechat/tsconfig.json @@ -93,6 +93,6 @@ "@kbn/shared-ux-utility", "@kbn/usage-collection-plugin", "@kbn/core-notifications-browser", - "@kbn/deeplinks-agent-builder" + "@kbn/deeplinks-agent-builder", ] }