diff --git a/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts b/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts index f4d7a63dfa..b2d43f4c1e 100644 --- a/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts +++ b/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts @@ -338,6 +338,14 @@ export class MixpanelTelemetryProvider implements TelemetryProvider { this.trackEvent(TelemetryEvents.RUN_BUTTON_CLICKED, runButtonProperties) } + trackRunTriggeredViaKeybinding(): void { + this.trackEvent(TelemetryEvents.RUN_TRIGGERED_KEYBINDING) + } + + trackRunTriggeredViaMenu(): void { + this.trackEvent(TelemetryEvents.RUN_TRIGGERED_MENU) + } + trackSurvey( stage: 'opened' | 'submitted', responses?: SurveyResponses diff --git a/src/platform/telemetry/types.ts b/src/platform/telemetry/types.ts index 7823791e14..765711b117 100644 --- a/src/platform/telemetry/types.ts +++ b/src/platform/telemetry/types.ts @@ -206,6 +206,8 @@ export interface TelemetryProvider { trackAddApiCreditButtonClicked(): void trackApiCreditTopupButtonPurchaseClicked(amount: number): void trackRunButton(options?: { subscribe_to_run?: boolean }): void + trackRunTriggeredViaKeybinding(): void + trackRunTriggeredViaMenu(): void // Survey flow events trackSurvey(stage: 'opened' | 'submitted', responses?: SurveyResponses): void @@ -256,6 +258,8 @@ export const TelemetryEvents = { // Subscription Flow RUN_BUTTON_CLICKED: 'app:run_button_click', + RUN_TRIGGERED_KEYBINDING: 'app:run_triggered_keybinding', + RUN_TRIGGERED_MENU: 'app:run_triggered_menu', SUBSCRIPTION_REQUIRED_MODAL_OPENED: 'app:subscription_required_modal_opened', SUBSCRIBE_NOW_BUTTON_CLICKED: 'app:subscribe_now_button_clicked', MONTHLY_SUBSCRIPTION_SUCCEEDED: 'app:monthly_subscription_succeeded', diff --git a/src/scripts/ui.ts b/src/scripts/ui.ts index 0c2b3534c1..8693706095 100644 --- a/src/scripts/ui.ts +++ b/src/scripts/ui.ts @@ -1,4 +1,6 @@ +import { isCloud } from '@/platform/distribution/types' import { useSettingStore } from '@/platform/settings/settingStore' +import { useTelemetry } from '@/platform/telemetry' import { WORKFLOW_ACCEPT_STRING } from '@/platform/workflow/core/types/formats' import { type StatusWsMessageStatus, type TaskItem } from '@/schemas/apiSchema' import { useDialogService } from '@/services/dialogService' @@ -476,7 +478,12 @@ export class ComfyUI { $el('button.comfy-queue-btn', { id: 'queue-button', textContent: 'Queue Prompt', - onclick: () => app.queuePrompt(0, this.batchCount) + onclick: () => { + if (isCloud) { + useTelemetry()?.trackRunTriggeredViaMenu() + } + app.queuePrompt(0, this.batchCount) + } }), $el('div', {}, [ $el('label', { innerHTML: 'Extra options' }, [ @@ -578,7 +585,12 @@ export class ComfyUI { $el('button', { id: 'queue-front-button', textContent: 'Queue Front', - onclick: () => app.queuePrompt(-1, this.batchCount) + onclick: () => { + if (isCloud) { + useTelemetry()?.trackRunTriggeredViaMenu() + } + app.queuePrompt(-1, this.batchCount) + } }), $el('button', { $: (b) => (this.queue.button = b as HTMLButtonElement), diff --git a/src/services/keybindingService.ts b/src/services/keybindingService.ts index ed50492467..fff58fa573 100644 --- a/src/services/keybindingService.ts +++ b/src/services/keybindingService.ts @@ -1,5 +1,7 @@ import { CORE_KEYBINDINGS } from '@/constants/coreKeybindings' +import { isCloud } from '@/platform/distribution/types' import { useSettingStore } from '@/platform/settings/settingStore' +import { useTelemetry } from '@/platform/telemetry' import { app } from '@/scripts/app' import { useCommandStore } from '@/stores/commandStore' import { useDialogStore } from '@/stores/dialogStore' @@ -64,6 +66,14 @@ export const useKeybindingService = () => { // Prevent default browser behavior first, then execute the command event.preventDefault() + if ( + isCloud && + (keybinding.commandId === 'Comfy.QueuePrompt' || + keybinding.commandId === 'Comfy.QueuePromptFront' || + keybinding.commandId === 'Comfy.QueueSelectedOutputNodes') + ) { + useTelemetry()?.trackRunTriggeredViaKeybinding() + } await commandStore.execute(keybinding.commandId) return } diff --git a/src/stores/menuItemStore.ts b/src/stores/menuItemStore.ts index 0a24769a1d..242e4641c5 100644 --- a/src/stores/menuItemStore.ts +++ b/src/stores/menuItemStore.ts @@ -3,6 +3,8 @@ import type { MenuItem } from 'primevue/menuitem' import { ref } from 'vue' import { CORE_MENU_COMMANDS } from '@/constants/coreMenuCommands' +import { isCloud } from '@/platform/distribution/types' +import { useTelemetry } from '@/platform/telemetry' import type { ComfyExtension } from '@/types/comfy' import { useCommandStore } from './commandStore' @@ -62,7 +64,17 @@ export const useMenuItemStore = defineStore('menuItem', () => { .map( (command) => ({ - command: () => commandStore.execute(command.id), + command: () => { + if ( + isCloud && + (command.id === 'Comfy.QueuePrompt' || + command.id === 'Comfy.QueuePromptFront' || + command.id === 'Comfy.QueueSelectedOutputNodes') + ) { + useTelemetry()?.trackRunTriggeredViaMenu() + } + return commandStore.execute(command.id) + }, label: command.menubarLabel, icon: command.icon, tooltip: command.tooltip,