From bc9b43f06ae7aa0d763b64248ed7e14b0a20bb89 Mon Sep 17 00:00:00 2001 From: ekko <152005280+EKKOLearnAI@users.noreply.github.com> Date: Sat, 25 Apr 2026 19:38:46 +0800 Subject: [PATCH] fix: model switch reset, custom provider resolution and base_url_env cleanup (#212) * fix: reset entire config.model on model switch Co-Authored-By: Claude Opus 4.6 * fix: resolve custom provider from CLI config and clean base_url_env on delete - When config.model.provider is "custom" (set by hermes CLI), match base_url + model against custom_providers to resolve custom:name - Clear base_url_env from .env when deleting a builtin provider Co-Authored-By: Claude Opus 4.6 --------- Co-authored-by: Claude Opus 4.6 --- packages/server/src/controllers/hermes/models.ts | 16 +++++++++++++--- .../server/src/controllers/hermes/providers.ts | 1 + 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/server/src/controllers/hermes/models.ts b/packages/server/src/controllers/hermes/models.ts index 8476716..ddd0022 100644 --- a/packages/server/src/controllers/hermes/models.ts +++ b/packages/server/src/controllers/hermes/models.ts @@ -15,6 +15,18 @@ export async function getAvailable(ctx: any) { if (typeof modelSection === 'object' && modelSection !== null) { currentDefault = String(modelSection.default || '').trim() currentDefaultProvider = String(modelSection.provider || '').trim() + // When hermes CLI sets provider: custom, resolve to custom:name + // by matching base_url + model against custom_providers + if (currentDefaultProvider === 'custom' && currentDefault) { + const cps = Array.isArray(config.custom_providers) ? config.custom_providers as any[] : [] + const match = cps.find( + (cp: any) => cp.base_url?.replace(/\/+$/, '') === String(modelSection.base_url || '').replace(/\/+$/, '') + && cp.model === currentDefault, + ) + if (match) { + currentDefaultProvider = `custom:${match.name.trim().toLowerCase().replace(/ /g, '-')}` + } + } } else if (typeof modelSection === 'string') { currentDefault = modelSection.trim() } @@ -137,10 +149,8 @@ export async function setConfigModel(ctx: any) { } try { const config = await readConfigYaml() - if (typeof config.model !== 'object' || config.model === null) { config.model = {} } + config.model = {} config.model.default = defaultModel - delete config.model.base_url - delete config.model.api_key if (reqProvider) { config.model.provider = reqProvider } await writeConfigYaml(config) ctx.body = { success: true } diff --git a/packages/server/src/controllers/hermes/providers.ts b/packages/server/src/controllers/hermes/providers.ts index 393a7ee..ff16eb8 100644 --- a/packages/server/src/controllers/hermes/providers.ts +++ b/packages/server/src/controllers/hermes/providers.ts @@ -143,6 +143,7 @@ export async function remove(ctx: any) { const envMapping = PROVIDER_ENV_MAP[poolKey] if (envMapping?.api_key_env) { await saveEnvValue(envMapping.api_key_env, '') + if (envMapping.base_url_env) { await saveEnvValue(envMapping.base_url_env, '') } } else if (!envMapping?.api_key_env) { try { const authPath = getActiveAuthPath()