Revert "Revert "feat: change defaultToolProtocol default from xml to native"" (#10186)

Co-authored-by: Roo Code <roomote@roocode.com>
This commit is contained in:
Matt Rubens 2025-12-18 10:31:33 -05:00 committed by GitHub
parent d3768690be
commit 3cb2c1de66
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 24 additions and 18 deletions

View file

@ -975,11 +975,11 @@ describe("Cline", () => {
getState: vi.fn().mockResolvedValue({
apiConfiguration: mockApiConfig,
}),
getMcpHub: vi.fn().mockReturnValue(undefined),
say: vi.fn(),
postStateToWebview: vi.fn().mockResolvedValue(undefined),
postMessageToWebview: vi.fn().mockResolvedValue(undefined),
updateTaskHistory: vi.fn().mockResolvedValue(undefined),
getMcpHub: vi.fn().mockReturnValue(undefined),
}
// Get the mocked delay function

View file

@ -139,18 +139,24 @@ describe("resolveToolProtocol", () => {
})
})
describe("Precedence Level 3: XML Fallback", () => {
it("should use XML fallback when no model default is specified", () => {
describe("Precedence Level 3: Native Fallback", () => {
it("should use Native fallback when no model default is specified and model supports native", () => {
const settings: ProviderSettings = {
apiProvider: "anthropic",
}
const result = resolveToolProtocol(settings, undefined)
expect(result).toBe(TOOL_PROTOCOL.XML) // XML fallback
const modelInfo: ModelInfo = {
maxTokens: 4096,
contextWindow: 128000,
supportsPromptCache: false,
supportsNativeTools: true,
}
const result = resolveToolProtocol(settings, modelInfo)
expect(result).toBe(TOOL_PROTOCOL.NATIVE) // Native fallback
})
})
describe("Complete Precedence Chain", () => {
it("should respect full precedence: Profile > Model Default > XML Fallback", () => {
it("should respect full precedence: Profile > Model Default > Native Fallback", () => {
// Set up a scenario with all levels defined
const settings: ProviderSettings = {
toolProtocol: "native", // Level 1: User profile setting
@ -186,7 +192,7 @@ describe("resolveToolProtocol", () => {
expect(result).toBe(TOOL_PROTOCOL.XML) // Model default wins
})
it("should skip to XML fallback when profile and model default are undefined", () => {
it("should skip to Native fallback when profile and model default are undefined", () => {
const settings: ProviderSettings = {
apiProvider: "openai-native",
}
@ -199,7 +205,7 @@ describe("resolveToolProtocol", () => {
}
const result = resolveToolProtocol(settings, modelInfo)
expect(result).toBe(TOOL_PROTOCOL.XML) // XML fallback
expect(result).toBe(TOOL_PROTOCOL.NATIVE) // Native fallback
})
it("should skip to XML fallback when model info is unavailable", () => {
@ -208,7 +214,7 @@ describe("resolveToolProtocol", () => {
}
const result = resolveToolProtocol(settings, undefined)
expect(result).toBe(TOOL_PROTOCOL.XML) // XML fallback
expect(result).toBe(TOOL_PROTOCOL.XML) // XML fallback (no model info means no native support)
})
})
@ -216,7 +222,7 @@ describe("resolveToolProtocol", () => {
it("should handle missing provider name gracefully", () => {
const settings: ProviderSettings = {}
const result = resolveToolProtocol(settings)
expect(result).toBe(TOOL_PROTOCOL.XML) // Falls back to global
expect(result).toBe(TOOL_PROTOCOL.XML) // Falls back to XML (no model info)
})
it("should handle undefined model info gracefully", () => {
@ -224,7 +230,7 @@ describe("resolveToolProtocol", () => {
apiProvider: "openai-native",
}
const result = resolveToolProtocol(settings, undefined)
expect(result).toBe(TOOL_PROTOCOL.XML) // XML fallback
expect(result).toBe(TOOL_PROTOCOL.XML) // XML fallback (no model info)
})
it("should fall back to XML when model doesn't support native", () => {
@ -243,7 +249,7 @@ describe("resolveToolProtocol", () => {
})
describe("Real-world Scenarios", () => {
it("should use XML fallback for models without defaultToolProtocol", () => {
it("should use Native fallback for models without defaultToolProtocol", () => {
const settings: ProviderSettings = {
apiProvider: "openai-native",
}
@ -254,7 +260,7 @@ describe("resolveToolProtocol", () => {
supportsNativeTools: true,
}
const result = resolveToolProtocol(settings, modelInfo)
expect(result).toBe(TOOL_PROTOCOL.XML) // XML fallback
expect(result).toBe(TOOL_PROTOCOL.NATIVE) // Native fallback
})
it("should use XML for Claude models with Anthropic provider", () => {

View file

@ -6,7 +6,7 @@ import type { ProviderSettings, ModelInfo } from "@roo-code/types"
*
* 1. User Preference - Per-Profile (explicit profile setting)
* 2. Model Default (defaultToolProtocol in ModelInfo)
* 3. XML Fallback (final fallback)
* 3. Native Fallback (final fallback)
*
* Then check support: if protocol is "native" but model doesn't support it, use XML.
*
@ -31,6 +31,6 @@ export function resolveToolProtocol(providerSettings: ProviderSettings, modelInf
return modelInfo.defaultToolProtocol
}
// 3. XML Fallback
return TOOL_PROTOCOL.XML
// 3. Native Fallback
return TOOL_PROTOCOL.NATIVE
}

View file

@ -417,8 +417,8 @@ const ApiOptions = ({
// Mirrors the simplified logic in resolveToolProtocol.ts:
// 1. User preference (toolProtocol) - handled by the select value binding
// 2. Model default - use if available
// 3. XML fallback
const defaultProtocol = selectedModelInfo?.defaultToolProtocol || TOOL_PROTOCOL.XML
// 3. Native fallback
const defaultProtocol = selectedModelInfo?.defaultToolProtocol || TOOL_PROTOCOL.NATIVE
// Show the tool protocol selector when model supports native tools.
// For OpenAI Compatible providers we always show it so users can force XML/native explicitly.