diff --git a/docs/guide/agent-model-matching.md b/docs/guide/agent-model-matching.md
index 8c750a9b2..c2115039b 100644
--- a/docs/guide/agent-model-matching.md
+++ b/docs/guide/agent-model-matching.md
@@ -92,8 +92,8 @@ These agents do grep, search, and retrieval. They intentionally use the fastest,
| Agent | Role | Fallback Chain | Notes |
| --------------------- | ------------------ | ---------------------------------------------- | ----------------------------------------------------- |
-| **Explore** | Fast codebase grep | github-copilot\|xai\|vercel/grok-code-fast-1 → opencode-go\|vercel/minimax-m2.7-highspeed → opencode\|vercel/minimax-m2.7 → anthropic\|opencode\|vercel/claude-haiku-4-5 → opencode\|vercel/gpt-5-nano | Exact runtime chain from `src/shared/model-requirements.ts`. |
-| **Librarian** | Docs/code search | opencode-go\|vercel/minimax-m2.7 → opencode\|vercel/minimax-m2.7-highspeed → anthropic\|opencode\|vercel/claude-haiku-4-5 → opencode\|vercel/gpt-5-nano | Exact runtime chain from `src/shared/model-requirements.ts`. |
+| **Explore** | Fast codebase grep | openai/gpt-5.4-mini-fast → opencode-go\|vercel/minimax-m2.7-highspeed → opencode-go\|vercel/minimax-m2.7 → anthropic\|opencode\|vercel/claude-haiku-4-5 → openai\|opencode\|vercel/gpt-5.4-nano | Exact runtime chain from `src/shared/model-requirements.ts`. |
+| **Librarian** | Docs/code search | openai/gpt-5.4-mini-fast → opencode-go\|vercel/minimax-m2.7-highspeed → opencode-go\|vercel/minimax-m2.7 → anthropic\|opencode\|vercel/claude-haiku-4-5 → openai\|opencode\|vercel/gpt-5.4-nano | Exact runtime chain from `src/shared/model-requirements.ts`. |
| **Multimodal Looker** | Vision/screenshots | openai\|opencode\|vercel/gpt-5.4 (medium) → opencode-go\|vercel/kimi-k2.5 → zai-coding-plan\|vercel/glm-4.6v → openai\|github-copilot\|opencode\|vercel/gpt-5-nano | Exact runtime chain from `src/shared/model-requirements.ts`. |
| **Sisyphus-Junior** | Category executor | anthropic\|github-copilot\|opencode\|vercel/claude-sonnet-4-6 → opencode-go\|vercel/kimi-k2.5 → openai\|github-copilot\|opencode\|vercel/gpt-5.4 (medium) → opencode-go\|vercel/minimax-m2.7 → opencode/big-pickle | Exact runtime chain from `src/shared/model-requirements.ts`. |
@@ -130,7 +130,7 @@ Principle-driven, explicit reasoning, deep technical capability. Best for agents
| -------------------- | ------------------------------------------------------------------------------------------------------------ |
| **Gemini 3.1 Pro** | Excels at visual/frontend tasks. Different reasoning style. Default for `visual-engineering` and `artistry`. |
| **Gemini 3 Flash** | Fast. Good for doc search and light tasks. |
-| **Grok Code Fast 1** | Blazing fast code grep. Default for Explore agent. |
+| **GPT-5.4 Mini Fast** | Default for Explore and Librarian agents. Blazing-fast reasoning-capable mini model. |
| **MiniMax M2.7** | Fast and smart. Used in OpenCode Go and OpenCode Zen utility fallback chains. |
| **MiniMax M2.7 Highspeed** | High-speed OpenCode catalog entry used in utility fallback chains that prefer the fastest available MiniMax path. |
@@ -144,8 +144,8 @@ A premium subscription tier ($10/month) that provides reliable access to Chinese
| ------------------------ | --------------------------------------------------------------------- |
| **opencode-go/kimi-k2.5** | Vision-capable, Claude-like reasoning. Used by Sisyphus, Atlas, Sisyphus-Junior, Multimodal Looker. |
| **opencode-go/glm-5** | Text-only orchestration model. Used by Oracle, Prometheus, Metis, Momus. |
-| **opencode-go/minimax-m2.7** | Ultra-cheap, fast responses. Used by Librarian, Atlas, and Sisyphus-Junior for utility work. |
-| **opencode-go/minimax-m2.7-highspeed** | Even faster OpenCode Go MiniMax entry used by Explore when the high-speed catalog entry is available. |
+| **opencode-go/minimax-m2.7** | Ultra-cheap, fast responses. Used by Atlas, Sisyphus-Junior, Explore and Librarian fallbacks for utility work. |
+| **opencode-go/minimax-m2.7-highspeed** | Even faster OpenCode Go MiniMax entry used as a secondary fallback for Explore and Librarian when GPT-5.4 Mini Fast is unavailable. |
**When It Gets Used:**
diff --git a/docs/guide/orchestration.md b/docs/guide/orchestration.md
index 0e21ce50a..b25a93bbb 100644
--- a/docs/guide/orchestration.md
+++ b/docs/guide/orchestration.md
@@ -47,8 +47,8 @@ flowchart TB
subgraph Workers["Worker Layer (Specialized Agents)"]
Junior[" Sisyphus-Junior
(Task Executor)
claude-sonnet-4-6 / kimi-k2.5 / gpt-5.4 / minimax-m2.7"]
Oracle[" Oracle
(Architecture)
gpt-5.4 / gemini-3.1-pro / claude-opus-4-7 / glm-5"]
- Explore[" Explore
(Codebase Grep)
grok-code-fast-1 / minimax-m2.7-highspeed / claude-haiku-4-5"]
- Librarian[" Librarian
(Docs/OSS)
minimax-m2.7 / minimax-m2.7-highspeed / claude-haiku-4-5"]
+ Explore[" Explore
(Codebase Grep)
gpt-5.4-mini-fast / minimax-m2.7-highspeed / claude-haiku-4-5"]
+ Librarian[" Librarian
(Docs/OSS)
gpt-5.4-mini-fast / minimax-m2.7-highspeed / claude-haiku-4-5"]
Frontend[" visual-engineering
(category + frontend-ui-ux)
gemini-3.1-pro / glm-5 / claude-opus-4-7"]
end
diff --git a/docs/reference/configuration.md b/docs/reference/configuration.md
index 04f510b6d..3f59a7f7c 100644
--- a/docs/reference/configuration.md
+++ b/docs/reference/configuration.md
@@ -358,8 +358,8 @@ Capability data comes from provider runtime metadata first. OmO also ships bundl
| **Sisyphus** | `claude-opus-4-7` | `anthropic\|github-copilot\|opencode/claude-opus-4-7 (max)` → `opencode-go/kimi-k2.5` → `kimi-for-coding/k2p5` → `opencode\|moonshotai\|moonshotai-cn\|firmware\|ollama-cloud\|aihubmix/kimi-k2.5` → `openai\|github-copilot\|opencode/gpt-5.4 (medium)` → `zai-coding-plan\|opencode/glm-5` → `opencode/big-pickle` |
| **Hephaestus** | `gpt-5.4` | `gpt-5.4 (medium)` |
| **oracle** | `gpt-5.4` | `openai\|github-copilot\|opencode/gpt-5.4 (high)` → `google\|github-copilot\|opencode/gemini-3.1-pro (high)` → `anthropic\|github-copilot\|opencode/claude-opus-4-7 (max)` → `opencode-go/glm-5` |
-| **librarian** | `minimax-m2.7` | `opencode-go/minimax-m2.7` → `opencode/minimax-m2.7-highspeed` → `anthropic\|opencode/claude-haiku-4-5` → `opencode/gpt-5-nano` |
-| **explore** | `grok-code-fast-1` | `github-copilot\|xai/grok-code-fast-1` → `opencode-go/minimax-m2.7-highspeed` → `opencode/minimax-m2.7` → `anthropic\|opencode/claude-haiku-4-5` → `opencode/gpt-5-nano` |
+| **librarian** | `gpt-5.4-mini-fast` | `openai/gpt-5.4-mini-fast` → `opencode-go\|vercel/minimax-m2.7-highspeed` → `opencode-go\|vercel/minimax-m2.7` → `anthropic\|opencode\|vercel/claude-haiku-4-5` → `openai\|opencode\|vercel/gpt-5.4-nano` |
+| **explore** | `gpt-5.4-mini-fast` | `openai/gpt-5.4-mini-fast` → `opencode-go\|vercel/minimax-m2.7-highspeed` → `opencode-go\|vercel/minimax-m2.7` → `anthropic\|opencode\|vercel/claude-haiku-4-5` → `openai\|opencode\|vercel/gpt-5.4-nano` |
| **multimodal-looker** | `gpt-5.4` | `openai\|opencode/gpt-5.4 (medium)` → `opencode-go/kimi-k2.5` → `zai-coding-plan/glm-4.6v` → `openai\|github-copilot\|opencode/gpt-5-nano` |
| **Prometheus** | `claude-opus-4-7` | `anthropic\|github-copilot\|opencode/claude-opus-4-7 (max)` → `openai\|github-copilot\|opencode/gpt-5.4 (high)` → `opencode-go/glm-5` → `google\|github-copilot\|opencode/gemini-3.1-pro` |
| **Metis** | `claude-opus-4-7` | `anthropic\|github-copilot\|opencode/claude-opus-4-7 (max)` → `openai\|github-copilot\|opencode/gpt-5.4 (high)` → `opencode-go/glm-5` → `kimi-for-coding/k2p5` |
diff --git a/docs/reference/features.md b/docs/reference/features.md
index 366554b6c..ab5f3925c 100644
--- a/docs/reference/features.md
+++ b/docs/reference/features.md
@@ -13,8 +13,8 @@ Core-agent tab cycling is deterministic via injected runtime order field. The fi
| **Sisyphus** | `claude-opus-4-7` | The default orchestrator. Plans, delegates, and executes complex tasks using specialized subagents with aggressive parallel execution. Todo-driven workflow with extended thinking (32k budget). Fallback: `opencode-go/kimi-k2.5` → `kimi-for-coding/k2p5` → `opencode\|moonshotai\|moonshotai-cn\|firmware\|ollama-cloud\|aihubmix/kimi-k2.5` → `openai\|github-copilot\|opencode/gpt-5.4 (medium)` → `zai-coding-plan\|opencode/glm-5` → `opencode/big-pickle`. |
| **Hephaestus** | `gpt-5.4` | The Legitimate Craftsman. Autonomous deep worker inspired by AmpCode's deep mode. Goal-oriented execution with thorough research before action. Explores codebase patterns, completes tasks end-to-end without premature stopping. Named after the Greek god of forge and craftsmanship. Requires a GPT-capable provider. |
| **Oracle** | `gpt-5.4` | Architecture decisions, code review, debugging. Read-only consultation with stellar logical reasoning and deep analysis. Inspired by AmpCode. Fallback: `google\|github-copilot\|opencode/gemini-3.1-pro (high)` → `anthropic\|github-copilot\|opencode/claude-opus-4-7 (max)` → `opencode-go/glm-5`. |
-| **Librarian** | `minimax-m2.7` | Multi-repo analysis, documentation lookup, OSS implementation examples. Deep codebase understanding with evidence-based answers. Fallback: `opencode/minimax-m2.7-highspeed` → `anthropic\|opencode/claude-haiku-4-5` → `opencode/gpt-5-nano`. |
-| **Explore** | `grok-code-fast-1` | Fast codebase exploration and contextual grep. Fallback: `opencode-go/minimax-m2.7-highspeed` → `opencode/minimax-m2.7` → `anthropic\|opencode/claude-haiku-4-5` → `opencode/gpt-5-nano`. |
+| **Librarian** | `gpt-5.4-mini-fast` | Multi-repo analysis, documentation lookup, OSS implementation examples. Deep codebase understanding with evidence-based answers. Fallback: `opencode-go/minimax-m2.7-highspeed` → `opencode-go/minimax-m2.7` → `anthropic\|opencode/claude-haiku-4-5` → `openai\|opencode/gpt-5.4-nano`. |
+| **Explore** | `gpt-5.4-mini-fast` | Fast codebase exploration and contextual grep. Fallback: `opencode-go/minimax-m2.7-highspeed` → `opencode-go/minimax-m2.7` → `anthropic\|opencode/claude-haiku-4-5` → `openai\|opencode/gpt-5.4-nano`. |
| **Multimodal-Looker** | `gpt-5.4` | Visual content specialist. Analyzes PDFs, images, diagrams to extract information. Fallback: `opencode-go/kimi-k2.5` → `zai-coding-plan/glm-4.6v` → `openai\|github-copilot\|opencode/gpt-5-nano`. |
### Planning Agents
diff --git a/src/agents/AGENTS.md b/src/agents/AGENTS.md
index f92c44406..c69c0608a 100644
--- a/src/agents/AGENTS.md
+++ b/src/agents/AGENTS.md
@@ -13,8 +13,8 @@ Agent factories following `createXXXAgent(model) → AgentConfig` pattern. Each
| **Sisyphus** | claude-opus-4-7 max | 0.1 | all | k2p5 -> kimi-k2.5 -> gpt-5.4 medium -> glm-5 -> big-pickle | Main orchestrator, plans + delegates |
| **Hephaestus** | gpt-5.4 medium | 0.1 | all | — | Autonomous deep worker |
| **Oracle** | gpt-5.4 high | 0.1 | subagent | gemini-3.1-pro high -> claude-opus-4-7 max | Read-only consultation |
-| **Librarian** | minimax-m2.7 | 0.1 | subagent | minimax-m2.7-highspeed -> claude-haiku-4-5 -> gpt-5-nano | External docs/code search |
-| **Explore** | grok-code-fast-1 | 0.1 | subagent | minimax-m2.7-highspeed -> minimax-m2.7 -> claude-haiku-4-5 -> gpt-5-nano | Contextual grep |
+| **Librarian** | gpt-5.4-mini-fast | 0.1 | subagent | minimax-m2.7-highspeed -> minimax-m2.7 -> claude-haiku-4-5 -> gpt-5.4-nano | External docs/code search |
+| **Explore** | gpt-5.4-mini-fast | 0.1 | subagent | minimax-m2.7-highspeed -> minimax-m2.7 -> claude-haiku-4-5 -> gpt-5.4-nano | Contextual grep |
| **Multimodal-Looker** | gpt-5.3-codex medium | 0.1 | subagent | k2p5 -> gemini-3-flash -> glm-4.6v -> gpt-5-nano | PDF/image analysis |
| **Metis** | claude-opus-4-7 max | **0.3** | subagent | gpt-5.4 high -> gemini-3.1-pro high | Pre-planning consultant |
| **Momus** | gpt-5.4 xhigh | 0.1 | subagent | claude-opus-4-7 max -> gemini-3.1-pro high | Plan reviewer |
diff --git a/src/cli/__snapshots__/model-fallback.test.ts.snap b/src/cli/__snapshots__/model-fallback.test.ts.snap
index dc2bac7a6..ddc9a60a0 100644
--- a/src/cli/__snapshots__/model-fallback.test.ts.snap
+++ b/src/cli/__snapshots__/model-fallback.test.ts.snap
@@ -206,16 +206,14 @@ exports[`generateModelConfig single native provider uses OpenAI models when only
"variant": "medium",
},
"explore": {
- "model": "openai/gpt-5.4",
- "variant": "medium",
+ "model": "openai/gpt-5.4-mini-fast",
},
"hephaestus": {
"model": "openai/gpt-5.4",
"variant": "medium",
},
"librarian": {
- "model": "openai/gpt-5.4",
- "variant": "medium",
+ "model": "openai/gpt-5.4-mini-fast",
},
"metis": {
"model": "openai/gpt-5.4",
@@ -296,16 +294,14 @@ exports[`generateModelConfig single native provider uses OpenAI models with isMa
"variant": "medium",
},
"explore": {
- "model": "openai/gpt-5.4",
- "variant": "medium",
+ "model": "openai/gpt-5.4-mini-fast",
},
"hephaestus": {
"model": "openai/gpt-5.4",
"variant": "medium",
},
"librarian": {
- "model": "openai/gpt-5.4",
- "variant": "medium",
+ "model": "openai/gpt-5.4-mini-fast",
},
"metis": {
"model": "openai/gpt-5.4",
@@ -519,12 +515,31 @@ exports[`generateModelConfig all native providers uses preferred models from fal
"model": "anthropic/claude-sonnet-4-6",
},
"explore": {
- "model": "anthropic/claude-haiku-4-5",
+ "fallback_models": [
+ {
+ "model": "anthropic/claude-haiku-4-5",
+ },
+ {
+ "model": "openai/gpt-5.4-nano",
+ },
+ ],
+ "model": "openai/gpt-5.4-mini-fast",
},
"hephaestus": {
"model": "openai/gpt-5.4",
"variant": "medium",
},
+ "librarian": {
+ "fallback_models": [
+ {
+ "model": "anthropic/claude-haiku-4-5",
+ },
+ {
+ "model": "openai/gpt-5.4-nano",
+ },
+ ],
+ "model": "openai/gpt-5.4-mini-fast",
+ },
"metis": {
"fallback_models": [
{
@@ -718,12 +733,31 @@ exports[`generateModelConfig all native providers uses preferred models with isM
"model": "anthropic/claude-sonnet-4-6",
},
"explore": {
- "model": "anthropic/claude-haiku-4-5",
+ "fallback_models": [
+ {
+ "model": "anthropic/claude-haiku-4-5",
+ },
+ {
+ "model": "openai/gpt-5.4-nano",
+ },
+ ],
+ "model": "openai/gpt-5.4-mini-fast",
},
"hephaestus": {
"model": "openai/gpt-5.4",
"variant": "medium",
},
+ "librarian": {
+ "fallback_models": [
+ {
+ "model": "anthropic/claude-haiku-4-5",
+ },
+ {
+ "model": "openai/gpt-5.4-nano",
+ },
+ ],
+ "model": "openai/gpt-5.4-mini-fast",
+ },
"metis": {
"fallback_models": [
{
@@ -917,10 +951,7 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models when on
"explore": {
"fallback_models": [
{
- "model": "opencode/minimax-m2.7",
- },
- {
- "model": "opencode/gpt-5-nano",
+ "model": "opencode/gpt-5.4-nano",
},
],
"model": "opencode/claude-haiku-4-5",
@@ -1142,10 +1173,7 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models with is
"explore": {
"fallback_models": [
{
- "model": "opencode/minimax-m2.7",
- },
- {
- "model": "opencode/gpt-5-nano",
+ "model": "opencode/gpt-5.4-nano",
},
],
"model": "opencode/claude-haiku-4-5",
@@ -1369,11 +1397,6 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models when
"model": "github-copilot/claude-sonnet-4.6",
},
"explore": {
- "fallback_models": [
- {
- "model": "github-copilot/grok-code-fast-1",
- },
- ],
"model": "github-copilot/gpt-5-mini",
},
"hephaestus": {
@@ -1555,11 +1578,6 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models with
"model": "github-copilot/claude-sonnet-4.6",
},
"explore": {
- "fallback_models": [
- {
- "model": "github-copilot/grok-code-fast-1",
- },
- ],
"model": "github-copilot/gpt-5-mini",
},
"hephaestus": {
@@ -1869,14 +1887,11 @@ exports[`generateModelConfig mixed provider scenarios uses Claude + OpenCode Zen
},
"explore": {
"fallback_models": [
- {
- "model": "opencode/minimax-m2.7",
- },
{
"model": "opencode/claude-haiku-4-5",
},
{
- "model": "opencode/gpt-5-nano",
+ "model": "opencode/gpt-5.4-nano",
},
],
"model": "anthropic/claude-haiku-4-5",
@@ -2153,10 +2168,10 @@ exports[`generateModelConfig mixed provider scenarios uses OpenAI + Copilot comb
"explore": {
"fallback_models": [
{
- "model": "github-copilot/grok-code-fast-1",
+ "model": "openai/gpt-5.4-nano",
},
],
- "model": "github-copilot/gpt-5-mini",
+ "model": "openai/gpt-5.4-mini-fast",
},
"hephaestus": {
"fallback_models": [
@@ -2168,6 +2183,14 @@ exports[`generateModelConfig mixed provider scenarios uses OpenAI + Copilot comb
"model": "openai/gpt-5.4",
"variant": "medium",
},
+ "librarian": {
+ "fallback_models": [
+ {
+ "model": "openai/gpt-5.4-nano",
+ },
+ ],
+ "model": "openai/gpt-5.4-mini-fast",
+ },
"metis": {
"fallback_models": [
{
@@ -2622,13 +2645,7 @@ exports[`generateModelConfig mixed provider scenarios uses all fallback provider
"explore": {
"fallback_models": [
{
- "model": "github-copilot/grok-code-fast-1",
- },
- {
- "model": "opencode/minimax-m2.7",
- },
- {
- "model": "opencode/gpt-5-nano",
+ "model": "opencode/gpt-5.4-nano",
},
],
"model": "opencode/claude-haiku-4-5",
@@ -2645,14 +2662,11 @@ exports[`generateModelConfig mixed provider scenarios uses all fallback provider
},
"librarian": {
"fallback_models": [
- {
- "model": "opencode/minimax-m2.7-highspeed",
- },
{
"model": "opencode/claude-haiku-4-5",
},
{
- "model": "opencode/gpt-5-nano",
+ "model": "opencode/gpt-5.4-nano",
},
],
"model": "zai-coding-plan/glm-4.7",
@@ -3020,19 +3034,19 @@ exports[`generateModelConfig mixed provider scenarios uses all providers togethe
"explore": {
"fallback_models": [
{
- "model": "github-copilot/grok-code-fast-1",
- },
- {
- "model": "opencode/minimax-m2.7",
+ "model": "anthropic/claude-haiku-4-5",
},
{
"model": "opencode/claude-haiku-4-5",
},
{
- "model": "opencode/gpt-5-nano",
+ "model": "openai/gpt-5.4-nano",
+ },
+ {
+ "model": "opencode/gpt-5.4-nano",
},
],
- "model": "anthropic/claude-haiku-4-5",
+ "model": "openai/gpt-5.4-mini-fast",
},
"hephaestus": {
"fallback_models": [
@@ -3050,9 +3064,6 @@ exports[`generateModelConfig mixed provider scenarios uses all providers togethe
},
"librarian": {
"fallback_models": [
- {
- "model": "opencode/minimax-m2.7-highspeed",
- },
{
"model": "anthropic/claude-haiku-4-5",
},
@@ -3060,10 +3071,13 @@ exports[`generateModelConfig mixed provider scenarios uses all providers togethe
"model": "opencode/claude-haiku-4-5",
},
{
- "model": "opencode/gpt-5-nano",
+ "model": "openai/gpt-5.4-nano",
+ },
+ {
+ "model": "opencode/gpt-5.4-nano",
},
],
- "model": "zai-coding-plan/glm-4.7",
+ "model": "openai/gpt-5.4-mini-fast",
},
"metis": {
"fallback_models": [
@@ -3571,19 +3585,19 @@ exports[`generateModelConfig mixed provider scenarios uses all providers with is
"explore": {
"fallback_models": [
{
- "model": "github-copilot/grok-code-fast-1",
- },
- {
- "model": "opencode/minimax-m2.7",
+ "model": "anthropic/claude-haiku-4-5",
},
{
"model": "opencode/claude-haiku-4-5",
},
{
- "model": "opencode/gpt-5-nano",
+ "model": "openai/gpt-5.4-nano",
+ },
+ {
+ "model": "opencode/gpt-5.4-nano",
},
],
- "model": "anthropic/claude-haiku-4-5",
+ "model": "openai/gpt-5.4-mini-fast",
},
"hephaestus": {
"fallback_models": [
@@ -3601,9 +3615,6 @@ exports[`generateModelConfig mixed provider scenarios uses all providers with is
},
"librarian": {
"fallback_models": [
- {
- "model": "opencode/minimax-m2.7-highspeed",
- },
{
"model": "anthropic/claude-haiku-4-5",
},
@@ -3611,10 +3622,13 @@ exports[`generateModelConfig mixed provider scenarios uses all providers with is
"model": "opencode/claude-haiku-4-5",
},
{
- "model": "opencode/gpt-5-nano",
+ "model": "openai/gpt-5.4-nano",
+ },
+ {
+ "model": "opencode/gpt-5.4-nano",
},
],
- "model": "zai-coding-plan/glm-4.7",
+ "model": "openai/gpt-5.4-mini-fast",
},
"metis": {
"fallback_models": [
@@ -4120,9 +4134,6 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin
},
"explore": {
"fallback_models": [
- {
- "model": "vercel/xai/grok-code-fast-1",
- },
{
"model": "vercel/minimax/minimax-m2.7",
},
@@ -4130,7 +4141,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin
"model": "vercel/anthropic/claude-haiku-4.5",
},
{
- "model": "vercel/openai/gpt-5-nano",
+ "model": "vercel/openai/gpt-5.4-nano",
},
],
"model": "vercel/minimax/minimax-m2.7-highspeed",
@@ -4148,7 +4159,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin
"model": "vercel/anthropic/claude-haiku-4.5",
},
{
- "model": "vercel/openai/gpt-5-nano",
+ "model": "vercel/openai/gpt-5.4-nano",
},
],
"model": "vercel/minimax/minimax-m2.7",
@@ -4413,9 +4424,6 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin
},
"explore": {
"fallback_models": [
- {
- "model": "vercel/xai/grok-code-fast-1",
- },
{
"model": "vercel/minimax/minimax-m2.7",
},
@@ -4423,7 +4431,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin
"model": "vercel/anthropic/claude-haiku-4.5",
},
{
- "model": "vercel/openai/gpt-5-nano",
+ "model": "vercel/openai/gpt-5.4-nano",
},
],
"model": "vercel/minimax/minimax-m2.7-highspeed",
@@ -4441,7 +4449,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin
"model": "vercel/anthropic/claude-haiku-4.5",
},
{
- "model": "vercel/openai/gpt-5-nano",
+ "model": "vercel/openai/gpt-5.4-nano",
},
],
"model": "vercel/minimax/minimax-m2.7",
diff --git a/src/cli/model-fallback.test.ts b/src/cli/model-fallback.test.ts
index 67fa83fd7..ec27d40c6 100644
--- a/src/cli/model-fallback.test.ts
+++ b/src/cli/model-fallback.test.ts
@@ -355,9 +355,9 @@ describe("generateModelConfig", () => {
// #when generateModelConfig is called
const result = generateModelConfig(config)
- // #then explore should use native OpenAI model
- expect(result.agents?.explore?.model).toBe("openai/gpt-5.4")
- expect(result.agents?.explore?.variant).toBe("medium")
+ // #then explore should use native OpenAI mini-fast (primary model)
+ expect(result.agents?.explore?.model).toBe("openai/gpt-5.4-mini-fast")
+ expect(result.agents?.explore?.variant).toBeUndefined()
})
test("explore uses gpt-5-mini when only Copilot available", () => {
@@ -553,15 +553,15 @@ describe("generateModelConfig", () => {
})
describe("special-case agents include fallback_models", () => {
- test("explore includes fallback_models when Copilot and Claude are both available", () => {
- // #given both Copilot and Claude are available
- const config = createConfig({ hasCopilot: true, hasClaude: true })
+ test("explore includes fallback_models when OpenAI and Claude are both available", () => {
+ // #given both OpenAI and Claude are available
+ const config = createConfig({ hasOpenAI: true, hasClaude: true })
// #when generateModelConfig is called
const result = generateModelConfig(config)
// #then explore should have fallback_models from the remaining chain entries
- expect(result.agents?.explore?.model).toBe("anthropic/claude-haiku-4-5")
+ expect(result.agents?.explore?.model).toBe("openai/gpt-5.4-mini-fast")
expect(result.agents?.explore?.fallback_models).toBeDefined()
expect(result.agents?.explore?.fallback_models?.length).toBeGreaterThan(0)
})
@@ -578,28 +578,28 @@ describe("generateModelConfig", () => {
expect(result.agents?.explore?.fallback_models).toBeUndefined()
})
- test("librarian includes fallback_models when opencode-go and Claude are both available", () => {
- // #given opencode-go and Claude are available
- const config = createConfig({ hasOpencodeGo: true, hasClaude: true })
+ test("librarian includes fallback_models when OpenAI and opencode-go are both available", () => {
+ // #given OpenAI and opencode-go are available
+ const config = createConfig({ hasOpenAI: true, hasOpencodeGo: true })
// #when generateModelConfig is called
const result = generateModelConfig(config)
// #then librarian should have fallback_models
- expect(result.agents?.librarian?.model).toBe("opencode-go/minimax-m2.7")
+ expect(result.agents?.librarian?.model).toBe("openai/gpt-5.4-mini-fast")
expect(result.agents?.librarian?.fallback_models).toBeDefined()
expect(result.agents?.librarian?.fallback_models?.length).toBeGreaterThan(0)
})
- test("librarian omits fallback_models when only one provider matches", () => {
- // #given only opencode-go is available
- const config = createConfig({ hasOpencodeGo: true })
+ test("librarian omits fallback_models when only ZAI is available", () => {
+ // #given only ZAI is available
+ const config = createConfig({ hasZaiCodingPlan: true })
// #when generateModelConfig is called
const result = generateModelConfig(config)
// #then librarian should not have fallback_models
- expect(result.agents?.librarian?.model).toBe("opencode-go/minimax-m2.7")
+ expect(result.agents?.librarian?.model).toBe("zai-coding-plan/glm-4.7")
expect(result.agents?.librarian?.fallback_models).toBeUndefined()
})
})
diff --git a/src/cli/model-fallback.ts b/src/cli/model-fallback.ts
index 088c4515e..6378482c6 100644
--- a/src/cli/model-fallback.ts
+++ b/src/cli/model-fallback.ts
@@ -127,7 +127,9 @@ export function generateModelConfig(config: InstallConfig): GeneratedOmoConfig {
for (const [role, req] of Object.entries(CLI_AGENT_MODEL_REQUIREMENTS)) {
if (role === "librarian") {
let agentConfig: AgentConfig | undefined
- if (avail.opencodeGo) {
+ if (avail.native.openai) {
+ agentConfig = { model: "openai/gpt-5.4-mini-fast" }
+ } else if (avail.opencodeGo) {
agentConfig = { model: "opencode-go/minimax-m2.7" }
} else if (avail.zai) {
agentConfig = { model: ZAI_MODEL }
@@ -142,7 +144,9 @@ export function generateModelConfig(config: InstallConfig): GeneratedOmoConfig {
if (role === "explore") {
let agentConfig: AgentConfig
- if (avail.native.claude) {
+ if (avail.native.openai) {
+ agentConfig = { model: "openai/gpt-5.4-mini-fast" }
+ } else if (avail.native.claude) {
agentConfig = { model: "anthropic/claude-haiku-4-5" }
} else if (avail.opencodeZen) {
agentConfig = { model: "opencode/claude-haiku-4-5" }
diff --git a/src/cli/openai-only-model-catalog.test.ts b/src/cli/openai-only-model-catalog.test.ts
index da544156c..7c94aa850 100644
--- a/src/cli/openai-only-model-catalog.test.ts
+++ b/src/cli/openai-only-model-catalog.test.ts
@@ -28,8 +28,8 @@ describe("generateModelConfig OpenAI-only model catalog", () => {
const result = generateModelConfig(config)
// #then
- expect(result.agents?.explore).toEqual({ model: "openai/gpt-5.4", variant: "medium" })
- expect(result.agents?.librarian).toEqual({ model: "openai/gpt-5.4", variant: "medium" })
+ expect(result.agents?.explore).toEqual({ model: "openai/gpt-5.4-mini-fast" })
+ expect(result.agents?.librarian).toEqual({ model: "openai/gpt-5.4-mini-fast" })
})
test("fills remaining OpenAI-only category gaps with OpenAI models", () => {
@@ -54,8 +54,10 @@ describe("generateModelConfig OpenAI-only model catalog", () => {
const result = generateModelConfig(config)
// #then
- expect(result.agents?.explore).toMatchObject({ model: "opencode-go/minimax-m2.7" })
- expect(result.agents?.librarian).toMatchObject({ model: "opencode-go/minimax-m2.7" })
+ expect(result.agents?.explore).toMatchObject({ model: "openai/gpt-5.4-mini-fast" })
+ expect(result.agents?.librarian).toMatchObject({ model: "openai/gpt-5.4-mini-fast" })
+ expect(result.agents?.explore).not.toMatchObject({ variant: "medium" })
+ expect(result.agents?.librarian).not.toMatchObject({ variant: "medium" })
expect(result.categories?.quick).toMatchObject({ model: "openai/gpt-5.4-mini" })
})
})
diff --git a/src/cli/openai-only-model-catalog.ts b/src/cli/openai-only-model-catalog.ts
index 186b600b2..36d6ca802 100644
--- a/src/cli/openai-only-model-catalog.ts
+++ b/src/cli/openai-only-model-catalog.ts
@@ -1,8 +1,8 @@
import type { AgentConfig, CategoryConfig, GeneratedOmoConfig, ProviderAvailability } from "./model-fallback-types"
const OPENAI_ONLY_AGENT_OVERRIDES: Record = {
- explore: { model: "openai/gpt-5.4", variant: "medium" },
- librarian: { model: "openai/gpt-5.4", variant: "medium" },
+ explore: { model: "openai/gpt-5.4-mini-fast" },
+ librarian: { model: "openai/gpt-5.4-mini-fast" },
}
const OPENAI_ONLY_CATEGORY_OVERRIDES: Record = {
diff --git a/src/shared/model-capabilities/bundled-snapshot.ts b/src/shared/model-capabilities/bundled-snapshot.ts
index 65644a8cf..18ffec737 100644
--- a/src/shared/model-capabilities/bundled-snapshot.ts
+++ b/src/shared/model-capabilities/bundled-snapshot.ts
@@ -1,5 +1,6 @@
import bundledModelCapabilitiesSnapshotJson from "../../generated/model-capabilities.generated.json"
+import { SUPPLEMENTAL_MODEL_CAPABILITIES } from "./supplemental-entries"
import type { ModelCapabilitiesSnapshot } from "./types"
function normalizeSnapshot(
@@ -8,7 +9,15 @@ function normalizeSnapshot(
return snapshot as ModelCapabilitiesSnapshot
}
-const bundledModelCapabilitiesSnapshot = normalizeSnapshot(bundledModelCapabilitiesSnapshotJson)
+const normalizedBundledSnapshot = normalizeSnapshot(bundledModelCapabilitiesSnapshotJson)
+
+const bundledModelCapabilitiesSnapshot: ModelCapabilitiesSnapshot = {
+ ...normalizedBundledSnapshot,
+ models: {
+ ...normalizedBundledSnapshot.models,
+ ...SUPPLEMENTAL_MODEL_CAPABILITIES,
+ },
+}
export function getBundledModelCapabilitiesSnapshot(): ModelCapabilitiesSnapshot {
return bundledModelCapabilitiesSnapshot
diff --git a/src/shared/model-capabilities/supplemental-entries.ts b/src/shared/model-capabilities/supplemental-entries.ts
new file mode 100644
index 000000000..87a35f71c
--- /dev/null
+++ b/src/shared/model-capabilities/supplemental-entries.ts
@@ -0,0 +1,20 @@
+import type { ModelCapabilitiesSnapshotEntry } from "./types"
+
+export const SUPPLEMENTAL_MODEL_CAPABILITIES: Record = {
+ "gpt-5.4-mini-fast": {
+ id: "gpt-5.4-mini-fast",
+ family: "gpt-mini",
+ reasoning: true,
+ temperature: false,
+ toolCall: true,
+ modalities: {
+ input: ["text", "image"],
+ output: ["text"],
+ },
+ limit: {
+ context: 400000,
+ input: 272000,
+ output: 128000,
+ },
+ },
+}
diff --git a/src/shared/model-requirements.test.ts b/src/shared/model-requirements.test.ts
index 3692677f7..258beb1a3 100644
--- a/src/shared/model-requirements.test.ts
+++ b/src/shared/model-requirements.test.ts
@@ -64,33 +64,38 @@ describe("AGENT_MODEL_REQUIREMENTS", () => {
expect(last.model).toBe("big-pickle")
})
- test("librarian has valid fallbackChain with opencode-go/minimax-m2.7 as primary", () => {
+ test("librarian has valid fallbackChain with openai/gpt-5.4-mini-fast as primary", () => {
// given - librarian agent requirement
const librarian = AGENT_MODEL_REQUIREMENTS["librarian"]
// when - accessing librarian requirement
- // then - fallbackChain exists with opencode-go/minimax-m2.7 as first entry
+ // then - fallbackChain exists with openai/gpt-5.4-mini-fast as first entry
expect(librarian).toBeDefined()
expect(librarian.fallbackChain).toBeArray()
- expect(librarian.fallbackChain.length).toBeGreaterThan(0)
+ expect(librarian.fallbackChain).toHaveLength(5)
const primary = librarian.fallbackChain[0]
- expect(primary.providers[0]).toBe("opencode-go")
- expect(primary.model).toBe("minimax-m2.7")
+ expect(primary.providers).toEqual(["openai"])
+ expect(primary.model).toBe("gpt-5.4-mini-fast")
const second = librarian.fallbackChain[1]
- expect(second.providers[0]).toBe("opencode")
+ expect(second.providers[0]).toBe("opencode-go")
expect(second.model).toBe("minimax-m2.7-highspeed")
const tertiary = librarian.fallbackChain[2]
- expect(tertiary.providers).toContain("anthropic")
- expect(tertiary.model).toBe("claude-haiku-4-5")
+ expect(tertiary.providers[0]).toBe("opencode-go")
+ expect(tertiary.model).toBe("minimax-m2.7")
const quaternary = librarian.fallbackChain[3]
- expect(quaternary.model).toBe("gpt-5-nano")
+ expect(quaternary.providers).toContain("anthropic")
+ expect(quaternary.model).toBe("claude-haiku-4-5")
+
+ const fifth = librarian.fallbackChain[4]
+ expect(fifth.providers).toContain("openai")
+ expect(fifth.model).toBe("gpt-5.4-nano")
})
- test("explore has valid fallbackChain with grok-code-fast-1 as primary", () => {
+ test("explore has valid fallbackChain with openai/gpt-5.4-mini-fast as primary", () => {
// given - explore agent requirement
const explore = AGENT_MODEL_REQUIREMENTS["explore"]
@@ -100,16 +105,15 @@ describe("AGENT_MODEL_REQUIREMENTS", () => {
expect(explore.fallbackChain).toHaveLength(5)
const primary = explore.fallbackChain[0]
- expect(primary.providers).toContain("github-copilot")
- expect(primary.providers).toContain("xai")
- expect(primary.model).toBe("grok-code-fast-1")
+ expect(primary.providers).toEqual(["openai"])
+ expect(primary.model).toBe("gpt-5.4-mini-fast")
const secondary = explore.fallbackChain[1]
expect(secondary.providers).toContain("opencode-go")
expect(secondary.model).toBe("minimax-m2.7-highspeed")
const tertiary = explore.fallbackChain[2]
- expect(tertiary.providers).toContain("opencode")
+ expect(tertiary.providers).toContain("opencode-go")
expect(tertiary.model).toBe("minimax-m2.7")
const quaternary = explore.fallbackChain[3]
@@ -117,8 +121,8 @@ describe("AGENT_MODEL_REQUIREMENTS", () => {
expect(quaternary.model).toBe("claude-haiku-4-5")
const fifth = explore.fallbackChain[4]
- expect(fifth.providers).toContain("opencode")
- expect(fifth.model).toBe("gpt-5-nano")
+ expect(fifth.providers).toContain("openai")
+ expect(fifth.model).toBe("gpt-5.4-nano")
})
test("multimodal-looker has valid fallbackChain with gpt-5.4 as primary", () => {
diff --git a/src/shared/model-requirements.ts b/src/shared/model-requirements.ts
index 16f64cd6a..36771b4bc 100644
--- a/src/shared/model-requirements.ts
+++ b/src/shared/model-requirements.ts
@@ -77,19 +77,20 @@ export const AGENT_MODEL_REQUIREMENTS: Record = {
},
librarian: {
fallbackChain: [
+ { providers: ["openai"], model: "gpt-5.4-mini-fast" },
+ { providers: ["opencode-go", "vercel"], model: "minimax-m2.7-highspeed" },
{ providers: ["opencode-go", "vercel"], model: "minimax-m2.7" },
- { providers: ["opencode", "vercel"], model: "minimax-m2.7-highspeed" },
{ providers: ["anthropic", "opencode", "vercel"], model: "claude-haiku-4-5" },
- { providers: ["opencode", "vercel"], model: "gpt-5-nano" },
+ { providers: ["openai", "opencode", "vercel"], model: "gpt-5.4-nano" },
],
},
explore: {
fallbackChain: [
- { providers: ["github-copilot", "xai", "vercel"], model: "grok-code-fast-1" },
+ { providers: ["openai"], model: "gpt-5.4-mini-fast" },
{ providers: ["opencode-go", "vercel"], model: "minimax-m2.7-highspeed" },
- { providers: ["opencode", "vercel"], model: "minimax-m2.7" },
+ { providers: ["opencode-go", "vercel"], model: "minimax-m2.7" },
{ providers: ["anthropic", "opencode", "vercel"], model: "claude-haiku-4-5" },
- { providers: ["opencode", "vercel"], model: "gpt-5-nano" },
+ { providers: ["openai", "opencode", "vercel"], model: "gpt-5.4-nano" },
],
},
"multimodal-looker": {