From 18a3741fc29afccbae75dc81b3dd5e18ffaf5108 Mon Sep 17 00:00:00 2001 From: jay77721 Date: Tue, 24 Mar 2026 21:40:33 +0800 Subject: [PATCH] feat(proxy): add model name prefix stripping option (#568) Add stripModelPrefix boolean setting that, when enabled, strips provider prefixes (e.g. openai/, anthropic/) from incoming model names and re-resolves the bare model name using existing heuristics. This allows tools to send prefixed model names while OmniRoute handles provider routing at the proxy layer. - Add stripModelPrefix to settings validation schema (Zod) - Check setting in getModelInfo() after custom node matching fails - Falls through to normal resolution on error or when disabled - Backward compatible: opt-in, default behavior unchanged --- src/shared/validation/settingsSchemas.ts | 2 ++ src/sse/services/model.ts | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/shared/validation/settingsSchemas.ts b/src/shared/validation/settingsSchemas.ts index 980a9afc08..67cfccd766 100644 --- a/src/shared/validation/settingsSchemas.ts +++ b/src/shared/validation/settingsSchemas.ts @@ -42,6 +42,8 @@ export const updateSettingsSchema = z.object({ a2aEnabled: z.boolean().optional(), // CLI Fingerprint compatibility (per-provider) cliCompatProviders: z.array(z.string().max(100)).optional(), + // Strip provider/model prefix at proxy layer (e.g. "openai/gpt-4" → "gpt-4") + stripModelPrefix: z.boolean().optional(), // Custom CLI agent definitions for ACP customAgents: z .array( diff --git a/src/sse/services/model.ts b/src/sse/services/model.ts index 8e0eeae635..2c5b91d483 100644 --- a/src/sse/services/model.ts +++ b/src/sse/services/model.ts @@ -1,5 +1,6 @@ // Re-export from open-sse with localDb integration import { getModelAliases, getComboByName, getProviderNodes, getCustomModels } from "@/lib/localDb"; +import { getSettings } from "@/lib/localDb"; import { parseModel, resolveModelAliasFromMap, @@ -77,6 +78,18 @@ export async function getModelInfo(modelStr) { ...(apiFormat && { apiFormat }), }; } + + // stripModelPrefix: if enabled, strip provider prefix and re-resolve + // the bare model name using existing heuristics (claude-* → anthropic, etc.) + try { + const settings = await getSettings(); + if (settings.stripModelPrefix === true) { + const strippedResult = await getModelInfoCore(parsed.model, getModelAliases); + return { ...strippedResult, extendedContext }; + } + } catch { + // If settings read fails, fall through to normal resolution + } } if (!parsed.isAlias) {