Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
9f0585d
[Inference] Consolidate LLM connector listing via inference plugin
sphilipse Mar 19, 2026
422837c
Fix typo
sphilipse Mar 19, 2026
899dd86
Changes from node scripts/lint_ts_projects --fix
kibanamachine Mar 19, 2026
baface2
Changes from node scripts/generate codeowners
kibanamachine Mar 19, 2026
908690f
Changes from node scripts/regenerate_moon_projects.js --update
kibanamachine Mar 19, 2026
4189f48
Changes from node scripts/eslint_all_files --no-cache --fix
kibanamachine Mar 19, 2026
b0eef7f
fix linting error
sphilipse Mar 19, 2026
42c9e32
Remove unused bundle from WPAI
sphilipse Mar 19, 2026
b289a9a
Make hook respect disallowing other connectors
sphilipse Mar 19, 2026
ab38047
Remove old useLoadConnectors hook entirely
sphilipse Mar 19, 2026
615018f
Changes from node scripts/regenerate_moon_projects.js --update
kibanamachine Mar 19, 2026
f53fc20
Changes from node scripts/eslint_all_files --no-cache --fix
kibanamachine Mar 19, 2026
33ac8bb
Fix security assistant chat complete with native inference endpoints
sphilipse Mar 19, 2026
e1c6ecc
Replace actionsClient with getInferenceConnectorById across assistant…
sphilipse Mar 19, 2026
40c592f
Changes from node scripts/lint_ts_projects --fix
kibanamachine Mar 19, 2026
662d540
Changes from node scripts/regenerate_moon_projects.js --update
kibanamachine Mar 19, 2026
06d1fbe
Use getInferenceConnectorById for OSS model check in assistant routes
sphilipse Mar 19, 2026
d2c8a22
Merge branch 'main' into inference-load-connectors-hook
sphilipse Mar 19, 2026
ea12f33
Fix applyConnectorSettings returning [undefined] when default connect…
sphilipse Mar 19, 2026
65aa3c5
Fix missing inference mock in elastic_assistant route tests
sphilipse Mar 19, 2026
0cce3af
Fix actionsClient missing from evaluateDefendInsights and update mock…
sphilipse Mar 19, 2026
b002404
Use InferenceConnector and inferenceClient in evaluation pipelines
sphilipse Mar 20, 2026
7c296d0
Merge branch 'main' into inference-load-connectors-hook
sphilipse Mar 20, 2026
90f9aea
Changes from node scripts/eslint_all_files --no-cache --fix
kibanamachine Mar 20, 2026
18e52cd
Changes from node scripts/regenerate_moon_projects.js --update
kibanamachine Mar 20, 2026
20fc66b
Fix endpoint hosts view tests by migrating useLoadConnectors to @kbn/…
sphilipse Mar 20, 2026
1583b09
[automatic_import_v2] Replace local useLoadConnectors with @kbn/infer…
sphilipse Mar 20, 2026
01c0f07
[Inference] Fall back to inferenceId when resolving superseded stack …
sphilipse Mar 20, 2026
0fdf804
Changes from node scripts/regenerate_moon_projects.js --update
kibanamachine Mar 20, 2026
c334017
Remove unused inferenceEnabled from kbn-elastic-assistant connector c…
sphilipse Mar 20, 2026
32779b8
Fix type errors
sphilipse Mar 20, 2026
661e842
Changes from node scripts/eslint_all_files --no-cache --fix
kibanamachine Mar 20, 2026
6fc619f
Fix incorrect elastic managed LLM checks
sphilipse Mar 20, 2026
7c37c97
Fix incorrect elastic managed LLM checks
sphilipse Mar 20, 2026
1ae4f76
Fix types
sphilipse Mar 20, 2026
194f5a3
Changes from node scripts/lint_ts_projects --fix
kibanamachine Mar 20, 2026
7bdb3d5
Changes from node scripts/regenerate_moon_projects.js --update
kibanamachine Mar 20, 2026
70f10da
Changes from node scripts/eslint_all_files --no-cache --fix
kibanamachine Mar 20, 2026
7e6f7f5
[Streams] Use getConnectorById to resolve default connector name in s…
sphilipse Mar 20, 2026
53edbd2
[OAI Assistant] Replace listConnectors+find with getConnectorById whe…
sphilipse Mar 20, 2026
b679273
[OAI Assistant] Convert inference errors to Boom errors for proper HT…
sphilipse Mar 20, 2026
82a60ce
Update FTR test: expect setup connector message instead of error for …
sphilipse Mar 20, 2026
9ab0fd7
Fix stale endpoint cache causing 404 for EIS connectors in smoke tests
sphilipse Mar 20, 2026
0840783
Merge branch 'main' into inference-load-connectors-hook
sphilipse Mar 23, 2026
7f46475
Merge branch 'main' into inference-load-connectors-hook
sphilipse Mar 23, 2026
bc56cb4
Merge branch 'main' into inference-load-connectors-hook
sphilipse Mar 23, 2026
aa3ca7e
Normalize useLoadConnectors featureId values to lowercase_underscore …
sphilipse Mar 23, 2026
fe2c6fd
Merge branch 'main' into inference-load-connectors-hook
sphilipse Mar 23, 2026
8f04480
Merge branch 'main' into inference-load-connectors-hook
sphilipse Mar 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -1001,6 +1001,7 @@ x-pack/platform/packages/shared/kbn-failure-store-modal @elastic/kibana-manageme
x-pack/platform/packages/shared/kbn-fs @elastic/kibana-security
x-pack/platform/packages/shared/kbn-grok-heuristics @elastic/obs-onboarding-team
x-pack/platform/packages/shared/kbn-inference-cli @elastic/appex-ai-infra @elastic/search-inference-team
x-pack/platform/packages/shared/kbn-inference-connectors @elastic/search-kibana
x-pack/platform/packages/shared/kbn-inference-endpoint-ui-common @elastic/search-kibana
x-pack/platform/packages/shared/kbn-inference-prompt-utils @elastic/appex-ai-infra
x-pack/platform/packages/shared/kbn-inference-tracing @elastic/appex-ai-infra
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -716,6 +716,7 @@
"@kbn/index-patterns-test-plugin": "link:src/platform/test/plugin_functional/plugins/index_patterns",
"@kbn/indices-metadata-plugin": "link:x-pack/platform/plugins/private/indices_metadata",
"@kbn/inference-common": "link:x-pack/platform/packages/shared/ai-infra/inference-common",
"@kbn/inference-connectors": "link:x-pack/platform/packages/shared/kbn-inference-connectors",
"@kbn/inference-endpoint-plugin": "link:x-pack/platform/plugins/shared/inference_endpoint",
"@kbn/inference-endpoint-ui-common": "link:x-pack/platform/packages/shared/kbn-inference-endpoint-ui-common",
"@kbn/inference-langchain": "link:x-pack/platform/packages/shared/ai-infra/inference-langchain",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ describe('resolveConnectorId', () => {
config: {},
capabilities: {},
isInferenceEndpoint: false,
isPreconfigured: false,
...partial,
});

Expand Down
2 changes: 2 additions & 0 deletions tsconfig.base.json
Original file line number Diff line number Diff line change
Expand Up @@ -1366,6 +1366,8 @@
"@kbn/inference-cli/*": ["x-pack/platform/packages/shared/kbn-inference-cli/*"],
"@kbn/inference-common": ["x-pack/platform/packages/shared/ai-infra/inference-common"],
"@kbn/inference-common/*": ["x-pack/platform/packages/shared/ai-infra/inference-common/*"],
"@kbn/inference-connectors": ["x-pack/platform/packages/shared/kbn-inference-connectors"],
"@kbn/inference-connectors/*": ["x-pack/platform/packages/shared/kbn-inference-connectors/*"],
"@kbn/inference-endpoint-plugin": ["x-pack/platform/plugins/shared/inference_endpoint"],
"@kbn/inference-endpoint-plugin/*": ["x-pack/platform/plugins/shared/inference_endpoint/*"],
"@kbn/inference-endpoint-ui-common": ["x-pack/platform/packages/shared/kbn-inference-endpoint-ui-common"],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,8 @@ export {
contextWindowFromModelName,
type InferenceConnector,
type InferenceConnectorCapabilities,
type RawConnector,
type RawInferenceConnector,
} from './src/connectors';
export {
defaultInferenceEndpoints,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const createConnector = (parts: Partial<InferenceConnector>): InferenceConnector
config: {},
capabilities: {},
isInferenceEndpoint: false,
isPreconfigured: false,
...parts,
};
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const createConnector = (parts: Partial<InferenceConnector>): InferenceConnector
connectorId: 'connectorId',
config: {},
isInferenceEndpoint: false,
isPreconfigured: false,
capabilities: {},
...parts,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ export const connectorToInference = (connector: RawConnector): InferenceConnecto
config: connector.config ?? {},
capabilities: {},
isInferenceEndpoint: false,
isPreconfigured: connector.isPreconfigured ?? false,
};

inferenceConnector.capabilities.contextWindowSize = getContextWindowSize(inferenceConnector);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,12 @@ export interface InferenceConnector {
* rather than a Kibana stack connector. `connectorId` holds the inference endpoint ID.
*/
isInferenceEndpoint: boolean;
/**
* When true, this connector is preconfigured (i.e. managed by Elastic).
* For native inference endpoints this is determined by the presence of
* `metadata.display.name` on the underlying ES inference endpoint.
*/
isPreconfigured: boolean;
}

export interface InferenceConnectorCapabilities {
Expand All @@ -60,11 +66,13 @@ export interface RawConnector {
actionTypeId: string;
name: string;
config?: Record<string, any>;
isPreconfigured?: boolean;
}

export interface RawInferenceConnector {
id: string;
actionTypeId: InferenceConnectorType;
name: string;
config?: Record<string, any>;
isPreconfigured?: boolean;
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ export {
InferenceConnectorType,
type InferenceConnector,
type InferenceConnectorCapabilities,
type RawConnector,
type RawInferenceConnector,
} from './connectors';
export { getModelDefinition } from './known_models';
export { getContextWindowSize, contextWindowFromModelName } from './connector_capabilities';
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ const createConnector = (parts: Partial<InferenceConnector> = {}): InferenceConn
config: {},
capabilities: {},
isInferenceEndpoint: false,
isPreconfigured: false,
...parts,
};
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@ export function ChatActionsMenu({
if (!connectors.connectors) return [[], []];

return connectors.connectors.reduce<ConnectorLists>(
([pre, custom], { id, name, isPreconfigured }) => {
const item = { value: id, label: name };
([pre, custom], { connectorId, name, isPreconfigured }) => {
const item = { value: connectorId, label: name };
return isPreconfigured ? [[...pre, item], custom] : [pre, [...custom, item]];
},
[[], []]
Expand Down Expand Up @@ -128,7 +128,11 @@ export function ChatActionsMenu({
defaultMessage: 'Connector',
})}{' '}
<strong>
{connectors.connectors?.find(({ id }) => id === connectors.selectedConnector)?.name}
{
connectors.connectors?.find(
({ connectorId }) => connectorId === connectors.selectedConnector
)?.name
}
</strong>
</div>
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ import {
type ChatActionClickPayload,
type Feedback,
aiAssistantSimulatedFunctionCalling,
getElasticManagedLlmConnector,
InferenceModelState,
} from '@kbn/observability-ai-assistant-plugin/public';
import type { AuthenticatedUser } from '@kbn/security-plugin/common';
Expand Down Expand Up @@ -413,13 +412,13 @@ export function ChatBody({
conversation.refresh();
};

const elasticManagedLlm = getElasticManagedLlmConnector(connectors.connectors);
const { conversationCalloutDismissed } = useElasticLlmCalloutsStatus(false);

const showElasticLlmCalloutInChat =
!!elasticManagedLlm &&
connectors.selectedConnector === elasticManagedLlm.id &&
!conversationCalloutDismissed;
(connectors.connectors || []).some(
(connector) =>
connector.connectorId === connectors.selectedConnector && connector.isPreconfigured
) && !conversationCalloutDismissed;

const showKnowledgeBaseReIndexingCallout =
knowledgeBase.status.value?.enabled === true &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,15 @@ export const ElasticLlmConversationCallout = () => {
onDismiss={onDismiss}
iconType="info"
title={i18n.translate('xpack.aiAssistant.elasticLlmCallout.title', {
defaultMessage: `You're using the Elastic Managed LLM connector`,
defaultMessage: `You're using an Elastic Managed LLM connector`,
})}
size="s"
className={elasticLlmCalloutClassName}
>
<p>
<FormattedMessage
id="xpack.aiAssistant.tour.elasticLlmDescription"
defaultMessage="Elastic AI Assistant and other AI features are powered by an LLM. The Elastic Managed LLM connector is used by default (<costLink>additional costs incur</costLink>) when no custom connectors are available. You can configure a <connectorLink>custom connector</connectorLink> if you prefer."
defaultMessage="Elastic AI Assistant and other AI features are powered by an LLM. An Elastic Managed LLM connector is used by default (<costLink>additional costs incur</costLink>) when no custom connectors are available. You can configure a <connectorLink>custom connector</connectorLink> if you prefer."
values={{
costLink: (...chunks: React.ReactNode[]) => (
<EuiLink
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,22 @@
import React from 'react';
import { act, render, screen } from '@testing-library/react';
import { InferenceModelState } from '@kbn/observability-ai-assistant-plugin/public';
import { InferenceConnectorType } from '@kbn/inference-common';
import { WelcomeMessage } from './welcome_message';
import type { UseKnowledgeBaseResult } from '../hooks/use_knowledge_base';
import type { UseGenAIConnectorsResult } from '../hooks/use_genai_connectors';
import { createMockConnectorFindResult } from '@kbn/actions-plugin/server/application/connector/mocks';

const mockConnectors: UseGenAIConnectorsResult = {
connectors: [
createMockConnectorFindResult({
id: 'test-connector',
{
connectorId: 'test-connector',
name: 'Test Connector',
actionTypeId: '.gen-ai',
referencedByCount: 0,
}),
type: InferenceConnectorType.OpenAI,
config: {},
capabilities: {},
isInferenceEndpoint: false,
isPreconfigured: false,
},
],
loading: false,
selectedConnector: 'test-connector',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,16 @@

import { renderHook, act, waitFor } from '@testing-library/react';
import { useChatComplete } from './use_chat_complete';
import { useAssistantContext, useLoadConnectors } from '../../../..';
import { useLoadConnectors } from '@kbn/inference-connectors';
import { useAssistantContext } from '../../../..';
import type { ChatCompleteResponse } from './post_chat_complete';
import { postChatComplete } from './post_chat_complete';

jest.mock('../../../..', () => ({
useAssistantContext: jest.fn(),
}));

jest.mock('@kbn/inference-connectors', () => ({
useLoadConnectors: jest.fn(),
}));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@
import { useCallback, useMemo, useRef, useState } from 'react';
import type { PromptIds, Replacements } from '@kbn/elastic-assistant-common';
import type { HttpFetchQuery } from '@kbn/core-http-browser';
import { useLoadConnectors } from '@kbn/inference-connectors';
import type { ChatCompleteResponse } from './post_chat_complete';
import { postChatComplete } from './post_chat_complete';
import { useAssistantContext, useLoadConnectors } from '../../../..';
import { useAssistantContext } from '../../../..';

interface SendMessageProps {
message: string;
Expand All @@ -30,7 +31,11 @@ export const useChatComplete = ({ connectorId }: { connectorId: string }): UseCh
const { alertsIndexPattern, http, traceOptions, settings } = useAssistantContext();
const [isLoading, setIsLoading] = useState(false);
const abortController = useRef(new AbortController());
const { data: connectors } = useLoadConnectors({ http, inferenceEnabled: true, settings });
const { data: connectors } = useLoadConnectors({
http,
featureId: 'elastic_assistant',
settings,
});
const actionTypeId = useMemo(
() => connectors?.find(({ id }) => id === connectorId)?.actionTypeId ?? '.gen-ai',
[connectors, connectorId]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { act, fireEvent, render, screen, within } from '@testing-library/react';
import { AssistantHeader } from '.';
import { TestProviders } from '../../mock/test_providers/test_providers';
import { alertConvo, welcomeConvo } from '../../mock/conversation';
import { useLoadConnectors } from '../../connectorland/use_load_connectors';
import { useLoadConnectors } from '@kbn/inference-connectors';
import { mockConnectors } from '../../mock/connectors';
import { CLOSE } from './translations';
import { ConversationSharedState } from '@kbn/elastic-assistant-common';
Expand Down Expand Up @@ -55,7 +55,7 @@ const testProps = {
setCurrentConversation: jest.fn(),
};

jest.mock('../../connectorland/use_load_connectors', () => ({
jest.mock('@kbn/inference-connectors', () => ({
useLoadConnectors: jest.fn(() => {
return {
data: [],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
getCurrentConversationOwner,
ConversationSharedState,
} from '@kbn/elastic-assistant-common';
import { useLoadConnectors } from '@kbn/inference-connectors';
import { ShareSelect } from '../../share_conversation/share_select';
import { useAssistantContext, type Conversation } from '../../../..';
import * as i18n from './translations';
Expand All @@ -25,7 +26,6 @@ import type { AIConnector } from '../../../connectorland/connector_selector';
import { ConnectorSelector } from '../../../connectorland/connector_selector';
import { SelectSystemPrompt } from '../../prompt_editor/system_prompt/select_system_prompt';
import { ModelSelector } from '../../../connectorland/models/model_selector/model_selector';
import { useLoadConnectors } from '../../../connectorland/use_load_connectors';
import { getGenAiConfig } from '../../../connectorland/helpers';
import type { ConversationsBulkActions } from '../../api';
import { getDefaultSystemPrompt } from '../../use_conversation/helpers';
Expand Down Expand Up @@ -60,6 +60,7 @@ export const ConversationSettingsEditor: React.FC<ConversationSettingsEditorProp
const { settings } = useAssistantContext();
const { data: connectors, isSuccess: areConnectorsFetched } = useLoadConnectors({
http,
featureId: 'elastic_assistant',
settings,
});
const [conversationUpdates, setConversationUpdates] =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { act, fireEvent, render, screen, waitFor } from '@testing-library/react'
import { Assistant } from '.';
import type { IHttpFetchError } from '@kbn/core/public';

import { useLoadConnectors } from '../connectorland/use_load_connectors';
import { useLoadConnectors } from '@kbn/inference-connectors';

import type { UseQueryResult } from '@kbn/react-query';

Expand All @@ -37,7 +37,7 @@ import {
STREAMING_LOCAL_STORAGE_KEY,
} from '../assistant_context/constants';

jest.mock('../connectorland/use_load_connectors');
jest.mock('@kbn/inference-connectors');
jest.mock('../connectorland/connector_setup');
jest.mock('react-use/lib/useLocalStorage');
jest.mock('react-use/lib/useSessionStorage');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import { css } from '@emotion/react';
import styled from '@emotion/styled';

import useEvent from 'react-use/lib/useEvent';
import { useLoadConnectors } from '@kbn/inference-connectors';
import { SharedConversationCallout } from './shared_conversation_callout';
import { AssistantBody } from './assistant_body';
import { useCurrentConversation } from './use_current_conversation';
Expand All @@ -35,7 +36,6 @@ import { ContextPills } from './context_pills';
import { getNewSelectedPromptContext } from '../data_anonymization/get_new_selected_prompt_context';
import type { PromptContext, SelectedPromptContext } from './prompt_context/types';
import { QuickPrompts } from './quick_prompts/quick_prompts';
import { useLoadConnectors } from '../connectorland/use_load_connectors';
import { ConversationSidePanel } from './conversations/conversation_sidepanel';
import { SelectedPromptContexts } from './prompt_editor/selected_prompt_contexts';
import { AssistantHeader } from './assistant_header';
Expand Down Expand Up @@ -124,6 +124,7 @@ const AssistantComponent: React.FC<Props> = ({
// Connector details
const { data: connectors, isFetchedAfterMount: isFetchedConnectors } = useLoadConnectors({
http,
featureId: 'elastic_assistant',
settings,
});
const defaultConnector = useMemo(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ const testProps = {
setPaginationObserver: jest.fn(),
};
jest.mock('../../assistant_context');
jest.mock('../../..', () => ({
jest.mock('@kbn/inference-connectors', () => ({
useLoadConnectors: jest.fn(() => {
return {
data: [],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ import {

import styled from 'styled-components';
import { css } from '@emotion/react';
import { useLoadConnectors } from '@kbn/inference-connectors';
import { useConversationsUpdater } from './use_settings_updater/use_conversations_updater';
import type { AIConnector } from '../../connectorland/connector_selector';
import type { Conversation } from '../../..';
import { useLoadConnectors } from '../../..';
import * as i18n from './translations';
import { useAssistantContext } from '../../assistant_context';
import { TEST_IDS } from '../constants';
Expand Down Expand Up @@ -86,6 +86,7 @@ export const AssistantSettings: React.FC<Props> = React.memo(

const { data: connectors } = useLoadConnectors({
http,
featureId: 'elastic_assistant',
settings,
});
const {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ jest.mock('.', () => {
};
});

jest.mock('../../connectorland/use_load_connectors', () => ({
jest.mock('@kbn/inference-connectors', () => ({
useLoadConnectors: jest.fn().mockReturnValue({ data: [] }),
}));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ import {
} from '@elastic/eui';
import { css } from '@emotion/react';
import type { DataViewsContract } from '@kbn/data-views-plugin/public';
import { useLoadConnectors } from '@kbn/inference-connectors';
import * as i18n from './translations';
import { useAssistantContext } from '../../assistant_context';
import { useLoadConnectors } from '../../connectorland/use_load_connectors';
import { getDefaultConnector } from '../helpers';
import { ConversationSettingsManagement } from '../conversations/conversation_settings_management';
import { QuickPromptSettingsManagement } from '../quick_prompts/quick_prompt_settings_management';
Expand Down Expand Up @@ -69,6 +69,7 @@ export const AssistantSettingsManagement: React.FC<Props> = React.memo(

const { data: connectors } = useLoadConnectors({
http,
featureId: 'elastic_assistant',
settings,
});
const defaultConnector = useMemo(
Expand Down
Loading
Loading