From b8a56a1efacb7a78d630be4e870afa0a01e9f919 Mon Sep 17 00:00:00 2001 From: 810senpai114514 <810senpai114514@users.noreply.github.com> Date: Tue, 14 Jul 2026 13:33:57 +0800 Subject: [PATCH] fix: strip Provider/ prefix from model name before sending to ai-gateway MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug evidence from request_logs.sqlite: request body: {"model":"NebulaCoder/nebulacoder-cot-v8.0", ...} response body: {"error":{"message":"All target providers failed.", "attempts":[ {"provider":"openai","provider_name":"provider-nebulacoder-ee070b8656", "stage":"model_resolution", "message":"Model "NebulaCoder/nebulacoder-cot-v8.0" is not configured for target provider openai. Allowed models: nebulacoder-v8.0, nebulacoder-cot-v8.0."} ]}} Root cause: prepareUpstreamCredentialAttempt has a !target branch that uses: bodyHasConfiguredProviderModelSelector(input.attempt.body, input.config) ? input.attempt.body ← original body with "NebulaCoder/" prefix : normalizedBody?.body ... ← correctly stripped When the body parses successfully, it prefers the original body with the Provider/ prefix. This prefixed model name reaches ai-gateway which only knows bare model names, causing a 400. Fix: always use normalizedBody.body (which strips the Provider/ prefix) when available. Remove the now-unused bodyHasConfiguredProviderModelSelector. Co-Authored-By: Claude Sonnet 5 --- packages/core/src/gateway/upstream/executor.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/packages/core/src/gateway/upstream/executor.ts b/packages/core/src/gateway/upstream/executor.ts index 61dcf518..cbe078d3 100644 --- a/packages/core/src/gateway/upstream/executor.ts +++ b/packages/core/src/gateway/upstream/executor.ts @@ -374,9 +374,7 @@ function prepareUpstreamCredentialAttempt(input: { target }); if (!target) { - const body = bodyHasConfiguredProviderModelSelector(input.attempt.body, input.config) - ? input.attempt.body - : normalizedBody?.body ?? input.attempt.body; + const body = normalizedBody?.body ?? input.attempt.body; return { ...input.attempt, body: attemptBody(body), @@ -620,11 +618,6 @@ function normalizeConfiguredProviderModelBody( } -function bodyHasConfiguredProviderModelSelector(body: Buffer | undefined, config: AppConfig): boolean { - const parsedBody = parseJsonObjectSafe(body); - const model = stringValue(parsedBody?.model); - return Boolean(resolveConfiguredProviderModelSelector(model, config)); -} function resolveProviderCredentialRoutingTarget(