diff --git a/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml b/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml index 8748568843f3..cf679b8a4c95 100644 --- a/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml +++ b/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml @@ -748,6 +748,7 @@ jobs: add_profile_suite native-live-src-gateway-profiles-opencode-go-smoke "stable" add_profile_suite native-live-src-gateway-profiles-openrouter "full" add_profile_suite native-live-src-gateway-profiles-xai "full" + add_profile_suite native-live-src-gateway-profiles-zai "full" add_profile_suite native-live-src-gateway-backends "stable full" add_profile_suite native-live-src-infra "stable full" add_profile_suite native-live-test "stable full" @@ -765,7 +766,7 @@ jobs: add_profile_suite live-gateway-advisory-docker "full" add_profile_suite live-gateway-advisory-docker-deepseek-fireworks "full" add_profile_suite live-gateway-advisory-docker-opencode-openrouter "full" - add_profile_suite live-gateway-advisory-docker-xai "full" + add_profile_suite live-gateway-advisory-docker-xai-zai "full" add_profile_suite live-cli-backend-docker "stable full" add_profile_suite live-acp-bind-docker "stable full" add_profile_suite live-codex-harness-docker "stable full" @@ -828,17 +829,6 @@ jobs: RELEASE_TEST_PROFILE: ${{ inputs.release_test_profile }} run: node scripts/plan-release-workflow-matrix.mjs >> "$GITHUB_OUTPUT" - - name: Record temporary Z.AI API Platform omission - if: inputs.include_live_suites - shell: bash - run: | - { - echo - echo "### Temporary provider omission" - echo - echo "Z.AI API Platform validation is temporarily disabled while its CI account is unavailable. Z.AI Coding Plan validation remains enabled." - } >> "$GITHUB_STEP_SUMMARY" - validate_release_live_cache: needs: validate_selected_ref if: inputs.include_live_suites && !inputs.live_models_only && (inputs.live_suite_filter == '' || inputs.live_suite_filter == 'live-cache') @@ -3158,6 +3148,13 @@ jobs: profile_env_only: false advisory: true profiles: full + - suite_id: native-live-src-gateway-profiles-zai + label: Native live gateway profiles Z.ai + command: OPENCLAW_LIVE_GATEWAY_PROVIDERS=zai node .release-harness/scripts/test-live-shard.mjs native-live-src-gateway-profiles + timeout_minutes: 30 + profile_env_only: false + advisory: true + profiles: full - suite_id: native-live-src-gateway-backends label: Native live gateway backends command: OPENCLAW_LIVE_CODEX_HARNESS=1 OPENCLAW_LIVE_CODEX_HARNESS_AUTH=api-key node .release-harness/scripts/test-live-shard.mjs native-live-src-gateway-backends @@ -3415,10 +3412,10 @@ jobs: profile_env_only: false advisory: true profiles: full - - suite_id: live-gateway-advisory-docker-xai + - suite_id: live-gateway-advisory-docker-xai-zai suite_group: live-gateway-advisory-docker - label: Docker live gateway advisory xAI - command: OPENCLAW_LIVE_GATEWAY_PROVIDERS=xai OPENCLAW_LIVE_GATEWAY_MAX_MODELS=2 OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=90000 OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=180000 OPENCLAW_LIVE_DOCKER_REPO_ROOT="$GITHUB_WORKSPACE" timeout --foreground --kill-after=30s 35m bash .release-harness/scripts/test-live-gateway-models-docker.sh + label: Docker live gateway advisory xAI/Z.ai + command: OPENCLAW_LIVE_GATEWAY_PROVIDERS=xai,zai OPENCLAW_LIVE_GATEWAY_MAX_MODELS=2 OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=90000 OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=180000 OPENCLAW_LIVE_DOCKER_REPO_ROOT="$GITHUB_WORKSPACE" timeout --foreground --kill-after=30s 35m bash .release-harness/scripts/test-live-gateway-models-docker.sh timeout_minutes: 40 profile_env_only: false advisory: true diff --git a/scripts/plan-release-workflow-matrix.mjs b/scripts/plan-release-workflow-matrix.mjs index e20bf346b362..b9b111a9ba78 100644 --- a/scripts/plan-release-workflow-matrix.mjs +++ b/scripts/plan-release-workflow-matrix.mjs @@ -129,6 +129,11 @@ const LIVE_MODEL_PROVIDERS = [ providers: "xai", profiles: "full", }, + { + provider_label: "Z.ai", + providers: "zai", + profiles: "full", + }, { provider_label: "Fireworks", providers: "fireworks", diff --git a/scripts/test-live-shard.mjs b/scripts/test-live-shard.mjs index 2d1ab807f65e..f02a9b4d75d0 100644 --- a/scripts/test-live-shard.mjs +++ b/scripts/test-live-shard.mjs @@ -44,7 +44,6 @@ const OPTIONAL_LIVE_SHARD_FILE_ENVS = new Map([ const SKIPPED_ASSERTION_STATUSES = new Set(["disabled", "pending", "skipped", "todo"]); const QA_RUNTIME_LIVE_TEST = "extensions/qa-lab/src/matrix-channel-driver.lifecycle.live.test.ts"; const QA_RUNTIME_ARTIFACT = "dist/extensions/qa-lab/runtime-api.js"; -const ZAI_LIVE_TEST_FILE = "src/agents/zai.live.test.ts"; /** Live-test shards included in release validation. */ export const RELEASE_LIVE_TEST_SHARDS = Object.freeze([ @@ -260,13 +259,12 @@ export function selectLiveShardFiles(shard, files = collectAllLiveTestFiles()) { case "native-live-src-agents": return files.filter( (file) => - file !== ZAI_LIVE_TEST_FILE && - (file.startsWith("src/agents/") || - file.startsWith("src/llm/") || - file.startsWith("src/skills/")), + file.startsWith("src/agents/") || + file.startsWith("src/llm/") || + file.startsWith("src/skills/"), ); case "native-live-src-agents-zai-coding": - return files.filter((file) => file === ZAI_LIVE_TEST_FILE); + return files.filter((file) => file === "src/agents/zai.live.test.ts"); case "native-live-src-gateway": return files.filter( (file) => file.startsWith("src/gateway/") || file.startsWith("src/system-agent/"), diff --git a/test/scripts/package-acceptance-workflow.test.ts b/test/scripts/package-acceptance-workflow.test.ts index 1b97286bad84..bf887c08d3f4 100644 --- a/test/scripts/package-acceptance-workflow.test.ts +++ b/test/scripts/package-acceptance-workflow.test.ts @@ -1752,7 +1752,7 @@ describe("package artifact reuse", () => { expect(workflow).toContain( 'add_profile_suite live-gateway-advisory-docker-opencode-openrouter "full"', ); - expect(workflow).toContain('add_profile_suite live-gateway-advisory-docker-xai "full"'); + expect(workflow).toContain('add_profile_suite live-gateway-advisory-docker-xai-zai "full"'); expect(workflow).toContain('add_profile_suite live-cli-backend-docker "stable full"'); expect(workflow).toContain('add_profile_suite live-subagent-announce-docker "stable full"'); expect(workflow).toContain( @@ -1762,12 +1762,12 @@ describe("package artifact reuse", () => { expect(workflow).not.toContain("src/agents/openai-ws-stream.e2e.test.ts"); expect(workflow).toContain("suite_id: live-gateway-advisory-docker-deepseek-fireworks"); expect(workflow).toContain("suite_id: live-gateway-advisory-docker-opencode-openrouter"); - expect(workflow).toContain("suite_id: live-gateway-advisory-docker-xai"); + expect(workflow).toContain("suite_id: live-gateway-advisory-docker-xai-zai"); expect(workflow).toContain("suite_id: live-subagent-announce-docker"); expect(workflow).toContain("suite_group: live-gateway-advisory-docker"); expect(workflow).toContain("OPENCLAW_LIVE_GATEWAY_PROVIDERS=deepseek,fireworks"); expect(workflow).toContain("OPENCLAW_LIVE_GATEWAY_PROVIDERS=opencode-go,openrouter"); - expect(workflow).toContain("OPENCLAW_LIVE_GATEWAY_PROVIDERS=xai"); + expect(workflow).toContain("OPENCLAW_LIVE_GATEWAY_PROVIDERS=xai,zai"); expect(workflow).toContain("inputs.live_suite_filter == matrix.suite_group"); expect(workflow).toContain("OPENCLAW_LIVE_CLI_BACKEND_MODEL=claude-cli/claude-sonnet-4-6"); expect(workflow).toContain("OPENCLAW_LIVE_CLI_BACKEND_AUTH=api-key"); @@ -1829,8 +1829,8 @@ describe("package artifact reuse", () => { expect(workflow).toContain("suite_id: native-live-src-gateway-profiles-opencode-go"); expect(workflow).toContain("suite_id: native-live-src-gateway-profiles-openrouter"); expect(workflow).toContain("suite_id: native-live-src-gateway-profiles-xai"); - expect(workflow).not.toContain("suite_id: native-live-src-gateway-profiles-zai"); - expect(workflow).toContain("Z.AI API Platform validation is temporarily disabled"); + expect(workflow).toContain("suite_id: native-live-src-gateway-profiles-zai"); + expect(workflow).not.toContain("Z.AI API Platform validation is temporarily disabled"); expect(workflow).not.toContain( "OPENCLAW_LIVE_GATEWAY_PROVIDERS=deepseek,opencode-go,openrouter,xai,zai", ); diff --git a/test/scripts/release-workflow-matrix-plan.test.ts b/test/scripts/release-workflow-matrix-plan.test.ts index 5db2449ab07c..7bb5fcc1f51a 100644 --- a/test/scripts/release-workflow-matrix-plan.test.ts +++ b/test/scripts/release-workflow-matrix-plan.test.ts @@ -134,6 +134,7 @@ const PROFILE_EXPECTATIONS = [ "opencode-go", "openrouter", "xai", + "zai", "fireworks", ], }, @@ -249,6 +250,7 @@ describe("scripts/plan-release-workflow-matrix.mjs", () => { "opencode-go", "openrouter", "xai", + "zai", "fireworks", ]); }); @@ -315,7 +317,7 @@ describe("scripts/plan-release-workflow-matrix.mjs", () => { }); expect(plan.liveModels.count).toBe(0); - expect(plan.liveModels.omitted).toHaveLength(9); + expect(plan.liveModels.omitted).toHaveLength(10); expect(plan.liveModels.omitted[0]?.reason).toBe( "Docker live model matrix disabled by input selection", ); diff --git a/test/scripts/test-live-shard.test.ts b/test/scripts/test-live-shard.test.ts index 702397a5bfc2..7fa2aa30453d 100644 --- a/test/scripts/test-live-shard.test.ts +++ b/test/scripts/test-live-shard.test.ts @@ -48,7 +48,10 @@ describe("scripts/test-live-shard", () => { expect(allFiles.length).toBeGreaterThan(0); expect([...new Set(selectedFiles)].toSorted((a, b) => a.localeCompare(b))).toEqual(allFiles); - expect(duplicateFiles).toEqual(["extensions/music-generation-providers.live.test.ts"]); + expect(duplicateFiles).toEqual([ + "src/agents/zai.live.test.ts", + "extensions/music-generation-providers.live.test.ts", + ]); expect(musicProviderFanout).toEqual([ "native-live-extensions-media-music-google", "native-live-extensions-media-music-minimax", @@ -88,7 +91,7 @@ describe("scripts/test-live-shard", () => { expect(selectLiveShardFiles("native-live-src-agents", allFiles)).toContain( "src/skills/workshop/experience-review.live.test.ts", ); - expect(selectLiveShardFiles("native-live-src-agents", allFiles)).not.toContain( + expect(selectLiveShardFiles("native-live-src-agents", allFiles)).toContain( "src/agents/zai.live.test.ts", ); expect(selectLiveShardFiles("native-live-src-agents-zai-coding", allFiles)).toEqual([