Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions packages/types/src/__tests__/provider-default-model.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {
internationalZAiDefaultModelId,
kimiCodeDefaultModelId,
mainlandZAiDefaultModelId,
openAiNativeDefaultModelId,
openRouterDefaultModelId,
vscodeLlmDefaultModelId,
zooGatewayDefaultModelId,
Expand All @@ -33,6 +34,10 @@ describe("getProviderDefaultModelId", () => {
expect(getProviderDefaultModelId(providerIdentifiers.vscodeLm)).toBe(vscodeLlmDefaultModelId)
})

it("uses the canonical OpenAI Native default model", () => {
expect(getProviderDefaultModelId(providerIdentifiers.openaiNative)).toBe(openAiNativeDefaultModelId)
})

it.each([
[providerIdentifiers.kimiCode, kimiCodeDefaultModelId],
[providerIdentifiers.zooGateway, zooGatewayDefaultModelId],
Expand Down
4 changes: 2 additions & 2 deletions packages/types/src/providers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import { geminiDefaultModelId } from "./gemini.js"
import { litellmDefaultModelId } from "./lite-llm.js"
import { mistralDefaultModelId } from "./mistral.js"
import { moonshotDefaultModelId } from "./moonshot.js"
import { openAiNativeDefaultModelId } from "./openai.js"
import { openAiCodexDefaultModelId } from "./openai-codex.js"
import { openRouterDefaultModelId } from "./openrouter.js"
import { poeDefaultModelId } from "./poe.js"
Expand Down Expand Up @@ -105,8 +106,7 @@ export function getProviderDefaultModelId(
case providerIdentifiers.zai:
return options?.isChina ? mainlandZAiDefaultModelId : internationalZAiDefaultModelId
case providerIdentifiers.openaiNative:
// TODO(#992): Replace this stale fallback with openAiNativeDefaultModelId.
return "gpt-4o" // Based on openai-native patterns
return openAiNativeDefaultModelId
case providerIdentifiers.openaiCodex:
return openAiCodexDefaultModelId
case providerIdentifiers.mistral:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import {
nanoGptDefaultModelId,
nanoGptDefaultModelInfo,
openAiModelInfoSaneDefaults,
openAiNativeDefaultModelId,
openAiNativeModels,
minimaxDefaultModelId,
minimaxModels,
friendliDefaultModelId,
Expand Down Expand Up @@ -109,6 +111,35 @@ describe("useSelectedModel", () => {
] as const
const configuredModelInfo: ModelInfo = { contextWindow: 1, supportsPromptCache: false }

describe("OpenAI Native model selection", () => {
beforeEach(() => {
mockUseRouterModels.mockReturnValue(createRouterModelsResult({}))
mockUseOpenRouterModelProviders.mockReturnValue(createOpenRouterModelProvidersResult({}))
})

it.each([false, true])("uses the canonical default with router loading=%s", (isLoading) => {
mockUseRouterModels.mockReturnValue(createRouterModelsResult(isLoading ? undefined : {}, { isLoading }))

const { result } = renderHook(() => useSelectedModel({ apiProvider: providerIdentifiers.openaiNative }), {
wrapper: createWrapper(),
})

expect(result.current.id).toBe(openAiNativeDefaultModelId)
expect(result.current.info).toEqual(openAiNativeModels[openAiNativeDefaultModelId])
expect(result.current.isLoading).toBe(false)
})

it("preserves an explicitly configured model even when it is the former fallback", () => {
const { result } = renderHook(
() => useSelectedModel({ apiProvider: providerIdentifiers.openaiNative, apiModelId: "gpt-4o" }),
{ wrapper: createWrapper() },
)

expect(result.current.id).toBe("gpt-4o")
expect(result.current.info).toEqual(openAiNativeModels["gpt-4o"])
})
})

it.each(dynamicProviderCases)("uses router data for %s", (provider, modelIdKey) => {
const modelInfo: ModelInfo = { contextWindow: 42_000, supportsPromptCache: false }
mockUseRouterModels.mockReturnValue(createRouterModelsResult({ [provider]: { model: modelInfo } }))
Expand Down
Loading