From e0141946b2fe0c39ca0944956c010f59f0565bf1 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 27 Apr 2026 04:04:35 +0100 Subject: [PATCH] ci: allow targeted live model providers --- .../openclaw-live-and-e2e-checks-reusable.yml | 115 +++++++++++++++--- 1 file changed, 95 insertions(+), 20 deletions(-) diff --git a/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml b/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml index 6259e23db8f..c776f58b509 100644 --- a/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml +++ b/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml @@ -38,6 +38,11 @@ on: required: false default: false type: boolean + live_model_providers: + description: Comma/space separated provider ids for the Docker live model matrix; blank runs all providers + required: false + default: "" + type: string workflow_call: inputs: ref: @@ -74,6 +79,11 @@ on: required: false default: false type: boolean + live_model_providers: + description: Comma/space separated provider ids for the Docker live model matrix; blank runs all providers + required: false + default: "" + type: string secrets: OPENAI_API_KEY: required: false @@ -180,6 +190,7 @@ jobs: outputs: selected_sha: ${{ steps.validate.outputs.selected_sha }} trusted_reason: ${{ steps.validate.outputs.trusted_reason }} + live_model_matrix: ${{ steps.live_model_matrix.outputs.matrix }} steps: - name: Checkout selected ref uses: actions/checkout@v6 @@ -224,6 +235,89 @@ jobs: echo "Trust reason: \`$trusted_reason\`" } >> "$GITHUB_STEP_SUMMARY" + - name: Resolve live model provider matrix + id: live_model_matrix + env: + INPUT_LIVE_MODEL_PROVIDERS: ${{ inputs.live_model_providers }} + shell: bash + run: | + set -euo pipefail + + all_providers=(anthropic google minimax openai opencode-go openrouter xai zai fireworks) + + provider_label() { + case "$1" in + anthropic) echo "Anthropic" ;; + google) echo "Google" ;; + minimax) echo "MiniMax" ;; + openai) echo "OpenAI" ;; + opencode-go) echo "OpenCode" ;; + openrouter) echo "OpenRouter" ;; + xai) echo "xAI" ;; + zai) echo "Z.ai" ;; + fireworks) echo "Fireworks" ;; + *) return 1 ;; + esac + } + + normalize_provider() { + local value="${1,,}" + case "$value" in + z.ai|z-ai) echo "zai" ;; + opencode|opencode-go) echo "opencode-go" ;; + open-router|openrouter) echo "openrouter" ;; + *) echo "$value" ;; + esac + } + + is_known_provider() { + local value="$1" + local provider + for provider in "${all_providers[@]}"; do + [[ "$provider" == "$value" ]] && return 0 + done + return 1 + } + + selected=() + declare -A seen=() + raw="${INPUT_LIVE_MODEL_PROVIDERS:-}" + normalized_all="${raw,,}" + normalized_all="${normalized_all//[[:space:],]/}" + if [[ -z "$normalized_all" || "$normalized_all" == "all" ]]; then + selected=("${all_providers[@]}") + else + while IFS= read -r entry; do + [[ -z "$entry" ]] && continue + provider="$(normalize_provider "$entry")" + if ! is_known_provider "$provider"; then + echo "Unknown live model provider '${entry}'. Expected one of: ${all_providers[*]}" >&2 + exit 1 + fi + if [[ -z "${seen[$provider]:-}" ]]; then + selected+=("$provider") + seen[$provider]=1 + fi + done < <(printf '%s\n' "$raw" | tr ',' '\n' | tr '[:space:]' '\n') + fi + + if [[ "${#selected[@]}" -eq 0 ]]; then + echo "No live model providers selected." >&2 + exit 1 + fi + + matrix_entries="[]" + for provider in "${selected[@]}"; do + label="$(provider_label "$provider")" + matrix_entries="$(jq -c --arg label "$label" --arg provider "$provider" '. + [{provider_label: $label, providers: $provider}]' <<<"$matrix_entries")" + done + matrix="$(jq -c --argjson include "$matrix_entries" '{include: $include}')" + echo "matrix=$matrix" >> "$GITHUB_OUTPUT" + { + echo + echo "Live model providers: \`$(IFS=,; echo "${selected[*]}")\`" + } >> "$GITHUB_STEP_SUMMARY" + validate_release_live_cache: needs: validate_selected_ref if: inputs.include_live_suites && !inputs.live_models_only @@ -842,26 +936,7 @@ jobs: timeout-minutes: 75 strategy: fail-fast: false - matrix: - include: - - provider_label: Anthropic - providers: anthropic - - provider_label: Google - providers: google - - provider_label: MiniMax - providers: minimax - - provider_label: OpenAI - providers: openai - - provider_label: OpenCode - providers: opencode-go - - provider_label: OpenRouter - providers: openrouter - - provider_label: xAI - providers: xai - - provider_label: Z.ai - providers: zai - - provider_label: Fireworks - providers: fireworks + matrix: ${{ fromJSON(needs.validate_selected_ref.outputs.live_model_matrix) }} env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} OPENAI_BASE_URL: ${{ secrets.OPENAI_BASE_URL }}