From b55fd8d76f8ce857f00b79a50855af987bee254e Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sun, 25 Jan 2026 14:53:11 +0900 Subject: [PATCH] feat(explore): add github-copilot/gpt-5-mini to fallback chain (#1091) * feat(explore): add github-copilot/gpt-5-mini to fallback chain * test(explore): add tests for github-copilot/gpt-5-mini fallback --------- Co-authored-by: Suyeol Jeon --- src/cli/__snapshots__/model-fallback.test.ts.snap | 6 +++--- src/cli/model-fallback.test.ts | 11 +++++++++++ src/cli/model-fallback.ts | 4 +++- src/shared/model-requirements.test.ts | 13 +++++++++++-- src/shared/model-requirements.ts | 1 + 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/cli/__snapshots__/model-fallback.test.ts.snap b/src/cli/__snapshots__/model-fallback.test.ts.snap index 5e857114..0ac986a3 100644 --- a/src/cli/__snapshots__/model-fallback.test.ts.snap +++ b/src/cli/__snapshots__/model-fallback.test.ts.snap @@ -712,7 +712,7 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models when "model": "github-copilot/claude-sonnet-4.5", }, "explore": { - "model": "opencode/gpt-5-nano", + "model": "github-copilot/gpt-5-mini", }, "librarian": { "model": "github-copilot/claude-sonnet-4.5", @@ -776,7 +776,7 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models with "model": "github-copilot/claude-sonnet-4.5", }, "explore": { - "model": "opencode/gpt-5-nano", + "model": "github-copilot/gpt-5-mini", }, "librarian": { "model": "github-copilot/claude-sonnet-4.5", @@ -1022,7 +1022,7 @@ exports[`generateModelConfig mixed provider scenarios uses OpenAI + Copilot comb "model": "github-copilot/claude-sonnet-4.5", }, "explore": { - "model": "opencode/gpt-5-nano", + "model": "github-copilot/gpt-5-mini", }, "librarian": { "model": "github-copilot/claude-sonnet-4.5", diff --git a/src/cli/model-fallback.test.ts b/src/cli/model-fallback.test.ts index f447c710..84682456 100644 --- a/src/cli/model-fallback.test.ts +++ b/src/cli/model-fallback.test.ts @@ -353,6 +353,17 @@ describe("generateModelConfig", () => { // #then explore should use gpt-5-nano (fallback) expect(result.agents?.explore?.model).toBe("opencode/gpt-5-nano") }) + + test("explore uses gpt-5-mini when only Copilot available", () => { + // #given only Copilot is available + const config = createConfig({ hasCopilot: true }) + + // #when generateModelConfig is called + const result = generateModelConfig(config) + + // #then explore should use gpt-5-mini (Copilot fallback) + expect(result.agents?.explore?.model).toBe("github-copilot/gpt-5-mini") + }) }) describe("Sisyphus agent special cases", () => { diff --git a/src/cli/model-fallback.ts b/src/cli/model-fallback.ts index c53cd785..2862e4ad 100644 --- a/src/cli/model-fallback.ts +++ b/src/cli/model-fallback.ts @@ -139,12 +139,14 @@ export function generateModelConfig(config: InstallConfig): GeneratedOmoConfig { continue } - // Special case: explore uses Claude haiku → OpenCode gpt-5-nano + // Special case: explore uses Claude haiku → GitHub Copilot gpt-5-mini → OpenCode gpt-5-nano if (role === "explore") { if (avail.native.claude) { agents[role] = { model: "anthropic/claude-haiku-4-5" } } else if (avail.opencodeZen) { agents[role] = { model: "opencode/claude-haiku-4-5" } + } else if (avail.copilot) { + agents[role] = { model: "github-copilot/gpt-5-mini" } } else { agents[role] = { model: "opencode/gpt-5-nano" } } diff --git a/src/shared/model-requirements.test.ts b/src/shared/model-requirements.test.ts index 2488b400..81579f14 100644 --- a/src/shared/model-requirements.test.ts +++ b/src/shared/model-requirements.test.ts @@ -59,14 +59,23 @@ describe("AGENT_MODEL_REQUIREMENTS", () => { const explore = AGENT_MODEL_REQUIREMENTS["explore"] // #when - accessing explore requirement - // #then - fallbackChain exists with claude-haiku-4-5 as first entry + // #then - fallbackChain exists with claude-haiku-4-5 as first entry, gpt-5-mini as second, gpt-5-nano as third expect(explore).toBeDefined() expect(explore.fallbackChain).toBeArray() - expect(explore.fallbackChain.length).toBeGreaterThan(0) + expect(explore.fallbackChain).toHaveLength(3) const primary = explore.fallbackChain[0] expect(primary.providers).toContain("anthropic") + expect(primary.providers).toContain("opencode") expect(primary.model).toBe("claude-haiku-4-5") + + const secondary = explore.fallbackChain[1] + expect(secondary.providers).toContain("github-copilot") + expect(secondary.model).toBe("gpt-5-mini") + + const tertiary = explore.fallbackChain[2] + expect(tertiary.providers).toContain("opencode") + expect(tertiary.model).toBe("gpt-5-nano") }) test("multimodal-looker has valid fallbackChain with gemini-3-flash as primary", () => { diff --git a/src/shared/model-requirements.ts b/src/shared/model-requirements.ts index 33004152..4e10a688 100644 --- a/src/shared/model-requirements.ts +++ b/src/shared/model-requirements.ts @@ -35,6 +35,7 @@ export const AGENT_MODEL_REQUIREMENTS: Record = { explore: { fallbackChain: [ { providers: ["anthropic", "opencode"], model: "claude-haiku-4-5" }, + { providers: ["github-copilot"], model: "gpt-5-mini" }, { providers: ["opencode"], model: "gpt-5-nano" }, ], },