diff --git a/x-pack/platform/packages/shared/kbn-ai-assistant/src/chat/chat_body.tsx b/x-pack/platform/packages/shared/kbn-ai-assistant/src/chat/chat_body.tsx index 1b65c58e940d0..143cd3367a804 100644 --- a/x-pack/platform/packages/shared/kbn-ai-assistant/src/chat/chat_body.tsx +++ b/x-pack/platform/packages/shared/kbn-ai-assistant/src/chat/chat_body.tsx @@ -28,6 +28,7 @@ import { VisualizeESQLUserIntention, type ChatActionClickPayload, type Feedback, + aiAssistantSimulatedFunctionCalling, } from '@kbn/observability-ai-assistant-plugin/public'; import type { AuthenticatedUser } from '@kbn/security-plugin/common'; import { findLastIndex } from 'lodash'; @@ -35,7 +36,6 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; import type { UseKnowledgeBaseResult } from '../hooks/use_knowledge_base'; import { ASSISTANT_SETUP_TITLE, EMPTY_CONVERSATION_TITLE, UPGRADE_LICENSE_TITLE } from '../i18n'; import { useAIAssistantChatService } from '../hooks/use_ai_assistant_chat_service'; -import { useSimulatedFunctionCalling } from '../hooks/use_simulated_function_calling'; import { useGenAIConnectors } from '../hooks/use_genai_connectors'; import { useConversation } from '../hooks/use_conversation'; import { FlyoutPositionMode } from './chat_flyout'; @@ -47,6 +47,7 @@ import { WelcomeMessage } from './welcome_message'; import { useLicense } from '../hooks/use_license'; import { PromptEditor } from '../prompt_editor/prompt_editor'; import { deserializeMessage } from '../utils/deserialize_message'; +import { useKibana } from '../hooks/use_kibana'; const fullHeightClassName = css` height: 100%; @@ -138,7 +139,14 @@ export function ChatBody({ const chatService = useAIAssistantChatService(); - const { simulatedFunctionCallingEnabled } = useSimulatedFunctionCalling(); + const { + services: { uiSettings }, + } = useKibana(); + + const simulateFunctionCalling = uiSettings!.get( + aiAssistantSimulatedFunctionCalling, + false + ); const { conversation, messages, next, state, stop, saveTitle } = useConversation({ initialConversationId, @@ -409,7 +417,7 @@ export function ChatBody({ - {simulatedFunctionCallingEnabled ? ( + {simulateFunctionCalling ? ( diff --git a/x-pack/platform/packages/shared/kbn-ai-assistant/src/hooks/use_simulated_function_calling.ts b/x-pack/platform/packages/shared/kbn-ai-assistant/src/hooks/use_simulated_function_calling.ts deleted file mode 100644 index 4515f2126dbfd..0000000000000 --- a/x-pack/platform/packages/shared/kbn-ai-assistant/src/hooks/use_simulated_function_calling.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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 { aiAssistantSimulatedFunctionCalling } from '@kbn/observability-ai-assistant-plugin/public'; -import { useKibana } from './use_kibana'; - -export function useSimulatedFunctionCalling() { - const { - services: { uiSettings }, - } = useKibana(); - - const simulatedFunctionCallingEnabled = uiSettings!.get( - aiAssistantSimulatedFunctionCalling, - false - ); - - return { simulatedFunctionCallingEnabled }; -} diff --git a/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/chat_function_client/index.test.ts b/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/chat_function_client/index.test.ts index 0d911b497cbbb..afc6cec599c56 100644 --- a/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/chat_function_client/index.test.ts +++ b/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/chat_function_client/index.test.ts @@ -50,7 +50,7 @@ describe('chatFunctionClient', () => { messages: [], signal: new AbortController().signal, connectorId: 'foo', - useSimulatedFunctionCalling: false, + simulateFunctionCalling: false, }); }).rejects.toThrowError(`Function arguments are invalid`); @@ -112,7 +112,7 @@ describe('chatFunctionClient', () => { messages: [], signal: new AbortController().signal, connectorId: 'foo', - useSimulatedFunctionCalling: false, + simulateFunctionCalling: false, }); expect(result).toEqual({ diff --git a/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/chat_function_client/index.ts b/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/chat_function_client/index.ts index ad4b7f0a4fc92..161278b61fa85 100644 --- a/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/chat_function_client/index.ts +++ b/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/chat_function_client/index.ts @@ -167,7 +167,7 @@ export class ChatFunctionClient { messages, signal, connectorId, - useSimulatedFunctionCalling, + simulateFunctionCalling, }: { chat: FunctionCallChatFunction; name: string; @@ -175,7 +175,7 @@ export class ChatFunctionClient { messages: Message[]; signal: AbortSignal; connectorId: string; - useSimulatedFunctionCalling: boolean; + simulateFunctionCalling: boolean; }): Promise { const fn = this.functionRegistry.get(name); @@ -194,7 +194,7 @@ export class ChatFunctionClient { screenContexts: this.screenContexts, chat, connectorId, - useSimulatedFunctionCalling, + simulateFunctionCalling, }, signal ); diff --git a/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/client/index.test.ts b/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/client/index.test.ts index e7b1169e9c03d..83cc9d9e60762 100644 --- a/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/client/index.test.ts +++ b/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/client/index.test.ts @@ -313,7 +313,7 @@ describe('Observability AI Assistant client', () => { expect.objectContaining({ connectorId: 'foo', stream: false, - functionCalling: 'native', + functionCalling: 'auto', toolChoice: expect.objectContaining({ function: 'title_conversation', }), @@ -349,7 +349,7 @@ describe('Observability AI Assistant client', () => { messages: expect.arrayContaining([ { role: 'user', content: 'How many alerts do I have?' }, ]), - functionCalling: 'native', + functionCalling: 'auto', toolChoice: undefined, tools: undefined, }, @@ -872,7 +872,7 @@ describe('Observability AI Assistant client', () => { }, }, ], - useSimulatedFunctionCalling: false, + simulateFunctionCalling: false, }); }); @@ -919,7 +919,7 @@ describe('Observability AI Assistant client', () => { messages: expect.arrayContaining([ { role: 'user', content: 'How many alerts do I have?' }, ]), - functionCalling: 'native', + functionCalling: 'auto', toolChoice: 'auto', tools: expect.any(Object), }, @@ -1080,7 +1080,7 @@ describe('Observability AI Assistant client', () => { messages: expect.arrayContaining([ { role: 'user', content: 'How many alerts do I have?' }, ]), - functionCalling: 'native', + functionCalling: 'auto', toolChoice: 'auto', tools: expect.any(Object), }, diff --git a/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/client/index.ts b/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/client/index.ts index bff57b6e75bb4..3885057fd28c5 100644 --- a/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/client/index.ts +++ b/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/client/index.ts @@ -307,7 +307,7 @@ export class ObservabilityAIAssistantClient { disableFunctions, tracer: completeTracer, connectorId, - useSimulatedFunctionCalling: simulateFunctionCalling === true, + simulateFunctionCalling, }) ); }), @@ -505,6 +505,7 @@ export class ObservabilityAIAssistantClient { } : ToolChoiceType.auto; } + const options = { connectorId, messages: convertMessagesForInference( @@ -512,8 +513,9 @@ export class ObservabilityAIAssistantClient { ), toolChoice, tools, - functionCalling: (simulateFunctionCalling ? 'simulated' : 'native') as FunctionCallingMode, + functionCalling: (simulateFunctionCalling ? 'simulated' : 'auto') as FunctionCallingMode, }; + if (stream) { return defer(() => this.dependencies.inferenceClient.chatComplete({ diff --git a/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/client/operators/continue_conversation.ts b/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/client/operators/continue_conversation.ts index b34517b07722d..ba19aca714eb4 100644 --- a/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/client/operators/continue_conversation.ts +++ b/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/client/operators/continue_conversation.ts @@ -54,7 +54,7 @@ function executeFunctionAndCatchError({ logger, tracer, connectorId, - useSimulatedFunctionCalling, + simulateFunctionCalling, }: { name: string; args: string | undefined; @@ -65,7 +65,7 @@ function executeFunctionAndCatchError({ logger: Logger; tracer: LangTracer; connectorId: string; - useSimulatedFunctionCalling: boolean; + simulateFunctionCalling: boolean; }): Observable { // hide token count events from functions to prevent them from // having to deal with it as well @@ -86,7 +86,7 @@ function executeFunctionAndCatchError({ signal, messages, connectorId, - useSimulatedFunctionCalling, + simulateFunctionCalling, }) ); @@ -184,7 +184,7 @@ export function continueConversation({ disableFunctions, tracer, connectorId, - useSimulatedFunctionCalling, + simulateFunctionCalling, }: { messages: Message[]; functionClient: ChatFunctionClient; @@ -201,7 +201,7 @@ export function continueConversation({ }; tracer: LangTracer; connectorId: string; - useSimulatedFunctionCalling: boolean; + simulateFunctionCalling: boolean; }): Observable { let nextFunctionCallsLeft = functionCallsLeft; @@ -319,7 +319,7 @@ export function continueConversation({ logger, tracer, connectorId, - useSimulatedFunctionCalling, + simulateFunctionCalling, }); } @@ -348,7 +348,7 @@ export function continueConversation({ disableFunctions, tracer, connectorId, - useSimulatedFunctionCalling, + simulateFunctionCalling, }); }) ) diff --git a/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/types.ts b/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/types.ts index 9a6f61b176b1f..82f91ec5e5a3b 100644 --- a/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/types.ts +++ b/x-pack/platform/plugins/shared/observability_ai_assistant/server/service/types.ts @@ -56,7 +56,7 @@ type RespondFunction = ( screenContexts: ObservabilityAIAssistantScreenContextRequest[]; chat: FunctionCallChatFunction; connectorId: string; - useSimulatedFunctionCalling: boolean; + simulateFunctionCalling: boolean; }, signal: AbortSignal ) => Promise; diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/documentation.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/documentation.ts index 00072e0c79c48..2360784a22674 100644 --- a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/documentation.ts +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/documentation.ts @@ -62,14 +62,14 @@ export async function registerDocumentationFunction({ required: ['query'], } as const, }, - async ({ arguments: { query, product }, connectorId, useSimulatedFunctionCalling }) => { + async ({ arguments: { query, product }, connectorId, simulateFunctionCalling }) => { const response = await llmTasks!.retrieveDocumentation({ searchTerm: query, products: product ? [product] : undefined, max: 3, connectorId, request: resources.request, - functionCalling: useSimulatedFunctionCalling ? 'simulated' : 'native', + functionCalling: simulateFunctionCalling ? 'simulated' : 'auto', }); return { diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/index.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/index.ts index e07a1f140a9ac..0316e97deeade 100644 --- a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/index.ts +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/query/index.ts @@ -112,7 +112,7 @@ export function registerQueryFunction({ function takes no input.`, visibility: FunctionVisibility.AssistantOnly, }, - async ({ messages, connectorId, useSimulatedFunctionCalling }, signal) => { + async ({ messages, connectorId, simulateFunctionCalling }, signal) => { const esqlFunctions = functions .getFunctions() .filter( @@ -137,7 +137,7 @@ export function registerQueryFunction({ { description: fn.description, schema: fn.parameters } as ToolDefinition, ]) ), - functionCalling: useSimulatedFunctionCalling ? 'simulated' : 'native', + functionCalling: simulateFunctionCalling ? 'simulated' : 'auto', }); const chatMessageId = v4(); diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_management/common/ui_settings.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/common/ui_settings.ts index 3319860de6610..4c9d8270c5922 100644 --- a/x-pack/solutions/observability/plugins/observability_ai_assistant_management/common/ui_settings.ts +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_management/common/ui_settings.ts @@ -27,7 +27,7 @@ export const uiSettings: Record = { 'xpack.observabilityAiAssistantManagement.settingsPage.simulatedFunctionCallingDescription', { defaultMessage: - '[technical preview] Use simulated function calling. Simulated function calling does not need API support for functions or tools, but it may decrease performance. Simulated function calling is currently always enabled for non-OpenAI connector, regardless of this setting.', + '[technical preview] Simulated function calling does not need API support for functions or tools, but it may decrease performance. It is currently always enabled for connectors that do not have API support for Native function calling, regardless of this setting.', values: { em: (chunks) => `${chunks}`, },