From e2b2d5974f11f684d1616cdb7e7a29fcd79240fb Mon Sep 17 00:00:00 2001 From: Enrico Ros Date: Wed, 22 Oct 2025 04:16:19 -0700 Subject: [PATCH] AIX: Gemini: detect internal 503s --- .../chatGenerate/parsers/gemini.parser.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/modules/aix/server/dispatch/chatGenerate/parsers/gemini.parser.ts b/src/modules/aix/server/dispatch/chatGenerate/parsers/gemini.parser.ts index 733d3a5ff..eddc45e92 100644 --- a/src/modules/aix/server/dispatch/chatGenerate/parsers/gemini.parser.ts +++ b/src/modules/aix/server/dispatch/chatGenerate/parsers/gemini.parser.ts @@ -38,14 +38,26 @@ export function createGeminiGenerateContentResponseParser(requestedModelName: st let groundingIndexNumber = 0; // this can throw, it's caught by the caller - return function(pt: IParticleTransmitter, eventData: string): void { + return function(pt: IParticleTransmitter, rawEventData: string): void { // Time to first event if (timeToFirstEvent === undefined) timeToFirstEvent = Date.now() - parserCreationTimestamp; // Throws on malformed event data - const generationChunk = GeminiWire_API_Generate_Content.Response_schema.parse(JSON.parse(eventData)); + const eventData = JSON.parse(rawEventData); + + // [Gemini, 2025-10-22] Early detection of proxy errors - being sent as an assistant message + if (eventData?.candidates?.length === 1) { + const candidate = eventData.candidates[0]; + if (typeof candidate.finishReason === 'string' && candidate.finishReason.includes('503 Service Unavailable') /*candidate.finishReason.startsWith('Proxy error')*/) { + // pt.setTokenStopReason('cg-issue'); + return pt.setDialectTerminatingIssue(`Gemini Internal Proxy Error detected: ${candidate.finishReason}`, null); + } + } + + // Validate schema and parse + const generationChunk = GeminiWire_API_Generate_Content.Response_schema.parse(eventData); // -> Model if (generationChunk.modelVersion && !sentActualModelName) {