[8.x] [Search] Inference Endpoints - Align rendering to plugin (#203313) (#203496)

# Backport

This will backport the following commits from `main` to `8.x`:
- [[Search] Inference Endpoints - Align rendering to plugin
(#203313)](https://github.com/elastic/kibana/pull/203313)

<!--- Backport version: 8.9.8 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sqren/backport)

<!--BACKPORT [{"author":{"name":"Rodney
Norris","email":"rodney.norris@elastic.co"},"sourceCommit":{"committedDate":"2024-12-09T18:36:16Z","message":"[Search]
Inference Endpoints - Align rendering to plugin (#203313)\n\n##
Summary\r\n\r\nThis PR removes rendering of the Inference Endpoints UI
from\r\n`enterprise_search` for stack and instead utilizes
the\r\n`search_inference_endpoints` plugin to render the UI for both
serverless\r\nand stack. This can be done by utilizing the
`search_navigation` plugin\r\nfor rendering the classic navigation for
stack.\r\n\r\nTo support this change the
`xpack.searchInferenceEndpoints.ui.enabled`\r\nwas updated to default to
`true` instead of only being set for\r\nserverless search. To account
for this change I have added\r\n`xpack.searchInferenceEndpoints.enabled:
false` to the serverless\r\nconfigs for both security and observability
to ensure the\r\n`search_inference_endpoints` plugin is disabled in both
of those\r\nprojects.\r\n\r\n### Checklist\r\n\r\n- [x] Any text added
follows [EUI's
writing\r\nguidelines](https://elastic.github.io/eui/#/guidelines/writing),
uses\r\nsentence case text and includes
[i18n\r\nsupport](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md)\r\n-
[
]\r\n[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)\r\nwas
added for features that require explanation or tutorials\r\n- [ ] [Unit
or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common scenarios\r\n- [ ] This was
checked for breaking HTTP API changes, and any breaking\r\nchanges have
been approved by the breaking-change committee.
The\r\n`release_note:breaking` label should be applied in these
situations.\r\n- [ ] [Flaky
Test\r\nRunner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1)
was\r\nused on any tests changed\r\n\r\n---------\r\n\r\nCo-authored-by:
kibanamachine
<42973632+kibanamachine@users.noreply.github.com>\r\nCo-authored-by:
Elastic Machine
<elasticmachine@users.noreply.github.com>","sha":"ebb4f503a5c9c0a3d883a706566920ae27fedfad","branchLabelMapping":{"^v9.0.0$":"main","^v8.18.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:skip","v9.0.0","Team:Search","backport:prev-minor","v8.18.0"],"number":203313,"url":"https://github.com/elastic/kibana/pull/203313","mergeCommit":{"message":"[Search]
Inference Endpoints - Align rendering to plugin (#203313)\n\n##
Summary\r\n\r\nThis PR removes rendering of the Inference Endpoints UI
from\r\n`enterprise_search` for stack and instead utilizes
the\r\n`search_inference_endpoints` plugin to render the UI for both
serverless\r\nand stack. This can be done by utilizing the
`search_navigation` plugin\r\nfor rendering the classic navigation for
stack.\r\n\r\nTo support this change the
`xpack.searchInferenceEndpoints.ui.enabled`\r\nwas updated to default to
`true` instead of only being set for\r\nserverless search. To account
for this change I have added\r\n`xpack.searchInferenceEndpoints.enabled:
false` to the serverless\r\nconfigs for both security and observability
to ensure the\r\n`search_inference_endpoints` plugin is disabled in both
of those\r\nprojects.\r\n\r\n### Checklist\r\n\r\n- [x] Any text added
follows [EUI's
writing\r\nguidelines](https://elastic.github.io/eui/#/guidelines/writing),
uses\r\nsentence case text and includes
[i18n\r\nsupport](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md)\r\n-
[
]\r\n[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)\r\nwas
added for features that require explanation or tutorials\r\n- [ ] [Unit
or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common scenarios\r\n- [ ] This was
checked for breaking HTTP API changes, and any breaking\r\nchanges have
been approved by the breaking-change committee.
The\r\n`release_note:breaking` label should be applied in these
situations.\r\n- [ ] [Flaky
Test\r\nRunner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1)
was\r\nused on any tests changed\r\n\r\n---------\r\n\r\nCo-authored-by:
kibanamachine
<42973632+kibanamachine@users.noreply.github.com>\r\nCo-authored-by:
Elastic Machine
<elasticmachine@users.noreply.github.com>","sha":"ebb4f503a5c9c0a3d883a706566920ae27fedfad"}},"sourceBranch":"main","suggestedTargetBranches":["8.x"],"targetPullRequestStates":[{"branch":"main","label":"v9.0.0","labelRegex":"^v9.0.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/203313","number":203313,"mergeCommit":{"message":"[Search]
Inference Endpoints - Align rendering to plugin (#203313)\n\n##
Summary\r\n\r\nThis PR removes rendering of the Inference Endpoints UI
from\r\n`enterprise_search` for stack and instead utilizes
the\r\n`search_inference_endpoints` plugin to render the UI for both
serverless\r\nand stack. This can be done by utilizing the
`search_navigation` plugin\r\nfor rendering the classic navigation for
stack.\r\n\r\nTo support this change the
`xpack.searchInferenceEndpoints.ui.enabled`\r\nwas updated to default to
`true` instead of only being set for\r\nserverless search. To account
for this change I have added\r\n`xpack.searchInferenceEndpoints.enabled:
false` to the serverless\r\nconfigs for both security and observability
to ensure the\r\n`search_inference_endpoints` plugin is disabled in both
of those\r\nprojects.\r\n\r\n### Checklist\r\n\r\n- [x] Any text added
follows [EUI's
writing\r\nguidelines](https://elastic.github.io/eui/#/guidelines/writing),
uses\r\nsentence case text and includes
[i18n\r\nsupport](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md)\r\n-
[
]\r\n[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)\r\nwas
added for features that require explanation or tutorials\r\n- [ ] [Unit
or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common scenarios\r\n- [ ] This was
checked for breaking HTTP API changes, and any breaking\r\nchanges have
been approved by the breaking-change committee.
The\r\n`release_note:breaking` label should be applied in these
situations.\r\n- [ ] [Flaky
Test\r\nRunner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1)
was\r\nused on any tests changed\r\n\r\n---------\r\n\r\nCo-authored-by:
kibanamachine
<42973632+kibanamachine@users.noreply.github.com>\r\nCo-authored-by:
Elastic Machine
<elasticmachine@users.noreply.github.com>","sha":"ebb4f503a5c9c0a3d883a706566920ae27fedfad"}},{"branch":"8.x","label":"v8.18.0","labelRegex":"^v8.18.0$","isSourceBranch":false,"state":"NOT_CREATED"}]}]
BACKPORT-->

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
Rodney Norris 2024-12-09 16:58:01 -06:00 committed by GitHub
parent 2e343cadb2
commit 817930f89e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
45 changed files with 133 additions and 562 deletions

View file

@ -84,9 +84,6 @@ xpack.ml.compatibleModuleType: 'search'
data_visualizer.resultLinks.fileBeat.enabled: false
# Search InferenceEndpoints
xpack.searchInferenceEndpoints.ui.enabled: true
# Search Notebooks
xpack.search.notebooks.catalog.url: https://elastic-enterprise-search.s3.us-east-2.amazonaws.com/serverless/catalog.json

View file

@ -8,6 +8,7 @@ xpack.uptime.enabled: true
xpack.securitySolution.enabled: false
xpack.search.notebooks.enabled: false
xpack.searchPlayground.enabled: false
xpack.searchInferenceEndpoints.enabled: false
## Fine-tune the observability solution feature privileges. Also, refer to `serverless.yml` for the project-agnostic overrides.
xpack.features.overrides:

View file

@ -9,6 +9,7 @@ xpack.observability.enabled: false
xpack.observabilityAIAssistant.enabled: false
xpack.search.notebooks.enabled: false
xpack.searchPlayground.enabled: false
xpack.searchInferenceEndpoints.enabled: false
## Fine-tune the security solution feature privileges. Also, refer to `serverless.yml` for the project-agnostic overrides.
xpack.features.overrides:

View file

@ -9,7 +9,6 @@
export const ENTERPRISE_SEARCH_APP_ID = 'enterpriseSearch';
export const ENTERPRISE_SEARCH_CONTENT_APP_ID = 'enterpriseSearchContent';
export const ENTERPRISE_SEARCH_RELEVANCE_APP_ID = 'searchInferenceEndpoints';
export const ENTERPRISE_SEARCH_APPLICATIONS_APP_ID = 'enterpriseSearchApplications';
export const ENTERPRISE_SEARCH_ANALYTICS_APP_ID = 'enterpriseSearchAnalytics';
export const ENTERPRISE_SEARCH_APPSEARCH_APP_ID = 'appSearch';

View file

@ -13,7 +13,6 @@ import {
ENTERPRISE_SEARCH_APP_ID,
ENTERPRISE_SEARCH_CONTENT_APP_ID,
ENTERPRISE_SEARCH_APPLICATIONS_APP_ID,
ENTERPRISE_SEARCH_RELEVANCE_APP_ID,
ENTERPRISE_SEARCH_ANALYTICS_APP_ID,
ENTERPRISE_SEARCH_APPSEARCH_APP_ID,
ENTERPRISE_SEARCH_WORKPLACESEARCH_APP_ID,
@ -32,7 +31,6 @@ import {
export type EnterpriseSearchApp = typeof ENTERPRISE_SEARCH_APP_ID;
export type EnterpriseSearchContentApp = typeof ENTERPRISE_SEARCH_CONTENT_APP_ID;
export type EnterpriseSearchApplicationsApp = typeof ENTERPRISE_SEARCH_APPLICATIONS_APP_ID;
export type EnterpriseSearchRelevanceApp = typeof ENTERPRISE_SEARCH_RELEVANCE_APP_ID;
export type EnterpriseSearchAnalyticsApp = typeof ENTERPRISE_SEARCH_ANALYTICS_APP_ID;
export type EnterpriseSearchAppsearchApp = typeof ENTERPRISE_SEARCH_APPSEARCH_APP_ID;
export type EnterpriseSearchWorkplaceSearchApp = typeof ENTERPRISE_SEARCH_WORKPLACESEARCH_APP_ID;
@ -54,7 +52,7 @@ export type ApplicationsLinkId = 'searchApplications';
export type AppsearchLinkId = 'engines';
export type RelevanceLinkId = 'inferenceEndpoints';
export type SearchInferenceEndpointsLinkId = 'inferenceEndpoints';
export type SearchIndicesLinkId = typeof SEARCH_INDICES_CREATE_INDEX;
@ -62,7 +60,6 @@ export type DeepLinkId =
| EnterpriseSearchApp
| EnterpriseSearchContentApp
| EnterpriseSearchApplicationsApp
| EnterpriseSearchRelevanceApp
| EnterpriseSearchAnalyticsApp
| EnterpriseSearchAppsearchApp
| EnterpriseSearchWorkplaceSearchApp
@ -74,7 +71,7 @@ export type DeepLinkId =
| `${EnterpriseSearchContentApp}:${ContentLinkId}`
| `${EnterpriseSearchApplicationsApp}:${ApplicationsLinkId}`
| `${EnterpriseSearchAppsearchApp}:${AppsearchLinkId}`
| `${EnterpriseSearchRelevanceApp}:${RelevanceLinkId}`
| `${SearchInferenceEndpointsId}:${SearchInferenceEndpointsLinkId}`
| SearchStart
| SearchIndices
| SearchElasticsearch

View file

@ -10,7 +10,6 @@
export {
ENTERPRISE_SEARCH_APP_ID,
ENTERPRISE_SEARCH_CONTENT_APP_ID,
ENTERPRISE_SEARCH_RELEVANCE_APP_ID,
ENTERPRISE_SEARCH_APPLICATIONS_APP_ID,
ENTERPRISE_SEARCH_ANALYTICS_APP_ID,
ENTERPRISE_SEARCH_APPSEARCH_APP_ID,

View file

@ -10,7 +10,6 @@ import dedent from 'dedent';
import {
ENTERPRISE_SEARCH_APP_ID,
ENTERPRISE_SEARCH_CONTENT_APP_ID,
ENTERPRISE_SEARCH_RELEVANCE_APP_ID,
ENTERPRISE_SEARCH_APPLICATIONS_APP_ID,
ENTERPRISE_SEARCH_ANALYTICS_APP_ID,
ENTERPRISE_SEARCH_APPSEARCH_APP_ID,
@ -200,22 +199,6 @@ export const SEMANTIC_SEARCH_PLUGIN = {
URL: '/app/enterprise_search/semantic_search',
};
export const SEARCH_RELEVANCE_PLUGIN = {
ID: ENTERPRISE_SEARCH_RELEVANCE_APP_ID,
NAME: i18n.translate('xpack.enterpriseSearch.inferenceEndpoints.productName', {
defaultMessage: 'Inference Endpoints',
}),
NAV_TITLE: i18n.translate('xpack.enterpriseSearch.inferenceEndpoints.navTitle', {
defaultMessage: 'Relevance',
}),
DESCRIPTION: i18n.translate('xpack.enterpriseSearch.inferenceEndpoints.description', {
defaultMessage: 'Manage your inference endpoints for semantic search and AI use cases.',
}),
URL: '/app/elasticsearch/relevance',
LOGO: 'logoEnterpriseSearch',
SUPPORT_URL: 'https://discuss.elastic.co/c/enterprise-search/',
};
export const CREATE_CONNECTOR_PLUGIN = {
CLI_SNIPPET: dedent`./bin/connectors connector create
--index-name my-index

View file

@ -6,15 +6,12 @@
*/
import type { SharePluginSetup } from '@kbn/share-plugin/public';
import { SerializableRecord } from '@kbn/utility-types';
import {
CreateIndexLocatorDefinition,
type CreateIndexLocatorParams,
} from './create_index_locator';
import { SearchInferenceEndpointLocatorDefinition } from './inference_locator';
export function registerLocators(share: SharePluginSetup) {
share.url.locators.create<CreateIndexLocatorParams>(new CreateIndexLocatorDefinition());
share.url.locators.create<SerializableRecord>(new SearchInferenceEndpointLocatorDefinition());
}

View file

@ -1,30 +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 type { LocatorDefinition } from '@kbn/share-plugin/common';
import type { SharePluginSetup } from '@kbn/share-plugin/public';
import type { SerializableRecord } from '@kbn/utility-types';
import { SEARCH_RELEVANCE_PLUGIN } from '../constants';
export function registerLocators(share: SharePluginSetup) {
share.url.locators.create<SerializableRecord>(new SearchInferenceEndpointLocatorDefinition());
}
export class SearchInferenceEndpointLocatorDefinition
implements LocatorDefinition<SerializableRecord>
{
public readonly getLocation = async () => {
return {
app: SEARCH_RELEVANCE_PLUGIN.ID,
path: '/inference_endpoints',
state: {},
};
};
public readonly id = 'SEARCH_INFERENCE_ENDPOINTS';
}

View file

@ -34,7 +34,6 @@
"guidedOnboarding",
"console",
"searchConnectors",
"searchInferenceEndpoints",
"searchNavigation",
"searchPlayground",
"embeddable",

View file

@ -65,7 +65,6 @@ export const mockKibanaValues = {
hasWebCrawler: true,
},
renderHeaderActions: jest.fn(),
searchInferenceEndpoints: null,
security: securityMock.createStart(),
setBreadcrumbs: jest.fn(),
setChromeIsVisible: jest.fn(),

View file

@ -1,41 +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 React from 'react';
import { useValues } from 'kea';
import { i18n } from '@kbn/i18n';
import { KibanaLogic } from '../../shared/kibana';
import { EnterpriseSearchRelevancePageTemplate } from './layout/page_template';
export const InferenceEndpoints: React.FC = () => {
const { searchInferenceEndpoints } = useValues(KibanaLogic);
if (!searchInferenceEndpoints) {
return null;
}
return (
<searchInferenceEndpoints.InferenceEdnpointsProvider>
<EnterpriseSearchRelevancePageTemplate
pageChrome={[
i18n.translate('xpack.enterpriseSearch.relevance.inferenceEndpoints.breadcrumb', {
defaultMessage: 'Inference Endpoints',
}),
]}
pageViewTelemetry="InferenceEndpoints"
restrictWidth={false}
customPageSections
bottomBorder="extended"
>
<searchInferenceEndpoints.InferenceEndpoints />
</EnterpriseSearchRelevancePageTemplate>
</searchInferenceEndpoints.InferenceEdnpointsProvider>
);
};

View file

@ -1,8 +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.
*/
export { EnterpriseSearchRelevancePageTemplate } from './page_template';

View file

@ -1,79 +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.
*/
jest.mock('../../../shared/layout/nav', () => ({
useEnterpriseSearchNav: () => [],
}));
import React from 'react';
import { shallow } from 'enzyme';
import { i18n } from '@kbn/i18n';
import { SetEnterpriseSearchRelevanceChrome } from '../../../shared/kibana_chrome';
import { EnterpriseSearchPageTemplateWrapper } from '../../../shared/layout';
import { SendEnterpriseSearchTelemetry } from '../../../shared/telemetry';
import { EnterpriseSearchRelevancePageTemplate } from './page_template';
describe('EnterpriseSearchRelevancePageTemplate', () => {
it('renders', () => {
const wrapper = shallow(
<EnterpriseSearchRelevancePageTemplate>
<div className="hello">
{i18n.translate('xpack.enterpriseSearch..div.worldLabel', { defaultMessage: 'world' })}
</div>
</EnterpriseSearchRelevancePageTemplate>
);
expect(wrapper.type()).toEqual(EnterpriseSearchPageTemplateWrapper);
expect(wrapper.prop('solutionNav')).toEqual({ items: [], name: 'Elasticsearch' });
expect(wrapper.find('.hello').text()).toEqual('world');
});
describe('page chrome', () => {
it('takes a breadcrumb array & renders a product-specific page chrome', () => {
const wrapper = shallow(<EnterpriseSearchRelevancePageTemplate pageChrome={['Some page']} />);
const setPageChrome = wrapper
.find(EnterpriseSearchPageTemplateWrapper)
.prop('setPageChrome') as any;
expect(setPageChrome.type).toEqual(SetEnterpriseSearchRelevanceChrome);
expect(setPageChrome.props.trail).toEqual(['Some page']);
});
});
describe('page telemetry', () => {
it('takes a metric & renders product-specific telemetry viewed event', () => {
const wrapper = shallow(
<EnterpriseSearchRelevancePageTemplate pageViewTelemetry="some_page" />
);
expect(wrapper.find(SendEnterpriseSearchTelemetry).prop('action')).toEqual('viewed');
expect(wrapper.find(SendEnterpriseSearchTelemetry).prop('metric')).toEqual('some_page');
});
});
describe('props', () => {
it('passes down any ...pageTemplateProps that EnterpriseSearchPageTemplateWrapper accepts', () => {
const wrapper = shallow(
<EnterpriseSearchRelevancePageTemplate
pageHeader={{ pageTitle: 'hello world' }}
isLoading={false}
emptyState={<div />}
/>
);
expect(
wrapper.find(EnterpriseSearchPageTemplateWrapper).prop('pageHeader')!.pageTitle
).toEqual('hello world');
expect(wrapper.find(EnterpriseSearchPageTemplateWrapper).prop('isLoading')).toEqual(false);
expect(wrapper.find(EnterpriseSearchPageTemplateWrapper).prop('emptyState')).toEqual(<div />);
});
});
});

View file

@ -1,37 +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 React from 'react';
import { SEARCH_PRODUCT_NAME } from '../../../../../common/constants';
import { SetEnterpriseSearchRelevanceChrome } from '../../../shared/kibana_chrome';
import { EnterpriseSearchPageTemplateWrapper, PageTemplateProps } from '../../../shared/layout';
import { useEnterpriseSearchNav } from '../../../shared/layout';
import { SendEnterpriseSearchTelemetry } from '../../../shared/telemetry';
export const EnterpriseSearchRelevancePageTemplate: React.FC<PageTemplateProps> = ({
children,
pageChrome,
pageViewTelemetry,
...pageTemplateProps
}) => {
return (
<EnterpriseSearchPageTemplateWrapper
{...pageTemplateProps}
solutionNav={{
items: useEnterpriseSearchNav(),
name: SEARCH_PRODUCT_NAME,
}}
setPageChrome={pageChrome && <SetEnterpriseSearchRelevanceChrome trail={pageChrome} />}
>
{pageViewTelemetry && (
<SendEnterpriseSearchTelemetry action="viewed" metric={pageViewTelemetry} />
)}
{children}
</EnterpriseSearchPageTemplateWrapper>
);
};

View file

@ -1,8 +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.
*/
export { NotFound } from './not_found';

View file

@ -1,38 +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 React from 'react';
import { shallow } from 'enzyme';
import { NotFoundPrompt } from '../../../shared/not_found';
import { SendEnterpriseSearchTelemetry } from '../../../shared/telemetry';
import { EnterpriseSearchRelevancePageTemplate } from '../layout';
import { NotFound } from '.';
describe('NotFound', () => {
const wrapper = shallow(<NotFound />);
it('renders the shared not found prompt', () => {
expect(wrapper.find(NotFoundPrompt)).toHaveLength(1);
});
it('renders a telemetry error event', () => {
expect(wrapper.find(SendEnterpriseSearchTelemetry).prop('action')).toEqual('error');
});
it('passes optional preceding page chrome', () => {
wrapper.setProps({ pageChrome: ['Inference Endpoints', 'some-index'] });
expect(wrapper.find(EnterpriseSearchRelevancePageTemplate).prop('pageChrome')).toEqual([
'Inference Endpoints',
'some-index',
'404',
]);
});
});

View file

@ -1,23 +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 React from 'react';
import { SEARCH_RELEVANCE_PLUGIN } from '../../../../../common/constants';
import { PageTemplateProps } from '../../../shared/layout';
import { NotFoundPrompt } from '../../../shared/not_found';
import { SendEnterpriseSearchTelemetry } from '../../../shared/telemetry';
import { EnterpriseSearchRelevancePageTemplate } from '../layout';
export const NotFound: React.FC<PageTemplateProps> = ({ pageChrome = [] }) => {
return (
<EnterpriseSearchRelevancePageTemplate pageChrome={[...pageChrome, '404']} customPageSections>
<SendEnterpriseSearchTelemetry action="error" metric="not_found" />
<NotFoundPrompt productSupportUrl={SEARCH_RELEVANCE_PLUGIN.SUPPORT_URL} />
</EnterpriseSearchRelevancePageTemplate>
);
};

View file

@ -1,23 +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 '../__mocks__/shallow_useeffect.mock';
import '../__mocks__/enterprise_search_url.mock';
import React from 'react';
import { shallow } from 'enzyme';
import { EnterpriseSearchRelevance, EnterpriseSearchRelevanceConfigured } from '.';
describe('EnterpriseSearchRelevance', () => {
it('renders EnterpriseSearchRelevanceConfigured', () => {
const wrapper = shallow(<EnterpriseSearchRelevance />);
expect(wrapper.find(EnterpriseSearchRelevanceConfigured)).toHaveLength(1);
});
});

View file

@ -1,41 +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 React from 'react';
import { Redirect } from 'react-router-dom';
import { Route, Routes } from '@kbn/shared-ux-router';
import { InitialAppData } from '../../../common/types';
import { InferenceEndpoints } from './components/inference_endpoints';
import { NotFound } from './components/not_found';
import { INFERENCE_ENDPOINTS_PATH, ROOT_PATH } from './routes';
export const EnterpriseSearchRelevance: React.FC<InitialAppData> = (props) => {
return (
<Routes>
<Route>
<EnterpriseSearchRelevanceConfigured {...(props as Required<InitialAppData>)} />
</Route>
</Routes>
);
};
export const EnterpriseSearchRelevanceConfigured: React.FC<Required<InitialAppData>> = () => {
return (
<Routes>
<Redirect exact from={ROOT_PATH} to={INFERENCE_ENDPOINTS_PATH} />
<Route path={INFERENCE_ENDPOINTS_PATH}>
<InferenceEndpoints />
</Route>
<Route>
<NotFound />
</Route>
</Routes>
);
};

View file

@ -1,28 +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.
*/
module.exports = {
preset: '@kbn/test',
rootDir: '../../../../../..',
roots: [
'<rootDir>/x-pack/plugins/enterprise_search/public/applications/enterprise_search_relevance',
],
collectCoverage: true,
coverageReporters: ['text', 'html'],
collectCoverageFrom: [
'<rootDir>/x-pack/plugins/enterprise_search/public/applications/**/*.{ts,tsx}',
'!<rootDir>/x-pack/plugins/enterprise_search/public/*.ts',
'!<rootDir>/x-pack/plugins/enterprise_search/server/*.ts',
'!<rootDir>/x-pack/plugins/enterprise_search/public/applications/test_helpers/**/*.{ts,tsx}',
],
coverageDirectory:
'<rootDir>/target/kibana-coverage/jest/x-pack/plugins/enterprise_search/public/applications/enterprise_search_relevance',
modulePathIgnorePatterns: [
'<rootDir>/x-pack/plugins/enterprise_search/public/applications/app_search/cypress',
'<rootDir>/x-pack/plugins/enterprise_search/public/applications/workplace_search/cypress',
],
};

View file

@ -1,10 +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.
*/
export const ROOT_PATH = '/';
export const ERROR_STATE_PATH = '/error_state';
export const INFERENCE_ENDPOINTS_PATH = `${ROOT_PATH}inference_endpoints`;

View file

@ -129,7 +129,6 @@ export const renderApp = (
params.setHeaderActionMenu(
HeaderActions ? renderHeaderActions.bind(null, HeaderActions, store, params) : undefined
),
searchInferenceEndpoints: plugins.searchInferenceEndpoints,
security,
setBreadcrumbs: chrome.setBreadcrumbs,
setChromeIsVisible: chrome.setIsVisible,

View file

@ -29,7 +29,6 @@ import { LensPublicStart } from '@kbn/lens-plugin/public';
import { MlPluginStart } from '@kbn/ml-plugin/public';
import { ELASTICSEARCH_URL_PLACEHOLDER } from '@kbn/search-api-panels/constants';
import { ConnectorDefinition } from '@kbn/search-connectors';
import { SearchInferenceEndpointsPluginStart } from '@kbn/search-inference-endpoints/public';
import { AuthenticatedUser, SecurityPluginStart } from '@kbn/security-plugin/public';
import { SharePluginStart } from '@kbn/share-plugin/public';
@ -66,7 +65,6 @@ export interface KibanaLogicProps {
productAccess: ProductAccess;
productFeatures: ProductFeatures;
renderHeaderActions(HeaderActions?: FC): void;
searchInferenceEndpoints?: SearchInferenceEndpointsPluginStart;
security?: SecurityPluginStart;
setBreadcrumbs(crumbs: ChromeBreadcrumb[]): void;
setChromeIsVisible(isVisible: boolean): void;
@ -100,7 +98,6 @@ export interface KibanaValues {
productAccess: ProductAccess;
productFeatures: ProductFeatures;
renderHeaderActions(HeaderActions?: FC): void;
searchInferenceEndpoints: SearchInferenceEndpointsPluginStart | null;
security: SecurityPluginStart | null;
setBreadcrumbs(crumbs: ChromeBreadcrumb[]): void;
setChromeIsVisible(isVisible: boolean): void;
@ -146,7 +143,6 @@ export const KibanaLogic = kea<MakeLogicType<KibanaValues>>({
productAccess: [props.productAccess, {}],
productFeatures: [props.productFeatures, {}],
renderHeaderActions: [props.renderHeaderActions, {}],
searchInferenceEndpoints: [props.searchInferenceEndpoints || null, {}],
security: [props.security || null, {}],
setBreadcrumbs: [props.setBreadcrumbs, {}],
setChromeIsVisible: [props.setChromeIsVisible, {}],

View file

@ -14,7 +14,6 @@ import {
ANALYTICS_PLUGIN,
APP_SEARCH_PLUGIN,
ENTERPRISE_SEARCH_CONTENT_PLUGIN,
SEARCH_RELEVANCE_PLUGIN,
ENTERPRISE_SEARCH_PRODUCT_NAME,
AI_SEARCH_PLUGIN,
SEARCH_EXPERIENCES_PLUGIN,
@ -160,9 +159,6 @@ export const useEnterpriseSearchContentBreadcrumbs = (breadcrumbs: Breadcrumbs =
...breadcrumbs,
]);
export const useEnterpriseSearchRelevanceBreadcrumbs = (breadcrumbs: Breadcrumbs = []) =>
useSearchBreadcrumbs([{ text: SEARCH_RELEVANCE_PLUGIN.NAV_TITLE, path: '/' }, ...breadcrumbs]);
export const useSearchExperiencesBreadcrumbs = (breadcrumbs: Breadcrumbs = []) =>
useSearchBreadcrumbs([{ text: SEARCH_EXPERIENCES_PLUGIN.NAV_TITLE, path: '/' }, ...breadcrumbs]);

View file

@ -9,7 +9,6 @@ export {
SetSearchChrome,
SetAnalyticsChrome,
SetEnterpriseSearchContentChrome,
SetEnterpriseSearchRelevanceChrome,
SetElasticsearchChrome,
SetAiSearchChrome,
SetAppSearchChrome,

View file

@ -18,7 +18,6 @@ import {
useEnterpriseSearchApplicationsBreadcrumbs,
useAnalyticsBreadcrumbs,
useEnterpriseSearchContentBreadcrumbs,
useEnterpriseSearchRelevanceBreadcrumbs,
useAiSearchBreadcrumbs,
useElasticsearchBreadcrumbs,
useAppSearchBreadcrumbs,
@ -181,19 +180,6 @@ export const SetEnterpriseSearchContentChrome: React.FC<SetChromeProps> = ({ tra
return null;
};
export const SetEnterpriseSearchRelevanceChrome: React.FC<SetChromeProps> = ({ trail = [] }) => {
const { setBreadcrumbs } = useValues(KibanaLogic);
const crumbs = useGenerateBreadcrumbs(trail);
const breadcrumbs = useEnterpriseSearchRelevanceBreadcrumbs(crumbs);
useEffect(() => {
setBreadcrumbs(breadcrumbs);
}, [trail]);
return null;
};
export const SetSearchExperiencesChrome: React.FC<SetChromeProps> = ({ trail = [] }) => {
const { setBreadcrumbs, setDocTitle } = useValues(KibanaLogic);

View file

@ -5,7 +5,7 @@
* 2.0.
*/
import { BehaviorSubject, firstValueFrom } from 'rxjs';
import { BehaviorSubject, firstValueFrom, type Subscription } from 'rxjs';
import { ChartsPluginStart } from '@kbn/charts-plugin/public';
import { CloudSetup, CloudStart } from '@kbn/cloud-plugin/public';
@ -34,7 +34,6 @@ import { MlPluginStart } from '@kbn/ml-plugin/public';
import type { NavigationPublicPluginStart } from '@kbn/navigation-plugin/public';
import { ELASTICSEARCH_URL_PLACEHOLDER } from '@kbn/search-api-panels/constants';
import { SearchConnectorsPluginStart } from '@kbn/search-connectors-plugin/public';
import { SearchInferenceEndpointsPluginStart } from '@kbn/search-inference-endpoints/public';
import type { SearchNavigationPluginStart } from '@kbn/search-navigation/public';
import { SearchPlaygroundPluginStart } from '@kbn/search-playground/public';
import { SecurityPluginSetup, SecurityPluginStart } from '@kbn/security-plugin/public';
@ -53,7 +52,6 @@ import {
VECTOR_SEARCH_PLUGIN,
WORKPLACE_SEARCH_PLUGIN,
SEMANTIC_SEARCH_PLUGIN,
SEARCH_RELEVANCE_PLUGIN,
} from '../common/constants';
import { registerLocators } from '../common/locators';
import { ClientConfigType, InitialAppData, ProductAccess } from '../common/types';
@ -67,7 +65,6 @@ import {
CRAWLERS_PATH,
} from './applications/enterprise_search_content/routes';
import { INFERENCE_ENDPOINTS_PATH } from './applications/enterprise_search_relevance/routes';
import { docLinks } from './applications/shared/doc_links';
import type { DynamicSideNavItems } from './navigation_tree';
@ -99,7 +96,6 @@ export interface PluginsStart {
ml?: MlPluginStart;
navigation: NavigationPublicPluginStart;
searchConnectors?: SearchConnectorsPluginStart;
searchInferenceEndpoints?: SearchInferenceEndpointsPluginStart;
searchNavigation?: SearchNavigationPluginStart;
searchPlayground?: SearchPlaygroundPluginStart;
security?: SecurityPluginStart;
@ -136,20 +132,6 @@ const contentLinks: AppDeepLink[] = [
},
];
const relevanceLinks: AppDeepLink[] = [
{
id: 'inferenceEndpoints',
path: `/${INFERENCE_ENDPOINTS_PATH}`,
title: i18n.translate(
'xpack.enterpriseSearch.navigation.relevanceInferenceEndpointsLinkLabel',
{
defaultMessage: 'Inference Endpoints',
}
),
visibleIn: ['globalSearch'],
},
];
const applicationsLinks: AppDeepLink[] = [
{
id: 'searchApplications',
@ -177,6 +159,7 @@ const appSearchLinks: AppDeepLink[] = [
export class EnterpriseSearchPlugin implements Plugin {
private config: ClientConfigType;
private enterpriseLicenseAppUpdater$ = new BehaviorSubject<AppUpdater>(() => ({}));
private licenseSubscription: Subscription | undefined;
constructor(initializerContext: PluginInitializerContext) {
this.config = initializerContext.config.get<ClientConfigType>();
@ -432,33 +415,6 @@ export class EnterpriseSearchPlugin implements Plugin {
title: ANALYTICS_PLUGIN.NAME,
});
core.application.register({
appRoute: SEARCH_RELEVANCE_PLUGIN.URL,
category: DEFAULT_APP_CATEGORIES.enterpriseSearch,
deepLinks: relevanceLinks,
euiIconType: SEARCH_RELEVANCE_PLUGIN.LOGO,
id: SEARCH_RELEVANCE_PLUGIN.ID,
status: AppStatus.inaccessible,
updater$: this.enterpriseLicenseAppUpdater$,
mount: async (params: AppMountParameters) => {
const kibanaDeps = await this.getKibanaDeps(core, params, cloud);
const { chrome, http } = kibanaDeps.core;
chrome.docTitle.change(SEARCH_RELEVANCE_PLUGIN.NAME);
await this.getInitialData(http);
const pluginData = this.getPluginData();
const { renderApp } = await import('./applications');
const { EnterpriseSearchRelevance } = await import(
'./applications/enterprise_search_relevance'
);
return renderApp(EnterpriseSearchRelevance, kibanaDeps, pluginData);
},
title: SEARCH_RELEVANCE_PLUGIN.NAV_TITLE,
visibleIn: [],
});
core.application.register({
appRoute: SEARCH_EXPERIENCES_PLUGIN.URL,
category: DEFAULT_APP_CATEGORIES.enterpriseSearch,
@ -636,7 +592,7 @@ export class EnterpriseSearchPlugin implements Plugin {
});
}
plugins.licensing?.license$.subscribe((license) => {
this.licenseSubscription = plugins.licensing?.license$.subscribe((license) => {
if (hasEnterpriseLicense(license)) {
this.enterpriseLicenseAppUpdater$.next(() => ({
status: AppStatus.accessible,
@ -653,7 +609,12 @@ export class EnterpriseSearchPlugin implements Plugin {
return {};
}
public stop() {}
public stop() {
if (this.licenseSubscription) {
this.licenseSubscription.unsubscribe();
this.licenseSubscription = undefined;
}
}
private updateSideNavDefinition = (items: Partial<DynamicSideNavItems>) => {
this.sideNavDynamicItems$.next({ ...this.sideNavDynamicItems$.getValue(), ...items });

View file

@ -47,7 +47,6 @@ import {
AI_SEARCH_PLUGIN,
APPLICATIONS_PLUGIN,
SEARCH_PRODUCT_NAME,
SEARCH_RELEVANCE_PLUGIN,
} from '../common/constants';
import {
@ -177,7 +176,6 @@ export class EnterpriseSearchPlugin implements Plugin {
SEMANTIC_SEARCH_PLUGIN.ID,
APPLICATIONS_PLUGIN.ID,
AI_SEARCH_PLUGIN.ID,
SEARCH_RELEVANCE_PLUGIN.ID,
];
const isCloud = !!cloud?.cloudId;

View file

@ -70,7 +70,6 @@
"@kbn/es-errors",
"@kbn/search-connectors-plugin",
"@kbn/search-playground",
"@kbn/search-inference-endpoints",
"@kbn/utility-types",
"@kbn/index-management-shared-types",
"@kbn/deeplinks-search",

View file

@ -103,3 +103,17 @@ export const TRAINED_MODELS_STAT_GATHER_FAILED = i18n.translate(
defaultMessage: 'Failed to retrieve trained model statistics',
}
);
export const BREADCRUMB_RELEVANCE = i18n.translate(
'xpack.searchInferenceEndpoints.breadcrumbs.relevance',
{
defaultMessage: 'Relevance',
}
);
export const BREADCRUMB_INFERENCE_ENDPOINTS = i18n.translate(
'xpack.searchInferenceEndpoints.breadcrumbs.inferenceEndpoints',
{
defaultMessage: 'Inference Endpoints',
}
);

View file

@ -18,13 +18,15 @@
"requiredPlugins": [
"actions",
"features",
"licensing",
"ml",
"share",
],
"optionalPlugins": [
"cloud",
"console",
"serverless"
"serverless",
"searchNavigation",
],
"requiredBundles": [
"kibanaReact"

View file

@ -1,29 +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 React from 'react';
import { dynamic } from '@kbn/shared-ux-utility';
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
import { CoreStart } from '@kbn/core-lifecycle-browser';
import { AppPluginStartDependencies } from './types';
export const InferenceEndpoints = dynamic(async () => ({
default: (await import('./components/app')).App,
}));
export const InferenceEndpointsProvider = dynamic(async () => ({
default: (await import('./providers/inference_endpoints_provider')).InferenceEndpointsProvider,
}));
export const getInferenceEndpointsProvider =
(core: CoreStart, services: AppPluginStartDependencies) =>
(props: React.ComponentProps<typeof InferenceEndpointsProvider>) =>
(
<KibanaContextProvider services={{ ...core, ...services }}>
<InferenceEndpointsProvider {...props} />
</KibanaContextProvider>
);

View file

@ -0,0 +1,27 @@
/*
* 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 { useEffect } from 'react';
import * as i18n from '../../common/translations';
import { useKibana } from './use_kibana';
export const useInferenceEndpointsBreadcrumbs = () => {
const { searchNavigation } = useKibana().services;
useEffect(() => {
searchNavigation?.breadcrumbs.setSearchBreadCrumbs(
[{ text: i18n.BREADCRUMB_RELEVANCE }, { text: i18n.BREADCRUMB_INFERENCE_ENDPOINTS }],
{ forClassicChromeStyle: true }
);
return () => {
// Clear breadcrumbs on unmount;
searchNavigation?.breadcrumbs.clearBreadcrumbs();
};
}, [searchNavigation]);
};

View file

@ -17,5 +17,3 @@ export type {
SearchInferenceEndpointsPluginSetup,
SearchInferenceEndpointsPluginStart,
} from './types';
export const INFERENCE_ENDPOINTS_UI_FLAG = 'inferenceEndpointsUi:enabled';

View file

@ -6,17 +6,18 @@
*/
import React, { useMemo } from 'react';
import { EuiPageTemplate } from '@elastic/eui';
import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template';
import { App } from './components/app';
import { useInferenceEndpointsBreadcrumbs } from './hooks/use_inference_endpoints_breadcrumbs';
import { useKibana } from './hooks/use_kibana';
import { InferenceEndpointsProvider } from './providers/inference_endpoints_provider';
export const InferenceEndpointsOverview: React.FC = () => {
const {
services: { console: consolePlugin },
services: { console: consolePlugin, history, searchNavigation },
} = useKibana();
useInferenceEndpointsBreadcrumbs();
const embeddableConsole = useMemo(
() => (consolePlugin?.EmbeddableConsole ? <consolePlugin.EmbeddableConsole /> : null),
@ -25,10 +26,16 @@ export const InferenceEndpointsOverview: React.FC = () => {
return (
<InferenceEndpointsProvider>
<EuiPageTemplate offset={0} restrictWidth={false} grow={false}>
<KibanaPageTemplate
offset={0}
restrictWidth={false}
grow={false}
data-test-subj="inferenceEndpointsPage"
solutionNav={searchNavigation?.useClassicNavigation(history)}
>
<App />
{embeddableConsole}
</EuiPageTemplate>
</KibanaPageTemplate>
</InferenceEndpointsProvider>
);
};

View file

@ -5,8 +5,12 @@
* 2.0.
*/
import { BehaviorSubject, type Subscription } from 'rxjs';
import {
AppMountParameters,
AppStatus,
AppUpdater,
CoreSetup,
CoreStart,
Plugin,
@ -15,7 +19,6 @@ import {
import { i18n } from '@kbn/i18n';
import { PLUGIN_ID, PLUGIN_NAME } from '../common/constants';
import { docLinks } from '../common/doc_links';
import { InferenceEndpoints, getInferenceEndpointsProvider } from './embeddable';
import {
AppPluginSetupDependencies,
AppPluginStartDependencies,
@ -23,7 +26,6 @@ import {
SearchInferenceEndpointsPluginSetup,
SearchInferenceEndpointsPluginStart,
} from './types';
import { INFERENCE_ENDPOINTS_UI_FLAG } from '.';
import { registerLocators } from './locators';
import { INFERENCE_ENDPOINTS_PATH } from './components/routes';
@ -31,6 +33,8 @@ export class SearchInferenceEndpointsPlugin
implements Plugin<SearchInferenceEndpointsPluginSetup, SearchInferenceEndpointsPluginStart>
{
private config: SearchInferenceEndpointsConfigType;
private readonly appUpdater$ = new BehaviorSubject<AppUpdater>(() => ({}));
private licenseSubscription: Subscription | undefined;
constructor(initializerContext: PluginInitializerContext) {
this.config = initializerContext.config.get<SearchInferenceEndpointsConfigType>();
@ -40,11 +44,7 @@ export class SearchInferenceEndpointsPlugin
core: CoreSetup<AppPluginStartDependencies, SearchInferenceEndpointsPluginStart>,
plugins: AppPluginSetupDependencies
): SearchInferenceEndpointsPluginSetup {
if (
!this.config.ui?.enabled &&
!core.uiSettings.get<boolean>(INFERENCE_ENDPOINTS_UI_FLAG, false)
)
return {};
if (!this.config.ui?.enabled) return {};
core.application.register({
id: PLUGIN_ID,
appRoute: '/app/elasticsearch/relevance',
@ -55,9 +55,12 @@ export class SearchInferenceEndpointsPlugin
title: i18n.translate('xpack.searchInferenceEndpoints.InferenceEndpointsLinkLabel', {
defaultMessage: 'Inference Endpoints',
}),
visibleIn: ['globalSearch'],
},
],
status: AppStatus.inaccessible,
title: PLUGIN_NAME,
updater$: this.appUpdater$,
async mount({ element, history }: AppMountParameters) {
const { renderApp } = await import('./application');
const [coreStart, depsStart] = await core.getStartServices();
@ -66,8 +69,11 @@ export class SearchInferenceEndpointsPlugin
history,
};
depsStart.searchNavigation?.handleOnAppMount();
return renderApp(coreStart, startDeps, element);
},
visibleIn: [],
});
registerLocators(plugins.share);
@ -79,13 +85,27 @@ export class SearchInferenceEndpointsPlugin
core: CoreStart,
deps: AppPluginStartDependencies
): SearchInferenceEndpointsPluginStart {
const { licensing } = deps;
docLinks.setDocLinks(core.docLinks.links);
return {
InferenceEdnpointsProvider: getInferenceEndpointsProvider(core, deps),
InferenceEndpoints,
};
this.licenseSubscription = licensing.license$.subscribe((license) => {
const status: AppStatus =
license && license.isAvailable && license.isActive && license.hasAtLeast('enterprise')
? AppStatus.accessible
: AppStatus.inaccessible;
this.appUpdater$.next(() => ({
status,
}));
});
return {};
}
public stop() {}
public stop() {
if (this.licenseSubscription) {
this.licenseSubscription.unsubscribe();
this.licenseSubscription = undefined;
}
}
}

View file

@ -6,29 +6,27 @@
*/
import type { ConsolePluginSetup, ConsolePluginStart } from '@kbn/console-plugin/public';
import { HttpStart } from '@kbn/core-http-browser';
import { AppMountParameters } from '@kbn/core/public';
import { MlPluginStart } from '@kbn/ml-plugin/public';
import { SharePluginSetup, SharePluginStart } from '@kbn/share-plugin/public';
import React from 'react';
import type { AppMountParameters, CoreStart } from '@kbn/core/public';
import type { MlPluginStart } from '@kbn/ml-plugin/public';
import type { SharePluginSetup, SharePluginStart } from '@kbn/share-plugin/public';
import type { SearchNavigationPluginStart } from '@kbn/search-navigation/public';
import type { ServerlessPluginStart } from '@kbn/serverless/public';
import type { App } from './components/app';
import type { InferenceEndpointsProvider } from './providers/inference_endpoints_provider';
import type { LicensingPluginStart } from '@kbn/licensing-plugin/public';
export * from '../common/types';
// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface SearchInferenceEndpointsPluginSetup {}
export interface SearchInferenceEndpointsPluginStart {
InferenceEdnpointsProvider: React.FC<React.ComponentProps<typeof InferenceEndpointsProvider>>;
InferenceEndpoints: React.FC<React.ComponentProps<typeof App>>;
}
// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface SearchInferenceEndpointsPluginStart {}
export interface AppPluginStartDependencies {
history: AppMountParameters['history'];
share: SharePluginStart;
console?: ConsolePluginStart;
licensing: LicensingPluginStart;
ml: MlPluginStart;
searchNavigation?: SearchNavigationPluginStart;
serverless?: ServerlessPluginStart;
}
@ -38,13 +36,7 @@ export interface AppPluginSetupDependencies {
console?: ConsolePluginSetup;
}
export interface AppServicesContext {
http: HttpStart;
ml?: MlPluginStart;
console?: ConsolePluginStart;
serverless?: ServerlessPluginStart;
share: SharePluginStart;
}
export type AppServicesContext = CoreStart & AppPluginStartDependencies;
export interface InferenceUsageResponse {
acknowledge: boolean;

View file

@ -13,7 +13,7 @@ export * from './types';
const configSchema = schema.object({
enabled: schema.boolean({ defaultValue: true }),
ui: schema.object({
enabled: schema.boolean({ defaultValue: false }),
enabled: schema.boolean({ defaultValue: true }),
}),
});

View file

@ -54,7 +54,7 @@ export class SearchInferenceEndpointsPlugin
id: PLUGIN_ID,
minimumLicense: 'enterprise',
name: PLUGIN_NAME,
order: 0,
order: 2,
category: DEFAULT_APP_CATEGORIES.enterpriseSearch,
app: ['kibana', PLUGIN_ID],
scope: [KibanaFeatureScope.Spaces, KibanaFeatureScope.Security],

View file

@ -12,7 +12,6 @@
"kbn_references": [
"@kbn/config-schema",
"@kbn/core",
"@kbn/core-http-browser",
"@kbn/i18n",
"@kbn/i18n-react",
"@kbn/kibana-react-plugin",
@ -22,8 +21,6 @@
"@kbn/core-http-server",
"@kbn/share-plugin",
"@kbn/actions-plugin",
"@kbn/shared-ux-utility",
"@kbn/core-lifecycle-browser",
"@kbn/logging",
"@kbn/react-kibana-context-render",
"@kbn/doc-links",
@ -35,7 +32,10 @@
"@kbn/deeplinks-search",
"@kbn/deeplinks-management",
"@kbn/serverless",
"@kbn/utility-types"
"@kbn/utility-types",
"@kbn/search-navigation",
"@kbn/shared-ux-page-kibana-template",
"@kbn/licensing-plugin"
],
"exclude": [
"target/**/*",

View file

@ -6,6 +6,9 @@
*/
import { useEffect } from 'react';
import { i18n } from '@kbn/i18n';
import { useKibana } from './use_kibana';
export const usePlaygroundBreadcrumbs = () => {
@ -13,7 +16,18 @@ export const usePlaygroundBreadcrumbs = () => {
useEffect(() => {
searchNavigation?.breadcrumbs.setSearchBreadCrumbs(
[{ text: 'Build' }, { text: 'Playground' }],
[
{
text: i18n.translate('xpack.searchPlayground.breadcrumbs.build', {
defaultMessage: 'Build',
}),
},
{
text: i18n.translate('xpack.searchPlayground.breadcrumbs.playground', {
defaultMessage: 'Playground',
}),
},
],
{ forClassicChromeStyle: true }
);

View file

@ -18344,9 +18344,6 @@
"xpack.enterpriseSearch.indexOverview.indexErrors.modelNotDeployedError": "Le modèle {modelId} pour le point de terminaison d'inférence {inferenceId} dans le champ {fieldName} n'a pas été démarré",
"xpack.enterpriseSearch.indexOverview.indexErrors.showErrorsLabel": "Afficher l'erreur en intégralité",
"xpack.enterpriseSearch.indexOverview.indexErrors.title": "L'index comporte des erreurs",
"xpack.enterpriseSearch.inferenceEndpoints.description": "Gérez vos points de terminaison d'inférence pour la recherche sémantique et les cas d'utilisation de l'IA.",
"xpack.enterpriseSearch.inferenceEndpoints.navTitle": "Pertinence",
"xpack.enterpriseSearch.inferenceEndpoints.productName": "Points de terminaison d'inférence",
"xpack.enterpriseSearch.inferencePipelineCard.action.delete": "Supprimer un pipeline",
"xpack.enterpriseSearch.inferencePipelineCard.action.delete.disabledDescription": "Ce pipeline d'inférence ne peut pas être supprimé car il est utilisé dans plusieurs pipelines [{indexReferences}]. Pour le supprimer, vous devez le détacher des autres pipelines pour ne garder qu'un seul pipeline d'ingestion.",
"xpack.enterpriseSearch.inferencePipelineCard.action.detach": "Détacher le pipeline",
@ -18442,7 +18439,6 @@
"xpack.enterpriseSearch.navigation.contentConnectorsLinkLabel": "Connecteurs",
"xpack.enterpriseSearch.navigation.contentIndicesLinkLabel": "Index",
"xpack.enterpriseSearch.navigation.contentWebcrawlersLinkLabel": "Robots d'indexation",
"xpack.enterpriseSearch.navigation.relevanceInferenceEndpointsLinkLabel": "Points de terminaison d'inférence",
"xpack.enterpriseSearch.noEntSearch.noCrawler": "Le robot d'indexation d'Elastic n'est pas disponible sans Entreprise Search.",
"xpack.enterpriseSearch.noEntSearch.setupGuideCta": "Consulter le guide de configuration",
"xpack.enterpriseSearch.noEntSearchConfigured.title": "Enterprise Search n'a pas encore été configuré",
@ -18491,7 +18487,6 @@
"xpack.enterpriseSearch.productSelector.overview.title": "Ingérer votre contenu",
"xpack.enterpriseSearch.productSelectorCalloutTitle": "Mettez à niveau pour obtenir des fonctionnalités de niveau entreprise pour votre équipe",
"xpack.enterpriseSearch.readOnlyMode.warning": "Enterprise Search est en mode de lecture seule. Vous ne pourrez pas effectuer de changements tels que création, modification ou suppression.",
"xpack.enterpriseSearch.relevance.inferenceEndpoints.breadcrumb": "Points de terminaison d'inférence",
"xpack.enterpriseSearch.required": "Obligatoire",
"xpack.enterpriseSearch.researchConfiguration.euiText.checkRequirementsLabel": "Vérifier les exigences",
"xpack.enterpriseSearch.researchConfiguration.p.referToTheDocumentationLabel": "Consultez la documentation de ce connecteur pour en apprendre plus sur les prérequis de connexion à {serviceType} ainsi que les prérequis de configuration.",

View file

@ -18203,8 +18203,6 @@
"xpack.enterpriseSearch.indexOverview.indexErrors.modelNotDeployedError": "フィールド{fieldName}で推論エンドポイント{inferenceId}のモデル{modelId}は開始されていません。",
"xpack.enterpriseSearch.indexOverview.indexErrors.showErrorsLabel": "完全なエラーを表示",
"xpack.enterpriseSearch.indexOverview.indexErrors.title": "インデックスにはエラーがあります",
"xpack.enterpriseSearch.inferenceEndpoints.description": "セマンティック検索やAIのユースケースに対応する推論エンドポイントを管理します。",
"xpack.enterpriseSearch.inferenceEndpoints.productName": "推論エンドポイント",
"xpack.enterpriseSearch.inferencePipelineCard.action.delete": "パイプラインを削除",
"xpack.enterpriseSearch.inferencePipelineCard.action.delete.disabledDescription": "この推論パイプラインは削除できません。複数のパイプライン[{indexReferences}]で使用されています。削除する前に、1つのインジェストパイプライン以外のすべてからこのパイプラインをデタッチする必要があります。",
"xpack.enterpriseSearch.inferencePipelineCard.action.detach": "パイプラインのデタッチ",
@ -18299,7 +18297,6 @@
"xpack.enterpriseSearch.navigation.contentConnectorsLinkLabel": "コネクター",
"xpack.enterpriseSearch.navigation.contentIndicesLinkLabel": "インデックス",
"xpack.enterpriseSearch.navigation.contentWebcrawlersLinkLabel": "Webクローラー",
"xpack.enterpriseSearch.navigation.relevanceInferenceEndpointsLinkLabel": "推論エンドポイント",
"xpack.enterpriseSearch.noEntSearch.noCrawler": "Elastic Webクローラーはエンタープライズ サーチなしでは利用できません。",
"xpack.enterpriseSearch.noEntSearch.setupGuideCta": "セットアップガイドを確認",
"xpack.enterpriseSearch.noEntSearchConfigured.title": "エンタープライズ サーチが構成されていません",
@ -18348,7 +18345,6 @@
"xpack.enterpriseSearch.productSelector.overview.title": "データをインジェスト",
"xpack.enterpriseSearch.productSelectorCalloutTitle": "チームのためのエンタープライズレベルの機能を実現できるようにアップグレード",
"xpack.enterpriseSearch.readOnlyMode.warning": "エンタープライズ サーチは読み取り専用モードです。作成、編集、削除などの変更を実行できません。",
"xpack.enterpriseSearch.relevance.inferenceEndpoints.breadcrumb": "推論エンドポイント",
"xpack.enterpriseSearch.required": "必須",
"xpack.enterpriseSearch.researchConfiguration.euiText.checkRequirementsLabel": "要件を確認",
"xpack.enterpriseSearch.researchConfiguration.p.referToTheDocumentationLabel": "{serviceType}に接続するための前提条件と構成要件については、このコネクターのドキュメントを参照してください。",

View file

@ -18274,9 +18274,6 @@
"xpack.enterpriseSearch.indexOverview.indexErrors.modelNotDeployedError": "字段 {fieldName} 中用于推理终端 {inferenceId} 的模型 {modelId} 尚未启动",
"xpack.enterpriseSearch.indexOverview.indexErrors.showErrorsLabel": "显示完整错误",
"xpack.enterpriseSearch.indexOverview.indexErrors.title": "索引包含错误",
"xpack.enterpriseSearch.inferenceEndpoints.description": "管理您用于语义搜索和 AI 用例的推理终端。",
"xpack.enterpriseSearch.inferenceEndpoints.navTitle": "相关性",
"xpack.enterpriseSearch.inferenceEndpoints.productName": "推理终端",
"xpack.enterpriseSearch.inferencePipelineCard.action.delete": "删除管道",
"xpack.enterpriseSearch.inferencePipelineCard.action.delete.disabledDescription": "无法删除此推理管道,因为它已用在多个管道中 [{indexReferences}]。您必须将此管道从所有管道(一个采集管道除外)分离,然后才能将其删除。",
"xpack.enterpriseSearch.inferencePipelineCard.action.detach": "分离管道",
@ -18372,7 +18369,6 @@
"xpack.enterpriseSearch.navigation.contentConnectorsLinkLabel": "连接器",
"xpack.enterpriseSearch.navigation.contentIndicesLinkLabel": "索引",
"xpack.enterpriseSearch.navigation.contentWebcrawlersLinkLabel": "网络爬虫",
"xpack.enterpriseSearch.navigation.relevanceInferenceEndpointsLinkLabel": "推理终端",
"xpack.enterpriseSearch.noEntSearch.noCrawler": "如果没有 Enterprise SearchElastic 网络爬虫将不可用。",
"xpack.enterpriseSearch.noEntSearch.setupGuideCta": "阅读设置指南",
"xpack.enterpriseSearch.noEntSearchConfigured.title": "尚未配置 Enterprise Search",
@ -18421,7 +18417,6 @@
"xpack.enterpriseSearch.productSelector.overview.title": "采集您的内容",
"xpack.enterpriseSearch.productSelectorCalloutTitle": "进行升级以便为您的团队获取企业级功能",
"xpack.enterpriseSearch.readOnlyMode.warning": "企业搜索处于只读模式。您将无法执行更改,例如创建、编辑或删除。",
"xpack.enterpriseSearch.relevance.inferenceEndpoints.breadcrumb": "推理终端",
"xpack.enterpriseSearch.required": "必需",
"xpack.enterpriseSearch.researchConfiguration.euiText.checkRequirementsLabel": "检查要求",
"xpack.enterpriseSearch.researchConfiguration.p.referToTheDocumentationLabel": "请参阅此连接器的文档了解连接到 {serviceType} 的先决条件和配置要求。",