diff --git a/scripts/e2e/parallels-linux-smoke.sh b/scripts/e2e/parallels-linux-smoke.sh index 5f07765a59b..a51491814fa 100644 --- a/scripts/e2e/parallels-linux-smoke.sh +++ b/scripts/e2e/parallels-linux-smoke.sh @@ -5,7 +5,11 @@ VM_NAME="Ubuntu 24.04.3 ARM64" VM_NAME_EXPLICIT=0 SNAPSHOT_HINT="fresh" MODE="both" -OPENAI_API_KEY_ENV="OPENAI_API_KEY" +PROVIDER="openai" +API_KEY_ENV="" +AUTH_CHOICE="" +AUTH_KEY_FLAG="" +MODEL_ID="" INSTALL_URL="https://openclaw.ai/install.sh" HOST_PORT="18427" HOST_PORT_EXPLICIT=0 @@ -82,7 +86,11 @@ Options: Falls back to the closest Ubuntu VM when omitted and unavailable. --snapshot-hint Snapshot name substring/fuzzy match. Default: "fresh" --mode - --openai-api-key-env Host env var name for OpenAI API key. Default: OPENAI_API_KEY + --provider + Provider auth/model lane. Default: openai + --api-key-env Host env var name for provider API key. + Default: OPENAI_API_KEY for openai, ANTHROPIC_API_KEY for anthropic + --openai-api-key-env Alias for --api-key-env (backward compatible) --install-url Installer URL for latest release. Default: https://openclaw.ai/install.sh --host-port Host HTTP port for current-main tgz. Default: 18427 --host-ip Override Parallels host IP. @@ -115,8 +123,12 @@ while [[ $# -gt 0 ]]; do MODE="$2" shift 2 ;; - --openai-api-key-env) - OPENAI_API_KEY_ENV="$2" + --provider) + PROVIDER="$2" + shift 2 + ;; + --api-key-env|--openai-api-key-env) + API_KEY_ENV="$2" shift 2 ;; --install-url) @@ -169,8 +181,26 @@ case "$MODE" in ;; esac -OPENAI_API_KEY_VALUE="${!OPENAI_API_KEY_ENV:-}" -[[ -n "$OPENAI_API_KEY_VALUE" ]] || die "$OPENAI_API_KEY_ENV is required" +case "$PROVIDER" in + openai) + AUTH_CHOICE="openai-api-key" + AUTH_KEY_FLAG="openai-api-key" + MODEL_ID="openai/gpt-5.4" + [[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="OPENAI_API_KEY" + ;; + anthropic) + AUTH_CHOICE="apiKey" + AUTH_KEY_FLAG="anthropic-api-key" + MODEL_ID="anthropic/claude-sonnet-4-6" + [[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="ANTHROPIC_API_KEY" + ;; + *) + die "invalid --provider: $PROVIDER" + ;; +esac + +API_KEY_VALUE="${!API_KEY_ENV:-}" +[[ -n "$API_KEY_VALUE" ]] || die "$API_KEY_ENV is required" resolve_vm_name() { local json requested explicit @@ -526,10 +556,10 @@ verify_version_contains() { } run_ref_onboard() { - guest_exec /usr/bin/env "OPENAI_API_KEY=$OPENAI_API_KEY_VALUE" openclaw onboard \ + guest_exec /usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" openclaw onboard \ --non-interactive \ --mode local \ - --auth-choice openai-api-key \ + --auth-choice "$AUTH_CHOICE" \ --secret-input-mode ref \ --gateway-port 18789 \ --gateway-bind loopback \ @@ -540,7 +570,8 @@ run_ref_onboard() { } verify_local_turn() { - guest_exec /usr/bin/env "OPENAI_API_KEY=$OPENAI_API_KEY_VALUE" openclaw agent \ + guest_exec openclaw models set "$MODEL_ID" + guest_exec /usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" openclaw agent \ --local \ --agent main \ --message ping \ @@ -630,6 +661,7 @@ summary = { "snapshotHint": os.environ["SUMMARY_SNAPSHOT_HINT"], "snapshotId": os.environ["SUMMARY_SNAPSHOT_ID"], "mode": os.environ["SUMMARY_MODE"], + "provider": os.environ["SUMMARY_PROVIDER"], "latestVersion": os.environ["SUMMARY_LATEST_VERSION"], "installVersion": os.environ["SUMMARY_INSTALL_VERSION"], "targetPackageSpec": os.environ["SUMMARY_TARGET_PACKAGE_SPEC"], @@ -745,6 +777,7 @@ SUMMARY_JSON_PATH="$( SUMMARY_SNAPSHOT_HINT="$SNAPSHOT_HINT" \ SUMMARY_SNAPSHOT_ID="$SNAPSHOT_ID" \ SUMMARY_MODE="$MODE" \ + SUMMARY_PROVIDER="$PROVIDER" \ SUMMARY_LATEST_VERSION="$LATEST_VERSION" \ SUMMARY_INSTALL_VERSION="$INSTALL_VERSION" \ SUMMARY_TARGET_PACKAGE_SPEC="$TARGET_PACKAGE_SPEC" \ diff --git a/scripts/e2e/parallels-macos-smoke.sh b/scripts/e2e/parallels-macos-smoke.sh index 792a1fc30e1..a276caba9c0 100644 --- a/scripts/e2e/parallels-macos-smoke.sh +++ b/scripts/e2e/parallels-macos-smoke.sh @@ -6,7 +6,11 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" VM_NAME="macOS Tahoe" SNAPSHOT_HINT="macOS 26.3.1 latest" MODE="both" -OPENAI_API_KEY_ENV="OPENAI_API_KEY" +PROVIDER="openai" +API_KEY_ENV="" +AUTH_CHOICE="" +AUTH_KEY_FLAG="" +MODEL_ID="" INSTALL_URL="https://openclaw.ai/install.sh" HOST_PORT="18425" HOST_PORT_EXPLICIT=0 @@ -111,8 +115,11 @@ Options: fresh = fresh snapshot -> target package/current main tgz -> onboard smoke upgrade = fresh snapshot -> latest release -> target package/current main tgz -> onboard smoke both = run both lanes - --openai-api-key-env Host env var name for OpenAI API key. - Default: OPENAI_API_KEY + --provider + Provider auth/model lane. Default: openai + --api-key-env Host env var name for provider API key. + Default: OPENAI_API_KEY for openai, ANTHROPIC_API_KEY for anthropic + --openai-api-key-env Alias for --api-key-env (backward compatible) --install-url Installer URL for latest release. Default: https://openclaw.ai/install.sh --host-port Host HTTP port for current-main tgz. Default: 18425 --host-ip Override Parallels host IP. @@ -148,8 +155,12 @@ while [[ $# -gt 0 ]]; do MODE="$2" shift 2 ;; - --openai-api-key-env) - OPENAI_API_KEY_ENV="$2" + --provider) + PROVIDER="$2" + shift 2 + ;; + --api-key-env|--openai-api-key-env) + API_KEY_ENV="$2" shift 2 ;; --install-url) @@ -218,8 +229,26 @@ case "$MODE" in ;; esac -OPENAI_API_KEY_VALUE="${!OPENAI_API_KEY_ENV:-}" -[[ -n "$OPENAI_API_KEY_VALUE" ]] || die "$OPENAI_API_KEY_ENV is required" +case "$PROVIDER" in + openai) + AUTH_CHOICE="openai-api-key" + AUTH_KEY_FLAG="openai-api-key" + MODEL_ID="openai/gpt-5.4" + [[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="OPENAI_API_KEY" + ;; + anthropic) + AUTH_CHOICE="apiKey" + AUTH_KEY_FLAG="anthropic-api-key" + MODEL_ID="anthropic/claude-sonnet-4-6" + [[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="ANTHROPIC_API_KEY" + ;; + *) + die "invalid --provider: $PROVIDER" + ;; +esac + +API_KEY_VALUE="${!API_KEY_ENV:-}" +[[ -n "$API_KEY_VALUE" ]] || die "$API_KEY_ENV is required" if [[ -n "$DISCORD_TOKEN_ENV" || -n "$DISCORD_GUILD_ID" || -n "$DISCORD_CHANNEL_ID" ]]; then [[ -n "$DISCORD_TOKEN_ENV" ]] || die "--discord-token-env is required when Discord smoke args are set" @@ -712,11 +741,11 @@ EOF run_ref_onboard() { guest_current_user_cli \ - /usr/bin/env "OPENAI_API_KEY=$OPENAI_API_KEY_VALUE" \ + /usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" \ "$GUEST_OPENCLAW_BIN" onboard \ --non-interactive \ --mode local \ - --auth-choice openai-api-key \ + --auth-choice "$AUTH_CHOICE" \ --secret-input-mode ref \ --gateway-port 18789 \ --gateway-bind loopback \ @@ -739,8 +768,9 @@ show_gateway_status_compat() { } verify_turn() { + guest_current_user_cli "$GUEST_OPENCLAW_BIN" models set "$MODEL_ID" guest_current_user_cli \ - /usr/bin/env "OPENAI_API_KEY=$OPENAI_API_KEY_VALUE" \ + /usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" \ "$GUEST_OPENCLAW_BIN" agent \ --agent main \ --message "Reply with exact ASCII text OK only." \ @@ -1082,6 +1112,7 @@ import sys summary = { "vm": os.environ["SUMMARY_VM"], + "provider": os.environ["SUMMARY_PROVIDER"], "snapshotHint": os.environ["SUMMARY_SNAPSHOT_HINT"], "snapshotId": os.environ["SUMMARY_SNAPSHOT_ID"], "mode": os.environ["SUMMARY_MODE"], @@ -1246,6 +1277,7 @@ fi SUMMARY_JSON_PATH="$( SUMMARY_VM="$VM_NAME" \ + SUMMARY_PROVIDER="$PROVIDER" \ SUMMARY_SNAPSHOT_HINT="$SNAPSHOT_HINT" \ SUMMARY_SNAPSHOT_ID="$SNAPSHOT_ID" \ SUMMARY_MODE="$MODE" \ diff --git a/scripts/e2e/parallels-npm-update-smoke.sh b/scripts/e2e/parallels-npm-update-smoke.sh index 398d5adbe74..89e24ac2414 100755 --- a/scripts/e2e/parallels-npm-update-smoke.sh +++ b/scripts/e2e/parallels-npm-update-smoke.sh @@ -6,7 +6,11 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" MACOS_VM="macOS Tahoe" WINDOWS_VM="Windows 11" LINUX_VM="Ubuntu 24.04.3 ARM64" -OPENAI_API_KEY_ENV="OPENAI_API_KEY" +PROVIDER="openai" +API_KEY_ENV="" +AUTH_CHOICE="" +AUTH_KEY_FLAG="" +MODEL_ID="" PACKAGE_SPEC="" JSON_OUTPUT=0 RUN_DIR="$(mktemp -d /tmp/openclaw-parallels-npm-update.XXXXXX)" @@ -19,7 +23,7 @@ HOST_PORT="" LATEST_VERSION="" CURRENT_HEAD="" CURRENT_HEAD_SHORT="" -OPENAI_API_KEY_VALUE="" +API_KEY_VALUE="" MACOS_FRESH_STATUS="skip" WINDOWS_FRESH_STATUS="skip" @@ -59,7 +63,11 @@ Usage: bash scripts/e2e/parallels-npm-update-smoke.sh [options] Options: --package-spec Baseline npm package spec. Default: openclaw@latest - --openai-api-key-env Host env var name for OpenAI API key. Default: OPENAI_API_KEY + --provider + Provider auth/model lane. Default: openai + --api-key-env Host env var name for provider API key. + Default: OPENAI_API_KEY for openai, ANTHROPIC_API_KEY for anthropic + --openai-api-key-env Alias for --api-key-env (backward compatible) --json Print machine-readable JSON summary. -h, --help Show help. EOF @@ -74,8 +82,12 @@ while [[ $# -gt 0 ]]; do PACKAGE_SPEC="$2" shift 2 ;; - --openai-api-key-env) - OPENAI_API_KEY_ENV="$2" + --provider) + PROVIDER="$2" + shift 2 + ;; + --api-key-env|--openai-api-key-env) + API_KEY_ENV="$2" shift 2 ;; --json) @@ -92,8 +104,26 @@ while [[ $# -gt 0 ]]; do esac done -OPENAI_API_KEY_VALUE="${!OPENAI_API_KEY_ENV:-}" -[[ -n "$OPENAI_API_KEY_VALUE" ]] || die "$OPENAI_API_KEY_ENV is required" +case "$PROVIDER" in + openai) + AUTH_CHOICE="openai-api-key" + AUTH_KEY_FLAG="openai-api-key" + MODEL_ID="openai/gpt-5.4" + [[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="OPENAI_API_KEY" + ;; + anthropic) + AUTH_CHOICE="apiKey" + AUTH_KEY_FLAG="anthropic-api-key" + MODEL_ID="anthropic/claude-sonnet-4-6" + [[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="ANTHROPIC_API_KEY" + ;; + *) + die "invalid --provider: $PROVIDER" + ;; +esac + +API_KEY_VALUE="${!API_KEY_ENV:-}" +[[ -n "$API_KEY_VALUE" ]] || die "$API_KEY_ENV is required" resolve_linux_vm_name() { local json requested @@ -173,6 +203,9 @@ param( [Parameter(Mandatory = $true)][string]$TgzUrl, [Parameter(Mandatory = $true)][string]$HeadShort, [Parameter(Mandatory = $true)][string]$SessionId, + [Parameter(Mandatory = $true)][string]$ModelId, + [Parameter(Mandatory = $true)][string]$ProviderKeyEnv, + [Parameter(Mandatory = $true)][string]$ProviderKey, [Parameter(Mandatory = $true)][string]$LogPath, [Parameter(Mandatory = $true)][string]$DonePath ) @@ -243,6 +276,7 @@ try { $env:PATH = "$env:LOCALAPPDATA\OpenClaw\deps\portable-git\cmd;$env:LOCALAPPDATA\OpenClaw\deps\portable-git\mingw64\bin;$env:LOCALAPPDATA\OpenClaw\deps\portable-git\usr\bin;$env:PATH" $tgz = Join-Path $env:TEMP 'openclaw-main-update.tgz' Remove-Item $tgz, $LogPath, $DonePath -Force -ErrorAction SilentlyContinue + Set-Item -Path ('Env:' + $ProviderKeyEnv) -Value $ProviderKey Invoke-Logged 'download current tgz' { curl.exe -fsSL $TgzUrl -o $tgz } Invoke-Logged 'npm install current tgz' { npm.cmd install -g $tgz --no-fund --no-audit } $openclaw = Join-Path $env:APPDATA 'npm\openclaw.cmd' @@ -250,7 +284,7 @@ try { if ($version -notmatch [regex]::Escape($HeadShort)) { throw "version mismatch: expected substring $HeadShort" } - Invoke-Logged 'openclaw models set' { & $openclaw models set openai/gpt-5.4 } + Invoke-Logged 'openclaw models set' { & $openclaw models set $ModelId } # Windows can keep the old hashed dist modules alive across in-place global npm upgrades. # Restart the gateway/service before verifying status or the next agent turn. Invoke-Logged 'openclaw gateway restart' { & $openclaw gateway restart } @@ -379,6 +413,9 @@ run_windows_script_via_log() { local tgz_url="$2" local head_short="$3" local session_id="$4" + local model_id="$5" + local provider_key_env="$6" + local provider_key="$7" local runner_name log_name done_name done_status launcher_state local start_seconds poll_deadline startup_checked poll_rc state_rc log_rc runner_name="openclaw-update-$RANDOM-$RANDOM.ps1" @@ -401,6 +438,9 @@ Start-Process powershell.exe -ArgumentList @( '-TgzUrl', '$tgz_url', '-HeadShort', '$head_short', '-SessionId', '$session_id', + '-ModelId', '$model_id', + '-ProviderKeyEnv', '$provider_key_env', + '-ProviderKey', '$provider_key', '-LogPath', \$log, '-DonePath', \$done ) -WindowStyle Hidden | Out-Null @@ -483,9 +523,9 @@ case "\$version" in exit 1 ;; esac -/opt/homebrew/bin/openclaw models set openai/gpt-5.4 +/opt/homebrew/bin/openclaw models set "$MODEL_ID" /opt/homebrew/bin/openclaw gateway status --deep --require-rpc -/opt/homebrew/bin/openclaw agent --agent main --session-id parallels-npm-update-macos-$head_short --message "Reply with exact ASCII text OK only." --json +/usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" /opt/homebrew/bin/openclaw agent --agent main --session-id parallels-npm-update-macos-$head_short --message "Reply with exact ASCII text OK only." --json EOF prlctl exec "$MACOS_VM" --current-user /bin/bash /tmp/openclaw-main-update.sh } @@ -494,7 +534,14 @@ run_windows_update() { local tgz_url="$1" local head_short="$2" local script_url="$3" - run_windows_script_via_log "$script_url" "$tgz_url" "$head_short" "parallels-npm-update-windows-$head_short" + run_windows_script_via_log \ + "$script_url" \ + "$tgz_url" \ + "$head_short" \ + "parallels-npm-update-windows-$head_short" \ + "$MODEL_ID" \ + "$API_KEY_ENV" \ + "$API_KEY_VALUE" } run_linux_update() { @@ -515,10 +562,10 @@ case "\$version" in exit 1 ;; esac -openclaw models set openai/gpt-5.4 +openclaw models set "$MODEL_ID" openclaw agent --local --agent main --session-id parallels-npm-update-linux-$head_short --message "Reply with exact ASCII text OK only." --json EOF - prlctl exec "$LINUX_VM" /usr/bin/env "OPENAI_API_KEY=$OPENAI_API_KEY_VALUE" /bin/bash /tmp/openclaw-main-update.sh + prlctl exec "$LINUX_VM" /usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" /bin/bash /tmp/openclaw-main-update.sh } write_summary_json() { @@ -530,6 +577,7 @@ import sys summary = { "packageSpec": os.environ["SUMMARY_PACKAGE_SPEC"], + "provider": os.environ["SUMMARY_PROVIDER"], "latestVersion": os.environ["SUMMARY_LATEST_VERSION"], "currentHead": os.environ["SUMMARY_CURRENT_HEAD"], "runDir": os.environ["SUMMARY_RUN_DIR"], @@ -550,7 +598,7 @@ summary = { "linux": { "status": os.environ["SUMMARY_LINUX_UPDATE_STATUS"], "version": os.environ["SUMMARY_LINUX_UPDATE_VERSION"], - "mode": "local-with-openai-env", + "mode": "local-with-provider-env", }, }, } @@ -574,18 +622,24 @@ fi say "Run fresh npm baseline: $PACKAGE_SPEC" bash "$ROOT_DIR/scripts/e2e/parallels-macos-smoke.sh" \ --mode fresh \ + --provider "$PROVIDER" \ + --api-key-env "$API_KEY_ENV" \ --target-package-spec "$PACKAGE_SPEC" \ --json >"$RUN_DIR/macos-fresh.log" 2>&1 & macos_fresh_pid=$! bash "$ROOT_DIR/scripts/e2e/parallels-windows-smoke.sh" \ --mode fresh \ + --provider "$PROVIDER" \ + --api-key-env "$API_KEY_ENV" \ --target-package-spec "$PACKAGE_SPEC" \ --json >"$RUN_DIR/windows-fresh.log" 2>&1 & windows_fresh_pid=$! bash "$ROOT_DIR/scripts/e2e/parallels-linux-smoke.sh" \ --mode fresh \ + --provider "$PROVIDER" \ + --api-key-env "$API_KEY_ENV" \ --target-package-spec "$PACKAGE_SPEC" \ --json >"$RUN_DIR/linux-fresh.log" 2>&1 & linux_fresh_pid=$! @@ -626,6 +680,7 @@ WINDOWS_UPDATE_VERSION="$(extract_last_version "$RUN_DIR/windows-update.log")" LINUX_UPDATE_VERSION="$(extract_last_version "$RUN_DIR/linux-update.log")" SUMMARY_PACKAGE_SPEC="$PACKAGE_SPEC" \ +SUMMARY_PROVIDER="$PROVIDER" \ SUMMARY_LATEST_VERSION="$LATEST_VERSION" \ SUMMARY_CURRENT_HEAD="$CURRENT_HEAD_SHORT" \ SUMMARY_RUN_DIR="$RUN_DIR" \ diff --git a/scripts/e2e/parallels-windows-smoke.sh b/scripts/e2e/parallels-windows-smoke.sh index 05a29d0c2c0..2ed1b0cbc7a 100644 --- a/scripts/e2e/parallels-windows-smoke.sh +++ b/scripts/e2e/parallels-windows-smoke.sh @@ -4,7 +4,11 @@ set -euo pipefail VM_NAME="Windows 11" SNAPSHOT_HINT="pre-openclaw-native-e2e-2026-03-12" MODE="both" -OPENAI_API_KEY_ENV="OPENAI_API_KEY" +PROVIDER="openai" +API_KEY_ENV="" +AUTH_CHOICE="" +AUTH_KEY_FLAG="" +MODEL_ID="" INSTALL_URL="https://openclaw.ai/install.ps1" HOST_PORT="18426" HOST_PORT_EXPLICIT=0 @@ -23,6 +27,7 @@ MAIN_TGZ_DIR="$(mktemp -d)" MAIN_TGZ_PATH="" MINGIT_ZIP_PATH="" MINGIT_ZIP_NAME="" +WINDOWS_ONBOARD_SCRIPT_PATH="" SERVER_PID="" RUN_DIR="$(mktemp -d /tmp/openclaw-parallels-windows.XXXXXX)" BUILD_LOCK_DIR="${TMPDIR:-/tmp}/openclaw-parallels-build.lock" @@ -84,8 +89,11 @@ Options: --snapshot-hint Snapshot name substring/fuzzy match. Default: "pre-openclaw-native-e2e-2026-03-12" --mode - --openai-api-key-env Host env var name for OpenAI API key. - Default: OPENAI_API_KEY + --provider + Provider auth/model lane. Default: openai + --api-key-env Host env var name for provider API key. + Default: OPENAI_API_KEY for openai, ANTHROPIC_API_KEY for anthropic + --openai-api-key-env Alias for --api-key-env (backward compatible) --install-url Installer URL for latest release. Default: https://openclaw.ai/install.ps1 --host-port Host HTTP port for current-main tgz. Default: 18426 --host-ip Override Parallels host IP. @@ -118,8 +126,12 @@ while [[ $# -gt 0 ]]; do MODE="$2" shift 2 ;; - --openai-api-key-env) - OPENAI_API_KEY_ENV="$2" + --provider) + PROVIDER="$2" + shift 2 + ;; + --api-key-env|--openai-api-key-env) + API_KEY_ENV="$2" shift 2 ;; --install-url) @@ -176,8 +188,26 @@ case "$MODE" in ;; esac -OPENAI_API_KEY_VALUE="${!OPENAI_API_KEY_ENV:-}" -[[ -n "$OPENAI_API_KEY_VALUE" ]] || die "$OPENAI_API_KEY_ENV is required" +case "$PROVIDER" in + openai) + AUTH_CHOICE="openai-api-key" + AUTH_KEY_FLAG="openai-api-key" + MODEL_ID="openai/gpt-5.4" + [[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="OPENAI_API_KEY" + ;; + anthropic) + AUTH_CHOICE="apiKey" + AUTH_KEY_FLAG="anthropic-api-key" + MODEL_ID="anthropic/claude-sonnet-4-6" + [[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="ANTHROPIC_API_KEY" + ;; + *) + die "invalid --provider: $PROVIDER" + ;; +esac + +API_KEY_VALUE="${!API_KEY_ENV:-}" +[[ -n "$API_KEY_VALUE" ]] || die "$API_KEY_ENV is required" ps_single_quote() { printf "%s" "$1" | sed "s/'/''/g" @@ -553,6 +583,7 @@ summary = { "snapshotHint": os.environ["SUMMARY_SNAPSHOT_HINT"], "snapshotId": os.environ["SUMMARY_SNAPSHOT_ID"], "mode": os.environ["SUMMARY_MODE"], + "provider": os.environ["SUMMARY_PROVIDER"], "latestVersion": os.environ["SUMMARY_LATEST_VERSION"], "installVersion": os.environ["SUMMARY_INSTALL_VERSION"], "targetPackageSpec": os.environ["SUMMARY_TARGET_PACKAGE_SPEC"], @@ -824,10 +855,41 @@ verify_version_contains() { esac } +write_onboard_runner_script() { + WINDOWS_ONBOARD_SCRIPT_PATH="$MAIN_TGZ_DIR/openclaw-onboard-$PROVIDER.ps1" + cat >"$WINDOWS_ONBOARD_SCRIPT_PATH" < "{1}" 2>&1' -f \$openclaw, \$LogPath) + & cmd.exe /d /s /c \$cmdLine + Set-Content -Path \$DonePath -Value ([string]\$LASTEXITCODE) +} catch { + if (Test-Path \$LogPath) { + Add-Content -Path \$LogPath -Value (\$_ | Out-String) + } else { + (\$_ | Out-String) | Set-Content -Path \$LogPath + } + Set-Content -Path \$DonePath -Value '1' +} +EOF +} + run_ref_onboard() { - local openai_key_q runner_name log_name done_name done_status launcher_state + local api_key_env_q api_key_value_q script_url + local runner_name log_name done_name done_status launcher_state local poll_rc state_rc log_rc start_seconds poll_deadline startup_checked - openai_key_q="$(ps_single_quote "$OPENAI_API_KEY_VALUE")" + api_key_env_q="$(ps_single_quote "$API_KEY_ENV")" + api_key_value_q="$(ps_single_quote "$API_KEY_VALUE")" + write_onboard_runner_script + script_url="http://$HOST_IP:$HOST_PORT/$(basename "$WINDOWS_ONBOARD_SCRIPT_PATH")" runner_name="openclaw-onboard-$RANDOM-$RANDOM.ps1" log_name="openclaw-onboard-$RANDOM-$RANDOM.log" done_name="openclaw-onboard-$RANDOM-$RANDOM.done" @@ -840,27 +902,9 @@ run_ref_onboard() { \$log = Join-Path \$env:TEMP '$log_name' \$done = Join-Path \$env:TEMP '$done_name' Remove-Item \$runner, \$log, \$done -Force -ErrorAction SilentlyContinue -@' -\$ErrorActionPreference = 'Stop' -\$PSNativeCommandUseErrorActionPreference = \$false -\$log = Join-Path \$env:TEMP '$log_name' -\$done = Join-Path \$env:TEMP '$done_name' -\$env:OPENAI_API_KEY = '$openai_key_q' -try { - \$openclaw = Join-Path \$env:APPDATA 'npm\openclaw.cmd' - \$cmdLine = ('"{0}" onboard --non-interactive --mode local --auth-choice openai-api-key --secret-input-mode ref --gateway-port 18789 --gateway-bind loopback --install-daemon --skip-skills --accept-risk --json > "{1}" 2>&1' -f \$openclaw, \$log) - & cmd.exe /d /s /c \$cmdLine - Set-Content -Path \$done -Value ([string]\$LASTEXITCODE) -} catch { - if (Test-Path \$log) { - Add-Content -Path \$log -Value (\$_ | Out-String) - } else { - (\$_ | Out-String) | Set-Content -Path \$log - } - Set-Content -Path \$done -Value '1' -} -'@ | Set-Content -Path \$runner -Start-Process powershell.exe -ArgumentList @('-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', \$runner) -WindowStyle Hidden | Out-Null +Set-Item -Path ('Env:' + '${api_key_env_q}') -Value '${api_key_value_q}' +curl.exe -fsSL '$script_url' -o \$runner +Start-Process powershell.exe -ArgumentList @('-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', \$runner, '-LogPath', \$log, '-DonePath', \$done) -WindowStyle Hidden | Out-Null EOF )" @@ -1028,7 +1072,8 @@ show_gateway_status_compat() { } verify_turn() { - guest_run_openclaw "OPENAI_API_KEY" "$OPENAI_API_KEY_VALUE" \ + guest_run_openclaw "" "" models set "$MODEL_ID" + guest_run_openclaw "$API_KEY_ENV" "$API_KEY_VALUE" \ agent --agent main --message "Reply with exact ASCII text OK only." --json } @@ -1144,6 +1189,7 @@ SUMMARY_JSON_PATH="$( SUMMARY_SNAPSHOT_HINT="$SNAPSHOT_HINT" \ SUMMARY_SNAPSHOT_ID="$SNAPSHOT_ID" \ SUMMARY_MODE="$MODE" \ + SUMMARY_PROVIDER="$PROVIDER" \ SUMMARY_LATEST_VERSION="$LATEST_VERSION" \ SUMMARY_INSTALL_VERSION="$INSTALL_VERSION" \ SUMMARY_TARGET_PACKAGE_SPEC="$TARGET_PACKAGE_SPEC" \