diff --git a/x-pack/platform/packages/shared/kbn-ai-assistant/src/chat/chat_body.tsx b/x-pack/platform/packages/shared/kbn-ai-assistant/src/chat/chat_body.tsx index 8dedc7d77c600..eb4adcb13bde9 100644 --- a/x-pack/platform/packages/shared/kbn-ai-assistant/src/chat/chat_body.tsx +++ b/x-pack/platform/packages/shared/kbn-ai-assistant/src/chat/chat_body.tsx @@ -290,24 +290,35 @@ export function ChatBody({ ({ message, payload }: { message: Message; payload: ChatActionClickPayload }) => { setStickToBottom(true); switch (payload.type) { - case ChatActionClickType.executeEsqlQuery: + case ChatActionClickType.executeEsqlQuery: { + const now = new Date().toISOString(); next( - messages.concat({ - '@timestamp': new Date().toISOString(), - message: { - role: MessageRole.Assistant, - content: '', - function_call: { - name: 'execute_query', - arguments: JSON.stringify({ - query: payload.query, - }), - trigger: MessageRole.User, + messages.concat([ + { + '@timestamp': now, + message: { + role: MessageRole.User, + content: `Display results for the following ES|QL query:\n\n\`\`\`esql\n${payload.query}\n\`\`\``, }, }, - }) + { + '@timestamp': now, + message: { + role: MessageRole.Assistant, + content: '', + function_call: { + name: 'execute_query', + arguments: JSON.stringify({ + query: payload.query, + }), + trigger: MessageRole.User, + }, + }, + }, + ]) ); break; + } case ChatActionClickType.updateVisualization: const visualizeQueryResponse = message; @@ -331,25 +342,36 @@ export function ChatBody({ }) ); break; - case ChatActionClickType.visualizeEsqlQuery: + case ChatActionClickType.visualizeEsqlQuery: { + const now = new Date().toISOString(); next( - messages.concat({ - '@timestamp': new Date().toISOString(), - message: { - role: MessageRole.Assistant, - content: '', - function_call: { - name: 'visualize_query', - arguments: JSON.stringify({ - query: payload.query, - intention: VisualizeESQLUserIntention.visualizeAuto, - }), - trigger: MessageRole.User, + messages.concat([ + { + '@timestamp': now, + message: { + role: MessageRole.User, + content: `Visualize the following ES|QL query:\n\n\`\`\`esql\n${payload.query}\n\`\`\``, }, }, - }) + { + '@timestamp': now, + message: { + role: MessageRole.Assistant, + content: '', + function_call: { + name: 'visualize_query', + arguments: JSON.stringify({ + query: payload.query, + intention: VisualizeESQLUserIntention.visualizeAuto, + }), + trigger: MessageRole.User, + }, + }, + }, + ]) ); break; + } } }, [messages, next] diff --git a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/visualize_esql.ts b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/visualize_esql.ts index e7a4e8c0dc029..c96db9a713288 100644 --- a/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/visualize_esql.ts +++ b/x-pack/solutions/observability/plugins/observability_ai_assistant_app/server/functions/visualize_esql.ts @@ -21,10 +21,20 @@ const getMessageForLLM = ( if (hasErrors) { return 'The query has syntax errors'; } - return intention === VisualizeESQLUserIntention.executeAndReturnResults || + + if ( + intention === VisualizeESQLUserIntention.executeAndReturnResults || intention === VisualizeESQLUserIntention.generateQueryOnly - ? 'These results are not visualized' - : 'Only following query is visualized: ```esql\n' + query + '\n```'; + ) { + return 'These results are not visualized.'; + } + + // This message is added to avoid the model echoing the full ES|QL query back to the user. + // The UI already shows the chart. + return `Only the following query is visualized: \`\`\`esql\n' + ${query} + '\n\`\`\`\n + If the query is visualized once, don't attempt to visualize the same query again immediately. + After calling visualize_query you are done - **do NOT repeat the ES|QL query or add any further + explanation unless the user explicitly asks for it again.** Mention that the query is visualized.`; }; export function registerVisualizeESQLFunction({