fix(models): update model names to match OpenCode Zen catalog (#1048)

* fix(models): update model names to match OpenCode Zen catalog

OpenCode Zen recently updated their official model catalog, deprecating
several preview and free model variants:

DEPRECATED → NEW (Official Zen Names):
- gemini-3-pro-preview → gemini-3-pro
- gemini-3-flash-preview → gemini-3-flash
- grok-code → gpt-5-nano (FREE tier maintained)
- glm-4.7-free → big-pickle (FREE tier maintained)
- glm-4.6v → glm-4.6

Changes:
- Updated 6 source files (model-requirements, delegate-task, think-mode, etc.)
- Updated 9 documentation files (installation, configurations, features, etc.)
- Updated 14 test files with new model references
- Regenerated snapshots to reflect catalog changes
- Removed duplicate think-mode entries for preview variants

Impact:
- FREE tier access preserved via gpt-5-nano and big-pickle
- All 55 model-related tests passing
- Zero breaking changes - pure string replacement
- Aligns codebase with official OpenCode Zen model catalog

Verified:
- Zero deprecated model names in codebase
- All model-related tests pass (55/55)
- Snapshots regenerated and validated

Affects: 30 files (6 source, 9 docs, 14 tests, 1 snapshot)

* fix(multimodal-looker): update fallback chain with glm-4.6v and gpt-5-nano

- Change glm-4.6 to glm-4.6v for zai-coding-plan provider
- Add opencode/gpt-5-nano as 4th fallback (FREE tier)
- Push gpt-5.2 to 5th position

Fallback chain now:
1. gemini-3-flash (google, github-copilot, opencode)
2. claude-haiku-4-5 (anthropic, github-copilot, opencode)
3. glm-4.6v (zai-coding-plan)
4. gpt-5-nano (opencode) - FREE
5. gpt-5.2 (openai, github-copilot, opencode)

* chore: update bun.lock

---------

Co-authored-by: justsisyphus <justsisyphus@users.noreply.github.com>
This commit is contained in:
YeonGyu-Kim
2026-01-24 15:30:35 +09:00
committed by GitHub
parent 58459e692b
commit 04633ba208
31 changed files with 292 additions and 293 deletions
+135 -135
View File
@@ -5,54 +5,54 @@ exports[`generateModelConfig no providers available returns ULTIMATE_FALLBACK fo
"$schema": "https://raw.githubusercontent.com/code-yeongyu/oh-my-opencode/master/assets/oh-my-opencode.schema.json",
"agents": {
"atlas": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"explore": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"librarian": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"metis": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"momus": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"multimodal-looker": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"oracle": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"prometheus": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"sisyphus": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
},
"categories": {
"artistry": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"quick": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"ultrabrain": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"unspecified-high": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"unspecified-low": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"visual-engineering": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"writing": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
},
}
@@ -196,10 +196,10 @@ exports[`generateModelConfig single native provider uses OpenAI models when only
"model": "openai/gpt-5.2",
},
"explore": {
"model": "opencode/grok-code",
"model": "opencode/gpt-5-nano",
},
"librarian": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"metis": {
"model": "openai/gpt-5.2",
@@ -230,7 +230,7 @@ exports[`generateModelConfig single native provider uses OpenAI models when only
"model": "openai/gpt-5.2",
},
"quick": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"ultrabrain": {
"model": "openai/gpt-5.2-codex",
@@ -263,10 +263,10 @@ exports[`generateModelConfig single native provider uses OpenAI models with isMa
"model": "openai/gpt-5.2",
},
"explore": {
"model": "opencode/grok-code",
"model": "opencode/gpt-5-nano",
},
"librarian": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"metis": {
"model": "openai/gpt-5.2",
@@ -297,7 +297,7 @@ exports[`generateModelConfig single native provider uses OpenAI models with isMa
"model": "openai/gpt-5.2",
},
"quick": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"ultrabrain": {
"model": "openai/gpt-5.2-codex",
@@ -327,57 +327,57 @@ exports[`generateModelConfig single native provider uses Gemini models when only
"$schema": "https://raw.githubusercontent.com/code-yeongyu/oh-my-opencode/master/assets/oh-my-opencode.schema.json",
"agents": {
"atlas": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
"explore": {
"model": "opencode/grok-code",
"model": "opencode/gpt-5-nano",
},
"librarian": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"metis": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
"variant": "max",
},
"momus": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
"variant": "max",
},
"multimodal-looker": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
"oracle": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
"prometheus": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
"sisyphus": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
},
"categories": {
"artistry": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
"variant": "max",
},
"quick": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
"ultrabrain": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
"unspecified-high": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
"unspecified-low": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
"visual-engineering": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
"writing": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
},
}
@@ -388,57 +388,57 @@ exports[`generateModelConfig single native provider uses Gemini models with isMa
"$schema": "https://raw.githubusercontent.com/code-yeongyu/oh-my-opencode/master/assets/oh-my-opencode.schema.json",
"agents": {
"atlas": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
"explore": {
"model": "opencode/grok-code",
"model": "opencode/gpt-5-nano",
},
"librarian": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"metis": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
"variant": "max",
},
"momus": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
"variant": "max",
},
"multimodal-looker": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
"oracle": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
"prometheus": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
"sisyphus": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
},
"categories": {
"artistry": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
"variant": "max",
},
"quick": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
"ultrabrain": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
"unspecified-high": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
"unspecified-low": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
"visual-engineering": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
"writing": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
},
}
@@ -466,7 +466,7 @@ exports[`generateModelConfig all native providers uses preferred models from fal
"variant": "medium",
},
"multimodal-looker": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
"oracle": {
"model": "openai/gpt-5.2",
@@ -482,7 +482,7 @@ exports[`generateModelConfig all native providers uses preferred models from fal
},
"categories": {
"artistry": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
"variant": "max",
},
"quick": {
@@ -499,10 +499,10 @@ exports[`generateModelConfig all native providers uses preferred models from fal
"model": "anthropic/claude-sonnet-4-5",
},
"visual-engineering": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
"writing": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
},
}
@@ -530,7 +530,7 @@ exports[`generateModelConfig all native providers uses preferred models with isM
"variant": "medium",
},
"multimodal-looker": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
"oracle": {
"model": "openai/gpt-5.2",
@@ -547,7 +547,7 @@ exports[`generateModelConfig all native providers uses preferred models with isM
},
"categories": {
"artistry": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
"variant": "max",
},
"quick": {
@@ -565,10 +565,10 @@ exports[`generateModelConfig all native providers uses preferred models with isM
"model": "anthropic/claude-sonnet-4-5",
},
"visual-engineering": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
"writing": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
},
}
@@ -585,7 +585,7 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models when on
"model": "opencode/claude-haiku-4-5",
},
"librarian": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"metis": {
"model": "opencode/claude-opus-4-5",
@@ -596,7 +596,7 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models when on
"variant": "medium",
},
"multimodal-looker": {
"model": "opencode/gemini-3-flash-preview",
"model": "opencode/gemini-3-flash",
},
"oracle": {
"model": "opencode/gpt-5.2",
@@ -612,7 +612,7 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models when on
},
"categories": {
"artistry": {
"model": "opencode/gemini-3-pro-preview",
"model": "opencode/gemini-3-pro",
"variant": "max",
},
"quick": {
@@ -629,10 +629,10 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models when on
"model": "opencode/claude-sonnet-4-5",
},
"visual-engineering": {
"model": "opencode/gemini-3-pro-preview",
"model": "opencode/gemini-3-pro",
},
"writing": {
"model": "opencode/gemini-3-flash-preview",
"model": "opencode/gemini-3-flash",
},
},
}
@@ -649,7 +649,7 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models with is
"model": "opencode/claude-haiku-4-5",
},
"librarian": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"metis": {
"model": "opencode/claude-opus-4-5",
@@ -660,7 +660,7 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models with is
"variant": "medium",
},
"multimodal-looker": {
"model": "opencode/gemini-3-flash-preview",
"model": "opencode/gemini-3-flash",
},
"oracle": {
"model": "opencode/gpt-5.2",
@@ -677,7 +677,7 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models with is
},
"categories": {
"artistry": {
"model": "opencode/gemini-3-pro-preview",
"model": "opencode/gemini-3-pro",
"variant": "max",
},
"quick": {
@@ -695,10 +695,10 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models with is
"model": "opencode/claude-sonnet-4-5",
},
"visual-engineering": {
"model": "opencode/gemini-3-pro-preview",
"model": "opencode/gemini-3-pro",
},
"writing": {
"model": "opencode/gemini-3-flash-preview",
"model": "opencode/gemini-3-flash",
},
},
}
@@ -712,7 +712,7 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models when
"model": "github-copilot/claude-sonnet-4.5",
},
"explore": {
"model": "opencode/grok-code",
"model": "opencode/gpt-5-nano",
},
"librarian": {
"model": "github-copilot/claude-sonnet-4.5",
@@ -726,7 +726,7 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models when
"variant": "medium",
},
"multimodal-looker": {
"model": "github-copilot/gemini-3-flash-preview",
"model": "github-copilot/gemini-3-flash",
},
"oracle": {
"model": "github-copilot/gpt-5.2",
@@ -742,7 +742,7 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models when
},
"categories": {
"artistry": {
"model": "github-copilot/gemini-3-pro-preview",
"model": "github-copilot/gemini-3-pro",
"variant": "max",
},
"quick": {
@@ -759,10 +759,10 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models when
"model": "github-copilot/claude-sonnet-4.5",
},
"visual-engineering": {
"model": "github-copilot/gemini-3-pro-preview",
"model": "github-copilot/gemini-3-pro",
},
"writing": {
"model": "github-copilot/gemini-3-flash-preview",
"model": "github-copilot/gemini-3-flash",
},
},
}
@@ -776,7 +776,7 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models with
"model": "github-copilot/claude-sonnet-4.5",
},
"explore": {
"model": "opencode/grok-code",
"model": "opencode/gpt-5-nano",
},
"librarian": {
"model": "github-copilot/claude-sonnet-4.5",
@@ -790,7 +790,7 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models with
"variant": "medium",
},
"multimodal-looker": {
"model": "github-copilot/gemini-3-flash-preview",
"model": "github-copilot/gemini-3-flash",
},
"oracle": {
"model": "github-copilot/gpt-5.2",
@@ -807,7 +807,7 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models with
},
"categories": {
"artistry": {
"model": "github-copilot/gemini-3-pro-preview",
"model": "github-copilot/gemini-3-pro",
"variant": "max",
},
"quick": {
@@ -825,10 +825,10 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models with
"model": "github-copilot/claude-sonnet-4.5",
},
"visual-engineering": {
"model": "github-copilot/gemini-3-pro-preview",
"model": "github-copilot/gemini-3-pro",
},
"writing": {
"model": "github-copilot/gemini-3-flash-preview",
"model": "github-copilot/gemini-3-flash",
},
},
}
@@ -839,51 +839,51 @@ exports[`generateModelConfig fallback providers uses ZAI model for librarian whe
"$schema": "https://raw.githubusercontent.com/code-yeongyu/oh-my-opencode/master/assets/oh-my-opencode.schema.json",
"agents": {
"atlas": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"explore": {
"model": "opencode/grok-code",
"model": "opencode/gpt-5-nano",
},
"librarian": {
"model": "zai-coding-plan/glm-4.7",
},
"metis": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"momus": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"multimodal-looker": {
"model": "zai-coding-plan/glm-4.6v",
"model": "zai-coding-plan/glm-4.6",
},
"oracle": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"prometheus": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"sisyphus": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
},
"categories": {
"artistry": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"quick": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"ultrabrain": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"unspecified-high": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"unspecified-low": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"visual-engineering": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"writing": {
"model": "zai-coding-plan/glm-4.7",
@@ -897,28 +897,28 @@ exports[`generateModelConfig fallback providers uses ZAI model for librarian wit
"$schema": "https://raw.githubusercontent.com/code-yeongyu/oh-my-opencode/master/assets/oh-my-opencode.schema.json",
"agents": {
"atlas": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"explore": {
"model": "opencode/grok-code",
"model": "opencode/gpt-5-nano",
},
"librarian": {
"model": "zai-coding-plan/glm-4.7",
},
"metis": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"momus": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"multimodal-looker": {
"model": "zai-coding-plan/glm-4.6v",
"model": "zai-coding-plan/glm-4.6",
},
"oracle": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"prometheus": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"sisyphus": {
"model": "zai-coding-plan/glm-4.7",
@@ -926,22 +926,22 @@ exports[`generateModelConfig fallback providers uses ZAI model for librarian wit
},
"categories": {
"artistry": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"quick": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"ultrabrain": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"unspecified-high": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"unspecified-low": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"visual-engineering": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"writing": {
"model": "zai-coding-plan/glm-4.7",
@@ -961,7 +961,7 @@ exports[`generateModelConfig mixed provider scenarios uses Claude + OpenCode Zen
"model": "anthropic/claude-haiku-4-5",
},
"librarian": {
"model": "opencode/glm-4.7-free",
"model": "opencode/big-pickle",
},
"metis": {
"model": "anthropic/claude-opus-4-5",
@@ -972,7 +972,7 @@ exports[`generateModelConfig mixed provider scenarios uses Claude + OpenCode Zen
"variant": "medium",
},
"multimodal-looker": {
"model": "opencode/gemini-3-flash-preview",
"model": "opencode/gemini-3-flash",
},
"oracle": {
"model": "opencode/gpt-5.2",
@@ -988,7 +988,7 @@ exports[`generateModelConfig mixed provider scenarios uses Claude + OpenCode Zen
},
"categories": {
"artistry": {
"model": "opencode/gemini-3-pro-preview",
"model": "opencode/gemini-3-pro",
"variant": "max",
},
"quick": {
@@ -1005,10 +1005,10 @@ exports[`generateModelConfig mixed provider scenarios uses Claude + OpenCode Zen
"model": "anthropic/claude-sonnet-4-5",
},
"visual-engineering": {
"model": "opencode/gemini-3-pro-preview",
"model": "opencode/gemini-3-pro",
},
"writing": {
"model": "opencode/gemini-3-flash-preview",
"model": "opencode/gemini-3-flash",
},
},
}
@@ -1022,7 +1022,7 @@ exports[`generateModelConfig mixed provider scenarios uses OpenAI + Copilot comb
"model": "github-copilot/claude-sonnet-4.5",
},
"explore": {
"model": "opencode/grok-code",
"model": "opencode/gpt-5-nano",
},
"librarian": {
"model": "github-copilot/claude-sonnet-4.5",
@@ -1036,7 +1036,7 @@ exports[`generateModelConfig mixed provider scenarios uses OpenAI + Copilot comb
"variant": "medium",
},
"multimodal-looker": {
"model": "github-copilot/gemini-3-flash-preview",
"model": "github-copilot/gemini-3-flash",
},
"oracle": {
"model": "openai/gpt-5.2",
@@ -1052,7 +1052,7 @@ exports[`generateModelConfig mixed provider scenarios uses OpenAI + Copilot comb
},
"categories": {
"artistry": {
"model": "github-copilot/gemini-3-pro-preview",
"model": "github-copilot/gemini-3-pro",
"variant": "max",
},
"quick": {
@@ -1069,10 +1069,10 @@ exports[`generateModelConfig mixed provider scenarios uses OpenAI + Copilot comb
"model": "github-copilot/claude-sonnet-4.5",
},
"visual-engineering": {
"model": "github-copilot/gemini-3-pro-preview",
"model": "github-copilot/gemini-3-pro",
},
"writing": {
"model": "github-copilot/gemini-3-flash-preview",
"model": "github-copilot/gemini-3-flash",
},
},
}
@@ -1163,7 +1163,7 @@ exports[`generateModelConfig mixed provider scenarios uses Gemini + Claude combi
"model": "anthropic/claude-opus-4-5",
},
"multimodal-looker": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
"oracle": {
"model": "anthropic/claude-opus-4-5",
@@ -1179,7 +1179,7 @@ exports[`generateModelConfig mixed provider scenarios uses Gemini + Claude combi
},
"categories": {
"artistry": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
"variant": "max",
},
"quick": {
@@ -1196,10 +1196,10 @@ exports[`generateModelConfig mixed provider scenarios uses Gemini + Claude combi
"model": "anthropic/claude-sonnet-4-5",
},
"visual-engineering": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
"writing": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
},
}
@@ -1227,7 +1227,7 @@ exports[`generateModelConfig mixed provider scenarios uses all fallback provider
"variant": "medium",
},
"multimodal-looker": {
"model": "github-copilot/gemini-3-flash-preview",
"model": "github-copilot/gemini-3-flash",
},
"oracle": {
"model": "github-copilot/gpt-5.2",
@@ -1243,7 +1243,7 @@ exports[`generateModelConfig mixed provider scenarios uses all fallback provider
},
"categories": {
"artistry": {
"model": "github-copilot/gemini-3-pro-preview",
"model": "github-copilot/gemini-3-pro",
"variant": "max",
},
"quick": {
@@ -1260,10 +1260,10 @@ exports[`generateModelConfig mixed provider scenarios uses all fallback provider
"model": "github-copilot/claude-sonnet-4.5",
},
"visual-engineering": {
"model": "github-copilot/gemini-3-pro-preview",
"model": "github-copilot/gemini-3-pro",
},
"writing": {
"model": "github-copilot/gemini-3-flash-preview",
"model": "github-copilot/gemini-3-flash",
},
},
}
@@ -1291,7 +1291,7 @@ exports[`generateModelConfig mixed provider scenarios uses all providers togethe
"variant": "medium",
},
"multimodal-looker": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
"oracle": {
"model": "openai/gpt-5.2",
@@ -1307,7 +1307,7 @@ exports[`generateModelConfig mixed provider scenarios uses all providers togethe
},
"categories": {
"artistry": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
"variant": "max",
},
"quick": {
@@ -1324,10 +1324,10 @@ exports[`generateModelConfig mixed provider scenarios uses all providers togethe
"model": "anthropic/claude-sonnet-4-5",
},
"visual-engineering": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
"writing": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
},
}
@@ -1355,7 +1355,7 @@ exports[`generateModelConfig mixed provider scenarios uses all providers with is
"variant": "medium",
},
"multimodal-looker": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
"oracle": {
"model": "openai/gpt-5.2",
@@ -1372,7 +1372,7 @@ exports[`generateModelConfig mixed provider scenarios uses all providers with is
},
"categories": {
"artistry": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
"variant": "max",
},
"quick": {
@@ -1390,10 +1390,10 @@ exports[`generateModelConfig mixed provider scenarios uses all providers with is
"model": "anthropic/claude-sonnet-4-5",
},
"visual-engineering": {
"model": "google/gemini-3-pro-preview",
"model": "google/gemini-3-pro",
},
"writing": {
"model": "google/gemini-3-flash-preview",
"model": "google/gemini-3-flash",
},
},
}
+1 -1
View File
@@ -277,7 +277,7 @@ describe("generateOmoConfig - model fallback system", () => {
// #then should use ultimate fallback for all agents
expect(result.$schema).toBe("https://raw.githubusercontent.com/code-yeongyu/oh-my-opencode/master/assets/oh-my-opencode.schema.json")
expect((result.agents as Record<string, { model: string }>).sisyphus.model).toBe("opencode/glm-4.7-free")
expect((result.agents as Record<string, { model: string }>).sisyphus.model).toBe("opencode/big-pickle")
})
test("uses zai-coding-plan/glm-4.7 for librarian when Z.ai available", () => {
@@ -27,7 +27,7 @@ describe("model-resolution check", () => {
// #then: Should have category entries
const visual = info.categories.find((c) => c.name === "visual-engineering")
expect(visual).toBeDefined()
expect(visual!.requirement.fallbackChain[0]?.model).toBe("gemini-3-pro-preview")
expect(visual!.requirement.fallbackChain[0]?.model).toBe("gemini-3-pro")
expect(visual!.requirement.fallbackChain[0]?.providers).toContain("google")
})
})
+3 -3
View File
@@ -178,7 +178,7 @@ async function runTuiMode(detected: DetectedConfig): Promise<InstallConfig | nul
const claude = await p.select({
message: "Do you have a Claude Pro/Max subscription?",
options: [
{ value: "no" as const, label: "No", hint: "Will use opencode/glm-4.7-free as fallback" },
{ value: "no" as const, label: "No", hint: "Will use opencode/big-pickle as fallback" },
{ value: "yes" as const, label: "Yes (standard)", hint: "Claude Opus 4.5 for orchestration" },
{ value: "max20" as const, label: "Yes (max20 mode)", hint: "Full power with Claude Sonnet 4.5 for Librarian" },
],
@@ -363,7 +363,7 @@ async function runNonTuiInstall(args: InstallArgs): Promise<number> {
}
if (!config.hasClaude && !config.hasOpenAI && !config.hasGemini && !config.hasCopilot && !config.hasOpencodeZen) {
printWarning("No model providers configured. Using opencode/glm-4.7-free as fallback.")
printWarning("No model providers configured. Using opencode/big-pickle as fallback.")
}
console.log(`${SYMBOLS.star} ${color.bold(color.green(isUpdate ? "Configuration updated!" : "Installation complete!"))}`)
@@ -480,7 +480,7 @@ export async function install(args: InstallArgs): Promise<number> {
}
if (!config.hasClaude && !config.hasOpenAI && !config.hasGemini && !config.hasCopilot && !config.hasOpencodeZen) {
p.log.warn("No model providers configured. Using opencode/glm-4.7-free as fallback.")
p.log.warn("No model providers configured. Using opencode/big-pickle as fallback.")
}
p.note(formatConfigSummary(config), isUpdate ? "Updated Configuration" : "Installation Complete")
+6 -6
View File
@@ -310,15 +310,15 @@ describe("generateModelConfig", () => {
})
describe("explore agent special cases", () => {
test("explore uses grok-code when only Gemini available (no Claude)", () => {
test("explore uses gpt-5-nano when only Gemini available (no Claude)", () => {
// #given only Gemini is available (no Claude)
const config = createConfig({ hasGemini: true })
// #when generateModelConfig is called
const result = generateModelConfig(config)
// #then explore should use grok-code (Claude haiku not available)
expect(result.agents?.explore?.model).toBe("opencode/grok-code")
// #then explore should use gpt-5-nano (Claude haiku not available)
expect(result.agents?.explore?.model).toBe("opencode/gpt-5-nano")
})
test("explore uses Claude haiku when Claude available", () => {
@@ -343,15 +343,15 @@ describe("generateModelConfig", () => {
expect(result.agents?.explore?.model).toBe("anthropic/claude-haiku-4-5")
})
test("explore uses grok-code when only OpenAI available", () => {
test("explore uses gpt-5-nano when only OpenAI available", () => {
// #given only OpenAI is available
const config = createConfig({ hasOpenAI: true })
// #when generateModelConfig is called
const result = generateModelConfig(config)
// #then explore should use grok-code (fallback)
expect(result.agents?.explore?.model).toBe("opencode/grok-code")
// #then explore should use gpt-5-nano (fallback)
expect(result.agents?.explore?.model).toBe("opencode/gpt-5-nano")
})
})
+4 -4
View File
@@ -36,7 +36,7 @@ export interface GeneratedOmoConfig {
const ZAI_MODEL = "zai-coding-plan/glm-4.7"
const ULTIMATE_FALLBACK = "opencode/glm-4.7-free"
const ULTIMATE_FALLBACK = "opencode/big-pickle"
const SCHEMA_URL = "https://raw.githubusercontent.com/code-yeongyu/oh-my-opencode/master/assets/oh-my-opencode.schema.json"
function toProviderAvailability(config: InstallConfig): ProviderAvailability {
@@ -103,7 +103,7 @@ function getSisyphusFallbackChain(isMaxPlan: boolean): FallbackEntry[] {
return [
{ providers: ["anthropic", "github-copilot", "opencode"], model: "claude-sonnet-4-5" },
{ providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2", variant: "high" },
{ providers: ["google", "github-copilot", "opencode"], model: "gemini-3-pro-preview" },
{ providers: ["google", "github-copilot", "opencode"], model: "gemini-3-pro" },
]
}
@@ -139,14 +139,14 @@ export function generateModelConfig(config: InstallConfig): GeneratedOmoConfig {
continue
}
// Special case: explore uses Claude haiku → OpenCode grok-code
// Special case: explore uses Claude haiku → 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 {
agents[role] = { model: "opencode/grok-code" }
agents[role] = { model: "opencode/gpt-5-nano" }
}
continue
}