From 0da1d42be5bac9e36dd4885f884e94a83def718c Mon Sep 17 00:00:00 2001 From: Aidan Bleser Date: Tue, 17 Jun 2025 16:51:29 -0500 Subject: [PATCH] add retry to generateStatsResult --- src/routes/api/generate-message/+server.ts | 36 ++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/routes/api/generate-message/+server.ts b/src/routes/api/generate-message/+server.ts index 0b5dba4..4d5b8c3 100644 --- a/src/routes/api/generate-message/+server.ts +++ b/src/routes/api/generate-message/+server.ts @@ -7,7 +7,6 @@ import { ConvexHttpClient } from 'convex/browser'; import { err, ok, Result, ResultAsync } from 'neverthrow'; import OpenAI from 'openai'; import { waitUntil } from '@vercel/functions'; - import { z } from 'zod/v4'; import type { ChatCompletionSystemMessageParam } from 'openai/resources'; import { getSessionCookie } from 'better-auth/cookies'; @@ -325,7 +324,12 @@ ${attachedRules.map((r) => `- ${r.name}: ${r.rule}`).join('\n')}`, return; } - const generationStatsResult = await getGenerationStats(generationId, key); + const generationStatsResult = await retryResult(() => getGenerationStats(generationId!, key), { + delay: 500, + retries: 2, + startTime, + fnName: 'getGenerationStats', + }); if (generationStatsResult.isErr()) { log(`Background: Failed to get generation stats: ${generationStatsResult.error}`, startTime); @@ -559,6 +563,34 @@ async function getGenerationStats( } } +async function retryResult( + fn: () => Promise>, + { + retries, + delay, + startTime, + fnName, + }: { retries: number; delay: number; startTime: number; fnName: string } +): Promise> { + let attempts = 0; + let lastResult: Result | null = null; + + while (attempts <= retries) { + lastResult = await fn(); + + if (lastResult.isOk()) return lastResult; + + log(`Retrying ${fnName} ${attempts} failed: ${lastResult.error}`, startTime); + + await new Promise((resolve) => setTimeout(resolve, delay)); + attempts++; + } + + if (!lastResult) throw new Error('This should never happen'); + + return lastResult; +} + export interface ApiResponse { data: Data; }