From f4560c2292a7d1e60b29c1be480874ad17f891d2 Mon Sep 17 00:00:00 2001 From: Rafael dos Santos Silva Date: Wed, 26 Nov 2025 12:24:07 -0300 Subject: [PATCH] PERF: Migrate AI usage report to use AiApiRequestStat for better perf (#31) Changes the AiUsage report to query AiApiRequestStat instead of AiApiAuditLog for significantly improved query performance. --- .../discourse_rewind/action/ai_usage.rb | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/app/services/discourse_rewind/action/ai_usage.rb b/app/services/discourse_rewind/action/ai_usage.rb index 3e4880c..654980f 100644 --- a/app/services/discourse_rewind/action/ai_usage.rb +++ b/app/services/discourse_rewind/action/ai_usage.rb @@ -2,21 +2,22 @@ # AI usage statistics from discourse-ai plugin # Shows total usage, favorite features, token consumption, etc. +# Uses AiApiRequestStat for efficient aggregation queries module DiscourseRewind module Action class AiUsage < BaseReport def call return if !enabled? - base_query = AiApiAuditLog.where(user_id: user.id).where(created_at: date) + base_query = AiApiRequestStat.where(user_id: user.id).where(bucket_date: date) # Get aggregated stats in a single query stats = base_query.select( - "COUNT(*) as total_requests", + "COALESCE(SUM(usage_count), 0) as total_requests", "COALESCE(SUM(request_tokens), 0) as total_request_tokens", "COALESCE(SUM(response_tokens), 0) as total_response_tokens", - "COUNT(CASE WHEN response_tokens > 0 THEN 1 END) as successful_requests", + "COALESCE(SUM(CASE WHEN response_tokens > 0 THEN usage_count ELSE 0 END), 0) as successful_requests", ).take return if stats.total_requests == 0 @@ -35,9 +36,9 @@ module DiscourseRewind feature_usage = base_query .group(:feature_name) - .order("COUNT(*) DESC") + .order("SUM(usage_count) DESC") .limit(5) - .pluck(:feature_name, Arel.sql("COUNT(*)")) + .pluck(:feature_name, Arel.sql("SUM(usage_count)")) .to_h # Most used AI model (top 5) @@ -45,9 +46,9 @@ module DiscourseRewind base_query .where.not(language_model: nil) .group(:language_model) - .order("COUNT(*) DESC") + .order("SUM(usage_count) DESC") .limit(5) - .pluck(:language_model, Arel.sql("COUNT(*)")) + .pluck(:language_model, Arel.sql("SUM(usage_count)")) .to_h { @@ -65,7 +66,7 @@ module DiscourseRewind end def enabled? - defined?(AiApiAuditLog) && SiteSetting.discourse_ai_enabled + defined?(AiApiRequestStat) && SiteSetting.discourse_ai_enabled end end end