diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index a60f7e0b282..3fab30df50e 100644 --- a/packages/types/src/provider-settings.ts +++ b/packages/types/src/provider-settings.ts @@ -152,6 +152,7 @@ const lmStudioSchema = baseProviderSettingsSchema.extend({ const geminiSchema = apiModelIdProviderModelSchema.extend({ geminiApiKey: z.string().optional(), googleGeminiBaseUrl: z.string().optional(), + maxContextWindow: z.number().nullish(), }) const openAiNativeSchema = apiModelIdProviderModelSchema.extend({ @@ -318,6 +319,7 @@ export const PROVIDER_SETTINGS_KEYS = keysOf()([ // Gemini "geminiApiKey", "googleGeminiBaseUrl", + "maxContextWindow", // OpenAI Native "openAiNativeApiKey", "openAiNativeBaseUrl", diff --git a/src/api/providers/gemini.ts b/src/api/providers/gemini.ts index 6765c8676d8..4150da11a30 100644 --- a/src/api/providers/gemini.ts +++ b/src/api/providers/gemini.ts @@ -132,9 +132,16 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl override getModel() { const modelId = this.options.apiModelId let id = modelId && modelId in geminiModels ? (modelId as GeminiModelId) : geminiDefaultModelId - const info: ModelInfo = geminiModels[id] + let info: ModelInfo = geminiModels[id] const params = getModelParams({ format: "gemini", modelId: id, model: info, settings: this.options }) + if (this.options.maxContextWindow) { + info = { + ...info, + contextWindow: this.options.maxContextWindow, + } + } + // The `:thinking` suffix indicates that the model is a "Hybrid" // reasoning model and that reasoning is required to be enabled. // The actual model ID honored by Gemini's API does not have this diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index fa814f06610..b030dffbd33 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -1667,7 +1667,10 @@ export class Task extends EventEmitter { ? this.apiConfiguration.modelMaxTokens || DEFAULT_THINKING_MODEL_MAX_TOKENS : modelInfo.maxTokens - const contextWindow = modelInfo.contextWindow + const contextWindow = + this.apiConfiguration.apiProvider === "gemini" && this.apiConfiguration.maxContextWindow + ? this.apiConfiguration.maxContextWindow + : modelInfo.contextWindow const truncateResult = await truncateConversationIfNeeded({ messages: this.apiConversationHistory, diff --git a/src/core/task/__tests__/Task.test.ts b/src/core/task/__tests__/Task.test.ts index 8ed57ffcb32..c7dce3dc8d9 100644 --- a/src/core/task/__tests__/Task.test.ts +++ b/src/core/task/__tests__/Task.test.ts @@ -14,6 +14,7 @@ import { ClineProvider } from "../../webview/ClineProvider" import { ApiStreamChunk } from "../../../api/transform/stream" import { ContextProxy } from "../../config/ContextProxy" import { processUserContentMentions } from "../../mentions/processUserContentMentions" +import * as slidingWindow from "../../sliding-window" jest.mock("execa", () => ({ execa: jest.fn(), @@ -533,6 +534,82 @@ describe("Cline", () => { }) }) + it("should use maxContextWindow when provider is gemini and maxContextWindow is set", async () => { + // Arrange: set apiProvider to gemini and maxContextWindow + const geminiConfig = { + ...mockApiConfig, + apiProvider: "gemini" as const, + maxContextWindow: 42, + } + const created = Task.create({ + provider: mockProvider, + apiConfiguration: geminiConfig, + task: "test gemini context window", + }) as unknown as [any, Promise] + const cline = created[0] as any + const task = created[1] as Promise + + // Stub model info to have a different default contextWindow + ;(cline.api as any).getModel = jest.fn().mockReturnValue({ + id: "gemini-model", + info: { + contextWindow: 100, + supportsReasoningBudget: true, + maxTokens: 1000, + supportsComputerUse: false, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + }, + }) + + // Stub required methods to let attemptApiRequest proceed + ;(cline as any).getSystemPrompt = jest.fn().mockResolvedValue("") + ;(cline as any).getTokenUsage = jest.fn().mockReturnValue({ + contextTokens: 1, + totalTokensIn: 0, + totalTokensOut: 0, + totalCost: 0, + }) + + // Stub createMessage to avoid real API calls + jest.spyOn(cline.api as any, "createMessage").mockReturnValue((async function* () {})()) + + // Spy on truncateConversationIfNeeded to capture its options + const twSpy = jest.spyOn(slidingWindow, "truncateConversationIfNeeded").mockResolvedValue({ + messages: [], + summary: "", + cost: 0, + prevContextTokens: 0, + newContextTokens: 0, + error: undefined, + }) + + // Force abort immediately so the stream loop exits + Object.defineProperty(cline, "abort", { + get: () => false, + set: () => {}, + configurable: true, + }) + + // Act: run through the generator + try { + for await (const _ of cline.attemptApiRequest()) { + } + } catch { + /* ignore */ + } + + // Assert: the contextWindow passed to truncateConversationIfNeeded is the maxContextWindow + expect(twSpy).toHaveBeenCalled() + const optionsPassed = twSpy.mock.calls[0][0] + expect(optionsPassed.contextWindow).toBe(42) + + // Cleanup + await cline.abortTask(true) + await task.catch(() => {}) + }) + it.skip("should handle API retry with countdown", async () => { const [cline, task] = Task.create({ provider: mockProvider, diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index 905f34a8600..8867e1cae5d 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -51,6 +51,7 @@ import { ApiErrorMessage } from "./ApiErrorMessage" import { ThinkingBudget } from "./ThinkingBudget" import { DiffSettingsControl } from "./DiffSettingsControl" import { TemperatureControl } from "./TemperatureControl" +import { MaxContextWindowControl } from "./MaxContextWindowControl" import { RateLimitSecondsControl } from "./RateLimitSecondsControl" import { BedrockCustomArn } from "./providers/BedrockCustomArn" import { buildDocLink } from "@src/utils/docLinks" @@ -461,6 +462,7 @@ const ApiOptions = ({ modelInfo={selectedModelInfo} isDescriptionExpanded={isDescriptionExpanded} setIsDescriptionExpanded={setIsDescriptionExpanded} + maxContextWindow={selectedProvider === "gemini" ? apiConfiguration.maxContextWindow : undefined} /> )} @@ -484,6 +486,15 @@ const ApiOptions = ({ onChange={handleInputChange("modelTemperature", noTransform)} maxValue={2} /> + + {selectedProvider === "gemini" && ( + + )} + setApiConfigurationField("rateLimitSeconds", value)} diff --git a/webview-ui/src/components/settings/MaxContextWindowControl.tsx b/webview-ui/src/components/settings/MaxContextWindowControl.tsx new file mode 100644 index 00000000000..b6998ef4e26 --- /dev/null +++ b/webview-ui/src/components/settings/MaxContextWindowControl.tsx @@ -0,0 +1,71 @@ +import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react" +import { useEffect, useState } from "react" +import { useAppTranslation } from "@/i18n/TranslationContext" +import { useDebounce } from "react-use" + +import { Slider } from "@/components/ui" + +interface MaxContextWindowControlProps { + value: number | undefined | null + onChange: (value: number | undefined | null) => void + maxValue?: number +} + +export const MaxContextWindowControl = ({ value, onChange, maxValue = 1000000 }: MaxContextWindowControlProps) => { + const { t } = useAppTranslation() + const [isCustomMaxContextWindow, setIsCustomMaxContextWindow] = useState(value !== undefined) + const [inputValue, setInputValue] = useState(value) + + useDebounce(() => onChange(inputValue), 50, [onChange, inputValue]) + + // Sync internal state with prop changes when switching profiles. + useEffect(() => { + const hasCustomMaxContextWindow = value !== undefined && value !== null + setIsCustomMaxContextWindow(hasCustomMaxContextWindow) + setInputValue(value) + }, [value]) + + return ( + <> +
+ { + const isChecked = e.target.checked + setIsCustomMaxContextWindow(isChecked) + + if (!isChecked) { + setInputValue(null) // Unset the max context window limit, note that undefined is unserializable. + } else { + setInputValue(value ?? 0) // Use the value from apiConfiguration, if set. + } + }}> + + +
+ {t("settings:maxContextWindow.description")} +
+
+ + {isCustomMaxContextWindow && ( +
+
+
+ setInputValue(value)} + /> + {inputValue} +
+
+ {t("settings:maxContextWindow.rangeDescription")} +
+
+
+ )} + + ) +} diff --git a/webview-ui/src/components/settings/ModelInfoView.tsx b/webview-ui/src/components/settings/ModelInfoView.tsx index 8078b03acd7..cccd5b62181 100644 --- a/webview-ui/src/components/settings/ModelInfoView.tsx +++ b/webview-ui/src/components/settings/ModelInfoView.tsx @@ -14,6 +14,7 @@ type ModelInfoViewProps = { modelInfo?: ModelInfo isDescriptionExpanded: boolean setIsDescriptionExpanded: (isExpanded: boolean) => void + maxContextWindow?: number | null } export const ModelInfoView = ({ @@ -22,9 +23,13 @@ export const ModelInfoView = ({ modelInfo, isDescriptionExpanded, setIsDescriptionExpanded, + maxContextWindow, }: ModelInfoViewProps) => { const { t } = useAppTranslation() + const maxContextWindowValue = + apiProvider === "gemini" && maxContextWindow ? maxContextWindow : modelInfo?.contextWindow + const infoItems = [ ), + maxContextWindowValue && ( + <> + {t("settings:maxContextWindow.maxContextWindow")}:{" "} + {maxContextWindowValue.toLocaleString()} tokens + {apiProvider === "gemini" && maxContextWindowValue && ( + (custom limit) + )} + + ), apiProvider === "gemini" && ( {selectedModelId.includes("pro-preview") diff --git a/webview-ui/src/components/settings/__tests__/MaxContextWindowControl.test.tsx b/webview-ui/src/components/settings/__tests__/MaxContextWindowControl.test.tsx new file mode 100644 index 00000000000..8f8a5b8d4f8 --- /dev/null +++ b/webview-ui/src/components/settings/__tests__/MaxContextWindowControl.test.tsx @@ -0,0 +1,57 @@ +import { render, screen, fireEvent } from "@testing-library/react" +import { MaxContextWindowControl } from "../MaxContextWindowControl" +import "@testing-library/jest-dom" + +class MockResizeObserver { + observe() {} + unobserve() {} + disconnect() {} +} +global.ResizeObserver = MockResizeObserver + +jest.mock("@/components/ui", () => ({ + ...jest.requireActual("@/components/ui"), + Slider: ({ value, onValueChange, min = 0, max = 100, "data-testid": dataTestId }: any) => ( + onValueChange([parseInt(e.target.value, 10)])} + data-testid={dataTestId} + /> + ), +})) + +describe("MaxContextWindowControl", () => { + it("updates when checkbox is toggled", async () => { + const onChange = jest.fn() + render() + + const checkbox = screen.getByRole("checkbox") as HTMLInputElement + fireEvent.click(checkbox) + + await new Promise((r) => setTimeout(r, 100)) + expect(onChange).toHaveBeenCalledWith(null) + + fireEvent.click(checkbox) + + await new Promise((r) => setTimeout(r, 100)) + expect(onChange).toHaveBeenCalledWith(123) + }) + + it("calls onChange when slider is moved", async () => { + const onChange = jest.fn() + render() + + const checkbox = screen.getByRole("checkbox") as HTMLInputElement + expect(checkbox).toBeChecked() + + const slider = screen.getByRole("slider") + fireEvent.change(slider, { target: { value: "50000" } }) + + await new Promise((r) => setTimeout(r, 120)) + + expect(onChange).toHaveBeenCalledWith(50000) + }) +}) diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 71a7ff3c7b1..d0d97ee3af8 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -503,6 +503,12 @@ "description": "Controla l'aleatorietat en les respostes del model.", "rangeDescription": "Valors més alts fan que la sortida sigui més aleatòria, valors més baixos la fan més determinista." }, + "maxContextWindow": { + "maxContextWindow": "", + "useCustom": "Utilitza una finestra de context màxim personalitzada", + "description": "Estableix la mida màxima de la finestra de context per al model. Quan les converses s'acosten a aquest límit, Roo Code condensarà automàticament els missatges més antics per mantenir-se dins de la restricció.", + "rangeDescription": "Els valors més alts permeten converses més llargues abans de condensar-se, els valors més baixos activen la condensació abans per mantenir-se dins dels límits de velocitat de l'API." + }, "modelInfo": { "supportsImages": "Suporta imatges", "noImages": "No suporta imatges", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index e34b4f1f9b7..cfeab9f0ca2 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -503,6 +503,12 @@ "description": "Steuert die Zufälligkeit in den Antworten des Modells.", "rangeDescription": "Höhere Werte machen die Ausgabe zufälliger, niedrigere Werte machen sie deterministischer." }, + "maxContextWindow": { + "maxContextWindow": "Maximales Kontextfenster", + "useCustom": "Benutzerdefiniertes maximales Kontextfenster verwenden", + "description": "Legt die maximale Kontextfenstergröße für das Modell fest. Wenn Konversationen diese Grenze erreichen, komprimiert Roo Code ältere Nachrichten automatisch, um die Beschränkung einzuhalten.", + "rangeDescription": "Höhere Werte ermöglichen längere Gespräche vor der Verdichtung, niedrigere Werte lösen eine frühere Verdichtung aus, um innerhalb der API-Ratengrenzen zu bleiben." + }, "modelInfo": { "supportsImages": "Unterstützt Bilder", "noImages": "Unterstützt keine Bilder", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 4aaf873cb2d..b5092550096 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -503,6 +503,12 @@ "description": "Controls randomness in the model's responses.", "rangeDescription": "Higher values make output more random, lower values make it more deterministic." }, + "maxContextWindow": { + "maxContextWindow": "Max Context Window", + "useCustom": "Use custom max context window", + "description": "Sets the maximum context window size for the model. When conversations approach this limit, Roo Code will automatically condense older messages to stay within the constraint.", + "rangeDescription": "Higher values allow longer conversations before condensing, lower values trigger condensing sooner to stay within API rate limits." + }, "modelInfo": { "supportsImages": "Supports images", "noImages": "Does not support images", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index e48d1433938..6e1ebecf633 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -503,6 +503,12 @@ "description": "Controla la aleatoriedad en las respuestas del modelo.", "rangeDescription": "Valores más altos hacen que la salida sea más aleatoria, valores más bajos la hacen más determinista." }, + "maxContextWindow": { + "maxContextWindow": "", + "useCustom": "Usar ventana de contexto máxima personalizada", + "description": "Establece el tamaño máximo de la ventana de contexto del modelo. Cuando las conversaciones se acercan a este límite, Roo Code condensará automáticamente los mensajes antiguos para ajustarse a la restricción.", + "rangeDescription": "Los valores más altos permiten conversaciones más largas antes de condensarse; los valores más bajos activan la condensación antes para permanecer dentro de los límites de velocidad de la API." + }, "modelInfo": { "supportsImages": "Soporta imágenes", "noImages": "No soporta imágenes", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index f39a67b3a0d..aea6816df25 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -503,6 +503,12 @@ "description": "Contrôle l'aléatoire dans les réponses du modèle.", "rangeDescription": "Des valeurs plus élevées rendent la sortie plus aléatoire, des valeurs plus basses la rendent plus déterministe." }, + "maxContextWindow": { + "maxContextWindow": "", + "useCustom": "Utiliser la fenêtre contextuelle maximale personnalisée", + "description": "Définit la taille maximale de la fenêtre contextuelle du modèle. Lorsque les conversations approchent de cette limite, Roo Code condense automatiquement les messages plus anciens pour respecter la contrainte.", + "rangeDescription": "Des valeurs plus élevées permettent des conversations plus longues avant la condensation, des valeurs plus faibles déclenchent la condensation plus tôt pour rester dans les limites de débit de l'API." + }, "modelInfo": { "supportsImages": "Prend en charge les images", "noImages": "Ne prend pas en charge les images", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 3057eb17232..dedca0ac0a3 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -503,6 +503,12 @@ "description": "मॉडल की प्रतिक्रियाओं में यादृच्छिकता को नियंत्रित करता है।", "rangeDescription": "उच्च मान आउटपुट को अधिक यादृच्छिक बनाते हैं, निम्न मान इसे अधिक निर्धारित बनाते हैं।" }, + "maxContextWindow": { + "maxContextWindow": "", + "useCustom": "कस्टम अधिकतम संदर्भ विंडो का उपयोग करें", + "description": "मॉडल के लिए अधिकतम संदर्भ विंडो आकार सेट करता है। जब बातचीत इस सीमा के करीब पहुंचती है, तो रू कोड पुराने संदेशों को स्वचालित रूप से सीमा के भीतर रहने के लिए संक्षिप्त कर देगा।", + "rangeDescription": "उच्चतर मान संघनन से पहले लम्बी बातचीत की अनुमति देते हैं, जबकि निम्न मान API दर सीमाओं के भीतर रहने के लिए शीघ्र ही संघनन को सक्रिय कर देते हैं।" + }, "modelInfo": { "supportsImages": "छवियों का समर्थन करता है", "noImages": "छवियों का समर्थन नहीं करता है", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 7149ca7a25c..244f250b1a3 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -503,6 +503,12 @@ "description": "Controlla la casualità nelle risposte del modello.", "rangeDescription": "Valori più alti rendono l'output più casuale, valori più bassi lo rendono più deterministico." }, + "maxContextWindow": { + "maxContextWindow": "Finestra di contesto massima", + "useCustom": "Utilizza la finestra di contesto massima personalizzata", + "description": "Imposta la dimensione massima della finestra di contesto per il modello. Quando le conversazioni si avvicinano a questo limite, Roo Code condensa automaticamente i messaggi più vecchi per rimanere entro il vincolo.", + "rangeDescription": "Valori più alti consentono conversazioni più lunghe prima della condensazione, mentre valori più bassi attivano la condensazione prima per restare entro i limiti di velocità API." + }, "modelInfo": { "supportsImages": "Supporta immagini", "noImages": "Non supporta immagini", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 87be7c8ced7..39796b17aee 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -503,6 +503,12 @@ "description": "モデルの応答のランダム性を制御します。", "rangeDescription": "高い値は出力をよりランダムに、低い値はより決定論的にします。" }, + "maxContextWindow": { + "maxContextWindow": "最大コンテキストウィンドウ", + "useCustom": "カスタム最大コンテキストウィンドウを使用する", + "description": "モデルの最大コンテキストウィンドウサイズを設定します。会話がこの制限に近づくと、Roo Code は古いメッセージを自動的に圧縮して制限内に収めます。", + "rangeDescription": "値が大きいほど、圧縮前の会話が長くなり、値が小さいほど、API レート制限内に収まるように圧縮が早くトリガーされます。" + }, "modelInfo": { "supportsImages": "画像をサポート", "noImages": "画像をサポートしていません", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 3c0077e1fb2..214c09f7663 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -503,6 +503,12 @@ "description": "모델 응답의 무작위성을 제어합니다.", "rangeDescription": "높은 값은 출력을 더 무작위하게, 낮은 값은 더 결정적으로 만듭니다." }, + "maxContextWindow": { + "maxContextWindow": "최대 컨텍스트 창", + "useCustom": "사용자 정의 최대 컨텍스트 창 사용", + "description": "모델의 최대 컨텍스트 창 크기를 설정합니다. 대화가 이 제한에 도달하면 Roo Code는 자동으로 이전 메시지를 응축하여 제한 범위 내에 있도록 합니다.", + "rangeDescription": "값이 높을수록 응축되기 전에 더 긴 대화가 가능하고, 값이 낮을수록 API 속도 제한 내에 머물기 위해 더 빨리 응축이 실행됩니다." + }, "modelInfo": { "supportsImages": "이미지 지원", "noImages": "이미지 지원 안 함", diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index 685eab40fef..c8c286b2a83 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -503,6 +503,12 @@ "description": "Bepaalt de willekeurigheid in de antwoorden van het model.", "rangeDescription": "Hogere waarden maken de output willekeuriger, lagere waarden maken deze deterministischer." }, + "maxContextWindow": { + "maxContextWindow": "Maximaal contextvenster", + "useCustom": "Gebruik aangepast maximaal contextvenster", + "description": "Stelt de maximale grootte van het contextvenster voor het model in. Wanneer conversaties deze limiet naderen, condenseert Roo Code automatisch oudere berichten om binnen de beperking te blijven.", + "rangeDescription": "Hogere waarden zorgen voor langere conversaties voordat er condensatie plaatsvindt, lagere waarden activeren eerder condensatie om binnen de API-snelheidslimieten te blijven." + }, "modelInfo": { "supportsImages": "Ondersteunt afbeeldingen", "noImages": "Ondersteunt geen afbeeldingen", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index f89e9330d64..114939e74f8 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -503,6 +503,12 @@ "description": "Kontroluje losowość w odpowiedziach modelu.", "rangeDescription": "Wyższe wartości sprawiają, że wyjście jest bardziej losowe, niższe wartości czynią je bardziej deterministycznym." }, + "maxContextWindow": { + "maxContextWindow": "", + "useCustom": "Użyj niestandardowego okna maksymalnego kontekstu", + "description": "Ustawia maksymalny rozmiar okna kontekstu dla modelu. Gdy konwersacje zbliżają się do tego limitu, Roo Code automatycznie skondensuje starsze wiadomości, aby zachować ograniczenie.", + "rangeDescription": "Wyższe wartości umożliwiają dłuższe konwersacje przed kondensacją, niższe wartości uruchamiają kondensację wcześniej, aby utrzymać się w granicach szybkości interfejsu API." + }, "modelInfo": { "supportsImages": "Obsługuje obrazy", "noImages": "Nie obsługuje obrazów", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index ed2540b630c..20ac0db20bc 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -503,6 +503,12 @@ "description": "Controla a aleatoriedade nas respostas do modelo.", "rangeDescription": "Valores mais altos tornam a saída mais aleatória, valores mais baixos a tornam mais determinística." }, + "maxContextWindow": { + "maxContextWindow": "Janela de Contexto Máxima", + "useCustom": "Usar janela de contexto máximo personalizada", + "description": "Define o tamanho máximo da janela de contexto para o modelo. Quando as conversas se aproximam desse limite, o Roo Code condensa automaticamente as mensagens mais antigas para permanecer dentro da restrição.", + "rangeDescription": "Valores mais altos permitem conversas mais longas antes da condensação, valores mais baixos acionam a condensação mais cedo para permanecer dentro dos limites de taxa da API." + }, "modelInfo": { "supportsImages": "Suporta imagens", "noImages": "Não suporta imagens", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index 385be646c99..e93040bf686 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -503,6 +503,12 @@ "description": "Управляет случайностью ответов модели.", "rangeDescription": "Более высокие значения делают ответы более случайными, низкие — более детерминированными." }, + "maxContextWindow": { + "maxContextWindow": "Максимальное окно контекста", + "useCustom": "Использовать пользовательское максимальное контекстное окно", + "description": "Устанавливает максимальный размер контекстного окна для модели. Когда разговоры приближаются к этому пределу, Roo Code автоматически сжимает старые сообщения, чтобы оставаться в рамках ограничения.", + "rangeDescription": "Более высокие значения допускают более длительные разговоры перед сжатием, более низкие значения запускают сжатие раньше, чтобы оставаться в пределах ограничений скорости API." + }, "modelInfo": { "supportsImages": "Поддерживает изображения", "noImages": "Не поддерживает изображения", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index e97c6d75055..db1320a0155 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -503,6 +503,12 @@ "description": "Model yanıtlarındaki rastgeleliği kontrol eder.", "rangeDescription": "Daha yüksek değerler çıktıyı daha rastgele yapar, daha düşük değerler daha deterministik hale getirir." }, + "maxContextWindow": { + "maxContextWindow": "Maksimum Bağlam Penceresi", + "useCustom": "Özel maksimum bağlam penceresini kullan", + "description": "Model için maksimum bağlam penceresi boyutunu ayarlar. Konuşmalar bu sınıra yaklaştığında, Roo Kodu kısıtlama dahilinde kalmak için eski mesajları otomatik olarak yoğunlaştıracaktır.", + "rangeDescription": "Daha yüksek değerler, yoğunlaşmadan önce daha uzun görüşmelere izin verirken, daha düşük değerler API oran sınırları içinde kalmak için daha erken yoğunlaşmayı tetikler." + }, "modelInfo": { "supportsImages": "Görüntüleri destekler", "noImages": "Görüntüleri desteklemez", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 28eabc80375..99e9c299dc2 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -503,6 +503,12 @@ "description": "Kiểm soát tính ngẫu nhiên trong phản hồi của mô hình.", "rangeDescription": "Giá trị cao hơn làm cho đầu ra ngẫu nhiên hơn, giá trị thấp hơn làm cho nó xác định hơn." }, + "maxContextWindow": { + "maxContextWindow": "Cửa sổ ngữ cảnh tối đa", + "useCustom": "Sử dụng cửa sổ ngữ cảnh tối đa tùy chỉnh", + "description": "Đặt kích thước cửa sổ ngữ cảnh tối đa cho mô hình. Khi các cuộc hội thoại đạt đến giới hạn này, Roo Code sẽ tự động cô đọng các tin nhắn cũ hơn để duy trì trong phạm vi ràng buộc.", + "rangeDescription": "Giá trị cao hơn cho phép các cuộc hội thoại dài hơn trước khi ngưng tụ, giá trị thấp hơn kích hoạt ngưng tụ sớm hơn để duy trì trong giới hạn tốc độ API." + }, "modelInfo": { "supportsImages": "Hỗ trợ hình ảnh", "noImages": "Không hỗ trợ hình ảnh", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 0b979b5e2f4..124ae02c0d8 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -503,6 +503,12 @@ "description": "控制模型响应的随机性", "rangeDescription": "值越高回答越多样,值越低越保守" }, + "maxContextWindow": { + "maxContextWindow": "最大上下文窗口", + "useCustom": "使用自定义最大上下文窗口", + "description": "设置模型的最大上下文窗口大小。当对话接近此限制时,Roo Code 会自动压缩较旧的消息以使其符合限制条件。", + "rangeDescription": "较高的值允许在压缩之前进行更长的对话,较低的值会更快地触发压缩以保持在 API 速率限制内。" + }, "modelInfo": { "supportsImages": "支持图像", "noImages": "不支持图像", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 1018d5934c2..5be2b914f04 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -503,6 +503,12 @@ "description": "控制模型回應的隨機性", "rangeDescription": "較高值使輸出更隨機,較低值更確定" }, + "maxContextWindow": { + "maxContextWindow": "最大上下文視窗", + "useCustom": "使用自訂最大上下文視窗", + "description": "設定模型的最大上下文視窗大小。當對話接近此限制時,Roo Code 將自動壓縮舊訊息以保持在限制範圍內。", + "rangeDescription": "較高的值允許在壓縮之前進行更長的對話,較低的值會更快觸發壓縮以保持在 API 速率限制內。" + }, "modelInfo": { "supportsImages": "支援影像", "noImages": "不支援影像",