Skip to content

sdk-gpu-test

sdk-gpu-test #25

Workflow file for this run

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}`
});