Skip to content

Commit 74e99f2

Browse files
flash1293claudekibanamachine
authored
Rebrand Elastic Console to Elastic Ramen and eliminate storage schema duplication (elastic#260627)
## Summary - **Eliminate storage schema duplication**: Replace the duplicated `StorageIndexAdapter` + schema in elastic_console with a thin ES client wrapper that reads/writes directly to agent_builder's conversation index alias (`chatSystemIndex('conversations')`). This removes the fragile coupling where both plugins had to maintain identical ES mapping schemas — agent_builder now owns the index lifecycle entirely. - **Handle fresh systems**: Added `indexExists()` guard before all conversation operations. Writes return 503 if the index doesn't exist yet; reads return empty results or 404 gracefully. - **Rebrand to Elastic Ramen**: All user-visible strings changed from "Elastic Console" / "SRE Agent" to "Elastic Ramen". Added an `EuiBetaBadge` "Experimental" badge and a prominent experimental warning callout to the setup page. - **Rename user-visible identifiers**: Advanced setting renamed to `elasticRamen:enabled`. All API routes renamed to `/internal/elastic_ramen/`. App ID renamed to `elasticRamen` (URL: `/app/elasticRamen`). Telemetry schema updated accordingly. Internal plugin ID and config path are unchanged. - **Improved type safety**: Conversation routes now use `ConversationRound` and `isToolCallStep()` from `@kbn/agent-builder-common` instead of loose `Record<string, unknown>` types. ## Test plan - [ ] Type check passes: `node scripts/type_check --project x-pack/platform/plugins/shared/elastic_console/tsconfig.json` - [ ] Pre-commit checks pass: `node scripts/check_changes.ts` - [ ] Manual: verify setup page at `/app/elasticRamen` shows "🍜 Elastic Ramen Setup" with experimental badge and warning callout - [ ] Manual: verify advanced setting shows "Elastic Ramen" label with key `elasticRamen:enabled` - [ ] Manual: verify API routes respond at `/internal/elastic_ramen/` paths - [ ] Manual: create a conversation via the API, verify it appears in Agent Builder UI - [ ] Manual: on a fresh system (no agent_builder index), verify conversation create returns 503 and list returns empty 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
1 parent 27674bf commit 74e99f2

18 files changed

Lines changed: 177 additions & 133 deletions

File tree

docs/extend/plugin-list.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ mapped_pages:
146146
| [ecsDataQualityDashboard](https://github.com/elastic/kibana/blob/main/x-pack/solutions/security/plugins/ecs_data_quality_dashboard/README.md) | This plugin implements (server) APIs used to render the content of the Data Quality dashboard. |
147147
| [elasticAssistant](https://github.com/elastic/kibana/blob/main/x-pack/solutions/security/plugins/elastic_assistant/README.md) | This plugin implements server APIs for the Elastic AI Assistant. Furthermore, it registers the Elastic Assistant in the navigation bar. |
148148
| [elasticAssistantSharedState](https://github.com/elastic/kibana/blob/main/x-pack/solutions/security/plugins/elastic_assistant_shared_state/README.md) | This plugin acts as a reactive bridge between the elastic assistant plugin and other plugins. It exposes an RxJS-based interface where: |
149-
| [elasticConsole](https://github.com/elastic/kibana/blob/main/x-pack/platform/plugins/shared/elastic_console/README.md) | An OpenAI-compatible proxy that routes requests through Kibana-configured AI connectors. External tools (coding agents, CLI tools, IDE extensions) can talk to any Elasticsearch AI connector using the standard OpenAI chat completions API. |
149+
| [elasticConsole](https://github.com/elastic/kibana/blob/main/x-pack/platform/plugins/shared/elastic_console/README.md) | Experimental — this feature is under active development and may change without notice. |
150150
| [embeddableAlertsTable](https://github.com/elastic/kibana/blob/main/x-pack/platform/plugins/shared/embeddable_alerts_table/README.md) | Embeddable wrapper for the alerts table |
151151
| [encryptedSavedObjects](https://github.com/elastic/kibana/blob/main/x-pack/platform/plugins/shared/encrypted_saved_objects/README.md) | The purpose of this plugin is to provide a way to encrypt/decrypt attributes on the custom Saved Objects that works with security and spaces filtering. |
152152
| [enterpriseSearch](https://github.com/elastic/kibana/blob/main/x-pack/solutions/search/plugins/enterprise_search/README.md) | This plugin provides Kibana user interfaces for managing the Enterprise Search solution and its products, App Search and Workplace Search. |

src/platform/packages/shared/kbn-management/settings/setting_ids/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
// General settings
1111
export const DISABLE_REQUEST_BATCHING_ID = 'bfetch:disable';
12-
export const ELASTIC_CONSOLE_ENABLED_SETTING_ID = 'elasticConsole:enabled';
12+
export const ELASTIC_CONSOLE_ENABLED_SETTING_ID = 'elasticRamen:enabled';
1313
export const DISABLE_BATCH_COMPRESSION_ID = 'bfetch:disableCompression';
1414
export const CSV_QUOTE_VALUES_ID = 'csv:quoteValues';
1515
export const CSV_SEPARATOR_ID = 'csv:separator';

src/platform/plugins/private/kibana_usage_collection/server/collectors/application_usage/schema.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ export const applicationUsageSchema = {
142142
searchPlayground: commonSchema,
143143
searchSynonyms: commonSchema,
144144
searchQueryRules: commonSchema,
145-
elasticConsole: commonSchema,
145+
elasticRamen: commonSchema,
146146
elasticsearchIndexManagement: commonSchema,
147147
enterpriseSearchAnalytics: commonSchema,
148148
enterpriseSearchApplications: commonSchema,

src/platform/plugins/private/kibana_usage_collection/server/collectors/management/schema.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -802,7 +802,7 @@ export const stackManagementSchema: MakeSchemaFrom<UsageStats> = {
802802
description: 'Switches the Entity Store Engine to v2',
803803
},
804804
},
805-
'elasticConsole:enabled': {
805+
'elasticRamen:enabled': {
806806
type: 'boolean',
807807
_meta: {
808808
description: 'Non-default value of setting.',

src/platform/plugins/private/kibana_usage_collection/server/collectors/management/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,6 @@ export interface UsageStats {
196196
'observability:streamsEnableOverviewPage': boolean;
197197
'observability:streamsSigEventsIndexPatterns': string;
198198
'securitySolution:entityStoreEnableV2': boolean;
199+
'elasticRamen:enabled': boolean;
199200
'query_activity:minRunningTime': number;
200-
'elasticConsole:enabled': boolean;
201201
}

src/platform/plugins/shared/telemetry/schema/oss_platform.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2884,7 +2884,7 @@
28842884
}
28852885
}
28862886
},
2887-
"elasticConsole": {
2887+
"elasticRamen": {
28882888
"properties": {
28892889
"appId": {
28902890
"type": "keyword",
@@ -11815,7 +11815,7 @@
1181511815
"description": "Switches the Entity Store Engine to v2"
1181611816
}
1181711817
},
11818-
"elasticConsole:enabled": {
11818+
"elasticRamen:enabled": {
1181911819
"type": "boolean",
1182011820
"_meta": {
1182111821
"description": "Non-default value of setting."

x-pack/platform/plugins/shared/elastic_console/README.md

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
# Elastic Console Plugin
1+
# Elastic Ramen (Elastic Console Plugin)
2+
3+
> **Experimental** — this feature is under active development and may change without notice.
24
35
An OpenAI-compatible proxy that routes requests through Kibana-configured AI connectors. External tools (coding agents, CLI tools, IDE extensions) can talk to any Elasticsearch AI connector using the standard OpenAI chat completions API.
46

@@ -11,7 +13,7 @@ The plugin is gated behind **both** a feature flag and an advanced setting:
1113
feature_flags.overrides:
1214
elasticConsole.enabled: true
1315
```
14-
2. **Advanced setting**: Go to **Stack Management > Advanced Settings**, search for **Elastic Console**, and toggle `elasticConsole:enabled` to `true`.
16+
2. **Advanced setting**: Go to **Stack Management > Advanced Settings**, search for **Elastic Ramen**, and toggle `elasticRamen:enabled` to `true`.
1517

1618
Until both are enabled, every route returns `404`.
1719

@@ -22,7 +24,7 @@ All API routes require a valid Kibana session or API key. The easiest way to get
2224
### Setup endpoint
2325

2426
```
25-
POST /internal/elastic_console/setup
27+
POST /internal/elastic_ramen/setup
2628
```
2729
2830
Returns:
@@ -38,7 +40,7 @@ The API key is scoped to the calling user's privileges and expires after 30 days
3840

3941
### Setup UI
4042

41-
Navigate to `/app/elasticConsole` in Kibana. Click **Generate credentials** to create an API key. The page will:
43+
Navigate to `/app/elasticRamen` in Kibana. Click **Generate credentials** to create an API key. The page will:
4244

4345
1. Attempt to auto-deliver credentials to a local agent at `http://localhost:14642/config`
4446
2. Fall back to displaying the credentials for manual copy if no local agent is found
@@ -57,7 +59,7 @@ All routes are internal Kibana APIs. Clients must include:
5759
### Example: curl
5860

5961
```bash
60-
curl -X POST "https://my-kibana:5601/internal/elastic_console/v1/chat/completions" \
62+
curl -X POST "https://my-kibana:5601/internal/elastic_ramen/v1/chat/completions" \
6163
-H "Authorization: ApiKey YOUR_API_KEY" \
6264
-H "Content-Type: application/json" \
6365
-H "x-elastic-internal-origin: kibana" \
@@ -74,7 +76,7 @@ curl -X POST "https://my-kibana:5601/internal/elastic_console/v1/chat/completion
7476
### List models
7577

7678
```
77-
GET /internal/elastic_console/v1/models
79+
GET /internal/elastic_ramen/v1/models
7880
```
7981

8082
Returns available AI connectors in OpenAI model list format:
@@ -96,7 +98,7 @@ Returns available AI connectors in OpenAI model list format:
9698
### Chat completions
9799

98100
```
99-
POST /internal/elastic_console/v1/chat/completions
101+
POST /internal/elastic_ramen/v1/chat/completions
100102
```
101103

102104
OpenAI-compatible chat completions endpoint. Supports:
@@ -141,23 +143,23 @@ CRUD endpoints for managing chat conversations stored in Elasticsearch.
141143
#### List conversations
142144

143145
```
144-
GET /internal/elastic_console/conversations?agent_id=<optional>
146+
GET /internal/elastic_ramen/conversations?agent_id=<optional>
145147
```
146148

147149
Returns conversations for the current space, sorted by `updated_at` descending (max 100). The `conversation_rounds` field is excluded from list results.
148150

149151
#### Get conversation
150152

151153
```
152-
GET /internal/elastic_console/conversations/:id
154+
GET /internal/elastic_ramen/conversations/:id
153155
```
154156

155157
Returns a single conversation with full `conversation_rounds`.
156158

157159
#### Create conversation
158160

159161
```
160-
POST /internal/elastic_console/conversations
162+
POST /internal/elastic_ramen/conversations
161163
```
162164

163165
Body:
@@ -174,7 +176,7 @@ Returns `{ "id": "generated-uuid" }`.
174176
#### Update conversation
175177

176178
```
177-
PUT /internal/elastic_console/conversations/:id
179+
PUT /internal/elastic_ramen/conversations/:id
178180
```
179181

180182
Body (all fields optional):
@@ -195,7 +197,7 @@ Returns `{ "id": "conversation-id" }`.
195197
from openai import OpenAI
196198

197199
client = OpenAI(
198-
base_url="https://my-kibana:5601/internal/elastic_console/v1",
200+
base_url="https://my-kibana:5601/internal/elastic_ramen/v1",
199201
api_key="YOUR_API_KEY",
200202
default_headers={
201203
"x-elastic-internal-origin": "kibana",
@@ -216,7 +218,7 @@ print(response.choices[0].message.content)
216218
import OpenAI from 'openai';
217219

218220
const client = new OpenAI({
219-
baseURL: 'https://my-kibana:5601/internal/elastic_console/v1',
221+
baseURL: 'https://my-kibana:5601/internal/elastic_ramen/v1',
220222
apiKey: 'YOUR_API_KEY',
221223
defaultHeaders: {
222224
'x-elastic-internal-origin': 'kibana',
@@ -233,7 +235,7 @@ console.log(response.choices[0].message.content);
233235

234236
### Claude Code / other agents
235237

236-
Set the base URL to `https://my-kibana:5601/internal/elastic_console/v1` and use the API key from the setup endpoint. Include `x-elastic-internal-origin: kibana` in all requests, and include `kbn-xsrf: true` for non-GET requests.
238+
Set the base URL to `https://my-kibana:5601/internal/elastic_ramen/v1` and use the API key from the setup endpoint. Include `x-elastic-internal-origin: kibana` in all requests, and include `kbn-xsrf: true` for non-GET requests.
237239

238240
## Development
239241

x-pack/platform/plugins/shared/elastic_console/moon.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ dependsOn:
2626
- '@kbn/cloud-plugin'
2727
- '@kbn/kibana-react-plugin'
2828
- '@kbn/management-settings-ids'
29-
- '@kbn/storage-adapter'
29+
- '@kbn/agent-builder-common'
3030
- '@kbn/agent-builder-server'
3131
- '@kbn/core-feature-flags-server'
3232
- '@kbn/logging'

x-pack/platform/plugins/shared/elastic_console/public/application/setup_page.tsx

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import React, { useCallback, useRef, useState } from 'react';
99
import {
10+
EuiBetaBadge,
1011
EuiButton,
1112
EuiCallOut,
1213
EuiCodeBlock,
@@ -42,7 +43,7 @@ export const SetupPage: React.FC = () => {
4243
setError(null);
4344

4445
try {
45-
const data = await services.http.post<SetupResponse>('/internal/elastic_console/setup');
46+
const data = await services.http.post<SetupResponse>('/internal/elastic_ramen/setup');
4647
setSetupData(data);
4748
} catch (err) {
4849
setError(err instanceof Error ? err.message : 'Failed to create setup credentials');
@@ -53,8 +54,26 @@ export const SetupPage: React.FC = () => {
5354

5455
return (
5556
<EuiPageTemplate>
56-
<EuiPageTemplate.Header pageTitle="Elastic Console Setup" />
57+
<EuiPageTemplate.Header
58+
pageTitle={<>{'🍜 Elastic Ramen Setup'}</>}
59+
rightSideItems={[<EuiBetaBadge label="Experimental" color="hollow" />]}
60+
/>
5761
<EuiPageTemplate.Section>
62+
<EuiCallOut
63+
title="Experimental feature — proceed with caution"
64+
color="warning"
65+
iconType="beaker"
66+
>
67+
<p>
68+
Elastic Ramen is an <strong>experimental</strong> feature under active development. It
69+
may change, break, or be removed without notice. Use at your own risk — it can expose AI
70+
connectors to external tools and may produce unexpected behavior. Do not rely on it for
71+
production workloads.
72+
</p>
73+
</EuiCallOut>
74+
75+
<EuiSpacer />
76+
5877
<EuiText>
5978
<p>
6079
Generate connection credentials for external tools to use Kibana-configured AI
@@ -126,7 +145,7 @@ export const SetupPage: React.FC = () => {
126145
},
127146
},
128147
options: {
129-
baseURL: `${setupData.kibanaUrl}/internal/elastic_console/v1`,
148+
baseURL: `${setupData.kibanaUrl}/internal/elastic_ramen/v1`,
130149
apiKey: 'ignored',
131150
headers: {
132151
Authorization: `ApiKey ${setupData.apiKeyEncoded}`,

x-pack/platform/plugins/shared/elastic_console/public/plugin.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ export class ElasticConsolePlugin implements Plugin {
2020

2121
setup(core: CoreSetup) {
2222
core.application.register({
23-
id: 'elasticConsole',
24-
title: 'Elastic Console',
23+
id: 'elasticRamen',
24+
title: 'Elastic Ramen',
2525
visibleIn: [],
2626
async mount(params: AppMountParameters) {
2727
const [coreStart] = await core.getStartServices();
@@ -35,7 +35,7 @@ export class ElasticConsolePlugin implements Plugin {
3535
);
3636
if (!featureFlagEnabled || !advancedSettingEnabled) {
3737
const { element } = params;
38-
element.innerHTML = '<div>Elastic Console is not enabled.</div>';
38+
element.innerHTML = '<div>Elastic Ramen is not enabled.</div>';
3939
return () => {};
4040
}
4141
const { renderApp } = await import('./application');

0 commit comments

Comments
 (0)