sdk-gpu-test #25
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: SDK GPU Tests (CUDA) | |
| on: | |
| repository_dispatch: | |
| types: [sdk-gpu-test] | |
| # Cancel in-flight runs for the same SDK PR | |
| concurrency: | |
| group: sdk-gpu-test-${{ github.event.client_payload.pr_number }} | |
| cancel-in-progress: true | |
| jobs: | |
| build-cuda-package: | |
| name: Build linux-x64-cuda | |
| runs-on: ubuntu-22.04 | |
| if: ${{ github.repository == 'lloyal-ai/lloyal.node' }} | |
| steps: | |
| - name: Set pending status on SDK PR | |
| uses: actions/github-script@v7 | |
| with: | |
| github-token: ${{ secrets.SDK_REPO_PAT }} | |
| script: | | |
| await github.rest.repos.createCommitStatus({ | |
| owner: 'lloyal-ai', | |
| repo: 'sdk', | |
| sha: '${{ github.event.client_payload.sdk_sha }}', | |
| state: 'pending', | |
| context: 'gpu-tests/cuda', | |
| description: 'GPU integration tests running...', | |
| target_url: `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}` | |
| }); | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 24 | |
| registry-url: 'https://registry.npmjs.org' | |
| - name: Validate llama.cpp version | |
| run: node scripts/sync-llama-cpp.js --check | |
| shell: bash | |
| - name: Provision CUDA toolkit | |
| uses: ./.github/actions/provision-cuda | |
| with: | |
| version: '12.2.2' | |
| arch: x64 | |
| - name: Setup ccache | |
| uses: hendrikmuhs/ccache-action@v1.2 | |
| with: | |
| key: cuda-build-${{ runner.os }} | |
| - name: Install npm dependencies | |
| run: npm ci --ignore-scripts | |
| - name: Build native module | |
| run: npm run build | |
| env: | |
| LLOYAL_GPU: cuda | |
| CMAKE_C_COMPILER_LAUNCHER: ccache | |
| CMAKE_CXX_COMPILER_LAUNCHER: ccache | |
| CMAKE_CUDA_COMPILER_LAUNCHER: ccache | |
| - name: Create platform package | |
| run: node scripts/create-platform-package.js linux-x64-cuda ubuntu-22.04 x64 | |
| - name: Upload platform package artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: package-linux-x64-cuda | |
| path: packages/linux-x64-cuda/ | |
| retention-days: 1 | |
| compression-level: 0 | |
| gpu-integration: | |
| name: GPU Tests (L4) | |
| needs: build-cuda-package | |
| runs-on: ubuntu-latest | |
| if: ${{ github.repository == 'lloyal-ai/lloyal.node' }} | |
| permissions: | |
| contents: read | |
| id-token: write | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Checkout infrastructure scripts | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: lloyal-ai/lloyal-infra | |
| token: ${{ secrets.INFRA_REPO_PAT }} | |
| path: ci | |
| - name: Authenticate to GCP | |
| uses: google-github-actions/auth@v2 | |
| with: | |
| workload_identity_provider: ${{ secrets.GCP_WIF_PROVIDER }} | |
| service_account: ${{ secrets.GCP_SA_EMAIL }} | |
| - name: Set up Cloud SDK | |
| uses: google-github-actions/setup-gcloud@v2 | |
| - name: Configure Docker for Artifact Registry | |
| run: gcloud auth configure-docker ${{ secrets.GCP_REGION }}-docker.pkg.dev --quiet | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 24 | |
| cache: 'npm' | |
| - name: Install lloyal-node dependencies | |
| run: npm ci --ignore-scripts | |
| - name: Clone and build SDK from PR branch | |
| run: | | |
| git clone --depth=1 -b "$SDK_REF" \ | |
| "https://x-access-token:${SDK_PAT}@github.com/${SDK_REPO}.git" /tmp/sdk | |
| cd /tmp/sdk | |
| npm install | |
| npm run build | |
| env: | |
| SDK_REF: ${{ github.event.client_payload.sdk_ref }} | |
| SDK_REPO: ${{ github.event.client_payload.sdk_repo }} | |
| SDK_PAT: ${{ secrets.SDK_REPO_PAT }} | |
| - name: Link SDK packages into lloyal-node | |
| run: | | |
| npm link /tmp/sdk/packages/sdk /tmp/sdk/packages/agents | |
| echo "Linked SDK packages:" | |
| ls -la node_modules/@lloyal-labs/sdk/dist/ || true | |
| ls -la node_modules/@lloyal-labs/lloyal-agents/dist/ || true | |
| - name: Copy SDK tests into lloyal-node | |
| run: | | |
| # Rewrite @lloyal-labs/lloyal.node imports to relative path (self-package) | |
| sed "s|from '@lloyal-labs/lloyal.node'|from '../dist/index.js'|g" \ | |
| /tmp/sdk/test/agents.ts > test/sdk-agents.ts | |
| sed "s|from '@lloyal-labs/lloyal.node'|from '../dist/index.js'|g" \ | |
| /tmp/sdk/test/sdk.ts > test/sdk-primitives.ts | |
| - name: Compile TypeScript (src + tests) | |
| run: | | |
| npm run build:ts | |
| npm run build:test | |
| - name: Download package artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: package-linux-x64-cuda | |
| path: packages/package-linux-x64-cuda | |
| - name: Write SDK test wrapper | |
| run: | | |
| cat > ci/run-sdk-gpu-tests.sh <<'EOF' | |
| #!/bin/bash | |
| set -e | |
| # Run standard lloyal-node GPU tests | |
| bash run-gpu-tests.sh | |
| # Use Qwen3 from matrix.json (tool-calling model for agent tests) | |
| MODEL=$(jq -r '.models[] | select(.name == "Qwen3") | .file' test/matrix.json) | |
| if [ ! -f "models/$MODEL" ]; then | |
| echo "Error: $MODEL not found (should have been downloaded by run-gpu-tests.sh)" | |
| exit 1 | |
| fi | |
| echo "" | |
| echo "══════════════════════════════════════" | |
| echo "SDK PRIMITIVES TESTS" | |
| echo "══════════════════════════════════════" | |
| echo "Running SDK primitives tests with $MODEL..." | |
| LLAMA_TEST_MODEL="models/$MODEL" \ | |
| LLOYAL_GPU="${LLOYAL_GPU:-cuda}" \ | |
| LLOYAL_NO_FALLBACK=1 \ | |
| npx tsx test/sdk-primitives.ts | |
| echo "" | |
| echo "=== SDK Primitives Tests Passed ===" | |
| echo "" | |
| echo "══════════════════════════════════════" | |
| echo "SDK AGENT TESTS" | |
| echo "══════════════════════════════════════" | |
| echo "Running SDK agent tests with $MODEL..." | |
| LLAMA_TEST_MODEL="models/$MODEL" \ | |
| LLOYAL_GPU="${LLOYAL_GPU:-cuda}" \ | |
| LLOYAL_NO_FALLBACK=1 \ | |
| npx tsx test/sdk-agents.ts | |
| echo "" | |
| echo "=== SDK Agent Tests Passed ===" | |
| EOF | |
| chmod +x ci/run-sdk-gpu-tests.sh | |
| - name: Build and push GPU test image | |
| run: | | |
| # Patch Dockerfile to copy the SDK wrapper and use it as entrypoint | |
| sed 's|COPY ci/run-gpu-tests.sh ./|COPY ci/run-gpu-tests.sh ci/run-sdk-gpu-tests.sh ./|; s|ENTRYPOINT.*|ENTRYPOINT ["bash", "run-sdk-gpu-tests.sh"]|' \ | |
| ci/Dockerfile.gpu-tests > ci/Dockerfile.sdk-gpu-tests | |
| IMAGE="${{ secrets.GCP_REGION }}-docker.pkg.dev/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_AR_REPO }}/gpu-tests:sdk-${{ github.event.client_payload.sdk_sha }}-cuda" | |
| docker build -f ci/Dockerfile.sdk-gpu-tests -t "$IMAGE" . | |
| docker push "$IMAGE" | |
| echo "IMAGE=$IMAGE" >> $GITHUB_ENV | |
| - name: Deploy and run GPU tests | |
| run: bash ci/deploy-gpu-tests.sh | |
| env: | |
| GCP_REGION: ${{ secrets.GCP_REGION }} | |
| GCP_SA_EMAIL: ${{ secrets.GCP_SA_EMAIL }} | |
| JOB_NAME: lloyal-gpu-test-sdk | |
| - name: Set success status on SDK PR | |
| if: success() | |
| uses: actions/github-script@v7 | |
| with: | |
| github-token: ${{ secrets.SDK_REPO_PAT }} | |
| script: | | |
| await github.rest.repos.createCommitStatus({ | |
| owner: 'lloyal-ai', | |
| repo: 'sdk', | |
| sha: '${{ github.event.client_payload.sdk_sha }}', | |
| state: 'success', | |
| context: 'gpu-tests/cuda', | |
| description: 'GPU integration tests passed', | |
| target_url: `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}` | |
| }); | |
| - name: Set failure status on SDK PR | |
| if: failure() | |
| uses: actions/github-script@v7 | |
| with: | |
| github-token: ${{ secrets.SDK_REPO_PAT }} | |
| script: | | |
| await github.rest.repos.createCommitStatus({ | |
| owner: 'lloyal-ai', | |
| repo: 'sdk', | |
| sha: '${{ github.event.client_payload.sdk_sha }}', | |
| state: 'failure', | |
| context: 'gpu-tests/cuda', | |
| description: 'GPU integration tests failed', | |
| target_url: `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}` | |
| }); |