diff --git a/src/api/providers/__tests__/lm-studio-timeout.spec.ts b/src/api/providers/__tests__/lm-studio-timeout.spec.ts new file mode 100644 index 0000000000..659fcaaf67 --- /dev/null +++ b/src/api/providers/__tests__/lm-studio-timeout.spec.ts @@ -0,0 +1,91 @@ +// npx vitest run api/providers/__tests__/lm-studio-timeout.spec.ts + +import { LmStudioHandler } from "../lm-studio" +import { ApiHandlerOptions } from "../../../shared/api" + +// Mock the timeout config utility +vitest.mock("../utils/timeout-config", () => ({ + getApiRequestTimeout: vitest.fn(), +})) + +import { getApiRequestTimeout } from "../utils/timeout-config" + +// Mock OpenAI +const mockOpenAIConstructor = vitest.fn() +vitest.mock("openai", () => { + return { + __esModule: true, + default: vitest.fn().mockImplementation((config) => { + mockOpenAIConstructor(config) + return { + chat: { + completions: { + create: vitest.fn(), + }, + }, + } + }), + } +}) + +describe("LmStudioHandler timeout configuration", () => { + beforeEach(() => { + vitest.clearAllMocks() + }) + + it("should use default timeout of 600 seconds when no configuration is set", () => { + ;(getApiRequestTimeout as any).mockReturnValue(600000) + + const options: ApiHandlerOptions = { + apiModelId: "llama2", + lmStudioModelId: "llama2", + lmStudioBaseUrl: "http://localhost:1234", + } + + new LmStudioHandler(options) + + expect(getApiRequestTimeout).toHaveBeenCalled() + expect(mockOpenAIConstructor).toHaveBeenCalledWith( + expect.objectContaining({ + baseURL: "http://localhost:1234/v1", + apiKey: "noop", + timeout: 600000, // 600 seconds in milliseconds + }), + ) + }) + + it("should use custom timeout when configuration is set", () => { + ;(getApiRequestTimeout as any).mockReturnValue(1200000) // 20 minutes + + const options: ApiHandlerOptions = { + apiModelId: "llama2", + lmStudioModelId: "llama2", + lmStudioBaseUrl: "http://localhost:1234", + } + + new LmStudioHandler(options) + + expect(mockOpenAIConstructor).toHaveBeenCalledWith( + expect.objectContaining({ + timeout: 1200000, // 1200 seconds in milliseconds + }), + ) + }) + + it("should handle zero timeout (no timeout)", () => { + ;(getApiRequestTimeout as any).mockReturnValue(0) + + const options: ApiHandlerOptions = { + apiModelId: "llama2", + lmStudioModelId: "llama2", + } + + new LmStudioHandler(options) + + expect(mockOpenAIConstructor).toHaveBeenCalledWith( + expect.objectContaining({ + timeout: 0, // No timeout + }), + ) + }) +}) diff --git a/src/api/providers/__tests__/ollama-timeout.spec.ts b/src/api/providers/__tests__/ollama-timeout.spec.ts new file mode 100644 index 0000000000..db78f206c0 --- /dev/null +++ b/src/api/providers/__tests__/ollama-timeout.spec.ts @@ -0,0 +1,108 @@ +// npx vitest run api/providers/__tests__/ollama-timeout.spec.ts + +import { OllamaHandler } from "../ollama" +import { ApiHandlerOptions } from "../../../shared/api" + +// Mock the timeout config utility +vitest.mock("../utils/timeout-config", () => ({ + getApiRequestTimeout: vitest.fn(), +})) + +import { getApiRequestTimeout } from "../utils/timeout-config" + +// Mock OpenAI +const mockOpenAIConstructor = vitest.fn() +vitest.mock("openai", () => { + return { + __esModule: true, + default: vitest.fn().mockImplementation((config) => { + mockOpenAIConstructor(config) + return { + chat: { + completions: { + create: vitest.fn(), + }, + }, + } + }), + } +}) + +describe("OllamaHandler timeout configuration", () => { + beforeEach(() => { + vitest.clearAllMocks() + }) + + it("should use default timeout of 600 seconds when no configuration is set", () => { + ;(getApiRequestTimeout as any).mockReturnValue(600000) + + const options: ApiHandlerOptions = { + apiModelId: "llama2", + ollamaModelId: "llama2", + ollamaBaseUrl: "http://localhost:11434", + } + + new OllamaHandler(options) + + expect(getApiRequestTimeout).toHaveBeenCalled() + expect(mockOpenAIConstructor).toHaveBeenCalledWith( + expect.objectContaining({ + baseURL: "http://localhost:11434/v1", + apiKey: "ollama", + timeout: 600000, // 600 seconds in milliseconds + }), + ) + }) + + it("should use custom timeout when configuration is set", () => { + ;(getApiRequestTimeout as any).mockReturnValue(3600000) // 1 hour + + const options: ApiHandlerOptions = { + apiModelId: "llama2", + ollamaModelId: "llama2", + } + + new OllamaHandler(options) + + expect(mockOpenAIConstructor).toHaveBeenCalledWith( + expect.objectContaining({ + timeout: 3600000, // 3600 seconds in milliseconds + }), + ) + }) + + it("should handle zero timeout (no timeout)", () => { + ;(getApiRequestTimeout as any).mockReturnValue(0) + + const options: ApiHandlerOptions = { + apiModelId: "llama2", + ollamaModelId: "llama2", + ollamaBaseUrl: "http://localhost:11434", + } + + new OllamaHandler(options) + + expect(mockOpenAIConstructor).toHaveBeenCalledWith( + expect.objectContaining({ + timeout: 0, // No timeout + }), + ) + }) + + it("should use default base URL when not provided", () => { + ;(getApiRequestTimeout as any).mockReturnValue(600000) + + const options: ApiHandlerOptions = { + apiModelId: "llama2", + ollamaModelId: "llama2", + } + + new OllamaHandler(options) + + expect(mockOpenAIConstructor).toHaveBeenCalledWith( + expect.objectContaining({ + baseURL: "http://localhost:11434/v1", + }), + ) + }) +}) diff --git a/src/api/providers/__tests__/openai-timeout.spec.ts b/src/api/providers/__tests__/openai-timeout.spec.ts new file mode 100644 index 0000000000..2a09fd94ff --- /dev/null +++ b/src/api/providers/__tests__/openai-timeout.spec.ts @@ -0,0 +1,144 @@ +// npx vitest run api/providers/__tests__/openai-timeout.spec.ts + +import { OpenAiHandler } from "../openai" +import { ApiHandlerOptions } from "../../../shared/api" + +// Mock the timeout config utility +vitest.mock("../utils/timeout-config", () => ({ + getApiRequestTimeout: vitest.fn(), +})) + +import { getApiRequestTimeout } from "../utils/timeout-config" + +// Mock OpenAI and AzureOpenAI +const mockOpenAIConstructor = vitest.fn() +const mockAzureOpenAIConstructor = vitest.fn() + +vitest.mock("openai", () => { + return { + __esModule: true, + default: vitest.fn().mockImplementation((config) => { + mockOpenAIConstructor(config) + return { + chat: { + completions: { + create: vitest.fn(), + }, + }, + } + }), + AzureOpenAI: vitest.fn().mockImplementation((config) => { + mockAzureOpenAIConstructor(config) + return { + chat: { + completions: { + create: vitest.fn(), + }, + }, + } + }), + } +}) + +describe("OpenAiHandler timeout configuration", () => { + beforeEach(() => { + vitest.clearAllMocks() + }) + + it("should use default timeout for standard OpenAI", () => { + ;(getApiRequestTimeout as any).mockReturnValue(600000) + + const options: ApiHandlerOptions = { + apiModelId: "gpt-4", + openAiModelId: "gpt-4", + openAiApiKey: "test-key", + } + + new OpenAiHandler(options) + + expect(getApiRequestTimeout).toHaveBeenCalled() + expect(mockOpenAIConstructor).toHaveBeenCalledWith( + expect.objectContaining({ + baseURL: "https://api.openai.com/v1", + apiKey: "test-key", + timeout: 600000, // 600 seconds in milliseconds + }), + ) + }) + + it("should use custom timeout for OpenAI-compatible providers", () => { + ;(getApiRequestTimeout as any).mockReturnValue(1800000) // 30 minutes + + const options: ApiHandlerOptions = { + apiModelId: "custom-model", + openAiModelId: "custom-model", + openAiBaseUrl: "http://localhost:8080/v1", + openAiApiKey: "test-key", + } + + new OpenAiHandler(options) + + expect(mockOpenAIConstructor).toHaveBeenCalledWith( + expect.objectContaining({ + baseURL: "http://localhost:8080/v1", + timeout: 1800000, // 1800 seconds in milliseconds + }), + ) + }) + + it("should use timeout for Azure OpenAI", () => { + ;(getApiRequestTimeout as any).mockReturnValue(900000) // 15 minutes + + const options: ApiHandlerOptions = { + apiModelId: "gpt-4", + openAiModelId: "gpt-4", + openAiBaseUrl: "https://myinstance.openai.azure.com", + openAiApiKey: "test-key", + openAiUseAzure: true, + } + + new OpenAiHandler(options) + + expect(mockAzureOpenAIConstructor).toHaveBeenCalledWith( + expect.objectContaining({ + timeout: 900000, // 900 seconds in milliseconds + }), + ) + }) + + it("should use timeout for Azure AI Inference", () => { + ;(getApiRequestTimeout as any).mockReturnValue(1200000) // 20 minutes + + const options: ApiHandlerOptions = { + apiModelId: "deepseek", + openAiModelId: "deepseek", + openAiBaseUrl: "https://myinstance.services.ai.azure.com", + openAiApiKey: "test-key", + } + + new OpenAiHandler(options) + + expect(mockOpenAIConstructor).toHaveBeenCalledWith( + expect.objectContaining({ + timeout: 1200000, // 1200 seconds in milliseconds + }), + ) + }) + + it("should handle zero timeout (no timeout)", () => { + ;(getApiRequestTimeout as any).mockReturnValue(0) + + const options: ApiHandlerOptions = { + apiModelId: "gpt-4", + openAiModelId: "gpt-4", + } + + new OpenAiHandler(options) + + expect(mockOpenAIConstructor).toHaveBeenCalledWith( + expect.objectContaining({ + timeout: 0, // No timeout + }), + ) + }) +}) diff --git a/src/api/providers/__tests__/openai.spec.ts b/src/api/providers/__tests__/openai.spec.ts index b4b5f29204..8ea5963236 100644 --- a/src/api/providers/__tests__/openai.spec.ts +++ b/src/api/providers/__tests__/openai.spec.ts @@ -107,6 +107,7 @@ describe("OpenAiHandler", () => { "X-Title": "Roo Code", "User-Agent": `RooCode/${Package.version}`, }, + timeout: expect.any(Number), }) }) }) diff --git a/src/api/providers/lm-studio.ts b/src/api/providers/lm-studio.ts index 6c49920bd1..f3af46d1ce 100644 --- a/src/api/providers/lm-studio.ts +++ b/src/api/providers/lm-studio.ts @@ -14,6 +14,7 @@ import { ApiStream } from "../transform/stream" import { BaseProvider } from "./base-provider" import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" import { getModels, getModelsFromCache } from "./fetchers/modelCache" +import { getApiRequestTimeout } from "./utils/timeout-config" export class LmStudioHandler extends BaseProvider implements SingleCompletionHandler { protected options: ApiHandlerOptions @@ -22,9 +23,11 @@ export class LmStudioHandler extends BaseProvider implements SingleCompletionHan constructor(options: ApiHandlerOptions) { super() this.options = options + this.client = new OpenAI({ baseURL: (this.options.lmStudioBaseUrl || "http://localhost:1234") + "/v1", apiKey: "noop", + timeout: getApiRequestTimeout(), }) } diff --git a/src/api/providers/ollama.ts b/src/api/providers/ollama.ts index a7713ba421..54666be58d 100644 --- a/src/api/providers/ollama.ts +++ b/src/api/providers/ollama.ts @@ -13,6 +13,7 @@ import { ApiStream } from "../transform/stream" import { BaseProvider } from "./base-provider" import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" +import { getApiRequestTimeout } from "./utils/timeout-config" type CompletionUsage = OpenAI.Chat.Completions.ChatCompletionChunk["usage"] @@ -23,9 +24,11 @@ export class OllamaHandler extends BaseProvider implements SingleCompletionHandl constructor(options: ApiHandlerOptions) { super() this.options = options + this.client = new OpenAI({ baseURL: (this.options.ollamaBaseUrl || "http://localhost:11434") + "/v1", apiKey: "ollama", + timeout: getApiRequestTimeout(), }) } diff --git a/src/api/providers/openai.ts b/src/api/providers/openai.ts index f5e4e4c985..794f021066 100644 --- a/src/api/providers/openai.ts +++ b/src/api/providers/openai.ts @@ -23,6 +23,7 @@ import { getModelParams } from "../transform/model-params" import { DEFAULT_HEADERS } from "./constants" import { BaseProvider } from "./base-provider" import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" +import { getApiRequestTimeout } from "./utils/timeout-config" // TODO: Rename this to OpenAICompatibleHandler. Also, I think the // `OpenAINativeHandler` can subclass from this, since it's obviously @@ -46,6 +47,8 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl ...(this.options.openAiHeaders || {}), } + const timeout = getApiRequestTimeout() + if (isAzureAiInference) { // Azure AI Inference Service (e.g., for DeepSeek) uses a different path structure this.client = new OpenAI({ @@ -53,6 +56,7 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl apiKey, defaultHeaders: headers, defaultQuery: { "api-version": this.options.azureApiVersion || "2024-05-01-preview" }, + timeout, }) } else if (isAzureOpenAi) { // Azure API shape slightly differs from the core API shape: @@ -62,12 +66,14 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl apiKey, apiVersion: this.options.azureApiVersion || azureOpenAiDefaultApiVersion, defaultHeaders: headers, + timeout, }) } else { this.client = new OpenAI({ baseURL, apiKey, defaultHeaders: headers, + timeout, }) } } diff --git a/src/api/providers/utils/__tests__/timeout-config.spec.ts b/src/api/providers/utils/__tests__/timeout-config.spec.ts new file mode 100644 index 0000000000..f74e14afad --- /dev/null +++ b/src/api/providers/utils/__tests__/timeout-config.spec.ts @@ -0,0 +1,99 @@ +// npx vitest run api/providers/utils/__tests__/timeout-config.spec.ts + +import { getApiRequestTimeout } from "../timeout-config" +import * as vscode from "vscode" + +// Mock vscode +vitest.mock("vscode", () => ({ + workspace: { + getConfiguration: vitest.fn().mockReturnValue({ + get: vitest.fn(), + }), + }, +})) + +describe("getApiRequestTimeout", () => { + let mockGetConfig: any + + beforeEach(() => { + vitest.clearAllMocks() + mockGetConfig = vitest.fn() + ;(vscode.workspace.getConfiguration as any).mockReturnValue({ + get: mockGetConfig, + }) + }) + + it("should return default timeout of 600000ms when no configuration is set", () => { + mockGetConfig.mockReturnValue(600) + + const timeout = getApiRequestTimeout() + + expect(vscode.workspace.getConfiguration).toHaveBeenCalledWith("roo-cline") + expect(mockGetConfig).toHaveBeenCalledWith("apiRequestTimeout", 600) + expect(timeout).toBe(600000) // 600 seconds in milliseconds + }) + + it("should return custom timeout in milliseconds", () => { + mockGetConfig.mockReturnValue(1200) // 20 minutes + + const timeout = getApiRequestTimeout() + + expect(timeout).toBe(1200000) // 1200 seconds in milliseconds + }) + + it("should handle zero timeout (no timeout)", () => { + mockGetConfig.mockReturnValue(0) + + const timeout = getApiRequestTimeout() + + expect(timeout).toBe(0) // No timeout + }) + + it("should handle negative values by clamping to 0", () => { + mockGetConfig.mockReturnValue(-100) + + const timeout = getApiRequestTimeout() + + expect(timeout).toBe(0) // Negative values should be clamped to 0 + }) + + it("should handle null by using default", () => { + mockGetConfig.mockReturnValue(null) + + const timeout = getApiRequestTimeout() + + expect(timeout).toBe(600000) // Should fall back to default 600 seconds + }) + + it("should handle undefined by using default", () => { + mockGetConfig.mockReturnValue(undefined) + + const timeout = getApiRequestTimeout() + + expect(timeout).toBe(600000) // Should fall back to default 600 seconds + }) + + it("should handle NaN by using default", () => { + mockGetConfig.mockReturnValue(NaN) + + const timeout = getApiRequestTimeout() + + expect(timeout).toBe(600000) // Should fall back to default 600 seconds + }) + + it("should handle string values by using default", () => { + mockGetConfig.mockReturnValue("not-a-number") // String instead of number + + const timeout = getApiRequestTimeout() + + expect(timeout).toBe(600000) // Should fall back to default since it's not a number + }) + + it("should handle boolean values by using default", () => { + mockGetConfig.mockReturnValue(true) // Boolean instead of number + + const timeout = getApiRequestTimeout() + + expect(timeout).toBe(600000) // Should fall back to default since it's not a number + }) +}) diff --git a/src/api/providers/utils/timeout-config.ts b/src/api/providers/utils/timeout-config.ts new file mode 100644 index 0000000000..94ddf4afc1 --- /dev/null +++ b/src/api/providers/utils/timeout-config.ts @@ -0,0 +1,21 @@ +import * as vscode from "vscode" + +/** + * Gets the API request timeout from VSCode configuration with validation. + * + * @returns The timeout in milliseconds. Returns 0 for no timeout. + */ +export function getApiRequestTimeout(): number { + // Get timeout with validation to ensure it's a valid non-negative number + const configTimeout = vscode.workspace.getConfiguration("roo-cline").get("apiRequestTimeout", 600) + + // Validate that it's actually a number and not NaN + if (typeof configTimeout !== "number" || isNaN(configTimeout)) { + return 600 * 1000 // Default to 600 seconds + } + + // Allow 0 (no timeout) but clamp negative values to 0 + const timeoutSeconds = configTimeout < 0 ? 0 : configTimeout + + return timeoutSeconds * 1000 // Convert to milliseconds +} diff --git a/src/package.json b/src/package.json index d29a00e80b..5a29ee5d6a 100644 --- a/src/package.json +++ b/src/package.json @@ -391,6 +391,13 @@ "type": "boolean", "default": true, "description": "%settings.useAgentRules.description%" + }, + "roo-cline.apiRequestTimeout": { + "type": "number", + "default": 600, + "minimum": 0, + "maximum": 3600, + "description": "%settings.apiRequestTimeout.description%" } } } diff --git a/src/package.nls.ca.json b/src/package.nls.ca.json index 4340b80c2b..90cba19454 100644 --- a/src/package.nls.ca.json +++ b/src/package.nls.ca.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "Ruta d'emmagatzematge personalitzada. Deixeu-la buida per utilitzar la ubicació predeterminada. Admet rutes absolutes (p. ex. 'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "Habilitar correccions ràpides de Roo Code.", "settings.autoImportSettingsPath.description": "Ruta a un fitxer de configuració de RooCode per importar automàticament en iniciar l'extensió. Admet rutes absolutes i rutes relatives al directori d'inici (per exemple, '~/Documents/roo-code-settings.json'). Deixeu-ho en blanc per desactivar la importació automàtica.", - "settings.useAgentRules.description": "Activa la càrrega de fitxers AGENTS.md per a regles específiques de l'agent (vegeu https://agent-rules.org/)" + "settings.useAgentRules.description": "Activa la càrrega de fitxers AGENTS.md per a regles específiques de l'agent (vegeu https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "Temps màxim en segons per esperar les respostes de l'API (0 = sense temps d'espera, 1-3600s, per defecte: 600s). Es recomanen valors més alts per a proveïdors locals com LM Studio i Ollama que poden necessitar més temps de processament." } diff --git a/src/package.nls.de.json b/src/package.nls.de.json index c0d84fb0bd..09d9ac760f 100644 --- a/src/package.nls.de.json +++ b/src/package.nls.de.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "Benutzerdefinierter Speicherpfad. Leer lassen, um den Standardspeicherort zu verwenden. Unterstützt absolute Pfade (z.B. 'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "Roo Code Schnelle Problembehebung aktivieren.", "settings.autoImportSettingsPath.description": "Pfad zu einer RooCode-Konfigurationsdatei, die beim Start der Erweiterung automatisch importiert wird. Unterstützt absolute Pfade und Pfade relativ zum Home-Verzeichnis (z.B. '~/Documents/roo-code-settings.json'). Leer lassen, um den automatischen Import zu deaktivieren.", - "settings.useAgentRules.description": "Aktiviert das Laden von AGENTS.md-Dateien für agentenspezifische Regeln (siehe https://agent-rules.org/)" + "settings.useAgentRules.description": "Aktiviert das Laden von AGENTS.md-Dateien für agentenspezifische Regeln (siehe https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "Maximale Wartezeit in Sekunden auf API-Antworten (0 = kein Timeout, 1-3600s, Standard: 600s). Höhere Werte werden für lokale Anbieter wie LM Studio und Ollama empfohlen, die möglicherweise mehr Verarbeitungszeit benötigen." } diff --git a/src/package.nls.es.json b/src/package.nls.es.json index 37c1eda344..28d1250bdd 100644 --- a/src/package.nls.es.json +++ b/src/package.nls.es.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "Ruta de almacenamiento personalizada. Dejar vacío para usar la ubicación predeterminada. Admite rutas absolutas (ej. 'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "Habilitar correcciones rápidas de Roo Code.", "settings.autoImportSettingsPath.description": "Ruta a un archivo de configuración de RooCode para importar automáticamente al iniciar la extensión. Admite rutas absolutas y rutas relativas al directorio de inicio (por ejemplo, '~/Documents/roo-code-settings.json'). Dejar vacío para desactivar la importación automática.", - "settings.useAgentRules.description": "Habilita la carga de archivos AGENTS.md para reglas específicas del agente (ver https://agent-rules.org/)" + "settings.useAgentRules.description": "Habilita la carga de archivos AGENTS.md para reglas específicas del agente (ver https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "Tiempo máximo en segundos de espera para las respuestas de la API (0 = sin tiempo de espera, 1-3600s, por defecto: 600s). Se recomiendan valores más altos para proveedores locales como LM Studio y Ollama que puedan necesitar más tiempo de procesamiento." } diff --git a/src/package.nls.fr.json b/src/package.nls.fr.json index e040bd201b..7d528bf0a6 100644 --- a/src/package.nls.fr.json +++ b/src/package.nls.fr.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "Chemin de stockage personnalisé. Laisser vide pour utiliser l'emplacement par défaut. Prend en charge les chemins absolus (ex: 'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "Activer les correctifs rapides de Roo Code.", "settings.autoImportSettingsPath.description": "Chemin d'accès à un fichier de configuration RooCode à importer automatiquement au démarrage de l'extension. Prend en charge les chemins absolus et les chemins relatifs au répertoire de base (par exemple, '~/Documents/roo-code-settings.json'). Laisser vide pour désactiver l'importation automatique.", - "settings.useAgentRules.description": "Activer le chargement des fichiers AGENTS.md pour les règles spécifiques à l'agent (voir https://agent-rules.org/)" + "settings.useAgentRules.description": "Activer le chargement des fichiers AGENTS.md pour les règles spécifiques à l'agent (voir https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "Temps maximum en secondes d'attente pour les réponses de l'API (0 = pas de timeout, 1-3600s, par défaut : 600s). Des valeurs plus élevées sont recommandées pour les fournisseurs locaux comme LM Studio et Ollama qui peuvent nécessiter plus de temps de traitement." } diff --git a/src/package.nls.hi.json b/src/package.nls.hi.json index a67d8f30ed..a3dc74ae2b 100644 --- a/src/package.nls.hi.json +++ b/src/package.nls.hi.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "कस्टम स्टोरेज पाथ। डिफ़ॉल्ट स्थान का उपयोग करने के लिए खाली छोड़ें। पूर्ण पथ का समर्थन करता है (उदा. 'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "Roo Code त्वरित सुधार सक्षम करें", "settings.autoImportSettingsPath.description": "RooCode कॉन्फ़िगरेशन फ़ाइल का पथ जिसे एक्सटेंशन स्टार्टअप पर स्वचालित रूप से आयात किया जाएगा। होम डायरेक्टरी के सापेक्ष पूर्ण पथ और पथों का समर्थन करता है (उदाहरण के लिए '~/Documents/roo-code-settings.json')। ऑटो-इंपोर्ट को अक्षम करने के लिए खाली छोड़ दें।", - "settings.useAgentRules.description": "एजेंट-विशिष्ट नियमों के लिए AGENTS.md फ़ाइलों को लोड करना सक्षम करें (देखें https://agent-rules.org/)" + "settings.useAgentRules.description": "एजेंट-विशिष्ट नियमों के लिए AGENTS.md फ़ाइलों को लोड करना सक्षम करें (देखें https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "एपीआई प्रतिक्रियाओं की प्रतीक्षा करने के लिए सेकंड में अधिकतम समय (0 = कोई टाइमआउट नहीं, 1-3600s, डिफ़ॉल्ट: 600s)। एलएम स्टूडियो और ओलामा जैसे स्थानीय प्रदाताओं के लिए उच्च मानों की सिफारिश की जाती है जिन्हें अधिक प्रसंस्करण समय की आवश्यकता हो सकती है।" } diff --git a/src/package.nls.id.json b/src/package.nls.id.json index 988c41bf36..2560899f61 100644 --- a/src/package.nls.id.json +++ b/src/package.nls.id.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "Path penyimpanan kustom. Biarkan kosong untuk menggunakan lokasi default. Mendukung path absolut (misalnya 'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "Aktifkan perbaikan cepat Roo Code.", "settings.autoImportSettingsPath.description": "Path ke file konfigurasi RooCode untuk diimpor secara otomatis saat ekstensi dimulai. Mendukung path absolut dan path relatif terhadap direktori home (misalnya '~/Documents/roo-code-settings.json'). Biarkan kosong untuk menonaktifkan impor otomatis.", - "settings.useAgentRules.description": "Aktifkan pemuatan file AGENTS.md untuk aturan khusus agen (lihat https://agent-rules.org/)" + "settings.useAgentRules.description": "Aktifkan pemuatan file AGENTS.md untuk aturan khusus agen (lihat https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "Waktu maksimum dalam detik untuk menunggu respons API (0 = tidak ada batas waktu, 1-3600s, default: 600s). Nilai yang lebih tinggi disarankan untuk penyedia lokal seperti LM Studio dan Ollama yang mungkin memerlukan lebih banyak waktu pemrosesan." } diff --git a/src/package.nls.it.json b/src/package.nls.it.json index 726e28593b..4c6f6a1602 100644 --- a/src/package.nls.it.json +++ b/src/package.nls.it.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "Percorso di archiviazione personalizzato. Lasciare vuoto per utilizzare la posizione predefinita. Supporta percorsi assoluti (es. 'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "Abilita correzioni rapide di Roo Code.", "settings.autoImportSettingsPath.description": "Percorso di un file di configurazione di RooCode da importare automaticamente all'avvio dell'estensione. Supporta percorsi assoluti e percorsi relativi alla directory home (ad es. '~/Documents/roo-code-settings.json'). Lasciare vuoto per disabilitare l'importazione automatica.", - "settings.useAgentRules.description": "Abilita il caricamento dei file AGENTS.md per regole specifiche dell'agente (vedi https://agent-rules.org/)" + "settings.useAgentRules.description": "Abilita il caricamento dei file AGENTS.md per regole specifiche dell'agente (vedi https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "Tempo massimo in secondi di attesa per le risposte API (0 = nessun timeout, 1-3600s, predefinito: 600s). Valori più alti sono consigliati per provider locali come LM Studio e Ollama che potrebbero richiedere più tempo di elaborazione." } diff --git a/src/package.nls.ja.json b/src/package.nls.ja.json index fa1e6c202d..1db66a75ab 100644 --- a/src/package.nls.ja.json +++ b/src/package.nls.ja.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "カスタムストレージパス。デフォルトの場所を使用する場合は空のままにします。絶対パスをサポートします(例:'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "Roo Codeのクイック修正を有効にする。", "settings.autoImportSettingsPath.description": "拡張機能の起動時に自動的にインポートするRooCode設定ファイルへのパス。絶対パスとホームディレクトリからの相対パスをサポートします(例:'~/Documents/roo-code-settings.json')。自動インポートを無効にするには、空のままにします。", - "settings.useAgentRules.description": "エージェント固有のルールのためにAGENTS.mdファイルの読み込みを有効にします(参照:https://agent-rules.org/)" + "settings.useAgentRules.description": "エージェント固有のルールのためにAGENTS.mdファイルの読み込みを有効にします(参照:https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "API応答を待機する最大時間(秒)(0 = タイムアウトなし、1-3600秒、デフォルト: 600秒)。LM StudioやOllamaのような、より多くの処理時間を必要とする可能性のあるローカルプロバイダーには、より高い値が推奨されます。" } diff --git a/src/package.nls.json b/src/package.nls.json index 36ef72a823..0cd834b132 100644 --- a/src/package.nls.json +++ b/src/package.nls.json @@ -37,5 +37,6 @@ "settings.customStoragePath.description": "Custom storage path. Leave empty to use the default location. Supports absolute paths (e.g. 'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "Enable Roo Code quick fixes", "settings.autoImportSettingsPath.description": "Path to a RooCode configuration file to automatically import on extension startup. Supports absolute paths and paths relative to the home directory (e.g. '~/Documents/roo-code-settings.json'). Leave empty to disable auto-import.", - "settings.useAgentRules.description": "Enable loading of AGENTS.md files for agent-specific rules (see https://agent-rules.org/)" + "settings.useAgentRules.description": "Enable loading of AGENTS.md files for agent-specific rules (see https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "Maximum time in seconds to wait for API responses (0 = no timeout, 1-3600s, default: 600s). Higher values are recommended for local providers like LM Studio and Ollama that may need more processing time." } diff --git a/src/package.nls.ko.json b/src/package.nls.ko.json index c55566f043..db14b2387f 100644 --- a/src/package.nls.ko.json +++ b/src/package.nls.ko.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "사용자 지정 저장소 경로. 기본 위치를 사용하려면 비워두세요. 절대 경로를 지원합니다 (예: 'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "Roo Code 빠른 수정 사용 설정", "settings.autoImportSettingsPath.description": "확장 프로그램 시작 시 자동으로 가져올 RooCode 구성 파일의 경로입니다. 절대 경로 및 홈 디렉토리에 대한 상대 경로를 지원합니다(예: '~/Documents/roo-code-settings.json'). 자동 가져오기를 비활성화하려면 비워 둡니다.", - "settings.useAgentRules.description": "에이전트별 규칙에 대한 AGENTS.md 파일 로드를 활성화합니다 (참조: https://agent-rules.org/)" + "settings.useAgentRules.description": "에이전트별 규칙에 대한 AGENTS.md 파일 로드를 활성화합니다 (참조: https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "API 응답을 기다리는 최대 시간(초) (0 = 시간 초과 없음, 1-3600초, 기본값: 600초). 더 많은 처리 시간이 필요할 수 있는 LM Studio 및 Ollama와 같은 로컬 공급자에게는 더 높은 값을 사용하는 것이 좋습니다." } diff --git a/src/package.nls.nl.json b/src/package.nls.nl.json index edcc5f7d12..7bc02b1db2 100644 --- a/src/package.nls.nl.json +++ b/src/package.nls.nl.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "Aangepast opslagpad. Laat leeg om de standaardlocatie te gebruiken. Ondersteunt absolute paden (bijv. 'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "Snelle correcties van Roo Code inschakelen.", "settings.autoImportSettingsPath.description": "Pad naar een RooCode-configuratiebestand om automatisch te importeren bij het opstarten van de extensie. Ondersteunt absolute paden en paden ten opzichte van de thuismap (bijv. '~/Documents/roo-code-settings.json'). Laat leeg om automatisch importeren uit te schakelen.", - "settings.useAgentRules.description": "Laden van AGENTS.md-bestanden voor agentspecifieke regels inschakelen (zie https://agent-rules.org/)" + "settings.useAgentRules.description": "Laden van AGENTS.md-bestanden voor agentspecifieke regels inschakelen (zie https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "Maximale tijd in seconden om te wachten op API-reacties (0 = geen time-out, 1-3600s, standaard: 600s). Hogere waarden worden aanbevolen voor lokale providers zoals LM Studio en Ollama die mogelijk meer verwerkingstijd nodig hebben." } diff --git a/src/package.nls.pl.json b/src/package.nls.pl.json index c7547ac4c9..09cd69b043 100644 --- a/src/package.nls.pl.json +++ b/src/package.nls.pl.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "Niestandardowa ścieżka przechowywania. Pozostaw puste, aby użyć domyślnej lokalizacji. Obsługuje ścieżki bezwzględne (np. 'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "Włącz szybkie poprawki Roo Code.", "settings.autoImportSettingsPath.description": "Ścieżka do pliku konfiguracyjnego RooCode, który ma być automatycznie importowany podczas uruchamiania rozszerzenia. Obsługuje ścieżki bezwzględne i ścieżki względne do katalogu domowego (np. '~/Documents/roo-code-settings.json'). Pozostaw puste, aby wyłączyć automatyczne importowanie.", - "settings.useAgentRules.description": "Włącz wczytywanie plików AGENTS.md dla reguł specyficznych dla agenta (zobacz https://agent-rules.org/)" + "settings.useAgentRules.description": "Włącz wczytywanie plików AGENTS.md dla reguł specyficznych dla agenta (zobacz https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "Maksymalny czas w sekundach oczekiwania na odpowiedzi API (0 = brak limitu czasu, 1-3600s, domyślnie: 600s). Wyższe wartości są zalecane dla lokalnych dostawców, takich jak LM Studio i Ollama, którzy mogą potrzebować więcej czasu na przetwarzanie." } diff --git a/src/package.nls.pt-BR.json b/src/package.nls.pt-BR.json index 0b7f6c0d47..1d24259b0c 100644 --- a/src/package.nls.pt-BR.json +++ b/src/package.nls.pt-BR.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "Caminho de armazenamento personalizado. Deixe vazio para usar o local padrão. Suporta caminhos absolutos (ex: 'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "Habilitar correções rápidas do Roo Code.", "settings.autoImportSettingsPath.description": "Caminho para um arquivo de configuração do RooCode para importar automaticamente na inicialização da extensão. Suporta caminhos absolutos e caminhos relativos ao diretório inicial (por exemplo, '~/Documents/roo-code-settings.json'). Deixe em branco para desativar a importação automática.", - "settings.useAgentRules.description": "Habilita o carregamento de arquivos AGENTS.md para regras específicas do agente (consulte https://agent-rules.org/)" + "settings.useAgentRules.description": "Habilita o carregamento de arquivos AGENTS.md para regras específicas do agente (consulte https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "Tempo máximo em segundos de espera pelas respostas da API (0 = sem tempo limite, 1-3600s, padrão: 600s). Valores mais altos são recomendados para provedores locais como LM Studio e Ollama que podem precisar de mais tempo de processamento." } diff --git a/src/package.nls.ru.json b/src/package.nls.ru.json index 380337249d..ffa94cfb30 100644 --- a/src/package.nls.ru.json +++ b/src/package.nls.ru.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "Пользовательский путь хранения. Оставьте пустым для использования пути по умолчанию. Поддерживает абсолютные пути (например, 'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "Включить быстрые исправления Roo Code.", "settings.autoImportSettingsPath.description": "Путь к файлу конфигурации RooCode для автоматического импорта при запуске расширения. Поддерживает абсолютные пути и пути относительно домашнего каталога (например, '~/Documents/roo-code-settings.json'). Оставьте пустым, чтобы отключить автоматический импорт.", - "settings.useAgentRules.description": "Включить загрузку файлов AGENTS.md для специфичных для агента правил (см. https://agent-rules.org/)" + "settings.useAgentRules.description": "Включить загрузку файлов AGENTS.md для специфичных для агента правил (см. https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "Максимальное время в секундах для ожидания ответов API (0 = нет тайм-аута, 1-3600 с, по умолчанию: 600 с). Рекомендуются более высокие значения для локальных провайдеров, таких как LM Studio и Ollama, которым может потребоваться больше времени на обработку." } diff --git a/src/package.nls.tr.json b/src/package.nls.tr.json index d5ba65da73..d01702de48 100644 --- a/src/package.nls.tr.json +++ b/src/package.nls.tr.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "Özel depolama yolu. Varsayılan konumu kullanmak için boş bırakın. Mutlak yolları destekler (örn: 'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "Roo Code hızlı düzeltmeleri etkinleştir.", "settings.autoImportSettingsPath.description": "Uzantı başlangıcında otomatik olarak içe aktarılacak bir RooCode yapılandırma dosyasının yolu. Mutlak yolları ve ana dizine göreli yolları destekler (ör. '~/Documents/roo-code-settings.json'). Otomatik içe aktarmayı devre dışı bırakmak için boş bırakın.", - "settings.useAgentRules.description": "Aracıya özgü kurallar için AGENTS.md dosyalarının yüklenmesini etkinleştirin (bkz. https://agent-rules.org/)" + "settings.useAgentRules.description": "Aracıya özgü kurallar için AGENTS.md dosyalarının yüklenmesini etkinleştirin (bkz. https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "API yanıtları için beklenecek maksimum süre (saniye cinsinden) (0 = zaman aşımı yok, 1-3600s, varsayılan: 600s). LM Studio ve Ollama gibi daha fazla işlem süresi gerektirebilecek yerel sağlayıcılar için daha yüksek değerler önerilir." } diff --git a/src/package.nls.vi.json b/src/package.nls.vi.json index 503d1139b8..667f82101a 100644 --- a/src/package.nls.vi.json +++ b/src/package.nls.vi.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "Đường dẫn lưu trữ tùy chỉnh. Để trống để sử dụng vị trí mặc định. Hỗ trợ đường dẫn tuyệt đối (ví dụ: 'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "Bật sửa lỗi nhanh Roo Code.", "settings.autoImportSettingsPath.description": "Đường dẫn đến tệp cấu hình RooCode để tự động nhập khi khởi động tiện ích mở rộng. Hỗ trợ đường dẫn tuyệt đối và đường dẫn tương đối đến thư mục chính (ví dụ: '~/Documents/roo-code-settings.json'). Để trống để tắt tính năng tự động nhập.", - "settings.useAgentRules.description": "Bật tải tệp AGENTS.md cho các quy tắc dành riêng cho tác nhân (xem https://agent-rules.org/)" + "settings.useAgentRules.description": "Bật tải tệp AGENTS.md cho các quy tắc dành riêng cho tác nhân (xem https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "Thời gian tối đa tính bằng giây để đợi phản hồi API (0 = không có thời gian chờ, 1-3600 giây, mặc định: 600 giây). Nên sử dụng các giá trị cao hơn cho các nhà cung cấp cục bộ như LM Studio và Ollama có thể cần thêm thời gian xử lý." } diff --git a/src/package.nls.zh-CN.json b/src/package.nls.zh-CN.json index b93e022334..c44bdee5c9 100644 --- a/src/package.nls.zh-CN.json +++ b/src/package.nls.zh-CN.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "自定义存储路径。留空以使用默认位置。支持绝对路径(例如:'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "启用 Roo Code 快速修复", "settings.autoImportSettingsPath.description": "RooCode 配置文件的路径,用于在扩展启动时自动导入。支持绝对路径和相对于主目录的路径(例如 '~/Documents/roo-code-settings.json')。留空以禁用自动导入。", - "settings.useAgentRules.description": "为特定于代理的规则启用 AGENTS.md 文件的加载(请参阅 https://agent-rules.org/)" + "settings.useAgentRules.description": "为特定于代理的规则启用 AGENTS.md 文件的加载(请参阅 https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "等待 API 响应的最长时间(秒)(0 = 无超时,1-3600秒,默认值:600秒)。对于像 LM Studio 和 Ollama 这样可能需要更多处理时间的本地提供商,建议使用更高的值。" } diff --git a/src/package.nls.zh-TW.json b/src/package.nls.zh-TW.json index 42aef592bd..a84e44d598 100644 --- a/src/package.nls.zh-TW.json +++ b/src/package.nls.zh-TW.json @@ -36,5 +36,6 @@ "settings.customStoragePath.description": "自訂儲存路徑。留空以使用預設位置。支援絕對路徑(例如:'D:\\RooCodeStorage')", "settings.enableCodeActions.description": "啟用 Roo Code 快速修復。", "settings.autoImportSettingsPath.description": "RooCode 設定檔案的路徑,用於在擴充功能啟動時自動匯入。支援絕對路徑和相對於主目錄的路徑(例如 '~/Documents/roo-code-settings.json')。留空以停用自動匯入。", - "settings.useAgentRules.description": "為特定於代理的規則啟用 AGENTS.md 檔案的載入(請參閱 https://agent-rules.org/)" + "settings.useAgentRules.description": "為特定於代理的規則啟用 AGENTS.md 檔案的載入(請參閱 https://agent-rules.org/)", + "settings.apiRequestTimeout.description": "等待 API 回應的最長時間(秒)(0 = 無超時,1-3600秒,預設值:600秒)。對於像 LM Studio 和 Ollama 這樣可能需要更多處理時間的本地提供商,建議使用更高的值。" }