diff --git a/packages/types/src/__tests__/all-model-capabilities.test.ts b/packages/types/src/__tests__/all-model-capabilities.test.ts new file mode 100644 index 00000000000..5d68d477dbf --- /dev/null +++ b/packages/types/src/__tests__/all-model-capabilities.test.ts @@ -0,0 +1,68 @@ +import { modelCapabilityPresets } from "../providers/all-model-capabilities.js" +import type { ModelCapabilityPreset } from "../providers/all-model-capabilities.js" + +describe("modelCapabilityPresets", () => { + it("should be a non-empty array", () => { + expect(Array.isArray(modelCapabilityPresets)).toBe(true) + expect(modelCapabilityPresets.length).toBeGreaterThan(0) + }) + + it("every preset should have a provider, modelId, and info with required fields", () => { + for (const preset of modelCapabilityPresets) { + expect(typeof preset.provider).toBe("string") + expect(preset.provider.length).toBeGreaterThan(0) + + expect(typeof preset.modelId).toBe("string") + expect(preset.modelId.length).toBeGreaterThan(0) + + expect(preset.info).toBeDefined() + expect(typeof preset.info.contextWindow).toBe("number") + expect(preset.info.contextWindow).toBeGreaterThan(0) + // supportsPromptCache is a required field in ModelInfo + expect(typeof preset.info.supportsPromptCache).toBe("boolean") + } + }) + + it("should include models from multiple providers", () => { + const providers = new Set(modelCapabilityPresets.map((p: ModelCapabilityPreset) => p.provider)) + expect(providers.size).toBeGreaterThan(5) + }) + + it("should include well-known models", () => { + const modelIds = modelCapabilityPresets.map((p: ModelCapabilityPreset) => p.modelId) + + // Check for some well-known models + expect(modelIds.some((id: string) => id.includes("claude"))).toBe(true) + expect(modelIds.some((id: string) => id.includes("gpt"))).toBe(true) + expect(modelIds.some((id: string) => id.includes("deepseek"))).toBe(true) + expect(modelIds.some((id: string) => id.includes("gemini"))).toBe(true) + }) + + it("should have unique provider/modelId combinations", () => { + const keys = modelCapabilityPresets.map((p: ModelCapabilityPreset) => `${p.provider}/${p.modelId}`) + const uniqueKeys = new Set(keys) + expect(uniqueKeys.size).toBe(keys.length) + }) + + it("each preset should include known providers", () => { + const knownProviders = [ + "Anthropic", + "OpenAI", + "DeepSeek", + "Gemini", + "MiniMax", + "Mistral", + "Moonshot (Kimi)", + "Qwen", + "SambaNova", + "xAI", + "ZAi (GLM)", + ] + + const providers = new Set(modelCapabilityPresets.map((p: ModelCapabilityPreset) => p.provider)) + + for (const known of knownProviders) { + expect(providers.has(known)).toBe(true) + } + }) +}) diff --git a/packages/types/src/providers/all-model-capabilities.ts b/packages/types/src/providers/all-model-capabilities.ts new file mode 100644 index 00000000000..78bde66ebb5 --- /dev/null +++ b/packages/types/src/providers/all-model-capabilities.ts @@ -0,0 +1,69 @@ +/** + * Aggregated model capabilities from all providers. + * + * This map is used by the OpenAI Compatible provider to let users select + * a known model's capabilities (context window, max tokens, image support, + * prompt caching, etc.) so Roo can communicate optimally with local or + * third-party endpoints that serve these models. + */ +import type { ModelInfo } from "../model.js" + +import { anthropicModels } from "./anthropic.js" +import { deepSeekModels } from "./deepseek.js" +import { geminiModels } from "./gemini.js" +import { minimaxModels } from "./minimax.js" +import { mistralModels } from "./mistral.js" +import { moonshotModels } from "./moonshot.js" +import { openAiNativeModels } from "./openai.js" +import { sambaNovaModels } from "./sambanova.js" +import { xaiModels } from "./xai.js" +import { internationalZAiModels } from "./zai.js" +import { qwenCodeModels } from "./qwen-code.js" + +/** + * A single entry in the capability presets list. + */ +export interface ModelCapabilityPreset { + /** The provider this model originally belongs to */ + provider: string + /** The model ID as known by its native provider */ + modelId: string + /** The model's capability info */ + info: ModelInfo +} + +/** + * Helper to build preset entries from a provider's model record. + */ +function buildPresets(provider: string, models: Record): ModelCapabilityPreset[] { + return Object.entries(models).map(([modelId, info]) => ({ + provider, + modelId, + info, + })) +} + +/** + * All known model capability presets, aggregated from every provider. + * + * We intentionally exclude cloud-only routing providers (OpenRouter, Requesty, + * LiteLLM, Roo, Unbound, Vercel AI Gateway) and platform-locked providers + * (Bedrock, Vertex, VSCode LM, OpenAI Codex, Baseten, Fireworks) since those + * models are either duplicates of the originals or have platform-specific + * model IDs that don't map to local inference. + * + * The user can always choose "Custom" and configure capabilities manually. + */ +export const modelCapabilityPresets: ModelCapabilityPreset[] = [ + ...buildPresets("Anthropic", anthropicModels), + ...buildPresets("OpenAI", openAiNativeModels), + ...buildPresets("DeepSeek", deepSeekModels), + ...buildPresets("Gemini", geminiModels), + ...buildPresets("MiniMax", minimaxModels), + ...buildPresets("Mistral", mistralModels), + ...buildPresets("Moonshot (Kimi)", moonshotModels), + ...buildPresets("Qwen", qwenCodeModels), + ...buildPresets("SambaNova", sambaNovaModels), + ...buildPresets("xAI", xaiModels), + ...buildPresets("ZAi (GLM)", internationalZAiModels), +] diff --git a/packages/types/src/providers/index.ts b/packages/types/src/providers/index.ts index 6bb959c7056..85311904ac1 100644 --- a/packages/types/src/providers/index.ts +++ b/packages/types/src/providers/index.ts @@ -24,6 +24,7 @@ export * from "./xai.js" export * from "./vercel-ai-gateway.js" export * from "./zai.js" export * from "./minimax.js" +export * from "./all-model-capabilities.js" import { anthropicDefaultModelId } from "./anthropic.js" import { basetenDefaultModelId } from "./baseten.js" diff --git a/packages/types/src/providers/moonshot.ts b/packages/types/src/providers/moonshot.ts index a825475644b..d0a68d97896 100644 --- a/packages/types/src/providers/moonshot.ts +++ b/packages/types/src/providers/moonshot.ts @@ -62,6 +62,7 @@ export const moonshotModels = { outputPrice: 3.0, // $3.00 per million tokens cacheReadsPrice: 0.1, // $0.10 per million tokens (cache hit) supportsTemperature: true, + preserveReasoning: true, defaultTemperature: 1.0, description: "Kimi K2.5 is the latest generation of Moonshot AI's Kimi series, featuring improved reasoning capabilities and enhanced performance across diverse tasks.", diff --git a/webview-ui/src/components/settings/providers/OpenAICompatible.tsx b/webview-ui/src/components/settings/providers/OpenAICompatible.tsx index 0524932c5fa..268e209e8a0 100644 --- a/webview-ui/src/components/settings/providers/OpenAICompatible.tsx +++ b/webview-ui/src/components/settings/providers/OpenAICompatible.tsx @@ -1,6 +1,7 @@ -import { useState, useCallback, useEffect } from "react" +import { useState, useCallback, useEffect, useMemo } from "react" import { useEvent } from "react-use" import { Checkbox } from "vscrui" +import { ChevronsUpDown, Check } from "lucide-react" import { VSCodeButton, VSCodeTextField } from "@vscode/webview-ui-toolkit/react" import { @@ -11,10 +12,24 @@ import { type ExtensionMessage, azureOpenAiDefaultApiVersion, openAiModelInfoSaneDefaults, + modelCapabilityPresets, } from "@roo-code/types" import { useAppTranslation } from "@src/i18n/TranslationContext" -import { Button, StandardTooltip } from "@src/components/ui" +import { + Button, + StandardTooltip, + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, + Popover, + PopoverContent, + PopoverTrigger, +} from "@src/components/ui" +import { cn } from "@src/lib/utils" import { convertHeadersToObject } from "../utils/headers" import { inputEventTransform, noTransform } from "../transforms" @@ -44,9 +59,74 @@ export const OpenAICompatible = ({ const { t } = useAppTranslation() const [azureApiVersionSelected, setAzureApiVersionSelected] = useState(!!apiConfiguration?.azureApiVersion) + const [presetPickerOpen, setPresetPickerOpen] = useState(false) + const [selectedPresetId, setSelectedPresetId] = useState(null) const [openAiModels, setOpenAiModels] = useState | null>(null) + // Compute applied capability flags for the selected preset + const appliedCapabilityFlags = useMemo(() => { + if (!selectedPresetId) return null + const preset = modelCapabilityPresets.find((p) => `${p.provider}/${p.modelId}` === selectedPresetId) + if (!preset) return null + const flags: string[] = [] + if (preset.info.preserveReasoning) + flags.push(t("settings:providers.customModel.capabilityPreset.flags.reasoning")) + if (preset.info.supportsImages) flags.push(t("settings:providers.customModel.capabilityPreset.flags.images")) + if (preset.info.supportsPromptCache) + flags.push(t("settings:providers.customModel.capabilityPreset.flags.promptCache")) + if (preset.info.supportsTemperature) + flags.push(t("settings:providers.customModel.capabilityPreset.flags.temperature")) + if (preset.info.defaultTemperature !== undefined) + flags.push( + t("settings:providers.customModel.capabilityPreset.flags.defaultTemp", { + temp: preset.info.defaultTemperature, + }), + ) + return flags.length > 0 ? flags : null + }, [selectedPresetId, t]) + + // Group presets by provider for organized display + const groupedPresets = useMemo(() => { + const groups: Record = {} + for (const preset of modelCapabilityPresets) { + if (!groups[preset.provider]) { + groups[preset.provider] = [] + } + groups[preset.provider].push(preset) + } + return groups + }, []) + + const handlePresetSelect = useCallback( + (presetKey: string) => { + if (presetKey === "custom") { + setSelectedPresetId(null) + setApiConfigurationField("openAiCustomModelInfo", openAiModelInfoSaneDefaults) + setApiConfigurationField("openAiR1FormatEnabled", false) + setApiConfigurationField("modelTemperature", null) + } else { + const preset = modelCapabilityPresets.find((p) => `${p.provider}/${p.modelId}` === presetKey) + if (preset) { + setSelectedPresetId(presetKey) + setApiConfigurationField("openAiCustomModelInfo", { ...preset.info }) + + // Auto-enable/disable R1 format based on whether model uses reasoning/thinking blocks + setApiConfigurationField("openAiR1FormatEnabled", !!preset.info.preserveReasoning) + + // Auto-apply default temperature when the model specifies one (e.g. Kimi K2 models require temperature=1.0) + if (preset.info.defaultTemperature !== undefined) { + setApiConfigurationField("modelTemperature", preset.info.defaultTemperature) + } else { + setApiConfigurationField("modelTemperature", null) + } + } + } + setPresetPickerOpen(false) + }, + [setApiConfigurationField], + ) + const [customHeaders, setCustomHeaders] = useState<[string, string][]>(() => { const headers = apiConfiguration?.openAiHeaders || {} return Object.entries(headers) @@ -278,6 +358,88 @@ export const OpenAICompatible = ({ )}
+
+ +
+ {t("settings:providers.customModel.capabilityPreset.description")} +
+ + + + + + + + + + {t("settings:providers.customModel.capabilityPreset.noResults")} + + + handlePresetSelect("custom")}> + + {t("settings:providers.customModel.capabilityPreset.custom")} + + + {Object.entries(groupedPresets).map(([provider, presets]) => ( + + {presets.map((preset) => { + const presetKey = `${preset.provider}/${preset.modelId}` + return ( + handlePresetSelect(presetKey)}> + + {preset.modelId} + {preset.info.description && ( + + {preset.info.contextWindow + ? `${Math.round(preset.info.contextWindow / 1000)}K ctx` + : ""} + + )} + + ) + })} + + ))} + + + + + {appliedCapabilityFlags && ( +
+ {t("settings:providers.customModel.capabilityPreset.appliedFlags")}:{" "} + {appliedCapabilityFlags.join(", ")} +
+ )} +
+
{t("settings:providers.customModel.capabilities")}
diff --git a/webview-ui/src/components/settings/providers/__tests__/OpenAICompatible.spec.tsx b/webview-ui/src/components/settings/providers/__tests__/OpenAICompatible.spec.tsx index aba81ec2191..479a5d6ed8c 100644 --- a/webview-ui/src/components/settings/providers/__tests__/OpenAICompatible.spec.tsx +++ b/webview-ui/src/components/settings/providers/__tests__/OpenAICompatible.spec.tsx @@ -63,8 +63,40 @@ vi.mock("@src/i18n/TranslationContext", () => ({ // Mock the UI components vi.mock("@src/components/ui", () => ({ - Button: ({ children, onClick }: any) => , + Button: ({ children, onClick, ...props }: any) => ( + + ), StandardTooltip: ({ children, content }: any) =>
{children}
, + Command: ({ children }: any) =>
{children}
, + CommandEmpty: ({ children }: any) =>
{children}
, + CommandGroup: ({ children, heading }: any) =>
{children}
, + CommandInput: ({ placeholder }: any) => , + CommandItem: ({ children, onSelect, value }: any) => ( +
+ {children} +
+ ), + CommandList: ({ children }: any) =>
{children}
, + Popover: ({ children, open }: any) => ( +
+ {children} +
+ ), + PopoverContent: ({ children }: any) =>
{children}
, + PopoverTrigger: ({ children }: any) =>
{children}
, +})) + +// Mock lucide-react icons +vi.mock("lucide-react", () => ({ + ChevronsUpDown: () => , + Check: () => , +})) + +// Mock cn utility +vi.mock("@src/lib/utils", () => ({ + cn: (...args: any[]) => args.filter(Boolean).join(" "), })) // Mock other components @@ -313,3 +345,152 @@ describe("OpenAICompatible Component - includeMaxTokens checkbox", () => { }) }) }) + +describe("OpenAICompatible Component - Model Capability Presets", () => { + const mockSetApiConfigurationField = vi.fn() + const mockOrganizationAllowList = { + allowAll: true, + providers: {}, + } + + beforeEach(() => { + vi.clearAllMocks() + }) + + it("should render the model capability preset picker", () => { + const apiConfiguration: Partial = {} + + render( + , + ) + + // Check that the preset label is rendered + expect(screen.getByText("settings:providers.customModel.capabilityPreset.label")).toBeInTheDocument() + + // Check that the description is rendered + expect(screen.getByText("settings:providers.customModel.capabilityPreset.description")).toBeInTheDocument() + }) + + it("should render the popover trigger button with Custom text by default", () => { + const apiConfiguration: Partial = {} + + render( + , + ) + + // Should show the custom option text (appears in button, group heading, and item) + const customTexts = screen.getAllByText("settings:providers.customModel.capabilityPreset.custom") + expect(customTexts.length).toBeGreaterThanOrEqual(1) + }) + + it("should render command items for model presets grouped by provider", () => { + const apiConfiguration: Partial = {} + + render( + , + ) + + // Check that provider groups are rendered (via mocked CommandGroup with heading) + expect(screen.getByTestId("command-group-Anthropic")).toBeInTheDocument() + expect(screen.getByTestId("command-group-OpenAI")).toBeInTheDocument() + expect(screen.getByTestId("command-group-DeepSeek")).toBeInTheDocument() + }) + + it("should call setApiConfigurationField with preset info when a model is selected", () => { + const apiConfiguration: Partial = {} + + render( + , + ) + + // Click on the "custom" item to reset to defaults + const customItem = screen.getByTestId("command-item-custom") + fireEvent.click(customItem) + + expect(mockSetApiConfigurationField).toHaveBeenCalledWith( + "openAiCustomModelInfo", + expect.objectContaining({ + contextWindow: expect.any(Number), + }), + ) + }) + + it("should reset openAiR1FormatEnabled and modelTemperature when selecting custom preset", () => { + const apiConfiguration: Partial = {} + + render( + , + ) + + const customItem = screen.getByTestId("command-item-custom") + fireEvent.click(customItem) + + expect(mockSetApiConfigurationField).toHaveBeenCalledWith("openAiR1FormatEnabled", false) + expect(mockSetApiConfigurationField).toHaveBeenCalledWith("modelTemperature", null) + }) + + it("should auto-enable openAiR1FormatEnabled and set temperature when selecting a model with preserveReasoning", () => { + const apiConfiguration: Partial = {} + + render( + , + ) + + // Click on a Kimi K2.5 model which has preserveReasoning: true and defaultTemperature: 1.0 + const kimiItem = screen.getByTestId("command-item-Moonshot (Kimi)/kimi-k2.5") + fireEvent.click(kimiItem) + + expect(mockSetApiConfigurationField).toHaveBeenCalledWith("openAiR1FormatEnabled", true) + expect(mockSetApiConfigurationField).toHaveBeenCalledWith( + "openAiCustomModelInfo", + expect.objectContaining({ + preserveReasoning: true, + }), + ) + // Should auto-apply the default temperature from the model preset + expect(mockSetApiConfigurationField).toHaveBeenCalledWith("modelTemperature", 1.0) + }) + + it("should reset openAiR1FormatEnabled to false when selecting a non-reasoning model", () => { + const apiConfiguration: Partial = {} + + render( + , + ) + + // Click on a DeepSeek model (no preserveReasoning) + const deepseekItems = document.querySelectorAll('[data-testid^="command-item-DeepSeek/"]') + if (deepseekItems.length > 0) { + fireEvent.click(deepseekItems[0]) + expect(mockSetApiConfigurationField).toHaveBeenCalledWith("openAiR1FormatEnabled", false) + } + }) +}) diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 2c83cabbbcb..32fa7108eb2 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -480,6 +480,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "Preset de capacitats del model", + "description": "Selecciona un model conegut per configurar automàticament les capacitats (finestra de context, tokens màxims, suport d'imatges, etc.). Tria \"Personalitzat\" per configurar manualment.", + "custom": "Personalitzat (configura manualment)", + "searchPlaceholder": "Cerca models...", + "noResults": "No s'han trobat models coincidents.", + "applied": "S'han aplicat les capacitats de {{model}}", + "appliedFlags": "Capacitats aplicades", + "flags": { + "reasoning": "Raonament/Pensament", + "images": "Suport d'imatges", + "promptCache": "Prompt Cache", + "temperature": "Control de temperatura", + "defaultTemp": "Temperatura per defecte: {{temp}}" + } + }, "capabilities": "Configureu les capacitats i preus per al vostre model personalitzat compatible amb OpenAI. Tingueu cura en especificar les capacitats del model, ja que poden afectar com funciona Roo Code.", "maxTokens": { "label": "Màxim de tokens de sortida", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index c31d29147d4..93c7fb80609 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -480,6 +480,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "Modellfähigkeiten-Preset", + "description": "Wähle ein bekanntes Modell, um die Fähigkeiten automatisch zu konfigurieren (Kontextfenster, maximale Token, Bildunterstützung usw.). Wähle \"Benutzerdefiniert\" für manuelle Konfiguration.", + "custom": "Benutzerdefiniert (manuell konfigurieren)", + "searchPlaceholder": "Modelle suchen...", + "noResults": "Keine passenden Modelle gefunden.", + "applied": "Fähigkeiten von {{model}} angewendet", + "appliedFlags": "Angewendete Fähigkeiten", + "flags": { + "reasoning": "Reasoning/Thinking", + "images": "Bildunterstützung", + "promptCache": "Prompt Cache", + "temperature": "Temperatursteuerung", + "defaultTemp": "Standardtemperatur: {{temp}}" + } + }, "capabilities": "Konfiguriere die Fähigkeiten und Preise für dein benutzerdefiniertes OpenAI-kompatibles Modell. Sei vorsichtig bei der Angabe der Modellfähigkeiten, da diese beeinflussen können, wie Roo Code funktioniert.", "maxTokens": { "label": "Maximale Ausgabe-Tokens", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 3b2497aaee7..f871ce7ebda 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -543,6 +543,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "Model Capability Preset", + "description": "Select a known model to automatically configure capabilities (context window, max tokens, image support, etc.). Choose \"Custom\" to configure manually.", + "custom": "Custom (configure manually)", + "searchPlaceholder": "Search models...", + "noResults": "No matching models found.", + "applied": "Applied capabilities from {{model}}", + "appliedFlags": "Applied capabilities", + "flags": { + "reasoning": "Reasoning/Thinking", + "images": "Image Support", + "promptCache": "Prompt Cache", + "temperature": "Temperature Control", + "defaultTemp": "Default Temperature: {{temp}}" + } + }, "capabilities": "Configure the capabilities and pricing for your custom OpenAI-compatible model. Be careful when specifying the model capabilities, as they can affect how Roo Code performs.", "maxTokens": { "label": "Max Output Tokens", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index 6595c4f9079..4baa6fb0409 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -480,6 +480,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "Preset de capacidades del modelo", + "description": "Selecciona un modelo conocido para configurar automáticamente las capacidades (ventana de contexto, tokens máximos, soporte de imágenes, etc.). Elige \"Personalizado\" para configurar manualmente.", + "custom": "Personalizado (configurar manualmente)", + "searchPlaceholder": "Buscar modelos...", + "noResults": "No se encontraron modelos coincidentes.", + "applied": "Se aplicaron las capacidades de {{model}}", + "appliedFlags": "Capacidades aplicadas", + "flags": { + "reasoning": "Razonamiento/Pensamiento", + "images": "Soporte de imágenes", + "promptCache": "Prompt Cache", + "temperature": "Control de temperatura", + "defaultTemp": "Temperatura predeterminada: {{temp}}" + } + }, "capabilities": "Configure las capacidades y precios para su modelo personalizado compatible con OpenAI. Tenga cuidado al especificar las capacidades del modelo, ya que pueden afectar cómo funciona Roo Code.", "maxTokens": { "label": "Tokens máximos de salida", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index 56337bda14c..d258884aa4a 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -480,6 +480,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "Preset de capacités du modèle", + "description": "Sélectionne un modèle connu pour configurer automatiquement les capacités (fenêtre de contexte, tokens maximum, support d'images, etc.). Choisis \"Personnalisé\" pour configurer manuellement.", + "custom": "Personnalisé (configurer manuellement)", + "searchPlaceholder": "Rechercher des modèles...", + "noResults": "Aucun modèle correspondant trouvé.", + "applied": "Capacités de {{model}} appliquées", + "appliedFlags": "Capacités appliquées", + "flags": { + "reasoning": "Raisonnement/Réflexion", + "images": "Support d'images", + "promptCache": "Prompt Cache", + "temperature": "Contrôle de température", + "defaultTemp": "Température par défaut : {{temp}}" + } + }, "capabilities": "Configurez les capacités et les prix pour votre modèle personnalisé compatible OpenAI. Soyez prudent lors de la spécification des capacités du modèle, car elles peuvent affecter le fonctionnement de Roo Code.", "maxTokens": { "label": "Tokens de sortie maximum", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index abd334bec09..3f037b0c64b 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -480,6 +480,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "मॉडल क्षमता प्रीसेट", + "description": "क्षमताओं को स्वचालित रूप से कॉन्फ़िगर करने के लिए एक ज्ञात मॉडल चुनें (कॉन्टेक्स्ट विंडो, अधिकतम token, इमेज सपोर्ट, आदि)। मैन्युअल रूप से कॉन्फ़िगर करने के लिए \"कस्टम\" चुनें।", + "custom": "कस्टम (मैन्युअल रूप से कॉन्फ़िगर करें)", + "searchPlaceholder": "मॉडल खोजें...", + "noResults": "कोई मेल खाने वाला मॉडल नहीं मिला।", + "applied": "{{model}} से क्षमताएं लागू की गईं", + "appliedFlags": "लागू की गई क्षमताएं", + "flags": { + "reasoning": "रीज़निंग/थिंकिंग", + "images": "इमेज सपोर्ट", + "promptCache": "Prompt Cache", + "temperature": "तापमान नियंत्रण", + "defaultTemp": "डिफ़ॉल्ट तापमान: {{temp}}" + } + }, "capabilities": "अपने कस्टम OpenAI-संगत मॉडल के लिए क्षमताओं और मूल्य निर्धारण को कॉन्फ़िगर करें। मॉडल क्षमताओं को निर्दिष्ट करते समय सावधान रहें, क्योंकि वे Roo Code के प्रदर्शन को प्रभावित कर सकती हैं।", "maxTokens": { "label": "अधिकतम आउटपुट टोकन", diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index 1ebcf2073b6..e6033197fa1 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -480,6 +480,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "Preset Kemampuan Model", + "description": "Pilih model yang dikenal untuk mengonfigurasi kemampuan secara otomatis (jendela konteks, token maksimum, dukungan gambar, dll.). Pilih \"Kustom\" untuk mengonfigurasi secara manual.", + "custom": "Kustom (konfigurasi manual)", + "searchPlaceholder": "Cari model...", + "noResults": "Tidak ada model yang cocok ditemukan.", + "applied": "Kemampuan dari {{model}} diterapkan", + "appliedFlags": "Kemampuan yang diterapkan", + "flags": { + "reasoning": "Reasoning/Thinking", + "images": "Dukungan gambar", + "promptCache": "Prompt Cache", + "temperature": "Kontrol temperatur", + "defaultTemp": "Temperatur default: {{temp}}" + } + }, "capabilities": "Konfigurasi kemampuan dan harga untuk model kustom yang kompatibel dengan OpenAI. Hati-hati saat menentukan kemampuan model, karena dapat mempengaruhi performa Roo Code.", "maxTokens": { "label": "Token Output Maksimum", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 4a0c7161654..fae498fb71f 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -480,6 +480,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "Preset capacità del modello", + "description": "Seleziona un modello conosciuto per configurare automaticamente le capacità (finestra di contesto, token massimi, supporto immagini, ecc.). Scegli \"Personalizzato\" per configurare manualmente.", + "custom": "Personalizzato (configura manualmente)", + "searchPlaceholder": "Cerca modelli...", + "noResults": "Nessun modello corrispondente trovato.", + "applied": "Capacità di {{model}} applicate", + "appliedFlags": "Capacità applicate", + "flags": { + "reasoning": "Ragionamento/Pensiero", + "images": "Supporto immagini", + "promptCache": "Prompt Cache", + "temperature": "Controllo temperatura", + "defaultTemp": "Temperatura predefinita: {{temp}}" + } + }, "capabilities": "Configura le capacità e i prezzi del tuo modello personalizzato compatibile con OpenAI. Fai attenzione quando specifichi le capacità del modello, poiché possono influenzare le prestazioni di Roo Code.", "maxTokens": { "label": "Token di output massimi", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index b0d921571af..78c3801014b 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -480,6 +480,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "モデル機能プリセット", + "description": "既知のモデルを選択して、機能(コンテキストウィンドウ、最大トークン数、画像サポートなど)を自動的に設定します。手動で設定するには「カスタム」を選択してください。", + "custom": "カスタム(手動で設定)", + "searchPlaceholder": "モデルを検索...", + "noResults": "一致するモデルが見つかりません。", + "applied": "{{model}}の機能を適用しました", + "appliedFlags": "適用された機能", + "flags": { + "reasoning": "推論/思考", + "images": "画像サポート", + "promptCache": "プロンプトキャッシュ", + "temperature": "Temperature制御", + "defaultTemp": "デフォルトTemperature: {{temp}}" + } + }, "capabilities": "カスタムOpenAI互換モデルの機能と価格を設定します。モデルの機能はRoo Codeのパフォーマンスに影響を与える可能性があるため、慎重に指定してください。", "maxTokens": { "label": "最大出力トークン", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 88fc8e6d79e..a0bc6806fdd 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -480,6 +480,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "모델 기능 프리셋", + "description": "알려진 모델을 선택하여 기능(컨텍스트 윈도우, 최대 토큰, 이미지 지원 등)을 자동으로 구성합니다. 수동으로 구성하려면 \"사용자 정의\"를 선택하세요.", + "custom": "사용자 정의 (수동 구성)", + "searchPlaceholder": "모델 검색...", + "noResults": "일치하는 모델을 찾을 수 없습니다.", + "applied": "{{model}}의 기능이 적용되었습니다", + "appliedFlags": "적용된 기능", + "flags": { + "reasoning": "추론/사고", + "images": "이미지 지원", + "promptCache": "프롬프트 캐시", + "temperature": "Temperature 제어", + "defaultTemp": "기본 Temperature: {{temp}}" + } + }, "capabilities": "사용자 정의 OpenAI 호환 모델의 기능과 가격을 구성하세요. 모델 기능이 Roo Code의 성능에 영향을 미칠 수 있으므로 신중하게 지정하세요.", "maxTokens": { "label": "최대 출력 토큰", diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index fcfad37d376..fd292d2218c 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -480,6 +480,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "Modelmogelijkheden-preset", + "description": "Selecteer een bekend model om de mogelijkheden automatisch te configureren (contextvenster, maximale tokens, afbeeldingsondersteuning, enz.). Kies \"Aangepast\" om handmatig te configureren.", + "custom": "Aangepast (handmatig configureren)", + "searchPlaceholder": "Modellen zoeken...", + "noResults": "Geen overeenkomende modellen gevonden.", + "applied": "Mogelijkheden van {{model}} toegepast", + "appliedFlags": "Toegepaste mogelijkheden", + "flags": { + "reasoning": "Redeneren/Denken", + "images": "Afbeeldingsondersteuning", + "promptCache": "Prompt Cache", + "temperature": "Temperatuurregeling", + "defaultTemp": "Standaardtemperatuur: {{temp}}" + } + }, "capabilities": "Stel de mogelijkheden en prijzen in voor je aangepaste OpenAI-compatibele model. Wees voorzichtig met het opgeven van de modelmogelijkheden, want deze kunnen de prestaties van Roo Code beïnvloeden.", "maxTokens": { "label": "Maximaal aantal outputtokens", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index fa48bc6b212..f76a0874e83 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -480,6 +480,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "Preset możliwości modelu", + "description": "Wybierz znany model, aby automatycznie skonfigurować możliwości (okno kontekstu, maksymalna liczba tokenów, obsługa obrazów itp.). Wybierz \"Niestandardowy\" aby skonfigurować ręcznie.", + "custom": "Niestandardowy (konfiguruj ręcznie)", + "searchPlaceholder": "Szukaj modeli...", + "noResults": "Nie znaleziono pasujących modeli.", + "applied": "Zastosowano możliwości z {{model}}", + "appliedFlags": "Zastosowane możliwości", + "flags": { + "reasoning": "Rozumowanie/Myślenie", + "images": "Obsługa obrazów", + "promptCache": "Prompt Cache", + "temperature": "Kontrola temperatury", + "defaultTemp": "Domyślna temperatura: {{temp}}" + } + }, "capabilities": "Skonfiguruj możliwości i ceny swojego niestandardowego modelu zgodnego z OpenAI. Zachowaj ostrożność podczas określania możliwości modelu, ponieważ mogą one wpływać na wydajność Roo Code.", "maxTokens": { "label": "Maksymalna liczba tokenów wyjściowych", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index a8387e05121..be387457eb5 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -480,6 +480,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "Preset de capacidades do modelo", + "description": "Selecione um modelo conhecido para configurar automaticamente as capacidades (janela de contexto, tokens máximos, suporte a imagens, etc.). Escolha \"Personalizado\" para configurar manualmente.", + "custom": "Personalizado (configurar manualmente)", + "searchPlaceholder": "Buscar modelos...", + "noResults": "Nenhum modelo correspondente encontrado.", + "applied": "Capacidades de {{model}} aplicadas", + "appliedFlags": "Capacidades aplicadas", + "flags": { + "reasoning": "Raciocínio/Pensamento", + "images": "Suporte a imagens", + "promptCache": "Prompt Cache", + "temperature": "Controle de temperatura", + "defaultTemp": "Temperatura padrão: {{temp}}" + } + }, "capabilities": "Configure as capacidades e preços para seu modelo personalizado compatível com OpenAI. Tenha cuidado ao especificar as capacidades do modelo, pois elas podem afetar como o Roo Code funciona.", "maxTokens": { "label": "Máximo de Tokens de Saída", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index fe24ebee299..447e8f88ed5 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -480,6 +480,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "Пресет возможностей модели", + "description": "Выбери известную модель для автоматической настройки возможностей (окно контекста, максимум токенов, поддержка изображений и т.д.). Выбери \"Пользовательский\" для ручной настройки.", + "custom": "Пользовательский (настроить вручную)", + "searchPlaceholder": "Поиск моделей...", + "noResults": "Подходящие модели не найдены.", + "applied": "Применены возможности из {{model}}", + "appliedFlags": "Применённые возможности", + "flags": { + "reasoning": "Рассуждение/Мышление", + "images": "Поддержка изображений", + "promptCache": "Prompt Cache", + "temperature": "Управление температурой", + "defaultTemp": "Температура по умолчанию: {{temp}}" + } + }, "capabilities": "Настройте возможности и стоимость вашей пользовательской модели, совместимой с OpenAI. Будьте осторожны при указании возможностей модели, это может повлиять на работу Roo Code.", "maxTokens": { "label": "Максимум токенов на вывод", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 7171718f1c5..a3d96d4fac1 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -480,6 +480,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "Model Yetenek Ön Ayarı", + "description": "Yetenekleri otomatik olarak yapılandırmak için bilinen bir model seç (bağlam penceresi, maksimum token, görüntü desteği vb.). Manuel yapılandırma için \"Özel\" seç.", + "custom": "Özel (manuel yapılandır)", + "searchPlaceholder": "Model ara...", + "noResults": "Eşleşen model bulunamadı.", + "applied": "{{model}} yetenekleri uygulandı", + "appliedFlags": "Uygulanan yetenekler", + "flags": { + "reasoning": "Akıl Yürütme/Düşünme", + "images": "Görüntü desteği", + "promptCache": "Prompt Cache", + "temperature": "Sıcaklık kontrolü", + "defaultTemp": "Varsayılan sıcaklık: {{temp}}" + } + }, "capabilities": "Özel OpenAI uyumlu modelinizin yeteneklerini ve fiyatlandırmasını yapılandırın. Model yeteneklerini belirtirken dikkatli olun, çünkü bunlar Roo Code'un performansını etkileyebilir.", "maxTokens": { "label": "Maksimum Çıktı Token'ları", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 95b4f2d6863..eab3c751e79 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -480,6 +480,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "Preset khả năng mô hình", + "description": "Chọn một mô hình đã biết để tự động cấu hình các khả năng (cửa sổ ngữ cảnh, token tối đa, hỗ trợ hình ảnh, v.v.). Chọn \"Tùy chỉnh\" để cấu hình thủ công.", + "custom": "Tùy chỉnh (cấu hình thủ công)", + "searchPlaceholder": "Tìm kiếm mô hình...", + "noResults": "Không tìm thấy mô hình phù hợp.", + "applied": "Đã áp dụng khả năng từ {{model}}", + "appliedFlags": "Khả năng đã áp dụng", + "flags": { + "reasoning": "Suy luận/Tư duy", + "images": "Hỗ trợ hình ảnh", + "promptCache": "Prompt Cache", + "temperature": "Điều khiển temperature", + "defaultTemp": "Temperature mặc định: {{temp}}" + } + }, "capabilities": "Cấu hình các khả năng và giá cả cho mô hình tương thích OpenAI tùy chỉnh của bạn. Hãy cẩn thận khi chỉ định khả năng của mô hình, vì chúng có thể ảnh hưởng đến cách Roo Code hoạt động.", "maxTokens": { "label": "Số token đầu ra tối đa", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index eeba6bb079d..a4972194664 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -480,6 +480,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "模型能力预设", + "description": "选择一个已知模型来自动配置能力(上下文窗口、最大 token 数、图像支持等)。选择「自定义」以手动配置。", + "custom": "自定义(手动配置)", + "searchPlaceholder": "搜索模型...", + "noResults": "未找到匹配的模型。", + "applied": "已应用 {{model}} 的能力配置", + "appliedFlags": "已应用的能力", + "flags": { + "reasoning": "推理/思考", + "images": "图像支持", + "promptCache": "Prompt 缓存", + "temperature": "Temperature 控制", + "defaultTemp": "默认 Temperature: {{temp}}" + } + }, "capabilities": "自定义模型配置注意事项:\n• 确保兼容OpenAI接口规范\n• 错误配置可能导致功能异常\n• 价格参数影响费用统计", "maxTokens": { "label": "最大输出Token数", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 9f4241c3dd9..37922052a84 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -490,6 +490,22 @@ } }, "customModel": { + "capabilityPreset": { + "label": "模型能力預設", + "description": "選擇一個已知模型來自動設定能力(上下文視窗、最大 token 數、圖片支援等)。選擇「自訂」以手動設定。", + "custom": "自訂(手動設定)", + "searchPlaceholder": "搜尋模型...", + "noResults": "找不到符合的模型。", + "applied": "已套用 {{model}} 的能力設定", + "appliedFlags": "已套用的能力", + "flags": { + "reasoning": "推理/思考", + "images": "圖片支援", + "promptCache": "Prompt 快取", + "temperature": "Temperature 控制", + "defaultTemp": "預設 Temperature: {{temp}}" + } + }, "capabilities": "設定自訂 OpenAI 相容模型的功能和定價。請謹慎設定模型功能,因為這會影響 Roo Code 的運作方式。", "maxTokens": { "label": "最大輸出 Token",