From d5fbe445e1fbcffc869861ed8ee8319e60605881 Mon Sep 17 00:00:00 2001 From: tinkle-community Date: Mon, 16 Mar 2026 15:19:49 +0800 Subject: [PATCH] feat: add channel dimension to GA4 AI usage tracking Distinguish claw402, blockrun, and native direct API calls in telemetry. --- config/config.go | 1 + mcp/client.go | 15 ++++++++++++++- telemetry/experience.go | 2 ++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/config/config.go b/config/config.go index 1332ab3c..e43b54eb 100644 --- a/config/config.go +++ b/config/config.go @@ -129,6 +129,7 @@ func Init() { telemetry.TrackAIUsage(telemetry.AIUsageEvent{ ModelProvider: usage.Provider, ModelName: usage.Model, + Channel: usage.Channel(), InputTokens: usage.PromptTokens, OutputTokens: usage.CompletionTokens, }) diff --git a/mcp/client.go b/mcp/client.go index b8b4f750..e914c79e 100644 --- a/mcp/client.go +++ b/mcp/client.go @@ -44,13 +44,26 @@ var ( // TokenUsage represents token usage from AI API response type TokenUsage struct { - Provider string + Provider string // payment channel: "claw402", "blockrun-base", "blockrun-sol", or native provider name Model string PromptTokens int CompletionTokens int TotalTokens int } +// Channel returns the payment channel category for telemetry. +// Returns "claw402", "blockrun", or "native" based on the provider. +func (u TokenUsage) Channel() string { + switch u.Provider { + case ProviderClaw402: + return "claw402" + case ProviderBlockRunBase, ProviderBlockRunSol: + return "blockrun" + default: + return "native" + } +} + // Client AI API configuration type Client struct { Provider string diff --git a/telemetry/experience.go b/telemetry/experience.go index 69f57c37..8fae9d79 100644 --- a/telemetry/experience.go +++ b/telemetry/experience.go @@ -42,6 +42,7 @@ type AIUsageEvent struct { TraderID string ModelProvider string // openai, deepseek, anthropic, etc. ModelName string // gpt-4o, deepseek-chat, claude-3, etc. + Channel string // payment channel: "claw402", "blockrun", or "native" InputTokens int OutputTokens int } @@ -214,6 +215,7 @@ func TrackAIUsage(event AIUsageEvent) { Params: map[string]interface{}{ "model_provider": event.ModelProvider, "model_name": event.ModelName, + "channel": event.Channel, "input_tokens": event.InputTokens, "output_tokens": event.OutputTokens, "total_tokens": event.InputTokens + event.OutputTokens,