mirror of
https://github.com/RooVetGit/Roo-Code.git
synced 2026-08-28 05:27:24 +00:00
fix: preserve custom model IDs instead of falling back to defaults
When users configure a custom model ID (e.g. for third-party gateways), several providers silently replaced it with the default model ID if it was not found in the predefined models map. This fix ensures the user-provided model ID is always used as-is, with only the model info (capabilities, pricing, etc.) falling back to the default when the custom model is not in the known models map. Affected providers: Anthropic, Gemini, OpenAI Native, OpenAI Codex, Vertex, Anthropic-Vertex, Minimax, xAI, and all providers extending BaseOpenAiCompatibleProvider (SambaNova, Fireworks, Baseten, etc.). Fixes #11936
This commit is contained in:
parent
44fd975b17
commit
39b78f54ae
11 changed files with 28 additions and 31 deletions
|
|
@ -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", () => {
|
||||
|
|
|
|||
|
|
@ -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", () => {
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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 (
|
||||
|
|
|
|||
|
|
@ -250,11 +250,9 @@ export abstract class BaseOpenAiCompatibleProvider<ModelName extends string>
|
|||
}
|
||||
|
||||
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 }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue