diff --git a/src/routes/v2/shared/components/AiChat/AiChatContent.tsx b/src/routes/v2/shared/components/AiChat/AiChatContent.tsx index 34223658d..5362b4842 100644 --- a/src/routes/v2/shared/components/AiChat/AiChatContent.tsx +++ b/src/routes/v2/shared/components/AiChat/AiChatContent.tsx @@ -10,6 +10,7 @@ import { Icon } from "@/components/ui/icon"; import { BlockStack, InlineStack } from "@/components/ui/layout"; import { useAiProviderSettings } from "@/hooks/useAiProviderSettings"; import useToastNotification from "@/hooks/useToastNotification"; +import { useAnalytics } from "@/providers/AnalyticsProvider"; import { useBackend } from "@/providers/BackendProvider"; import { useSharedStores } from "@/routes/v2/shared/store/SharedStoreContext"; import { fetchPipelineRuns } from "@/services/pipelineRunService"; @@ -50,6 +51,7 @@ export const AiChatContent = observer(function AiChatContent({ }: AiChatContentProps) { const aiChat = useAiChatStore(); const notify = useToastNotification(); + const { track } = useAnalytics(); const { navigation } = useSharedStores(); const { backendUrl } = useBackend(); const authStorage = useAuthLocalStorage(); @@ -103,17 +105,30 @@ export const AiChatContent = observer(function AiChatContent({ const thread = aiChat.activeThread; - function handleSend(prompt: string) { + async function handleSend(prompt: string) { if (!thread) return; const recentRuns = recentRunsData ? projectRecentRuns(recentRunsData) : undefined; - thread.sendMessage(prompt, { + + track("ai_assistant.message.submitted", { + prompt, + thread_message_count: thread.messages.length, + }); + + await thread.sendMessage(prompt, { onError: (msg) => notify(msg, "error"), bridge, aiConfig, ...(recentRuns && { recentRuns }), }); + + if (thread.messages[thread.messages.length - 1]?.role === "assistant") { + track("ai_assistant.response.received", { + prompt, + thread_message_count: thread.messages.length, + }); + } } if (!isAiConfigured) { diff --git a/src/routes/v2/shared/components/AiChat/agentThread.ts b/src/routes/v2/shared/components/AiChat/agentThread.ts index 8b18419e6..da1eaeb57 100644 --- a/src/routes/v2/shared/components/AiChat/agentThread.ts +++ b/src/routes/v2/shared/components/AiChat/agentThread.ts @@ -104,6 +104,7 @@ export class AgentThread { id: generateMessageId(), role: "assistant", content: response.answer, + prompt, ...(Object.keys(componentReferences).length > 0 ? { componentReferences } : {}), diff --git a/src/routes/v2/shared/components/AiChat/components/ChatMessage.tsx b/src/routes/v2/shared/components/AiChat/components/ChatMessage.tsx index b32383cec..9376107c6 100644 --- a/src/routes/v2/shared/components/AiChat/components/ChatMessage.tsx +++ b/src/routes/v2/shared/components/AiChat/components/ChatMessage.tsx @@ -3,6 +3,7 @@ import type { ChatMessage as ChatMessageType } from "@/routes/v2/shared/componen import { MessageBubble } from "./MessageBubble"; import { renderMarkdown } from "./renderMarkdown"; +import { ResponseFeedback } from "./ResponseFeedback"; interface ChatMessageProps { message: ChatMessageType; @@ -18,9 +19,12 @@ export function ChatMessage({ message }: ChatMessageProps) { {message.content} ) : ( -