Skip to content

Commit 1a0b65c

Browse files
stephmilovickibanamachineelasticmachine
authored
[8.x] [Security AI] Move security-ai-prompt to package (elastic#208787) (elastic#208988)
# Backport This will backport the following commits from `main` to `8.x`: - [[Security AI] Move &#x60;security-ai-prompt&#x60; to package (elastic#208787)](elastic#208787) <!--- Backport version: 9.6.4 --> ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sorenlouv/backport) <!--BACKPORT [{"author":{"name":"Steph Milovic","email":"[email protected]"},"sourceCommit":{"committedDate":"2025-01-30T16:34:30Z","message":"[Security AI] Move `security-ai-prompt` to package (elastic#208787)","sha":"b0a72e2b9086728d98f4176d1692741f4df62333","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: SecuritySolution","backport:prev-minor","Team:Security Generative AI","v8.18.0"],"title":"[Security AI] Move `security-ai-prompt` to package","number":208787,"url":"https://github.com/elastic/kibana/pull/208787","mergeCommit":{"message":"[Security AI] Move `security-ai-prompt` to package (elastic#208787)","sha":"b0a72e2b9086728d98f4176d1692741f4df62333"}},"sourceBranch":"main","suggestedTargetBranches":["8.x"],"targetPullRequestStates":[{"branch":"main","label":"v9.0.0","branchLabelMappingKey":"^v9.0.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/208787","number":208787,"mergeCommit":{"message":"[Security AI] Move `security-ai-prompt` to package (elastic#208787)","sha":"b0a72e2b9086728d98f4176d1692741f4df62333"}},{"branch":"8.x","label":"v8.18.0","branchLabelMappingKey":"^v8.18.0$","isSourceBranch":false,"state":"NOT_CREATED"}]}] BACKPORT--> --------- Co-authored-by: kibanamachine <[email protected]> Co-authored-by: Elastic Machine <[email protected]>
1 parent 8efc387 commit 1a0b65c

File tree

25 files changed

+497
-254
lines changed

25 files changed

+497
-254
lines changed

.github/CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,7 @@ x-pack/solutions/search/packages/shared_ui @elastic/search-kibana
815815
x-pack/solutions/search/plugins/search_synonyms @elastic/search-kibana
816816
src/platform/packages/shared/kbn-search-types @elastic/kibana-data-discovery
817817
x-pack/platform/plugins/shared/searchprofiler @elastic/kibana-management
818+
x-pack/solutions/security/packages/security-ai-prompts @elastic/security-generative-ai
818819
x-pack/test/security_api_integration/packages/helpers @elastic/kibana-security
819820
x-pack/platform/packages/shared/security/api_key_management @elastic/kibana-security
820821
x-pack/platform/packages/private/security/authorization_core @elastic/kibana-security

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,7 @@
818818
"@kbn/search-synonyms": "link:x-pack/solutions/search/plugins/search_synonyms",
819819
"@kbn/search-types": "link:src/platform/packages/shared/kbn-search-types",
820820
"@kbn/searchprofiler-plugin": "link:x-pack/platform/plugins/shared/searchprofiler",
821+
"@kbn/security-ai-prompts": "link:x-pack/solutions/security/packages/security-ai-prompts",
821822
"@kbn/security-api-key-management": "link:x-pack/platform/packages/shared/security/api_key_management",
822823
"@kbn/security-authorization-core": "link:x-pack/platform/packages/private/security/authorization_core",
823824
"@kbn/security-authorization-core-common": "link:x-pack/platform/packages/private/security/authorization_core_common",

tsconfig.base.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,6 +1624,8 @@
16241624
"@kbn/search-types/*": ["src/platform/packages/shared/kbn-search-types/*"],
16251625
"@kbn/searchprofiler-plugin": ["x-pack/platform/plugins/shared/searchprofiler"],
16261626
"@kbn/searchprofiler-plugin/*": ["x-pack/platform/plugins/shared/searchprofiler/*"],
1627+
"@kbn/security-ai-prompts": ["x-pack/solutions/security/packages/security-ai-prompts"],
1628+
"@kbn/security-ai-prompts/*": ["x-pack/solutions/security/packages/security-ai-prompts/*"],
16271629
"@kbn/security-api-integration-helpers": ["x-pack/test/security_api_integration/packages/helpers"],
16281630
"@kbn/security-api-integration-helpers/*": ["x-pack/test/security_api_integration/packages/helpers/*"],
16291631
"@kbn/security-api-key-management": ["x-pack/platform/packages/shared/security/api_key_management"],
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# @kbn/security-ai-prompts
2+
3+
Utility library for Security AI Prompt management.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0; you may not use this file except in compliance with the Elastic License
5+
* 2.0.
6+
*/
7+
8+
export { promptType } from './src/saved_object_mappings';
9+
export { getPrompt, getPromptsByGroupId } from './src/get_prompt';
10+
export {
11+
type PromptArray,
12+
type Prompt,
13+
type GetPromptArgs,
14+
type GetPromptsByGroupIdArgs,
15+
} from './src/types';

x-pack/solutions/security/plugins/elastic_assistant/server/lib/prompt/types.ts renamed to x-pack/solutions/security/packages/security-ai-prompts/jest.config.js

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,8 @@
55
* 2.0.
66
*/
77

8-
export interface Prompt {
9-
promptId: string;
10-
promptGroupId: string;
11-
prompt: {
12-
default: string;
13-
};
14-
provider?: string;
15-
model?: string;
16-
description?: string;
17-
}
8+
module.exports = {
9+
preset: '@kbn/test',
10+
rootDir: '../../../../..',
11+
roots: ['<rootDir>/x-pack/solutions/security/packages/security-ai-prompts'],
12+
};
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "shared-server",
3+
"id": "@kbn/security-ai-prompts",
4+
"owner": "@elastic/security-generative-ai",
5+
"group": "security",
6+
"visibility": "private"
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"name": "@kbn/security-ai-prompts",
3+
"version": "1.0.0",
4+
"description": "Utility library for Elasticsearch index management",
5+
"license": "Elastic License 2.0",
6+
"private": true
7+
}
Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88
import { getPrompt, getPromptsByGroupId } from './get_prompt';
99
import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server';
1010
import { ActionsClient } from '@kbn/actions-plugin/server';
11-
import { BEDROCK_SYSTEM_PROMPT, DEFAULT_SYSTEM_PROMPT, GEMINI_USER_PROMPT } from './prompts';
12-
import { promptDictionary, promptGroupId } from './local_prompt_object';
11+
import { localPrompts, promptDictionary, promptGroupId } from './mock_prompts';
1312

1413
jest.mock('@kbn/core-saved-objects-api-server');
1514
jest.mock('@kbn/actions-plugin/server');
@@ -161,6 +160,7 @@ describe('get_prompt', () => {
161160
it('returns the prompt matching provider and model', async () => {
162161
const result = await getPrompt({
163162
savedObjectsClient,
163+
localPrompts,
164164
promptId: promptDictionary.systemPrompt,
165165
promptGroupId: promptGroupId.aiAssistant,
166166
provider: 'openai',
@@ -176,6 +176,7 @@ describe('get_prompt', () => {
176176
it('returns the prompt matching provider when model does not have a match', async () => {
177177
const result = await getPrompt({
178178
savedObjectsClient,
179+
localPrompts,
179180
promptId: promptDictionary.systemPrompt,
180181
promptGroupId: promptGroupId.aiAssistant,
181182
provider: 'openai',
@@ -191,6 +192,7 @@ describe('get_prompt', () => {
191192
it('returns the prompt matching provider when model is not provided', async () => {
192193
const result = await getPrompt({
193194
savedObjectsClient,
195+
localPrompts,
194196
promptId: promptDictionary.systemPrompt,
195197
promptGroupId: promptGroupId.aiAssistant,
196198
provider: 'openai',
@@ -205,6 +207,7 @@ describe('get_prompt', () => {
205207
it('returns the default prompt when there is no match on provider', async () => {
206208
const result = await getPrompt({
207209
savedObjectsClient,
210+
localPrompts,
208211
promptId: promptDictionary.systemPrompt,
209212
promptGroupId: promptGroupId.aiAssistant,
210213
provider: 'badone',
@@ -220,6 +223,7 @@ describe('get_prompt', () => {
220223

221224
const result = await getPrompt({
222225
savedObjectsClient,
226+
localPrompts,
223227
promptId: promptDictionary.systemPrompt,
224228
promptGroupId: promptGroupId.aiAssistant,
225229
provider: 'inference',
@@ -242,6 +246,7 @@ describe('get_prompt', () => {
242246

243247
const result = await getPrompt({
244248
savedObjectsClient,
249+
localPrompts,
245250
promptId: promptDictionary.systemPrompt,
246251
promptGroupId: promptGroupId.aiAssistant,
247252
provider: 'inference',
@@ -263,6 +268,7 @@ describe('get_prompt', () => {
263268

264269
const result = await getPrompt({
265270
savedObjectsClient,
271+
localPrompts,
266272
promptId: promptDictionary.systemPrompt,
267273
promptGroupId: promptGroupId.aiAssistant,
268274
provider: 'inference',
@@ -283,14 +289,15 @@ describe('get_prompt', () => {
283289

284290
const result = await getPrompt({
285291
savedObjectsClient,
292+
localPrompts,
286293
promptId: promptDictionary.systemPrompt,
287294
promptGroupId: promptGroupId.aiAssistant,
288295
actionsClient,
289296
provider: 'bedrock',
290297
connectorId: 'connector-123',
291298
});
292299

293-
expect(result).toBe(BEDROCK_SYSTEM_PROMPT);
300+
expect(result).toBe('provider:bedrock default system prompt');
294301
});
295302

296303
it('returns the default prompt when no prompts are found', async () => {
@@ -303,13 +310,14 @@ describe('get_prompt', () => {
303310

304311
const result = await getPrompt({
305312
savedObjectsClient,
313+
localPrompts,
306314
promptId: promptDictionary.systemPrompt,
307315
promptGroupId: promptGroupId.aiAssistant,
308316
actionsClient,
309317
connectorId: 'connector-123',
310318
});
311319

312-
expect(result).toBe(DEFAULT_SYSTEM_PROMPT);
320+
expect(result).toBe('default system prompt');
313321
});
314322

315323
it('throws an error when no prompts are found', async () => {
@@ -323,6 +331,7 @@ describe('get_prompt', () => {
323331
await expect(
324332
getPrompt({
325333
savedObjectsClient,
334+
localPrompts,
326335
promptId: 'nonexistent-prompt',
327336
promptGroupId: 'nonexistent-group',
328337
actionsClient,
@@ -340,6 +349,7 @@ describe('get_prompt', () => {
340349
});
341350
const result = await getPrompt({
342351
savedObjectsClient,
352+
localPrompts,
343353
promptId: promptDictionary.systemPrompt,
344354
promptGroupId: promptGroupId.aiAssistant,
345355
provider: 'inference',
@@ -360,6 +370,7 @@ describe('get_prompt', () => {
360370
});
361371
const result = await getPrompt({
362372
savedObjectsClient,
373+
localPrompts,
363374
promptId: promptDictionary.systemPrompt,
364375
promptGroupId: promptGroupId.aiAssistant,
365376
actionsClient,
@@ -380,6 +391,7 @@ describe('get_prompt', () => {
380391
});
381392
const result = await getPrompt({
382393
savedObjectsClient,
394+
localPrompts,
383395
promptId: promptDictionary.systemPrompt,
384396
promptGroupId: promptGroupId.aiAssistant,
385397
provider: 'bedrock',
@@ -396,6 +408,7 @@ describe('get_prompt', () => {
396408
it('returns prompts matching the provided promptIds', async () => {
397409
const result = await getPromptsByGroupId({
398410
savedObjectsClient,
411+
localPrompts,
399412
promptIds: [promptDictionary.systemPrompt],
400413
promptGroupId: promptGroupId.aiAssistant,
401414
provider: 'openai',
@@ -420,6 +433,7 @@ describe('get_prompt', () => {
420433
it('returns prompts matching the provided promptIds for gemini', async () => {
421434
const result = await getPromptsByGroupId({
422435
savedObjectsClient,
436+
localPrompts,
423437
promptIds: [promptDictionary.systemPrompt, promptDictionary.userPrompt],
424438
promptGroupId: promptGroupId.aiAssistant,
425439
provider: 'gemini',
@@ -434,14 +448,15 @@ describe('get_prompt', () => {
434448
},
435449
{
436450
promptId: promptDictionary.userPrompt,
437-
prompt: GEMINI_USER_PROMPT,
451+
prompt: 'provider:gemini user prompt',
438452
},
439453
]);
440454
});
441455

442456
it('returns prompts matching the provided promptIds when connector is given', async () => {
443457
const result = await getPromptsByGroupId({
444458
savedObjectsClient,
459+
localPrompts,
445460
promptIds: [promptDictionary.systemPrompt, promptDictionary.userPrompt],
446461
promptGroupId: promptGroupId.aiAssistant,
447462
connector: {
@@ -466,13 +481,14 @@ describe('get_prompt', () => {
466481
},
467482
{
468483
promptId: promptDictionary.userPrompt,
469-
prompt: GEMINI_USER_PROMPT,
484+
prompt: 'provider:gemini user prompt',
470485
},
471486
]);
472487
});
473488
it('returns prompts matching the provided promptIds when inference connector is given', async () => {
474489
const result = await getPromptsByGroupId({
475490
savedObjectsClient,
491+
localPrompts,
476492
promptIds: [promptDictionary.systemPrompt],
477493
promptGroupId: promptGroupId.aiAssistant,
478494
connector: {
@@ -509,6 +525,7 @@ describe('get_prompt', () => {
509525
await expect(
510526
getPromptsByGroupId({
511527
savedObjectsClient,
528+
localPrompts,
512529
promptIds: [promptDictionary.systemPrompt, 'fake-id'],
513530
promptGroupId: promptGroupId.aiAssistant,
514531
actionsClient,

0 commit comments

Comments
 (0)