diff --git a/scripts/e2e/parallels/linux-smoke.ts b/scripts/e2e/parallels/linux-smoke.ts index 9dad0f402b1..0f49e6e8aad 100755 --- a/scripts/e2e/parallels/linux-smoke.ts +++ b/scripts/e2e/parallels/linux-smoke.ts @@ -13,11 +13,11 @@ import { parseMode, parseProvider, providerIdFromModelId, + providerTimeoutConfigJson, repoRoot, resolveHostIp, resolveHostPort, resolveLatestVersion, - resolveParallelsModelTimeoutSeconds, resolveProviderAuth, resolveSnapshot, run, @@ -690,14 +690,17 @@ rm -rf /root/.openclaw/test-bad-plugin`); private verifyLocalTurn(): void { this.guestExec(["openclaw", "models", "set", this.auth.modelId]); const providerId = providerIdFromModelId(this.auth.modelId) || this.options.provider; - this.guestExec([ - "openclaw", - "config", - "set", - `models.providers.${providerId}.timeoutSeconds`, - String(resolveParallelsModelTimeoutSeconds("linux")), - "--strict-json", - ]); + const providerTimeoutConfig = providerTimeoutConfigJson(this.auth.modelId, "linux"); + if (providerTimeoutConfig) { + this.guestExec([ + "openclaw", + "config", + "set", + `models.providers.${providerId}`, + providerTimeoutConfig, + "--strict-json", + ]); + } this.guestExec([ "openclaw", "config", diff --git a/scripts/e2e/parallels/macos-smoke.ts b/scripts/e2e/parallels/macos-smoke.ts index cadc880dcf4..c8fde3e4605 100755 --- a/scripts/e2e/parallels/macos-smoke.ts +++ b/scripts/e2e/parallels/macos-smoke.ts @@ -12,10 +12,10 @@ import { parseMode, parseProvider, providerIdFromModelId, + providerTimeoutConfigJson, resolveHostIp, resolveHostPort, resolveLatestVersion, - resolveParallelsModelTimeoutSeconds, resolveProviderAuth, resolveSnapshot, run, @@ -974,15 +974,18 @@ exit 1`); private verifyTurn(): void { this.guestExec([guestNode, guestOpenClawEntry, "models", "set", this.auth.modelId]); const providerId = providerIdFromModelId(this.auth.modelId) || this.options.provider; - this.guestExec([ - guestNode, - guestOpenClawEntry, - "config", - "set", - `models.providers.${providerId}.timeoutSeconds`, - String(resolveParallelsModelTimeoutSeconds("macos")), - "--strict-json", - ]); + const providerTimeoutConfig = providerTimeoutConfigJson(this.auth.modelId, "macos"); + if (providerTimeoutConfig) { + this.guestExec([ + guestNode, + guestOpenClawEntry, + "config", + "set", + `models.providers.${providerId}`, + providerTimeoutConfig, + "--strict-json", + ]); + } this.guestExec([ guestNode, guestOpenClawEntry, diff --git a/scripts/e2e/parallels/npm-update-scripts.ts b/scripts/e2e/parallels/npm-update-scripts.ts index 666630056d3..6689cd2d2c4 100644 --- a/scripts/e2e/parallels/npm-update-scripts.ts +++ b/scripts/e2e/parallels/npm-update-scripts.ts @@ -5,7 +5,7 @@ import { windowsModelProviderTimeoutScript, windowsOpenClawResolver, } from "./powershell.ts"; -import { providerIdFromModelId, resolveParallelsModelTimeoutSeconds } from "./provider-auth.ts"; +import { providerIdFromModelId, providerTimeoutConfigJson } from "./provider-auth.ts"; import type { Platform, ProviderAuth } from "./types.ts"; export interface NpmUpdateScriptInput { @@ -20,12 +20,13 @@ function posixModelProviderTimeoutCommand( platform: Platform, ): string { const providerId = providerIdFromModelId(modelId); - if (!providerId) { + const configJson = providerTimeoutConfigJson(modelId, platform); + if (!providerId || !configJson) { return ""; } - return `${command} config set ${shellQuote( - `models.providers.${providerId}.timeoutSeconds`, - )} ${resolveParallelsModelTimeoutSeconds(platform)} --strict-json`; + return `${command} config set ${shellQuote(`models.providers.${providerId}`)} ${shellQuote( + configJson, + )} --strict-json`; } function posixAssertAgentOkScript(command: string, input: NpmUpdateScriptInput, sessionId: string) { diff --git a/scripts/e2e/parallels/powershell.ts b/scripts/e2e/parallels/powershell.ts index 0c1f8dfb960..deb8fdd67de 100644 --- a/scripts/e2e/parallels/powershell.ts +++ b/scripts/e2e/parallels/powershell.ts @@ -1,4 +1,4 @@ -import { providerIdFromModelId, resolveParallelsModelTimeoutSeconds } from "./provider-auth.ts"; +import { providerIdFromModelId, providerTimeoutConfigJson } from "./provider-auth.ts"; export function psSingleQuote(value: string): string { return `'${value.replaceAll("'", "''")}'`; @@ -16,12 +16,11 @@ export function encodePowerShell(script: string): string { export function windowsModelProviderTimeoutScript(modelId: string): string { const providerId = providerIdFromModelId(modelId); - if (!providerId) { + const configJson = providerTimeoutConfigJson(modelId, "windows"); + if (!providerId || !configJson) { return ""; } - return `Invoke-OpenClaw config set ${psSingleQuote( - `models.providers.${providerId}.timeoutSeconds`, - )} ${resolveParallelsModelTimeoutSeconds("windows")} --strict-json + return `Invoke-OpenClaw config set ${psSingleQuote(`models.providers.${providerId}`)} ${psSingleQuote(configJson)} --strict-json if ($LASTEXITCODE -ne 0) { throw "model provider timeout config set failed" }`; } diff --git a/scripts/e2e/parallels/provider-auth.ts b/scripts/e2e/parallels/provider-auth.ts index 0166e87fb9f..de8509aa184 100644 --- a/scripts/e2e/parallels/provider-auth.ts +++ b/scripts/e2e/parallels/provider-auth.ts @@ -86,6 +86,30 @@ export function resolveParallelsModelTimeoutSeconds(platform?: Platform): number return Number.isFinite(raw) && raw > 0 ? Math.floor(raw) : 600; } +export function providerTimeoutConfigJson(modelId: string, platform: Platform): string { + const providerId = providerIdFromModelId(modelId); + if (providerId !== "openai") { + return ""; + } + const modelName = modelId.slice("openai/".length).trim(); + if (!modelName) { + return ""; + } + return JSON.stringify({ + api: "openai-responses", + baseUrl: "https://api.openai.com/v1", + models: [ + { + contextWindow: 1_047_576, + id: modelName, + maxTokens: 32_768, + name: modelName, + }, + ], + timeoutSeconds: resolveParallelsModelTimeoutSeconds(platform), + }); +} + export function parseProvider(value: string): Provider { if (value === "openai" || value === "anthropic" || value === "minimax") { return value; diff --git a/test/scripts/parallels-smoke-model.test.ts b/test/scripts/parallels-smoke-model.test.ts index d8039347327..9ed25024c84 100644 --- a/test/scripts/parallels-smoke-model.test.ts +++ b/test/scripts/parallels-smoke-model.test.ts @@ -321,8 +321,8 @@ console.log(JSON.stringify(result)); expect(script, scriptPath).toContain("minimal"); expect(script, scriptPath).toContain("finalAssistant(Raw|Visible)Text"); } - expect(readFileSync(TS_PATHS.macos, "utf8")).toContain("resolveParallelsModelTimeoutSeconds"); - expect(readFileSync(TS_PATHS.linux, "utf8")).toContain("resolveParallelsModelTimeoutSeconds"); + expect(readFileSync(TS_PATHS.macos, "utf8")).toContain("providerTimeoutConfigJson"); + expect(readFileSync(TS_PATHS.linux, "utf8")).toContain("providerTimeoutConfigJson"); expect(readFileSync(TS_PATHS.windows, "utf8")).toContain("windowsModelProviderTimeoutScript"); const npmUpdateScripts = readFileSync(TS_PATHS.npmUpdateScripts, "utf8"); @@ -479,8 +479,8 @@ console.log(JSON.stringify(result)); const windows = readFileSync(TS_PATHS.windows, "utf8"); expect(powershell).toContain("windowsOpenClawResolver"); - expect(powershell).toContain('resolveParallelsModelTimeoutSeconds("windows")'); - expect(powershell).toContain("models.providers.${providerId}.timeoutSeconds"); + expect(powershell).toContain("providerTimeoutConfigJson"); + expect(powershell).toContain("models.providers.${providerId}"); expect(powershell).toContain("Resolve-OpenClawCommand"); expect(powershell).toContain("npm\\node_modules\\openclaw\\openclaw.mjs"); expect(powershell).toContain("$ErrorActionPreference = 'Continue'");