From 860d94732a27b10f91c6afbb4e1646361516e2a8 Mon Sep 17 00:00:00 2001 From: H1d3rOne Date: Fri, 1 May 2026 16:28:51 +0700 Subject: [PATCH] fix: custom provider prefix conflicts with built-in alias When a custom OpenAI-compatible provider uses a prefix that matches a built-in alias (e.g. 'ark' -> 'volcengine-ark'), resolveProviderAlias() converts it to the built-in provider ID, causing the provider-node matching logic to be skipped. The request is then routed to the wrong provider, resulting in a 404 model_not_found error. Fix: always check provider-node prefix matching using the original user input (parsed.providerAlias) before falling back to the resolved alias, regardless of whether resolveProviderAlias() transformed it. Co-authored-by: H1d3rOne Made-with: Cursor --- src/sse/services/model.js | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/src/sse/services/model.js b/src/sse/services/model.js index a883cbfb..a6ab3fcb 100644 --- a/src/sse/services/model.js +++ b/src/sse/services/model.js @@ -19,27 +19,23 @@ export async function getModelInfo(modelStr) { const parsed = parseModel(modelStr); if (!parsed.isAlias) { - if (parsed.provider === parsed.providerAlias) { - // Check OpenAI Compatible nodes - const openaiNodes = await getProviderNodes({ type: "openai-compatible" }); - const matchedOpenAI = openaiNodes.find((node) => node.prefix === parsed.providerAlias); - if (matchedOpenAI) { - return { provider: matchedOpenAI.id, model: parsed.model }; - } + // Always check provider-node prefix matching using original input first + const openaiNodes = await getProviderNodes({ type: "openai-compatible" }); + const matchedOpenAI = openaiNodes.find((node) => node.prefix === parsed.providerAlias); + if (matchedOpenAI) { + return { provider: matchedOpenAI.id, model: parsed.model }; + } - // Check Anthropic Compatible nodes - const anthropicNodes = await getProviderNodes({ type: "anthropic-compatible" }); - const matchedAnthropic = anthropicNodes.find((node) => node.prefix === parsed.providerAlias); - if (matchedAnthropic) { - return { provider: matchedAnthropic.id, model: parsed.model }; - } + const anthropicNodes = await getProviderNodes({ type: "anthropic-compatible" }); + const matchedAnthropic = anthropicNodes.find((node) => node.prefix === parsed.providerAlias); + if (matchedAnthropic) { + return { provider: matchedAnthropic.id, model: parsed.model }; + } - // Check Custom Embedding nodes - const embeddingNodes = await getProviderNodes({ type: "custom-embedding" }); - const matchedEmbedding = embeddingNodes.find((node) => node.prefix === parsed.providerAlias); - if (matchedEmbedding) { - return { provider: matchedEmbedding.id, model: parsed.model }; - } + const embeddingNodes = await getProviderNodes({ type: "custom-embedding" }); + const matchedEmbedding = embeddingNodes.find((node) => node.prefix === parsed.providerAlias); + if (matchedEmbedding) { + return { provider: matchedEmbedding.id, model: parsed.model }; } return { provider: parsed.provider,