@elizaos/plugin-local-inference 2.0.0-beta.1 → 2.0.3-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +83 -0
- package/package.json +82 -15
- package/src/actions/generate-media.d.ts +59 -0
- package/src/actions/generate-media.d.ts.map +1 -0
- package/src/actions/generate-media.ts +647 -0
- package/src/actions/identify-speaker.d.ts +23 -0
- package/src/actions/identify-speaker.d.ts.map +1 -0
- package/src/actions/identify-speaker.ts +171 -0
- package/src/actions/transcription-control.d.ts +29 -0
- package/src/actions/transcription-control.d.ts.map +1 -0
- package/src/actions/transcription-control.test.ts +100 -0
- package/src/actions/transcription-control.ts +127 -0
- package/src/adapters/capacitor-llama/__tests__/compat-behavior.test.ts +218 -0
- package/src/adapters/capacitor-llama/__tests__/index.test.ts +68 -0
- package/src/adapters/capacitor-llama/__tests__/structured-output.test.ts +215 -0
- package/src/adapters/capacitor-llama/__tests__/text-streaming.test.ts +174 -0
- package/src/adapters/capacitor-llama/environment.ts +71 -0
- package/src/adapters/capacitor-llama/index.browser.ts +83 -0
- package/src/adapters/capacitor-llama/index.ts +807 -0
- package/src/adapters/capacitor-llama/loader.ts +109 -0
- package/src/adapters/capacitor-llama/structured-output.ts +165 -0
- package/src/adapters/capacitor-llama/text-streaming.ts +227 -0
- package/src/adapters/capacitor-llama/types.ts +374 -0
- package/src/backends/apple-foundation.ts +127 -0
- package/src/index.d.ts +8 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.ts +62 -0
- package/src/local-inference-routes.d.ts +38 -0
- package/src/local-inference-routes.d.ts.map +1 -0
- package/src/local-inference-routes.test.ts +344 -0
- package/src/local-inference-routes.ts +1543 -0
- package/src/provider.d.ts +21 -0
- package/src/provider.d.ts.map +1 -0
- package/src/provider.ts +1082 -0
- package/src/routes/compat-helpers.d.ts +18 -0
- package/src/routes/compat-helpers.d.ts.map +1 -0
- package/src/routes/compat-helpers.ts +274 -0
- package/src/routes/family-member-route.d.ts +62 -0
- package/src/routes/family-member-route.d.ts.map +1 -0
- package/src/routes/family-member-route.ts +353 -0
- package/src/routes/index.d.ts +19 -0
- package/src/routes/index.d.ts.map +1 -0
- package/src/routes/index.ts +60 -0
- package/src/routes/live-diarization-route.d.ts +26 -0
- package/src/routes/live-diarization-route.d.ts.map +1 -0
- package/src/routes/live-diarization-route.test.ts +213 -0
- package/src/routes/live-diarization-route.ts +122 -0
- package/src/routes/local-inference-asr-route.d.ts +4 -0
- package/src/routes/local-inference-asr-route.d.ts.map +1 -0
- package/src/routes/local-inference-asr-route.test.ts +205 -0
- package/src/routes/local-inference-asr-route.ts +163 -0
- package/src/routes/local-inference-asr-transcribe.d.ts +20 -0
- package/src/routes/local-inference-asr-transcribe.d.ts.map +1 -0
- package/src/routes/local-inference-asr-transcribe.test.ts +118 -0
- package/src/routes/local-inference-asr-transcribe.ts +97 -0
- package/src/routes/local-inference-compat-routes.d.ts +16 -0
- package/src/routes/local-inference-compat-routes.d.ts.map +1 -0
- package/src/routes/local-inference-compat-routes.test.ts +485 -0
- package/src/routes/local-inference-compat-routes.ts +808 -0
- package/src/routes/local-inference-tts-route.d.ts +7 -0
- package/src/routes/local-inference-tts-route.d.ts.map +1 -0
- package/src/routes/local-inference-tts-route.test.ts +179 -0
- package/src/routes/local-inference-tts-route.ts +230 -0
- package/src/routes/transcript-audio-store.d.ts +15 -0
- package/src/routes/transcript-audio-store.d.ts.map +1 -0
- package/src/routes/transcript-audio-store.ts +27 -0
- package/src/routes/transcripts-routes.d.ts +36 -0
- package/src/routes/transcripts-routes.d.ts.map +1 -0
- package/src/routes/transcripts-routes.test.ts +144 -0
- package/src/routes/transcripts-routes.ts +159 -0
- package/src/routes/voice-first-run-routes.d.ts +62 -0
- package/src/routes/voice-first-run-routes.d.ts.map +1 -0
- package/src/routes/voice-first-run-routes.ts +524 -0
- package/src/routes/voice-models-routes.d.ts +62 -0
- package/src/routes/voice-models-routes.d.ts.map +1 -0
- package/src/routes/voice-models-routes.ts +554 -0
- package/src/routes/voice-profile-plugin-routes.d.ts +19 -0
- package/src/routes/voice-profile-plugin-routes.d.ts.map +1 -0
- package/src/routes/voice-profile-plugin-routes.ts +138 -0
- package/src/routes/voice-profiles-management-routes.d.ts +52 -0
- package/src/routes/voice-profiles-management-routes.d.ts.map +1 -0
- package/src/routes/voice-profiles-management-routes.ts +476 -0
- package/src/routes/voice-speaker-profile-routes.d.ts +57 -0
- package/src/routes/voice-speaker-profile-routes.d.ts.map +1 -0
- package/src/routes/voice-speaker-profile-routes.ts +199 -0
- package/src/runtime/aosp-llama-loader-selection.test.ts +80 -0
- package/src/runtime/capacitor-llama.d.ts +25 -0
- package/src/runtime/embedding-manager-support.d.ts +77 -0
- package/src/runtime/embedding-manager-support.d.ts.map +1 -0
- package/src/runtime/embedding-manager-support.ts +497 -0
- package/src/runtime/embedding-presets.d.ts +16 -0
- package/src/runtime/embedding-presets.d.ts.map +1 -0
- package/src/runtime/embedding-presets.ts +81 -0
- package/src/runtime/embedding-warmup-policy.d.ts +14 -0
- package/src/runtime/embedding-warmup-policy.d.ts.map +1 -0
- package/src/runtime/embedding-warmup-policy.test.ts +53 -0
- package/src/runtime/embedding-warmup-policy.ts +48 -0
- package/src/runtime/ensure-local-inference-handler.d.ts +62 -0
- package/src/runtime/ensure-local-inference-handler.d.ts.map +1 -0
- package/src/runtime/ensure-local-inference-handler.test.ts +528 -0
- package/src/runtime/ensure-local-inference-handler.ts +1448 -0
- package/src/runtime/index.d.ts +15 -0
- package/src/runtime/index.d.ts.map +1 -0
- package/src/runtime/index.ts +33 -0
- package/src/runtime/mobile-local-inference-gate.d.ts +31 -0
- package/src/runtime/mobile-local-inference-gate.d.ts.map +1 -0
- package/src/runtime/mobile-local-inference-gate.test.ts +69 -0
- package/src/runtime/mobile-local-inference-gate.ts +44 -0
- package/src/runtime/voice-entity-binding.d.ts +103 -0
- package/src/runtime/voice-entity-binding.d.ts.map +1 -0
- package/src/runtime/voice-entity-binding.transcript.test.ts +69 -0
- package/src/runtime/voice-entity-binding.ts +328 -0
- package/src/services/README.md +71 -0
- package/src/services/__tests__/backend-selector.test.ts +101 -0
- package/src/services/__tests__/checkpoint-manager.test.ts +376 -0
- package/src/services/__tests__/gpu-autotune.test.ts +400 -0
- package/src/services/__tests__/llm-streaming-binding.test.ts +85 -0
- package/src/services/__tests__/planner-grammar.test.ts +372 -0
- package/src/services/__tests__/runtime-target.test.ts +176 -0
- package/src/services/active-model-switch-rollback.test.ts +183 -0
- package/src/services/active-model.d.ts +282 -0
- package/src/services/active-model.d.ts.map +1 -0
- package/src/services/active-model.ts +1213 -0
- package/src/services/assignments.d.ts +71 -0
- package/src/services/assignments.d.ts.map +1 -0
- package/src/services/assignments.test.ts +80 -0
- package/src/services/assignments.ts +230 -0
- package/src/services/backend-selector.ts +95 -0
- package/src/services/backend.d.ts +346 -0
- package/src/services/backend.d.ts.map +1 -0
- package/src/services/backend.ts +612 -0
- package/src/services/bionic-host-loader.d.ts +46 -0
- package/src/services/bionic-host-loader.d.ts.map +1 -0
- package/src/services/bionic-host-loader.test.ts +133 -0
- package/src/services/bionic-host-loader.ts +180 -0
- package/src/services/bundled-models.d.ts +34 -0
- package/src/services/bundled-models.d.ts.map +1 -0
- package/src/services/bundled-models.ts +129 -0
- package/src/services/cache-bridge.d.ts +206 -0
- package/src/services/cache-bridge.d.ts.map +1 -0
- package/src/services/cache-bridge.test.ts +516 -0
- package/src/services/cache-bridge.ts +423 -0
- package/src/services/catalog.d.ts +10 -0
- package/src/services/catalog.d.ts.map +1 -0
- package/src/services/catalog.test.ts +238 -0
- package/src/services/catalog.ts +27 -0
- package/src/services/checkpoint-client.d.ts +109 -0
- package/src/services/checkpoint-client.d.ts.map +1 -0
- package/src/services/checkpoint-client.ts +258 -0
- package/src/services/checkpoint-manager.ts +474 -0
- package/src/services/cloud-fallback.d.ts +102 -0
- package/src/services/cloud-fallback.d.ts.map +1 -0
- package/src/services/cloud-fallback.ts +230 -0
- package/src/services/conversation-registry.d.ts +142 -0
- package/src/services/conversation-registry.d.ts.map +1 -0
- package/src/services/conversation-registry.test.ts +235 -0
- package/src/services/conversation-registry.ts +264 -0
- package/src/services/desktop-fused-ffi-backend-runtime.d.ts +95 -0
- package/src/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
- package/src/services/desktop-fused-ffi-backend-runtime.ts +339 -0
- package/src/services/device-bridge.d.ts +188 -0
- package/src/services/device-bridge.d.ts.map +1 -0
- package/src/services/device-bridge.ts +1237 -0
- package/src/services/device-resource-metrics.d.ts +149 -0
- package/src/services/device-resource-metrics.d.ts.map +1 -0
- package/src/services/device-resource-metrics.test.ts +98 -0
- package/src/services/device-resource-metrics.ts +346 -0
- package/src/services/device-tier.d.ts +115 -0
- package/src/services/device-tier.d.ts.map +1 -0
- package/src/services/device-tier.test.ts +371 -0
- package/src/services/device-tier.ts +410 -0
- package/src/services/downloader.d.ts +82 -0
- package/src/services/downloader.d.ts.map +1 -0
- package/src/services/downloader.test.ts +747 -0
- package/src/services/downloader.ts +925 -0
- package/src/services/engine-direct-bundle.test.ts +58 -0
- package/src/services/engine-streaming.test.ts +80 -0
- package/src/services/engine.d.ts +540 -0
- package/src/services/engine.d.ts.map +1 -0
- package/src/services/engine.ts +1909 -0
- package/src/services/ensure-local-artifacts.integration.test.ts +273 -0
- package/src/services/ensure-local-artifacts.test.ts +368 -0
- package/src/services/ensure-local-artifacts.ts +351 -0
- package/src/services/external-scanner.d.ts +17 -0
- package/src/services/external-scanner.d.ts.map +1 -0
- package/src/services/external-scanner.ts +312 -0
- package/src/services/ffi-llm-mock.ts +354 -0
- package/src/services/ffi-llm-streaming-abi.ts +442 -0
- package/src/services/ffi-streaming-backend.d.ts +180 -0
- package/src/services/ffi-streaming-backend.d.ts.map +1 -0
- package/src/services/ffi-streaming-backend.ts +382 -0
- package/src/services/ffi-streaming-runner.d.ts +122 -0
- package/src/services/ffi-streaming-runner.d.ts.map +1 -0
- package/src/services/ffi-streaming-runner.test.ts +60 -0
- package/src/services/ffi-streaming-runner.ts +354 -0
- package/src/services/ffi-unload-ordering.test.ts +162 -0
- package/src/services/gpu-autotune.ts +534 -0
- package/src/services/gpu-detect.d.ts +56 -0
- package/src/services/gpu-detect.d.ts.map +1 -0
- package/src/services/gpu-detect.ts +139 -0
- package/src/services/handler-registry.d.ts +72 -0
- package/src/services/handler-registry.d.ts.map +1 -0
- package/src/services/handler-registry.ts +240 -0
- package/src/services/hardware.d.ts +63 -0
- package/src/services/hardware.d.ts.map +1 -0
- package/src/services/hardware.test.ts +231 -0
- package/src/services/hardware.ts +410 -0
- package/src/services/hf-search.d.ts +26 -0
- package/src/services/hf-search.d.ts.map +1 -0
- package/src/services/hf-search.test.ts +69 -0
- package/src/services/hf-search.ts +420 -0
- package/src/services/image-description-runtime.d.ts +14 -0
- package/src/services/image-description-runtime.d.ts.map +1 -0
- package/src/services/image-description-runtime.test.ts +61 -0
- package/src/services/image-description-runtime.ts +118 -0
- package/src/services/imagegen/aosp-unavailable.d.ts +134 -0
- package/src/services/imagegen/aosp-unavailable.d.ts.map +1 -0
- package/src/services/imagegen/aosp-unavailable.ts +229 -0
- package/src/services/imagegen/backend-selector.d.ts +118 -0
- package/src/services/imagegen/backend-selector.d.ts.map +1 -0
- package/src/services/imagegen/backend-selector.ts +277 -0
- package/src/services/imagegen/coreml-unavailable.d.ts +105 -0
- package/src/services/imagegen/coreml-unavailable.d.ts.map +1 -0
- package/src/services/imagegen/coreml-unavailable.ts +237 -0
- package/src/services/imagegen/errors.d.ts +16 -0
- package/src/services/imagegen/errors.d.ts.map +1 -0
- package/src/services/imagegen/errors.ts +40 -0
- package/src/services/imagegen/index.d.ts +58 -0
- package/src/services/imagegen/index.d.ts.map +1 -0
- package/src/services/imagegen/index.ts +144 -0
- package/src/services/imagegen/mflux.d.ts +74 -0
- package/src/services/imagegen/mflux.d.ts.map +1 -0
- package/src/services/imagegen/mflux.ts +313 -0
- package/src/services/imagegen/sd-cpp.d.ts +180 -0
- package/src/services/imagegen/sd-cpp.d.ts.map +1 -0
- package/src/services/imagegen/sd-cpp.ts +718 -0
- package/src/services/imagegen/tensorrt-unavailable.d.ts +83 -0
- package/src/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
- package/src/services/imagegen/tensorrt-unavailable.ts +295 -0
- package/src/services/imagegen/types.d.ts +181 -0
- package/src/services/imagegen/types.d.ts.map +1 -0
- package/src/services/imagegen/types.ts +193 -0
- package/src/services/index.d.ts +29 -0
- package/src/services/index.d.ts.map +1 -0
- package/src/services/index.ts +211 -0
- package/src/services/inference-capabilities.d.ts +132 -0
- package/src/services/inference-capabilities.d.ts.map +1 -0
- package/src/services/inference-capabilities.test.ts +75 -0
- package/src/services/inference-capabilities.ts +204 -0
- package/src/services/inference-telemetry.d.ts +59 -0
- package/src/services/inference-telemetry.d.ts.map +1 -0
- package/src/services/inference-telemetry.ts +143 -0
- package/src/services/ios-llama-streaming.ts +248 -0
- package/src/services/kv-spill.d.ts +189 -0
- package/src/services/kv-spill.d.ts.map +1 -0
- package/src/services/kv-spill.test.ts +222 -0
- package/src/services/kv-spill.ts +356 -0
- package/src/services/latency-trace.d.ts +346 -0
- package/src/services/latency-trace.d.ts.map +1 -0
- package/src/services/latency-trace.test.ts +266 -0
- package/src/services/latency-trace.ts +844 -0
- package/src/services/llama-server-metrics.ts +304 -0
- package/src/services/llm-streaming-binding.d.ts +96 -0
- package/src/services/llm-streaming-binding.d.ts.map +1 -0
- package/src/services/llm-streaming-binding.ts +136 -0
- package/src/services/load-args.d.ts +82 -0
- package/src/services/load-args.d.ts.map +1 -0
- package/src/services/load-args.ts +81 -0
- package/src/services/manifest/eliza-1.manifest.v1.json +708 -0
- package/src/services/manifest/index.d.ts +4 -0
- package/src/services/manifest/index.d.ts.map +1 -0
- package/src/services/manifest/index.ts +66 -0
- package/src/services/manifest/manifest.test.ts +689 -0
- package/src/services/manifest/schema.d.ts +713 -0
- package/src/services/manifest/schema.d.ts.map +1 -0
- package/src/services/manifest/schema.ts +653 -0
- package/src/services/manifest/types.d.ts +30 -0
- package/src/services/manifest/types.d.ts.map +1 -0
- package/src/services/manifest/types.ts +55 -0
- package/src/services/manifest/validator.d.ts +66 -0
- package/src/services/manifest/validator.d.ts.map +1 -0
- package/src/services/manifest/validator.ts +567 -0
- package/src/services/memory-arbiter.d.ts +318 -0
- package/src/services/memory-arbiter.d.ts.map +1 -0
- package/src/services/memory-arbiter.test.ts +419 -0
- package/src/services/memory-arbiter.ts +925 -0
- package/src/services/memory-monitor.d.ts +122 -0
- package/src/services/memory-monitor.d.ts.map +1 -0
- package/src/services/memory-monitor.test.ts +208 -0
- package/src/services/memory-monitor.ts +297 -0
- package/src/services/memory-pressure.d.ts +130 -0
- package/src/services/memory-pressure.d.ts.map +1 -0
- package/src/services/memory-pressure.ts +414 -0
- package/src/services/mtp-doctor.d.ts +13 -0
- package/src/services/mtp-doctor.d.ts.map +1 -0
- package/src/services/mtp-doctor.ts +78 -0
- package/src/services/network-policy.d.ts +127 -0
- package/src/services/network-policy.d.ts.map +1 -0
- package/src/services/network-policy.ts +346 -0
- package/src/services/paths.d.ts +6 -0
- package/src/services/paths.d.ts.map +1 -0
- package/src/services/paths.ts +25 -0
- package/src/services/planner-skeleton.d.ts +124 -0
- package/src/services/planner-skeleton.d.ts.map +1 -0
- package/src/services/planner-skeleton.ts +175 -0
- package/src/services/providers.d.ts +38 -0
- package/src/services/providers.d.ts.map +1 -0
- package/src/services/providers.ts +507 -0
- package/src/services/ram-budget-cache.test.ts +163 -0
- package/src/services/ram-budget.d.ts +110 -0
- package/src/services/ram-budget.d.ts.map +1 -0
- package/src/services/ram-budget.ts +0 -0
- package/src/services/readiness.d.ts +9 -0
- package/src/services/readiness.d.ts.map +1 -0
- package/src/services/readiness.test.ts +87 -0
- package/src/services/readiness.ts +238 -0
- package/src/services/recommendation.d.ts +111 -0
- package/src/services/recommendation.d.ts.map +1 -0
- package/src/services/recommendation.ts +671 -0
- package/src/services/registry.d.ts +35 -0
- package/src/services/registry.d.ts.map +1 -0
- package/src/services/registry.ts +151 -0
- package/src/services/router-handler.d.ts +92 -0
- package/src/services/router-handler.d.ts.map +1 -0
- package/src/services/router-handler.test.ts +45 -0
- package/src/services/router-handler.ts +407 -0
- package/src/services/routing-policy.d.ts +69 -0
- package/src/services/routing-policy.d.ts.map +1 -0
- package/src/services/routing-policy.test.ts +164 -0
- package/src/services/routing-policy.ts +297 -0
- package/src/services/routing-preferences.d.ts +8 -0
- package/src/services/routing-preferences.d.ts.map +1 -0
- package/src/services/routing-preferences.ts +17 -0
- package/src/services/runtime-target.d.ts +98 -0
- package/src/services/runtime-target.d.ts.map +1 -0
- package/src/services/runtime-target.ts +154 -0
- package/src/services/service.d.ts +128 -0
- package/src/services/service.d.ts.map +1 -0
- package/src/services/service.test.ts +223 -0
- package/src/services/service.ts +735 -0
- package/src/services/session-pool.d.ts +72 -0
- package/src/services/session-pool.d.ts.map +1 -0
- package/src/services/session-pool.ts +153 -0
- package/src/services/structured-output/deterministic-repair.d.ts +23 -0
- package/src/services/structured-output/deterministic-repair.d.ts.map +1 -0
- package/src/services/structured-output/deterministic-repair.test.ts +169 -0
- package/src/services/structured-output/deterministic-repair.ts +443 -0
- package/src/services/structured-output/index.ts +4 -0
- package/src/services/structured-output.d.ts +311 -0
- package/src/services/structured-output.d.ts.map +1 -0
- package/src/services/structured-output.test.ts +483 -0
- package/src/services/structured-output.ts +712 -0
- package/src/services/system-memory.d.ts +33 -0
- package/src/services/system-memory.d.ts.map +1 -0
- package/src/services/system-memory.test.ts +47 -0
- package/src/services/system-memory.ts +67 -0
- package/src/services/transcription-priority.test.ts +211 -0
- package/src/services/types.d.ts +19 -0
- package/src/services/types.d.ts.map +1 -0
- package/src/services/types.ts +55 -0
- package/src/services/verify-on-device.d.ts +34 -0
- package/src/services/verify-on-device.d.ts.map +1 -0
- package/src/services/verify-on-device.test.ts +87 -0
- package/src/services/verify-on-device.ts +127 -0
- package/src/services/verify.d.ts +8 -0
- package/src/services/verify.d.ts.map +1 -0
- package/src/services/verify.ts +13 -0
- package/src/services/vision/aosp-unavailable.d.ts +115 -0
- package/src/services/vision/aosp-unavailable.d.ts.map +1 -0
- package/src/services/vision/aosp-unavailable.ts +163 -0
- package/src/services/vision/capacitor-llama.d.ts +99 -0
- package/src/services/vision/capacitor-llama.d.ts.map +1 -0
- package/src/services/vision/capacitor-llama.ts +255 -0
- package/src/services/vision/cloud-fallback.d.ts +47 -0
- package/src/services/vision/cloud-fallback.d.ts.map +1 -0
- package/src/services/vision/cloud-fallback.test.ts +243 -0
- package/src/services/vision/cloud-fallback.ts +268 -0
- package/src/services/vision/fallback-chain.test.ts +86 -0
- package/src/services/vision/hash.d.ts +71 -0
- package/src/services/vision/hash.d.ts.map +1 -0
- package/src/services/vision/hash.ts +157 -0
- package/src/services/vision/index.d.ts +95 -0
- package/src/services/vision/index.d.ts.map +1 -0
- package/src/services/vision/index.ts +251 -0
- package/src/services/vision/llama-server.d.ts +73 -0
- package/src/services/vision/llama-server.d.ts.map +1 -0
- package/src/services/vision/llama-server.ts +177 -0
- package/src/services/vision/types.d.ts +153 -0
- package/src/services/vision/types.d.ts.map +1 -0
- package/src/services/vision/types.ts +154 -0
- package/src/services/vision/vast-fallback.d.ts +18 -0
- package/src/services/vision/vast-fallback.d.ts.map +1 -0
- package/src/services/vision/vast-fallback.ts +127 -0
- package/src/services/vision-embedding-cache.d.ts +98 -0
- package/src/services/vision-embedding-cache.d.ts.map +1 -0
- package/src/services/vision-embedding-cache.ts +189 -0
- package/src/services/voice/VOICE_WORKBENCH.md +88 -0
- package/src/services/voice/__test-helpers__/fake-ffi.ts +94 -0
- package/src/services/voice/__test-helpers__/synthetic-speech.ts +124 -0
- package/src/services/voice/__tests__/checkpoint-manager.test.ts +241 -0
- package/src/services/voice/__tests__/checkpoint-policy.test.ts +270 -0
- package/src/services/voice/__tests__/eager-context-builder.test.ts +257 -0
- package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +288 -0
- package/src/services/voice/__tests__/eot-classifier.test.ts +431 -0
- package/src/services/voice/__tests__/optimistic-rollback.test.ts +312 -0
- package/src/services/voice/__tests__/prefill-client.test.ts +266 -0
- package/src/services/voice/__tests__/prefix-preserving-queue.test.ts +208 -0
- package/src/services/voice/__tests__/streaming-asr.test.ts +450 -0
- package/src/services/voice/__tests__/streaming-transcriber.test.ts +339 -0
- package/src/services/voice/__tests__/turn-detector-resolver.test.ts +195 -0
- package/src/services/voice/__tests__/voice-state-machine-prefill.test.ts +275 -0
- package/src/services/voice/__tests__/voice-state-machine.test.ts +354 -0
- package/src/services/voice/asr-timed.real.test.ts +141 -0
- package/src/services/voice/audio-frame-consumer.d.ts +212 -0
- package/src/services/voice/audio-frame-consumer.d.ts.map +1 -0
- package/src/services/voice/audio-frame-consumer.test.ts +343 -0
- package/src/services/voice/audio-frame-consumer.ts +491 -0
- package/src/services/voice/barge-in.d.ts +112 -0
- package/src/services/voice/barge-in.d.ts.map +1 -0
- package/src/services/voice/barge-in.test.ts +244 -0
- package/src/services/voice/barge-in.ts +336 -0
- package/src/services/voice/cancellation-coordinator.d.ts +127 -0
- package/src/services/voice/cancellation-coordinator.d.ts.map +1 -0
- package/src/services/voice/cancellation-coordinator.test.ts +196 -0
- package/src/services/voice/cancellation-coordinator.ts +269 -0
- package/src/services/voice/checkpoint-manager.d.ts +199 -0
- package/src/services/voice/checkpoint-manager.d.ts.map +1 -0
- package/src/services/voice/checkpoint-manager.ts +401 -0
- package/src/services/voice/checkpoint-policy.ts +336 -0
- package/src/services/voice/composite-eot-classifier.test.ts +59 -0
- package/src/services/voice/e2e-harness.test.ts +182 -0
- package/src/services/voice/e2e-harness.ts +743 -0
- package/src/services/voice/eager-context-builder.d.ts +170 -0
- package/src/services/voice/eager-context-builder.d.ts.map +1 -0
- package/src/services/voice/eager-context-builder.ts +262 -0
- package/src/services/voice/eliza1-eot-scorer.d.ts +124 -0
- package/src/services/voice/eliza1-eot-scorer.d.ts.map +1 -0
- package/src/services/voice/eliza1-eot-scorer.ts +242 -0
- package/src/services/voice/embedding-server.ts +200 -0
- package/src/services/voice/embedding.d.ts +133 -0
- package/src/services/voice/embedding.d.ts.map +1 -0
- package/src/services/voice/embedding.test.ts +131 -0
- package/src/services/voice/embedding.ts +243 -0
- package/src/services/voice/emotion-attribution.d.ts +68 -0
- package/src/services/voice/emotion-attribution.d.ts.map +1 -0
- package/src/services/voice/emotion-attribution.test.ts +129 -0
- package/src/services/voice/emotion-attribution.ts +361 -0
- package/src/services/voice/engine-bridge-cancellation.test.ts +422 -0
- package/src/services/voice/engine-bridge.d.ts +759 -0
- package/src/services/voice/engine-bridge.d.ts.map +1 -0
- package/src/services/voice/engine-bridge.test.ts +384 -0
- package/src/services/voice/engine-bridge.ts +2302 -0
- package/src/services/voice/eot-classifier-ggml.d.ts +179 -0
- package/src/services/voice/eot-classifier-ggml.d.ts.map +1 -0
- package/src/services/voice/eot-classifier-ggml.ts +566 -0
- package/src/services/voice/eot-classifier.d.ts +214 -0
- package/src/services/voice/eot-classifier.d.ts.map +1 -0
- package/src/services/voice/eot-classifier.ts +533 -0
- package/src/services/voice/errors.d.ts +20 -0
- package/src/services/voice/errors.d.ts.map +1 -0
- package/src/services/voice/errors.ts +32 -0
- package/src/services/voice/expressive-tags.d.ts +158 -0
- package/src/services/voice/expressive-tags.d.ts.map +1 -0
- package/src/services/voice/expressive-tags.ts +405 -0
- package/src/services/voice/ffi-bindings.d.ts +674 -0
- package/src/services/voice/ffi-bindings.d.ts.map +1 -0
- package/src/services/voice/ffi-bindings.test.ts +728 -0
- package/src/services/voice/ffi-bindings.ts +3225 -0
- package/src/services/voice/first-line-cache.d.ts +181 -0
- package/src/services/voice/first-line-cache.d.ts.map +1 -0
- package/src/services/voice/first-line-cache.ts +725 -0
- package/src/services/voice/fused-eot-scorer.d.ts +51 -0
- package/src/services/voice/fused-eot-scorer.d.ts.map +1 -0
- package/src/services/voice/fused-eot-scorer.ts +135 -0
- package/src/services/voice/index.d.ts +91 -0
- package/src/services/voice/index.d.ts.map +1 -0
- package/src/services/voice/index.ts +481 -0
- package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +151 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +151 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.test.ts +60 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-discovery.test.ts +277 -0
- package/src/services/voice/kokoro/__tests__/kokoro-ffi-runtime.test.ts +235 -0
- package/src/services/voice/kokoro/__tests__/kokoro-runtime.test.ts +95 -0
- package/src/services/voice/kokoro/__tests__/phonemizer.test.ts +53 -0
- package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +231 -0
- package/src/services/voice/kokoro/__tests__/voices.test.ts +57 -0
- package/src/services/voice/kokoro/index.ts +79 -0
- package/src/services/voice/kokoro/kokoro-backend.d.ts +72 -0
- package/src/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
- package/src/services/voice/kokoro/kokoro-backend.ts +207 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts +58 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.ts +177 -0
- package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts +75 -0
- package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -0
- package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +233 -0
- package/src/services/voice/kokoro/kokoro-runtime.d.ts +100 -0
- package/src/services/voice/kokoro/kokoro-runtime.d.ts.map +1 -0
- package/src/services/voice/kokoro/kokoro-runtime.ts +170 -0
- package/src/services/voice/kokoro/phoneme-stream.ts +123 -0
- package/src/services/voice/kokoro/phonemizer.d.ts +50 -0
- package/src/services/voice/kokoro/phonemizer.d.ts.map +1 -0
- package/src/services/voice/kokoro/phonemizer.ts +344 -0
- package/src/services/voice/kokoro/pick-runtime.d.ts +61 -0
- package/src/services/voice/kokoro/pick-runtime.d.ts.map +1 -0
- package/src/services/voice/kokoro/pick-runtime.test.ts +91 -0
- package/src/services/voice/kokoro/pick-runtime.ts +130 -0
- package/src/services/voice/kokoro/runtime-selection.d.ts +92 -0
- package/src/services/voice/kokoro/runtime-selection.d.ts.map +1 -0
- package/src/services/voice/kokoro/runtime-selection.ts +237 -0
- package/src/services/voice/kokoro/types.d.ts +82 -0
- package/src/services/voice/kokoro/types.d.ts.map +1 -0
- package/src/services/voice/kokoro/types.ts +95 -0
- package/src/services/voice/kokoro/voice-presets.d.ts +23 -0
- package/src/services/voice/kokoro/voice-presets.d.ts.map +1 -0
- package/src/services/voice/kokoro/voice-presets.ts +129 -0
- package/src/services/voice/kokoro/voices.d.ts +30 -0
- package/src/services/voice/kokoro/voices.d.ts.map +1 -0
- package/src/services/voice/kokoro/voices.ts +64 -0
- package/src/services/voice/lifecycle.d.ts +135 -0
- package/src/services/voice/lifecycle.d.ts.map +1 -0
- package/src/services/voice/lifecycle.test.ts +315 -0
- package/src/services/voice/lifecycle.ts +301 -0
- package/src/services/voice/live-diarization-session.d.ts +96 -0
- package/src/services/voice/live-diarization-session.d.ts.map +1 -0
- package/src/services/voice/live-diarization-session.ts +289 -0
- package/src/services/voice/mic-source.d.ts +136 -0
- package/src/services/voice/mic-source.d.ts.map +1 -0
- package/src/services/voice/mic-source.test.ts +210 -0
- package/src/services/voice/mic-source.ts +503 -0
- package/src/services/voice/optimistic-policy.d.ts +109 -0
- package/src/services/voice/optimistic-policy.d.ts.map +1 -0
- package/src/services/voice/optimistic-policy.test.ts +101 -0
- package/src/services/voice/optimistic-policy.ts +192 -0
- package/src/services/voice/optimistic-rollback.ts +343 -0
- package/src/services/voice/partial-stabilizer.d.ts +73 -0
- package/src/services/voice/partial-stabilizer.d.ts.map +1 -0
- package/src/services/voice/partial-stabilizer.test.ts +68 -0
- package/src/services/voice/partial-stabilizer.ts +140 -0
- package/src/services/voice/phoneme-tokenizer.d.ts +49 -0
- package/src/services/voice/phoneme-tokenizer.d.ts.map +1 -0
- package/src/services/voice/phoneme-tokenizer.ts +158 -0
- package/src/services/voice/phrase-cache.d.ts +76 -0
- package/src/services/voice/phrase-cache.d.ts.map +1 -0
- package/src/services/voice/phrase-cache.test.ts +242 -0
- package/src/services/voice/phrase-cache.ts +186 -0
- package/src/services/voice/phrase-chunker.d.ts +62 -0
- package/src/services/voice/phrase-chunker.d.ts.map +1 -0
- package/src/services/voice/phrase-chunker.test.ts +239 -0
- package/src/services/voice/phrase-chunker.ts +281 -0
- package/src/services/voice/pipeline-impls.d.ts +151 -0
- package/src/services/voice/pipeline-impls.d.ts.map +1 -0
- package/src/services/voice/pipeline-impls.l6.test.ts +110 -0
- package/src/services/voice/pipeline-impls.test.ts +292 -0
- package/src/services/voice/pipeline-impls.ts +315 -0
- package/src/services/voice/pipeline.d.ts +216 -0
- package/src/services/voice/pipeline.d.ts.map +1 -0
- package/src/services/voice/pipeline.ts +505 -0
- package/src/services/voice/prefill-client.d.ts +123 -0
- package/src/services/voice/prefill-client.d.ts.map +1 -0
- package/src/services/voice/prefill-client.ts +316 -0
- package/src/services/voice/prefix-preserving-queue.d.ts +113 -0
- package/src/services/voice/prefix-preserving-queue.d.ts.map +1 -0
- package/src/services/voice/prefix-preserving-queue.ts +162 -0
- package/src/services/voice/profile-store.d.ts +248 -0
- package/src/services/voice/profile-store.d.ts.map +1 -0
- package/src/services/voice/profile-store.ts +887 -0
- package/src/services/voice/real-audio-decode.test.ts +148 -0
- package/src/services/voice/ring-buffer.d.ts +40 -0
- package/src/services/voice/ring-buffer.d.ts.map +1 -0
- package/src/services/voice/ring-buffer.test.ts +129 -0
- package/src/services/voice/ring-buffer.ts +123 -0
- package/src/services/voice/rollback-queue.d.ts +24 -0
- package/src/services/voice/rollback-queue.d.ts.map +1 -0
- package/src/services/voice/rollback-queue.ts +74 -0
- package/src/services/voice/samantha-preset-placeholder.d.ts +67 -0
- package/src/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
- package/src/services/voice/samantha-preset-placeholder.test.ts +97 -0
- package/src/services/voice/samantha-preset-placeholder.ts +148 -0
- package/src/services/voice/samantha-preset-regenerator.d.ts +87 -0
- package/src/services/voice/samantha-preset-regenerator.d.ts.map +1 -0
- package/src/services/voice/samantha-preset-regenerator.ts +393 -0
- package/src/services/voice/scheduler.d.ts +146 -0
- package/src/services/voice/scheduler.d.ts.map +1 -0
- package/src/services/voice/scheduler.t2.test.ts +141 -0
- package/src/services/voice/scheduler.ts +927 -0
- package/src/services/voice/shared-resources.d.ts +190 -0
- package/src/services/voice/shared-resources.d.ts.map +1 -0
- package/src/services/voice/shared-resources.ts +320 -0
- package/src/services/voice/speaker/attribution-pipeline.d.ts +74 -0
- package/src/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
- package/src/services/voice/speaker/attribution-pipeline.ts +386 -0
- package/src/services/voice/speaker/diarizer-fused.d.ts +59 -0
- package/src/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
- package/src/services/voice/speaker/diarizer-fused.real.test.ts +100 -0
- package/src/services/voice/speaker/diarizer-fused.ts +154 -0
- package/src/services/voice/speaker/diarizer.d.ts +75 -0
- package/src/services/voice/speaker/diarizer.d.ts.map +1 -0
- package/src/services/voice/speaker/diarizer.ts +218 -0
- package/src/services/voice/speaker/encoder-fused.d.ts +60 -0
- package/src/services/voice/speaker/encoder-fused.d.ts.map +1 -0
- package/src/services/voice/speaker/encoder-fused.real.test.ts +113 -0
- package/src/services/voice/speaker/encoder-fused.ts +138 -0
- package/src/services/voice/speaker/encoder-ggml.d.ts +33 -0
- package/src/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
- package/src/services/voice/speaker/encoder-ggml.ts +79 -0
- package/src/services/voice/speaker/encoder.d.ts +37 -0
- package/src/services/voice/speaker/encoder.d.ts.map +1 -0
- package/src/services/voice/speaker/encoder.ts +105 -0
- package/src/services/voice/speaker-imprint.d.ts +83 -0
- package/src/services/voice/speaker-imprint.d.ts.map +1 -0
- package/src/services/voice/speaker-imprint.test.ts +185 -0
- package/src/services/voice/speaker-imprint.ts +312 -0
- package/src/services/voice/speaker-preset-cache.d.ts +77 -0
- package/src/services/voice/speaker-preset-cache.d.ts.map +1 -0
- package/src/services/voice/speaker-preset-cache.test.ts +154 -0
- package/src/services/voice/speaker-preset-cache.ts +195 -0
- package/src/services/voice/streaming-asr/streaming-pipeline-adapter.ts +292 -0
- package/src/services/voice/system-audio-sink.d.ts +73 -0
- package/src/services/voice/system-audio-sink.d.ts.map +1 -0
- package/src/services/voice/system-audio-sink.test.ts +29 -0
- package/src/services/voice/system-audio-sink.ts +366 -0
- package/src/services/voice/transcriber.d.ts +244 -0
- package/src/services/voice/transcriber.d.ts.map +1 -0
- package/src/services/voice/transcriber.test.ts +392 -0
- package/src/services/voice/transcriber.ts +704 -0
- package/src/services/voice/transcript-knowledge.d.ts +37 -0
- package/src/services/voice/transcript-knowledge.d.ts.map +1 -0
- package/src/services/voice/transcript-knowledge.test.ts +68 -0
- package/src/services/voice/transcript-knowledge.ts +75 -0
- package/src/services/voice/transcript-service.d.ts +41 -0
- package/src/services/voice/transcript-service.d.ts.map +1 -0
- package/src/services/voice/transcript-service.test.ts +137 -0
- package/src/services/voice/transcript-service.ts +141 -0
- package/src/services/voice/transcript-store.d.ts +53 -0
- package/src/services/voice/transcript-store.d.ts.map +1 -0
- package/src/services/voice/transcript-store.test.ts +153 -0
- package/src/services/voice/transcript-store.ts +132 -0
- package/src/services/voice/turn-controller.d.ts +183 -0
- package/src/services/voice/turn-controller.d.ts.map +1 -0
- package/src/services/voice/turn-controller.test.ts +575 -0
- package/src/services/voice/turn-controller.ts +596 -0
- package/src/services/voice/types.d.ts +643 -0
- package/src/services/voice/types.d.ts.map +1 -0
- package/src/services/voice/types.ts +699 -0
- package/src/services/voice/vad.d.ts +282 -0
- package/src/services/voice/vad.d.ts.map +1 -0
- package/src/services/voice/vad.test.ts +480 -0
- package/src/services/voice/vad.ts +827 -0
- package/src/services/voice/vad.v1-v4.test.ts +222 -0
- package/src/services/voice/voice-budget.d.ts +241 -0
- package/src/services/voice/voice-budget.d.ts.map +1 -0
- package/src/services/voice/voice-budget.test.ts +418 -0
- package/src/services/voice/voice-budget.ts +635 -0
- package/src/services/voice/voice-duet.test.ts +375 -0
- package/src/services/voice/voice-emotion-classifier.d.ts +95 -0
- package/src/services/voice/voice-emotion-classifier.d.ts.map +1 -0
- package/src/services/voice/voice-emotion-classifier.test.ts +210 -0
- package/src/services/voice/voice-emotion-classifier.ts +273 -0
- package/src/services/voice/voice-preset-format.d.ts +158 -0
- package/src/services/voice/voice-preset-format.d.ts.map +1 -0
- package/src/services/voice/voice-preset-format.ts +700 -0
- package/src/services/voice/voice-preset-generator.test.ts +89 -0
- package/src/services/voice/voice-profile-artifact.d.ts +116 -0
- package/src/services/voice/voice-profile-artifact.d.ts.map +1 -0
- package/src/services/voice/voice-profile-artifact.test.ts +138 -0
- package/src/services/voice/voice-profile-artifact.ts +518 -0
- package/src/services/voice/voice-profile-routes.d.ts +83 -0
- package/src/services/voice/voice-profile-routes.d.ts.map +1 -0
- package/src/services/voice/voice-profile-routes.test.ts +429 -0
- package/src/services/voice/voice-profile-routes.ts +425 -0
- package/src/services/voice/voice-scenario.ts +154 -0
- package/src/services/voice/voice-settings.d.ts +82 -0
- package/src/services/voice/voice-settings.d.ts.map +1 -0
- package/src/services/voice/voice-settings.ts +172 -0
- package/src/services/voice/voice-state-machine.d.ts +364 -0
- package/src/services/voice/voice-state-machine.d.ts.map +1 -0
- package/src/services/voice/voice-state-machine.ts +727 -0
- package/src/services/voice/voice-workbench-report.test.ts +168 -0
- package/src/services/voice/voice-workbench-report.ts +326 -0
- package/src/services/voice/voice-workbench.test.ts +158 -0
- package/src/services/voice/voice.test.ts +1070 -0
- package/src/services/voice/wake-word-ggml.d.ts +101 -0
- package/src/services/voice/wake-word-ggml.d.ts.map +1 -0
- package/src/services/voice/wake-word-ggml.ts +320 -0
- package/src/services/voice/wake-word.d.ts +255 -0
- package/src/services/voice/wake-word.d.ts.map +1 -0
- package/src/services/voice/wake-word.test.ts +298 -0
- package/src/services/voice/wake-word.ts +554 -0
- package/src/services/voice/wrap-with-first-line-cache.d.ts +70 -0
- package/src/services/voice/wrap-with-first-line-cache.d.ts.map +1 -0
- package/src/services/voice/wrap-with-first-line-cache.ts +267 -0
- package/src/services/voice-model-updater.d.ts +240 -0
- package/src/services/voice-model-updater.d.ts.map +1 -0
- package/src/services/voice-model-updater.ts +724 -0
- package/src/services/voice-prewarm.d.ts +3 -0
- package/src/services/voice-prewarm.d.ts.map +1 -0
- package/src/services/voice-prewarm.ts +51 -0
- package/dist/index.d.ts +0 -37
- package/dist/index.js +0 -1098
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice ⇄ entity binding seam (producer + round-trip consumer).
|
|
3
|
+
*
|
|
4
|
+
* Producer (`emitVoiceTurnObserved`): emit `VOICE_TURN_OBSERVED` so a
|
|
5
|
+
* merge-engine owner (plugin-lifeops) can fold the recognized voice turn
|
|
6
|
+
* into the entity/relationship graph. The voice-profile store is owned
|
|
7
|
+
* here; the entity graph is owned there; the only shared surface is the
|
|
8
|
+
* core event seam — neither plugin imports the other.
|
|
9
|
+
*
|
|
10
|
+
* Consumer (`handleVoiceEntityBound`): when the merge engine reports a
|
|
11
|
+
* binding via `VOICE_ENTITY_BOUND`, persist the resulting `entityId` onto
|
|
12
|
+
* every profile in that imprint cluster (`VoiceProfileStore.bindEntity`).
|
|
13
|
+
* This is the runtime path that was missing in issue #8234 — without it a
|
|
14
|
+
* profile's `entityId` stayed `null` and recognized speakers never reached
|
|
15
|
+
* the relationship graph.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import crypto from "node:crypto";
|
|
19
|
+
import path from "node:path";
|
|
20
|
+
import {
|
|
21
|
+
EventType,
|
|
22
|
+
type IAgentRuntime,
|
|
23
|
+
logger,
|
|
24
|
+
resolveStateDir,
|
|
25
|
+
type VoiceEntityBoundPayload,
|
|
26
|
+
} from "@elizaos/core";
|
|
27
|
+
import type {
|
|
28
|
+
VoiceNextSpeaker,
|
|
29
|
+
VoiceTurnSignal,
|
|
30
|
+
} from "../services/voice/eot-classifier.js";
|
|
31
|
+
import { VoiceProfileStore } from "../services/voice/profile-store.js";
|
|
32
|
+
import type { VoiceAttributionOutput } from "../services/voice/speaker/attribution-pipeline.js";
|
|
33
|
+
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Store wiring (injectable for tests, mirrors the route handlers)
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
|
|
38
|
+
let storeOverride: VoiceProfileStore | null = null;
|
|
39
|
+
|
|
40
|
+
export function setVoiceEntityBindingStore(
|
|
41
|
+
store: VoiceProfileStore | null,
|
|
42
|
+
): void {
|
|
43
|
+
storeOverride = store;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export async function getVoiceProfileStore(): Promise<VoiceProfileStore> {
|
|
47
|
+
if (storeOverride) return storeOverride;
|
|
48
|
+
const store = new VoiceProfileStore({
|
|
49
|
+
rootDir: path.join(resolveStateDir(), "voice-profiles"),
|
|
50
|
+
});
|
|
51
|
+
await store.init();
|
|
52
|
+
return store;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// Producer
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
|
|
59
|
+
export interface EmitVoiceTurnObservedArgs {
|
|
60
|
+
/** Stable utterance id; a random one is minted when omitted. */
|
|
61
|
+
turnId?: string;
|
|
62
|
+
/** Recognized text (drives name/partner-claim extraction downstream). */
|
|
63
|
+
text: string;
|
|
64
|
+
/** Imprint cluster id from the voice-profile store. */
|
|
65
|
+
imprintClusterId: string;
|
|
66
|
+
/** Confidence of the imprint match (0..1). */
|
|
67
|
+
matchConfidence: number;
|
|
68
|
+
/** Entity the imprint already resolved to, or `null`/omitted when unbound. */
|
|
69
|
+
matchedEntityId?: string | null;
|
|
70
|
+
/** True when the OWNER spoke this turn. */
|
|
71
|
+
isOwner?: boolean;
|
|
72
|
+
/** ISO timestamp; defaults to now. */
|
|
73
|
+
observedAt?: string;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Emit `VOICE_TURN_OBSERVED`. No-op in effect when no merge-engine plugin
|
|
78
|
+
* is loaded (the event simply has no handler). `emitEvent` awaits every
|
|
79
|
+
* handler, so by the time this resolves the binding round-trip (including
|
|
80
|
+
* `VOICE_ENTITY_BOUND` → profile persist) has completed.
|
|
81
|
+
*/
|
|
82
|
+
export async function emitVoiceTurnObserved(
|
|
83
|
+
runtime: IAgentRuntime,
|
|
84
|
+
args: EmitVoiceTurnObservedArgs,
|
|
85
|
+
): Promise<void> {
|
|
86
|
+
await runtime.emitEvent(EventType.VOICE_TURN_OBSERVED, {
|
|
87
|
+
runtime,
|
|
88
|
+
turnId: args.turnId ?? `vturn_${crypto.randomUUID()}`,
|
|
89
|
+
text: args.text,
|
|
90
|
+
imprintClusterId: args.imprintClusterId,
|
|
91
|
+
matchConfidence: args.matchConfidence,
|
|
92
|
+
matchedEntityId: args.matchedEntityId ?? null,
|
|
93
|
+
observedAt: args.observedAt ?? new Date().toISOString(),
|
|
94
|
+
...(args.isOwner !== undefined ? { isOwner: args.isOwner } : {}),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
// Live-turn attribution → VOICE_TURN_OBSERVED + voiceTurnSignal (gating)
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
|
|
102
|
+
/** Server SUPPRESS threshold for EOT — below this reads as "user still talking". */
|
|
103
|
+
const SERVER_EOT_SUPPRESS_THRESHOLD = 0.4;
|
|
104
|
+
/** Only a CONFIDENT bystander attribution is allowed to silence a turn. */
|
|
105
|
+
const BYSTANDER_SUPPRESS_CONFIDENCE = 0.7;
|
|
106
|
+
|
|
107
|
+
export interface HandleLiveVoiceAttributionOptions {
|
|
108
|
+
/**
|
|
109
|
+
* Entity id the agent treats as the device owner / primary enrolled
|
|
110
|
+
* speaker. A turn attributed to this entity is always allowed to speak.
|
|
111
|
+
*/
|
|
112
|
+
ownerEntityId?: string | null;
|
|
113
|
+
/**
|
|
114
|
+
* Entity ids the agent answers to without a wake word (owner + enrolled
|
|
115
|
+
* household members). A confident bystander is anyone attributed to an
|
|
116
|
+
* entity NOT in this set.
|
|
117
|
+
*/
|
|
118
|
+
knownSpeakerEntityIds?: readonly string[];
|
|
119
|
+
/**
|
|
120
|
+
* The EOT-based turn signal the turn-controller already computed for this
|
|
121
|
+
* turn (from `eot-classifier` / `turn-controller`). The speaker decision is
|
|
122
|
+
* folded into it. When omitted, a neutral base is synthesized from
|
|
123
|
+
* `endOfTurnProbability` (default 0.5 — "unknown", fail open).
|
|
124
|
+
*/
|
|
125
|
+
baseSignal?: VoiceTurnSignal;
|
|
126
|
+
/** P(turn complete) when no `baseSignal` is supplied (default 0.5). */
|
|
127
|
+
endOfTurnProbability?: number;
|
|
128
|
+
/** True when a wake word fired within the recent listen window. */
|
|
129
|
+
wakeWordActive?: boolean;
|
|
130
|
+
/**
|
|
131
|
+
* The ASR transcript for this turn, joined from the streaming-ASR path. When
|
|
132
|
+
* provided it rides on `VOICE_TURN_OBSERVED` (and the turn signal) so the
|
|
133
|
+
* merge engine's name/partner extraction (`VoiceObserver.ingestTurn`) runs
|
|
134
|
+
* from LIVE audio — previously this was hardcoded `""`, so live recognition
|
|
135
|
+
* could identify *who* spoke but never *what* they said (#8786). Diarization-
|
|
136
|
+
* only callers (audio-frame path) leave it unset; the in-process voice engine
|
|
137
|
+
* (which has both ASR + diarization) passes the real transcript.
|
|
138
|
+
*/
|
|
139
|
+
transcript?: string;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Resolve owner / enrolled state for the attributed primary speaker.
|
|
144
|
+
*
|
|
145
|
+
* `isOwner` is `entityId === ownerEntityId`; "enrolled" is owner OR an entity
|
|
146
|
+
* id present in `knownSpeakerEntityIds`. An unbound speaker (`entityId == null`)
|
|
147
|
+
* is neither — it can never be a "confident bystander" (fail open).
|
|
148
|
+
*/
|
|
149
|
+
function resolveSpeakerStanding(
|
|
150
|
+
output: VoiceAttributionOutput,
|
|
151
|
+
opts: HandleLiveVoiceAttributionOptions,
|
|
152
|
+
): {
|
|
153
|
+
entityId: string | null;
|
|
154
|
+
confidence: number;
|
|
155
|
+
isOwner: boolean;
|
|
156
|
+
enrolled: boolean;
|
|
157
|
+
} {
|
|
158
|
+
const speaker = output.primarySpeaker;
|
|
159
|
+
const entityId = speaker?.entityId ?? output.observation?.entityId ?? null;
|
|
160
|
+
const confidence = speaker?.confidence ?? output.observation?.confidence ?? 0;
|
|
161
|
+
const ownerEntityId = opts.ownerEntityId ?? null;
|
|
162
|
+
const isOwner = entityId !== null && entityId === ownerEntityId;
|
|
163
|
+
const known = new Set<string>(opts.knownSpeakerEntityIds ?? []);
|
|
164
|
+
const enrolled = isOwner || (entityId !== null && known.has(entityId));
|
|
165
|
+
return { entityId, confidence, isOwner, enrolled };
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Compose the EOT base signal with the live speaker decision.
|
|
170
|
+
*
|
|
171
|
+
* Mirrors `packages/ui/src/voice/voice-turn-signal.ts buildVoiceTurnSignal`
|
|
172
|
+
* (the transcript-only producer) on the audio-frame side: a CONFIDENT bystander
|
|
173
|
+
* who did NOT say the wake word is cross-talk → suppress. A wake word is an
|
|
174
|
+
* explicit address → always speak. Uncertain attribution never silences a real
|
|
175
|
+
* turn. The server gate `core.voice_turn_signal` reads the returned object.
|
|
176
|
+
*/
|
|
177
|
+
function foldSpeakerIntoSignal(
|
|
178
|
+
base: VoiceTurnSignal,
|
|
179
|
+
standing: {
|
|
180
|
+
entityId: string | null;
|
|
181
|
+
confidence: number;
|
|
182
|
+
isOwner: boolean;
|
|
183
|
+
enrolled: boolean;
|
|
184
|
+
},
|
|
185
|
+
opts: HandleLiveVoiceAttributionOptions,
|
|
186
|
+
): VoiceTurnSignal {
|
|
187
|
+
let agentShouldSpeak = base.agentShouldSpeak !== false;
|
|
188
|
+
|
|
189
|
+
const confidentBystander =
|
|
190
|
+
!standing.enrolled &&
|
|
191
|
+
standing.entityId !== null &&
|
|
192
|
+
standing.confidence >= BYSTANDER_SUPPRESS_CONFIDENCE;
|
|
193
|
+
if (agentShouldSpeak && opts.wakeWordActive !== true && confidentBystander) {
|
|
194
|
+
agentShouldSpeak = false;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Wake word overrides bystander doubt — the user deliberately summoned us.
|
|
198
|
+
if (opts.wakeWordActive === true) agentShouldSpeak = true;
|
|
199
|
+
|
|
200
|
+
const eot = base.endOfTurnProbability;
|
|
201
|
+
const nextSpeaker: VoiceNextSpeaker = !agentShouldSpeak
|
|
202
|
+
? "user"
|
|
203
|
+
: eot < SERVER_EOT_SUPPRESS_THRESHOLD
|
|
204
|
+
? "user"
|
|
205
|
+
: "agent";
|
|
206
|
+
|
|
207
|
+
const source = opts.wakeWordActive
|
|
208
|
+
? "voice-bridge+wakeword"
|
|
209
|
+
: "voice-bridge+diarization";
|
|
210
|
+
|
|
211
|
+
return {
|
|
212
|
+
endOfTurnProbability: eot,
|
|
213
|
+
nextSpeaker,
|
|
214
|
+
agentShouldSpeak,
|
|
215
|
+
source: "custom",
|
|
216
|
+
transcript: base.transcript,
|
|
217
|
+
...(base.model ? { model: base.model } : {}),
|
|
218
|
+
...(base.latencyMs !== undefined ? { latencyMs: base.latencyMs } : {}),
|
|
219
|
+
// Stash the human-readable provenance so traces show the fold source even
|
|
220
|
+
// though the typed `source` enum stays "custom".
|
|
221
|
+
metadata: { provenance: source },
|
|
222
|
+
} as VoiceTurnSignal & { metadata: { provenance: string } };
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Handle a live per-turn attribution result. This is the single automatic seam
|
|
227
|
+
* the engine bridge calls from its `onAttribution` path: any caller that wires a
|
|
228
|
+
* `profileStore` gets diarization-driven gating for free.
|
|
229
|
+
*
|
|
230
|
+
* 1. Emits `VOICE_TURN_OBSERVED` when the turn produced a profile observation
|
|
231
|
+
* (so the merge engine can fold the recognized speaker into the entity
|
|
232
|
+
* graph and round-trip the binding back onto the profile).
|
|
233
|
+
* 2. Composes the EOT-based turn signal with the speaker decision and stamps it
|
|
234
|
+
* onto `output.turn.metadata.voiceTurnSignal`, which the chat-view producer
|
|
235
|
+
* forwards to the server gate verbatim.
|
|
236
|
+
*
|
|
237
|
+
* Returns the composed signal (also written onto the turn metadata in place).
|
|
238
|
+
* Never throws on the emit path — observation emission is best-effort and is
|
|
239
|
+
* logged, never propagated, so an attribution turn never crashes a voice turn.
|
|
240
|
+
*/
|
|
241
|
+
export async function handleLiveVoiceAttribution(
|
|
242
|
+
runtime: IAgentRuntime,
|
|
243
|
+
output: VoiceAttributionOutput,
|
|
244
|
+
opts: HandleLiveVoiceAttributionOptions = {},
|
|
245
|
+
): Promise<VoiceTurnSignal> {
|
|
246
|
+
const standing = resolveSpeakerStanding(output, opts);
|
|
247
|
+
// Carry the real ASR transcript when the caller joined it (in-process engine);
|
|
248
|
+
// fall back to a base-signal transcript, else "" for diarization-only callers.
|
|
249
|
+
const transcript = opts.transcript ?? opts.baseSignal?.transcript ?? "";
|
|
250
|
+
|
|
251
|
+
if (output.observation) {
|
|
252
|
+
const obs = output.observation;
|
|
253
|
+
try {
|
|
254
|
+
await emitVoiceTurnObserved(runtime, {
|
|
255
|
+
turnId: output.turnId,
|
|
256
|
+
text: transcript,
|
|
257
|
+
imprintClusterId: obs.imprintClusterId,
|
|
258
|
+
matchConfidence: obs.confidence,
|
|
259
|
+
matchedEntityId: obs.entityId,
|
|
260
|
+
isOwner: standing.isOwner,
|
|
261
|
+
});
|
|
262
|
+
} catch (err) {
|
|
263
|
+
logger.warn(
|
|
264
|
+
{
|
|
265
|
+
turnId: output.turnId,
|
|
266
|
+
imprintClusterId: obs.imprintClusterId,
|
|
267
|
+
error: err instanceof Error ? err.message : String(err),
|
|
268
|
+
},
|
|
269
|
+
"[local-inference] VOICE_TURN_OBSERVED emit failed during live attribution",
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const base: VoiceTurnSignal = opts.baseSignal ?? {
|
|
275
|
+
endOfTurnProbability: opts.endOfTurnProbability ?? 0.5,
|
|
276
|
+
nextSpeaker: "unknown",
|
|
277
|
+
agentShouldSpeak: null,
|
|
278
|
+
source: "custom",
|
|
279
|
+
transcript,
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
const signal = foldSpeakerIntoSignal(base, standing, opts);
|
|
283
|
+
|
|
284
|
+
const turn = output.turn;
|
|
285
|
+
turn.metadata = { ...(turn.metadata ?? {}), voiceTurnSignal: signal };
|
|
286
|
+
|
|
287
|
+
return signal;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// ---------------------------------------------------------------------------
|
|
291
|
+
// Consumer
|
|
292
|
+
// ---------------------------------------------------------------------------
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Handler for `VOICE_ENTITY_BOUND`. Persists `entityId` onto every profile
|
|
296
|
+
* in the cluster that is not already bound to it. Returns nothing (the
|
|
297
|
+
* `EventHandler` contract); the bound count is logged.
|
|
298
|
+
*/
|
|
299
|
+
export async function handleVoiceEntityBound(
|
|
300
|
+
payload: VoiceEntityBoundPayload,
|
|
301
|
+
): Promise<void> {
|
|
302
|
+
const store = await getVoiceProfileStore();
|
|
303
|
+
const records = await store.list();
|
|
304
|
+
const targets = records.filter(
|
|
305
|
+
(r) =>
|
|
306
|
+
r.imprintClusterId === payload.imprintClusterId &&
|
|
307
|
+
r.entityId !== payload.entityId,
|
|
308
|
+
);
|
|
309
|
+
let bound = 0;
|
|
310
|
+
for (const record of targets) {
|
|
311
|
+
const updated = await store.bindEntity({
|
|
312
|
+
profileId: record.profileId,
|
|
313
|
+
entityId: payload.entityId,
|
|
314
|
+
...(payload.displayName ? { label: payload.displayName } : {}),
|
|
315
|
+
});
|
|
316
|
+
if (updated) bound += 1;
|
|
317
|
+
}
|
|
318
|
+
if (bound > 0) {
|
|
319
|
+
logger.info(
|
|
320
|
+
{
|
|
321
|
+
imprintClusterId: payload.imprintClusterId,
|
|
322
|
+
entityId: payload.entityId,
|
|
323
|
+
bound,
|
|
324
|
+
},
|
|
325
|
+
"[local-inference] persisted voice→entity binding onto profile(s)",
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# `services/local-inference/` (app-core, server-side)
|
|
2
|
+
|
|
3
|
+
This is the **server-side** local-inference service used by the agent
|
|
4
|
+
runtime (`@elizaos/app-core`). It owns:
|
|
5
|
+
|
|
6
|
+
- KV-cache slot management (`cache-bridge.ts`, `mtp-cache-flow.test.ts`).
|
|
7
|
+
- llama-server lifecycle (`ffi-streaming-backend.ts`, `mtp-doctor.ts`,
|
|
8
|
+
`llama-server-metrics.ts`, `session-pool.ts`).
|
|
9
|
+
- Conversation registry (`conversation-registry.ts`).
|
|
10
|
+
- Backend dispatch (`backend.ts`, `engine.ts`, `handler-registry.ts`,
|
|
11
|
+
`router-handler.ts`, `service.ts`).
|
|
12
|
+
- Provider snapshot, hardware probe, model catalog, recommendation, and
|
|
13
|
+
download orchestration (`providers.ts`, `hardware.ts`, `catalog.ts`,
|
|
14
|
+
`recommendation.ts`, `downloader.ts`, `assignments.ts`,
|
|
15
|
+
`bundled-models.ts`, `external-scanner.ts`, `hf-search.ts`,
|
|
16
|
+
`registry.ts`, `paths.ts`, `routing-policy.ts`).
|
|
17
|
+
|
|
18
|
+
## Server / client split
|
|
19
|
+
|
|
20
|
+
The UI client mirror lives in
|
|
21
|
+
[`packages/ui/src/services/local-inference/`](../../../../ui/src/services/local-inference/README.md).
|
|
22
|
+
That mirror exists because UI code (panels, hooks, the iOS/Android local
|
|
23
|
+
agent kernel) needs access to the **catalog**, **recommendation**, and
|
|
24
|
+
the **type contract** for status payloads, but must not pull in the
|
|
25
|
+
server runtime (KV cache, llama-server lifecycle, conversation
|
|
26
|
+
registry).
|
|
27
|
+
|
|
28
|
+
Some files are byte-identical between the two trees and have identical
|
|
29
|
+
semantics. Those have been extracted to `@elizaos/shared/local-inference`
|
|
30
|
+
and the local files in this directory are thin re-exports:
|
|
31
|
+
|
|
32
|
+
- `paths.ts` — re-exports `localInferenceRoot` etc. from
|
|
33
|
+
`@elizaos/shared`.
|
|
34
|
+
- `routing-preferences.ts` — re-exports `readRoutingPreferences` etc.
|
|
35
|
+
from `@elizaos/shared`.
|
|
36
|
+
- `verify.ts` — re-exports `verifyInstalledModel` etc. from
|
|
37
|
+
`@elizaos/shared`.
|
|
38
|
+
- `types.ts` — re-exports `AgentModelSlot`, `InstalledModel`,
|
|
39
|
+
`ModelAssignments`, `TextGenerationSlot`, and `AGENT_MODEL_SLOTS` from
|
|
40
|
+
`@elizaos/shared`. Server-only types (MTP kernel metadata,
|
|
41
|
+
`LocalRuntimeOptimizations`, `loadedCacheTypeK`/`...V`/`GpuLayers`,
|
|
42
|
+
etc.) remain declared in this file because the UI public client has
|
|
43
|
+
no consumer for them.
|
|
44
|
+
|
|
45
|
+
## What stays a twin (and why)
|
|
46
|
+
|
|
47
|
+
These files exist in both `packages/app-core` and `packages/ui` and are
|
|
48
|
+
intentionally **not bundled:
|
|
49
|
+
|
|
50
|
+
- `catalog.ts` — server adds `contextLength`, `optimizations.requiresKernel`,
|
|
51
|
+
and MTP drafter variants that the UI public catalog does not surface.
|
|
52
|
+
- `recommendation.ts` — server has kernel-availability filtering
|
|
53
|
+
(`recommendation.test.ts` covers MTP gating) that depends on
|
|
54
|
+
server-only `LocalRuntimeOptimizations.requiresKernel`.
|
|
55
|
+
- `active-model.ts` — server resolves load args against the loader's
|
|
56
|
+
KV-cache type / GPU-layer overrides (server-only types).
|
|
57
|
+
- `device-bridge.ts` — server forwards `promptCacheKey` from the runtime
|
|
58
|
+
cache plan.
|
|
59
|
+
- `ffi-streaming-backend.ts` — server owns the full llama-server lifecycle, the
|
|
60
|
+
in-process binding fallback, and metrics scraping.
|
|
61
|
+
- `mtp-doctor.ts` — uses tokenizer parity catalog metadata that only
|
|
62
|
+
the server catalog declares.
|
|
63
|
+
- `engine.ts`, `handler-registry.ts`, `hardware.ts`, `index.ts`,
|
|
64
|
+
`providers.ts`, `router-handler.ts`, `service.ts` — server-side
|
|
65
|
+
superset; the UI mirror keeps a slim subset of the same surface for
|
|
66
|
+
type-only / catalog-only consumers.
|
|
67
|
+
|
|
68
|
+
If a twin pair becomes byte-identical with identical semantics, extract
|
|
69
|
+
it to `packages/shared/src/local-inference/` and replace both copies
|
|
70
|
+
with a thin re-export, the same way `paths.ts` / `verify.ts` /
|
|
71
|
+
`routing-preferences.ts` were handled.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { readBackendEnvOverride, selectBackend } from "../backend-selector";
|
|
4
|
+
|
|
5
|
+
describe("selectBackend", () => {
|
|
6
|
+
it("forces ffi-streaming on mobile when FFI is supported", () => {
|
|
7
|
+
expect(
|
|
8
|
+
selectBackend({
|
|
9
|
+
platform: "mobile",
|
|
10
|
+
ffiSupported: true,
|
|
11
|
+
}),
|
|
12
|
+
).toBe("ffi-streaming");
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it("throws on mobile when FFI is missing", () => {
|
|
16
|
+
expect(() =>
|
|
17
|
+
selectBackend({
|
|
18
|
+
platform: "mobile",
|
|
19
|
+
ffiSupported: false,
|
|
20
|
+
}),
|
|
21
|
+
).toThrow(/streaming-LLM FFI symbols/);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("desktop defaults to ffi-streaming when FFI is supported", () => {
|
|
25
|
+
expect(
|
|
26
|
+
selectBackend({
|
|
27
|
+
platform: "desktop",
|
|
28
|
+
ffiSupported: true,
|
|
29
|
+
}),
|
|
30
|
+
).toBe("ffi-streaming");
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("throws on desktop when FFI symbols are absent", () => {
|
|
34
|
+
expect(() =>
|
|
35
|
+
selectBackend({
|
|
36
|
+
platform: "desktop",
|
|
37
|
+
ffiSupported: false,
|
|
38
|
+
}),
|
|
39
|
+
).toThrow(/streaming-LLM FFI symbols/);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("envOverride=ffi wins on desktop when supported", () => {
|
|
43
|
+
expect(
|
|
44
|
+
selectBackend({
|
|
45
|
+
platform: "desktop",
|
|
46
|
+
ffiSupported: true,
|
|
47
|
+
envOverride: "ffi",
|
|
48
|
+
}),
|
|
49
|
+
).toBe("ffi-streaming");
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("envOverride=ffi without ffiSupported throws", () => {
|
|
53
|
+
expect(() =>
|
|
54
|
+
selectBackend({
|
|
55
|
+
platform: "desktop",
|
|
56
|
+
ffiSupported: false,
|
|
57
|
+
envOverride: "ffi",
|
|
58
|
+
}),
|
|
59
|
+
).toThrow(/does not export the streaming-LLM symbols/);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("envOverride=auto on desktop with FFI keeps the new default (ffi-streaming)", () => {
|
|
63
|
+
expect(
|
|
64
|
+
selectBackend({
|
|
65
|
+
platform: "desktop",
|
|
66
|
+
ffiSupported: true,
|
|
67
|
+
envOverride: "auto",
|
|
68
|
+
}),
|
|
69
|
+
).toBe("ffi-streaming");
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
describe("readBackendEnvOverride", () => {
|
|
74
|
+
it("returns auto for explicit auto", () => {
|
|
75
|
+
expect(readBackendEnvOverride({ ELIZA_INFERENCE_BACKEND: "auto" })).toBe(
|
|
76
|
+
"auto",
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("normalizes ffi aliases and ignores server aliases", () => {
|
|
81
|
+
expect(readBackendEnvOverride({ ELIZA_INFERENCE_BACKEND: "FFI" })).toBe(
|
|
82
|
+
"ffi",
|
|
83
|
+
);
|
|
84
|
+
expect(
|
|
85
|
+
readBackendEnvOverride({ ELIZA_INFERENCE_BACKEND: "ffi-streaming" }),
|
|
86
|
+
).toBe("ffi");
|
|
87
|
+
expect(
|
|
88
|
+
readBackendEnvOverride({ ELIZA_INFERENCE_BACKEND: "http-server" }),
|
|
89
|
+
).toBeNull();
|
|
90
|
+
expect(readBackendEnvOverride({ ELIZA_INFERENCE_BACKEND: "server" })).toBe(
|
|
91
|
+
null,
|
|
92
|
+
);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("returns null for unset / unknown", () => {
|
|
96
|
+
expect(readBackendEnvOverride({})).toBeNull();
|
|
97
|
+
expect(
|
|
98
|
+
readBackendEnvOverride({ ELIZA_INFERENCE_BACKEND: "foo" }),
|
|
99
|
+
).toBeNull();
|
|
100
|
+
});
|
|
101
|
+
});
|