Skip to content

Commit f06981e

Browse files
[9.0] [Obs AI Assistant]fixing error - Display results and Visualize query Bedrock Error (#218213) (#218716)
# Backport This will backport the following commits from `main` to `9.0`: - [[Obs AI Assistant]fixing error - Display results and Visualize query Bedrock Error (#218213)](#218213) <!--- Backport version: 9.6.6 --> ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sorenlouv/backport) <!--BACKPORT [{"author":{"name":"Arturo Lidueña","email":"[email protected]"},"sourceCommit":{"committedDate":"2025-04-21T08:51:18Z","message":"[Obs AI Assistant]fixing error - Display results and Visualize query Bedrock Error (#218213)\n\n### Fix: Bedrock Streaming Error on ES|QL Actions\n\n#### Summary\n\nWhen an ES|QL is generated, we present two action buttons:\n- Visualize Query\n- Display Results\n\nThese actions were not working as expected when using Bedrock as the\nmodel provider.\n\n#### Error Details\n```txt\nEncountered error in Bedrock stream of type validationException messages.8: Did not find 1 `tool_result` block(s) at the beginning of this message. Messages following `tool_use` blocks must begin with a matching number of `tool_result` blocks.\n```\n#### Root Cause\n\nWe were sending a tool_use block in the assistant message without\nimmediately following it with the corresponding tool_result block. This\nviolates Bedrock’s message protocol.","sha":"33993b7123bc0d6c85d9c42b15610cc0d5092281","branchLabelMapping":{"^v9.1.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:fix","backport:prev-minor","Team:Obs AI Assistant","ci:project-deploy-observability","v9.1.0"],"title":"[Obs AI Assistant]fixing error - Display results and Visualize query Bedrock Error","number":218213,"url":"https://github.com/elastic/kibana/pull/218213","mergeCommit":{"message":"[Obs AI Assistant]fixing error - Display results and Visualize query Bedrock Error (#218213)\n\n### Fix: Bedrock Streaming Error on ES|QL Actions\n\n#### Summary\n\nWhen an ES|QL is generated, we present two action buttons:\n- Visualize Query\n- Display Results\n\nThese actions were not working as expected when using Bedrock as the\nmodel provider.\n\n#### Error Details\n```txt\nEncountered error in Bedrock stream of type validationException messages.8: Did not find 1 `tool_result` block(s) at the beginning of this message. Messages following `tool_use` blocks must begin with a matching number of `tool_result` blocks.\n```\n#### Root Cause\n\nWe were sending a tool_use block in the assistant message without\nimmediately following it with the corresponding tool_result block. This\nviolates Bedrock’s message protocol.","sha":"33993b7123bc0d6c85d9c42b15610cc0d5092281"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v9.1.0","branchLabelMappingKey":"^v9.1.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/218213","number":218213,"mergeCommit":{"message":"[Obs AI Assistant]fixing error - Display results and Visualize query Bedrock Error (#218213)\n\n### Fix: Bedrock Streaming Error on ES|QL Actions\n\n#### Summary\n\nWhen an ES|QL is generated, we present two action buttons:\n- Visualize Query\n- Display Results\n\nThese actions were not working as expected when using Bedrock as the\nmodel provider.\n\n#### Error Details\n```txt\nEncountered error in Bedrock stream of type validationException messages.8: Did not find 1 `tool_result` block(s) at the beginning of this message. Messages following `tool_use` blocks must begin with a matching number of `tool_result` blocks.\n```\n#### Root Cause\n\nWe were sending a tool_use block in the assistant message without\nimmediately following it with the corresponding tool_result block. This\nviolates Bedrock’s message protocol.","sha":"33993b7123bc0d6c85d9c42b15610cc0d5092281"}}]}] BACKPORT-->
1 parent a4ed63c commit f06981e

File tree

2 files changed

+67
-72
lines changed
  • x-pack/platform

2 files changed

+67
-72
lines changed

x-pack/platform/packages/shared/kbn-ai-assistant/src/chat/chat_body.tsx

Lines changed: 64 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -275,75 +275,74 @@ export function ChatBody({
275275
navigator.clipboard?.writeText(content || '');
276276
};
277277

278-
const handleActionClick = ({
279-
message,
280-
payload,
281-
}: {
282-
message: Message;
283-
payload: ChatActionClickPayload;
284-
}) => {
285-
setStickToBottom(true);
286-
switch (payload.type) {
287-
case ChatActionClickType.executeEsqlQuery:
288-
next(
289-
messages.concat({
290-
'@timestamp': new Date().toISOString(),
291-
message: {
292-
role: MessageRole.Assistant,
293-
content: '',
294-
function_call: {
295-
name: 'execute_query',
296-
arguments: JSON.stringify({
297-
query: payload.query,
298-
}),
299-
trigger: MessageRole.User,
278+
const handleActionClick = useCallback(
279+
({ message, payload }: { message: Message; payload: ChatActionClickPayload }) => {
280+
setStickToBottom(true);
281+
switch (payload.type) {
282+
case ChatActionClickType.executeEsqlQuery:
283+
next(
284+
messages.concat({
285+
'@timestamp': new Date().toISOString(),
286+
message: {
287+
role: MessageRole.Assistant,
288+
content: '',
289+
function_call: {
290+
name: 'execute_query',
291+
arguments: JSON.stringify({
292+
query: payload.query,
293+
}),
294+
trigger: MessageRole.User,
295+
},
300296
},
301-
},
302-
})
303-
);
304-
break;
305-
306-
case ChatActionClickType.updateVisualization:
307-
const visualizeQueryResponse = message;
308-
309-
const visualizeQueryResponseData = JSON.parse(visualizeQueryResponse.message.data ?? '{}');
310-
311-
next(
312-
messages.slice(0, messages.indexOf(visualizeQueryResponse)).concat({
313-
'@timestamp': new Date().toISOString(),
314-
message: {
315-
name: 'visualize_query',
316-
content: visualizeQueryResponse.message.content,
317-
data: JSON.stringify({
318-
...visualizeQueryResponseData,
319-
userOverrides: payload.userOverrides,
320-
}),
321-
role: MessageRole.User,
322-
},
323-
})
324-
);
325-
break;
326-
case ChatActionClickType.visualizeEsqlQuery:
327-
next(
328-
messages.concat({
329-
'@timestamp': new Date().toISOString(),
330-
message: {
331-
role: MessageRole.Assistant,
332-
content: '',
333-
function_call: {
297+
})
298+
);
299+
break;
300+
301+
case ChatActionClickType.updateVisualization:
302+
const visualizeQueryResponse = message;
303+
304+
const visualizeQueryResponseData = JSON.parse(
305+
visualizeQueryResponse.message.data ?? '{}'
306+
);
307+
308+
next(
309+
messages.slice(0, messages.indexOf(visualizeQueryResponse)).concat({
310+
'@timestamp': new Date().toISOString(),
311+
message: {
334312
name: 'visualize_query',
335-
arguments: JSON.stringify({
336-
query: payload.query,
337-
intention: VisualizeESQLUserIntention.visualizeAuto,
313+
content: visualizeQueryResponse.message.content,
314+
data: JSON.stringify({
315+
...visualizeQueryResponseData,
316+
userOverrides: payload.userOverrides,
338317
}),
339-
trigger: MessageRole.User,
318+
role: MessageRole.User,
340319
},
341-
},
342-
})
343-
);
344-
break;
345-
}
346-
};
320+
})
321+
);
322+
break;
323+
case ChatActionClickType.visualizeEsqlQuery:
324+
next(
325+
messages.concat({
326+
'@timestamp': new Date().toISOString(),
327+
message: {
328+
role: MessageRole.Assistant,
329+
content: '',
330+
function_call: {
331+
name: 'visualize_query',
332+
arguments: JSON.stringify({
333+
query: payload.query,
334+
intention: VisualizeESQLUserIntention.visualizeAuto,
335+
}),
336+
trigger: MessageRole.User,
337+
},
338+
},
339+
})
340+
);
341+
break;
342+
}
343+
},
344+
[messages, next]
345+
);
347346

348347
if (!hasCorrectLicense && !initialConversationId) {
349348
footer = (

x-pack/platform/plugins/shared/observability_ai_assistant/public/components/message_panel/message_text.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {
1818
import { css } from '@emotion/css';
1919
import classNames from 'classnames';
2020
import type { Code, InlineCode, Parent, Text } from 'mdast';
21-
import React, { useMemo, useRef } from 'react';
21+
import React, { useMemo } from 'react';
2222
import type { Node } from 'unist';
2323
import { ChatActionClickHandler } from '../chat/types';
2424
import { CodeBlock, EsqlCodeBlock } from './esql_code_block';
@@ -120,10 +120,6 @@ export function MessageText({ loading, content, onActionClick }: Props) {
120120
overflow-wrap: anywhere;
121121
`;
122122

123-
const onActionClickRef = useRef(onActionClick);
124-
125-
onActionClickRef.current = onActionClick;
126-
127123
const { parsingPluginList, processingPluginList } = useMemo(() => {
128124
const parsingPlugins = getDefaultEuiMarkdownParsingPlugins();
129125

@@ -148,7 +144,7 @@ export function MessageText({ loading, content, onActionClick }: Props) {
148144
<EsqlCodeBlock
149145
value={props.value}
150146
actionsDisabled={loading}
151-
onActionClick={onActionClickRef.current}
147+
onActionClick={onActionClick}
152148
/>
153149
<EuiSpacer size="m" />
154150
</>
@@ -186,7 +182,7 @@ export function MessageText({ loading, content, onActionClick }: Props) {
186182
parsingPluginList: [loadingCursorPlugin, esqlLanguagePlugin, ...parsingPlugins],
187183
processingPluginList: processingPlugins,
188184
};
189-
}, [loading]);
185+
}, [loading, onActionClick]);
190186

191187
return (
192188
<EuiText size="s" className={containerClassName}>

0 commit comments

Comments
 (0)