package com.suno.android.common_analytics.orpheus import com.suno.android.common_analytics.ElementType import com.suno.android.common_core_utils.Id import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable /** * Analytics event for Orpheus interactions. */ @Serializable data class OrpheusAnalyticsEvent( @SerialName("actionName") val actionName: String, @SerialName("userId") val userId: String, @SerialName("elementType") val elementType: ElementType, @SerialName("context") val metadata: OrpheusAnalyticsMetadata, ) /** * Metadata for Orpheus analytics events. * * Common fields: * - sessionId: The analytics session ID [OrpheusAnalyticsSession] * - timestamp: ISO 8601 formatted timestamp * - platform: Platform identifier (e.g., "android") * * Optional fields (depending on event): * - chatId: The chat/conversation ID [OrpheusSession] * - messageId: The message ID being tracked * - precedingMessageId: User's message ID that prompted a response */ typealias OrpheusAnalyticsMetadata = Map /** * Actions that can be tracked for Orpheus analytics. */ enum class OrpheusAnalyticsAction( val actionName: String, ) { CreateSessionOpened("createSessionOpened"), CreateSessionClosed("createSessionClosed"), SwitchFromOrpheusToCustomMode("switchFromOrpheusToCustomMode"), SwitchFromCustomToOrpheusMode("switchFromCustomToOrpheusMode"), OrpheusMessageSendTime("orpheusMessageSendTime"), OrpheusMessageBeginResponseTime("orpheusMessageBeginResponseTime"), OrpheusMessageEndResponseTime("orpheusMessageEndResponseTime"), } /** * An Orpheus session as defined for analytics/logging. A unique session encompasses the opening of the Orpheus Create * screen, to closing the screen – this is meant to be a user's session using Orpheus. * * Confusingly, [OrpheusSession] in the non-analytics code is what we log as `chat_id`. :not-like-this: */ data class OrpheusAnalyticsSession( val sessionId: Id, )