diff --git a/src/api/providers/__tests__/gemini.spec.ts b/src/api/providers/__tests__/gemini.spec.ts index 47ee79dd0d..713e9d8d06 100644 --- a/src/api/providers/__tests__/gemini.spec.ts +++ b/src/api/providers/__tests__/gemini.spec.ts @@ -165,13 +165,14 @@ describe("GeminiHandler", () => { expect(modelInfo.info).toBeDefined() }) - it("should return default model if invalid model specified", () => { + it("should preserve custom model id when not in known models", () => { const invalidHandler = new GeminiHandler({ - apiModelId: "invalid-model", + apiModelId: "custom-model", geminiApiKey: "test-key", }) const modelInfo = invalidHandler.getModel() - expect(modelInfo.id).toBe(geminiDefaultModelId) // Default model + expect(modelInfo.id).toBe("custom-model") // Custom model ID is preserved + expect(modelInfo.info).toBeDefined() // Falls back to default model info }) it("should exclude apply_diff and include edit in tool preferences", () => { diff --git a/src/api/providers/__tests__/openai-codex.spec.ts b/src/api/providers/__tests__/openai-codex.spec.ts index 2e164fe469..0479bd6c0f 100644 --- a/src/api/providers/__tests__/openai-codex.spec.ts +++ b/src/api/providers/__tests__/openai-codex.spec.ts @@ -16,12 +16,12 @@ describe("OpenAiCodexHandler.getModel", () => { }, ) - it("should fall back to default model when an invalid model id is provided", () => { + it("should preserve custom model id when not in known models", () => { const handler = new OpenAiCodexHandler({ apiModelId: "not-a-real-model" }) const model = handler.getModel() - expect(model.id).toBe("gpt-5.3-codex") - expect(model.info).toBeDefined() + expect(model.id).toBe("not-a-real-model") // Custom model ID is preserved + expect(model.info).toBeDefined() // Falls back to default model info }) it("should use Spark-specific limits and capabilities", () => { diff --git a/src/api/providers/anthropic-vertex.ts b/src/api/providers/anthropic-vertex.ts index 3ed5dd45cc..514984ab6b 100644 --- a/src/api/providers/anthropic-vertex.ts +++ b/src/api/providers/anthropic-vertex.ts @@ -207,8 +207,8 @@ export class AnthropicVertexHandler extends BaseProvider implements SingleComple getModel() { const modelId = this.options.apiModelId - let id = modelId && modelId in vertexModels ? (modelId as VertexModelId) : vertexDefaultModelId - let info: ModelInfo = vertexModels[id] + let id = modelId ?? vertexDefaultModelId + let info: ModelInfo = vertexModels[id as VertexModelId] ?? vertexModels[vertexDefaultModelId] // Check if 1M context beta should be enabled for supported models const supports1MContext = VERTEX_1M_CONTEXT_MODEL_IDS.includes( diff --git a/src/api/providers/anthropic.ts b/src/api/providers/anthropic.ts index 1786a105a5..dcf9edf0fd 100644 --- a/src/api/providers/anthropic.ts +++ b/src/api/providers/anthropic.ts @@ -334,8 +334,8 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa getModel() { const modelId = this.options.apiModelId - let id = modelId && modelId in anthropicModels ? (modelId as AnthropicModelId) : anthropicDefaultModelId - let info: ModelInfo = anthropicModels[id] + let id = modelId ?? anthropicDefaultModelId + let info: ModelInfo = anthropicModels[id as AnthropicModelId] ?? anthropicModels[anthropicDefaultModelId] // If 1M context beta is enabled for supported models, update the model info if ( diff --git a/src/api/providers/base-openai-compatible-provider.ts b/src/api/providers/base-openai-compatible-provider.ts index fc3d769ae2..535ae45c81 100644 --- a/src/api/providers/base-openai-compatible-provider.ts +++ b/src/api/providers/base-openai-compatible-provider.ts @@ -250,11 +250,9 @@ export abstract class BaseOpenAiCompatibleProvider } override getModel() { - const id = - this.options.apiModelId && this.options.apiModelId in this.providerModels - ? (this.options.apiModelId as ModelName) - : this.defaultProviderModelId + const id = this.options.apiModelId ?? this.defaultProviderModelId + const info = this.providerModels[id as ModelName] ?? this.providerModels[this.defaultProviderModelId] - return { id, info: this.providerModels[id] } + return { id, info } } } diff --git a/src/api/providers/gemini.ts b/src/api/providers/gemini.ts index a49073ea33..e1fbb93d4e 100644 --- a/src/api/providers/gemini.ts +++ b/src/api/providers/gemini.ts @@ -348,8 +348,8 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl override getModel() { const modelId = this.options.apiModelId - let id = modelId && modelId in geminiModels ? (modelId as GeminiModelId) : geminiDefaultModelId - let info: ModelInfo = geminiModels[id] + let id = modelId ?? geminiDefaultModelId + let info: ModelInfo = geminiModels[id as GeminiModelId] ?? geminiModels[geminiDefaultModelId] const params = getModelParams({ format: "gemini", diff --git a/src/api/providers/minimax.ts b/src/api/providers/minimax.ts index bfcf4e3be4..2902140bba 100644 --- a/src/api/providers/minimax.ts +++ b/src/api/providers/minimax.ts @@ -271,8 +271,8 @@ export class MiniMaxHandler extends BaseProvider implements SingleCompletionHand getModel() { const modelId = this.options.apiModelId - const id = modelId && modelId in minimaxModels ? (modelId as MinimaxModelId) : minimaxDefaultModelId - const info = minimaxModels[id] + const id = modelId ?? minimaxDefaultModelId + const info = minimaxModels[id as MinimaxModelId] ?? minimaxModels[minimaxDefaultModelId] const params = getModelParams({ format: "anthropic", diff --git a/src/api/providers/openai-codex.ts b/src/api/providers/openai-codex.ts index 9dfb37bc72..e5d973720b 100644 --- a/src/api/providers/openai-codex.ts +++ b/src/api/providers/openai-codex.ts @@ -1117,9 +1117,10 @@ export class OpenAiCodexHandler extends BaseProvider implements SingleCompletion override getModel() { const modelId = this.options.apiModelId - let id = modelId && modelId in openAiCodexModels ? (modelId as OpenAiCodexModelId) : openAiCodexDefaultModelId + let id = modelId ?? openAiCodexDefaultModelId - const info: ModelInfo = openAiCodexModels[id] + const info: ModelInfo = + openAiCodexModels[id as OpenAiCodexModelId] ?? openAiCodexModels[openAiCodexDefaultModelId] const params = getModelParams({ format: "openai", diff --git a/src/api/providers/openai-native.ts b/src/api/providers/openai-native.ts index 6ce9382763..7b8cf6cf78 100644 --- a/src/api/providers/openai-native.ts +++ b/src/api/providers/openai-native.ts @@ -1435,10 +1435,10 @@ export class OpenAiNativeHandler extends BaseProvider implements SingleCompletio override getModel() { const modelId = this.options.apiModelId - let id = - modelId && modelId in openAiNativeModels ? (modelId as OpenAiNativeModelId) : openAiNativeDefaultModelId + let id = modelId ?? openAiNativeDefaultModelId - const info: ModelInfo = openAiNativeModels[id] + const info: ModelInfo = + openAiNativeModels[id as OpenAiNativeModelId] ?? openAiNativeModels[openAiNativeDefaultModelId] const params = getModelParams({ format: "openai", diff --git a/src/api/providers/vertex.ts b/src/api/providers/vertex.ts index fd318d9b19..ea364dfe05 100644 --- a/src/api/providers/vertex.ts +++ b/src/api/providers/vertex.ts @@ -14,8 +14,8 @@ export class VertexHandler extends GeminiHandler implements SingleCompletionHand override getModel() { const modelId = this.options.apiModelId - let id = modelId && modelId in vertexModels ? (modelId as VertexModelId) : vertexDefaultModelId - let info: ModelInfo = vertexModels[id] + let id = modelId ?? vertexDefaultModelId + let info: ModelInfo = vertexModels[id as VertexModelId] ?? vertexModels[vertexDefaultModelId] const params = getModelParams({ format: "gemini", modelId: id, diff --git a/src/api/providers/xai.ts b/src/api/providers/xai.ts index 8b973d41c4..7a19948a58 100644 --- a/src/api/providers/xai.ts +++ b/src/api/providers/xai.ts @@ -37,12 +37,9 @@ export class XAIHandler extends BaseProvider implements SingleCompletionHandler } override getModel() { - const id = - this.options.apiModelId && this.options.apiModelId in xaiModels - ? (this.options.apiModelId as XAIModelId) - : xaiDefaultModelId + const id = this.options.apiModelId ?? xaiDefaultModelId - const info = xaiModels[id] + const info = xaiModels[id as XAIModelId] ?? xaiModels[xaiDefaultModelId] const params = getModelParams({ format: "openai", modelId: id,