.agents/adding-backends.md
When adding a new backend to LocalAI, you need to update several files to ensure the backend is properly built, tested, and registered. Here's a step-by-step guide based on the pattern used for adding backends like moonshine:
Create the backend directory under the appropriate location:
backend/python/<backend-name>/backend/go/<backend-name>/backend/cpp/<backend-name>/For Python backends, you'll typically need:
backend.py - Main gRPC server implementationMakefile - Build configurationinstall.sh - Installation script for dependenciesprotogen.sh - Protocol buffer generation scriptrequirements.txt - Python dependenciesrun.sh - Runtime scripttest.py / test.sh - Test files.github/workflows/backend.ymlAdd build matrix entries for each platform/GPU type you want to support. Look at similar backends (e.g., chatterbox, faster-whisper) for reference.
Placement in file:
cpu-chatterbox)gpu-nvidia-cuda-12-chatterbox)gpu-nvidia-cuda-13-chatterbox)Additional build types you may need:
build-type: 'hipblas' with base-image: "rocm/dev-ubuntu-24.04:6.4.4"build-type: 'intel' or build-type: 'sycl_f16'/sycl_f32 with base-image: "intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04"build-type: 'l4t' with platforms: 'linux/arm64' and runs-on: 'ubuntu-24.04-arm'backend/index.yamlStep 3a: Add Meta Definition
Add a YAML anchor definition in the ## metas section (around line 2-300). Look for similar backends to use as a template such as diffusers or chatterbox
Step 3b: Add Image Entries
Add image entries at the end of the file, following the pattern of similar backends such as diffusers or chatterbox. Include both latest (production) and master (development) tags.
The Makefile needs to be updated in several places to support building and testing the new backend:
Step 4a: Add to .NOTPARALLEL
Add backends/<backend-name> to the .NOTPARALLEL line (around line 2) to prevent parallel execution conflicts:
.NOTPARALLEL: ... backends/<backend-name>
Step 4b: Add to prepare-test-extra
Add the backend to the prepare-test-extra target (around line 312) to prepare it for testing:
prepare-test-extra: protogen-python
...
$(MAKE) -C backend/python/<backend-name>
Step 4c: Add to test-extra
Add the backend to the test-extra target (around line 319) to run its tests:
test-extra: prepare-test-extra
...
$(MAKE) -C backend/python/<backend-name> test
Step 4d: Add Backend Definition
Add a backend definition variable in the backend definitions section (around line 428-457). The format depends on the backend type:
For Python backends with root context (like faster-whisper, coqui):
BACKEND_<BACKEND_NAME> = <backend-name>|python|.|false|true
For Python backends with ./backend context (like chatterbox, moonshine):
BACKEND_<BACKEND_NAME> = <backend-name>|python|./backend|false|true
For Go backends:
BACKEND_<BACKEND_NAME> = <backend-name>|golang|.|false|true
Step 4e: Generate Docker Build Target
Add an eval call to generate the docker-build target (around line 480-501):
$(eval $(call generate-docker-build-target,$(BACKEND_<BACKEND_NAME>)))
Step 4f: Add to docker-build-backends
Add docker-build-<backend-name> to the docker-build-backends target (around line 507):
docker-build-backends: ... docker-build-<backend-name>
Determining the Context:
backend/python/<backend-name>/ and uses ./backend as context in the workflow file, use ./backend contextbackend/python/<backend-name>/ but uses . as context in the workflow file, use . contextAfter adding a new backend, verify:
.github/workflows/backend.yml for all desired platformsbackend/index.yaml in the ## metas sectionbackend/index.yaml for all build variants (latest + development).NOTPARALLEL, prepare-test-extra, test-extra, backend definition, docker-build target eval, docker-build-backends)faster-whisper pattern)For reference, when moonshine was added:
backend/python/moonshine/{backend.py, Makefile, install.sh, protogen.sh, requirements.txt, run.sh, test.py, test.sh}.NOTPARALLEL lineprepare-test-extra and test-extra targetsBACKEND_MOONSHINE = moonshine|python|./backend|false|truedocker-build-moonshine to docker-build-backends