From 310ca7cb2356a6cbfe0b45bc1faa7978a52417cd Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Tue, 7 Oct 2025 17:48:15 +0700 Subject: [PATCH 1/2] chore: create message_sent event to track model provider and id model --- web-app/src/containers/ChatInput.tsx | 146 +++++++++++++++------------ 1 file changed, 81 insertions(+), 65 deletions(-) diff --git a/web-app/src/containers/ChatInput.tsx b/web-app/src/containers/ChatInput.tsx index 95bdc9b39..b3ac0ab73 100644 --- a/web-app/src/containers/ChatInput.tsx +++ b/web-app/src/containers/ChatInput.tsx @@ -40,6 +40,8 @@ import { useShallow } from 'zustand/react/shallow' import { McpExtensionToolLoader } from './McpExtensionToolLoader' import { ExtensionTypeEnum, MCPExtension } from '@janhq/core' import { ExtensionManager } from '@/lib/extension' +import { useAnalytic } from '@/hooks/useAnalytic' +import posthog from 'posthog-js' type ChatInputProps = { className?: string @@ -88,6 +90,7 @@ const ChatInput = ({ const selectedModel = useModelProvider((state) => state.selectedModel) const selectedProvider = useModelProvider((state) => state.selectedProvider) const sendMessage = useChat() + const { productAnalytic } = useAnalytic() const [message, setMessage] = useState('') const [dropdownToolsAvailable, setDropdownToolsAvailable] = useState(false) const [tooltipToolsAvailable, setTooltipToolsAvailable] = useState(false) @@ -176,7 +179,6 @@ const ChatInput = ({ const mcpExtension = extensionManager.get(ExtensionTypeEnum.MCP) const MCPToolComponent = mcpExtension?.getToolComponent?.() - const handleSendMesage = async (prompt: string) => { if (!selectedModel) { setMessage('Please select a model to start chatting.') @@ -186,6 +188,19 @@ const ChatInput = ({ return } setMessage('') + + // Track message send event with PostHog (only if product analytics is enabled) + if (productAnalytic && selectedModel && selectedProvider) { + try { + posthog.capture('message_sent', { + model_provider: selectedProvider, + model_id: selectedModel.id, + }) + } catch (error) { + console.debug('Failed to track message send event:', error) + } + } + sendMessage( prompt, true, @@ -703,74 +718,75 @@ const ChatInput = ({ )} {selectedModel?.capabilities?.includes('tools') && - hasActiveMCPServers && ( - MCPToolComponent ? ( - // Use custom MCP component - - ) : ( - // Use default tools dropdown - - + ) : ( + // Use default tools dropdown + + + - { + setDropdownToolsAvailable(false) + e.stopPropagation() + }} > -
{ - setDropdownToolsAvailable(false) - e.stopPropagation() + { + setDropdownToolsAvailable(isOpen) + if (isOpen) { + setTooltipToolsAvailable(false) + } }} > - { - setDropdownToolsAvailable(isOpen) - if (isOpen) { - setTooltipToolsAvailable(false) - } - }} - > - {(isOpen, toolsCount) => { - return ( -
- - {toolsCount > 0 && ( -
- - {toolsCount > 99 ? '99+' : toolsCount} - -
- )} -
- ) - }} -
-
-
- -

{t('tools')}

-
-
-
- ) - )} + {(isOpen, toolsCount) => { + return ( +
+ + {toolsCount > 0 && ( +
+ + {toolsCount > 99 ? '99+' : toolsCount} + +
+ )} +
+ ) + }} + + + + +

{t('tools')}

+
+
+
+ ))} {selectedModel?.capabilities?.includes('web_search') && ( From 7d615b416368036d55bb1388a8cd801d5bbbfbe5 Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Tue, 7 Oct 2025 18:10:25 +0700 Subject: [PATCH 2/2] chore: type fixed --- web-app/src/containers/ChatInput.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web-app/src/containers/ChatInput.tsx b/web-app/src/containers/ChatInput.tsx index b3ac0ab73..e2d3ce783 100644 --- a/web-app/src/containers/ChatInput.tsx +++ b/web-app/src/containers/ChatInput.tsx @@ -179,7 +179,7 @@ const ChatInput = ({ const mcpExtension = extensionManager.get(ExtensionTypeEnum.MCP) const MCPToolComponent = mcpExtension?.getToolComponent?.() - const handleSendMesage = async (prompt: string) => { + const handleSendMessage = async (prompt: string) => { if (!selectedModel) { setMessage('Please select a model to start chatting.') return @@ -630,7 +630,7 @@ const ChatInput = ({ ) { e.preventDefault() // Submit the message when Enter is pressed without Shift - handleSendMesage(prompt) + handleSendMessage(prompt) // When Shift+Enter is pressed, a new line is added (default behavior) } }} @@ -859,7 +859,7 @@ const ChatInput = ({ size="icon" disabled={!prompt.trim() && uploadedFiles.length === 0} data-test-id="send-message-button" - onClick={() => handleSendMesage(prompt)} + onClick={() => handleSendMessage(prompt)} > {streamingContent ? (