From 3ce68514729c2402c30632f9a22bb690d5c5ca2e Mon Sep 17 00:00:00 2001 From: Shoubhit Dash Date: Wed, 29 Apr 2026 17:10:06 +0530 Subject: [PATCH] feat(provider): add small model priorities --- packages/opencode/src/provider/provider.ts | 19 +---- packages/opencode/src/provider/small-model.ts | 73 +++++++++++++++++++ 2 files changed, 77 insertions(+), 15 deletions(-) create mode 100644 packages/opencode/src/provider/small-model.ts diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index c05d053193..9399c7e473 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -28,6 +28,7 @@ import { withStatics } from "@/util/schema" import * as ProviderTransform from "./transform" import { ModelID, ProviderID } from "./schema" +import { ProviderSmallModel } from "./small-model" const log = Log.create({ service: "provider" }) @@ -1611,22 +1612,10 @@ const layer: Layer.Layer< const provider = s.providers[providerID] if (!provider) return undefined - let priority = [ - "claude-haiku-4-5", - "claude-haiku-4.5", - "3-5-haiku", - "3.5-haiku", - "gemini-3-flash", - "gemini-2.5-flash", - "gpt-5-nano", - ] - if (providerID.startsWith("opencode")) { - priority = ["gpt-5-nano"] - } - if (providerID.startsWith("github-copilot")) { - priority = ["gpt-5-mini", "claude-haiku-4.5", ...priority] - } + const priority = ProviderSmallModel.priority[providerID] ?? [] for (const item of priority) { + if (provider.models[item]) return yield* getModel(providerID, ModelID.make(item)) + if (providerID === ProviderID.amazonBedrock) { const crossRegionPrefixes = ["global.", "us.", "eu."] const candidates = Object.keys(provider.models).filter((m) => m.includes(item)) diff --git a/packages/opencode/src/provider/small-model.ts b/packages/opencode/src/provider/small-model.ts new file mode 100644 index 0000000000..95ce6c5156 --- /dev/null +++ b/packages/opencode/src/provider/small-model.ts @@ -0,0 +1,73 @@ +export * as ProviderSmallModel from "./small-model" + +export const priority: Record = { + opencode: [ + "gpt-5.4-mini", + "gemini-3-flash", + "claude-haiku-4-5", + ], + "opencode-go": ["minimax-m2.7", "minimax-m2.5"], + openai: [ + "gpt-5.4-mini", + "gpt-5.4-nano", + "gpt-5.1-codex-mini", + "gpt-5-mini", + "gpt-5-nano", + "gpt-4.1-nano", + "gpt-4o-mini", + ], + anthropic: ["claude-haiku-4-5", "claude-3-5-haiku", "claude-3-haiku"], + google: [ + "gemini-3.1-flash-lite-preview", + "gemini-flash-lite-latest", + "gemini-3-flash-preview", + "gemini-2.5-flash", + "gemini-2.5-flash-lite", + "gemini-2.0-flash-lite", + ], + "google-vertex": [ + "gemini-3.1-flash-lite-preview", + "gemini-flash-lite-latest", + "gemini-3-flash-preview", + "gemini-2.5-flash", + "gemini-2.5-flash-lite", + "gemini-2.0-flash-lite", + ], + "github-copilot": [ + "gpt-5.4-mini", + "gemini-3-flash-preview", + "claude-haiku-4.5", + ], + xai: [ + "grok-4.20-0309-non-reasoning", + "grok-4-1-fast-non-reasoning", + "grok-4-fast-non-reasoning", + "grok-code-fast-1", + "grok-3-mini-fast-latest", + "grok-3-mini-fast", + "grok-3-mini-latest", + "grok-3-mini", + ], + "amazon-bedrock": [ + "anthropic.claude-haiku-4-5", + "openai.gpt-oss-20b", + "mistral.ministral-3-8b", + "mistral.ministral-3-3b", + "amazon.nova-2-lite", + "amazon.nova-lite", + "mistral.voxtral-mini-3b", + "meta.llama3-1-8b", + ], + openrouter: [ + "openai/gpt-5.4-mini", + "openai/gpt-5.4-nano", + "google/gemini-3.1-flash-lite-preview", + "anthropic/claude-haiku-4.5", + "x-ai/grok-4.20-beta", + "x-ai/grok-4-fast", + "mistralai/mistral-small-2603", + "openai/gpt-5.1-codex-mini", + "openai/gpt-5-mini", + "openai/gpt-5-nano", + ], +}