From 526c328ed7bf405a9c754dee56ab193b992fa1ed Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Tue, 27 Jan 2026 02:16:06 +0000 Subject: [PATCH] fix(gateway): track uptime for used provider, not requested When low-uptime fallback routes a request to a different provider, ensure that the uptime stats are tracked for the actual provider that handled the request, not the originally requested one. The issue was that `baseModelName` was derived from `finalModelInfo` which is computed after fallback using the updated `usedModel`. If the search failed, it would fall back to using `usedModel` directly (a provider-specific name) instead of the canonical model ID. Now we use `modelInfo.id` (set before any routing/fallback) as the primary source for the canonical model ID, ensuring correct stats attribution. Co-Authored-By: Claude Opus 4.5 --- apps/gateway/src/chat/chat.ts | 6 +++++- apps/worker/src/services/stats-calculator.spec.ts | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/gateway/src/chat/chat.ts b/apps/gateway/src/chat/chat.ts index 4443b8698b..19ca8b609d 100644 --- a/apps/gateway/src/chat/chat.ts +++ b/apps/gateway/src/chat/chat.ts @@ -1832,7 +1832,11 @@ chat.openapi(completions, async (c) => { ); } - const baseModelName = finalModelInfo?.id || usedModel; + // Use the canonical model ID from modelInfo (set before any routing/fallback) + // This ensures correct stats tracking when low-uptime fallback changes the provider + // Fall back to finalModelInfo.id or usedModel for edge cases like custom providers + const baseModelName = + (modelInfo as ModelDefinition)?.id || finalModelInfo?.id || usedModel; // Check if this is an image generation model const imageGenProviderMapping = finalModelInfo?.providers.find( diff --git a/apps/worker/src/services/stats-calculator.spec.ts b/apps/worker/src/services/stats-calculator.spec.ts index cfb3ae0302..f31553cda6 100644 --- a/apps/worker/src/services/stats-calculator.spec.ts +++ b/apps/worker/src/services/stats-calculator.spec.ts @@ -569,7 +569,7 @@ describe("stats-calculator", () => { duration: 2000, requestedModel: "gpt-4", requestedProvider: "anthropic", - usedModel: "openai/gpt-4", + usedModel: "anthropic/gpt-4", // Must match usedProvider for correct stats tracking usedProvider: "anthropic", responseSize: 150, hasError: true,