diff --git a/apps/api/src/lib/storage/serialization.ts b/apps/api/src/lib/storage/serialization.ts index 50b21fe..745f865 100644 --- a/apps/api/src/lib/storage/serialization.ts +++ b/apps/api/src/lib/storage/serialization.ts @@ -1,6 +1,7 @@ import type { AnalyticsSummary, ExecutionFallbackReason, + LatencyBucket, PaymentAttempt, QueryMode, UsageEvent @@ -14,6 +15,18 @@ function emptySpendByCategory(): Record { return { search: 0, news: 0, scrape: 0 }; } +function emptyLatencyBuckets(): Record { + return { "<1s": 0, "1-3s": 0, "3-10s": 0, ">10s": 0, unknown: 0 }; +} + +function classifyLatency(latencyMs: number): LatencyBucket { + if (latencyMs <= 0) return "unknown"; + if (latencyMs < 1000) return "<1s"; + if (latencyMs < 3000) return "1-3s"; + if (latencyMs < 10000) return "3-10s"; + return ">10s"; +} + function emptyExecutionSummary(): NonNullable { return { totalExecutions: 0, diff --git a/apps/web/src/types.ts b/apps/web/src/types.ts index 41a8e44..73dacc0 100644 --- a/apps/web/src/types.ts +++ b/apps/web/src/types.ts @@ -1,4 +1,4 @@ -import type { ProviderDefinition, QueryMode, QueryResult } from "@query402/shared"; +import type { LatencyBucket, ProviderDefinition, QueryMode, QueryResult } from "@query402/shared"; export interface PaymentProofLinks { transaction: string; diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 6797296..05b03ef 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -11,6 +11,8 @@ export type ExecutionFallbackReason = export type CircuitBreakerState = "closed" | "half-open" | "open"; export type PaymentSource = "sponsored" | "wallet" | "demo"; +export type LatencyBucket = "<1s" | "1-3s" | "3-10s" | ">10s" | "unknown"; + export interface ProviderExecutionMetadata { providerId: string; source: SourceType;