mudler/LocalAI

27 workflows · maturity 67% · 11 patterns · GitHub ↗

Security 11.11/100

Security dimensions

permissions
2.8
security scan
8.3
supply chain
0
secret handling
0
harden runner
0

Tools: github/codeql-action/upload-sarif, securego/gosec

Workflows (27)

backend matrix .github/workflows/backend.yml
Triggers
push
Runs on
macos-latest, ubuntu-latest
Jobs
backend-jobs, backend-jobs-darwin, llama-cpp-darwin, llama-cpp-darwin-publish
Matrix
go-version, include, include.backend, include.base-image, include.build-type, include.context, include.cuda-major-version, include.cuda-minor-version, include.dockerfile, include.lang, include.platforms, include.runs-on, include.skip-drivers, include.tag-latest, include.tag-suffix, include.ubuntu-version→ , -cpu-ace-step, -cpu-acestep-cpp, -cpu-chatterbox, -cpu-diffusers, -cpu-fish-speech, -cpu-llama-cpp, -cpu-llama-cpp-quantization, -cpu-local-store, -cpu-mlx, -cpu-mlx-audio, -cpu-mlx-distributed, -cpu-mlx-vlm, -cpu-moonshine, -cpu-nemo, -cpu-neutts, -cpu-opus, -cpu-outetts, -cpu-pocket-tts, -cpu-qwen-asr, -cpu-qwen-tts, -cpu-rfdetr, -cpu-silero-vad, -cpu-stablediffusion-ggml, -cpu-trl, -cpu-vibevoice, -cpu-voxcpm, -cpu-voxtral, -cpu-whisper, -cpu-whisperx, -gpu-intel-ace-step, -gpu-intel-coqui, -gpu-intel-diffusers, -gpu-intel-faster-whisper, -gpu-intel-fish-speech, -gpu-intel-kokoro, -gpu-intel-nemo, -gpu-intel-pocket-tts, -gpu-intel-qwen-asr, -gpu-intel-qwen-tts, -gpu-intel-rerankers, -gpu-intel-rfdetr, -gpu-intel-sycl-f16-acestep-cpp, -gpu-intel-sycl-f16-llama-cpp, -gpu-intel-sycl-f16-stablediffusion-ggml, -gpu-intel-sycl-f16-whisper, -gpu-intel-sycl-f32-acestep-cpp, -gpu-intel-sycl-f32-llama-cpp, -gpu-intel-sycl-f32-stablediffusion-ggml, -gpu-intel-sycl-f32-whisper, -gpu-intel-transformers, -gpu-intel-vibevoice, -gpu-intel-vllm, -gpu-intel-voxcpm, -gpu-nvidia-cuda-12-ace-step, -gpu-nvidia-cuda-12-acestep-cpp, -gpu-nvidia-cuda-12-chatterbox, -gpu-nvidia-cuda-12-coqui, -gpu-nvidia-cuda-12-diffusers, -gpu-nvidia-cuda-12-faster-qwen3-tts, -gpu-nvidia-cuda-12-faster-whisper, -gpu-nvidia-cuda-12-fish-speech, -gpu-nvidia-cuda-12-kokoro, -gpu-nvidia-cuda-12-llama-cpp, -gpu-nvidia-cuda-12-mlx, -gpu-nvidia-cuda-12-mlx-audio, -gpu-nvidia-cuda-12-mlx-distributed, -gpu-nvidia-cuda-12-mlx-vlm, -gpu-nvidia-cuda-12-moonshine, -gpu-nvidia-cuda-12-nemo, -gpu-nvidia-cuda-12-neutts, -gpu-nvidia-cuda-12-outetts, -gpu-nvidia-cuda-12-pocket-tts, -gpu-nvidia-cuda-12-qwen-asr, -gpu-nvidia-cuda-12-qwen-tts, -gpu-nvidia-cuda-12-rerankers, -gpu-nvidia-cuda-12-rfdetr, -gpu-nvidia-cuda-12-stablediffusion-ggml, -gpu-nvidia-cuda-12-transformers, -gpu-nvidia-cuda-12-trl, -gpu-nvidia-cuda-12-vibevoice, -gpu-nvidia-cuda-12-vllm, -gpu-nvidia-cuda-12-vllm-omni, -gpu-nvidia-cuda-12-voxcpm, -gpu-nvidia-cuda-12-whisper, -gpu-nvidia-cuda-12-whisperx, -gpu-nvidia-cuda-13-ace-step, -gpu-nvidia-cuda-13-acestep-cpp, -gpu-nvidia-cuda-13-chatterbox, -gpu-nvidia-cuda-13-diffusers, -gpu-nvidia-cuda-13-faster-qwen3-tts, -gpu-nvidia-cuda-13-faster-whisper, -gpu-nvidia-cuda-13-fish-speech, -gpu-nvidia-cuda-13-kokoro, -gpu-nvidia-cuda-13-llama-cpp, -gpu-nvidia-cuda-13-mlx, -gpu-nvidia-cuda-13-mlx-audio, -gpu-nvidia-cuda-13-mlx-distributed, -gpu-nvidia-cuda-13-mlx-vlm, -gpu-nvidia-cuda-13-moonshine, -gpu-nvidia-cuda-13-nemo, -gpu-nvidia-cuda-13-pocket-tts, -gpu-nvidia-cuda-13-qwen-asr, -gpu-nvidia-cuda-13-qwen-tts, -gpu-nvidia-cuda-13-rerankers, -gpu-nvidia-cuda-13-rfdetr, -gpu-nvidia-cuda-13-stablediffusion-ggml, -gpu-nvidia-cuda-13-transformers, -gpu-nvidia-cuda-13-trl, -gpu-nvidia-cuda-13-vibevoice, -gpu-nvidia-cuda-13-voxcpm, -gpu-nvidia-cuda-13-whisper, -gpu-nvidia-cuda-13-whisperx, -gpu-rocm-hipblas-ace-step, -gpu-rocm-hipblas-acestep-cpp, -gpu-rocm-hipblas-coqui, -gpu-rocm-hipblas-diffusers, -gpu-rocm-hipblas-faster-whisper, -gpu-rocm-hipblas-fish-speech, -gpu-rocm-hipblas-kokoro, -gpu-rocm-hipblas-llama-cpp, -gpu-rocm-hipblas-nemo, -gpu-rocm-hipblas-neutts, -gpu-rocm-hipblas-pocket-tts, -gpu-rocm-hipblas-qwen-asr, -gpu-rocm-hipblas-qwen-tts, -gpu-rocm-hipblas-rerankers, -gpu-rocm-hipblas-transformers, -gpu-rocm-hipblas-vibevoice, -gpu-rocm-hipblas-vllm, -gpu-rocm-hipblas-vllm-omni, -gpu-rocm-hipblas-voxcpm, -gpu-rocm-hipblas-whisper, -gpu-rocm-hipblas-whisperx, -gpu-vulkan-acestep-cpp, -gpu-vulkan-llama-cpp, -gpu-vulkan-stablediffusion-ggml, -gpu-vulkan-whisper, -kitten-tts, -metal-darwin-arm64-ace-step, -metal-darwin-arm64-acestep-cpp, -metal-darwin-arm64-chatterbox, -metal-darwin-arm64-coqui, -metal-darwin-arm64-diffusers, -metal-darwin-arm64-faster-whisper, -metal-darwin-arm64-fish-speech, -metal-darwin-arm64-kitten-tts, -metal-darwin-arm64-kokoro, -metal-darwin-arm64-llama-cpp-quantization, -metal-darwin-arm64-local-store, -metal-darwin-arm64-mlx, -metal-darwin-arm64-mlx-audio, -metal-darwin-arm64-mlx-distributed, -metal-darwin-arm64-mlx-vlm, -metal-darwin-arm64-moonshine, -metal-darwin-arm64-nemo, -metal-darwin-arm64-opus, -metal-darwin-arm64-piper, -metal-darwin-arm64-pocket-tts, -metal-darwin-arm64-qwen-asr, -metal-darwin-arm64-qwen-tts, -metal-darwin-arm64-rerankers, -metal-darwin-arm64-rfdetr, -metal-darwin-arm64-silero-vad, -metal-darwin-arm64-stablediffusion-ggml, -metal-darwin-arm64-transformers, -metal-darwin-arm64-vibevoice, -metal-darwin-arm64-voxcpm, -metal-darwin-arm64-voxtral, -metal-darwin-arm64-whisper, -metal-darwin-arm64-whisperx, -nvidia-l4t-arm64-acestep-cpp, -nvidia-l4t-arm64-chatterbox, -nvidia-l4t-arm64-llama-cpp, -nvidia-l4t-arm64-rfdetr, -nvidia-l4t-arm64-stablediffusion-ggml, -nvidia-l4t-arm64-whisper, -nvidia-l4t-cuda-13-arm64-acestep-cpp, -nvidia-l4t-cuda-13-arm64-chatterbox, -nvidia-l4t-cuda-13-arm64-diffusers, -nvidia-l4t-cuda-13-arm64-faster-qwen3-tts, -nvidia-l4t-cuda-13-arm64-fish-speech, -nvidia-l4t-cuda-13-arm64-llama-cpp, -nvidia-l4t-cuda-13-arm64-mlx, -nvidia-l4t-cuda-13-arm64-mlx-audio, -nvidia-l4t-cuda-13-arm64-mlx-distributed, -nvidia-l4t-cuda-13-arm64-mlx-vlm, -nvidia-l4t-cuda-13-arm64-pocket-tts, -nvidia-l4t-cuda-13-arm64-qwen-asr, -nvidia-l4t-cuda-13-arm64-qwen-tts, -nvidia-l4t-cuda-13-arm64-stablediffusion-ggml, -nvidia-l4t-cuda-13-arm64-vibevoice, -nvidia-l4t-cuda-13-arm64-whisper, -nvidia-l4t-diffusers, -nvidia-l4t-faster-qwen3-tts, -nvidia-l4t-fish-speech, -nvidia-l4t-kokoro, -nvidia-l4t-mlx, -nvidia-l4t-mlx-audio, -nvidia-l4t-mlx-distributed, -nvidia-l4t-mlx-vlm, -nvidia-l4t-pocket-tts, -nvidia-l4t-qwen-asr, -nvidia-l4t-qwen-tts, -nvidia-l4t-vibevoice, -piper, ./, ./backend/Dockerfile.golang, ./backend/Dockerfile.llama-cpp, ./backend/Dockerfile.python, 0, 1.25.x, 12, 13, 2204, 2404, 8, 9, ace-step, acestep-cpp, arc-runner-set, auto, bigger-runner, chatterbox, coqui, cublas, diffusers, false, faster-qwen3-tts, faster-whisper, fish-speech, go, hipblas, intel, intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04, kitten-tts, kokoro, l4t, linux/amd64, linux/amd64,linux/arm64, linux/arm64, llama-cpp, llama-cpp-quantization, local-store, metal, mlx, mlx-audio, mlx-distributed, mlx-vlm, moonshine, mps, nemo, neutts, nvcr.io/nvidia/l4t-jetpack:r36.4.0, opus, outetts, piper, pocket-tts, qwen-asr, qwen-tts, rerankers, rfdetr, rocm/dev-ubuntu-24.04:6.4.4, silero-vad, stablediffusion-ggml, sycl_f16, sycl_f32, transformers, trl, true, ubuntu-24.04-arm, ubuntu-latest, ubuntu:24.04, vibevoice, vllm, vllm-omni, voxcpm, voxtral, vulkan, whisper, whisperx
Actions
docker/metadata-action, docker/metadata-action
Commands
  • go version
  • brew install protobuf grpc make protoc-gen-go protoc-gen-go-grpc libomp llvm
  • make protogen-go make backends/llama-cpp-darwin
  • curl -L https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz | tar -xz sudo mv crane /usr/local/bin/
  • echo "${{ secrets.DOCKERHUB_PASSWORD }}" | crane auth login docker.io -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin
  • echo "${{ secrets.LOCALAI_REGISTRY_PASSWORD }}" | crane auth login quay.io -u "${{ secrets.LOCALAI_REGISTRY_USERNAME }}" --password-stdin
  • for tag in $(echo "${{ steps.meta.outputs.tags }}" | tr ',' '\n'); do crane push llama-cpp.tar $tag done
  • for tag in $(echo "${{ steps.quaymeta.outputs.tags }}" | tr ',' '\n'); do crane push llama-cpp.tar $tag done
View raw YAML
---
name: 'build backend container images'

on:
  push:
    branches:
      - master
    tags:
      - '*'

concurrency:
  group: ci-backends-${{ github.head_ref || github.ref }}-${{ github.repository }}
  cancel-in-progress: true

jobs:
  backend-jobs:
    if: github.repository == 'mudler/LocalAI'
    uses: ./.github/workflows/backend_build.yml
    with:
      tag-latest: ${{ matrix.tag-latest }}
      tag-suffix: ${{ matrix.tag-suffix }}
      build-type: ${{ matrix.build-type }}
      cuda-major-version: ${{ matrix.cuda-major-version }}
      cuda-minor-version: ${{ matrix.cuda-minor-version }}
      platforms: ${{ matrix.platforms }}
      runs-on: ${{ matrix.runs-on }}
      base-image: ${{ matrix.base-image }}
      backend: ${{ matrix.backend }}
      dockerfile: ${{ matrix.dockerfile }}
      skip-drivers: ${{ matrix.skip-drivers }}
      context: ${{ matrix.context }}
      ubuntu-version: ${{ matrix.ubuntu-version }}
    secrets:
      dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }}
      dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }}
      quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }}
      quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }}
    strategy:
      fail-fast: false
      #max-parallel: ${{ github.event_name != 'pull_request' && 6 || 4 }}
      matrix:
        include:
          - build-type: 'l4t'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-diffusers'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            skip-drivers: 'true'
            backend: "diffusers"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2204'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-diffusers'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'true'
            backend: "diffusers"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-chatterbox'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'true'
            backend: "chatterbox"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-moonshine'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'true'
            backend: "moonshine"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-whisperx'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'true'
            backend: "whisperx"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-ace-step'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'true'
            backend: "ace-step"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-trl'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'true'
            backend: "trl"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-llama-cpp-quantization'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'true'
            backend: "llama-cpp-quantization"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-mlx'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'true'
            backend: "mlx"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-mlx-vlm'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'true'
            backend: "mlx-vlm"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-mlx-audio'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'true'
            backend: "mlx-audio"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-mlx-distributed'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'true'
            backend: "mlx-distributed"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          # CUDA 12 builds
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-vibevoice'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "vibevoice"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-qwen-asr'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "qwen-asr"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-nemo'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "nemo"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-qwen-tts'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "qwen-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-fish-speech'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "fish-speech"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-faster-qwen3-tts'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "faster-qwen3-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-voxcpm'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "voxcpm"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-pocket-tts'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "pocket-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-rerankers'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "rerankers"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-llama-cpp'
            runs-on: 'bigger-runner'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "llama-cpp"
            dockerfile: "./backend/Dockerfile.llama-cpp"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-vllm'
            runs-on: 'arc-runner-set'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "vllm"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-vllm-omni'
            runs-on: 'arc-runner-set'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "vllm-omni"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-transformers'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "transformers"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-diffusers'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "diffusers"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-ace-step'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "ace-step"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-trl'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "trl"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-kokoro'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "kokoro"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-faster-whisper'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "faster-whisper"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-whisperx'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "whisperx"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "9"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-coqui'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "coqui"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-outetts'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "outetts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-chatterbox'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "chatterbox"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-moonshine'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "moonshine"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-mlx'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "mlx"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-mlx-vlm'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "mlx-vlm"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-mlx-audio'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "mlx-audio"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-mlx-distributed'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "mlx-distributed"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-stablediffusion-ggml'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "stablediffusion-ggml"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-whisper'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "whisper"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-acestep-cpp'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "acestep-cpp"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-rfdetr'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "rfdetr"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "8"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-12-neutts'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "neutts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          # cuda 13
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-rerankers'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "rerankers"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-vibevoice'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "vibevoice"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-qwen-asr'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "qwen-asr"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-nemo'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "nemo"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-qwen-tts'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "qwen-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-fish-speech'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "fish-speech"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-faster-qwen3-tts'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "faster-qwen3-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-voxcpm'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "voxcpm"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-pocket-tts'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "pocket-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-llama-cpp'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "llama-cpp"
            dockerfile: "./backend/Dockerfile.llama-cpp"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            skip-drivers: 'false'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-cuda-13-arm64-llama-cpp'
            base-image: "ubuntu:24.04"
            runs-on: 'ubuntu-24.04-arm'
            ubuntu-version: '2404'
            backend: "llama-cpp"
            dockerfile: "./backend/Dockerfile.llama-cpp"
            context: "./"
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-transformers'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "transformers"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-diffusers'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "diffusers"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-ace-step'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "ace-step"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-trl'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "trl"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'l4t'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-cuda-13-arm64-vibevoice'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            ubuntu-version: '2404'
            backend: "vibevoice"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
          - build-type: 'l4t'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-cuda-13-arm64-qwen-asr'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            ubuntu-version: '2404'
            backend: "qwen-asr"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
          - build-type: 'l4t'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-cuda-13-arm64-qwen-tts'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            ubuntu-version: '2404'
            backend: "qwen-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
          - build-type: 'l4t'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-cuda-13-arm64-fish-speech'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            ubuntu-version: '2404'
            backend: "fish-speech"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
          - build-type: 'l4t'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-cuda-13-arm64-faster-qwen3-tts'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            ubuntu-version: '2404'
            backend: "faster-qwen3-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
          - build-type: 'l4t'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-cuda-13-arm64-pocket-tts'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            ubuntu-version: '2404'
            backend: "pocket-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
          - build-type: 'l4t'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-cuda-13-arm64-chatterbox'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            ubuntu-version: '2404'
            backend: "chatterbox"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
          - build-type: 'l4t'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-cuda-13-arm64-diffusers'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            ubuntu-version: '2404'
            backend: "diffusers"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
          - build-type: 'l4t'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-cuda-13-arm64-mlx'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            ubuntu-version: '2404'
            backend: "mlx"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
          - build-type: 'l4t'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-cuda-13-arm64-mlx-vlm'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            ubuntu-version: '2404'
            backend: "mlx-vlm"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
          - build-type: 'l4t'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-cuda-13-arm64-mlx-audio'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            ubuntu-version: '2404'
            backend: "mlx-audio"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
          - build-type: 'l4t'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-cuda-13-arm64-mlx-distributed'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            ubuntu-version: '2404'
            backend: "mlx-distributed"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-kokoro'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "kokoro"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-faster-whisper'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "faster-whisper"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-whisperx'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "whisperx"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-chatterbox'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "chatterbox"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-moonshine'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "moonshine"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-mlx'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "mlx"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-mlx-vlm'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "mlx-vlm"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-mlx-audio'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "mlx-audio"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-mlx-distributed'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "mlx-distributed"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-stablediffusion-ggml'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "stablediffusion-ggml"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            skip-drivers: 'false'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-cuda-13-arm64-stablediffusion-ggml'
            base-image: "ubuntu:24.04"
            ubuntu-version: '2404'
            runs-on: 'ubuntu-24.04-arm'
            backend: "stablediffusion-ggml"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-whisper'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "whisper"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            skip-drivers: 'false'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-cuda-13-arm64-whisper'
            base-image: "ubuntu:24.04"
            ubuntu-version: '2404'
            runs-on: 'ubuntu-24.04-arm'
            backend: "whisper"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-acestep-cpp'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "acestep-cpp"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            skip-drivers: 'false'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-cuda-13-arm64-acestep-cpp'
            base-image: "ubuntu:24.04"
            ubuntu-version: '2404'
            runs-on: 'ubuntu-24.04-arm'
            backend: "acestep-cpp"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
          - build-type: 'cublas'
            cuda-major-version: "13"
            cuda-minor-version: "0"
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-nvidia-cuda-13-rfdetr'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "rfdetr"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          # hipblas builds
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-rerankers'
            runs-on: 'ubuntu-latest'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "rerankers"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-llama-cpp'
            runs-on: 'ubuntu-latest'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "llama-cpp"
            dockerfile: "./backend/Dockerfile.llama-cpp"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-vllm'
            runs-on: 'arc-runner-set'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "vllm"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-vllm-omni'
            runs-on: 'arc-runner-set'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "vllm-omni"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-transformers'
            runs-on: 'arc-runner-set'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "transformers"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-diffusers'
            runs-on: 'arc-runner-set'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "diffusers"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-ace-step'
            runs-on: 'arc-runner-set'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "ace-step"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          # ROCm additional backends
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-kokoro'
            runs-on: 'arc-runner-set'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "kokoro"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-vibevoice'
            runs-on: 'arc-runner-set'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "vibevoice"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-qwen-asr'
            runs-on: 'arc-runner-set'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "qwen-asr"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-nemo'
            runs-on: 'arc-runner-set'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "nemo"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-qwen-tts'
            runs-on: 'arc-runner-set'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "qwen-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-fish-speech'
            runs-on: 'arc-runner-set'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "fish-speech"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-voxcpm'
            runs-on: 'arc-runner-set'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "voxcpm"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-pocket-tts'
            runs-on: 'arc-runner-set'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "pocket-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-faster-whisper'
            runs-on: 'bigger-runner'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "faster-whisper"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-whisperx'
            runs-on: 'bigger-runner'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "whisperx"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-coqui'
            runs-on: 'bigger-runner'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "coqui"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
            # sycl builds
          - build-type: 'intel'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-rerankers'
            runs-on: 'ubuntu-latest'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "rerankers"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'sycl_f32'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-sycl-f32-llama-cpp'
            runs-on: 'ubuntu-latest'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "llama-cpp"
            dockerfile: "./backend/Dockerfile.llama-cpp"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'sycl_f16'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-sycl-f16-llama-cpp'
            runs-on: 'ubuntu-latest'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "llama-cpp"
            dockerfile: "./backend/Dockerfile.llama-cpp"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'intel'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-vllm'
            runs-on: 'arc-runner-set'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "vllm"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'intel'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-transformers'
            runs-on: 'ubuntu-latest'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "transformers"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'intel'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-diffusers'
            runs-on: 'ubuntu-latest'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "diffusers"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'intel'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-ace-step'
            runs-on: 'ubuntu-latest'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "ace-step"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'l4t'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-vibevoice'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            skip-drivers: 'true'
            backend: "vibevoice"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2204'
          - build-type: 'l4t'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-qwen-asr'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            skip-drivers: 'true'
            backend: "qwen-asr"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2204'
          - build-type: 'l4t'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-qwen-tts'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            skip-drivers: 'true'
            backend: "qwen-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2204'
          - build-type: 'l4t'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-fish-speech'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            skip-drivers: 'true'
            backend: "fish-speech"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2204'
          - build-type: 'l4t'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-faster-qwen3-tts'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            skip-drivers: 'true'
            backend: "faster-qwen3-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2204'
          - build-type: 'l4t'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-pocket-tts'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            skip-drivers: 'true'
            backend: "pocket-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2204'
          - build-type: 'l4t'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-kokoro'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            skip-drivers: 'true'
            backend: "kokoro"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2204'
          - build-type: 'l4t'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-mlx'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            skip-drivers: 'true'
            backend: "mlx"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2204'
          - build-type: 'l4t'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-mlx-vlm'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            skip-drivers: 'true'
            backend: "mlx-vlm"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2204'
          - build-type: 'l4t'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-mlx-audio'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            skip-drivers: 'true'
            backend: "mlx-audio"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2204'
          - build-type: 'l4t'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-mlx-distributed'
            runs-on: 'ubuntu-24.04-arm'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            skip-drivers: 'true'
            backend: "mlx-distributed"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2204'
          # SYCL additional backends
          - build-type: 'intel'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-kokoro'
            runs-on: 'ubuntu-latest'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "kokoro"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'intel'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-faster-whisper'
            runs-on: 'ubuntu-latest'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "faster-whisper"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'intel'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-vibevoice'
            runs-on: 'arc-runner-set'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "vibevoice"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'intel'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-qwen-asr'
            runs-on: 'arc-runner-set'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "qwen-asr"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'intel'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-nemo'
            runs-on: 'arc-runner-set'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "nemo"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'intel'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-qwen-tts'
            runs-on: 'arc-runner-set'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "qwen-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'intel'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-fish-speech'
            runs-on: 'arc-runner-set'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "fish-speech"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'intel'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-voxcpm'
            runs-on: 'arc-runner-set'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "voxcpm"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'intel'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-pocket-tts'
            runs-on: 'arc-runner-set'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "pocket-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'intel'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-coqui'
            runs-on: 'ubuntu-latest'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "coqui"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          # piper
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-piper'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "piper"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-llama-cpp'
            runs-on: 'bigger-runner'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "llama-cpp"
            dockerfile: "./backend/Dockerfile.llama-cpp"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            skip-drivers: 'false'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-arm64-llama-cpp'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            runs-on: 'ubuntu-24.04-arm'
            backend: "llama-cpp"
            dockerfile: "./backend/Dockerfile.llama-cpp"
            context: "./"
            ubuntu-version: '2204'
          - build-type: 'vulkan'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-vulkan-llama-cpp'
            runs-on: 'bigger-runner'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "llama-cpp"
            dockerfile: "./backend/Dockerfile.llama-cpp"
            context: "./"
            ubuntu-version: '2404'
          # Stablediffusion-ggml
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-stablediffusion-ggml'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "stablediffusion-ggml"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'sycl_f32'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-sycl-f32-stablediffusion-ggml'
            runs-on: 'ubuntu-latest'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "stablediffusion-ggml"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'sycl_f16'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-sycl-f16-stablediffusion-ggml'
            runs-on: 'ubuntu-latest'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "stablediffusion-ggml"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'vulkan'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-vulkan-stablediffusion-ggml'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "stablediffusion-ggml"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            skip-drivers: 'false'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-arm64-stablediffusion-ggml'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            runs-on: 'ubuntu-24.04-arm'
            backend: "stablediffusion-ggml"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2204'
          # whisper
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-whisper'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "whisper"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'sycl_f32'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-sycl-f32-whisper'
            runs-on: 'ubuntu-latest'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "whisper"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'sycl_f16'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-sycl-f16-whisper'
            runs-on: 'ubuntu-latest'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "whisper"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'vulkan'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-vulkan-whisper'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "whisper"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            skip-drivers: 'false'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-arm64-whisper'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            runs-on: 'ubuntu-24.04-arm'
            backend: "whisper"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2204'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-whisper'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            runs-on: 'ubuntu-latest'
            skip-drivers: 'false'
            backend: "whisper"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          # acestep-cpp
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-acestep-cpp'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "acestep-cpp"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'sycl_f32'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-sycl-f32-acestep-cpp'
            runs-on: 'ubuntu-latest'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "acestep-cpp"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'sycl_f16'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-sycl-f16-acestep-cpp'
            runs-on: 'ubuntu-latest'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "acestep-cpp"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'vulkan'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-vulkan-acestep-cpp'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "acestep-cpp"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'cublas'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            skip-drivers: 'false'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-arm64-acestep-cpp'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            runs-on: 'ubuntu-24.04-arm'
            backend: "acestep-cpp"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2204'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-acestep-cpp'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            runs-on: 'ubuntu-latest'
            skip-drivers: 'false'
            backend: "acestep-cpp"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          # voxtral
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-voxtral'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "voxtral"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          #opus
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-opus'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "opus"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          #silero-vad
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-silero-vad'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "silero-vad"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          # local-store
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-local-store'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "local-store"
            dockerfile: "./backend/Dockerfile.golang"
            context: "./"
            ubuntu-version: '2404'
          # rfdetr
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-rfdetr'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "rfdetr"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'intel'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-intel-rfdetr'
            runs-on: 'ubuntu-latest'
            base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
            skip-drivers: 'false'
            backend: "rfdetr"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'l4t'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            skip-drivers: 'true'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-arm64-rfdetr'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            runs-on: 'ubuntu-24.04-arm'
            backend: "rfdetr"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2204'
          - build-type: 'l4t'
            cuda-major-version: "12"
            cuda-minor-version: "0"
            platforms: 'linux/arm64'
            skip-drivers: 'true'
            tag-latest: 'auto'
            tag-suffix: '-nvidia-l4t-arm64-chatterbox'
            base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
            runs-on: 'ubuntu-24.04-arm'
            backend: "chatterbox"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2204'
          # runs out of space on the runner
          # - build-type: 'hipblas'
          #   cuda-major-version: ""
          #   cuda-minor-version: ""
          #   platforms: 'linux/amd64'
          #   tag-latest: 'auto'
          #   tag-suffix: '-gpu-hipblas-rfdetr'
          #   base-image: "rocm/dev-ubuntu-24.04:6.4.4"
          #   runs-on: 'ubuntu-latest'
          #   skip-drivers: 'false'
          #   backend: "rfdetr"
          #   dockerfile: "./backend/Dockerfile.python"
          #   context: "./"
          # kitten-tts
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-kitten-tts'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "kitten-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          # neutts
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-neutts'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "neutts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: 'hipblas'
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-gpu-rocm-hipblas-neutts'
            runs-on: 'arc-runner-set'
            base-image: "rocm/dev-ubuntu-24.04:6.4.4"
            skip-drivers: 'false'
            backend: "neutts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-vibevoice'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "vibevoice"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-qwen-asr'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "qwen-asr"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-nemo'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "nemo"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-qwen-tts'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "qwen-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-fish-speech'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "fish-speech"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-voxcpm'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "voxcpm"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64,linux/arm64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-pocket-tts'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'false'
            backend: "pocket-tts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
          - build-type: ''
            cuda-major-version: ""
            cuda-minor-version: ""
            platforms: 'linux/amd64'
            tag-latest: 'auto'
            tag-suffix: '-cpu-outetts'
            runs-on: 'ubuntu-latest'
            base-image: "ubuntu:24.04"
            skip-drivers: 'true'
            backend: "outetts"
            dockerfile: "./backend/Dockerfile.python"
            context: "./"
            ubuntu-version: '2404'
  backend-jobs-darwin:
    uses: ./.github/workflows/backend_build_darwin.yml
    strategy:
      matrix:
        include:
          - backend: "diffusers"
            tag-suffix: "-metal-darwin-arm64-diffusers"
            build-type: "mps"
          - backend: "ace-step"
            tag-suffix: "-metal-darwin-arm64-ace-step"
            build-type: "mps"
          - backend: "mlx"
            tag-suffix: "-metal-darwin-arm64-mlx"
            build-type: "mps"
          - backend: "chatterbox"
            tag-suffix: "-metal-darwin-arm64-chatterbox"
            build-type: "mps"
          - backend: "mlx-vlm"
            tag-suffix: "-metal-darwin-arm64-mlx-vlm"
            build-type: "mps"
          - backend: "mlx-audio"
            tag-suffix: "-metal-darwin-arm64-mlx-audio"
            build-type: "mps"
          - backend: "mlx-distributed"
            tag-suffix: "-metal-darwin-arm64-mlx-distributed"
            build-type: "mps"
          - backend: "stablediffusion-ggml"
            tag-suffix: "-metal-darwin-arm64-stablediffusion-ggml"
            build-type: "metal"
            lang: "go"
          - backend: "whisper"
            tag-suffix: "-metal-darwin-arm64-whisper"
            build-type: "metal"
            lang: "go"
          - backend: "acestep-cpp"
            tag-suffix: "-metal-darwin-arm64-acestep-cpp"
            build-type: "metal"
            lang: "go"
          - backend: "voxtral"
            tag-suffix: "-metal-darwin-arm64-voxtral"
            build-type: "metal"
            lang: "go"
          - backend: "vibevoice"
            tag-suffix: "-metal-darwin-arm64-vibevoice"
            build-type: "mps"
          - backend: "qwen-asr"
            tag-suffix: "-metal-darwin-arm64-qwen-asr"
            build-type: "mps"
          - backend: "nemo"
            tag-suffix: "-metal-darwin-arm64-nemo"
            build-type: "mps"
          - backend: "qwen-tts"
            tag-suffix: "-metal-darwin-arm64-qwen-tts"
            build-type: "mps"
          - backend: "fish-speech"
            tag-suffix: "-metal-darwin-arm64-fish-speech"
            build-type: "mps"
          - backend: "voxcpm"
            tag-suffix: "-metal-darwin-arm64-voxcpm"
            build-type: "mps"
          - backend: "pocket-tts"
            tag-suffix: "-metal-darwin-arm64-pocket-tts"
            build-type: "mps"
          - backend: "moonshine"
            tag-suffix: "-metal-darwin-arm64-moonshine"
            build-type: "mps"
          - backend: "whisperx"
            tag-suffix: "-metal-darwin-arm64-whisperx"
            build-type: "mps"
          - backend: "rerankers"
            tag-suffix: "-metal-darwin-arm64-rerankers"
            build-type: "mps"
          - backend: "transformers"
            tag-suffix: "-metal-darwin-arm64-transformers"
            build-type: "mps"
          - backend: "kokoro"
            tag-suffix: "-metal-darwin-arm64-kokoro"
            build-type: "mps"
          - backend: "faster-whisper"
            tag-suffix: "-metal-darwin-arm64-faster-whisper"
            build-type: "mps"
          - backend: "coqui"
            tag-suffix: "-metal-darwin-arm64-coqui"
            build-type: "mps"
          - backend: "rfdetr"
            tag-suffix: "-metal-darwin-arm64-rfdetr"
            build-type: "mps"
          - backend: "kitten-tts"
            tag-suffix: "-metal-darwin-arm64-kitten-tts"
            build-type: "mps"
          - backend: "piper"
            tag-suffix: "-metal-darwin-arm64-piper"
            build-type: "metal"
            lang: "go"
          - backend: "opus"
            tag-suffix: "-metal-darwin-arm64-opus"
            build-type: "metal"
            lang: "go"
          - backend: "silero-vad"
            tag-suffix: "-metal-darwin-arm64-silero-vad"
            build-type: "metal"
            lang: "go"
          - backend: "local-store"
            tag-suffix: "-metal-darwin-arm64-local-store"
            build-type: "metal"
            lang: "go"
          - backend: "llama-cpp-quantization"
            tag-suffix: "-metal-darwin-arm64-llama-cpp-quantization"
            build-type: "mps"
    with:
      backend: ${{ matrix.backend }}
      build-type: ${{ matrix.build-type }}
      go-version: "1.24.x"
      tag-suffix: ${{ matrix.tag-suffix }}
      lang: ${{ matrix.lang || 'python' }}
      use-pip: ${{ matrix.backend == 'diffusers' }}
      runs-on: "macos-latest"
    secrets:
      dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }}
      dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }}
      quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }}
      quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }}
  llama-cpp-darwin:
    runs-on: macos-latest
    strategy:
      matrix:
        go-version: ['1.25.x']
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Setup Go ${{ matrix.go-version }}
        uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go-version }}
          cache: false
      # You can test your matrix by printing the current Go version
      - name: Display Go version
        run: go version
      - name: Dependencies
        run: |
          brew install protobuf grpc make protoc-gen-go protoc-gen-go-grpc libomp llvm
      - name: Build llama-cpp-darwin
        run: |
          make protogen-go
          make backends/llama-cpp-darwin
      - name: Upload llama-cpp.tar
        uses: actions/upload-artifact@v7
        with:
          name: llama-cpp-tar
          path: backend-images/llama-cpp.tar
  llama-cpp-darwin-publish:
    needs: llama-cpp-darwin
    if: github.event_name != 'pull_request'
    runs-on: ubuntu-latest
    steps:
      - name: Download llama-cpp.tar
        uses: actions/download-artifact@v8
        with:
          name: llama-cpp-tar
          path: .
      - name: Install crane
        run: |
          curl -L https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz | tar -xz
          sudo mv crane /usr/local/bin/
      - name: Log in to DockerHub
        run: |
          echo "${{ secrets.DOCKERHUB_PASSWORD }}" | crane auth login docker.io -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin
      - name: Log in to quay.io
        run: |
          echo "${{ secrets.LOCALAI_REGISTRY_PASSWORD }}" | crane auth login quay.io -u "${{ secrets.LOCALAI_REGISTRY_USERNAME }}" --password-stdin
      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v6
        with:
          images: |
            localai/localai-backends
          tags: |
            type=ref,event=branch
            type=semver,pattern={{raw}}
            type=sha
          flavor: |
            latest=auto
            suffix=-metal-darwin-arm64-llama-cpp,onlatest=true
      - name: Docker meta
        id: quaymeta
        uses: docker/metadata-action@v6
        with:
          images: |
            quay.io/go-skynet/local-ai-backends
          tags: |
            type=ref,event=branch
            type=semver,pattern={{raw}}
            type=sha
          flavor: |
            latest=auto
            suffix=-metal-darwin-arm64-llama-cpp,onlatest=true
      - name: Push Docker image (DockerHub)
        run: |
          for tag in $(echo "${{ steps.meta.outputs.tags }}" | tr ',' '\n'); do
            crane push llama-cpp.tar $tag
          done
      - name: Push Docker image (Quay)
        run: |
          for tag in $(echo "${{ steps.quaymeta.outputs.tags }}" | tr ',' '\n'); do
            crane push llama-cpp.tar $tag
          done
backend_build .github/workflows/backend_build.yml
Triggers
workflow_call
Runs on
${{ inputs.runs-on }}
Jobs
backend-build
Actions
jlumbroso/free-disk-space, docker/metadata-action, docker/metadata-action, docker/setup-qemu-action, docker/setup-buildx-action, docker/login-action, docker/login-action, docker/build-push-action, docker/build-push-action
Commands
  • sudo apt-get update \ && sudo apt-get install -y software-properties-common \ && sudo apt-get update \ && sudo add-apt-repository -y ppa:git-core/ppa \ && sudo apt-get update \ && sudo apt-get install -y git
  • echo "Listing top largest packages" pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr) head -n 30 <<< "${pkgs}" echo df -h echo sudo apt-get remove -y '^llvm-.*|^libllvm.*' || true sudo apt-get remove --auto-remove android-sdk-platform-tools snapd || true sudo apt-get purge --auto-remove android-sdk-platform-tools snapd || true sudo rm -rf /usr/local/lib/android sudo apt-get remove -y '^dotnet-.*|^aspnetcore-.*' || true sudo rm -rf /usr/share/dotnet sudo apt-get remove -y '^mono-.*' || true sudo apt-get remove -y '^ghc-.*' || true sudo apt-get remove -y '.*jdk.*|.*jre.*' || true sudo apt-get remove -y 'php.*' || true sudo apt-get remove -y hhvm powershell firefox monodoc-manual msbuild || true sudo apt-get remove -y '^google-.*' || true sudo apt-get remove -y azure-cli || true sudo apt-get remove -y '^mongo.*-.*|^postgresql-.*|^mysql-.*|^mssql-.*' || true sudo apt-get remove -y '^gfortran-.*' || true sudo apt-get remove -y microsoft-edge-stable || true sudo apt-get remove -y firefox || true sudo apt-get remove -y powershell || true sudo apt-get remove -y r-base-core || true sudo apt-get autoremove -y sudo apt-get clean echo echo "Listing top largest packages" pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr) head -n 30 <<< "${pkgs}" echo sudo rm -rfv build || true sudo rm -rf /usr/share/dotnet || true sudo rm -rf /opt/ghc || true sudo rm -rf "/usr/local/share/boost" || true sudo rm -rf "$AGENT_TOOLSDIRECTORY" || true df -h
  • echo "Built image: ${{ steps.meta.outputs.labels }}" >> $GITHUB_STEP_SUMMARY
View raw YAML
---
name: 'build backend container images (reusable)'

on:
  workflow_call:
    inputs:
      base-image:
        description: 'Base image'
        required: true
        type: string
      build-type:
        description: 'Build type'
        default: ''
        type: string
      cuda-major-version:
        description: 'CUDA major version'
        default: "12"
        type: string
      cuda-minor-version:
        description: 'CUDA minor version'
        default: "1"
        type: string
      platforms:
        description: 'Platforms'
        default: ''
        type: string
      tag-latest:
        description: 'Tag latest'
        default: ''
        type: string
      tag-suffix:
        description: 'Tag suffix'
        default: ''
        type: string
      runs-on:
        description: 'Runs on'
        required: true
        default: ''
        type: string
      backend:
        description: 'Backend to build'
        required: true
        type: string
      context:
        description: 'Build context'
        required: true
        type: string
      dockerfile:
        description: 'Build Dockerfile'
        required: true
        type: string
      skip-drivers:
        description: 'Skip drivers'
        default: 'false'
        type: string
      ubuntu-version:
        description: 'Ubuntu version'
        required: false
        default: '2204'
        type: string
    secrets:
      dockerUsername:
        required: false
      dockerPassword:
        required: false
      quayUsername:
        required: true
      quayPassword:
        required: true

jobs:
  backend-build:
    runs-on: ${{ inputs.runs-on }}
    env:
        quay_username: ${{ secrets.quayUsername }}
    steps:


      - name: Free Disk Space (Ubuntu)
        if: inputs.runs-on == 'ubuntu-latest'
        uses: jlumbroso/free-disk-space@main
        with:
          # this might remove tools that are actually needed,
          # if set to "true" but frees about 6 GB
          tool-cache: true
          # all of these default to true, but feel free to set to
          # "false" if necessary for your workflow
          android: true
          dotnet: true
          haskell: true
          large-packages: true
          docker-images: true
          swap-storage: true

      - name: Force Install GIT latest
        run: |
          sudo apt-get update \
          && sudo apt-get install -y software-properties-common \
          && sudo apt-get update \
          && sudo add-apt-repository -y ppa:git-core/ppa \
          && sudo apt-get update \
          && sudo apt-get install -y git

      - name: Checkout
        uses: actions/checkout@v6

      - name: Release space from worker
        if: inputs.runs-on == 'ubuntu-latest'
        run: |
          echo "Listing top largest packages"
          pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr)
          head -n 30 <<< "${pkgs}"
          echo
          df -h
          echo
          sudo apt-get remove -y '^llvm-.*|^libllvm.*' || true
          sudo apt-get remove --auto-remove android-sdk-platform-tools snapd || true
          sudo apt-get purge --auto-remove android-sdk-platform-tools snapd || true
          sudo rm -rf /usr/local/lib/android
          sudo apt-get remove -y '^dotnet-.*|^aspnetcore-.*' || true
          sudo rm -rf /usr/share/dotnet
          sudo apt-get remove -y '^mono-.*' || true
          sudo apt-get remove -y '^ghc-.*' || true
          sudo apt-get remove -y '.*jdk.*|.*jre.*' || true
          sudo apt-get remove -y 'php.*' || true
          sudo apt-get remove -y hhvm powershell firefox monodoc-manual msbuild || true
          sudo apt-get remove -y '^google-.*' || true
          sudo apt-get remove -y azure-cli || true
          sudo apt-get remove -y '^mongo.*-.*|^postgresql-.*|^mysql-.*|^mssql-.*' || true
          sudo apt-get remove -y '^gfortran-.*' || true
          sudo apt-get remove -y microsoft-edge-stable || true
          sudo apt-get remove -y firefox || true
          sudo apt-get remove -y powershell || true
          sudo apt-get remove -y r-base-core || true
          sudo apt-get autoremove -y
          sudo apt-get clean
          echo
          echo "Listing top largest packages"
          pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr)
          head -n 30 <<< "${pkgs}"
          echo
          sudo rm -rfv build || true
          sudo rm -rf /usr/share/dotnet || true
          sudo rm -rf /opt/ghc || true
          sudo rm -rf "/usr/local/share/boost" || true
          sudo rm -rf "$AGENT_TOOLSDIRECTORY" || true
          df -h

      - name: Docker meta
        id: meta
        if: github.event_name != 'pull_request'
        uses: docker/metadata-action@v6
        with:
          images: |
            quay.io/go-skynet/local-ai-backends
            localai/localai-backends
          tags: |
            type=ref,event=branch
            type=semver,pattern={{raw}}
            type=sha
          flavor: |
            latest=${{ inputs.tag-latest }}
            suffix=${{ inputs.tag-suffix }},onlatest=true

      - name: Docker meta for PR
        id: meta_pull_request
        if: github.event_name == 'pull_request'
        uses: docker/metadata-action@v6
        with:
          images: |
            quay.io/go-skynet/ci-tests
          tags: |
            type=ref,event=branch,suffix=${{ github.event.number }}-${{ inputs.backend }}-${{ inputs.build-type }}-${{ inputs.cuda-major-version }}-${{ inputs.cuda-minor-version }}
            type=semver,pattern={{raw}},suffix=${{ github.event.number }}-${{ inputs.backend }}-${{ inputs.build-type }}-${{ inputs.cuda-major-version }}-${{ inputs.cuda-minor-version }}
            type=sha,suffix=${{ github.event.number }}-${{ inputs.backend }}-${{ inputs.build-type }}-${{ inputs.cuda-major-version }}-${{ inputs.cuda-minor-version }}
          flavor: |
            latest=${{ inputs.tag-latest }}
            suffix=${{ inputs.tag-suffix }},onlatest=true
## End testing image
      - name: Set up QEMU
        uses: docker/setup-qemu-action@master
        with:
          platforms: all

      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@master

      - name: Login to DockerHub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v4
        with:
          username: ${{ secrets.dockerUsername }}
          password: ${{ secrets.dockerPassword }}

      - name: Login to Quay.io
        if: ${{ env.quay_username != '' }}
        uses: docker/login-action@v4
        with:
          registry: quay.io
          username: ${{ secrets.quayUsername }}
          password: ${{ secrets.quayPassword }}

      - name: Build and push
        uses: docker/build-push-action@v7
        if: github.event_name != 'pull_request'
        with:
          builder: ${{ steps.buildx.outputs.name }}
          build-args: |
            BUILD_TYPE=${{ inputs.build-type }}
            SKIP_DRIVERS=${{ inputs.skip-drivers }}
            CUDA_MAJOR_VERSION=${{ inputs.cuda-major-version }}
            CUDA_MINOR_VERSION=${{ inputs.cuda-minor-version }}
            BASE_IMAGE=${{ inputs.base-image }}
            BACKEND=${{ inputs.backend }}
            UBUNTU_VERSION=${{ inputs.ubuntu-version }}
          context: ${{ inputs.context }}
          file: ${{ inputs.dockerfile }}
          cache-from: type=gha
          platforms: ${{ inputs.platforms }}
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

      - name: Build and push (PR)
        uses: docker/build-push-action@v7
        if: github.event_name == 'pull_request'
        with:
          builder: ${{ steps.buildx.outputs.name }}
          build-args: |
            BUILD_TYPE=${{ inputs.build-type }}
            SKIP_DRIVERS=${{ inputs.skip-drivers }}
            CUDA_MAJOR_VERSION=${{ inputs.cuda-major-version }}
            CUDA_MINOR_VERSION=${{ inputs.cuda-minor-version }}
            BASE_IMAGE=${{ inputs.base-image }}
            BACKEND=${{ inputs.backend }}
            UBUNTU_VERSION=${{ inputs.ubuntu-version }}
          context: ${{ inputs.context }}
          file: ${{ inputs.dockerfile }}
          cache-from: type=gha
          platforms: ${{ inputs.platforms }}
          push: ${{ env.quay_username != '' }}
          tags: ${{ steps.meta_pull_request.outputs.tags }}
          labels: ${{ steps.meta_pull_request.outputs.labels }}



      - name: job summary
        run: |
          echo "Built image: ${{ steps.meta.outputs.labels }}" >> $GITHUB_STEP_SUMMARY
backend_build_darwin matrix .github/workflows/backend_build_darwin.yml
Triggers
workflow_call
Runs on
${{ inputs.runs-on }}, ubuntu-latest
Jobs
darwin-backend-build, darwin-backend-publish
Matrix
go-version→ ${{ inputs.go-version }}
Actions
docker/metadata-action, docker/metadata-action
Commands
  • go version
  • brew install protobuf grpc make protoc-gen-go protoc-gen-go-grpc libomp llvm
  • make protogen-go BACKEND=${{ inputs.backend }} BUILD_TYPE=${{ inputs.build-type }} USE_PIP=${{ inputs.use-pip }} make build-darwin-${{ inputs.lang }}-backend
  • curl -L https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz | tar -xz sudo mv crane /usr/local/bin/
  • echo "${{ secrets.dockerPassword }}" | crane auth login docker.io -u "${{ secrets.dockerUsername }}" --password-stdin
  • echo "${{ secrets.quayPassword }}" | crane auth login quay.io -u "${{ secrets.quayUsername }}" --password-stdin
  • for tag in $(echo "${{ steps.meta.outputs.tags }}" | tr ',' '\n'); do crane push ${{ inputs.backend }}.tar $tag done
  • for tag in $(echo "${{ steps.quaymeta.outputs.tags }}" | tr ',' '\n'); do crane push ${{ inputs.backend }}.tar $tag done
View raw YAML
---
name: 'build darwin python backend container images (reusable)'

on:
  workflow_call:
    inputs:
      backend:
        description: 'Backend to build'
        required: true
        type: string
      build-type:
        description: 'Build type (e.g., mps)'
        default: ''
        type: string
      use-pip:
        description: 'Use pip to install dependencies'
        default: false
        type: boolean
      lang:
        description: 'Programming language (e.g. go)'
        default: 'python'
        type: string
      go-version:
        description: 'Go version to use'
        default: '1.24.x'
        type: string
      tag-suffix:
        description: 'Tag suffix for the built image'
        required: true
        type: string
      runs-on:
        description: 'Runner to use'
        default: 'macOS-14'
        type: string
    secrets:
      dockerUsername:
        required: false
      dockerPassword:
        required: false
      quayUsername:
        required: true
      quayPassword:
        required: true

jobs:
  darwin-backend-build:
    runs-on: ${{ inputs.runs-on }}
    strategy:
      matrix:
        go-version: ['${{ inputs.go-version }}']
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true

      - name: Setup Go ${{ matrix.go-version }}
        uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go-version }}
          cache: false

      # You can test your matrix by printing the current Go version
      - name: Display Go version
        run: go version

      - name: Dependencies
        run: |
          brew install protobuf grpc make protoc-gen-go protoc-gen-go-grpc libomp llvm

      - name: Build ${{ inputs.backend }}-darwin
        run: |
          make protogen-go
          BACKEND=${{ inputs.backend }} BUILD_TYPE=${{ inputs.build-type }} USE_PIP=${{ inputs.use-pip }} make build-darwin-${{ inputs.lang }}-backend

      - name: Upload ${{ inputs.backend }}.tar
        uses: actions/upload-artifact@v7
        with:
          name: ${{ inputs.backend }}-tar
          path: backend-images/${{ inputs.backend }}.tar

  darwin-backend-publish:
    needs: darwin-backend-build
    if: github.event_name != 'pull_request'
    runs-on: ubuntu-latest
    steps:
      - name: Download ${{ inputs.backend }}.tar
        uses: actions/download-artifact@v8
        with:
          name: ${{ inputs.backend }}-tar
          path: .

      - name: Install crane
        run: |
          curl -L https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz | tar -xz
          sudo mv crane /usr/local/bin/

      - name: Log in to DockerHub
        run: |
          echo "${{ secrets.dockerPassword }}" | crane auth login docker.io -u "${{ secrets.dockerUsername }}" --password-stdin

      - name: Log in to quay.io
        run: |
          echo "${{ secrets.quayPassword }}" | crane auth login quay.io -u "${{ secrets.quayUsername }}" --password-stdin

      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v6
        with:
          images: |
            localai/localai-backends
          tags: |
            type=ref,event=branch
            type=semver,pattern={{raw}}
            type=sha
          flavor: |
            latest=auto
            suffix=${{ inputs.tag-suffix }},onlatest=true

      - name: Docker meta
        id: quaymeta
        uses: docker/metadata-action@v6
        with:
          images: |
            quay.io/go-skynet/local-ai-backends
          tags: |
            type=ref,event=branch
            type=semver,pattern={{raw}}
            type=sha
          flavor: |
            latest=auto
            suffix=${{ inputs.tag-suffix }},onlatest=true

      - name: Push Docker image (DockerHub)
        run: |
          for tag in $(echo "${{ steps.meta.outputs.tags }}" | tr ',' '\n'); do
            crane push ${{ inputs.backend }}.tar $tag
          done

      - name: Push Docker image (Quay)
        run: |
          for tag in $(echo "${{ steps.quaymeta.outputs.tags }}" | tr ',' '\n'); do
            crane push ${{ inputs.backend }}.tar $tag
          done
backend_pr matrix .github/workflows/backend_pr.yml
Triggers
pull_request
Runs on
ubuntu-latest
Jobs
generate-matrix, backend-jobs, backend-jobs-darwin
Matrix
Actions
oven-sh/setup-bun
Commands
  • bun add js-yaml bun add @octokit/core
  • bun run scripts/changed-backends.js
View raw YAML
name: 'build backend container images (PR-filtered)'

on:
  pull_request:

concurrency:
  group: ci-backends-pr-${{ github.head_ref || github.ref }}-${{ github.repository }}
  cancel-in-progress: true

jobs:
  generate-matrix:
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
      matrix-darwin: ${{ steps.set-matrix.outputs.matrix-darwin }}
      has-backends: ${{ steps.set-matrix.outputs.has-backends }}
      has-backends-darwin: ${{ steps.set-matrix.outputs.has-backends-darwin }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Setup Bun
        uses: oven-sh/setup-bun@v2

      - name: Install dependencies
        run: |
          bun add js-yaml
          bun add @octokit/core

      # filters the matrix in backend.yml
      - name: Filter matrix for changed backends
        id: set-matrix
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GITHUB_EVENT_PATH: ${{ github.event_path }}
        run: bun run scripts/changed-backends.js

  backend-jobs:
    needs: generate-matrix
    uses: ./.github/workflows/backend_build.yml
    if: needs.generate-matrix.outputs.has-backends == 'true'
    with:
      tag-latest: ${{ matrix.tag-latest }}
      tag-suffix: ${{ matrix.tag-suffix }}
      build-type: ${{ matrix.build-type }}
      cuda-major-version: ${{ matrix.cuda-major-version }}
      cuda-minor-version: ${{ matrix.cuda-minor-version }}
      platforms: ${{ matrix.platforms }}
      runs-on: ${{ matrix.runs-on }}
      base-image: ${{ matrix.base-image }}
      backend: ${{ matrix.backend }}
      dockerfile: ${{ matrix.dockerfile }}
      skip-drivers: ${{ matrix.skip-drivers }}
      context: ${{ matrix.context }}
      ubuntu-version: ${{ matrix.ubuntu-version }}
    secrets:
      quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }}
      quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }}
    strategy:
      fail-fast: true
      matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }}
  backend-jobs-darwin:
    needs: generate-matrix
    uses: ./.github/workflows/backend_build_darwin.yml
    if: needs.generate-matrix.outputs.has-backends-darwin == 'true'
    with:
      backend: ${{ matrix.backend }}
      build-type: ${{ matrix.build-type }}
      go-version: "1.24.x"
      tag-suffix: ${{ matrix.tag-suffix }}
      lang: ${{ matrix.lang || 'python' }}
      use-pip: ${{ matrix.backend == 'diffusers' }}
      runs-on: "macos-latest"
    secrets:
      quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }}
      quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }}
    strategy:
      fail-fast: true
      matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix-darwin) }}
build-test .github/workflows/build-test.yaml
Triggers
push, pull_request
Runs on
ubuntu-latest, macos-latest, ubuntu-latest
Jobs
build-test, launcher-build-darwin, launcher-build-linux
Commands
  • make dev-dist
  • make build-launcher-darwin ls -liah dist
  • sudo apt-get update sudo apt-get install golang gcc libgl1-mesa-dev xorg-dev libxkbcommon-dev make build-launcher-linux
View raw YAML
name: Build test

on:
  push:
    branches:
      - master
  pull_request:

jobs:
  build-test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: 1.25
      - name: Run GoReleaser
        run: |
          make dev-dist
  launcher-build-darwin:
    runs-on: macos-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: 1.25
      - name: Build launcher for macOS ARM64
        run: |
          make build-launcher-darwin
          ls -liah dist
      - name: Upload macOS launcher artifacts
        uses: actions/upload-artifact@v7
        with:
          name: launcher-macos
          path: dist/
          retention-days: 30
      
  launcher-build-linux:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: 1.25
      - name: Build launcher for Linux
        run: |
          sudo apt-get update
          sudo apt-get install golang gcc libgl1-mesa-dev xorg-dev libxkbcommon-dev
          make build-launcher-linux
      - name: Upload Linux launcher artifacts
        uses: actions/upload-artifact@v7
        with:
          name: launcher-linux
          path: local-ai-launcher-linux.tar.xz
          retention-days: 30
bump-inference-defaults perms .github/workflows/bump-inference-defaults.yml
Triggers
schedule, workflow_dispatch
Runs on
ubuntu-latest
Jobs
bump
Actions
peter-evans/create-pull-request
Commands
  • make generate-force
  • if git diff --quiet core/config/inference_defaults.json; then echo "changed=false" >> "$GITHUB_OUTPUT" else echo "changed=true" >> "$GITHUB_OUTPUT" fi
View raw YAML
name: Bump inference defaults

on:
  schedule:
    # Run daily at 06:00 UTC
    - cron: '0 6 * * *'
  workflow_dispatch: # Allow manual trigger

permissions:
  contents: write
  pull-requests: write

jobs:
  bump:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - uses: actions/setup-go@v5
        with:
          go-version-file: go.mod

      - name: Re-fetch inference defaults
        run: make generate-force

      - name: Check for changes
        id: diff
        run: |
          if git diff --quiet core/config/inference_defaults.json; then
            echo "changed=false" >> "$GITHUB_OUTPUT"
          else
            echo "changed=true" >> "$GITHUB_OUTPUT"
          fi

      - name: Create Pull Request
        if: steps.diff.outputs.changed == 'true'
        uses: peter-evans/create-pull-request@v8
        with:
          commit-message: "chore: bump inference defaults from unsloth"
          title: "chore: bump inference defaults from unsloth"
          body: |
            Auto-generated update of `core/config/inference_defaults.json` from
            [unsloth's inference_defaults.json](https://github.com/unslothai/unsloth/blob/main/studio/backend/assets/configs/inference_defaults.json).

            This PR was created automatically by the `bump-inference-defaults` workflow.
          branch: chore/bump-inference-defaults
          delete-branch: true
          labels: automated
bump_deps matrix .github/workflows/bump_deps.yaml
Triggers
schedule, workflow_dispatch
Runs on
ubuntu-latest
Jobs
bump-backends
Matrix
include, include.branch, include.file, include.repository, include.variable→ ACESTEP_CPP_VERSION, LLAMA_VERSION, PIPER_VERSION, STABLEDIFFUSION_GGML_VERSION, VOXTRAL_VERSION, WHISPER_CPP_VERSION, ace-step/acestep.cpp, antirez/voxtral.c, backend/cpp/llama-cpp/Makefile, backend/go/acestep-cpp/Makefile, backend/go/piper/Makefile, backend/go/stablediffusion-ggml/Makefile, backend/go/voxtral/Makefile, backend/go/whisper/Makefile, ggml-org/llama.cpp, ggml-org/whisper.cpp, leejet/stable-diffusion.cpp, main, master, mudler/go-piper
Actions
peter-evans/create-pull-request
Commands
  • bash .github/bump_deps.sh ${{ matrix.repository }} ${{ matrix.branch }} ${{ matrix.variable }} ${{ matrix.file }} { echo 'message<<EOF' cat "${{ matrix.variable }}_message.txt" echo EOF } >> "$GITHUB_OUTPUT" { echo 'commit<<EOF' cat "${{ matrix.variable }}_commit.txt" echo EOF } >> "$GITHUB_OUTPUT" rm -rfv ${{ matrix.variable }}_message.txt rm -rfv ${{ matrix.variable }}_commit.txt
View raw YAML
name: Bump Backend dependencies
on:
  schedule:
    - cron: 0 20 * * *
  workflow_dispatch:
jobs:
  bump-backends:
    if: github.repository == 'mudler/LocalAI'
    strategy:
      fail-fast: false
      matrix:
        include:
          - repository: "ggml-org/llama.cpp"
            variable: "LLAMA_VERSION"
            branch: "master"
            file: "backend/cpp/llama-cpp/Makefile"
          - repository: "ggml-org/whisper.cpp"
            variable: "WHISPER_CPP_VERSION"
            branch: "master"
            file: "backend/go/whisper/Makefile"
          - repository: "leejet/stable-diffusion.cpp"
            variable: "STABLEDIFFUSION_GGML_VERSION"
            branch: "master"
            file: "backend/go/stablediffusion-ggml/Makefile"
          - repository: "mudler/go-piper"
            variable: "PIPER_VERSION"
            branch: "master"
            file: "backend/go/piper/Makefile"
          - repository: "antirez/voxtral.c"
            variable: "VOXTRAL_VERSION"
            branch: "main"
            file: "backend/go/voxtral/Makefile"
          - repository: "ace-step/acestep.cpp"
            variable: "ACESTEP_CPP_VERSION"
            branch: "master"
            file: "backend/go/acestep-cpp/Makefile"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Bump dependencies 🔧
        id: bump
        run: |
          bash .github/bump_deps.sh ${{ matrix.repository }} ${{ matrix.branch }} ${{ matrix.variable }} ${{ matrix.file }}
          {
            echo 'message<<EOF'
            cat "${{ matrix.variable }}_message.txt"
            echo EOF
          } >> "$GITHUB_OUTPUT"
          {
            echo 'commit<<EOF'
            cat "${{ matrix.variable }}_commit.txt"
            echo EOF
          } >> "$GITHUB_OUTPUT"
          rm -rfv ${{ matrix.variable }}_message.txt
          rm -rfv ${{ matrix.variable }}_commit.txt
      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v8
        with:
          token: ${{ secrets.UPDATE_BOT_TOKEN }}
          push-to-fork: ci-forks/LocalAI
          commit-message: ':arrow_up: Update ${{ matrix.repository }}'
          title: 'chore: :arrow_up: Update ${{ matrix.repository }} to `${{ steps.bump.outputs.commit }}`'
          branch: "update/${{ matrix.variable }}"
          body: ${{ steps.bump.outputs.message }}
          signoff: true



bump_docs matrix .github/workflows/bump_docs.yaml
Triggers
schedule, workflow_dispatch
Runs on
ubuntu-latest
Jobs
bump-docs
Matrix
include, include.repository→ mudler/LocalAI
Actions
peter-evans/create-pull-request
Commands
  • bash .github/bump_docs.sh ${{ matrix.repository }}
View raw YAML
name: Bump Documentation
on:
  schedule:
    - cron: 0 20 * * *
  workflow_dispatch:
jobs:
  bump-docs:
    if: github.repository == 'mudler/LocalAI'
    strategy:
      fail-fast: false
      matrix:
        include:
          - repository: "mudler/LocalAI"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Bump dependencies 🔧
        run: |
          bash .github/bump_docs.sh ${{ matrix.repository }}
      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v8
        with:
          token: ${{ secrets.UPDATE_BOT_TOKEN }}
          push-to-fork: ci-forks/LocalAI
          commit-message: ':arrow_up: Update docs version ${{ matrix.repository }}'
          title: 'docs: :arrow_up: update docs version ${{ matrix.repository }}'
          branch: "update/docs"
          body: Bump of ${{ matrix.repository }} version inside docs
          signoff: true



checksum_checker .github/workflows/checksum_checker.yaml
Triggers
schedule, workflow_dispatch
Runs on
ubuntu-latest
Jobs
checksum_check
Actions
dcarbone/install-yq-action, peter-evans/create-pull-request
Commands
  • sudo apt-get update \ && sudo apt-get install -y software-properties-common \ && sudo apt-get update \ && sudo add-apt-repository -y ppa:git-core/ppa \ && sudo apt-get update \ && sudo apt-get install -y git
  • sudo apt-get update sudo apt-get install -y pip wget pip install huggingface_hub
  • export HF_HOME=/hf_cache sudo mkdir /hf_cache sudo chmod 777 /hf_cache bash .github/checksum_checker.sh gallery/index.yaml
View raw YAML
name: Check if checksums are up-to-date
on:
  schedule:
    - cron: 0 20 * * *
  workflow_dispatch:
jobs:
  checksum_check:
    if: github.repository == 'mudler/LocalAI'
    runs-on: ubuntu-latest
    steps:
      - name: Force Install GIT latest
        run: |
          sudo apt-get update \
          && sudo apt-get install -y software-properties-common \
          && sudo apt-get update \
          && sudo add-apt-repository -y ppa:git-core/ppa \
          && sudo apt-get update \
          && sudo apt-get install -y git
      - uses: actions/checkout@v6
      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y pip wget
          pip install huggingface_hub
      - name: 'Setup yq'
        uses: dcarbone/install-yq-action@v1.3.1
        with:
          version: 'v4.44.2'
          download-compressed: true
          force: true

      - name: Checksum checker 🔧
        run: |
          export HF_HOME=/hf_cache
          sudo mkdir /hf_cache
          sudo chmod 777 /hf_cache
          bash .github/checksum_checker.sh gallery/index.yaml
      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v8
        with:
          token: ${{ secrets.UPDATE_BOT_TOKEN }}
          push-to-fork: ci-forks/LocalAI
          commit-message: ':arrow_up: Checksum updates in gallery/index.yaml'
          title: 'chore(model-gallery): :arrow_up: update checksum'
          branch: "update/checksum"
          body: Updating checksums in gallery/index.yaml
          signoff: true
deploy-explorer .github/workflows/deploy-explorer.yaml
Triggers
push
Runs on
ubuntu-latest
Jobs
build-linux
Actions
appleboy/ssh-action, appleboy/scp-action, appleboy/ssh-action
Commands
  • sudo apt-get update sudo apt-get install -y wget curl build-essential ffmpeg protobuf-compiler ccache upx-ucl gawk cmake libgmock-dev go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@1958fcbe2ca8bd93af633f11e97d44e567e945af go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.2 make protogen-go
  • CGO_ENABLED=0 make build
View raw YAML
name: Explorer deployment

on:
  push:
    branches:
      - master
    tags:
      - 'v*'

concurrency:
  group: ci-deploy-${{ github.head_ref || github.ref }}-${{ github.repository }}

jobs:
  build-linux:
    if: github.repository == 'mudler/LocalAI'
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - uses: actions/setup-go@v5
        with:
          go-version: '1.21.x'
          cache: false
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y wget curl build-essential ffmpeg protobuf-compiler ccache upx-ucl gawk cmake libgmock-dev
          go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@1958fcbe2ca8bd93af633f11e97d44e567e945af
          go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.2
          make protogen-go
      - name: Build api
        run: |
          CGO_ENABLED=0 make build
      - name: rm
        uses: appleboy/ssh-action@v1.2.5
        with:
            host: ${{ secrets.EXPLORER_SSH_HOST }}
            username: ${{ secrets.EXPLORER_SSH_USERNAME }}
            key: ${{ secrets.EXPLORER_SSH_KEY }}
            port: ${{ secrets.EXPLORER_SSH_PORT }}
            script: |
                sudo rm -rf local-ai/ || true
      - name: copy file via ssh
        uses: appleboy/scp-action@v1.0.0
        with:
            host: ${{ secrets.EXPLORER_SSH_HOST }}
            username: ${{ secrets.EXPLORER_SSH_USERNAME }}
            key: ${{ secrets.EXPLORER_SSH_KEY }}
            port: ${{ secrets.EXPLORER_SSH_PORT }}
            source: "local-ai"
            overwrite: true
            rm: true
            target: ./local-ai
      - name: restarting
        uses: appleboy/ssh-action@v1.2.5
        with:
            host: ${{ secrets.EXPLORER_SSH_HOST }}
            username: ${{ secrets.EXPLORER_SSH_USERNAME }}
            key: ${{ secrets.EXPLORER_SSH_KEY }}
            port: ${{ secrets.EXPLORER_SSH_PORT }}
            script: |
                sudo cp -rfv local-ai/local-ai /usr/bin/local-ai
                sudo systemctl restart local-ai
gallery-agent .github/workflows/gallery-agent.yaml
Triggers
schedule, workflow_dispatch
Runs on
ubuntu-latest
Jobs
gallery-agent
Actions
mudler/localai-github-action, peter-evans/create-pull-request
Commands
  • # Install protoc curl -L -s https://github.com/protocolbuffers/protobuf/releases/download/v26.1/protoc-26.1-linux-x86_64.zip -o protoc.zip && \ unzip -j -d /usr/local/bin protoc.zip bin/protoc && \ rm protoc.zip go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.2 go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@1958fcbe2ca8bd93af633f11e97d44e567e945af PATH="$PATH:$HOME/go/bin" make protogen-go
  • export GALLERY_INDEX_PATH=$PWD/gallery/index.yaml go run ./.github/gallery-agent
  • if git diff --quiet gallery/index.yaml; then echo "changes=false" >> $GITHUB_OUTPUT echo "No changes detected in gallery/index.yaml" else echo "changes=true" >> $GITHUB_OUTPUT echo "Changes detected in gallery/index.yaml" git diff gallery/index.yaml fi
  • if [ -f "./gallery-agent-summary.json" ]; then echo "summary_exists=true" >> $GITHUB_OUTPUT # Extract summary data using jq echo "search_term=$(jq -r '.search_term' ./gallery-agent-summary.json)" >> $GITHUB_OUTPUT echo "total_found=$(jq -r '.total_found' ./gallery-agent-summary.json)" >> $GITHUB_OUTPUT echo "models_added=$(jq -r '.models_added' ./gallery-agent-summary.json)" >> $GITHUB_OUTPUT echo "quantization=$(jq -r '.quantization' ./gallery-agent-summary.json)" >> $GITHUB_OUTPUT echo "processing_time=$(jq -r '.processing_time' ./gallery-agent-summary.json)" >> $GITHUB_OUTPUT # Create a formatted list of added models with URLs added_models=$(jq -r 'range(0; .added_model_ids | length) as $i | "- [\(.added_model_ids[$i])](\(.added_model_urls[$i]))"' ./gallery-agent-summary.json | tr '\n' '\n') echo "added_models<<EOF" >> $GITHUB_OUTPUT echo "$added_models" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT rm -f ./gallery-agent-summary.json else echo "summary_exists=false" >> $GITHUB_OUTPUT fi
View raw YAML
name: Gallery Agent
on:

  schedule:
    - cron: '0 */3 * * *'  # Run every 4 hours
  workflow_dispatch:
    inputs:
      search_term:
        description: 'Search term for models'
        required: false
        default: 'GGUF'
        type: string
      limit:
        description: 'Maximum number of models to process'
        required: false
        default: '15'
        type: string
      quantization:
        description: 'Preferred quantization format'
        required: false
        default: 'Q4_K_M'
        type: string
      max_models:
        description: 'Maximum number of models to add to the gallery'
        required: false
        default: '1'
        type: string
jobs:
  gallery-agent:
    if: github.repository == 'mudler/LocalAI'
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
        with:
          token: ${{ secrets.GITHUB_TOKEN }}

      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.21'
      - name: Proto Dependencies
        run: |
          # Install protoc
          curl -L -s https://github.com/protocolbuffers/protobuf/releases/download/v26.1/protoc-26.1-linux-x86_64.zip -o protoc.zip && \
          unzip -j -d /usr/local/bin protoc.zip bin/protoc && \
          rm protoc.zip
          go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.2
          go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@1958fcbe2ca8bd93af633f11e97d44e567e945af
          PATH="$PATH:$HOME/go/bin" make protogen-go
      - uses: mudler/localai-github-action@v1.1
        with:
          model: 'https://huggingface.co/unsloth/Qwen3.5-2B-GGUF'

      - name: Run gallery agent
        env:
          #OPENAI_MODEL: ${{ secrets.OPENAI_MODEL }}
          OPENAI_MODE: Qwen3.5-2B-GGUF
          OPENAI_BASE_URL: "http://localhost:8080"
          OPENAI_KEY: ${{ secrets.OPENAI_KEY }}
          #OPENAI_BASE_URL: ${{ secrets.OPENAI_BASE_URL }}
          SEARCH_TERM: ${{ github.event.inputs.search_term || 'GGUF' }}
          LIMIT: ${{ github.event.inputs.limit || '15' }}
          QUANTIZATION: ${{ github.event.inputs.quantization || 'Q4_K_M' }}
          MAX_MODELS: ${{ github.event.inputs.max_models || '1' }}
        run: |
          export GALLERY_INDEX_PATH=$PWD/gallery/index.yaml
          go run ./.github/gallery-agent

      - name: Check for changes
        id: check_changes
        run: |
          if git diff --quiet gallery/index.yaml; then
            echo "changes=false" >> $GITHUB_OUTPUT
            echo "No changes detected in gallery/index.yaml"
          else
            echo "changes=true" >> $GITHUB_OUTPUT
            echo "Changes detected in gallery/index.yaml"
            git diff gallery/index.yaml
          fi

      - name: Read gallery agent summary
        id: read_summary
        if: steps.check_changes.outputs.changes == 'true'
        run: |
          if [ -f "./gallery-agent-summary.json" ]; then
            echo "summary_exists=true" >> $GITHUB_OUTPUT
            # Extract summary data using jq
            echo "search_term=$(jq -r '.search_term' ./gallery-agent-summary.json)" >> $GITHUB_OUTPUT
            echo "total_found=$(jq -r '.total_found' ./gallery-agent-summary.json)" >> $GITHUB_OUTPUT
            echo "models_added=$(jq -r '.models_added' ./gallery-agent-summary.json)" >> $GITHUB_OUTPUT
            echo "quantization=$(jq -r '.quantization' ./gallery-agent-summary.json)" >> $GITHUB_OUTPUT
            echo "processing_time=$(jq -r '.processing_time' ./gallery-agent-summary.json)" >> $GITHUB_OUTPUT
            
            # Create a formatted list of added models with URLs
            added_models=$(jq -r 'range(0; .added_model_ids | length) as $i | "- [\(.added_model_ids[$i])](\(.added_model_urls[$i]))"' ./gallery-agent-summary.json | tr '\n' '\n')
            echo "added_models<<EOF" >> $GITHUB_OUTPUT
            echo "$added_models" >> $GITHUB_OUTPUT
            echo "EOF" >> $GITHUB_OUTPUT
            rm -f ./gallery-agent-summary.json
          else
            echo "summary_exists=false" >> $GITHUB_OUTPUT
          fi

      - name: Create Pull Request
        if: steps.check_changes.outputs.changes == 'true'
        uses: peter-evans/create-pull-request@v8
        with:
          token: ${{ secrets.UPDATE_BOT_TOKEN }}
          push-to-fork: ci-forks/LocalAI
          commit-message: 'chore(model gallery): :robot: add new models via gallery agent'
          title: 'chore(model gallery): :robot: add ${{ steps.read_summary.outputs.models_added || 0 }} new models via gallery agent'
          # Branch has to be unique so PRs are not overriding each other
          branch-suffix: timestamp
          body: |
            This PR was automatically created by the gallery agent workflow.
            
            **Summary:**
            - **Search Term:** ${{ steps.read_summary.outputs.search_term || github.event.inputs.search_term || 'GGUF' }}
            - **Models Found:** ${{ steps.read_summary.outputs.total_found || 'N/A' }}
            - **Models Added:** ${{ steps.read_summary.outputs.models_added || '0' }}
            - **Quantization:** ${{ steps.read_summary.outputs.quantization || github.event.inputs.quantization || 'Q4_K_M' }}
            - **Processing Time:** ${{ steps.read_summary.outputs.processing_time || 'N/A' }}
            
            **Added Models:**
            ${{ steps.read_summary.outputs.added_models || '- No models added' }}
            
            **Workflow Details:**
            - Triggered by: `${{ github.event_name }}`
            - Run ID: `${{ github.run_id }}`
            - Commit: `${{ github.sha }}`
          signoff: true
          delete-branch: true
generate_grpc_cache matrix .github/workflows/generate_grpc_cache.yaml
Triggers
workflow_dispatch, schedule
Runs on
${{matrix.runs-on}}
Jobs
generate_caches
Matrix
include, include.grpc-base-image, include.platforms, include.runs-on→ linux/amd64,linux/arm64, ubuntu-latest, ubuntu:24.04
Actions
docker/setup-qemu-action, docker/setup-buildx-action, docker/build-push-action
Commands
  • echo "Listing top largest packages" pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr) head -n 30 <<< "${pkgs}" echo df -h echo sudo apt-get remove -y '^llvm-.*|^libllvm.*' || true sudo apt-get remove --auto-remove android-sdk-platform-tools || true sudo apt-get purge --auto-remove android-sdk-platform-tools || true sudo rm -rf /usr/local/lib/android sudo apt-get remove -y '^dotnet-.*|^aspnetcore-.*' || true sudo rm -rf /usr/share/dotnet sudo apt-get remove -y '^mono-.*' || true sudo apt-get remove -y '^ghc-.*' || true sudo apt-get remove -y '.*jdk.*|.*jre.*' || true sudo apt-get remove -y 'php.*' || true sudo apt-get remove -y hhvm powershell firefox monodoc-manual msbuild || true sudo apt-get remove -y '^google-.*' || true sudo apt-get remove -y azure-cli || true sudo apt-get remove -y '^mongo.*-.*|^postgresql-.*|^mysql-.*|^mssql-.*' || true sudo apt-get remove -y '^gfortran-.*' || true sudo apt-get remove -y microsoft-edge-stable || true sudo apt-get remove -y firefox || true sudo apt-get remove -y powershell || true sudo apt-get remove -y r-base-core || true sudo apt-get autoremove -y sudo apt-get clean echo echo "Listing top largest packages" pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr) head -n 30 <<< "${pkgs}" echo sudo rm -rfv build || true sudo rm -rf /usr/share/dotnet || true sudo rm -rf /opt/ghc || true sudo rm -rf "/usr/local/share/boost" || true sudo rm -rf "$AGENT_TOOLSDIRECTORY" || true df -h
View raw YAML
name: 'generate and publish GRPC docker caches'

on:
  workflow_dispatch:

  schedule:
    # daily at midnight
    - cron: '0 0 * * *'

concurrency:
  group: grpc-cache-${{ github.head_ref || github.ref }}-${{ github.repository }}
  cancel-in-progress: true

jobs:
  generate_caches:
    if: github.repository == 'mudler/LocalAI'
    strategy:
      matrix:
        include:
          - grpc-base-image: ubuntu:24.04
            runs-on: 'ubuntu-latest'
            platforms: 'linux/amd64,linux/arm64'
    runs-on: ${{matrix.runs-on}}
    steps:
      - name: Release space from worker
        if: matrix.runs-on == 'ubuntu-latest'
        run: |
          echo "Listing top largest packages"
          pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr)
          head -n 30 <<< "${pkgs}"
          echo
          df -h
          echo
          sudo apt-get remove -y '^llvm-.*|^libllvm.*' || true
          sudo apt-get remove --auto-remove android-sdk-platform-tools || true
          sudo apt-get purge --auto-remove android-sdk-platform-tools || true
          sudo rm -rf /usr/local/lib/android
          sudo apt-get remove -y '^dotnet-.*|^aspnetcore-.*' || true
          sudo rm -rf /usr/share/dotnet
          sudo apt-get remove -y '^mono-.*' || true
          sudo apt-get remove -y '^ghc-.*' || true
          sudo apt-get remove -y '.*jdk.*|.*jre.*' || true
          sudo apt-get remove -y 'php.*' || true
          sudo apt-get remove -y hhvm powershell firefox monodoc-manual msbuild || true
          sudo apt-get remove -y '^google-.*' || true
          sudo apt-get remove -y azure-cli || true
          sudo apt-get remove -y '^mongo.*-.*|^postgresql-.*|^mysql-.*|^mssql-.*' || true
          sudo apt-get remove -y '^gfortran-.*' || true
          sudo apt-get remove -y microsoft-edge-stable || true
          sudo apt-get remove -y firefox || true
          sudo apt-get remove -y powershell || true
          sudo apt-get remove -y r-base-core || true
          sudo apt-get autoremove -y
          sudo apt-get clean
          echo
          echo "Listing top largest packages"
          pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr)
          head -n 30 <<< "${pkgs}"
          echo
          sudo rm -rfv build || true
          sudo rm -rf /usr/share/dotnet || true
          sudo rm -rf /opt/ghc || true
          sudo rm -rf "/usr/local/share/boost" || true
          sudo rm -rf "$AGENT_TOOLSDIRECTORY" || true
          df -h

      - name: Set up QEMU
        uses: docker/setup-qemu-action@master
        with:
          platforms: all

      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@master

      - name: Checkout
        uses: actions/checkout@v6

      - name: Cache GRPC
        uses: docker/build-push-action@v7
        with:
          builder: ${{ steps.buildx.outputs.name }}
          # The build-args MUST be an EXACT match between the image cache and other workflow steps that want to use that cache.
          # This means that even the MAKEFLAGS have to be an EXACT match.
          # If the build-args are not an EXACT match, it will result in a cache miss, which will require GRPC to be built from scratch.
          build-args: |
            GRPC_BASE_IMAGE=${{ matrix.grpc-base-image }}
            GRPC_MAKEFLAGS=--jobs=4 --output-sync=target
            GRPC_VERSION=v1.65.0
          context: .
          file: ./Dockerfile
          cache-to: type=gha,ignore-error=true
          cache-from: type=gha
          target: grpc
          platforms: ${{ matrix.platforms }}
          push: false
generate_intel_image matrix .github/workflows/generate_intel_image.yaml
Triggers
workflow_dispatch, push
Runs on
${{matrix.runs-on}}
Jobs
generate_caches
Matrix
include, include.base-image, include.platforms, include.runs-on→ arc-runner-set, intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04, linux/amd64
Actions
docker/setup-qemu-action, docker/login-action, docker/login-action, docker/setup-buildx-action, docker/build-push-action
View raw YAML
name: 'generate and publish intel docker caches'

on:
  workflow_dispatch:
  push:
    branches:
      - master

concurrency:
  group: intel-cache-${{ github.head_ref || github.ref }}-${{ github.repository }}
  cancel-in-progress: true

jobs:
  generate_caches:
    if: github.repository == 'mudler/LocalAI'
    strategy:
      matrix:
        include:
          - base-image: intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04
            runs-on: 'arc-runner-set'
            platforms: 'linux/amd64'
    runs-on: ${{matrix.runs-on}}
    steps:
      - name: Set up QEMU
        uses: docker/setup-qemu-action@master
        with:
          platforms: all
      - name: Login to DockerHub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v4
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_PASSWORD }}

      - name: Login to quay
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v4
        with:
          registry: quay.io
          username: ${{ secrets.LOCALAI_REGISTRY_USERNAME }}
          password: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }}
      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@master

      - name: Checkout
        uses: actions/checkout@v6

      - name: Cache Intel images
        uses: docker/build-push-action@v7
        with:
          builder: ${{ steps.buildx.outputs.name }}
          build-args: |
            BASE_IMAGE=${{ matrix.base-image }}
          context: .
          file: ./Dockerfile
          tags: quay.io/go-skynet/intel-oneapi-base:24.04
          push: true
          target: intel
          platforms: ${{ matrix.platforms }}
gh-pages perms .github/workflows/gh-pages.yml
Triggers
push, workflow_dispatch
Runs on
ubuntu-latest, ubuntu-latest
Jobs
build, deploy
Actions
peaceiris/actions-hugo, actions/configure-pages, actions/upload-pages-artifact, actions/deploy-pages
Commands
  • go run ./.github/ci/modelslist.go ./gallery/index.yaml > docs/static/gallery.html
  • mkdir -p layouts/_default hugo --minify --baseURL "${{ steps.pages.outputs.base_url }}/"
View raw YAML
name: Deploy docs to GitHub Pages

on:
  push:
    branches:
      - master
    paths:
      - 'docs/**'
      - 'gallery/**'
      - 'images/**'
      - '.github/ci/modelslist.go'
      - '.github/workflows/gh-pages.yml'
  workflow_dispatch:

permissions:
  contents: read
  pages: write
  id-token: write

concurrency:
  group: pages
  cancel-in-progress: false

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      HUGO_VERSION: "0.146.3"
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0  # needed for enableGitInfo
          submodules: true

      - name: Setup Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.22'
          cache: false

      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v3
        with:
          hugo-version: ${{ env.HUGO_VERSION }}
          extended: true

      - name: Setup Pages
        id: pages
        uses: actions/configure-pages@v5

      - name: Generate gallery
        run: go run ./.github/ci/modelslist.go ./gallery/index.yaml > docs/static/gallery.html

      - name: Build site
        working-directory: docs
        run: |
          mkdir -p layouts/_default
          hugo --minify --baseURL "${{ steps.pages.outputs.base_url }}/"

      - name: Upload artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: docs/public

  deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4
image matrix .github/workflows/image.yml
Triggers
push
Runs on
Jobs
hipblas-jobs, core-image-build, gh-runner
Matrix
include, include.base-image, include.build-type, include.cuda-major-version, include.cuda-minor-version, include.grpc-base-image, include.makeflags, include.platforms, include.runs-on, include.skip-drivers, include.tag-latest, include.tag-suffix, include.ubuntu-codename, include.ubuntu-version→ , --jobs=3 --output-sync=target, --jobs=4 --output-sync=target, -gpu-hipblas, -gpu-intel, -gpu-nvidia-cuda-12, -gpu-nvidia-cuda-13, -gpu-vulkan, -nvidia-l4t-arm64, -nvidia-l4t-arm64-cuda-13, 0, 12, 13, 2204, 2404, 8, auto, cublas, false, hipblas, intel, intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04, jammy, linux/amd64, linux/amd64,linux/arm64, linux/arm64, noble, nvcr.io/nvidia/l4t-jetpack:r36.4.0, rocm/dev-ubuntu-24.04:6.4.4, true, ubuntu-24.04-arm, ubuntu-latest, ubuntu:22.04, ubuntu:24.04, vulkan
View raw YAML
---
  name: 'build container images'
  
  on:
    push:
      branches:
        - master
      tags:
        - '*'
  
  concurrency:
    group: ci-${{ github.head_ref || github.ref }}-${{ github.repository }}
    cancel-in-progress: true
  
  jobs:
    hipblas-jobs:
      if: github.repository == 'mudler/LocalAI'
      uses: ./.github/workflows/image_build.yml
      with:
        tag-latest: ${{ matrix.tag-latest }}
        tag-suffix: ${{ matrix.tag-suffix }}
        build-type: ${{ matrix.build-type }}
        cuda-major-version: ${{ matrix.cuda-major-version }}
        cuda-minor-version: ${{ matrix.cuda-minor-version }}
        platforms: ${{ matrix.platforms }}
        runs-on: ${{ matrix.runs-on }}
        base-image: ${{ matrix.base-image }}
        grpc-base-image: ${{ matrix.grpc-base-image }}
        makeflags: ${{ matrix.makeflags }}
        ubuntu-version: ${{ matrix.ubuntu-version }}
        ubuntu-codename: ${{ matrix.ubuntu-codename }}
      secrets:
        dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }}
        dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }}
        quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }}
        quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }}
      strategy:
        matrix:
          include:
            - build-type: 'hipblas'
              platforms: 'linux/amd64'
              tag-latest: 'auto'
              tag-suffix: '-gpu-hipblas'
              base-image: "rocm/dev-ubuntu-24.04:6.4.4"
              grpc-base-image: "ubuntu:24.04"
              runs-on: 'ubuntu-latest'
              makeflags: "--jobs=3 --output-sync=target"
              ubuntu-version: '2404'
              ubuntu-codename: 'noble'
  
    core-image-build:
      if: github.repository == 'mudler/LocalAI'
      uses: ./.github/workflows/image_build.yml
      with:
        tag-latest: ${{ matrix.tag-latest }}
        tag-suffix: ${{ matrix.tag-suffix }}
        build-type: ${{ matrix.build-type }}
        cuda-major-version: ${{ matrix.cuda-major-version }}
        cuda-minor-version: ${{ matrix.cuda-minor-version }}
        platforms: ${{ matrix.platforms }}
        runs-on: ${{ matrix.runs-on }}
        base-image: ${{ matrix.base-image }}
        grpc-base-image: ${{ matrix.grpc-base-image }}
        makeflags: ${{ matrix.makeflags }}
        skip-drivers: ${{ matrix.skip-drivers }}
        ubuntu-version: ${{ matrix.ubuntu-version }}
        ubuntu-codename: ${{ matrix.ubuntu-codename }}
      secrets:
        dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }}
        dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }}
        quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }}
        quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }}
      strategy:
        #max-parallel: ${{ github.event_name != 'pull_request' && 2 || 4 }}
        matrix:
          include:
            - build-type: ''
              platforms: 'linux/amd64,linux/arm64'
              tag-latest: 'auto'
              tag-suffix: ''
              base-image: "ubuntu:24.04"
              runs-on: 'ubuntu-latest'
              makeflags: "--jobs=4 --output-sync=target"
              skip-drivers: 'false'
              ubuntu-version: '2404'
              ubuntu-codename: 'noble'
            - build-type: 'cublas'
              cuda-major-version: "12"
              cuda-minor-version: "8"
              platforms: 'linux/amd64'
              tag-latest: 'auto'
              tag-suffix: '-gpu-nvidia-cuda-12'
              runs-on: 'ubuntu-latest'
              base-image: "ubuntu:24.04"
              skip-drivers: 'false'
              makeflags: "--jobs=4 --output-sync=target"
              ubuntu-version: '2404'
              ubuntu-codename: 'noble'
            - build-type: 'cublas'
              cuda-major-version: "13"
              cuda-minor-version: "0"
              platforms: 'linux/amd64'
              tag-latest: 'auto'
              tag-suffix: '-gpu-nvidia-cuda-13'
              runs-on: 'ubuntu-latest'
              base-image: "ubuntu:22.04"
              skip-drivers: 'false'
              makeflags: "--jobs=4 --output-sync=target"
              ubuntu-version: '2404'
              ubuntu-codename: 'noble'
            - build-type: 'vulkan'
              platforms: 'linux/amd64,linux/arm64'
              tag-latest: 'auto'
              tag-suffix: '-gpu-vulkan'
              runs-on: 'ubuntu-latest'
              base-image: "ubuntu:24.04"
              skip-drivers: 'false'
              makeflags: "--jobs=4 --output-sync=target"
              ubuntu-version: '2404'
              ubuntu-codename: 'noble'
            - build-type: 'intel'
              platforms: 'linux/amd64'
              tag-latest: 'auto'
              base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
              grpc-base-image: "ubuntu:24.04"
              tag-suffix: '-gpu-intel'
              runs-on: 'ubuntu-latest'
              makeflags: "--jobs=3 --output-sync=target"
              ubuntu-version: '2404'
              ubuntu-codename: 'noble'
  
    gh-runner:
      if: github.repository == 'mudler/LocalAI'
      uses: ./.github/workflows/image_build.yml
      with:
        tag-latest: ${{ matrix.tag-latest }}
        tag-suffix: ${{ matrix.tag-suffix }}
        build-type: ${{ matrix.build-type }}
        cuda-major-version: ${{ matrix.cuda-major-version }}
        cuda-minor-version: ${{ matrix.cuda-minor-version }}
        platforms: ${{ matrix.platforms }}
        runs-on: ${{ matrix.runs-on }}
        base-image: ${{ matrix.base-image }}
        grpc-base-image: ${{ matrix.grpc-base-image }}
        makeflags: ${{ matrix.makeflags }}
        skip-drivers: ${{ matrix.skip-drivers }}
        ubuntu-version: ${{ matrix.ubuntu-version }}
        ubuntu-codename: ${{ matrix.ubuntu-codename }}
      secrets:
        dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }}
        dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }}
        quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }}
        quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }}
      strategy:
        matrix:
          include:
            - build-type: 'cublas'
              cuda-major-version: "12"
              cuda-minor-version: "0"
              platforms: 'linux/arm64'
              tag-latest: 'auto'
              tag-suffix: '-nvidia-l4t-arm64'
              base-image: "nvcr.io/nvidia/l4t-jetpack:r36.4.0"
              runs-on: 'ubuntu-24.04-arm'
              makeflags: "--jobs=4 --output-sync=target"
              skip-drivers: 'true'
              ubuntu-version: "2204"
              ubuntu-codename: 'jammy'
            - build-type: 'cublas'
              cuda-major-version: "13"
              cuda-minor-version: "0"
              platforms: 'linux/arm64'
              tag-latest: 'auto'
              tag-suffix: '-nvidia-l4t-arm64-cuda-13'
              base-image: "ubuntu:24.04"
              runs-on: 'ubuntu-24.04-arm'
              makeflags: "--jobs=4 --output-sync=target"
              skip-drivers: 'false'
              ubuntu-version: '2404'
              ubuntu-codename: 'noble'
  
image-pr matrix .github/workflows/image-pr.yml
Triggers
pull_request
Runs on
Jobs
image-build
Matrix
include, include.base-image, include.build-type, include.cuda-major-version, include.cuda-minor-version, include.grpc-base-image, include.makeflags, include.platforms, include.runs-on, include.skip-drivers, include.tag-latest, include.tag-suffix, include.ubuntu-version→ --jobs=3 --output-sync=target, --jobs=4 --output-sync=target, -gpu-nvidia-cuda-12, -gpu-nvidia-cuda-13, -hipblas, -nvidia-l4t-arm64-cuda-13, -vulkan-core, 0, 12, 13, 2404, 8, cublas, false, hipblas, intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04, linux/amd64, linux/amd64,linux/arm64, linux/arm64, rocm/dev-ubuntu-24.04:6.4.4, sycl, ubuntu-24.04-arm, ubuntu-latest, ubuntu:22.04, ubuntu:24.04, vulkan
View raw YAML
---
  name: 'build container images tests'
  
  on:
    pull_request:
  
  concurrency:
    group: ci-${{ github.head_ref || github.ref }}-${{ github.repository }}
    cancel-in-progress: true
  
  jobs:
    image-build:
      uses: ./.github/workflows/image_build.yml
      with:
        tag-latest: ${{ matrix.tag-latest }}
        tag-suffix: ${{ matrix.tag-suffix }}
        build-type: ${{ matrix.build-type }}
        cuda-major-version: ${{ matrix.cuda-major-version }}
        cuda-minor-version: ${{ matrix.cuda-minor-version }}
        platforms: ${{ matrix.platforms }}
        runs-on: ${{ matrix.runs-on }}
        base-image: ${{ matrix.base-image }}
        grpc-base-image: ${{ matrix.grpc-base-image }}
        makeflags: ${{ matrix.makeflags }}
        ubuntu-version: ${{ matrix.ubuntu-version }}
      secrets:
        dockerUsername: ${{ secrets.DOCKERHUB_USERNAME }}
        dockerPassword: ${{ secrets.DOCKERHUB_PASSWORD }}
        quayUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }}
        quayPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }}
      strategy:
        # Pushing with all jobs in parallel
        # eats the bandwidth of all the nodes
        max-parallel: ${{ github.event_name != 'pull_request' && 4 || 8 }}
        fail-fast: false
        matrix:
          include:
            - build-type: 'cublas'
              cuda-major-version: "12"
              cuda-minor-version: "8"
              platforms: 'linux/amd64'
              tag-latest: 'false'
              tag-suffix: '-gpu-nvidia-cuda-12'
              runs-on: 'ubuntu-latest'
              base-image: "ubuntu:24.04"
              makeflags: "--jobs=3 --output-sync=target"
              ubuntu-version: '2404'
            - build-type: 'cublas'
              cuda-major-version: "13"
              cuda-minor-version: "0"
              platforms: 'linux/amd64'
              tag-latest: 'false'
              tag-suffix: '-gpu-nvidia-cuda-13'
              runs-on: 'ubuntu-latest'
              base-image: "ubuntu:22.04"
              makeflags: "--jobs=3 --output-sync=target"
              ubuntu-version: '2404'
            - build-type: 'hipblas'
              platforms: 'linux/amd64'
              tag-latest: 'false'
              tag-suffix: '-hipblas'
              base-image: "rocm/dev-ubuntu-24.04:6.4.4"
              grpc-base-image: "ubuntu:24.04"
              runs-on: 'ubuntu-latest'
              makeflags: "--jobs=3 --output-sync=target"
              ubuntu-version: '2404'
            - build-type: 'sycl'
              platforms: 'linux/amd64'
              tag-latest: 'false'
              base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"
              grpc-base-image: "ubuntu:24.04"
              tag-suffix: 'sycl'
              runs-on: 'ubuntu-latest'
              makeflags: "--jobs=3 --output-sync=target"
              ubuntu-version: '2404'
            - build-type: 'vulkan'
              platforms: 'linux/amd64,linux/arm64'
              tag-latest: 'false'
              tag-suffix: '-vulkan-core'
              runs-on: 'ubuntu-latest'
              base-image: "ubuntu:24.04"
              makeflags: "--jobs=4 --output-sync=target"
              ubuntu-version: '2404'
            - build-type: 'cublas'
              cuda-major-version: "13"
              cuda-minor-version: "0"
              platforms: 'linux/arm64'
              tag-latest: 'false'
              tag-suffix: '-nvidia-l4t-arm64-cuda-13'
              base-image: "ubuntu:24.04"
              runs-on: 'ubuntu-24.04-arm'
              makeflags: "--jobs=4 --output-sync=target"
              skip-drivers: 'false'
              ubuntu-version: '2404'
  
image_build .github/workflows/image_build.yml
Triggers
workflow_call
Runs on
${{ inputs.runs-on }}
Jobs
reusable_image-build
Actions
jlumbroso/free-disk-space, docker/metadata-action, docker/metadata-action, docker/setup-qemu-action, docker/setup-buildx-action, docker/login-action, docker/login-action, docker/build-push-action, docker/build-push-action
Commands
  • sudo apt-get update \ && sudo apt-get install -y software-properties-common \ && sudo apt-get update \ && sudo add-apt-repository -y ppa:git-core/ppa \ && sudo apt-get update \ && sudo apt-get install -y git
  • echo "Listing top largest packages" pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr) head -n 30 <<< "${pkgs}" echo df -h echo sudo apt-get remove -y '^llvm-.*|^libllvm.*' || true sudo apt-get remove --auto-remove android-sdk-platform-tools snapd || true sudo apt-get purge --auto-remove android-sdk-platform-tools snapd || true sudo rm -rf /usr/local/lib/android sudo apt-get remove -y '^dotnet-.*|^aspnetcore-.*' || true sudo rm -rf /usr/share/dotnet sudo apt-get remove -y '^mono-.*' || true sudo apt-get remove -y '^ghc-.*' || true sudo apt-get remove -y '.*jdk.*|.*jre.*' || true sudo apt-get remove -y 'php.*' || true sudo apt-get remove -y hhvm powershell firefox monodoc-manual msbuild || true sudo apt-get remove -y '^google-.*' || true sudo apt-get remove -y azure-cli || true sudo apt-get remove -y '^mongo.*-.*|^postgresql-.*|^mysql-.*|^mssql-.*' || true sudo apt-get remove -y '^gfortran-.*' || true sudo apt-get remove -y microsoft-edge-stable || true sudo apt-get remove -y firefox || true sudo apt-get remove -y powershell || true sudo apt-get remove -y r-base-core || true sudo apt-get autoremove -y sudo apt-get clean echo echo "Listing top largest packages" pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr) head -n 30 <<< "${pkgs}" echo sudo rm -rfv build || true sudo rm -rf /usr/share/dotnet || true sudo rm -rf /opt/ghc || true sudo rm -rf "/usr/local/share/boost" || true sudo rm -rf "$AGENT_TOOLSDIRECTORY" || true df -h
  • echo "Built image: ${{ steps.meta.outputs.labels }}" >> $GITHUB_STEP_SUMMARY
View raw YAML
---
name: 'build container images (reusable)'

on:
  workflow_call:
    inputs:
      base-image:
        description: 'Base image'
        required: true
        type: string
      grpc-base-image:
        description: 'GRPC Base image, must be a compatible image with base-image'
        required: false
        default: ''
        type: string
      build-type:
        description: 'Build type'
        default: ''
        type: string
      cuda-major-version:
        description: 'CUDA major version'
        default: "12"
        type: string
      cuda-minor-version:
        description: 'CUDA minor version'
        default: "9"
        type: string
      platforms:
        description: 'Platforms'
        default: ''
        type: string
      tag-latest:
        description: 'Tag latest'
        default: ''
        type: string
      tag-suffix:
        description: 'Tag suffix'
        default: ''
        type: string
      skip-drivers:
        description: 'Skip drivers by default'
        default: 'false'
        type: string
      runs-on:
        description: 'Runs on'
        required: true
        default: ''
        type: string
      makeflags:
        description: 'Make Flags'
        required: false
        default: '--jobs=4 --output-sync=target'
        type: string
      ubuntu-version:
        description: 'Ubuntu version'
        required: false
        default: '2204'
        type: string
      ubuntu-codename:
        description: 'Ubuntu codename'
        required: false
        default: 'noble'
        type: string
    secrets:
      dockerUsername:
        required: true
      dockerPassword:
        required: true
      quayUsername:
        required: true
      quayPassword:
        required: true
jobs:
  reusable_image-build:
    runs-on: ${{ inputs.runs-on }}
    steps:

      - name: Free Disk Space (Ubuntu)
        if: inputs.runs-on == 'ubuntu-latest'
        uses: jlumbroso/free-disk-space@main
        with:
          # this might remove tools that are actually needed,
          # if set to "true" but frees about 6 GB
          tool-cache: true
          # all of these default to true, but feel free to set to
          # "false" if necessary for your workflow
          android: true
          dotnet: true
          haskell: true
          large-packages: true
          docker-images: true
          swap-storage: true
      - name: Force Install GIT latest
        run: |
          sudo apt-get update \
          && sudo apt-get install -y software-properties-common \
          && sudo apt-get update \
          && sudo add-apt-repository -y ppa:git-core/ppa \
          && sudo apt-get update \
          && sudo apt-get install -y git
      - name: Checkout
        uses: actions/checkout@v6

      - name: Release space from worker
        if: inputs.runs-on == 'ubuntu-latest'
        run: |
          echo "Listing top largest packages"
          pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr)
          head -n 30 <<< "${pkgs}"
          echo
          df -h
          echo
          sudo apt-get remove -y '^llvm-.*|^libllvm.*' || true
          sudo apt-get remove --auto-remove android-sdk-platform-tools snapd || true
          sudo apt-get purge --auto-remove android-sdk-platform-tools snapd || true
          sudo rm -rf /usr/local/lib/android
          sudo apt-get remove -y '^dotnet-.*|^aspnetcore-.*' || true
          sudo rm -rf /usr/share/dotnet
          sudo apt-get remove -y '^mono-.*' || true
          sudo apt-get remove -y '^ghc-.*' || true
          sudo apt-get remove -y '.*jdk.*|.*jre.*' || true
          sudo apt-get remove -y 'php.*' || true
          sudo apt-get remove -y hhvm powershell firefox monodoc-manual msbuild || true
          sudo apt-get remove -y '^google-.*' || true
          sudo apt-get remove -y azure-cli || true
          sudo apt-get remove -y '^mongo.*-.*|^postgresql-.*|^mysql-.*|^mssql-.*' || true
          sudo apt-get remove -y '^gfortran-.*' || true
          sudo apt-get remove -y microsoft-edge-stable || true
          sudo apt-get remove -y firefox || true
          sudo apt-get remove -y powershell || true
          sudo apt-get remove -y r-base-core || true
          sudo apt-get autoremove -y
          sudo apt-get clean
          echo
          echo "Listing top largest packages"
          pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr)
          head -n 30 <<< "${pkgs}"
          echo
          sudo rm -rfv build || true
          sudo rm -rf /usr/share/dotnet || true
          sudo rm -rf /opt/ghc || true
          sudo rm -rf "/usr/local/share/boost" || true
          sudo rm -rf "$AGENT_TOOLSDIRECTORY" || true
          df -h

      - name: Docker meta
        id: meta
        if: github.event_name != 'pull_request'
        uses: docker/metadata-action@v6
        with:
          images: |
            quay.io/go-skynet/local-ai
            localai/localai
          tags: |
            type=ref,event=branch
            type=semver,pattern={{raw}}
            type=sha
          flavor: |
            latest=${{ inputs.tag-latest }}
            suffix=${{ inputs.tag-suffix }},onlatest=true
      - name: Docker meta for PR
        id: meta_pull_request
        if: github.event_name == 'pull_request'
        uses: docker/metadata-action@v6
        with:
          images: |
            quay.io/go-skynet/ci-tests
          tags: |
            type=ref,event=branch,suffix=localai${{ github.event.number }}-${{ inputs.build-type }}-${{ inputs.cuda-major-version }}-${{ inputs.cuda-minor-version }}
            type=semver,pattern={{raw}},suffix=localai${{ github.event.number }}-${{ inputs.build-type }}-${{ inputs.cuda-major-version }}-${{ inputs.cuda-minor-version }}
            type=sha,suffix=localai${{ github.event.number }}-${{ inputs.build-type }}-${{ inputs.cuda-major-version }}-${{ inputs.cuda-minor-version }}
          flavor: |
            latest=${{ inputs.tag-latest }}
            suffix=${{ inputs.tag-suffix }}
      - name: Set up QEMU
        uses: docker/setup-qemu-action@master
        with:
          platforms: all

      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@master

      - name: Login to DockerHub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v4
        with:
          username: ${{ secrets.dockerUsername }}
          password: ${{ secrets.dockerPassword }}

      - name: Login to DockerHub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v4
        with:
          registry: quay.io
          username: ${{ secrets.quayUsername }}
          password: ${{ secrets.quayPassword }}

      - name: Build and push
        uses: docker/build-push-action@v7
        if: github.event_name != 'pull_request'
        with:
          builder: ${{ steps.buildx.outputs.name }}
          # The build-args MUST be an EXACT match between the image cache and other workflow steps that want to use that cache.
          # This means that even the MAKEFLAGS have to be an EXACT match.
          # If the build-args are not an EXACT match, it will result in a cache miss, which will require GRPC to be built from scratch.
          # This is why some build args like GRPC_VERSION and MAKEFLAGS are hardcoded
          build-args: |
            BUILD_TYPE=${{ inputs.build-type }}
            CUDA_MAJOR_VERSION=${{ inputs.cuda-major-version }}
            CUDA_MINOR_VERSION=${{ inputs.cuda-minor-version }}
            BASE_IMAGE=${{ inputs.base-image }}
            GRPC_BASE_IMAGE=${{ inputs.grpc-base-image || inputs.base-image }}
            GRPC_MAKEFLAGS=--jobs=4 --output-sync=target
            GRPC_VERSION=v1.65.0
            MAKEFLAGS=${{ inputs.makeflags }}
            SKIP_DRIVERS=${{ inputs.skip-drivers }}
            UBUNTU_VERSION=${{ inputs.ubuntu-version }}
            UBUNTU_CODENAME=${{ inputs.ubuntu-codename }}
          context: .
          file: ./Dockerfile
          cache-from: type=gha
          platforms: ${{ inputs.platforms }}
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
### Start testing image
      - name: Build and push
        uses: docker/build-push-action@v7
        if: github.event_name == 'pull_request'
        with:
          builder: ${{ steps.buildx.outputs.name }}
          # The build-args MUST be an EXACT match between the image cache and other workflow steps that want to use that cache.
          # This means that even the MAKEFLAGS have to be an EXACT match.
          # If the build-args are not an EXACT match, it will result in a cache miss, which will require GRPC to be built from scratch.
          # This is why some build args like GRPC_VERSION and MAKEFLAGS are hardcoded
          build-args: |
            BUILD_TYPE=${{ inputs.build-type }}
            CUDA_MAJOR_VERSION=${{ inputs.cuda-major-version }}
            CUDA_MINOR_VERSION=${{ inputs.cuda-minor-version }}
            BASE_IMAGE=${{ inputs.base-image }}
            GRPC_BASE_IMAGE=${{ inputs.grpc-base-image || inputs.base-image }}
            GRPC_MAKEFLAGS=--jobs=4 --output-sync=target
            GRPC_VERSION=v1.65.0
            MAKEFLAGS=${{ inputs.makeflags }}
            SKIP_DRIVERS=${{ inputs.skip-drivers }}
            UBUNTU_VERSION=${{ inputs.ubuntu-version }}
            UBUNTU_CODENAME=${{ inputs.ubuntu-codename }}
          context: .
          file: ./Dockerfile
          cache-from: type=gha
          platforms: ${{ inputs.platforms }}
          #push: true
          tags: ${{ steps.meta_pull_request.outputs.tags }}
          labels: ${{ steps.meta_pull_request.outputs.labels }}
## End testing image
      - name: job summary
        run: |
          echo "Built image: ${{ steps.meta.outputs.labels }}" >> $GITHUB_STEP_SUMMARY
notify-releases .github/workflows/notify-releases.yaml
Triggers
release
Runs on
ubuntu-latest
Jobs
notify-discord
Actions
mudler/localai-github-action, Ilshidur/action-discord
Commands
  • input="$RELEASE_TITLE\b$RELEASE_BODY" # Define the LocalAI API endpoint API_URL="http://localhost:8080/chat/completions" # Create a JSON payload using jq to handle special characters json_payload=$(jq -n --arg input "$input" '{ model: "'$MODEL_NAME'", messages: [ { role: "system", content: "Write a discord message with a bullet point summary of the release notes." }, { role: "user", content: $input } ] }') # Send the request to LocalAI API response=$(curl -s -X POST $API_URL \ -H "Content-Type: application/json" \ -d "$json_payload") # Extract the summary from the response summary=$(echo $response | jq -r '.choices[0].message.content') # Print the summary # -H "Authorization: Bearer $API_KEY" \ { echo 'message<<EOF' echo "$summary" echo EOF } >> "$GITHUB_OUTPUT"
View raw YAML
name: Release notifications
on:
  release:
    types:
      - published

jobs:
  notify-discord:
    if: github.repository == 'mudler/LocalAI'
    runs-on: ubuntu-latest
    env:
        RELEASE_BODY: ${{ github.event.release.body }}
        RELEASE_TITLE: ${{ github.event.release.name }}
        RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}
        MODEL_NAME: gemma-3-12b-it-qat
    steps:
    - uses: mudler/localai-github-action@v1
      with:
        model: 'gemma-3-12b-it-qat' # Any from models.localai.io, or from huggingface.com with: "huggingface://<repository>/file"
    - name: Summarize
      id: summarize
      run: |
            input="$RELEASE_TITLE\b$RELEASE_BODY"

            # Define the LocalAI API endpoint
            API_URL="http://localhost:8080/chat/completions"

            # Create a JSON payload using jq to handle special characters
            json_payload=$(jq -n --arg input "$input" '{
            model: "'$MODEL_NAME'",
            messages: [
                {
                role: "system",
                content: "Write a discord message with a bullet point summary of the release notes."
                },
                {
                role: "user",
                content: $input
                }
            ]
            }')

            # Send the request to LocalAI API
            response=$(curl -s -X POST $API_URL \
            -H "Content-Type: application/json" \
            -d "$json_payload")

            # Extract the summary from the response
            summary=$(echo $response | jq -r '.choices[0].message.content')

            # Print the summary
            #  -H "Authorization: Bearer $API_KEY" \
            {
                echo 'message<<EOF'
                echo "$summary"
                echo EOF
              } >> "$GITHUB_OUTPUT"
    - name: Discord notification
      env:
        DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_URL_RELEASE }}
        DISCORD_USERNAME: "LocalAI-Bot"
        DISCORD_AVATAR: "https://avatars.githubusercontent.com/u/139863280?v=4"
      uses: Ilshidur/action-discord@master
      with:
        args: ${{ steps.summarize.outputs.message }}
release .github/workflows/release.yaml
Triggers
push
Runs on
ubuntu-latest, macos-latest, ubuntu-latest
Jobs
goreleaser, launcher-build-darwin, launcher-build-linux
Actions
goreleaser/goreleaser-action, softprops/action-gh-release, softprops/action-gh-release
Commands
  • make build-launcher-darwin
  • sudo apt-get update sudo apt-get install golang gcc libgl1-mesa-dev xorg-dev libxkbcommon-dev make build-launcher-linux
View raw YAML
name: goreleaser

on:
  push:
    tags:
      - 'v*'

jobs:
  goreleaser:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: 1.23
      - name: Run GoReleaser
        uses: goreleaser/goreleaser-action@v7
        with:
          version: v2.11.0
          args: release --clean
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  launcher-build-darwin:
    runs-on: macos-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: 1.23
      - name: Build launcher for macOS ARM64
        run: |
          make build-launcher-darwin
      - name: Upload DMG to Release
        uses: softprops/action-gh-release@v2
        with:
          files: ./dist/LocalAI.dmg
  launcher-build-linux:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: 1.23
      - name: Build launcher for Linux
        run: |
          sudo apt-get update
          sudo apt-get install golang gcc libgl1-mesa-dev xorg-dev libxkbcommon-dev
          make build-launcher-linux
      - name: Upload Linux launcher artifacts
        uses: softprops/action-gh-release@v2
        with:
          files: ./local-ai-launcher-linux.tar.xz
secscan security .github/workflows/secscan.yaml
Triggers
push, schedule
Runs on
ubuntu-latest
Jobs
tests
Actions
securego/gosec, github/codeql-action/upload-sarif
View raw YAML
name: "Security Scan"

# Run workflow each time code is pushed to your repository and on a schedule.
# The scheduled workflow runs every at 00:00 on Sunday UTC time.
on:
  push:
  schedule:
  - cron: '0 0 * * 0'

jobs:
  tests:
    runs-on: ubuntu-latest
    env:
      GO111MODULE: on
    steps:
      - name: Checkout Source
        uses: actions/checkout@v6
        if: ${{ github.actor != 'dependabot[bot]' }}
      - name: Run Gosec Security Scanner
        if: ${{ github.actor != 'dependabot[bot]' }}
        uses: securego/gosec@v2.22.9
        with:
          # we let the report trigger content trigger a failure using the GitHub Security features.
          args: '-no-fail -fmt sarif -out results.sarif ./...'
      - name: Upload SARIF file
        if: ${{ github.actor != 'dependabot[bot]' }}
        uses: github/codeql-action/upload-sarif@v4
        with:
          # Path to SARIF file relative to the root of the repository
          sarif_file: results.sarif
stalebot perms .github/workflows/stalebot.yml
Triggers
schedule
Runs on
ubuntu-latest
Jobs
stale
Actions
actions/stale
View raw YAML
name: 'Close stale issues and PRs'
permissions:
  issues: write
  pull-requests: write
on:
  schedule:
    - cron: '30 1 * * *'

jobs:
  stale:
    if: github.repository == 'mudler/LocalAI'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v9
        with:
          stale-issue-message: 'This issue is stale because it has been open 90 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
          stale-pr-message: 'This PR is stale because it has been open 90 days with no activity. Remove stale label or comment or this will be closed in 10 days.'
          close-issue-message: 'This issue was closed because it has been stalled for 5 days with no activity.'
          close-pr-message: 'This PR was closed because it has been stalled for 10 days with no activity.'
          days-before-issue-stale: 90
          days-before-pr-stale: 90
          days-before-issue-close: 5
          days-before-pr-close: 10
          exempt-issue-labels: 'roadmap'
          exempt-pr-labels: 'roadmap'
test matrix .github/workflows/test.yml
Triggers
pull_request, push
Runs on
ubuntu-latest, ubuntu-latest, macos-latest
Jobs
tests-linux, tests-e2e-container, tests-apple
Matrix
go-version→ 1.25.x
Actions
jlumbroso/free-disk-space, mxschmitt/action-tmate, mxschmitt/action-tmate, mxschmitt/action-tmate
Commands
  • echo "Listing top largest packages" pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr) head -n 30 <<< "${pkgs}" echo df -h echo sudo apt-get remove -y '^llvm-.*|^libllvm.*' || true sudo apt-get remove --auto-remove android-sdk-platform-tools || true sudo apt-get purge --auto-remove android-sdk-platform-tools || true sudo rm -rf /usr/local/lib/android sudo apt-get remove -y '^dotnet-.*|^aspnetcore-.*' || true sudo rm -rf /usr/share/dotnet sudo apt-get remove -y '^mono-.*' || true sudo apt-get remove -y '^ghc-.*' || true sudo apt-get remove -y '.*jdk.*|.*jre.*' || true sudo apt-get remove -y 'php.*' || true sudo apt-get remove -y hhvm powershell firefox monodoc-manual msbuild || true sudo apt-get remove -y '^google-.*' || true sudo apt-get remove -y azure-cli || true sudo apt-get remove -y '^mongo.*-.*|^postgresql-.*|^mysql-.*|^mssql-.*' || true sudo apt-get remove -y '^gfortran-.*' || true sudo apt-get autoremove -y sudo apt-get clean echo echo "Listing top largest packages" pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr) head -n 30 <<< "${pkgs}" echo sudo rm -rfv build || true df -h
  • go version
  • # Install protoc curl -L -s https://github.com/protocolbuffers/protobuf/releases/download/v26.1/protoc-26.1-linux-x86_64.zip -o protoc.zip && \ unzip -j -d /usr/local/bin protoc.zip bin/protoc && \ rm protoc.zip go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.2 go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@1958fcbe2ca8bd93af633f11e97d44e567e945af PATH="$PATH:$HOME/go/bin" make protogen-go
  • sudo apt-get update sudo apt-get install curl ffmpeg libopus-dev
  • make react-ui
  • make backends/transformers mkdir external && mv backends/transformers external/transformers make backends/llama-cpp backends/local-store backends/silero-vad backends/piper backends/whisper backends/stablediffusion-ggml
  • TRANSFORMER_BACKEND=$PWD/external/transformers/run.sh PATH="$PATH:/root/go/bin" GO_TAGS="tts" make --jobs 5 --output-sync=target test
  • echo "Listing top largest packages" pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr) head -n 30 <<< "${pkgs}" echo df -h echo sudo apt-get remove -y '^llvm-.*|^libllvm.*' || true sudo apt-get remove --auto-remove android-sdk-platform-tools || true sudo apt-get purge --auto-remove android-sdk-platform-tools || true sudo rm -rf /usr/local/lib/android sudo apt-get remove -y '^dotnet-.*|^aspnetcore-.*' || true sudo rm -rf /usr/share/dotnet sudo apt-get remove -y '^mono-.*' || true sudo apt-get remove -y '^ghc-.*' || true sudo apt-get remove -y '.*jdk.*|.*jre.*' || true sudo apt-get remove -y 'php.*' || true sudo apt-get remove -y hhvm powershell firefox monodoc-manual msbuild || true sudo apt-get remove -y '^google-.*' || true sudo apt-get remove -y azure-cli || true sudo apt-get remove -y '^mongo.*-.*|^postgresql-.*|^mysql-.*|^mssql-.*' || true sudo apt-get remove -y '^gfortran-.*' || true sudo apt-get autoremove -y sudo apt-get clean echo echo "Listing top largest packages" pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr) head -n 30 <<< "${pkgs}" echo sudo rm -rfv build || true df -h
View raw YAML
---
name: 'tests'

on:
  pull_request:
  push:
    branches:
      - master
    tags:
      - '*'

env:
  GRPC_VERSION: v1.65.0

concurrency:
  group: ci-tests-${{ github.head_ref || github.ref }}-${{ github.repository }}
  cancel-in-progress: true

jobs:
  tests-linux:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        go-version: ['1.25.x']
    steps:
      - name: Free Disk Space (Ubuntu)
        uses: jlumbroso/free-disk-space@main
        with:
          # this might remove tools that are actually needed,
          # if set to "true" but frees about 6 GB
          tool-cache: true
          # all of these default to true, but feel free to set to
          # "false" if necessary for your workflow
          android: true
          dotnet: true
          haskell: true
          large-packages: true
          docker-images: true
          swap-storage: true
      - name: Release space from worker
        run: |
          echo "Listing top largest packages"
          pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr)
          head -n 30 <<< "${pkgs}"
          echo
          df -h
          echo
          sudo apt-get remove -y '^llvm-.*|^libllvm.*' || true
          sudo apt-get remove --auto-remove android-sdk-platform-tools || true
          sudo apt-get purge --auto-remove android-sdk-platform-tools || true
          sudo rm -rf /usr/local/lib/android
          sudo apt-get remove -y '^dotnet-.*|^aspnetcore-.*' || true
          sudo rm -rf /usr/share/dotnet
          sudo apt-get remove -y '^mono-.*' || true
          sudo apt-get remove -y '^ghc-.*' || true
          sudo apt-get remove -y '.*jdk.*|.*jre.*' || true
          sudo apt-get remove -y 'php.*' || true
          sudo apt-get remove -y hhvm powershell firefox monodoc-manual msbuild || true
          sudo apt-get remove -y '^google-.*' || true
          sudo apt-get remove -y azure-cli || true
          sudo apt-get remove -y '^mongo.*-.*|^postgresql-.*|^mysql-.*|^mssql-.*' || true
          sudo apt-get remove -y '^gfortran-.*' || true
          sudo apt-get autoremove -y
          sudo apt-get clean
          echo
          echo "Listing top largest packages"
          pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr)
          head -n 30 <<< "${pkgs}"
          echo
          sudo rm -rfv build || true
          df -h
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Setup Go ${{ matrix.go-version }}
        uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go-version }}
          cache: false
      # You can test your matrix by printing the current Go version
      - name: Display Go version
        run: go version
      - name: Proto Dependencies
        run: |
          # Install protoc
          curl -L -s https://github.com/protocolbuffers/protobuf/releases/download/v26.1/protoc-26.1-linux-x86_64.zip -o protoc.zip && \
          unzip -j -d /usr/local/bin protoc.zip bin/protoc && \
          rm protoc.zip
          go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.2
          go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@1958fcbe2ca8bd93af633f11e97d44e567e945af
          PATH="$PATH:$HOME/go/bin" make protogen-go
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install curl ffmpeg libopus-dev
      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: '22'
      - name: Build React UI
        run: make react-ui
      - name: Build backends
        run: |
          make backends/transformers
          mkdir external && mv backends/transformers external/transformers
          make backends/llama-cpp backends/local-store backends/silero-vad backends/piper backends/whisper backends/stablediffusion-ggml
      - name: Test
        run: |
          TRANSFORMER_BACKEND=$PWD/external/transformers/run.sh PATH="$PATH:/root/go/bin" GO_TAGS="tts" make --jobs 5 --output-sync=target test
      - name: Setup tmate session if tests fail
        if: ${{ failure() }}
        uses: mxschmitt/action-tmate@v3.23
        with:
          detached: true
          connect-timeout-seconds: 180
          limit-access-to-actor: true

  tests-e2e-container:
    runs-on: ubuntu-latest
    steps:
      - name: Release space from worker
        run: |
          echo "Listing top largest packages"
          pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr)
          head -n 30 <<< "${pkgs}"
          echo
          df -h
          echo
          sudo apt-get remove -y '^llvm-.*|^libllvm.*' || true
          sudo apt-get remove --auto-remove android-sdk-platform-tools || true
          sudo apt-get purge --auto-remove android-sdk-platform-tools || true
          sudo rm -rf /usr/local/lib/android
          sudo apt-get remove -y '^dotnet-.*|^aspnetcore-.*' || true
          sudo rm -rf /usr/share/dotnet
          sudo apt-get remove -y '^mono-.*' || true
          sudo apt-get remove -y '^ghc-.*' || true
          sudo apt-get remove -y '.*jdk.*|.*jre.*' || true
          sudo apt-get remove -y 'php.*' || true
          sudo apt-get remove -y hhvm powershell firefox monodoc-manual msbuild || true
          sudo apt-get remove -y '^google-.*' || true
          sudo apt-get remove -y azure-cli || true
          sudo apt-get remove -y '^mongo.*-.*|^postgresql-.*|^mysql-.*|^mssql-.*' || true
          sudo apt-get remove -y '^gfortran-.*' || true
          sudo apt-get autoremove -y
          sudo apt-get clean
          echo
          echo "Listing top largest packages"
          pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr)
          head -n 30 <<< "${pkgs}"
          echo
          sudo rm -rfv build || true
          df -h
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Dependencies
        run: |
          # Install protoc
          curl -L -s https://github.com/protocolbuffers/protobuf/releases/download/v26.1/protoc-26.1-linux-x86_64.zip -o protoc.zip && \
          unzip -j -d /usr/local/bin protoc.zip bin/protoc && \
          rm protoc.zip
          go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.2
          go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@1958fcbe2ca8bd93af633f11e97d44e567e945af
          PATH="$PATH:$HOME/go/bin" make protogen-go
      - name: Test
        run: |
            PATH="$PATH:$HOME/go/bin" make backends/local-store backends/silero-vad backends/llama-cpp backends/whisper backends/piper backends/stablediffusion-ggml docker-build-e2e e2e-aio
      - name: Setup tmate session if tests fail
        if: ${{ failure() }}
        uses: mxschmitt/action-tmate@v3.23
        with:
          detached: true
          connect-timeout-seconds: 180
          limit-access-to-actor: true

  tests-apple:
    runs-on: macos-latest
    strategy:
      matrix:
        go-version: ['1.25.x']
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Setup Go ${{ matrix.go-version }}
        uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go-version }}
          cache: false
      # You can test your matrix by printing the current Go version
      - name: Display Go version
        run: go version
      - name: Dependencies
        run: |
          brew install protobuf grpc make protoc-gen-go protoc-gen-go-grpc libomp llvm opus
          pip install --user --no-cache-dir grpcio-tools grpcio
      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: '22'
      - name: Build React UI
        run: make react-ui
      - name: Build llama-cpp-darwin
        run: |
          make protogen-go
          make backends/llama-cpp-darwin
      - name: Test
        run: |
          export C_INCLUDE_PATH=/usr/local/include
          export CPLUS_INCLUDE_PATH=/usr/local/include
          export CC=/opt/homebrew/opt/llvm/bin/clang
          # Used to run the newer GNUMake version from brew that supports --output-sync
          export PATH="/opt/homebrew/opt/make/libexec/gnubin:$PATH"
          PATH="$PATH:$HOME/go/bin" make protogen-go
          PATH="$PATH:$HOME/go/bin" BUILD_TYPE="GITHUB_CI_HAS_BROKEN_METAL" CMAKE_ARGS="-DGGML_F16C=OFF -DGGML_AVX512=OFF -DGGML_AVX2=OFF -DGGML_FMA=OFF" make --jobs 4 --output-sync=target test
      - name: Setup tmate session if tests fail
        if: ${{ failure() }}
        uses: mxschmitt/action-tmate@v3.23
        with:
          detached: true
          connect-timeout-seconds: 180
          limit-access-to-actor: true
test-extra .github/workflows/test-extra.yml
Triggers
pull_request, push
Runs on
ubuntu-latest, ubuntu-latest, ubuntu-latest, ubuntu-latest, ubuntu-latest, ubuntu-latest, ubuntu-latest, ubuntu-latest, ubuntu-latest, ubuntu-latest, ubuntu-latest, ubuntu-latest, ubuntu-latest
Jobs
tests-transformers, tests-rerankers, tests-diffusers, tests-coqui, tests-moonshine, tests-pocket-tts, tests-qwen-tts, tests-qwen-asr, tests-nemo, tests-voxcpm, tests-llama-cpp-quantization, tests-acestep-cpp, tests-voxtral
Commands
  • sudo apt-get update sudo apt-get install build-essential ffmpeg # Install UV curl -LsSf https://astral.sh/uv/install.sh | sh sudo apt-get install -y ca-certificates cmake curl patch python3-pip sudo apt-get install -y libopencv-dev pip install --user --no-cache-dir grpcio-tools==1.64.1
  • make --jobs=5 --output-sync=target -C backend/python/transformers make --jobs=5 --output-sync=target -C backend/python/transformers test
  • sudo apt-get update sudo apt-get install build-essential ffmpeg # Install UV curl -LsSf https://astral.sh/uv/install.sh | sh sudo apt-get install -y ca-certificates cmake curl patch python3-pip sudo apt-get install -y libopencv-dev pip install --user --no-cache-dir grpcio-tools==1.64.1
  • make --jobs=5 --output-sync=target -C backend/python/rerankers make --jobs=5 --output-sync=target -C backend/python/rerankers test
  • sudo apt-get update sudo apt-get install -y build-essential ffmpeg sudo apt-get install -y ca-certificates cmake curl patch python3-pip sudo apt-get install -y libopencv-dev # Install UV curl -LsSf https://astral.sh/uv/install.sh | sh pip install --user --no-cache-dir grpcio-tools==1.64.1
  • make --jobs=5 --output-sync=target -C backend/python/diffusers make --jobs=5 --output-sync=target -C backend/python/diffusers test
  • sudo apt-get update sudo apt-get install -y build-essential ffmpeg sudo apt-get install -y ca-certificates cmake curl patch espeak espeak-ng python3-pip # Install UV curl -LsSf https://astral.sh/uv/install.sh | sh pip install --user --no-cache-dir grpcio-tools==1.64.1
  • make --jobs=5 --output-sync=target -C backend/python/coqui make --jobs=5 --output-sync=target -C backend/python/coqui test
View raw YAML
---
name: 'Tests extras backends'

on:
  pull_request:
  push:
    branches:
      - master
    tags:
      - '*'

concurrency:
  group: ci-tests-extra-${{ github.head_ref || github.ref }}-${{ github.repository }}
  cancel-in-progress: true

jobs:
  # Requires CUDA
  # tests-chatterbox-tts:
  #   runs-on: ubuntu-latest
  #   steps:
  #     - name: Clone
  #       uses: actions/checkout@v6
  #       with:
  #         submodules: true
  #     - name: Dependencies
  #       run: |
  #         sudo apt-get update
  #         sudo apt-get install build-essential ffmpeg
  #         # Install UV
  #         curl -LsSf https://astral.sh/uv/install.sh | sh
  #         sudo apt-get install -y ca-certificates cmake curl patch python3-pip
  #         sudo apt-get install -y libopencv-dev
  #         pip install --user --no-cache-dir grpcio-tools==1.64.1

  #     - name: Test chatterbox-tts
  #       run: |
  #          make --jobs=5 --output-sync=target -C backend/python/chatterbox
  #          make --jobs=5 --output-sync=target -C backend/python/chatterbox test
  tests-transformers:
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install build-essential ffmpeg
          # Install UV
          curl -LsSf https://astral.sh/uv/install.sh | sh
          sudo apt-get install -y ca-certificates cmake curl patch python3-pip
          sudo apt-get install -y libopencv-dev
          pip install --user --no-cache-dir grpcio-tools==1.64.1

      - name: Test transformers
        run: |
           make --jobs=5 --output-sync=target -C backend/python/transformers
           make --jobs=5 --output-sync=target -C backend/python/transformers test
  tests-rerankers:
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install build-essential ffmpeg
          # Install UV
          curl -LsSf https://astral.sh/uv/install.sh | sh
          sudo apt-get install -y ca-certificates cmake curl patch python3-pip
          sudo apt-get install -y libopencv-dev
          pip install --user --no-cache-dir grpcio-tools==1.64.1

      - name: Test rerankers
        run: |
           make --jobs=5 --output-sync=target -C backend/python/rerankers
           make --jobs=5 --output-sync=target -C backend/python/rerankers test

  tests-diffusers:
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential ffmpeg
          sudo apt-get install -y ca-certificates cmake curl patch python3-pip
          sudo apt-get install -y libopencv-dev
          # Install UV
          curl -LsSf https://astral.sh/uv/install.sh | sh
          pip install --user --no-cache-dir grpcio-tools==1.64.1
      - name: Test diffusers
        run: |
          make --jobs=5 --output-sync=target -C backend/python/diffusers
          make --jobs=5 --output-sync=target -C backend/python/diffusers test

  #tests-vllm:
  #  runs-on: ubuntu-latest
  #  steps:
  #    - name: Clone
  #      uses: actions/checkout@v6
  #      with:
  #        submodules: true
  #    - name: Dependencies
  #      run: |
  #        sudo apt-get update
  #        sudo apt-get install -y build-essential ffmpeg
  #        sudo apt-get install -y ca-certificates cmake curl patch python3-pip
  #        sudo apt-get install -y libopencv-dev
  #        # Install UV
  #        curl -LsSf https://astral.sh/uv/install.sh | sh
  #        pip install --user --no-cache-dir grpcio-tools==1.64.1
  #    - name: Test vllm backend
  #      run: |
  #        make --jobs=5 --output-sync=target -C backend/python/vllm
  #        make --jobs=5 --output-sync=target -C backend/python/vllm test
  # tests-transformers-musicgen:
  #   runs-on: ubuntu-latest
  #   steps:
  #     - name: Clone
  #       uses: actions/checkout@v6
  #       with:
  #         submodules: true
  #     - name: Dependencies
  #       run: |
  #         sudo apt-get update
  #         sudo apt-get install build-essential ffmpeg
  #         # Install UV
  #         curl -LsSf https://astral.sh/uv/install.sh | sh
  #         sudo apt-get install -y ca-certificates cmake curl patch python3-pip
  #         sudo apt-get install -y libopencv-dev
  #         pip install --user --no-cache-dir grpcio-tools==1.64.1

  #     - name: Test transformers-musicgen
  #       run: |
  #          make --jobs=5 --output-sync=target -C backend/python/transformers-musicgen
  #          make --jobs=5 --output-sync=target -C backend/python/transformers-musicgen test

  # tests-bark:
  #   runs-on: ubuntu-latest
  #   steps:
  #     - name: Release space from worker
  #       run: |
  #           echo "Listing top largest packages"
  #           pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr)
  #           head -n 30 <<< "${pkgs}"
  #           echo
  #           df -h
  #           echo
  #           sudo apt-get remove -y '^llvm-.*|^libllvm.*' || true
  #           sudo apt-get remove --auto-remove android-sdk-platform-tools || true
  #           sudo apt-get purge --auto-remove android-sdk-platform-tools || true
  #           sudo rm -rf /usr/local/lib/android
  #           sudo apt-get remove -y '^dotnet-.*|^aspnetcore-.*' || true
  #           sudo rm -rf /usr/share/dotnet
  #           sudo apt-get remove -y '^mono-.*' || true
  #           sudo apt-get remove -y '^ghc-.*' || true
  #           sudo apt-get remove -y '.*jdk.*|.*jre.*' || true
  #           sudo apt-get remove -y 'php.*' || true
  #           sudo apt-get remove -y hhvm powershell firefox monodoc-manual msbuild || true
  #           sudo apt-get remove -y '^google-.*' || true
  #           sudo apt-get remove -y azure-cli || true
  #           sudo apt-get remove -y '^mongo.*-.*|^postgresql-.*|^mysql-.*|^mssql-.*' || true
  #           sudo apt-get remove -y '^gfortran-.*' || true
  #           sudo apt-get remove -y microsoft-edge-stable || true
  #           sudo apt-get remove -y firefox || true
  #           sudo apt-get remove -y powershell || true
  #           sudo apt-get remove -y r-base-core || true
  #           sudo apt-get autoremove -y
  #           sudo apt-get clean
  #           echo
  #           echo "Listing top largest packages"
  #           pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr)
  #           head -n 30 <<< "${pkgs}"
  #           echo
  #           sudo rm -rfv build || true
  #           sudo rm -rf /usr/share/dotnet || true
  #           sudo rm -rf /opt/ghc || true
  #           sudo rm -rf "/usr/local/share/boost" || true
  #           sudo rm -rf "$AGENT_TOOLSDIRECTORY" || true
  #           df -h
  #     - name: Clone
  #       uses: actions/checkout@v6
  #       with:
  #         submodules: true
  #     - name: Dependencies
  #       run: |
  #         sudo apt-get update
  #         sudo apt-get install build-essential ffmpeg
  #         # Install UV
  #         curl -LsSf https://astral.sh/uv/install.sh | sh
  #         sudo apt-get install -y ca-certificates cmake curl patch python3-pip
  #         sudo apt-get install -y libopencv-dev
  #         pip install --user --no-cache-dir grpcio-tools==1.64.1

  #     - name: Test bark
  #       run: |
  #          make --jobs=5 --output-sync=target -C backend/python/bark
  #          make --jobs=5 --output-sync=target -C backend/python/bark test


  # Below tests needs GPU. Commented out for now
  # TODO: Re-enable as soon as we have GPU nodes
  # tests-vllm:
  #   runs-on: ubuntu-latest
  #   steps:
  #     - name: Clone
  #       uses: actions/checkout@v6
  #       with:
  #         submodules: true
  #     - name: Dependencies
  #       run: |
  #         sudo apt-get update
  #         sudo apt-get install build-essential ffmpeg
  #         # Install UV
  #         curl -LsSf https://astral.sh/uv/install.sh | sh
  #         sudo apt-get install -y ca-certificates cmake curl patch python3-pip
  #         sudo apt-get install -y libopencv-dev
  #         pip install --user --no-cache-dir grpcio-tools==1.64.1
  #     - name: Test vllm
  #       run: |
  #          make --jobs=5 --output-sync=target -C backend/python/vllm
  #          make --jobs=5 --output-sync=target -C backend/python/vllm test

  tests-coqui:
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential ffmpeg
          sudo apt-get install -y ca-certificates cmake curl patch espeak espeak-ng python3-pip
          # Install UV
          curl -LsSf https://astral.sh/uv/install.sh | sh
          pip install --user --no-cache-dir grpcio-tools==1.64.1
      - name: Test coqui
        run: |
          make --jobs=5 --output-sync=target -C backend/python/coqui
          make --jobs=5 --output-sync=target -C backend/python/coqui test
  tests-moonshine:
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential ffmpeg
          sudo apt-get install -y ca-certificates cmake curl patch python3-pip
          # Install UV
          curl -LsSf https://astral.sh/uv/install.sh | sh
          pip install --user --no-cache-dir grpcio-tools==1.64.1
      - name: Test moonshine
        run: |
          make --jobs=5 --output-sync=target -C backend/python/moonshine
          make --jobs=5 --output-sync=target -C backend/python/moonshine test
  tests-pocket-tts:
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential ffmpeg
          sudo apt-get install -y ca-certificates cmake curl patch python3-pip
          # Install UV
          curl -LsSf https://astral.sh/uv/install.sh | sh
          pip install --user --no-cache-dir grpcio-tools==1.64.1
      - name: Test pocket-tts
        run: |
          make --jobs=5 --output-sync=target -C backend/python/pocket-tts
          make --jobs=5 --output-sync=target -C backend/python/pocket-tts test
  tests-qwen-tts:
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential ffmpeg
          sudo apt-get install -y ca-certificates cmake curl patch python3-pip
          # Install UV
          curl -LsSf https://astral.sh/uv/install.sh | sh
          pip install --user --no-cache-dir grpcio-tools==1.64.1
      - name: Test qwen-tts
        run: |
          make --jobs=5 --output-sync=target -C backend/python/qwen-tts
          make --jobs=5 --output-sync=target -C backend/python/qwen-tts test
  # TODO: s2-pro model is too large to load on CPU-only CI runners — re-enable
  # when we have GPU runners or a smaller test model.
  # tests-fish-speech:
  #   runs-on: ubuntu-latest
  #   timeout-minutes: 45
  #   steps:
  #     - name: Clone
  #       uses: actions/checkout@v6
  #       with:
  #         submodules: true
  #     - name: Dependencies
  #       run: |
  #         sudo apt-get update
  #         sudo apt-get install -y build-essential ffmpeg portaudio19-dev
  #         sudo apt-get install -y ca-certificates cmake curl patch python3-pip
  #         # Install UV
  #         curl -LsSf https://astral.sh/uv/install.sh | sh
  #         pip install --user --no-cache-dir grpcio-tools==1.64.1
  #     - name: Test fish-speech
  #       run: |
  #         make --jobs=5 --output-sync=target -C backend/python/fish-speech
  #         make --jobs=5 --output-sync=target -C backend/python/fish-speech test
  tests-qwen-asr:
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential ffmpeg sox
          sudo apt-get install -y ca-certificates cmake curl patch python3-pip
          # Install UV
          curl -LsSf https://astral.sh/uv/install.sh | sh
          pip install --user --no-cache-dir grpcio-tools==1.64.1
      - name: Test qwen-asr
        run: |
          make --jobs=5 --output-sync=target -C backend/python/qwen-asr
          make --jobs=5 --output-sync=target -C backend/python/qwen-asr test
  tests-nemo:
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential ffmpeg sox
          sudo apt-get install -y ca-certificates cmake curl patch python3-pip
          # Install UV
          curl -LsSf https://astral.sh/uv/install.sh | sh
          pip install --user --no-cache-dir grpcio-tools==1.64.1
      - name: Test nemo
        run: |
          make --jobs=5 --output-sync=target -C backend/python/nemo
          make --jobs=5 --output-sync=target -C backend/python/nemo test
  tests-voxcpm:
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install build-essential ffmpeg
          sudo apt-get install -y ca-certificates cmake curl patch python3-pip
          # Install UV
          curl -LsSf https://astral.sh/uv/install.sh | sh
          pip install --user --no-cache-dir grpcio-tools==1.64.1
      - name: Test voxcpm
        run: |
          make --jobs=5 --output-sync=target -C backend/python/voxcpm
          make --jobs=5 --output-sync=target -C backend/python/voxcpm test
  tests-llama-cpp-quantization:
    runs-on: ubuntu-latest
    timeout-minutes: 30
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential cmake curl git python3-pip
          # Install UV
          curl -LsSf https://astral.sh/uv/install.sh | sh
          pip install --user --no-cache-dir grpcio-tools==1.64.1
      - name: Build llama-quantize from llama.cpp
        run: |
          git clone --depth 1 https://github.com/ggml-org/llama.cpp.git /tmp/llama.cpp
          cmake -B /tmp/llama.cpp/build -S /tmp/llama.cpp -DGGML_NATIVE=OFF
          cmake --build /tmp/llama.cpp/build --target llama-quantize -j$(nproc)
          sudo cp /tmp/llama.cpp/build/bin/llama-quantize /usr/local/bin/
      - name: Install backend
        run: |
          make --jobs=5 --output-sync=target -C backend/python/llama-cpp-quantization
      - name: Test llama-cpp-quantization
        run: |
          make --jobs=5 --output-sync=target -C backend/python/llama-cpp-quantization test
  tests-acestep-cpp:
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential cmake curl libopenblas-dev ffmpeg
      - name: Setup Go
        uses: actions/setup-go@v5
      - name: Display Go version
        run: go version
      - name: Proto Dependencies
        run: |
          # Install protoc
          curl -L -s https://github.com/protocolbuffers/protobuf/releases/download/v26.1/protoc-26.1-linux-x86_64.zip -o protoc.zip && \
          unzip -j -d /usr/local/bin protoc.zip bin/protoc && \
          rm protoc.zip
          go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.2
          go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@1958fcbe2ca8bd93af633f11e97d44e567e945af
          PATH="$PATH:$HOME/go/bin" make protogen-go
      - name: Build acestep-cpp
        run: |
          make --jobs=5 --output-sync=target -C backend/go/acestep-cpp
      - name: Test acestep-cpp
        run: |
          make --jobs=5 --output-sync=target -C backend/go/acestep-cpp test
  tests-voxtral:
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential cmake curl libopenblas-dev ffmpeg
      - name: Setup Go
        uses: actions/setup-go@v5
      # You can test your matrix by printing the current Go version
      - name: Display Go version
        run: go version
      - name: Proto Dependencies
        run: |
          # Install protoc
          curl -L -s https://github.com/protocolbuffers/protobuf/releases/download/v26.1/protoc-26.1-linux-x86_64.zip -o protoc.zip && \
          unzip -j -d /usr/local/bin protoc.zip bin/protoc && \
          rm protoc.zip
          go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.2
          go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@1958fcbe2ca8bd93af633f11e97d44e567e945af
          PATH="$PATH:$HOME/go/bin" make protogen-go
      - name: Build voxtral
        run: |
          make --jobs=5 --output-sync=target -C backend/go/voxtral
      - name: Test voxtral
        run: |
          make --jobs=5 --output-sync=target -C backend/go/voxtral test
tests-e2e matrix .github/workflows/tests-e2e.yml
Triggers
pull_request, push
Runs on
ubuntu-latest
Jobs
tests-e2e-backend
Matrix
go-version→ 1.25.x
Actions
mxschmitt/action-tmate
Commands
  • go version
  • # Install protoc curl -L -s https://github.com/protocolbuffers/protobuf/releases/download/v26.1/protoc-26.1-linux-x86_64.zip -o protoc.zip && \ unzip -j -d /usr/local/bin protoc.zip bin/protoc && \ rm protoc.zip go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.2 go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@1958fcbe2ca8bd93af633f11e97d44e567e945af PATH="$PATH:$HOME/go/bin" make protogen-go
  • sudo apt-get update sudo apt-get install -y build-essential libopus-dev
  • make react-ui
  • PATH="$PATH:$HOME/go/bin" make build-mock-backend test-e2e
View raw YAML
---
name: 'E2E Backend Tests'

on:
  pull_request:
  push:
    branches:
      - master
    tags:
      - '*'

concurrency:
  group: ci-tests-e2e-backend-${{ github.head_ref || github.ref }}-${{ github.repository }}
  cancel-in-progress: true

jobs:
  tests-e2e-backend:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        go-version: ['1.25.x']
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Setup Go ${{ matrix.go-version }}
        uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go-version }}
          cache: false
      - name: Display Go version
        run: go version
      - name: Proto Dependencies
        run: |
          # Install protoc
          curl -L -s https://github.com/protocolbuffers/protobuf/releases/download/v26.1/protoc-26.1-linux-x86_64.zip -o protoc.zip && \
          unzip -j -d /usr/local/bin protoc.zip bin/protoc && \
          rm protoc.zip
          go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.2
          go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@1958fcbe2ca8bd93af633f11e97d44e567e945af
          PATH="$PATH:$HOME/go/bin" make protogen-go
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential libopus-dev
      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: '22'
      - name: Build React UI
        run: make react-ui
      - name: Test Backend E2E
        run: |
          PATH="$PATH:$HOME/go/bin" make build-mock-backend test-e2e
      - name: Setup tmate session if tests fail
        if: ${{ failure() }}
        uses: mxschmitt/action-tmate@v3.23
        with:
          detached: true
          connect-timeout-seconds: 180
          limit-access-to-actor: true
tests-ui-e2e matrix .github/workflows/tests-ui-e2e.yml
Triggers
pull_request, push
Runs on
ubuntu-latest
Jobs
tests-ui-e2e
Matrix
go-version→ 1.26.x
Actions
mxschmitt/action-tmate
Commands
  • curl -L -s https://github.com/protocolbuffers/protobuf/releases/download/v26.1/protoc-26.1-linux-x86_64.zip -o protoc.zip && \ unzip -j -d /usr/local/bin protoc.zip bin/protoc && \ rm protoc.zip go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.2 go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@1958fcbe2ca8bd93af633f11e97d44e567e945af
  • sudo apt-get update sudo apt-get install -y build-essential libopus-dev
  • PATH="$PATH:$HOME/go/bin" make build-ui-test-server
  • npm install npx playwright install --with-deps chromium
  • npx playwright test
View raw YAML
---
name: 'UI E2E Tests'

on:
  pull_request:
    paths:
      - 'core/http/**'
      - 'tests/e2e-ui/**'
      - 'tests/e2e/mock-backend/**'
  push:
    branches:
      - master

concurrency:
  group: ci-tests-ui-e2e-${{ github.head_ref || github.ref }}-${{ github.repository }}
  cancel-in-progress: true

jobs:
  tests-ui-e2e:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        go-version: ['1.26.x']
    steps:
      - name: Clone
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Setup Go ${{ matrix.go-version }}
        uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go-version }}
          cache: false
      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: '22'
      - name: Proto Dependencies
        run: |
          curl -L -s https://github.com/protocolbuffers/protobuf/releases/download/v26.1/protoc-26.1-linux-x86_64.zip -o protoc.zip && \
          unzip -j -d /usr/local/bin protoc.zip bin/protoc && \
          rm protoc.zip
          go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.2
          go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@1958fcbe2ca8bd93af633f11e97d44e567e945af
      - name: System Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential libopus-dev
      - name: Build UI test server
        run: PATH="$PATH:$HOME/go/bin" make build-ui-test-server
      - name: Install Playwright
        working-directory: core/http/react-ui
        run: |
          npm install
          npx playwright install --with-deps chromium
      - name: Run Playwright tests
        working-directory: core/http/react-ui
        run: npx playwright test
      - name: Upload Playwright report
        if: ${{ failure() }}
        uses: actions/upload-artifact@v7
        with:
          name: playwright-report
          path: core/http/react-ui/playwright-report/
          retention-days: 7
      - name: Setup tmate session if tests fail
        if: ${{ failure() }}
        uses: mxschmitt/action-tmate@v3.23
        with:
          detached: true
          connect-timeout-seconds: 180
          limit-access-to-actor: true
update_swagger .github/workflows/update_swagger.yaml
Triggers
schedule, workflow_dispatch
Runs on
ubuntu-latest
Jobs
swagger
Actions
peter-evans/create-pull-request
Commands
  • sudo apt-get update sudo apt-get install protobuf-compiler
  • go install github.com/swaggo/swag/cmd/swag@latest go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@1958fcbe2ca8bd93af633f11e97d44e567e945af go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.2
  • make protogen-go swagger
View raw YAML
name: Update swagger
on:
  schedule:
    - cron: 0 20 * * *
  workflow_dispatch:
jobs:
  swagger:
    if: github.repository == 'mudler/LocalAI'
    strategy:
      fail-fast: false
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v5
        with:
          go-version: 'stable'
      - name: Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install protobuf-compiler
      - run: |
          go install github.com/swaggo/swag/cmd/swag@latest
          go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@1958fcbe2ca8bd93af633f11e97d44e567e945af
          go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.2
      - name: Bump swagger 🔧
        run: |
          make protogen-go swagger
      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v8
        with:
          token: ${{ secrets.UPDATE_BOT_TOKEN }}
          push-to-fork: ci-forks/LocalAI
          commit-message: 'feat(swagger): update swagger'
          title: 'feat(swagger): update swagger'
          branch: "update/swagger"
          body:  Update swagger
          signoff: true

yaml-check .github/workflows/yaml-check.yml
Triggers
pull_request
Runs on
ubuntu-latest
Jobs
yamllint
Actions
karancode/yamllint-github-action, karancode/yamllint-github-action
View raw YAML
name: 'Yamllint GitHub Actions'
on:
  - pull_request
jobs:
  yamllint:
    name: 'Yamllint'
    runs-on: ubuntu-latest
    steps:
      - name: 'Checkout'
        uses: actions/checkout@master
      - name: 'Yamllint model gallery'
        uses: karancode/yamllint-github-action@master
        with:
          yamllint_file_or_dir: 'gallery'
          yamllint_strict: false
          yamllint_comment: true
        env:
          GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: 'Yamllint Backend gallery'
        uses: karancode/yamllint-github-action@master
        with:
          yamllint_file_or_dir: 'backend'
          yamllint_strict: false
          yamllint_comment: true
        env:
          GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}