From bf4bcf4f96c321fda3c2641e94c8b4117838e224 Mon Sep 17 00:00:00 2001 From: Gemini Nexus Bot Date: Thu, 23 Apr 2026 03:00:58 -0300 Subject: [PATCH] fix: apply code review fixes (fire-and-forget usage, theme-aware chart colors) --- src/components/usage/NivoTooltip.tsx | 22 ++++++++--------- src/routes/usage.tsx | 2 +- src/server/modules/proxy/proxy.service.ts | 24 +++++++------------ .../modules/usage/token-usage.service.ts | 11 +++++++-- 4 files changed, 30 insertions(+), 29 deletions(-) diff --git a/src/components/usage/NivoTooltip.tsx b/src/components/usage/NivoTooltip.tsx index 4e26e79..d31131f 100644 --- a/src/components/usage/NivoTooltip.tsx +++ b/src/components/usage/NivoTooltip.tsx @@ -1,15 +1,15 @@ -export const COLOR_PROMPT = '#5b9bd5'; -export const COLOR_COMPLETION = '#70ad47'; -export const COLOR_TOTAL = '#a5a5a5'; +export const COLOR_PROMPT = 'var(--chart-2)'; +export const COLOR_COMPLETION = 'var(--chart-1)'; +export const COLOR_TOTAL = 'var(--chart-3)'; export const PIE_COLORS = [ - '#5b9bd5', - '#ed7d31', - '#70ad47', - '#a5a5a5', - '#ffc000', - '#4472c4', - '#91d1c2', - '#c55a5a', + 'var(--chart-1)', + 'var(--chart-2)', + 'var(--chart-3)', + 'var(--chart-4)', + 'var(--chart-5)', + 'var(--chart-1)', + 'var(--chart-2)', + 'var(--chart-3)', ]; const colorMap: Record = { diff --git a/src/routes/usage.tsx b/src/routes/usage.tsx index b6bb979..e7147c5 100644 --- a/src/routes/usage.tsx +++ b/src/routes/usage.tsx @@ -92,7 +92,7 @@ function barColor(bar: any): string { if (bar.id === 'Prompt') return COLOR_PROMPT; if (bar.id === 'Completion') return COLOR_COMPLETION; if (bar.id === 'Total') return COLOR_TOTAL; - return '#a5a5a5'; + return 'var(--chart-3)'; } /* ------------------------------------------------------------------ */ diff --git a/src/server/modules/proxy/proxy.service.ts b/src/server/modules/proxy/proxy.service.ts index 7b93d01..1a902d7 100644 --- a/src/server/modules/proxy/proxy.service.ts +++ b/src/server/modules/proxy/proxy.service.ts @@ -64,7 +64,7 @@ export class ProxyService { @Inject(TokenUsageService) private readonly tokenUsageService: TokenUsageService, ) {} - private async recordUsage( + private recordUsage( accountId: string, model: string, usage: @@ -73,11 +73,11 @@ export class ProxyService { | null, requestType: string, isEstimated?: boolean, - ): Promise { + ): void { if (!usage) { return; } - await this.tokenUsageService.recordUsage({ + this.tokenUsageService.recordUsage({ accountId, model, promptTokens: usage.promptTokenCount ?? 0, @@ -358,9 +358,7 @@ export class ProxyService { finishChunks.forEach((c) => subscriber.next(c)); const usage = this.extractUsageFromMetadata(lastUsageMetadata); if (usage) { - this.recordUsage(accountId, _model, usage, 'anthropic').catch((err) => - this.logger.error('Usage recording failed', err), - ); + this.recordUsage(accountId, _model, usage, 'anthropic'); } else if (accumulatedText) { const estimated = this.estimateTokens(accumulatedText); this.recordUsage( @@ -373,7 +371,7 @@ export class ProxyService { }, 'anthropic', true, - ).catch((err) => this.logger.error('Usage recording failed', err)); + ); } subscriber.complete(); }); @@ -629,9 +627,7 @@ export class ProxyService { } const usage = this.extractUsageFromMetadata(lastUsageMetadata); if (usage) { - this.recordUsage(accountId, model, usage, 'gemini').catch((err) => - this.logger.error('Usage recording failed', err), - ); + this.recordUsage(accountId, model, usage, 'gemini'); } else if (accumulatedText) { const estimated = this.estimateTokens(accumulatedText); this.recordUsage( @@ -644,7 +640,7 @@ export class ProxyService { }, 'gemini', true, - ).catch((err) => this.logger.error('Usage recording failed', err)); + ); } subscriber.complete(); }); @@ -1421,9 +1417,7 @@ export class ProxyService { } const usage = this.extractUsageFromMetadata(lastUsageMetadata); if (usage) { - this.recordUsage(accountId, effectiveTargetModel, usage, 'openai').catch((err) => - this.logger.error('Usage recording failed', err), - ); + this.recordUsage(accountId, effectiveTargetModel, usage, 'openai'); } else if (accumulatedText) { const estimated = this.estimateTokens(accumulatedText); this.recordUsage( @@ -1436,7 +1430,7 @@ export class ProxyService { }, 'openai', true, - ).catch((err) => this.logger.error('Usage recording failed', err)); + ); } subscriber.complete(); }); diff --git a/src/server/modules/usage/token-usage.service.ts b/src/server/modules/usage/token-usage.service.ts index 34ba49e..fe6166c 100644 --- a/src/server/modules/usage/token-usage.service.ts +++ b/src/server/modules/usage/token-usage.service.ts @@ -15,9 +15,16 @@ const RecordUsageInputSchema = z.object({ @Injectable() export class TokenUsageService { - recordUsage(params: RecordUsageParams): boolean { + recordUsage(params: RecordUsageParams): void { RecordUsageInputSchema.parse(params); - return TokenUsageRepo.recordUsage(params); + // Fire-and-forget: don't block the proxy request cycle + setImmediate(() => { + try { + TokenUsageRepo.recordUsage(params); + } catch { + // Silently ignore: usage recording should not break proxy requests + } + }); } getUsageByHour(accountId?: string, start?: number, end?: number) {