| 18 | type usageQueuePlugin struct{} |
| 19 | |
| 20 | func (p *usageQueuePlugin) HandleUsage(ctx context.Context, record coreusage.Record) { |
| 21 | if p == nil { |
| 22 | return |
| 23 | } |
| 24 | if !Enabled() || !UsageStatisticsEnabled() { |
| 25 | return |
| 26 | } |
| 27 | |
| 28 | timestamp := record.RequestedAt |
| 29 | if timestamp.IsZero() { |
| 30 | timestamp = time.Now() |
| 31 | } |
| 32 | |
| 33 | modelName := strings.TrimSpace(record.Model) |
| 34 | if modelName == "" { |
| 35 | modelName = "unknown" |
| 36 | } |
| 37 | aliasName := strings.TrimSpace(record.Alias) |
| 38 | if aliasName == "" { |
| 39 | aliasName = modelName |
| 40 | } |
| 41 | provider := strings.TrimSpace(record.Provider) |
| 42 | if provider == "" { |
| 43 | provider = "unknown" |
| 44 | } |
| 45 | executorType := strings.TrimSpace(record.ExecutorType) |
| 46 | if executorType == "" { |
| 47 | executorType = "unknown" |
| 48 | } |
| 49 | authType := strings.TrimSpace(record.AuthType) |
| 50 | if authType == "" { |
| 51 | authType = "unknown" |
| 52 | } |
| 53 | apiKey := strings.TrimSpace(record.APIKey) |
| 54 | requestID := strings.TrimSpace(internallogging.GetRequestID(ctx)) |
| 55 | reasoningEffort := strings.TrimSpace(record.ReasoningEffort) |
| 56 | if reasoningEffort == "" { |
| 57 | reasoningEffort = coreusage.ReasoningEffortFromContext(ctx) |
| 58 | } |
| 59 | serviceTier := strings.TrimSpace(record.ServiceTier) |
| 60 | if serviceTier == "" { |
| 61 | serviceTier = coreusage.ServiceTierFromContext(ctx) |
| 62 | } |
| 63 | |
| 64 | tokens := tokenStats{ |
| 65 | InputTokens: record.Detail.InputTokens, |
| 66 | OutputTokens: record.Detail.OutputTokens, |
| 67 | ReasoningTokens: record.Detail.ReasoningTokens, |
| 68 | CachedTokens: record.Detail.CachedTokens, |
| 69 | CacheReadTokens: record.Detail.CacheReadTokens, |
| 70 | CacheCreationTokens: record.Detail.CacheCreationTokens, |
| 71 | TotalTokens: record.Detail.TotalTokens, |
| 72 | } |
| 73 | if tokens.TotalTokens == 0 { |
| 74 | tokens.TotalTokens = tokens.InputTokens + tokens.OutputTokens + tokens.ReasoningTokens |
| 75 | } |
| 76 | if tokens.TotalTokens == 0 { |
| 77 | tokens.TotalTokens = tokens.InputTokens + tokens.OutputTokens + tokens.ReasoningTokens + tokens.CachedTokens |