From f69bb45662afcf19660ca49455412cb5a4c7c39c Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 6 Apr 2026 13:21:57 +0900 Subject: [PATCH] fix(cli): dedupe generated installer fallback models Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- .../config-manager/generate-omo-config.test.ts | 15 ++++++++++++--- src/cli/model-fallback.ts | 10 ++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/cli/config-manager/generate-omo-config.test.ts b/src/cli/config-manager/generate-omo-config.test.ts index ded569247..dbec67c00 100644 --- a/src/cli/config-manager/generate-omo-config.test.ts +++ b/src/cli/config-manager/generate-omo-config.test.ts @@ -127,10 +127,19 @@ describe("generateOmoConfig - model fallback system", () => { //#then expect(agents.sisyphus.model).toBe("anthropic/claude-opus-4-6") - expect(agents.sisyphus.fallback_models?.map((entry) => entry.model)).toContain("openai/gpt-5.4") - expect(agents.sisyphus.fallback_models?.find((entry) => entry.model === "openai/gpt-5.4")?.variant).toBe("medium") + expect(agents.sisyphus.fallback_models).toEqual([ + { + model: "openai/gpt-5.4", + variant: "medium", + }, + ]) expect(categories.deep.model).toBe("openai/gpt-5.4") - expect(categories.deep.fallback_models?.map((entry) => entry.model)).toContain("anthropic/claude-opus-4-6") + expect(categories.deep.fallback_models).toEqual([ + { + model: "anthropic/claude-opus-4-6", + variant: "max", + }, + ]) }) test("uses haiku for explore when Claude max20", () => { diff --git a/src/cli/model-fallback.ts b/src/cli/model-fallback.ts index b7f663acd..aa2ef0e74 100644 --- a/src/cli/model-fallback.ts +++ b/src/cli/model-fallback.ts @@ -47,12 +47,18 @@ function attachFallbackModels( .filter((provider) => isProviderAvailable(provider, availability)) .map((provider) => toFallbackModelObject(entry, provider)) ) - const primaryIndex = expandedFallbacks.findIndex((entry) => entry.model === config.model) + const uniqueFallbacks = expandedFallbacks.filter((entry, index, allEntries) => + allEntries.findIndex((candidate) => + candidate.model === entry.model && + candidate.variant === entry.variant + ) === index + ) + const primaryIndex = uniqueFallbacks.findIndex((entry) => entry.model === config.model) if (primaryIndex === -1) { return config } - const fallbackModels = expandedFallbacks.slice(primaryIndex + 1) + const fallbackModels = uniqueFallbacks.slice(primaryIndex + 1) if (fallbackModels.length === 0) { return config }