Merge pull request #3552 from code-yeongyu/feature/explore-librarian-gpt-5-4-mini-fast-primary

feat(agents): route explore + librarian primary to openai/gpt-5.4-mini-fast
This commit is contained in:
YeonGyu-Kim
2026-04-21 14:29:13 +09:00
committed by GitHub
14 changed files with 183 additions and 135 deletions
+5 -5
View File
@@ -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:**
+2 -2
View File
@@ -47,8 +47,8 @@ flowchart TB
subgraph Workers["Worker Layer (Specialized Agents)"]
Junior[" Sisyphus-Junior<br/>(Task Executor)<br/>claude-sonnet-4-6 / kimi-k2.5 / gpt-5.4 / minimax-m2.7"]
Oracle[" Oracle<br/>(Architecture)<br/>gpt-5.4 / gemini-3.1-pro / claude-opus-4-7 / glm-5"]
Explore[" Explore<br/>(Codebase Grep)<br/>grok-code-fast-1 / minimax-m2.7-highspeed / claude-haiku-4-5"]
Librarian[" Librarian<br/>(Docs/OSS)<br/>minimax-m2.7 / minimax-m2.7-highspeed / claude-haiku-4-5"]
Explore[" Explore<br/>(Codebase Grep)<br/>gpt-5.4-mini-fast / minimax-m2.7-highspeed / claude-haiku-4-5"]
Librarian[" Librarian<br/>(Docs/OSS)<br/>gpt-5.4-mini-fast / minimax-m2.7-highspeed / claude-haiku-4-5"]
Frontend[" visual-engineering<br/>(category + frontend-ui-ux)<br/>gemini-3.1-pro / glm-5 / claude-opus-4-7"]
end
+2 -2
View File
@@ -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` |
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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 |
@@ -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",
+15 -15
View File
@@ -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()
})
})
+6 -2
View File
@@ -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" }
+6 -4
View File
@@ -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" })
})
})
+2 -2
View File
@@ -1,8 +1,8 @@
import type { AgentConfig, CategoryConfig, GeneratedOmoConfig, ProviderAvailability } from "./model-fallback-types"
const OPENAI_ONLY_AGENT_OVERRIDES: Record<string, AgentConfig> = {
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<string, CategoryConfig> = {
@@ -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
@@ -0,0 +1,20 @@
import type { ModelCapabilitiesSnapshotEntry } from "./types"
export const SUPPLEMENTAL_MODEL_CAPABILITIES: Record<string, ModelCapabilitiesSnapshotEntry> = {
"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,
},
},
}
+20 -16
View File
@@ -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", () => {
+6 -5
View File
@@ -77,19 +77,20 @@ export const AGENT_MODEL_REQUIREMENTS: Record<string, ModelRequirement> = {
},
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": {