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:
@@ -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:**
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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` |
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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()
|
||||
})
|
||||
})
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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" })
|
||||
})
|
||||
})
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -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", () => {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
Reference in New Issue
Block a user