From bc85a71c2a2609995d4b5d63f10206adfc072fbe Mon Sep 17 00:00:00 2001 From: reanon <> Date: Fri, 8 Aug 2025 12:58:41 +0200 Subject: [PATCH] No more error user messages --- src/proxy/middleware/response/index.ts | 31 +++++++++++++++++--------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/proxy/middleware/response/index.ts b/src/proxy/middleware/response/index.ts index 540c208..ade7f3d 100644 --- a/src/proxy/middleware/response/index.ts +++ b/src/proxy/middleware/response/index.ts @@ -294,7 +294,8 @@ const handleUpstreamErrors: ProxyResHandlerWithBody = async ( // Xai specific - insufficient balance if (service === "xai") { keyPool.disable(req.key!, "quota"); - errorPayload.proxy_note = `Assigned key has insufficient balance. Please try again.`; + await reenqueueRequest(req); + throw new RetryableError("XAI key has insufficient balance, retrying with different key."); } } else if (statusCode === 403) { switch (service) { @@ -318,7 +319,8 @@ const handleUpstreamErrors: ProxyResHandlerWithBody = async ( case "UnrecognizedClientException": // Key is invalid. keyPool.disable(req.key!, "revoked"); - errorPayload.proxy_note = `Assigned API key is invalid or revoked, please try again.`; + await reenqueueRequest(req); + throw new RetryableError("AWS key is invalid, retrying with different key."); break; case "AccessDeniedException": const isModelAccessError = @@ -338,10 +340,13 @@ const handleUpstreamErrors: ProxyResHandlerWithBody = async ( return; case "mistral-ai": case "gcp": + keyPool.disable(req.key!, "revoked"); + await reenqueueRequest(req); + throw new RetryableError("GCP key is invalid, retrying with different key."); case "moonshot": keyPool.disable(req.key!, "revoked"); - errorPayload.proxy_note = `Assigned API key is invalid or revoked, please try again.`; - return; + await reenqueueRequest(req); + throw new RetryableError("Moonshot key is invalid, retrying with different key."); } } else if (statusCode === 429) { switch (service) { @@ -480,7 +485,8 @@ async function handleAnthropicAwsBadRequestError( "Anthropic key has hit spending limit and will be disabled." ); keyPool.disable(req.key!, "quota"); - errorPayload.proxy_note = `Assigned key has hit its spending limit. ${error?.message}`; + await reenqueueRequest(req); + throw new RetryableError("Claude key hit spending limit, retrying with different key."); return; } @@ -494,7 +500,8 @@ async function handleAnthropicAwsBadRequestError( "Anthropic/AWS key has been disabled." ); keyPool.disable(req.key!, "revoked"); - errorPayload.proxy_note = `Assigned key has been disabled. (${error?.message})`; + await reenqueueRequest(req); + throw new RetryableError("Claude key has been disabled, retrying with different key."); return; } @@ -655,17 +662,20 @@ async function handleOpenAIRateLimitError( case "invalid_request_error": // this is the billing_hard_limit_reached error seen in some cases // Billing quota exceeded (key is dead, disable it) keyPool.disable(req.key!, "quota"); - errorPayload.proxy_note = `Assigned key's quota has been exceeded. Please try again.`; + await reenqueueRequest(req); + throw new RetryableError("Google AI key quota exceeded, retrying with different key."); break; case "access_terminated": // Account banned (key is dead, disable it) keyPool.disable(req.key!, "revoked"); - errorPayload.proxy_note = `Assigned key has been banned by OpenAI for policy violations. Please try again.`; + await reenqueueRequest(req); + throw new RetryableError("Google AI key banned for policy violations, retrying with different key."); break; case "billing_not_active": // Key valid but account billing is delinquent keyPool.disable(req.key!, "quota"); - errorPayload.proxy_note = `Assigned key has been disabled due to delinquent billing. Please try again.`; + await reenqueueRequest(req); + throw new RetryableError("Google AI key billing not active, retrying with different key."); break; case "requests": case "tokens": @@ -724,7 +734,8 @@ async function handleGoogleAIBadRequestError( "Google API key appears to be inoperative." ); keyPool.disable(req.key!, "revoked"); - errorPayload.proxy_note = `Assigned API key cannot be used.`; + await reenqueueRequest(req); + throw new RetryableError("Google API key inoperative, retrying with different key."); } else { req.log.warn( { key: req.key?.hash, error: text },