version: 2

models:
  - name: fact_studio_user_sessions
    description: |
      Aggregated user session metrics and analytics from Studio interactions.
      This model provides session-level insights including duration, project interactions,
      clip creation, downloads, exports, playback, and satisfaction indicators.
      Sessions are defined by 30-minute gaps of inactivity between Studio "use" events.
    config:
      group: create
    meta:
      dagster:
        partitions_def:
          type: daily
          start_date: "{{ var('studio_project_start_date') }}"
          end_offset: 0
        partition_mappings:
          - asset_key: ['prod_int', 'int_studio__events_with_sessions']
            type: last
        automation_condition: daily_cron_with_eager_historical_backfill_condition
        backfill_policy:
          max_partitions_per_run: -1
    columns:
      - name: user_session_id
        description: Unique identifier for the user session (MD5 hash of user_id and session_number)
        tests:
          - not_null
          - unique
      - name: user_id
        description: User ID who initiated the session
        tests:
          - not_null
      - name: user_uid
        description: User UID from dim_user table (alternative user ID in UUID format)
      - name: p_date
        description: Date partition for data organization
      - name: p_hour
        description: Hour partition for data organization
      - name: start_timestamp_utc
        description: Timestamp when the session began (first Studio "use" event)
        tests:
          - not_null
      - name: end_timestamp_utc
        description: Timestamp when the session ended (last event + 30 minute timeout)
        tests:
          - not_null
      - name: last_event_timestamp_utc
        description: Timestamp of the last Studio event in the session
      - name: session_duration_seconds
        description: Total duration of the session in seconds
      - name: session_started_reason
        description: Array of NavigatedToStudio event context trigger values (how user entered Studio)
      #- name: session_type
      #  description: Classification of session type (currently NULL, to be implemented)
      - name: play_duration_total_seconds
        description: Total play duration in seconds from web_audio_player_actions
      - name: play_duration_sidebars_seconds
        description: Play duration in seconds for sidebars (context_type = 'studio_new_preview')
      - name: play_duration_timeline_seconds
        description: Play duration in seconds for timeline (context_type = 'studio_new_timeline')
      - name: n_projects_created
        description: Number of Studio projects created during the session (StudioProjectCreate + StudioProjectClone)
      - name: n_projects_opened
        description: Number of Studio projects opened during the session
      - name: n_projects_opened_not_owned
        description: Number of Studio projects opened that are not owned by the user
      - name: studio_project_ids_opened
        description: Array of Studio project IDs opened during the session
      - name: n_clips_total
        description: Total number of distinct clips made inside studio from CreateSong events
      - name: n_clips_non_stem
        description: Number of non-stem clips (CreateSong events with <= 2 clip_ids)
      - name: n_clips_stem
        description: Number of stem clips (CreateSong events with > 2 clip_ids)
      - name: clips_made_by_task
        description: Object with counts broken out by model task (stem_condition, cover_stem_condition, infill, stem_condition_infill)
      - name: clicks_create_timeline
        description: Number of clicks on StudioContextualGenerateClicked
      - name: clicks_create_timeline_by_mode
        description: Object with clicks broken down by contextualGenerateMode
      - name: clicks_create_custom_form
        description: Number of clicks on StudioCreateFormGenerateClicked
      - name: clicks_extract_stem
        description: Number of CreateSong events with > 2 clip_ids (stem extraction)
      - name: single_clip_downloads
        description: Sum of downloads for non-stem clips (from clip_initial_metrics)
      - name: stem_clip_downloads
        description: Sum of downloads for stem clips (from clip_initial_metrics)
      - name: audio_uploads
        description: Object with total count and upload_type keys (e.g., total, file_upload, audio_recording)
      - name: clips_imported
        description: Object with import metrics including total, stem, upload, record, complete_song, and other counts
      - name: median_time_between_imports_seconds
        description: Median time in seconds between clip imports during the session
      - name: max_time_between_imports_seconds
        description: Maximum time in seconds between clip imports during the session
      - name: time_to_first_import_seconds
        description: Time in seconds from session start to first clip import
      - name: n_exported_clips
        description: Number of clips exported from Studio during the session
      - name: is_session_satisfactory
        description: Boolean indicating if session is satisfactory (exported a clip OR downloaded single clip/multi-track/midi)
      - name: made_actions_but_never_played_timeline
        description: Boolean indicating if user made actions but never played timeline
      - name: clips_created_and_never_played
        description: Boolean indicating if clips were created but never played
      - name: studio_autosaving_last_context
        description: Context from the last StudioAutosaving event in the session, describing project state

  - name: fact_orpheus_user_sessions
    description: |
      Aggregated user session metrics and analytics from Orpheus message interactions.
      This model provides session-level insights including duration, message counts,
      tool usage patterns, creation metrics, and user satisfaction indicators.
      Sessions are defined by 30-minute gaps between user messages (see is_new_session).
    config:
      group: create
      tags:
        [
          "partition_type=hourly",
          "automation_condition=hourly_cron_with_eager_historical_backfill_condition",
        ]
    meta:
      dagster:
        partition_start_date: "2025-10-06" # Matches ORPHEUS_PROJECT_START_DATE
        partition_start_hour: 16
        end_offset: -3
        backfill_policy:
          max_partitions_per_run: -1
    columns:
      - name: user_session_id
        description: Unique identifier for the user session (MD5 hash of user_id and session_number)
        tests:
          - not_null
      - name: user_id
        description: User ID who initiated the session
        tests:
          - not_null
      - name: user_uid
        description: User UID from dim_user table (alternative user ID in UUID format)
      - name: clerk_id
        description: Clerk ID from the original data (external authentication ID)
      - name: session_number
        description: Sequential session number for the user across all their interactions
      - name: p_date
        description: Date partition for data organization
      - name: p_hour
        description: Hour partition for data organization
      - name: session_start_time
        description: Timestamp when the session began (first message)
      - name: session_end_time
        description: Timestamp when the session ended (last message + session timeout)
      - name: session_duration_seconds
        description: Total duration of the session in seconds
      - name: median_time_between_messages_in_seconds
        description: Median time between user messages across all chats in the session
      - name: median_time_orpheus_answered_message_in_seconds
        description: Median response time for Orpheus chat messages in the session
      - name: chat_session_ids
        description: Array of distinct chat session IDs within this user session
      - name: chat_sessions_count
        description: Number of distinct chat sessions within this user session
      - name: median_messages_in_chat
        description: Median number of messages per chat within the session
      - name: messages_metrics
        description: JSON object containing aggregated message counts by type
      - name: number_of_no_answered_messages
        description: Number of user messages that were the last in their chat (unanswered)
      - name: number_of_annoyed_messages_heuristic
        description: Number of messages indicating potential user frustration
      - name: clipids_created
        description: Flattened array of all clip IDs created during the session
      - name: clips_created_count
        description: Total number of clips created during the session
      - name: images_url_created
        description: Flattened array of all image URLs created during the session
      - name: images_created_count
        description: Total number of images created during the session
      - name: median_time_between_tool_calls_in_seconds
        description: Median time between tool calls in the session
      - name: distinct_tools_used
        description: Number of distinct tool types used in the session
      - name: tools_used
        description: Array of distinct tool names used in the session
      - name: total_not_simple_message_tool_calls
        description: Total number of tool calls excluding simple_message type
      - name: first_message_number_with_tool_call
        description: Message number of the first tool call in the session
      - name: tool_call_metrics
        description: JSON array containing tool call names and their usage counts for the session
      - name: played_clip_ids_orpheus
        description: Array of distinct clip IDs played during the session (Orpheus context or created clips)
      - name: number_of_songs_played_orpheus
        description: Number of distinct songs played during the session (Orpheus context or created clips)
      - name: number_of_plays_orpheus
        description: Total number of plays during the session (Orpheus context or created clips)
      - name: total_play_duration_seconds_orpheus
        description: Total play duration in seconds for Orpheus-related plays
      - name: median_unique_play_percent_orpheus
        description: Median unique play percentage for Orpheus-related plays
      - name: played_clip_ids_non_orpheus
        description: Array of distinct clip IDs played during the session (non-Orpheus context)
      - name: number_of_songs_played_non_orpheus
        description: Number of distinct songs played during the session (non-Orpheus context)
      - name: number_of_plays_non_orpheus
        description: Total number of plays during the session (non-Orpheus context)
      - name: total_play_duration_seconds_non_orpheus
        description: Total play duration in seconds for non-Orpheus plays
      - name: median_unique_play_percent_non_orpheus
        description: Median unique play percentage for non-Orpheus plays
      - name: total_likes
        description: Total likes across all clips created in the session
      - name: total_shares
        description: Total shares across all clips created in the session
      - name: total_downloads
        description: Total downloads across all clips created in the session
      - name: total_public_toggles
        description: Total public toggle events across all clips created in the session
      - name: total_positive_interactions
        description: Total positive interactions across all clips created in the session
      - name: total_dislikes
        description: Total dislikes across all clips created in the session
      - name: clips_satisfied_count
        description: Number of clips that are satisfactory overall
      - name: clips_satisfied_direct_count
        description: Number of clips that are satisfactory based on direct metrics
      - name: clips_satisfied_indirect_count
        description: Number of clips that are satisfactory based on indirect metrics
      - name: number_of_switches_to_custom
        description: Number of times user switched to custom mode
      - name: user_joined_at
        description: Timestamp when the user joined (from dim_user)
      - name: has_active_subscription
        description: Boolean indicating if user has active subscription (from dim_user)
      - name: current_subscription_tier
        description: Current subscription tier (from dim_user)
      - name: recent_country
        description: User's recent country (from dim_user)

