| 92 | } |
| 93 | |
| 94 | func (r *SQLiteRecorder) RecordTokenUsage(ctx context.Context, req *aibridge.TokenUsageRecord) error { |
| 95 | // Build metadata, merging extra token types. |
| 96 | merged := make(map[string]any) |
| 97 | for k, v := range req.Metadata { |
| 98 | merged[k] = v |
| 99 | } |
| 100 | for k, v := range req.ExtraTokenTypes { |
| 101 | merged[k] = v |
| 102 | } |
| 103 | metadata, _ := json.Marshal(merged) |
| 104 | |
| 105 | _, err := r.stmtInsertTokenUsage.ExecContext(ctx, |
| 106 | uuid.NewString(), req.InterceptionID, req.MsgID, req.Input, req.Output, req.CacheReadInputTokens, req.CacheWriteInputTokens, string(metadata), req.CreatedAt, |
| 107 | ) |
| 108 | if err != nil { |
| 109 | r.logger.Warn(ctx, "failed to record token usage", slog.Error(err)) |
| 110 | } |
| 111 | return err |
| 112 | } |
| 113 | |
| 114 | func (r *SQLiteRecorder) RecordPromptUsage(ctx context.Context, req *aibridge.PromptUsageRecord) error { |
| 115 | metadata, _ := json.Marshal(req.Metadata) |