@@ -106,14 +106,25 @@ react-ui-docker:
106106core/http/react-ui/dist : react-ui
107107
108108# # Build:
109- build : protogen-go install-go-tools core/http/react-ui/dist # # Build the project
109+
110+ # Build the opus shim if libopus is available
111+ build-opus-shim :
112+ @if command -v pkg-config > /dev/null 2>&1 && pkg-config --exists opus; then \
113+ echo " $( GREEN) I Building opus shim (libopus found)$( RESET) " ; \
114+ $(MAKE ) -C pkg/opus/shim; \
115+ else \
116+ echo " $( YELLOW) W libopus-dev not found, skipping opus shim build (WebRTC audio will not work)$( RESET) " ; \
117+ fi
118+
119+ build : protogen-go install-go-tools build-opus-shim core/http/react-ui/dist # # Build the project
110120 $(info ${GREEN}I local-ai build info:${RESET})
111121 $(info ${GREEN}I BUILD_TYPE: ${YELLOW}$(BUILD_TYPE ) ${RESET})
112122 $(info ${GREEN}I GO_TAGS: ${YELLOW}$(GO_TAGS ) ${RESET})
113123 $(info ${GREEN}I LD_FLAGS: ${YELLOW}$(LD_FLAGS ) ${RESET})
114124 $(info ${GREEN}I UPX: ${YELLOW}$(UPX ) ${RESET})
115125 rm -rf $(BINARY_NAME ) || true
116126 CGO_LDFLAGS=" $( CGO_LDFLAGS) " $(GOCMD ) build -ldflags " $( LD_FLAGS) " -tags " $( GO_TAGS) " -o $(BINARY_NAME ) ./cmd/local-ai
127+ @if [ -f pkg/opus/shim/libopusshim.so ]; then cp pkg/opus/shim/libopusshim.so . ; fi
117128
118129build-launcher : # # Build the launcher application
119130 $(info ${GREEN}I local-ai launcher build info:${RESET})
@@ -250,6 +261,73 @@ test-stablediffusion: prepare-test
250261test-stores :
251262 $(GOCMD ) run github.com/onsi/ginkgo/v2/ginkgo --label-filter=" stores" --flake-attempts $(TEST_FLAKES ) -v -r tests/integration
252263
264+ test-realtime : build-mock-backend
265+ @echo ' Running realtime e2e tests (mock backend)'
266+ $(GOCMD ) run github.com/onsi/ginkgo/v2/ginkgo --label-filter=" Realtime && !real-models" --flake-attempts $(TEST_FLAKES ) -v -r ./tests/e2e
267+
268+ # Real-model realtime tests. Set REALTIME_TEST_MODEL to use your own pipeline,
269+ # or leave unset to auto-build one from the component env vars below.
270+ REALTIME_VAD? =silero-vad-ggml
271+ REALTIME_STT? =whisper-1
272+ REALTIME_LLM? =qwen3-0.6b
273+ REALTIME_TTS? =tts-1
274+ REALTIME_BACKENDS_PATH? =$(abspath ./) /backends
275+
276+ test-realtime-models : build-mock-backend
277+ @echo ' Running realtime e2e tests (real models)'
278+ REALTIME_TEST_MODEL=$$ {REALTIME_TEST_MODEL:-realtime-test-pipeline} \
279+ REALTIME_VAD=$(REALTIME_VAD ) \
280+ REALTIME_STT=$(REALTIME_STT ) \
281+ REALTIME_LLM=$(REALTIME_LLM ) \
282+ REALTIME_TTS=$(REALTIME_TTS ) \
283+ REALTIME_BACKENDS_PATH=$(REALTIME_BACKENDS_PATH ) \
284+ $(GOCMD ) run github.com/onsi/ginkgo/v2/ginkgo --label-filter=" Realtime" --flake-attempts $(TEST_FLAKES ) -v -r ./tests/e2e
285+
286+ # --- Container-based real-model testing ---
287+
288+ REALTIME_BACKEND_NAMES ?= silero-vad whisper llama-cpp kokoro
289+ REALTIME_MODELS_DIR ?= $(abspath ./models)
290+ REALTIME_BACKENDS_DIR ?= $(abspath ./local-backends)
291+ REALTIME_DOCKER_FLAGS ?= --gpus all
292+
293+ local-backends :
294+ mkdir -p local-backends
295+
296+ extract-backend-% : docker-build-% local-backends
297+ @echo " Extracting backend $* ..."
298+ @CID=$$(docker create local-ai-backend:$* ) && \
299+ rm -rf local-backends/$* && mkdir -p local-backends/$* && \
300+ docker cp $$ CID:/ - | tar -xf - -C local-backends/$* && \
301+ docker rm $$ CID > /dev/null
302+
303+ extract-realtime-backends : $(addprefix extract-backend-,$(REALTIME_BACKEND_NAMES ) )
304+
305+ test-realtime-models-docker : build-mock-backend
306+ docker build --target build-requirements \
307+ --build-arg BUILD_TYPE=$(or $(BUILD_TYPE ) ,cublas) \
308+ --build-arg CUDA_MAJOR_VERSION=$(or $(CUDA_MAJOR_VERSION ) ,13) \
309+ --build-arg CUDA_MINOR_VERSION=$(or $(CUDA_MINOR_VERSION ) ,0) \
310+ -t localai-test-runner .
311+ docker run --rm \
312+ $(REALTIME_DOCKER_FLAGS ) \
313+ -v $(abspath ./) :/build \
314+ -v $(REALTIME_MODELS_DIR ) :/models:ro \
315+ -v $(REALTIME_BACKENDS_DIR ) :/backends \
316+ -v localai-go-cache:/root/go/pkg/mod \
317+ -v localai-go-build-cache:/root/.cache/go-build \
318+ -e REALTIME_TEST_MODEL=$$ {REALTIME_TEST_MODEL:-realtime-test-pipeline} \
319+ -e REALTIME_VAD=$(REALTIME_VAD ) \
320+ -e REALTIME_STT=$(REALTIME_STT ) \
321+ -e REALTIME_LLM=$(REALTIME_LLM ) \
322+ -e REALTIME_TTS=$(REALTIME_TTS ) \
323+ -e REALTIME_BACKENDS_PATH=/backends \
324+ -e REALTIME_MODELS_PATH=/models \
325+ -w /build \
326+ localai-test-runner \
327+ bash -c ' git config --global --add safe.directory /build && \
328+ make protogen-go && make build-mock-backend && \
329+ go run github.com/onsi/ginkgo/v2/ginkgo --label-filter=" Realtime" --flake-attempts $(TEST_FLAKES ) -v -r ./tests/e2e'
330+
253331test-container :
254332 docker build --target requirements -t local-ai-test-container .
255333 docker run -ti --rm --entrypoint /bin/bash -ti -v $(abspath ./) :/build local-ai-test-container
0 commit comments