#315: Import and call resolveModelAlias() in chatCore.ts before the getModelTargetFormat() lookup so that custom aliases configured in Settings → Model Aliases → Pattern→Target are actually applied during routing instead of being silently ignored. #316: Load persisted custom model aliases from settings DB at server startup (instrumentation.ts). Previously _customAliases started as an empty object after every restart since setCustomAliases() was only called by the PUT /api/settings/model-aliases handler — never at init. Now aliases are restored from settings.modelAliases JSON field on boot.
This commit is contained in:
@@ -12,6 +12,7 @@ import { addBufferToUsage, filterUsageForFormat, estimateUsage } from "../utils/
|
||||
import { refreshWithRetry } from "../services/tokenRefresh.ts";
|
||||
import { createRequestLogger } from "../utils/requestLogger.ts";
|
||||
import { getModelTargetFormat, PROVIDER_ID_TO_ALIAS } from "../config/providerModels.ts";
|
||||
import { resolveModelAlias } from "../services/modelDeprecation.ts";
|
||||
import { createErrorResult, parseUpstreamError, formatProviderError } from "../utils/error.ts";
|
||||
import { HTTP_STATUS } from "../config/constants.ts";
|
||||
import { handleBypassRequest } from "../utils/bypassHandler.ts";
|
||||
@@ -105,8 +106,13 @@ export async function handleChatCore({
|
||||
// Detect source format and get target format
|
||||
// Model-specific targetFormat takes priority over provider default
|
||||
|
||||
// Apply custom model aliases (Settings → Model Aliases → Pattern→Target) before routing (#315)
|
||||
// Custom aliases take priority over built-in and must be resolved here so the
|
||||
// downstream getModelTargetFormat() lookup uses the correct, aliased model ID.
|
||||
const resolvedModel = resolveModelAlias(model);
|
||||
|
||||
const alias = PROVIDER_ID_TO_ALIAS[provider] || provider;
|
||||
const modelTargetFormat = getModelTargetFormat(alias, model);
|
||||
const modelTargetFormat = getModelTargetFormat(alias, resolvedModel);
|
||||
const targetFormat = modelTargetFormat || getTargetFormat(provider);
|
||||
|
||||
// Default to false unless client explicitly sets stream: true (OpenAI spec compliant)
|
||||
|
||||
@@ -46,6 +46,30 @@ export async function register() {
|
||||
startBackgroundRefresh();
|
||||
console.log("[STARTUP] Quota cache background refresh started");
|
||||
|
||||
// Model aliases: restore persisted custom aliases into in-memory state (#316)
|
||||
// Custom aliases are saved to settings.modelAliases on PUT /api/settings/model-aliases
|
||||
// but the in-memory _customAliases resets to {} on every restart — load them here.
|
||||
try {
|
||||
const { getSettings } = await import("@/lib/db/settings");
|
||||
const { setCustomAliases } = await import("@omniroute/open-sse/services/modelDeprecation.ts");
|
||||
const settings = getSettings();
|
||||
if (settings.modelAliases) {
|
||||
const aliases =
|
||||
typeof settings.modelAliases === "string"
|
||||
? JSON.parse(settings.modelAliases)
|
||||
: settings.modelAliases;
|
||||
if (aliases && typeof aliases === "object") {
|
||||
setCustomAliases(aliases);
|
||||
console.log(
|
||||
`[STARTUP] Restored ${Object.keys(aliases).length} custom model alias(es) from settings`
|
||||
);
|
||||
}
|
||||
}
|
||||
} catch (err: unknown) {
|
||||
const msg = err instanceof Error ? err.message : String(err);
|
||||
console.warn("[STARTUP] Could not restore model aliases:", msg);
|
||||
}
|
||||
|
||||
// Compliance: Initialize audit_log table + cleanup expired logs
|
||||
try {
|
||||
const { initAuditLog, cleanupExpiredLogs } = await import("@/lib/compliance/index");
|
||||
|
||||
Reference in New Issue
Block a user